/pidgin/main: 0415923ecdd0: Merged in CMaiku/pidgin/purple-ssl-t...
Gary Kramlich <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 0415923ecdd02e137f80c4ad0bbeffc6475d831f Author: Gary Kramlich <[email protected]> Date: 2016-04-07 12:35 -0500 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/0415923ecdd0 Description: Merged in CMaiku/pidgin/purple-ssl-to-gio (pull request #31) Port Purple SSL to use Gio TLS diffstat: finch/gntcertmgr.c | 129 +- finch/gntrequest.c | 9 +- libpurple/Makefile.am | 6 +- libpurple/certificate.c | 2226 ---------------------------------- libpurple/certificate.h | 963 -------------- libpurple/core.c | 14 - libpurple/plugins/Makefile.am | 1 - libpurple/plugins/ssl/Makefile.am | 49 - libpurple/plugins/ssl/Makefile.mingw | 103 - libpurple/plugins/ssl/nss-prefs.c | 511 ------- libpurple/plugins/ssl/ssl-gnutls.c | 1438 --------------------- libpurple/plugins/ssl/ssl-nss.c | 1278 ------------------- libpurple/plugins/ssl/ssl.c | 118 - libpurple/purple.h.in | 2 +- libpurple/request.c | 8 +- libpurple/request.h | 10 +- libpurple/sslconn.c | 260 ++- libpurple/sslconn.h | 80 +- libpurple/tls-certificate-info.c | 779 +++++++++++ libpurple/tls-certificate-info.h | 105 + libpurple/tls-certificate.c | 390 +++++ libpurple/tls-certificate.h | 131 ++ pidgin/gtkcertmgr.c | 185 +- pidgin/gtkrequest.c | 13 +- 24 files changed, 1763 insertions(+), 7045 deletions(-) diffs (truncated from 9593 to 300 lines): diff --git a/finch/gntcertmgr.c b/finch/gntcertmgr.c --- a/finch/gntcertmgr.c +++ b/finch/gntcertmgr.c @@ -23,10 +23,11 @@ #include <internal.h> #include "finch.h" -#include "certificate.h" #include "debug.h" #include "notify.h" #include "request.h" +#include "tls-certificate.h" +#include "tls-certificate-info.h" #include "gntcertmgr.h" @@ -39,7 +40,6 @@ struct { GntWidget *window; GntWidget *tree; - PurpleCertificatePool *pool; } certmgr; /* Pretty much Xerox of gtkcertmgr */ @@ -48,46 +48,59 @@ struct { static void tls_peers_mgmt_import_ok2_cb(gpointer data, const char *result) { - PurpleCertificate *crt = (PurpleCertificate *) data; + GTlsCertificate *crt = data; const char *id = result; + GError *error = NULL; /* TODO: Perhaps prompt if you're overwriting a cert? */ - purple_certificate_pool_store(purple_certificate_find_pool("x509", "tls_peers"), id, crt); - purple_certificate_destroy(crt); -} + if (purple_tls_certificate_trust(id, crt, &error)) { + gnt_tree_add_row_last(GNT_TREE(certmgr.tree), g_strdup(id), + gnt_tree_create_row(GNT_TREE(certmgr.tree), id), + NULL); + } else { + purple_debug_error("gntcertmgr/tls_peers_mgmt", + "Failure trusting peer certificate '%s': %s", + id, error->message); + g_clear_error(&error); + } -static void -tls_peers_mgmt_import_cancel2_cb(gpointer data, const char *result) -{ - PurpleCertificate *crt = (PurpleCertificate *) data; - purple_certificate_destroy(crt); + g_object_unref(crt); } static void tls_peers_mgmt_import_ok_cb(gpointer data, const char *filename) { - PurpleCertificateScheme *x509; - PurpleCertificate *crt; + GTlsCertificate *crt; + GError *error = NULL; - x509 = purple_certificate_pool_get_scheme(purple_certificate_find_pool("x509", "tls_peers")); - - crt = purple_certificate_import(x509, filename); + crt = g_tls_certificate_new_from_file(filename, &error); if (crt != NULL) { gchar *default_hostname; - default_hostname = purple_certificate_get_subject_name(crt); + PurpleTlsCertificateInfo *info; + + info = purple_tls_certificate_get_info(crt); + default_hostname = purple_tls_certificate_info_get_subject_name(info); + purple_tls_certificate_info_free(info); + purple_request_input(NULL, _("Certificate Import"), _("Specify a hostname"), _("Type the host name this certificate is for."), default_hostname, FALSE, FALSE, NULL, _("OK"), G_CALLBACK(tls_peers_mgmt_import_ok2_cb), - _("Cancel"), G_CALLBACK(tls_peers_mgmt_import_cancel2_cb), + _("Cancel"), G_CALLBACK(g_object_unref), NULL, crt); g_free(default_hostname); } else { gchar * secondary; + + purple_debug_error("gntcertmgr/tls_peers_mgmt", + "Failed to import certificate '%s': %s", + filename, error->message); + g_clear_error(&error); + secondary = g_strdup_printf(_("File %s could not be imported.\nMake sure that the file is readable and in PEM format.\n"), filename); purple_notify_error(NULL, _("Certificate Import Error"), @@ -113,11 +126,21 @@ add_cert_cb(GntWidget *button, gpointer static void tls_peers_mgmt_export_ok_cb(gpointer data, const char *filename) { - PurpleCertificate *crt = (PurpleCertificate *) data; + GTlsCertificate *crt = data; + gchar *pem = NULL; + GError *error = NULL; - if (!purple_certificate_export(filename, crt)) { + g_object_get(crt, "certificate-pem", &pem, NULL); + g_return_if_fail(crt != NULL); + + if (!g_file_set_contents(filename, pem, -1, &error)) { gchar * secondary; + purple_debug_error("gntcertmgr/tls_peers_mgmt", + "Failed to export certificate '%s': %s", + filename, error->message); + g_clear_error(&error); + secondary = g_strdup_printf(_("Export to file %s failed.\nCheck that you have write permission to the target path\n"), filename); purple_notify_error(NULL, _("Certificate Export Error"), @@ -126,14 +149,16 @@ tls_peers_mgmt_export_ok_cb(gpointer dat g_free(secondary); } - purple_certificate_destroy(crt); + g_free(pem); + g_object_unref(crt); } static void save_cert_cb(GntWidget *button, gpointer null) { - PurpleCertificate *crt; + GTlsCertificate *crt; const char *key; + GError *error = NULL; if (!certmgr.window) return; @@ -142,10 +167,13 @@ save_cert_cb(GntWidget *button, gpointer if (!key) return; - crt = purple_certificate_pool_retrieve(certmgr.pool, key); + crt = purple_tls_certificate_new_from_id(key, &error); + if (!crt) { purple_debug_error("gntcertmgr/tls_peers_mgmt", - "Id %s was not in the peers cache?!\n", key); + "Failed to fetch trusted certificate '%s': %s", + key, error->message); + g_clear_error(&error); return; } @@ -153,7 +181,7 @@ save_cert_cb(GntWidget *button, gpointer _("PEM X.509 Certificate Export"), "certificate.pem", TRUE, G_CALLBACK(tls_peers_mgmt_export_ok_cb), - G_CALLBACK(purple_certificate_destroy), + G_CALLBACK(g_object_unref), NULL, crt); } @@ -162,7 +190,8 @@ static void info_cert_cb(GntWidget *button, gpointer null) { const char *key; - PurpleCertificate *crt; + GTlsCertificate *crt; + PurpleTlsCertificateInfo *info; gchar *subject; GByteArray *fpr_sha1; gchar *fpr_sha1_asc; @@ -175,15 +204,18 @@ info_cert_cb(GntWidget *button, gpointer if (!key) return; - crt = purple_certificate_pool_retrieve(certmgr.pool, key); + crt = purple_tls_certificate_new_from_id(key, NULL); g_return_if_fail(crt); primary = g_strdup_printf(_("Certificate for %s"), key); - fpr_sha1 = purple_certificate_get_fingerprint_sha1(crt); + fpr_sha1 = purple_tls_certificate_get_fingerprint_sha1(crt); fpr_sha1_asc = purple_base16_encode_chunked(fpr_sha1->data, fpr_sha1->len); - subject = purple_certificate_get_subject_name(crt); + + info = purple_tls_certificate_get_info(crt); + subject = purple_tls_certificate_info_get_subject_name(info); + purple_tls_certificate_info_free(info); secondary = g_strdup_printf(_("Common name: %s\n\nSHA1 fingerprint:\n%s"), subject, fpr_sha1_asc); @@ -195,18 +227,25 @@ info_cert_cb(GntWidget *button, gpointer g_byte_array_free(fpr_sha1, TRUE); g_free(fpr_sha1_asc); g_free(subject); - purple_certificate_destroy(crt); + g_object_unref(crt); } /* Delete a cert */ static void tls_peers_mgmt_delete_confirm_cb(gchar *id, gint dontcare) { - if (!purple_certificate_pool_delete(certmgr.pool, id)) { + GError *error = NULL; + + if (!purple_tls_certificate_distrust(id, &error)) { purple_debug_warning("gntcertmgr/tls_peers_mgmt", - "Deletion failed on id %s\n", id); + "Deletion failed on id '%s': %s\n", + id, error->message); + g_clear_error(&error); }; + purple_request_close_with_handle((void*)id); + gnt_tree_remove(GNT_TREE(certmgr.tree), (void*)id); + g_free(id); } @@ -248,34 +287,17 @@ populate_cert_list(void) gnt_tree_remove_all(GNT_TREE(certmgr.tree)); - idlist = purple_certificate_pool_get_idlist(purple_certificate_find_pool("x509", "tls_peers")); + idlist = purple_tls_certificate_list_ids(); for (l = idlist; l; l = l->next) { gnt_tree_add_row_last(GNT_TREE(certmgr.tree), g_strdup(l->data), gnt_tree_create_row(GNT_TREE(certmgr.tree), l->data), NULL); } - purple_certificate_pool_destroy_idlist(idlist); -} - -static void -cert_list_added(PurpleCertificatePool *pool, const char *id, gpointer null) -{ - g_return_if_fail(certmgr.window); - gnt_tree_add_row_last(GNT_TREE(certmgr.tree), g_strdup(id), - gnt_tree_create_row(GNT_TREE(certmgr.tree), id), NULL); -} - -static void -cert_list_removed(PurpleCertificatePool *pool, const char *id, gpointer null) -{ - g_return_if_fail(certmgr.window); - purple_request_close_with_handle((void*)id); - gnt_tree_remove(GNT_TREE(certmgr.tree), (void*)id); + purple_tls_certificate_free_ids(idlist); } void finch_certmgr_show(void) { GntWidget *win, *tree, *box, *button; - PurpleCertificatePool *pool; if (certmgr.window) { gnt_window_present(certmgr.window); @@ -322,11 +344,6 @@ void finch_certmgr_show(void) populate_cert_list(); - pool = certmgr.pool = purple_certificate_find_pool("x509", "tls_peers"); - purple_signal_connect(pool, "certificate-stored", - win, PURPLE_CALLBACK(cert_list_added), NULL); - purple_signal_connect(pool, "certificate-deleted", - win, PURPLE_CALLBACK(cert_list_removed), NULL); g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(purple_signals_disconnect_by_handle), NULL); gnt_widget_show(certmgr.window); diff --git a/finch/gntrequest.c b/finch/gntrequest.c --- a/finch/gntrequest.c +++ b/finch/gntrequest.c @@ -34,6 +34,7 @@ #include "finch.h" #include "gntrequest.h" #include "debug.h" +#include "tls-certificate-info.h" #include "util.h" typedef struct @@ -578,11 +579,15 @@ static GntWidget* create_certificate_field(PurpleRequestField *field) { GntWidget *w; - PurpleCertificate *cert; + GTlsCertificate *cert; + PurpleTlsCertificateInfo *info; char *str; cert = purple_request_field_certificate_get_value(field); - str = purple_certificate_get_display_string(cert); _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits