/** * Creates a tree entry for a URL, and links it into the tree * * \param parent the node to link to * \param url the URL (copied) * \param data the URL data to use * \param title the custom title to use * \return the node created, or NULL for failure */ struct node *tree_create_URL_node(struct tree *tree, struct node *parent, const char *url, const char *title, tree_node_user_callback user_callback, void *callback_data) { struct node *node; struct node_element *element; char *text_cp, *squashed; squashed = squash_whitespace(title ? title : url); text_cp = strdup(squashed); if (text_cp == NULL) { LOG(("malloc failed")); warn_user("NoMemory", 0); return NULL; } free(squashed); node = tree_create_leaf_node(tree, parent, text_cp, true, false, false); if (node == NULL) { free(text_cp); return NULL; } if (user_callback != NULL) tree_set_node_user_callback(node, user_callback, callback_data); tree_create_node_element(node, NODE_ELEMENT_BITMAP, TREE_ELEMENT_THUMBNAIL, false); tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_VISITS, false); tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_LAST_VISIT, false); element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_URL, true); if (element != NULL) { text_cp = strdup(url); if (text_cp == NULL) { tree_delete_node(tree, node, false); LOG(("malloc failed")); warn_user("NoMemory", 0); return NULL; } tree_update_node_element(tree, element, text_cp, NULL); } return node; }
/** * Creates a read only tree entry for a URL, and links it into the tree. * * \param parent the node to link to * \param url the URL * \param data the URL data to use * \return the node created, or NULL for failure */ struct node *tree_create_URL_node_readonly(struct tree *tree, struct node *parent, const char *url, const struct url_data *data, tree_node_user_callback user_callback, void *callback_data) { struct node *node; struct node_element *element; char *title; assert(url && data); if (data->title != NULL) { title = strdup(data->title); } else { title = strdup(url); } if (title == NULL) return NULL; node = tree_create_leaf_node(tree, parent, title, false, false, false); if (node == NULL) { free(title); return NULL; } if (user_callback != NULL) { tree_set_node_user_callback(node, user_callback, callback_data); } tree_create_node_element(node, NODE_ELEMENT_BITMAP, TREE_ELEMENT_THUMBNAIL, false); tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_VISITS, false); tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_LAST_VISIT, false); element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_URL, false); if (element != NULL) { tree_update_node_element(tree, element, url, NULL); } tree_update_URL_node(tree, node, url, data); return node; }
static struct node *sslcert_create_node(const struct ssl_cert_info *cert) { struct node *node; struct node_element *element; char *text; text = messages_get_buff("SSL_Certificate_Subject", cert->subject); if (text == NULL) return NULL; node = tree_create_leaf_node(NULL, NULL, text, false, false, false); if (node == NULL) { free(text); return NULL; } tree_set_node_user_callback(node, sslcert_node_callback, NULL); /* add issuer node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_ISSUER, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Issuer", cert->issuer); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add version node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_VERSION, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Version", cert->version); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add valid from node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_VALID_FROM, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_ValidFrom", cert->not_before); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add valid to node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_VALID_TO, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_ValidTo", cert->not_after); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add certificate type */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_CERT_TYPE, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Type", cert->cert_type); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* add serial node */ element = tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_SSL_SERIAL, false); if (element != NULL) { text = messages_get_buff("SSL_Certificate_Serial", cert->serial); if (text == NULL) { tree_delete_node(NULL, node, false); return NULL; } tree_update_node_element(NULL, element, text, NULL); } /* set the display icon */ tree_set_node_icon(NULL, node, sslcert_icon); return node; }
void gui_cert_verify(struct browser_window *bw, hlcache_handle *c, const struct ssl_cert_info *certs, unsigned long num) { const struct ssl_cert_info *from; struct session_cert *to; struct session_data *data; struct tree *tree; struct node *node; long i; STRPTR yesorno,reqcontents; int res = 0; struct treeview_window *twin; assert(bw && c && certs); /* copy the certificate information */ data = calloc(1, sizeof(struct session_data)); if (!data) { warn_user("NoMemory", 0); return; } data->url = strdup(content_get_url(c)); if (!data->url) { free(data); warn_user("NoMemory", 0); return; } data->bw = bw; data->num = num; data->certs = calloc(num, sizeof(struct session_cert)); if (!data->certs) { free(data->url); free(data); warn_user("NoMemory", 0); return; } for (i = 0; i < (long)num; i++) { to = &data->certs[i]; from = &certs[i]; to->subject_t = strdup(from->subject); to->issuer_t = strdup(from->issuer); if ((!to->subject_t) || (!to->issuer_t)) { for (; i >= 0; i--) { to = &data->certs[i]; free(to->subject_t); free(to->issuer_t); } free(data->certs); free(data->url); free(data); warn_user("NoMemory", 0); return; } snprintf(to->version, sizeof data->certs->version, "%ld", from->version); snprintf(to->valid_from, sizeof data->certs->valid_from, "%s", from->not_before); snprintf(to->type, sizeof data->certs->type, "%d", from->cert_type); snprintf(to->valid_to, sizeof data->certs->valid_to, "%s", from->not_after); snprintf(to->serial, sizeof data->certs->serial, "%ld", from->serial); } tree = calloc(sizeof(struct tree), 1); if (!tree) { //ro_gui_cert_close(ssl_w); warn_user("NoMemory", 0); return; } tree->root = tree_create_folder_node(NULL, "Root"); if (!tree->root) { // ro_gui_cert_close(ssl_w); warn_user("NoMemory", 0); free(tree); tree = NULL; return; } tree->root->expanded = true; tree->handle = 0; tree->movable = false; tree->no_drag = true; tree->no_vscroll = true; tree->no_furniture = true; tree->single_selection = true; data->tree = tree; /* put the SSL names in the tree */ for (i = 0; i < (long)num; i++) { node = tree_create_leaf_node(tree->root, certs[i].subject); if (node) { node->data.data = TREE_ELEMENT_SSL; tree_set_node_sprite(node, "small_xxx", "small_xxx"); } } tree_initialise(tree); ami_open_tree(tree,AMI_TREE_SSLCERT); twin = (struct treeview_window *)data->tree->handle; if(yesorno = ASPrintf("%s|%s",messages_get("Accept"),messages_get("Reject"))) { if(reqcontents = ASPrintf("%s\n\n%s: %s\n%s: %s\n%s: %s\n%s: %s\n%s: %s", messages_get("SSLError"), messages_get("Subject"), to->subject_t, messages_get("Issuer"), to->issuer_t, messages_get("Version"), to->version, messages_get("ValidFrom"), to->valid_from, messages_get("ValidTo"), to->valid_to)) { res = TimedDosRequesterTags(TDR_ImageType,TDRIMAGE_QUESTION, TDR_Window,twin->win, TDR_TitleString,messages_get("NetSurf"), TDR_GadgetString,yesorno, TDR_FormatString,reqcontents, TAG_DONE); FreeVec(reqcontents); } FreeVec(yesorno); } if(res == 1) { ami_gui_cert_apply(data); } ami_gui_cert_close(data); }