static ETrustPromptResponse trust_prompt_show (GtkWindow *parent, const gchar *source_extension, const gchar *source_display_name, const gchar *host, const gchar *error_text, GcrParsed *parsed, const gchar *reason, void (* dialog_ready_cb) (GtkDialog *dialog, gpointer user_data), gpointer user_data) { ETrustPromptResponse response; GcrCertificateWidget *certificate_widget; GcrCertificate *certificate; GckAttributes *attributes; GtkWidget *dialog, *widget; GtkGrid *grid; const guchar *data; gchar *bhost, *tmp; gsize length; gint row = 0; dialog = gtk_dialog_new_with_buttons ( _("Certificate trust..."), parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Reject"), GTK_RESPONSE_REJECT, _("Accept _Temporarily"), GTK_RESPONSE_YES, _("_Accept Permanently"), GTK_RESPONSE_ACCEPT, NULL); widget = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); gtk_container_set_border_width (GTK_CONTAINER (dialog), 5); grid = g_object_new ( GTK_TYPE_GRID, "orientation", GTK_ORIENTATION_HORIZONTAL, "row-homogeneous", FALSE, "row-spacing", 6, "column-homogeneous", FALSE, "column-spacing", 12, "hexpand", TRUE, "halign", GTK_ALIGN_FILL, "vexpand", TRUE, "valign", GTK_ALIGN_FILL, NULL); gtk_container_set_border_width (GTK_CONTAINER (grid), 5); gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (grid)); widget = gtk_image_new_from_icon_name ("dialog-warning", GTK_ICON_SIZE_DIALOG); g_object_set ( G_OBJECT (widget), "vexpand", FALSE, "valign", GTK_ALIGN_START, NULL); gtk_grid_attach (grid, widget, 0, row, 1, 3); tmp = g_markup_escape_text (host, -1); bhost = g_strconcat ("<b>", tmp, "</b>", NULL); g_free (tmp); tmp = NULL; if (source_extension && source_display_name) { gchar *bsource_display_name = g_strconcat ("<b>", source_display_name, "</b>", NULL); if (g_str_equal (source_extension, E_SOURCE_EXTENSION_ADDRESS_BOOK)) { tmp = g_strdup_printf ( "An address book '%s' cannot connect, because an SSL/TLS certificate for '%s' is not trusted. Do you wish to accept it?", bsource_display_name, bhost); } else if (g_str_equal (source_extension, E_SOURCE_EXTENSION_CALENDAR)) { tmp = g_strdup_printf ( "A calendar '%s' cannot connect, because an SSL/TLS certificate for '%s' is not trusted. Do you wish to accept it?", bsource_display_name, bhost); } else if (g_str_equal (source_extension, E_SOURCE_EXTENSION_MEMO_LIST)) { tmp = g_strdup_printf ( "A memo list '%s' cannot connect, because an SSL/TLS certificate for '%s' is not trusted. Do you wish to accept it?", bsource_display_name, bhost); } else if (g_str_equal (source_extension, E_SOURCE_EXTENSION_TASK_LIST)) { tmp = g_strdup_printf ( "A task list '%s' cannot connect, because an SSL/TLS certificate for '%s' is not trusted. Do you wish to accept it?", bsource_display_name, bhost); } else if (g_str_equal (source_extension, E_SOURCE_EXTENSION_MAIL_ACCOUNT)) { tmp = g_strdup_printf ( "A mail account '%s' cannot connect, because an SSL/TLS certificate for '%s' is not trusted. Do you wish to accept it?", bsource_display_name, bhost); } else if (g_str_equal (source_extension, E_SOURCE_EXTENSION_MAIL_TRANSPORT)) { tmp = g_strdup_printf ( "A mail transport '%s' cannot connect, because an SSL/TLS certificate for '%s' is not trusted. Do you wish to accept it?", bsource_display_name, bhost); } else { tmp = g_strdup_printf ( "An account '%s' cannot connect, because an SSL/TLS certificate for '%s' is not trusted. Do you wish to accept it?", bsource_display_name, bhost); } g_free (bsource_display_name); } if (!tmp) tmp = g_strdup_printf (_("SSL/TLS certificate for “%s” is not trusted. Do you wish to accept it?"), bhost); g_free (bhost); widget = gtk_label_new (NULL); gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); gtk_label_set_markup (GTK_LABEL (widget), tmp); g_object_set ( G_OBJECT (widget), "hexpand", TRUE, "halign", GTK_ALIGN_FILL, "valign", GTK_ALIGN_CENTER, "width-chars", 60, "max-width-chars", 80, "xalign", 0.0, "yalign", 0.0, NULL); g_free (tmp); gtk_grid_attach (grid, widget, 1, row, 2, 1); row++; trust_prompt_add_info_line (grid, _("Reason:"), reason, FALSE, FALSE, TRUE, &row); if (error_text) trust_prompt_add_info_line (grid, _("Detailed error:"), error_text, FALSE, TRUE, FALSE, &row); data = gcr_parsed_get_data (parsed, &length); attributes = gcr_parsed_get_attributes (parsed); certificate = gcr_simple_certificate_new (data, length); certificate_widget = gcr_certificate_widget_new (certificate); gcr_certificate_widget_set_attributes (certificate_widget, attributes); widget = GTK_WIDGET (certificate_widget); gtk_grid_attach (grid, widget, 1, row, 2, 1); gtk_widget_show (widget); g_clear_object (&certificate); gtk_widget_show_all (GTK_WIDGET (grid)); if (dialog_ready_cb) dialog_ready_cb (GTK_DIALOG (dialog), user_data); switch (gtk_dialog_run (GTK_DIALOG (dialog))) { case GTK_RESPONSE_REJECT: response = E_TRUST_PROMPT_RESPONSE_REJECT; break; case GTK_RESPONSE_ACCEPT: response = E_TRUST_PROMPT_RESPONSE_ACCEPT; break; case GTK_RESPONSE_YES: response = E_TRUST_PROMPT_RESPONSE_ACCEPT_TEMPORARILY; break; default: response = E_TRUST_PROMPT_RESPONSE_UNKNOWN; break; } gtk_widget_destroy (dialog); return response; }
gboolean trust_prompt_show (EUserPrompterServerExtension *extension, gint prompt_id, const gchar *host, const gchar *markup, const CERTCertificate *pcert, const gchar *cert_fingerprint, const gchar *reason, const GSList *pissuers) { GtkWidget *dialog, *widget; GtkGrid *grid; gchar *tmp, *issuer, *subject, *head; GSList *issuers, *iter; CERTCertificate *cert; gint row = 0; cert = CERT_DupCertificate ((CERTCertificate *) pcert); issuers = g_slist_copy ((GSList *) pissuers); for (iter = issuers; iter; iter = g_slist_next (iter)) { if (iter->data) iter->data = CERT_DupCertificate (iter->data); } dialog = gtk_dialog_new_with_buttons ( _("Certificate trust..."), NULL, 0, _("_View Certificate"), GTK_RESPONSE_HELP, _("_Reject"), GTK_RESPONSE_REJECT, _("Accept _Temporarily"), GTK_RESPONSE_YES, _("_Accept Permanently"), GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_icon_name (GTK_WINDOW (dialog), "evolution"); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES); grid = g_object_new ( GTK_TYPE_GRID, "orientation", GTK_ORIENTATION_HORIZONTAL, "row-homogeneous", FALSE, "row-spacing", 2, "column-homogeneous", FALSE, "column-spacing", 6, "hexpand", TRUE, "halign", GTK_ALIGN_FILL, "vexpand", TRUE, "valign", GTK_ALIGN_FILL, "border-width", 12, NULL); widget = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); gtk_container_add (GTK_CONTAINER (widget), GTK_WIDGET (grid)); widget = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); g_object_set ( G_OBJECT (widget), "vexpand", FALSE, "valign", GTK_ALIGN_START, "xpad", 6, NULL); gtk_grid_attach (grid, widget, 0, row, 1, 3); tmp = NULL; if (!markup || !*markup) { gchar *bhost; bhost = g_strconcat ("<b>", host, "</b>", NULL); tmp = g_strdup_printf (_("SSL certificate for '%s' is not trusted. Do you wish to accept it?"), bhost); g_free (bhost); markup = tmp; } head = g_strdup_printf ("%s\n\n%s", markup, _("Detailed information about the certificate:")); widget = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (widget), head); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.0); g_free (head); g_free (tmp); gtk_grid_attach (grid, widget, 1, row, 2, 1); row++; issuer = CERT_NameToAscii (&cert->issuer); subject = CERT_NameToAscii (&cert->subject); trust_prompt_add_info_line (grid, _("Issuer:"), issuer, TRUE, &row); trust_prompt_add_info_line (grid, _("Subject:"), subject, TRUE, &row); trust_prompt_add_info_line (grid, _("Fingerprint:"), cert_fingerprint, TRUE, &row); trust_prompt_add_info_line (grid, _("Reason:"), reason, FALSE, &row); PORT_Free (issuer); PORT_Free (subject); g_object_set_data (G_OBJECT (dialog), TRUST_PROMP_ID_KEY, GINT_TO_POINTER (prompt_id)); g_object_set_data_full (G_OBJECT (dialog), TRUST_PROMP_CERT_KEY, cert, trust_prompt_free_certificate); g_object_set_data_full (G_OBJECT (dialog), TRUST_PROMP_ISSUERS_KEY, issuers, trust_prompt_free_issuers); g_signal_connect (dialog, "response", G_CALLBACK (trust_prompt_response_cb), extension); gtk_widget_show_all (GTK_WIDGET (grid)); gtk_widget_show (dialog); return TRUE; }