/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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.