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; }
/** * gcr_importer_create_for_parsed: * @parsed: a parser with a parsed item to import * * Create a set of importers which can import this parsed item. * The parsed item is represented by the state of the GcrParser at the * time of calling this method. * * Returns: (element-type Gcr.Importer) (transfer full): a list of importers * which can import the parsed item, which should be freed with * g_object_unref(), or %NULL if no types of importers can be created */ GList * gcr_importer_create_for_parsed (GcrParsed *parsed) { GcrRegistered *registered; GcrImporterIface *iface; gpointer instance_class; GckAttributes *attrs; gboolean matched; gulong n_attrs; GList *results = NULL; GHashTable *seen; gulong j; gsize i; g_return_val_if_fail (parsed != NULL, NULL); gcr_importer_register_well_known (); if (!registered_importers) return NULL; if (!registered_sorted) { g_array_sort (registered_importers, sort_registered_by_n_attrs); registered_sorted = TRUE; } attrs = gcr_parsed_get_attributes (parsed); if (attrs != NULL) gck_attributes_ref (attrs); else attrs = gck_attributes_new_empty (GCK_INVALID); seen = g_hash_table_new (g_direct_hash, g_direct_equal); if (_gcr_debugging) { gchar *a = gck_attributes_to_string (attrs); _gcr_debug ("looking for importer for: %s", a); g_free (a); } for (i = 0; i < registered_importers->len; ++i) { registered = &(g_array_index (registered_importers, GcrRegistered, i)); n_attrs = gck_attributes_count (registered->attrs); matched = TRUE; for (j = 0; j < n_attrs; ++j) { if (!gck_attributes_contains (attrs, gck_attributes_at (registered->attrs, j))) { matched = FALSE; break; } } if (_gcr_debugging) { gchar *a = gck_attributes_to_string (registered->attrs); _gcr_debug ("importer %s %s: %s", g_type_name (registered->importer_type), matched ? "matched" : "didn't match", a); g_free (a); } if (matched) { if (check_if_seen_or_add (seen, GUINT_TO_POINTER (registered->importer_type))) continue; instance_class = g_type_class_ref (registered->importer_type); iface = g_type_interface_peek (instance_class, GCR_TYPE_IMPORTER); g_return_val_if_fail (iface != NULL, NULL); g_return_val_if_fail (iface->create_for_parsed, NULL); results = g_list_concat (results, (iface->create_for_parsed) (parsed)); g_type_class_unref (instance_class); } } g_hash_table_unref (seen); gck_attributes_unref (attrs); return results; }