libpurple/certificate.c

Thu, 20 Sep 2007 16:30:17 +0000

author
Sadrul Habib Chowdhury <sadrul@pidgin.im>
date
Thu, 20 Sep 2007 16:30:17 +0000
branch
sadrul.currentmedia
changeset 21193
e918a1846d03
parent 19864
ab4d16d072b8
child 20000
1e119c4bfe0b
child 20143
5b005012e908
permissions
-rw-r--r--

Use an independant status type for 'current media' stuff, instead of using
status attributes. This includes changes in both xmpp and msn.
Also, in MSN, CurrentMedia is sent with PSM if you turn on the status and
set the attributes on the account.

17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
1 /**
19015
2e55af5c1242 - Typo fix
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19007
diff changeset
2 * @file certificate.c Public-Key Certificate API
17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
3 * @ingroup core
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
4 */
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
5
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
6 /*
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
7 *
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
8 * purple
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
9 *
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
10 * Purple is the legal property of its developers, whose names are too numerous
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
11 * to list here. Please refer to the COPYRIGHT file distributed with this
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
12 * source distribution.
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
13 *
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
14 * This program is free software; you can redistribute it and/or modify
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
15 * it under the terms of the GNU General Public License as published by
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
16 * the Free Software Foundation; either version 2 of the License, or
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
17 * (at your option) any later version.
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
18 *
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
19 * This program is distributed in the hope that it will be useful,
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
22 * GNU General Public License for more details.
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
23 *
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
24 * You should have received a copy of the GNU General Public License
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
25 * along with this program; if not, write to the Free Software
19859
71d37b57eff2 The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents: 19827
diff changeset
26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
27 */
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
28
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
29 #include <glib.h>
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
30
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
31 #include "internal.h"
17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
32 #include "certificate.h"
19688
7eddbc94521c (Un)Register the pools with DBus to avoid a runtime fit.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19678
diff changeset
33 #include "dbus-maybe.h"
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
34 #include "debug.h"
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
35 #include "request.h"
18894
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
36 #include "signals.h"
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
37 #include "util.h"
17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
38
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
39 /** List holding pointers to all registered certificate schemes */
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
40 static GList *cert_schemes = NULL;
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
41 /** List of registered Verifiers */
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
42 static GList *cert_verifiers = NULL;
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
43 /** List of registered Pools */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
44 static GList *cert_pools = NULL;
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
45
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
46 void
18462
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
47 purple_certificate_verify (PurpleCertificateVerifier *verifier,
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
48 const gchar *subject_name, GList *cert_chain,
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
49 PurpleCertificateVerifiedCallback cb,
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
50 gpointer cb_data)
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
51 {
18462
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
52 PurpleCertificateVerificationRequest *vrq;
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
53 PurpleCertificateScheme *scheme;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
54
18462
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
55 g_return_if_fail(subject_name != NULL);
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
56 /* If you don't have a cert to check, why are you requesting that it
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
57 be verified? */
18462
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
58 g_return_if_fail(cert_chain != NULL);
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
59 g_return_if_fail(cb != NULL);
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
60
18462
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
61 /* Look up the CertificateScheme */
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
62 scheme = purple_certificate_find_scheme(verifier->scheme_name);
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
63 g_return_if_fail(scheme);
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
64
18463
20cf7daafb13 - purple_certificate_verify attempts to check that the cert chain is of
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18462
diff changeset
65 /* Check that at least the first cert in the chain matches the
20cf7daafb13 - purple_certificate_verify attempts to check that the cert chain is of
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18462
diff changeset
66 Verifier scheme */
18479
a38ca6794f6f - Fixed an inverted assertion
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18477
diff changeset
67 g_return_if_fail(scheme ==
18463
20cf7daafb13 - purple_certificate_verify attempts to check that the cert chain is of
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18462
diff changeset
68 ((PurpleCertificate *) (cert_chain->data))->scheme);
20cf7daafb13 - purple_certificate_verify attempts to check that the cert chain is of
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18462
diff changeset
69
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
70 /* Construct and fill in the request fields */
18469
675afaf5559f - Use g_new0 instead of g_new
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18467
diff changeset
71 vrq = g_new0(PurpleCertificateVerificationRequest, 1);
18462
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
72 vrq->verifier = verifier;
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
73 vrq->scheme = scheme;
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
74 vrq->subject_name = g_strdup(subject_name);
18656
02c822b398d2 - purple_certificate_verify no longer takes possession of the
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18655
diff changeset
75 vrq->cert_chain = purple_certificate_copy_list(cert_chain);
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
76 vrq->cb = cb;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
77 vrq->cb_data = cb_data;
18462
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
78
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
79 /* Initiate verification */
2c6d71addbdb - purple_certificate_verify now takes a Verifier argument, creates its
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18461
diff changeset
80 (verifier->start_verification)(vrq);
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
81 }
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
82
18466
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
83 void
19028
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
84 purple_certificate_verify_complete(PurpleCertificateVerificationRequest *vrq,
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
85 PurpleCertificateVerificationStatus st)
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
86 {
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
87 PurpleCertificateVerifier *vr;
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
88
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
89 g_return_if_fail(vrq);
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
90
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
91 /* Pass the results on to the request's callback */
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
92 (vrq->cb)(st, vrq->cb_data);
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
93
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
94 /* And now to eliminate the request */
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
95 /* Fetch the Verifier responsible... */
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
96 vr = vrq->verifier;
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
97 /* ...and order it to KILL */
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
98 (vr->destroy_request)(vrq);
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
99
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
100 /* Now the internals have been cleaned up, so clean up the libpurple-
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
101 created elements */
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
102 g_free(vrq->subject_name);
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
103 purple_certificate_destroy_list(vrq->cert_chain);
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
104
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
105 /* A structure born
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
106 * to much ado
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
107 * and with so much within.
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
108 * It reaches now
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
109 * its quiet end. */
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
110 g_free(vrq);
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
111 }
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
112
1c28409e9c5f - Add verify_complete, which should deprecate verify_destroy
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19026
diff changeset
113
18653
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
114 PurpleCertificate *
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
115 purple_certificate_copy(PurpleCertificate *crt)
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
116 {
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
117 g_return_val_if_fail(crt, NULL);
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
118 g_return_val_if_fail(crt->scheme, NULL);
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
119 g_return_val_if_fail(crt->scheme->copy_certificate, NULL);
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
120
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
121 return (crt->scheme->copy_certificate)(crt);
ac29c2efe90e - Add purple_certificate_copy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18649
diff changeset
122 }
18467
6bd91f3acf84 - Add purple_certificate_verify_destroy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18466
diff changeset
123
18655
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
124 GList *
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
125 purple_certificate_copy_list(GList *crt_list)
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
126 {
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
127 GList *new, *l;
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
128
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
129 /* First, make a shallow copy of the list */
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
130 new = g_list_copy(crt_list);
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
131
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
132 /* Now go through and actually duplicate each certificate */
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
133 for (l = new; l; l = l->next) {
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
134 l->data = purple_certificate_copy(l->data);
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
135 }
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
136
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
137 return new;
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
138 }
43b99fe59f54 - Add purple_certificate_copy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18653
diff changeset
139
18467
6bd91f3acf84 - Add purple_certificate_verify_destroy and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18466
diff changeset
140 void
18466
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
141 purple_certificate_destroy (PurpleCertificate *crt)
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
142 {
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
143 PurpleCertificateScheme *scheme;
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
144
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
145 if (NULL == crt) return;
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
146
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
147 scheme = crt->scheme;
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
148
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
149 (scheme->destroy_certificate)(crt);
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
150 }
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
151
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
152 void
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
153 purple_certificate_destroy_list (GList * crt_list)
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
154 {
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
155 PurpleCertificate *crt;
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
156 GList *l;
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
157
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
158 for (l=crt_list; l; l = l->next) {
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
159 crt = (PurpleCertificate *) l->data;
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
160 purple_certificate_destroy(crt);
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
161 }
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
162
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
163 g_list_free(crt_list);
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
164 }
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
165
19016
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
166 gboolean
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
167 purple_certificate_signed_by(PurpleCertificate *crt, PurpleCertificate *issuer)
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
168 {
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
169 PurpleCertificateScheme *scheme;
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
170
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
171 g_return_val_if_fail(crt, FALSE);
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
172 g_return_val_if_fail(issuer, FALSE);
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
173
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
174 scheme = crt->scheme;
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
175 g_return_val_if_fail(scheme, FALSE);
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
176 /* We can't compare two certs of unrelated schemes, obviously */
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
177 g_return_val_if_fail(issuer->scheme == scheme, FALSE);
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
178
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
179 return (scheme->signed_by)(crt, issuer);
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
180 }
3cf632c31eb3 - Add purple_certificate_signed_by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19015
diff changeset
181
19017
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
182 gboolean
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
183 purple_certificate_check_signature_chain(GList *chain)
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
184 {
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
185 GList *cur;
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
186 PurpleCertificate *crt, *issuer;
19021
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
187 gchar *uid;
19017
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
188
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
189 g_return_val_if_fail(chain, FALSE);
19021
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
190
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
191 uid = purple_certificate_get_unique_id((PurpleCertificate *) chain->data);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
192 purple_debug_info("certificate",
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
193 "Checking signature chain for uid=%s\n",
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
194 uid);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
195 g_free(uid);
19017
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
196
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
197 /* If this is a single-certificate chain, say that it is valid */
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
198 if (chain->next == NULL) {
19021
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
199 purple_debug_info("certificate",
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
200 "...Singleton. We'll say it's valid.\n");
19017
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
201 return TRUE;
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
202 }
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
203
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
204 /* Load crt with the first certificate */
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
205 crt = (PurpleCertificate *)(chain->data);
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
206 /* And start with the second certificate in the chain */
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
207 for ( cur = chain->next; cur; cur = cur->next ) {
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
208
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
209 issuer = (PurpleCertificate *)(cur->data);
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
210
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
211 /* Check the signature for this link */
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
212 if (! purple_certificate_signed_by(crt, issuer) ) {
19021
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
213 uid = purple_certificate_get_unique_id(issuer);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
214 purple_debug_info("certificate",
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
215 "...Bad or missing signature by %s\nChain is INVALID\n",
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
216 uid);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
217 g_free(uid);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
218
19017
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
219 return FALSE;
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
220 }
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
221
19021
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
222 uid = purple_certificate_get_unique_id(issuer);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
223 purple_debug_info("certificate",
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
224 "...Good signature by %s\n",
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
225 uid);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
226 g_free(uid);
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
227
19017
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
228 /* The issuer is now the next crt whose signature is to be
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
229 checked */
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
230 crt = issuer;
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
231 }
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
232
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
233 /* If control reaches this point, the chain is valid */
19021
a51771bf3d26 - Add debugging babble to check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19020
diff changeset
234 purple_debug_info("certificate", "Chain is VALID\n");
19017
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
235 return TRUE;
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
236 }
d89f7930272f - Add purple_certificate_check_signature_chain
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19016
diff changeset
237
18577
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
238 PurpleCertificate *
18578
95080ca9610a - Fixed naming issues in previous revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18577
diff changeset
239 purple_certificate_import(PurpleCertificateScheme *scheme, const gchar *filename)
18577
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
240 {
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
241 g_return_val_if_fail(scheme, NULL);
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
242 g_return_val_if_fail(scheme->import_certificate, NULL);
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
243 g_return_val_if_fail(filename, NULL);
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
244
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
245 return (scheme->import_certificate)(filename);
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
246 }
7b4c95fb042d - Add purple_certificate_import
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18576
diff changeset
247
18496
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
248 gboolean
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
249 purple_certificate_export(const gchar *filename, PurpleCertificate *crt)
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
250 {
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
251 PurpleCertificateScheme *scheme;
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
252
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
253 g_return_val_if_fail(filename, FALSE);
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
254 g_return_val_if_fail(crt, FALSE);
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
255 g_return_val_if_fail(crt->scheme, FALSE);
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
256
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
257 scheme = crt->scheme;
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
258 g_return_val_if_fail(scheme->export_certificate, FALSE);
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
259
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
260 return (scheme->export_certificate)(filename, crt);
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
261 }
3bb8e716482e - Add purple_certificate_export and associated libpurple stuff
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18495
diff changeset
262
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
263 GByteArray *
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
264 purple_certificate_get_fingerprint_sha1(PurpleCertificate *crt)
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
265 {
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
266 PurpleCertificateScheme *scheme;
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
267 GByteArray *fpr;
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
268
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
269 g_return_val_if_fail(crt, NULL);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
270 g_return_val_if_fail(crt->scheme, NULL);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
271
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
272 scheme = crt->scheme;
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
273
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
274 g_return_val_if_fail(scheme->get_fingerprint_sha1, NULL);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
275
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
276 fpr = (scheme->get_fingerprint_sha1)(crt);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
277
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
278 return fpr;
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
279 }
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
280
18481
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
281 gchar *
19020
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
282 purple_certificate_get_unique_id(PurpleCertificate *crt)
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
283 {
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
284 g_return_val_if_fail(crt, NULL);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
285 g_return_val_if_fail(crt->scheme, NULL);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
286 g_return_val_if_fail(crt->scheme->get_unique_id, NULL);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
287
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
288 return (crt->scheme->get_unique_id)(crt);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
289 }
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
290
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
291 gchar *
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
292 purple_certificate_get_issuer_unique_id(PurpleCertificate *crt)
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
293 {
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
294 g_return_val_if_fail(crt, NULL);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
295 g_return_val_if_fail(crt->scheme, NULL);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
296 g_return_val_if_fail(crt->scheme->get_issuer_unique_id, NULL);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
297
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
298 return (crt->scheme->get_issuer_unique_id)(crt);
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
299 }
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
300
a9af8402bb04 - Expose get_unique_id and get_issuer_unique_id through libpurple functions
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19018
diff changeset
301 gchar *
18481
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
302 purple_certificate_get_subject_name(PurpleCertificate *crt)
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
303 {
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
304 PurpleCertificateScheme *scheme;
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
305 gchar *subject_name;
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
306
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
307 g_return_val_if_fail(crt, NULL);
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
308 g_return_val_if_fail(crt->scheme, NULL);
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
309
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
310 scheme = crt->scheme;
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
311
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
312 g_return_val_if_fail(scheme->get_subject_name, NULL);
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
313
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
314 subject_name = (scheme->get_subject_name)(crt);
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
315
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
316 return subject_name;
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
317 }
d220d85caaf1 - Add purple_certificate_get_subject_name and associated libpurple
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18479
diff changeset
318
18643
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
319 gboolean
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
320 purple_certificate_check_subject_name(PurpleCertificate *crt, const gchar *name)
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
321 {
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
322 PurpleCertificateScheme *scheme;
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
323
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
324 g_return_val_if_fail(crt, FALSE);
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
325 g_return_val_if_fail(crt->scheme, FALSE);
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
326 g_return_val_if_fail(name, FALSE);
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
327
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
328 scheme = crt->scheme;
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
329
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
330 /* TODO: Instead of failing, maybe use get_subject_name and strcmp? */
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
331 g_return_val_if_fail(scheme->check_subject_name, FALSE);
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
332
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
333 return (scheme->check_subject_name)(crt, name);
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
334 }
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
335
18647
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
336 gboolean
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
337 purple_certificate_get_times(PurpleCertificate *crt, time_t *activation, time_t *expiration)
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
338 {
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
339 PurpleCertificateScheme *scheme;
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
340
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
341 g_return_val_if_fail(crt, FALSE);
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
342
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
343 scheme = crt->scheme;
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
344
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
345 g_return_val_if_fail(scheme, FALSE);
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
346
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
347 /* If both provided references are NULL, what are you doing calling
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
348 this? */
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
349 g_return_val_if_fail( (activation != NULL) || (expiration != NULL), FALSE);
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
350
19007
f3c3ddf37812 - Change the internal structure of activation/expiration times to match
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19003
diff changeset
351 /* Throw the request on down to the certscheme */
f3c3ddf37812 - Change the internal structure of activation/expiration times to match
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19003
diff changeset
352 return (scheme->get_times)(crt, activation, expiration);
18647
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
353 }
45240511f4eb - Add expiration/activation functions for Certificates
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18645
diff changeset
354
18643
a6a86ac3c219 - Add certificate_check_subject_name and associated machinery
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18590
diff changeset
355
18573
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
356 gchar *
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
357 purple_certificate_pool_mkpath(PurpleCertificatePool *pool, const gchar *id)
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
358 {
18645
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
359 gchar *path;
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
360 gchar *esc_scheme_name, *esc_name, *esc_id;
18573
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
361
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
362 g_return_val_if_fail(pool, NULL);
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
363 g_return_val_if_fail(pool->scheme_name, NULL);
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
364 g_return_val_if_fail(pool->name, NULL);
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
365
18645
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
366 /* Escape all the elements for filesystem-friendliness */
18817
d4d89568fab6 - Handle NULLs given to certificate_pool_mkpath without causing errors
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18662
diff changeset
367 esc_scheme_name = pool ? g_strdup(purple_escape_filename(pool->scheme_name)) : NULL;
d4d89568fab6 - Handle NULLs given to certificate_pool_mkpath without causing errors
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18662
diff changeset
368 esc_name = pool ? g_strdup(purple_escape_filename(pool->name)) : NULL;
d4d89568fab6 - Handle NULLs given to certificate_pool_mkpath without causing errors
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18662
diff changeset
369 esc_id = id ? g_strdup(purple_escape_filename(id)) : NULL;
18645
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
370
18573
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
371 path = g_build_filename(purple_user_dir(),
18575
24299c91b963 - Correct the certstore folder paths
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18574
diff changeset
372 "certificates", /* TODO: constantize this? */
18645
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
373 esc_scheme_name,
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
374 esc_name,
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
375 esc_id,
18573
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
376 NULL);
18644
ac67b1ff08c4 - pool_mkpath now runs purple_escape_filename on its return value
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18643
diff changeset
377
18645
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
378 g_free(esc_scheme_name);
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
379 g_free(esc_name);
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
380 g_free(esc_id);
805a3f4b259d - Fix overzealous escaping cause by ancestor revision
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18644
diff changeset
381 return path;
18573
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
382 }
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
383
18584
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
384 gboolean
18818
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
385 purple_certificate_pool_usable(PurpleCertificatePool *pool)
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
386 {
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
387 g_return_val_if_fail(pool, FALSE);
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
388 g_return_val_if_fail(pool->scheme_name, FALSE);
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
389
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
390 /* Check that the pool's scheme is loaded */
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
391 if (purple_certificate_find_scheme(pool->scheme_name) == NULL) {
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
392 return FALSE;
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
393 }
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
394
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
395 return TRUE;
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
396 }
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
397
19000
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
398 PurpleCertificateScheme *
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
399 purple_certificate_pool_get_scheme(PurpleCertificatePool *pool)
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
400 {
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
401 g_return_val_if_fail(pool, NULL);
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
402 g_return_val_if_fail(pool->scheme_name, NULL);
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
403
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
404 return purple_certificate_find_scheme(pool->scheme_name);
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
405 }
ec4a9c38e415 - Add purple_certificate_pool_get_scheme helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18900
diff changeset
406
18818
6460aa4cfa41 - Add purple_certificate_pool_usable to check whether a pool's
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18817
diff changeset
407 gboolean
18584
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
408 purple_certificate_pool_contains(PurpleCertificatePool *pool, const gchar *id)
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
409 {
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
410 g_return_val_if_fail(pool, FALSE);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
411 g_return_val_if_fail(id, FALSE);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
412 g_return_val_if_fail(pool->cert_in_pool, FALSE);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
413
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
414 return (pool->cert_in_pool)(id);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
415 }
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
416
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
417 PurpleCertificate *
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
418 purple_certificate_pool_retrieve(PurpleCertificatePool *pool, const gchar *id)
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
419 {
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
420 g_return_val_if_fail(pool, NULL);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
421 g_return_val_if_fail(id, NULL);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
422 g_return_val_if_fail(pool->get_cert, NULL);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
423
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
424 return (pool->get_cert)(id);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
425 }
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
426
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
427 gboolean
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
428 purple_certificate_pool_store(PurpleCertificatePool *pool, const gchar *id, PurpleCertificate *crt)
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
429 {
18896
70742468a820 - Emit certificate-stored signal in purple_certificate_pool_store
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18894
diff changeset
430 gboolean ret = FALSE;
70742468a820 - Emit certificate-stored signal in purple_certificate_pool_store
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18894
diff changeset
431
18584
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
432 g_return_val_if_fail(pool, FALSE);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
433 g_return_val_if_fail(id, FALSE);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
434 g_return_val_if_fail(pool->put_cert, FALSE);
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
435
18585
5a9738565416 - Do some weak checking to ensure that you don't attempt to store a
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18584
diff changeset
436 /* Whether crt->scheme matches find_scheme(pool->scheme_name) is not
5a9738565416 - Do some weak checking to ensure that you don't attempt to store a
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18584
diff changeset
437 relevant... I think... */
5a9738565416 - Do some weak checking to ensure that you don't attempt to store a
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18584
diff changeset
438 g_return_val_if_fail(
5a9738565416 - Do some weak checking to ensure that you don't attempt to store a
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18584
diff changeset
439 g_ascii_strcasecmp(pool->scheme_name, crt->scheme->name) == 0,
5a9738565416 - Do some weak checking to ensure that you don't attempt to store a
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18584
diff changeset
440 FALSE);
18584
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
441
18896
70742468a820 - Emit certificate-stored signal in purple_certificate_pool_store
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18894
diff changeset
442 ret = (pool->put_cert)(id, crt);
70742468a820 - Emit certificate-stored signal in purple_certificate_pool_store
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18894
diff changeset
443
18900
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
444 /* Signal that the certificate was stored if success*/
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
445 if (ret) {
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
446 purple_signal_emit(pool, "certificate-stored",
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
447 pool, id);
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
448 }
18896
70742468a820 - Emit certificate-stored signal in purple_certificate_pool_store
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18894
diff changeset
449
70742468a820 - Emit certificate-stored signal in purple_certificate_pool_store
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18894
diff changeset
450 return ret;
18584
d4410000050f - Add pool retrieve, contains, and store functions to certificate API
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18582
diff changeset
451 }
18573
c7fd4fbb4339 - Add purple_certificate_pool_mkpath helper function
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18571
diff changeset
452
18899
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
453 gboolean
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
454 purple_certificate_pool_delete(PurpleCertificatePool *pool, const gchar *id)
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
455 {
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
456 gboolean ret = FALSE;
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
457
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
458 g_return_val_if_fail(pool, FALSE);
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
459 g_return_val_if_fail(id, FALSE);
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
460 g_return_val_if_fail(pool->delete_cert, FALSE);
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
461
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
462 ret = (pool->delete_cert)(id);
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
463
18900
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
464 /* Signal that the certificate was deleted if success */
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
465 if (ret) {
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
466 purple_signal_emit(pool, "certificate-deleted",
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
467 pool, id);
8107b08ec7ae - Only emit certificate-stored and certificate-deleted if the operation
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18899
diff changeset
468 }
18899
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
469
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
470 return ret;
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
471 }
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
472
18661
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
473 GList *
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
474 purple_certificate_pool_get_idlist(PurpleCertificatePool *pool)
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
475 {
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
476 g_return_val_if_fail(pool, NULL);
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
477 g_return_val_if_fail(pool->get_idlist, NULL);
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
478
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
479 return (pool->get_idlist)();
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
480 }
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
481
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
482 void
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
483 purple_certificate_pool_destroy_idlist(GList *idlist)
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
484 {
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
485 GList *l;
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
486
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
487 /* Iterate through and free them strings */
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
488 for ( l = idlist; l; l = l->next ) {
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
489 g_free(l->data);
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
490 }
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
491
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
492 g_list_free(idlist);
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
493 }
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
494
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
495
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
496 /****************************************************************************/
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
497 /* Builtin Verifiers, Pools, etc. */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
498 /****************************************************************************/
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
499
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
500 static void
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
501 x509_singleuse_verify_cb (PurpleCertificateVerificationRequest *vrq, gint id)
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
502 {
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
503 g_return_if_fail(vrq);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
504
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
505 purple_debug_info("certificate/x509_singleuse",
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
506 "VRQ on cert from %s gave %d\n",
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
507 vrq->subject_name, id);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
508
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
509 /* Signal what happened back to the caller */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
510 if (1 == id) {
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
511 /* Accepted! */
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
512 purple_certificate_verify_complete(vrq,
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
513 PURPLE_CERTIFICATE_VALID);
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
514 } else {
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
515 /* Not accepted */
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
516 purple_certificate_verify_complete(vrq,
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
517 PURPLE_CERTIFICATE_INVALID);
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
518
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
519 }
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
520 }
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
521
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
522 static void
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
523 x509_singleuse_start_verify (PurpleCertificateVerificationRequest *vrq)
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
524 {
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
525 gchar *sha_asc;
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
526 GByteArray *sha_bin;
18483
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
527 gchar *cn;
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
528 const gchar *cn_match;
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
529 gchar *primary, *secondary;
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
530 PurpleCertificate *crt = (PurpleCertificate *) vrq->cert_chain->data;
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
531
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
532 /* Pull out the SHA1 checksum */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
533 sha_bin = purple_certificate_get_fingerprint_sha1(crt);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
534 /* Now decode it for display */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
535 sha_asc = purple_base16_encode_chunked(sha_bin->data,
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
536 sha_bin->len);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
537
18483
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
538 /* Get the cert Common Name */
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
539 cn = purple_certificate_get_subject_name(crt);
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
540
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
541 /* Determine whether the name matches */
19499
6b9c37c4ca85 - Even more TODO whacking
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19498
diff changeset
542 if (purple_certificate_check_subject_name(crt, vrq->subject_name)) {
18483
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
543 cn_match = _("");
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
544 } else {
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
545 cn_match = _("(DOES NOT MATCH)");
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
546 }
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
547
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
548 /* Make messages */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
549 primary = g_strdup_printf(_("%s has presented the following certificate for just-this-once use:"), vrq->subject_name);
18483
113bfeceaf1b - x509_singleuse uses the subject_name field...somewhat
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18481
diff changeset
550 secondary = g_strdup_printf(_("Common name: %s %s\nFingerprint (SHA1): %s"), cn, cn_match, sha_asc);
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
551
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
552 /* Make a semi-pretty display */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
553 purple_request_accept_cancel(
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
554 vrq->cb_data, /* TODO: Find what the handle ought to be */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
555 _("Single-use Certificate Verification"),
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
556 primary,
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
557 secondary,
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
558 1, /* Accept by default */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
559 NULL, /* No account */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
560 NULL, /* No other user */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
561 NULL, /* No associated conversation */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
562 vrq,
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
563 x509_singleuse_verify_cb,
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
564 x509_singleuse_verify_cb );
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
565
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
566 /* Cleanup */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
567 g_free(primary);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
568 g_free(secondary);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
569 g_free(sha_asc);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
570 g_byte_array_free(sha_bin, TRUE);
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
571 }
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
572
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
573 static void
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
574 x509_singleuse_destroy_request (PurpleCertificateVerificationRequest *vrq)
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
575 {
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
576 /* I don't do anything! */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
577 }
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
578
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
579 PurpleCertificateVerifier x509_singleuse = {
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
580 "x509", /* Scheme name */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
581 "singleuse", /* Verifier name */
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
582 x509_singleuse_start_verify, /* start_verification function */
19827
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
583 x509_singleuse_destroy_request, /* Request cleanup operation */
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
584
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
585 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
586 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
587 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
588 NULL
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
589 };
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
590
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
591
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
592
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
593 /***** X.509 Certificate Authority pool, keyed by Distinguished Name *****/
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
594 /* This is implemented in what may be the most inefficient and bugprone way
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
595 possible; however, future optimizations should not be difficult. */
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
596
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
597 static PurpleCertificatePool x509_ca;
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
598
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
599 /** Holds a key-value pair for quickish certificate lookup */
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
600 typedef struct {
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
601 gchar *dn;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
602 PurpleCertificate *crt;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
603 } x509_ca_element;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
604
19348
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
605 static void
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
606 x509_ca_element_free(x509_ca_element *el)
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
607 {
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
608 if (NULL == el) return;
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
609
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
610 g_free(el->dn);
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
611 purple_certificate_destroy(el->crt);
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
612 g_free(el);
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
613 }
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
614
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
615 /** System directory to probe for CA certificates */
19484
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
616 /* This is set in the lazy_init function */
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
617 static const gchar *x509_ca_syspath = NULL;
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
618
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
619 /** A list of loaded CAs, populated from the above path whenever the lazy_init
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
620 happens. Contains pointers to x509_ca_elements */
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
621 static GList *x509_ca_certs = NULL;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
622
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
623 /** Used for lazy initialization purposes. */
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
624 static gboolean x509_ca_initialized = FALSE;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
625
19342
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
626 /** Adds a certificate to the in-memory cache, doing nothing else */
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
627 static gboolean
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
628 x509_ca_quiet_put_cert(PurpleCertificate *crt)
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
629 {
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
630 x509_ca_element *el;
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
631
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
632 /* lazy_init calls this function, so calling lazy_init here is a
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
633 Bad Thing */
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
634
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
635 g_return_val_if_fail(crt, FALSE);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
636 g_return_val_if_fail(crt->scheme, FALSE);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
637 /* Make sure that this is some kind of X.509 certificate */
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
638 /* TODO: Perhaps just check crt->scheme->name instead? */
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
639 g_return_val_if_fail(crt->scheme == purple_certificate_find_scheme(x509_ca.scheme_name), FALSE);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
640
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
641 el = g_new0(x509_ca_element, 1);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
642 el->dn = purple_certificate_get_unique_id(crt);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
643 el->crt = purple_certificate_copy(crt);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
644 x509_ca_certs = g_list_prepend(x509_ca_certs, el);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
645
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
646 return TRUE;
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
647 }
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
648
19484
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
649 /* Since the libpurple CertificatePools get registered before plugins are
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
650 loaded, an X.509 Scheme is generally not available when x509_ca_init is
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
651 called, but x509_ca requires X.509 operations in order to properly load.
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
652
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
653 To solve this, I present the lazy_init function. It attempts to finish
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
654 initialization of the Pool, but it usually fails when it is called from
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
655 x509_ca_init. However, this is OK; initialization is then simply deferred
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
656 until someone tries to use functions from the pool. */
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
657 static gboolean
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
658 x509_ca_lazy_init(void)
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
659 {
19035
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
660 PurpleCertificateScheme *x509;
19342
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
661 GDir *certdir;
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
662 const gchar *entry;
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
663 GPatternSpec *pempat;
19035
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
664
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
665 if (x509_ca_initialized) return TRUE;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
666
19035
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
667 /* Check that X.509 is registered */
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
668 x509 = purple_certificate_find_scheme(x509_ca.scheme_name);
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
669 if ( !x509 ) {
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
670 purple_debug_info("certificate/x509/ca",
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
671 "Lazy init failed because an X.509 Scheme "
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
672 "is not yet registered. Maybe it will be "
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
673 "better later.\n");
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
674 return FALSE;
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
675 }
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
676
19484
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
677 /* Attempt to point at the appropriate system path */
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
678 if (NULL == x509_ca_syspath) {
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
679 #ifdef _WIN32
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
680 x509_ca_syspath = g_build_filename(DATADIR,
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
681 "ca-certs", NULL);
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
682 #else
19484
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
683 x509_ca_syspath = g_build_filename(DATADIR,
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
684 "purple", "ca-certs", NULL);
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
685 #endif
19484
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
686 }
237d66fea269 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19352
diff changeset
687
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
688 /* Populate the certificates pool from the system path */
19342
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
689 certdir = g_dir_open(x509_ca_syspath, 0, NULL);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
690 g_return_val_if_fail(certdir, FALSE);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
691
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
692 /* Use a glob to only read .pem files */
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
693 pempat = g_pattern_spec_new("*.pem");
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
694
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
695 while ( (entry = g_dir_read_name(certdir)) ) {
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
696 gchar *fullpath;
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
697 PurpleCertificate *crt;
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
698
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
699 if ( !g_pattern_match_string(pempat, entry) ) {
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
700 continue;
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
701 }
19035
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
702
19342
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
703 fullpath = g_build_filename(x509_ca_syspath, entry, NULL);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
704
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
705 /* TODO: Respond to a failure in the following? */
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
706 crt = purple_certificate_import(x509, fullpath);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
707
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
708 if (x509_ca_quiet_put_cert(crt)) {
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
709 purple_debug_info("certificate/x509/ca",
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
710 "Loaded %s\n",
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
711 fullpath);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
712 } else {
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
713 purple_debug_error("certificate/x509/ca",
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
714 "Failed to load %s\n",
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
715 fullpath);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
716 }
19351
37cc064be1c6 - Fix memleak
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19350
diff changeset
717
37cc064be1c6 - Fix memleak
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19350
diff changeset
718 purple_certificate_destroy(crt);
19342
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
719 g_free(fullpath);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
720 }
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
721
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
722 g_pattern_spec_free(pempat);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
723 g_dir_close(certdir);
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
724
19035
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
725 purple_debug_info("certificate/x509/ca",
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
726 "Lazy init completed.\n");
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
727 x509_ca_initialized = TRUE;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
728 return TRUE;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
729 }
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
730
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
731 static gboolean
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
732 x509_ca_init(void)
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
733 {
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
734 /* Attempt to initialize now, but if it doesn't work, that's OK;
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
735 it will get done later */
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
736 if ( ! x509_ca_lazy_init()) {
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
737 purple_debug_info("certificate/x509/ca",
19035
523335f1d52b - x509_ca_lazy_init is more implemented
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19034
diff changeset
738 "Init failed, probably because a "
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
739 "dependency is not yet registered. "
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
740 "It has been deferred to later.\n");
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
741 }
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
742
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
743 return TRUE;
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
744 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
745
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
746 static void
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
747 x509_ca_uninit(void)
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
748 {
19343
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
749 GList *l;
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
750
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
751 for (l = x509_ca_certs; l; l = l->next) {
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
752 x509_ca_element *el = l->data;
19348
507a3bf4c4d4 - Add a helper function to destroy x509_ca_elements, and use it where
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19347
diff changeset
753 x509_ca_element_free(el);
19343
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
754 }
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
755 g_list_free(x509_ca_certs);
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
756 x509_ca_certs = NULL;
08189e9c5de8 - Write the uninit function for x509_ca
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19342
diff changeset
757 x509_ca_initialized = FALSE;
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
758 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
759
19344
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
760 /** Look up a ca_element by dn */
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
761 static x509_ca_element *
19346
e0ae1b11effb Cosmetics
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19345
diff changeset
762 x509_ca_locate_cert(GList *lst, const gchar *dn)
19344
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
763 {
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
764 GList *cur;
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
765
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
766 for (cur = lst; cur; cur = cur->next) {
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
767 x509_ca_element *el = cur->data;
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
768 /* TODO: Unsafe? */
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
769 if ( !strcmp(dn, el->dn) ) {
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
770 return el;
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
771 }
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
772 }
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
773 return NULL;
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
774 }
66e33c6fe7c3 - Add a function to search the x509_ca internal structures for an id
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19343
diff changeset
775
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
776 static gboolean
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
777 x509_ca_cert_in_pool(const gchar *id)
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
778 {
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
779 g_return_val_if_fail(x509_ca_lazy_init(), FALSE);
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
780 g_return_val_if_fail(id, FALSE);
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
781
19346
e0ae1b11effb Cosmetics
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19345
diff changeset
782 if (x509_ca_locate_cert(x509_ca_certs, id) != NULL) {
19345
939e2898106f - Implement x509_ca cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19344
diff changeset
783 return TRUE;
939e2898106f - Implement x509_ca cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19344
diff changeset
784 } else {
939e2898106f - Implement x509_ca cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19344
diff changeset
785 return FALSE;
939e2898106f - Implement x509_ca cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19344
diff changeset
786 }
939e2898106f - Implement x509_ca cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19344
diff changeset
787
939e2898106f - Implement x509_ca cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19344
diff changeset
788 return FALSE;
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
789 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
790
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
791 static PurpleCertificate *
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
792 x509_ca_get_cert(const gchar *id)
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
793 {
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
794 PurpleCertificate *crt = NULL;
19347
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
795 x509_ca_element *el;
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
796
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
797 g_return_val_if_fail(x509_ca_lazy_init(), NULL);
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
798 g_return_val_if_fail(id, NULL);
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
799
19347
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
800 /* Search the memory-cached pool */
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
801 el = x509_ca_locate_cert(x509_ca_certs, id);
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
802
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
803 if (el != NULL) {
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
804 /* Make a copy of the memcached one for the function caller
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
805 to play with */
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
806 crt = purple_certificate_copy(el->crt);
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
807 } else {
ec35ba7ac30a - Implement x509_ca_get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19346
diff changeset
808 crt = NULL;
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
809 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
810
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
811 return crt;
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
812 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
813
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
814 static gboolean
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
815 x509_ca_put_cert(const gchar *id, PurpleCertificate *crt)
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
816 {
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
817 gboolean ret = FALSE;
19342
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
818
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
819 g_return_val_if_fail(x509_ca_lazy_init(), FALSE);
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
820
19036
62025e265d24 - Add a hacked-up method of adding certs to the CA pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19035
diff changeset
821 /* TODO: This is a quick way of doing this. At some point the change
62025e265d24 - Add a hacked-up method of adding certs to the CA pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19035
diff changeset
822 ought to be flushed to disk somehow. */
19342
9a4aa6fc93d4 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19036
diff changeset
823 ret = x509_ca_quiet_put_cert(crt);
19036
62025e265d24 - Add a hacked-up method of adding certs to the CA pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19035
diff changeset
824
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
825 return ret;
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
826 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
827
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
828 static gboolean
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
829 x509_ca_delete_cert(const gchar *id)
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
830 {
19349
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
831 x509_ca_element *el;
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
832
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
833 g_return_val_if_fail(x509_ca_lazy_init(), FALSE);
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
834 g_return_val_if_fail(id, FALSE);
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
835
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
836 /* Is the id even in the pool? */
19349
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
837 el = x509_ca_locate_cert(x509_ca_certs, id);
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
838 if ( el == NULL ) {
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
839 purple_debug_warning("certificate/x509/ca",
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
840 "Id %s wasn't in the pool\n",
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
841 id);
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
842 return FALSE;
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
843 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
844
19349
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
845 /* Unlink it from the memory cache and destroy it */
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
846 x509_ca_certs = g_list_remove(x509_ca_certs, el);
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
847 x509_ca_element_free(el);
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
848
747af1d98998 - Implement x509_ca_delete_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19348
diff changeset
849 return TRUE;
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
850 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
851
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
852 static GList *
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
853 x509_ca_get_idlist(void)
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
854 {
19350
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
855 GList *l, *idlist;
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
856
19034
656cf1384216 In x509_ca pool:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19033
diff changeset
857 g_return_val_if_fail(x509_ca_lazy_init(), NULL);
19350
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
858
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
859 idlist = NULL;
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
860 for (l = x509_ca_certs; l; l = l->next) {
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
861 x509_ca_element *el = l->data;
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
862 idlist = g_list_prepend(idlist, g_strdup(el->dn));
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
863 }
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
864
847740e5ca57 - Implement x509_ca_get_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19349
diff changeset
865 return idlist;
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
866 }
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
867
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
868
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
869 static PurpleCertificatePool x509_ca = {
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
870 "x509", /* Scheme name */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
871 "ca", /* Pool name */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
872 N_("Certificate Authorities"),/* User-friendly name */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
873 NULL, /* Internal data */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
874 x509_ca_init, /* init */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
875 x509_ca_uninit, /* uninit */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
876 x509_ca_cert_in_pool, /* Certificate exists? */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
877 x509_ca_get_cert, /* Cert retriever */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
878 x509_ca_put_cert, /* Cert writer */
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
879 x509_ca_delete_cert, /* Cert remover */
19827
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
880 x509_ca_get_idlist, /* idlist retriever */
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
881
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
882 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
883 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
884 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
885 NULL
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
886
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
887 };
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
888
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
889
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
890
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
891 /***** Cache of certificates given by TLS/SSL peers *****/
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
892 static PurpleCertificatePool x509_tls_peers;
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
893
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
894 static gboolean
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
895 x509_tls_peers_init(void)
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
896 {
18574
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
897 gchar *poolpath;
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
898 int ret;
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
899
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
900 /* Set up key cache here if it isn't already done */
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
901 poolpath = purple_certificate_pool_mkpath(&x509_tls_peers, NULL);
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
902 ret = purple_build_dir(poolpath, 0700); /* Make it this user only */
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
903
18574
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
904 g_free(poolpath);
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
905
ee5a638ce111 - Add init for x509_tls_peers pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18573
diff changeset
906 g_return_val_if_fail(ret == 0, FALSE);
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
907 return TRUE;
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
908 }
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
909
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
910 static gboolean
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
911 x509_tls_peers_cert_in_pool(const gchar *id)
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
912 {
18576
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
913 gchar *keypath;
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
914 gboolean ret = FALSE;
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
915
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
916 g_return_val_if_fail(id, FALSE);
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
917
18576
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
918 keypath = purple_certificate_pool_mkpath(&x509_tls_peers, id);
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
919
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
920 ret = g_file_test(keypath, G_FILE_TEST_IS_REGULAR);
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
921
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
922 g_free(keypath);
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
923 return ret;
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
924 }
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
925
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
926 static PurpleCertificate *
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
927 x509_tls_peers_get_cert(const gchar *id)
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
928 {
18576
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
929 PurpleCertificateScheme *x509;
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
930 PurpleCertificate *crt;
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
931 gchar *keypath;
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
932
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
933 g_return_val_if_fail(id, NULL);
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
934
18576
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
935 /* Is it in the pool? */
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
936 if ( !x509_tls_peers_cert_in_pool(id) ) {
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
937 return NULL;
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
938 }
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
939
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
940 /* Look up the X.509 scheme */
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
941 x509 = purple_certificate_find_scheme("x509");
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
942 g_return_val_if_fail(x509, NULL);
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
943
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
944 /* Okay, now find and load that key */
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
945 keypath = purple_certificate_pool_mkpath(&x509_tls_peers, id);
18579
a479d0f12779 - Finish tls_peers get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18578
diff changeset
946 crt = purple_certificate_import(x509, keypath);
18576
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
947
18579
a479d0f12779 - Finish tls_peers get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18578
diff changeset
948 g_free(keypath);
18576
d7d4ea071a48 - Finished tls_peers cert_in_pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18575
diff changeset
949
18579
a479d0f12779 - Finish tls_peers get_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18578
diff changeset
950 return crt;
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
951 }
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
952
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
953 static gboolean
18571
abab131c242c - CertificatePool put_cert now accepts an id argument
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18496
diff changeset
954 x509_tls_peers_put_cert(const gchar *id, PurpleCertificate *crt)
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
955 {
18580
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
956 gboolean ret = FALSE;
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
957 gchar *keypath;
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
958
18580
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
959 g_return_val_if_fail(crt, FALSE);
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
960 g_return_val_if_fail(crt->scheme, FALSE);
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
961 /* Make sure that this is some kind of X.509 certificate */
18581
26b562cc939d - Comment change
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18580
diff changeset
962 /* TODO: Perhaps just check crt->scheme->name instead? */
18580
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
963 g_return_val_if_fail(crt->scheme == purple_certificate_find_scheme(x509_tls_peers.scheme_name), FALSE);
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
964
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
965 /* Work out the filename and export */
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
966 keypath = purple_certificate_pool_mkpath(&x509_tls_peers, id);
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
967 ret = purple_certificate_export(keypath, crt);
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
968
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
969 g_free(keypath);
9cd83ce5366d - Add tls_peers put_cert
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18579
diff changeset
970 return ret;
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
971 }
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
972
18897
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
973 static gboolean
18898
eb09543c2898 - remove_cert => delete_cert, because naming conventions are our
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18897
diff changeset
974 x509_tls_peers_delete_cert(const gchar *id)
18897
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
975 {
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
976 gboolean ret = FALSE;
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
977 gchar *keypath;
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
978
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
979 g_return_val_if_fail(id, FALSE);
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
980
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
981 /* Is the id even in the pool? */
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
982 if (!x509_tls_peers_cert_in_pool(id)) {
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
983 purple_debug_warning("certificate/tls_peers",
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
984 "Id %s wasn't in the pool\n",
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
985 id);
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
986 return FALSE;
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
987 }
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
988
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
989 /* OK, so work out the keypath and delete the thing */
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
990 keypath = purple_certificate_pool_mkpath(&x509_tls_peers, id);
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
991 if ( unlink(keypath) != 0 ) {
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
992 purple_debug_error("certificate/tls_peers",
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
993 "Unlink of %s failed!\n",
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
994 keypath);
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
995 ret = FALSE;
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
996 } else {
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
997 ret = TRUE;
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
998 }
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
999
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
1000 g_free(keypath);
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
1001 return ret;
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
1002 }
1f94d1ea37c3 - Write remove_cert function for tls_peers Pool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18896
diff changeset
1003
18662
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1004 static GList *
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1005 x509_tls_peers_get_idlist(void)
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1006 {
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1007 GList *idlist = NULL;
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1008 GDir *dir;
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1009 const gchar *entry;
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1010 gchar *poolpath;
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1011
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1012 /* Get a handle on the pool directory */
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1013 poolpath = purple_certificate_pool_mkpath(&x509_tls_peers, NULL);
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1014 dir = g_dir_open(poolpath,
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1015 0, /* No flags */
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1016 NULL); /* Not interested in what the error is */
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1017 g_free(poolpath);
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1018
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1019 g_return_val_if_fail(dir, NULL);
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1020
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1021 /* Traverse the directory listing and create an idlist */
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1022 while ( (entry = g_dir_read_name(dir)) != NULL ) {
19018
2ebe15f875a6 - tls_peers pool unescapes filenames in its directory, as it should
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19017
diff changeset
1023 /* Unescape the filename */
2ebe15f875a6 - tls_peers pool unescapes filenames in its directory, as it should
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19017
diff changeset
1024 const char *unescaped = purple_unescape_filename(entry);
2ebe15f875a6 - tls_peers pool unescapes filenames in its directory, as it should
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19017
diff changeset
1025
18662
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1026 /* Copy the entry name into our list (GLib owns the original
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1027 string) */
19018
2ebe15f875a6 - tls_peers pool unescapes filenames in its directory, as it should
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19017
diff changeset
1028 idlist = g_list_prepend(idlist, g_strdup(unescaped));
18662
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1029 }
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1030
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1031 /* Release the directory */
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1032 g_dir_close(dir);
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1033
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1034 return idlist;
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1035 }
8d763d3e7784 - Add get_idlist support to tls_peers CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18661
diff changeset
1036
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1037 static PurpleCertificatePool x509_tls_peers = {
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1038 "x509", /* Scheme name */
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1039 "tls_peers", /* Pool name */
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1040 N_("SSL Peers Cache"), /* User-friendly name */
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1041 NULL, /* Internal data */
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1042 x509_tls_peers_init, /* init */
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1043 NULL, /* uninit not required */
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1044 x509_tls_peers_cert_in_pool, /* Certificate exists? */
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1045 x509_tls_peers_get_cert, /* Cert retriever */
18661
a3c1e2719e45 - Add pool_get_idlist / pool_destroy_idlist
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18659
diff changeset
1046 x509_tls_peers_put_cert, /* Cert writer */
18899
45bdab2558f8 - Add purple_certificate_pool_delete
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18898
diff changeset
1047 x509_tls_peers_delete_cert, /* Cert remover */
19827
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1048 x509_tls_peers_get_idlist, /* idlist retriever */
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1049
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1050 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1051 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1052 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1053 NULL
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1054 };
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1055
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1056
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
1057 /***** A Verifier that uses the tls_peers cache and the CA pool to validate certificates *****/
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1058 static PurpleCertificateVerifier x509_tls_cached;
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1059
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1060
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1061 /* The following is several hacks piled together and needs to be fixed.
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1062 * It exists because show_cert (see its comments) needs the original reason
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1063 * given to user_auth in order to rebuild the dialog.
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1064 */
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1065 /* TODO: This will cause a ua_ctx to become memleaked if the request(s) get
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1066 closed by handle or otherwise abnormally. */
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1067 typedef struct {
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1068 PurpleCertificateVerificationRequest *vrq;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1069 gchar *reason;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1070 } x509_tls_cached_ua_ctx;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1071
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1072 static x509_tls_cached_ua_ctx *
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1073 x509_tls_cached_ua_ctx_new(PurpleCertificateVerificationRequest *vrq,
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1074 const gchar *reason)
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1075 {
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1076 x509_tls_cached_ua_ctx *c;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1077
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1078 c = g_new0(x509_tls_cached_ua_ctx, 1);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1079 c->vrq = vrq;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1080 c->reason = g_strdup(reason);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1081
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1082 return c;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1083 }
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1084
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1085
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1086 static void
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1087 x509_tls_cached_ua_ctx_free(x509_tls_cached_ua_ctx *c)
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1088 {
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1089 g_return_if_fail(c);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1090 g_free(c->reason);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1091 g_free(c);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1092 }
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1093
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1094 static void
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1095 x509_tls_cached_user_auth(PurpleCertificateVerificationRequest *vrq,
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1096 const gchar *reason);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1097
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1098 static void
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1099 x509_tls_cached_show_cert(x509_tls_cached_ua_ctx *c, gint id)
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1100 {
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1101 PurpleCertificate *disp_crt = c->vrq->cert_chain->data;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1102
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1103 /* Since clicking a button closes the request, show it again */
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1104 x509_tls_cached_user_auth(c->vrq, c->reason);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1105
19727
4b40eed9fe69 When you have a certificate dialog and you click on "View Certificate",
Mark Doliner <markdoliner@pidgin.im>
parents: 19715
diff changeset
1106 /* Show the certificate AFTER re-opening the dialog so that this
4b40eed9fe69 When you have a certificate dialog and you click on "View Certificate",
Mark Doliner <markdoliner@pidgin.im>
parents: 19715
diff changeset
1107 appears above the other */
4b40eed9fe69 When you have a certificate dialog and you click on "View Certificate",
Mark Doliner <markdoliner@pidgin.im>
parents: 19715
diff changeset
1108 purple_certificate_display_x509(disp_crt);
4b40eed9fe69 When you have a certificate dialog and you click on "View Certificate",
Mark Doliner <markdoliner@pidgin.im>
parents: 19715
diff changeset
1109
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1110 x509_tls_cached_ua_ctx_free(c);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1111 }
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1112
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1113 static void
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1114 x509_tls_cached_user_auth_cb (x509_tls_cached_ua_ctx *c, gint id)
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1115 {
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1116 PurpleCertificateVerificationRequest *vrq;
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1117 PurpleCertificatePool *tls_peers;
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1118
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1119 g_return_if_fail(c);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1120 g_return_if_fail(c->vrq);
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1121
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1122 vrq = c->vrq;
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1123
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1124 x509_tls_cached_ua_ctx_free(c);
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1125
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1126 tls_peers = purple_certificate_find_pool("x509","tls_peers");
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1127
19491
fad93a93ec11 - Fix the interpretation of the "accept cert? yes/no" choice id given by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19490
diff changeset
1128 if (2 == id) {
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1129 gchar *cache_id = vrq->subject_name;
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1130 purple_debug_info("certificate/x509/tls_cached",
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1131 "User ACCEPTED cert\nCaching first in chain for future use as %s...\n",
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1132 cache_id);
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1133
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1134 purple_certificate_pool_store(tls_peers, cache_id,
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1135 vrq->cert_chain->data);
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1136
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1137 purple_certificate_verify_complete(vrq,
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1138 PURPLE_CERTIFICATE_VALID);
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1139 } else {
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1140 purple_debug_info("certificate/x509/tls_cached",
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1141 "User REJECTED cert\n");
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1142 purple_certificate_verify_complete(vrq,
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1143 PURPLE_CERTIFICATE_INVALID);
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1144 }
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1145 }
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1146
19678
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1147 static void
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1148 x509_tls_cached_user_auth_accept_cb(x509_tls_cached_ua_ctx *c, gint ignore)
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1149 {
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1150 x509_tls_cached_user_auth_cb(c, 2);
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1151 }
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1152
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1153 static void
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1154 x509_tls_cached_user_auth_reject_cb(x509_tls_cached_ua_ctx *c, gint ignore)
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1155 {
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1156 x509_tls_cached_user_auth_cb(c, 1);
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1157 }
d19f50a6ac42 There's some disagreement over the response-id sent to the callbacks to
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19668
diff changeset
1158
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1159 /** Validates a certificate by asking the user
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1160 * @param reason String to explain why the user needs to accept/refuse the
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1161 * certificate.
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1162 * @todo Needs a handle argument
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1163 */
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1164 static void
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1165 x509_tls_cached_user_auth(PurpleCertificateVerificationRequest *vrq,
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1166 const gchar *reason)
18589
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1167 {
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1168 gchar *primary;
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1169
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1170 /* Make messages */
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1171 primary = g_strdup_printf(_("Accept certificate for %s?"),
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1172 vrq->subject_name);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1173
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1174 /* Make a semi-pretty display */
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1175 purple_request_action(
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1176 vrq->cb_data, /* TODO: Find what the handle ought to be */
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1177 _("SSL Certificate Verification"),
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1178 primary,
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1179 reason,
19491
fad93a93ec11 - Fix the interpretation of the "accept cert? yes/no" choice id given by
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19490
diff changeset
1180 2, /* Accept by default */
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1181 NULL, /* No account */
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1182 NULL, /* No other user */
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1183 NULL, /* No associated conversation */
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1184 x509_tls_cached_ua_ctx_new(vrq, reason),
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1185 3, /* Number of actions */
19697
276fb2a3d805 - Change wording on certificate accept/reject dialog
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19688
diff changeset
1186 _("Accept"), x509_tls_cached_user_auth_accept_cb,
276fb2a3d805 - Change wording on certificate accept/reject dialog
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19688
diff changeset
1187 _("Reject"), x509_tls_cached_user_auth_reject_cb,
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1188 _("_View Certificate..."), x509_tls_cached_show_cert);
18590
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1189
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1190 /* Cleanup */
d240b212c2d4 - Wrote the logic for the "previously unknown host" condition in
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18589
diff changeset
1191 g_free(primary);
18589
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1192 }
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1193
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1194 static void
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1195 x509_tls_cached_peer_cert_changed(PurpleCertificateVerificationRequest *vrq)
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1196 {
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1197 /* TODO: Prompt the user, etc. */
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1198
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1199 purple_debug_info("certificate/x509/tls_cached",
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1200 "Certificate for %s does not match cached. "
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1201 "Auto-rejecting!\n",
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1202 vrq->subject_name);
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1203
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1204 purple_certificate_verify_complete(vrq, PURPLE_CERTIFICATE_INVALID);
18589
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1205 return;
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1206 }
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1207
19026
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1208 static void
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1209 x509_tls_cached_cert_in_cache(PurpleCertificateVerificationRequest *vrq)
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1210 {
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1211 /* TODO: Looking this up by name over and over is expensive.
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1212 Fix, please! */
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1213 PurpleCertificatePool *tls_peers =
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1214 purple_certificate_find_pool(x509_tls_cached.scheme_name,
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1215 "tls_peers");
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1216
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1217 /* The peer's certificate should be the first in the list */
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1218 PurpleCertificate *peer_crt =
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1219 (PurpleCertificate *) vrq->cert_chain->data;
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1220
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1221 PurpleCertificate *cached_crt;
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1222 GByteArray *peer_fpr, *cached_fpr;
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1223
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1224 /* Load up the cached certificate */
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1225 cached_crt = purple_certificate_pool_retrieve(
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1226 tls_peers, vrq->subject_name);
19715
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1227 if ( !cached_crt ) {
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1228 purple_debug_error("certificate/x509/tls_cached",
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1229 "Lookup failed on cached certificate!\n"
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1230 "It was here just a second ago. Forwarding "
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1231 "to cert_changed.\n");
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1232 /* vrq now becomes the problem of cert_changed */
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1233 x509_tls_cached_peer_cert_changed(vrq);
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1234 }
19026
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1235
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1236 /* Now get SHA1 sums for both and compare them */
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1237 /* TODO: This is not an elegant way to compare certs */
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1238 peer_fpr = purple_certificate_get_fingerprint_sha1(peer_crt);
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1239 cached_fpr = purple_certificate_get_fingerprint_sha1(cached_crt);
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1240 if (!memcmp(peer_fpr->data, cached_fpr->data, peer_fpr->len)) {
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1241 purple_debug_info("certificate/x509/tls_cached",
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1242 "Peer cert matched cached\n");
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1243 /* vrq is now finished */
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1244 purple_certificate_verify_complete(vrq,
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1245 PURPLE_CERTIFICATE_VALID);
19026
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1246 } else {
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1247 purple_debug_info("certificate/x509/tls_cached",
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1248 "Peer cert did NOT match cached\n");
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1249 /* vrq now becomes the problem of cert_changed */
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1250 x509_tls_cached_peer_cert_changed(vrq);
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1251 }
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1252
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1253 purple_certificate_destroy(cached_crt);
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1254 g_byte_array_free(peer_fpr, TRUE);
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1255 g_byte_array_free(cached_fpr, TRUE);
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1256 }
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1257
19025
8b4c3e863a53 In tls_cached Verifier:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19024
diff changeset
1258 /* For when we've never communicated with this party before */
19864
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1259 /* TODO: Need ways to specify possibly multiple problems with a cert, or at
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1260 least reprioritize them. For example, maybe the signature ought to be
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1261 checked BEFORE the hostname checking? */
19025
8b4c3e863a53 In tls_cached Verifier:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19024
diff changeset
1262 static void
8b4c3e863a53 In tls_cached Verifier:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19024
diff changeset
1263 x509_tls_cached_unknown_peer(PurpleCertificateVerificationRequest *vrq)
8b4c3e863a53 In tls_cached Verifier:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19024
diff changeset
1264 {
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1265 PurpleCertificatePool *ca, *tls_peers;
19030
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1266 PurpleCertificate *end_crt, *ca_crt, *peer_crt;
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1267 GList *chain = vrq->cert_chain;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1268 GList *last;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1269 gchar *ca_id;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1270
19030
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1271 peer_crt = (PurpleCertificate *) chain->data;
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1272
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1273 /* First, check that the hostname matches */
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1274 if ( ! purple_certificate_check_subject_name(peer_crt,
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1275 vrq->subject_name) ) {
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1276 gchar *sn = purple_certificate_get_subject_name(peer_crt);
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1277 gchar *msg;
19030
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1278
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1279 purple_debug_info("certificate/x509/tls_cached",
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1280 "Name mismatch: Certificate given for %s "
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1281 "has a name of %s\n",
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1282 vrq->subject_name, sn);
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1283
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1284 /* Prompt the user to authenticate the certificate */
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1285 /* TODO: Provide the user with more guidance about why he is
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1286 being prompted */
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1287 /* vrq will be completed by user_auth */
19498
a73bb5326a93 - Reword some dialogs
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19492
diff changeset
1288 msg = g_strdup_printf(_("The certificate presented by \"%s\" "
a73bb5326a93 - Reword some dialogs
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19492
diff changeset
1289 "claims to be from \"%s\" instead. "
a73bb5326a93 - Reword some dialogs
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19492
diff changeset
1290 "This could mean that you are not "
a73bb5326a93 - Reword some dialogs
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19492
diff changeset
1291 "connecting to the service you "
a73bb5326a93 - Reword some dialogs
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19492
diff changeset
1292 "believe you are."),
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1293 vrq->subject_name, sn);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1294
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1295 x509_tls_cached_user_auth(vrq,msg);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1296
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1297 g_free(sn);
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1298 g_free(msg);
19030
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1299 return;
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1300 } /* if (name mismatch) */
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1301
19864
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1302 /* TODO: Figure out a way to check for a bad signature, as opposed to
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1303 "not self-signed" */
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1304 if ( purple_certificate_signed_by(peer_crt, peer_crt) ) {
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1305 gchar *msg;
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1306
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1307 purple_debug_info("certificate/x509/tls_cached",
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1308 "Certificate for %s is self-signed.\n",
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1309 vrq->subject_name);
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1310
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1311 /* Prompt the user to authenticate the certificate */
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1312 /* vrq will be completed by user_auth */
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1313 msg = g_strdup_printf(_("The certificate presented by \"%s\" "
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1314 "is self-signed. It cannot be "
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1315 "automatically checked."),
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1316 vrq->subject_name);
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1317
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1318 x509_tls_cached_user_auth(vrq,msg);
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1319
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1320 g_free(msg);
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1321 return;
ab4d16d072b8 - Add specific notification for self-signed certificates. Fixes #2874
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19859
diff changeset
1322 } /* if (name mismatch) */
19030
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1323
e2bf9dcb2b72 - Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19029
diff changeset
1324 /* Next, check that the certificate chain is valid */
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1325 if ( ! purple_certificate_check_signature_chain(chain) ) {
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1326 /* TODO: Tell the user where the chain broke? */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1327 /* TODO: This error will hopelessly confuse any
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1328 non-elite user. */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1329 gchar *secondary;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1330
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1331 secondary = g_strdup_printf(_("The certificate chain presented"
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1332 " for %s is not valid."),
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1333 vrq->subject_name);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1334
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1335 /* TODO: Make this error either block the ensuing SSL
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1336 connection error until the user dismisses this one, or
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1337 stifle it. */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1338 purple_notify_error(NULL, /* TODO: Probably wrong. */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1339 _("SSL Certificate Error"),
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1340 _("Invalid certificate chain"),
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1341 secondary );
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1342 g_free(secondary);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1343
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1344 /* Okay, we're done here */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1345 purple_certificate_verify_complete(vrq,
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1346 PURPLE_CERTIFICATE_INVALID);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1347 } /* if (signature chain not good) */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1348
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1349 /* Next, attempt to verify the last certificate against a CA */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1350 ca = purple_certificate_find_pool(x509_tls_cached.scheme_name, "ca");
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1351
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1352 /* If, for whatever reason, there is no Certificate Authority pool
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1353 loaded, we will simply present it to the user for checking. */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1354 if ( !ca ) {
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1355 purple_debug_error("certificate/x509/tls_cached",
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1356 "No X.509 Certificate Authority pool "
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1357 "could be found!\n");
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1358
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1359 /* vrq will be completed by user_auth */
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1360 x509_tls_cached_user_auth(vrq,_("You have no database of root "
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1361 "certificates, so this "
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1362 "certificate cannot be "
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1363 "validated."));
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1364 return;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1365 }
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1366
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1367 last = g_list_last(chain);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1368 end_crt = (PurpleCertificate *) last->data;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1369
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1370 /* Attempt to look up the last certificate's issuer */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1371 ca_id = purple_certificate_get_issuer_unique_id(end_crt);
19352
ec5dc55688cb - Add debugging babble
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19351
diff changeset
1372 purple_debug_info("certificate/x509/tls_cached",
ec5dc55688cb - Add debugging babble
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19351
diff changeset
1373 "Checking for a CA with DN=%s\n",
ec5dc55688cb - Add debugging babble
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19351
diff changeset
1374 ca_id);
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1375 if ( !purple_certificate_pool_contains(ca, ca_id) ) {
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1376 purple_debug_info("certificate/x509/tls_cached",
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1377 "Certificate Authority with DN='%s' not "
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1378 "found. I'll prompt the user, I guess.\n",
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1379 ca_id);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1380 g_free(ca_id);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1381 /* vrq will be completed by user_auth */
19490
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1382 x509_tls_cached_user_auth(vrq,_("The root certificate this "
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1383 "one claims to be issued by "
732f7a5c075d In tls_cached:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19489
diff changeset
1384 "is unknown to Pidgin."));
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1385 return;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1386 }
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1387
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1388 ca_crt = purple_certificate_pool_retrieve(ca, ca_id);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1389 g_free(ca_id);
19715
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1390 if (!ca_crt) {
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1391 purple_debug_error("certificate/x509/tls_cached",
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1392 "Certificate authority disappeared out "
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1393 "underneath me!\n");
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1394 purple_certificate_verify_complete(vrq,
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1395 PURPLE_CERTIFICATE_INVALID);
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1396 return;
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1397 }
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1398
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1399 /* Check the signature */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1400 if ( !purple_certificate_signed_by(end_crt, ca_crt) ) {
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1401 /* TODO: If signed_by ever returns a reason, maybe mention
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1402 that, too. */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1403 /* TODO: Also mention the CA involved. While I could do this
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1404 now, a full DN is a little much with which to assault the
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1405 user's poor, leaky eyes. */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1406 /* TODO: This error message makes my eyes cross, and I wrote it */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1407 gchar * secondary =
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1408 g_strdup_printf(_("The certificate chain presented by "
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1409 "%s does not have a valid digital "
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1410 "signature from the Certificate "
19498
a73bb5326a93 - Reword some dialogs
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19492
diff changeset
1411 "Authority from which it claims to "
19500
9e308787dd82 - TODO whacking and cosmetics
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19499
diff changeset
1412 "have a signature."),
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1413 vrq->subject_name);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1414
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1415 purple_notify_error(NULL, /* TODO: Probably wrong */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1416 _("SSL Certificate Error"),
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1417 _("Invalid certificate authority"
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1418 " signature"),
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1419 secondary);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1420 g_free(secondary);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1421
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1422 /* Signal "bad cert" */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1423 purple_certificate_verify_complete(vrq,
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1424 PURPLE_CERTIFICATE_INVALID);
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1425 return;
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1426 } /* if (CA signature not good) */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1427
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1428 /* If we reach this point, the certificate is good. */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1429 /* Look up the local cache and store it there for future use */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1430 tls_peers = purple_certificate_find_pool(x509_tls_cached.scheme_name,
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1431 "tls_peers");
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1432
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1433 if (tls_peers) {
19715
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1434 if (!purple_certificate_pool_store(tls_peers,vrq->subject_name,
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1435 peer_crt) ) {
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1436 purple_debug_error("certificate/x509/tls_cached",
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1437 "FAILED to cache peer certificate\n");
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1438 }
19029
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1439 } else {
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1440 purple_debug_error("certificate/x509/tls_cached",
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1441 "Unable to locate tls_peers certificate "
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1442 "cache.\n");
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1443 }
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1444
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1445 /* Whew! Done! */
d7a6db2a1edd - Wrote a tls_cached unknown_peer function that does many fun things,
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19028
diff changeset
1446 purple_certificate_verify_complete(vrq, PURPLE_CERTIFICATE_VALID);
19025
8b4c3e863a53 In tls_cached Verifier:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19024
diff changeset
1447 }
8b4c3e863a53 In tls_cached Verifier:
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19024
diff changeset
1448
18589
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1449 static void
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1450 x509_tls_cached_start_verify(PurpleCertificateVerificationRequest *vrq)
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1451 {
18588
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1452 const gchar *tls_peers_name = "tls_peers"; /* Name of local cache */
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1453 PurpleCertificatePool *tls_peers;
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1454
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1455 g_return_if_fail(vrq);
18588
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1456
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1457 purple_debug_info("certificate/x509/tls_cached",
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1458 "Starting verify for %s\n",
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1459 vrq->subject_name);
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1460
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1461 tls_peers = purple_certificate_find_pool(x509_tls_cached.scheme_name,tls_peers_name);
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1462
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1463 /* TODO: This should probably just prompt the user instead of throwing
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1464 an angry fit */
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1465 if (!tls_peers) {
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1466 purple_debug_error("certificate/x509/tls_cached",
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1467 "Couldn't find local peers cache %s\nReturning INVALID to callback\n",
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1468 tls_peers_name);
19031
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1469
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1470 purple_certificate_verify_complete(vrq,
1ba9955f993a - Remove all usage of purple_certificate_verify_destroy, as it is
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19030
diff changeset
1471 PURPLE_CERTIFICATE_INVALID);
18588
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1472 return;
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1473 }
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1474
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1475 /* Check if the peer has a certificate cached already */
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1476 purple_debug_info("certificate/x509/tls_cached",
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1477 "Checking for cached cert...\n");
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1478 if (purple_certificate_pool_contains(tls_peers, vrq->subject_name)) {
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1479 purple_debug_info("certificate/x509/tls_cached",
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1480 "...Found cached cert\n");
19026
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1481 /* vrq is now the responsibility of cert_in_cache */
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1482 x509_tls_cached_cert_in_cache(vrq);
a814165b098f - Move "certificate found in cache" out of tls_cached_start_verify into
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19025
diff changeset
1483 } else {
18588
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1484 purple_debug_info("certificate/x509/tls_cached",
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1485 "...Not in cache\n");
18589
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1486 /* vrq now becomes the problem of unknown_peer */
f828ef45c34e - More skeletonizing for tls_cached logic.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18588
diff changeset
1487 x509_tls_cached_unknown_peer(vrq);
18588
91ad034f1904 - Made a logic skeleton for tls_cached verifier
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18585
diff changeset
1488 }
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1489 }
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1490
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1491 static void
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1492 x509_tls_cached_destroy_request(PurpleCertificateVerificationRequest *vrq)
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1493 {
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1494 g_return_if_fail(vrq);
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1495 }
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1496
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1497 static PurpleCertificateVerifier x509_tls_cached = {
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1498 "x509", /* Scheme name */
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1499 "tls_cached", /* Verifier name */
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1500 x509_tls_cached_start_verify, /* Verification begin */
19827
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1501 x509_tls_cached_destroy_request,/* Request cleanup */
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1502
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1503 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1504 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1505 NULL,
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1506 NULL
62c3805f723e - Add purple_reserved fields to various structures.
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19727
diff changeset
1507
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1508 };
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1509
18470
6a1deea19882 - Add purple_certificate_register_builtins
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18469
diff changeset
1510 /****************************************************************************/
6a1deea19882 - Add purple_certificate_register_builtins
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18469
diff changeset
1511 /* Subsystem */
6a1deea19882 - Add purple_certificate_register_builtins
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18469
diff changeset
1512 /****************************************************************************/
6a1deea19882 - Add purple_certificate_register_builtins
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18469
diff changeset
1513 void
18477
47243c0d52c6 - Certificate system now has init and uninit like other systems
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18473
diff changeset
1514 purple_certificate_init(void)
18470
6a1deea19882 - Add purple_certificate_register_builtins
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18469
diff changeset
1515 {
18477
47243c0d52c6 - Certificate system now has init and uninit like other systems
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18473
diff changeset
1516 /* Register builtins */
18473
a7251d502f6a - Add purple_certificate_get_fingerprint_sha1
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18472
diff changeset
1517 purple_certificate_register_verifier(&x509_singleuse);
19033
8b046b73c2d6 - Add skeleton for X.509 Certificate Authority (x509_ca) CertificatePool
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19032
diff changeset
1518 purple_certificate_register_pool(&x509_ca);
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1519 purple_certificate_register_pool(&x509_tls_peers);
18582
2341c741705b - Add x509_tls_cached skeleton
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18581
diff changeset
1520 purple_certificate_register_verifier(&x509_tls_cached);
18470
6a1deea19882 - Add purple_certificate_register_builtins
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18469
diff changeset
1521 }
18466
881319eb171d - Add certificate_destroy and certificate_destroy_list
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18463
diff changeset
1522
18477
47243c0d52c6 - Certificate system now has init and uninit like other systems
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18473
diff changeset
1523 void
47243c0d52c6 - Certificate system now has init and uninit like other systems
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18473
diff changeset
1524 purple_certificate_uninit(void)
47243c0d52c6 - Certificate system now has init and uninit like other systems
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18473
diff changeset
1525 {
18659
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1526 GList *full_list, *l;
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1527
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1528 /* Unregister all Schemes */
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1529 full_list = g_list_copy(cert_schemes); /* Make a working copy */
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1530 for (l = full_list; l; l = l->next) {
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1531 purple_certificate_unregister_scheme(
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1532 (PurpleCertificateScheme *) l->data );
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1533 }
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1534 g_list_free(full_list);
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1535
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1536 /* Unregister all Verifiers */
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1537 full_list = g_list_copy(cert_verifiers); /* Make a working copy */
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1538 for (l = full_list; l; l = l->next) {
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1539 purple_certificate_unregister_verifier(
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1540 (PurpleCertificateVerifier *) l->data );
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1541 }
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1542 g_list_free(full_list);
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1543
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1544 /* Unregister all Pools */
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1545 full_list = g_list_copy(cert_pools); /* Make a working copy */
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1546 for (l = full_list; l; l = l->next) {
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1547 purple_certificate_unregister_pool(
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1548 (PurpleCertificatePool *) l->data );
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1549 }
89e08c113e68 - Change certificate_uninit to unregister all Pools, Schemes, and
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18658
diff changeset
1550 g_list_free(full_list);
18477
47243c0d52c6 - Certificate system now has init and uninit like other systems
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18473
diff changeset
1551 }
47243c0d52c6 - Certificate system now has init and uninit like other systems
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18473
diff changeset
1552
18657
4932aaf945ea - Add purple_certificate_get_handle
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18656
diff changeset
1553 gpointer
4932aaf945ea - Add purple_certificate_get_handle
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18656
diff changeset
1554 purple_certificate_get_handle(void)
4932aaf945ea - Add purple_certificate_get_handle
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18656
diff changeset
1555 {
4932aaf945ea - Add purple_certificate_get_handle
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18656
diff changeset
1556 static gint handle;
4932aaf945ea - Add purple_certificate_get_handle
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18656
diff changeset
1557 return &handle;
4932aaf945ea - Add purple_certificate_get_handle
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18656
diff changeset
1558 }
4932aaf945ea - Add purple_certificate_get_handle
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18656
diff changeset
1559
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1560 PurpleCertificateScheme *
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1561 purple_certificate_find_scheme(const gchar *name)
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1562 {
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1563 PurpleCertificateScheme *scheme = NULL;
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1564 GList *l;
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1565
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1566 g_return_val_if_fail(name, NULL);
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1567
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1568 /* Traverse the list of registered schemes and locate the
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1569 one whose name matches */
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1570 for(l = cert_schemes; l; l = l->next) {
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1571 scheme = (PurpleCertificateScheme *)(l->data);
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1572
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1573 /* Name matches? that's our man */
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1574 if(!g_ascii_strcasecmp(scheme->name, name))
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1575 return scheme;
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1576 }
17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
1577
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1578 purple_debug_warning("certificate",
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1579 "CertificateScheme %s requested but not found.\n",
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1580 name);
17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
1581
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1582 /* TODO: Signalling and such? */
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1583
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1584 return NULL;
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1585 }
17506
eff6bdd382f3 - Added certificate.[ch] and got them integrated into the build
William Ehlhardt <williamehlhardt@gmail.com>
parents:
diff changeset
1586
18658
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1587 GList *
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1588 purple_certificate_get_schemes(void)
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1589 {
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1590 return cert_schemes;
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1591 }
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1592
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1593 gboolean
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1594 purple_certificate_register_scheme(PurpleCertificateScheme *scheme)
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1595 {
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1596 g_return_val_if_fail(scheme != NULL, FALSE);
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1597
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1598 /* Make sure no scheme is registered with the same name */
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1599 if (purple_certificate_find_scheme(scheme->name) != NULL) {
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1600 return FALSE;
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1601 }
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1602
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1603 /* Okay, we're golden. Register it. */
18491
2aa829b48785 - prepend > append
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18490
diff changeset
1604 cert_schemes = g_list_prepend(cert_schemes, scheme);
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1605
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1606 /* TODO: Signalling and such? */
19003
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1607
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1608 purple_debug_info("certificate",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1609 "CertificateScheme %s registered\n",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1610 scheme->name);
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1611
18251
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1612 return TRUE;
41e00264c49d - Add chunks of the certificate scheme registration interface
William Ehlhardt <williamehlhardt@gmail.com>
parents: 17509
diff changeset
1613 }
18446
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1614
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1615 gboolean
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1616 purple_certificate_unregister_scheme(PurpleCertificateScheme *scheme)
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1617 {
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1618 if (NULL == scheme) {
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1619 purple_debug_warning("certificate",
18492
1ebf50a37d55 - Fix some errors and return values
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18491
diff changeset
1620 "Attempting to unregister NULL scheme\n");
1ebf50a37d55 - Fix some errors and return values
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18491
diff changeset
1621 return FALSE;
18446
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1622 }
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1623
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1624 /* TODO: signalling? */
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1625
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1626 /* TODO: unregister all CertificateVerifiers for this scheme?*/
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1627 /* TODO: unregister all CertificatePools for this scheme? */
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1628 /* Neither of the above should be necessary, though */
18446
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1629 cert_schemes = g_list_remove(cert_schemes, scheme);
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1630
19003
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1631 purple_debug_info("certificate",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1632 "CertificateScheme %s unregistered\n",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1633 scheme->name);
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1634
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1635
18446
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1636 return TRUE;
3e79caab7088 - Add unregister_scheme
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18251
diff changeset
1637 }
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1638
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1639 PurpleCertificateVerifier *
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1640 purple_certificate_find_verifier(const gchar *scheme_name, const gchar *ver_name)
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1641 {
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1642 PurpleCertificateVerifier *vr = NULL;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1643 GList *l;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1644
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1645 g_return_val_if_fail(scheme_name, NULL);
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1646 g_return_val_if_fail(ver_name, NULL);
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1647
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1648 /* Traverse the list of registered verifiers and locate the
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1649 one whose name matches */
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1650 for(l = cert_verifiers; l; l = l->next) {
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1651 vr = (PurpleCertificateVerifier *)(l->data);
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1652
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1653 /* Scheme and name match? */
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1654 if(!g_ascii_strcasecmp(vr->scheme_name, scheme_name) &&
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1655 !g_ascii_strcasecmp(vr->name, ver_name))
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1656 return vr;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1657 }
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1658
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1659 purple_debug_warning("certificate",
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1660 "CertificateVerifier %s, %s requested but not found.\n",
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1661 scheme_name, ver_name);
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1662
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1663 /* TODO: Signalling and such? */
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1664
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1665 return NULL;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1666 }
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1667
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1668
18658
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1669 GList *
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1670 purple_certificate_get_verifiers(void)
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1671 {
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1672 return cert_verifiers;
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1673 }
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1674
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1675 gboolean
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1676 purple_certificate_register_verifier(PurpleCertificateVerifier *vr)
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1677 {
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1678 g_return_val_if_fail(vr != NULL, FALSE);
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1679
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1680 /* Make sure no verifier is registered with the same scheme/name */
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1681 if (purple_certificate_find_verifier(vr->scheme_name, vr->name) != NULL) {
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1682 return FALSE;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1683 }
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1684
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1685 /* Okay, we're golden. Register it. */
18491
2aa829b48785 - prepend > append
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18490
diff changeset
1686 cert_verifiers = g_list_prepend(cert_verifiers, vr);
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1687
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1688 /* TODO: Signalling and such? */
19003
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1689
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1690 purple_debug_info("certificate",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1691 "CertificateVerifier %s registered\n",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1692 vr->name);
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1693 return TRUE;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1694 }
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1695
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1696 gboolean
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1697 purple_certificate_unregister_verifier(PurpleCertificateVerifier *vr)
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1698 {
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1699 if (NULL == vr) {
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1700 purple_debug_warning("certificate",
18492
1ebf50a37d55 - Fix some errors and return values
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18491
diff changeset
1701 "Attempting to unregister NULL verifier\n");
1ebf50a37d55 - Fix some errors and return values
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18491
diff changeset
1702 return FALSE;
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1703 }
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1704
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1705 /* TODO: signalling? */
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1706
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1707 cert_verifiers = g_list_remove(cert_verifiers, vr);
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1708
19003
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1709
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1710 purple_debug_info("certificate",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1711 "CertificateVerifier %s unregistered\n",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1712 vr->name);
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1713
18461
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1714 return TRUE;
8ae1cd456532 - CertificateVerifier register/unregister/find
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18446
diff changeset
1715 }
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1716
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1717 PurpleCertificatePool *
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1718 purple_certificate_find_pool(const gchar *scheme_name, const gchar *pool_name)
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1719 {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1720 PurpleCertificatePool *pool = NULL;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1721 GList *l;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1722
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1723 g_return_val_if_fail(scheme_name, NULL);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1724 g_return_val_if_fail(pool_name, NULL);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1725
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1726 /* Traverse the list of registered pools and locate the
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1727 one whose name matches */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1728 for(l = cert_pools; l; l = l->next) {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1729 pool = (PurpleCertificatePool *)(l->data);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1730
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1731 /* Scheme and name match? */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1732 if(!g_ascii_strcasecmp(pool->scheme_name, scheme_name) &&
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1733 !g_ascii_strcasecmp(pool->name, pool_name))
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1734 return pool;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1735 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1736
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1737 purple_debug_warning("certificate",
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1738 "CertificatePool %s, %s requested but not found.\n",
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1739 scheme_name, pool_name);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1740
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1741 /* TODO: Signalling and such? */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1742
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1743 return NULL;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1744
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1745 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1746
18658
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1747 GList *
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1748 purple_certificate_get_pools(void)
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1749 {
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1750 return cert_pools;
2cc5bc32898a - Add get_pools, get_verifiers, and get_schemes
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18657
diff changeset
1751 }
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1752
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1753 gboolean
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1754 purple_certificate_register_pool(PurpleCertificatePool *pool)
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1755 {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1756 gboolean success = FALSE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1757 g_return_val_if_fail(pool, FALSE);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1758 g_return_val_if_fail(pool->scheme_name, FALSE);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1759 g_return_val_if_fail(pool->name, FALSE);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1760 g_return_val_if_fail(pool->fullname, FALSE);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1761
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1762 /* Make sure no pools are registered under this name */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1763 if (purple_certificate_find_pool(pool->scheme_name, pool->name)) {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1764 return FALSE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1765 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1766
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1767 /* Initialize the pool if needed */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1768 if (pool->init) {
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1769 success = pool->init();
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1770 } else {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1771 success = TRUE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1772 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1773
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1774 if (success) {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1775 /* Register the Pool */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1776 cert_pools = g_list_prepend(cert_pools, pool);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1777
18894
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1778 /* TODO: Emit a signal that the pool got registered */
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1779
19688
7eddbc94521c (Un)Register the pools with DBus to avoid a runtime fit.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19678
diff changeset
1780 PURPLE_DBUS_REGISTER_POINTER(pool, PurpleCertificatePool);
18894
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1781 purple_signal_register(pool, /* Signals emitted from pool */
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1782 "certificate-stored",
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1783 purple_marshal_VOID__POINTER_POINTER,
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1784 NULL, /* No callback return value */
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1785 2, /* Two non-data arguments */
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1786 purple_value_new(PURPLE_TYPE_SUBTYPE,
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1787 PURPLE_SUBTYPE_CERTIFICATEPOOL),
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1788 purple_value_new(PURPLE_TYPE_STRING));
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1789
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1790 purple_signal_register(pool, /* Signals emitted from pool */
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1791 "certificate-deleted",
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1792 purple_marshal_VOID__POINTER_POINTER,
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1793 NULL, /* No callback return value */
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1794 2, /* Two non-data arguments */
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1795 purple_value_new(PURPLE_TYPE_SUBTYPE,
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1796 PURPLE_SUBTYPE_CERTIFICATEPOOL),
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1797 purple_value_new(PURPLE_TYPE_STRING));
19003
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1798
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1799
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1800 purple_debug_info("certificate",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1801 "CertificatePool %s registered\n",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1802 pool->name);
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1803 return TRUE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1804 } else {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1805 return FALSE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1806 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1807
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1808 /* Control does not reach this point */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1809 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1810
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1811 gboolean
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1812 purple_certificate_unregister_pool(PurpleCertificatePool *pool)
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1813 {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1814 if (NULL == pool) {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1815 purple_debug_warning("certificate",
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1816 "Attempting to unregister NULL pool\n");
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1817 return FALSE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1818 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1819
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1820 /* Check that the pool is registered */
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1821 if (!g_list_find(cert_pools, pool)) {
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1822 purple_debug_warning("certificate",
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1823 "Pool to unregister isn't registered!\n");
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1824
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1825 return FALSE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1826 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1827
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1828 /* Uninit the pool if needed */
19688
7eddbc94521c (Un)Register the pools with DBus to avoid a runtime fit.
Sadrul Habib Chowdhury <sadrul@pidgin.im>
parents: 19678
diff changeset
1829 PURPLE_DBUS_UNREGISTER_POINTER(pool);
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1830 if (pool->uninit) {
18494
fc93e7020e83 - CertificatePool member functions no longer accept a Pool instance, as Pools are expected to be singletons
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18492
diff changeset
1831 pool->uninit();
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1832 }
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1833
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1834 cert_pools = g_list_remove(cert_pools, pool);
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1835
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1836 /* TODO: Signalling? */
18894
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1837 purple_signal_unregister(pool, "certificate-stored");
1a00d2309d39 - Register the certificate-stored and certificate-deleted signals
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18818
diff changeset
1838 purple_signal_unregister(pool, "certificate-deleted");
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1839
19003
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1840 purple_debug_info("certificate",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1841 "CertificatePool %s unregistered\n",
0998b8659565 - Add debugging babble for registers/unregisters
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19000
diff changeset
1842 pool->name);
18490
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1843 return TRUE;
691b0b16f8be - Add find, register, and unregister for CertificatePools
William Ehlhardt <williamehlhardt@gmail.com>
parents: 18483
diff changeset
1844 }
19489
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1845
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1846 /****************************************************************************/
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1847 /* Scheme-specific functions */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1848 /****************************************************************************/
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1849
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1850 void
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1851 purple_certificate_display_x509(PurpleCertificate *crt)
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1852 {
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1853 gchar *sha_asc;
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1854 GByteArray *sha_bin;
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1855 gchar *cn;
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1856 time_t activation, expiration;
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1857 gchar *activ_str, *expir_str;
19492
b8dff22498f6 - Fix some g_free()s of string constants that caused crashing
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19491
diff changeset
1858 gchar *secondary;
19489
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1859
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1860 /* Pull out the SHA1 checksum */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1861 sha_bin = purple_certificate_get_fingerprint_sha1(crt);
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1862 /* Now decode it for display */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1863 sha_asc = purple_base16_encode_chunked(sha_bin->data,
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1864 sha_bin->len);
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1865
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1866 /* Get the cert Common Name */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1867 /* TODO: Will break on CA certs */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1868 cn = purple_certificate_get_subject_name(crt);
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1869
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1870 /* Get the certificate times */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1871 /* TODO: Check the times against localtime */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1872 /* TODO: errorcheck? */
19715
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1873 if (!purple_certificate_get_times(crt, &activation, &expiration)) {
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1874 purple_debug_error("certificate",
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1875 "Failed to get certificate times!\n");
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1876 activation = expiration = 0;
b548029f18aa - Remove g_assert()s. Fixes #2859
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19697
diff changeset
1877 }
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1878 activ_str = g_strdup(ctime(&activation));
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1879 expir_str = g_strdup(ctime(&expiration));
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1880
19489
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1881 /* Make messages */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1882 secondary = g_strdup_printf(_("Common name: %s\n\n"
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1883 "Fingerprint (SHA1): %s\n\n"
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1884 "Activation date: %s\n"
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1885 "Expiration date: %s\n"),
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1886 cn, sha_asc, activ_str, expir_str);
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1887
19489
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1888 /* Make a semi-pretty display */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1889 purple_notify_info(
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1890 NULL, /* TODO: Find what the handle ought to be */
19492
b8dff22498f6 - Fix some g_free()s of string constants that caused crashing
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19491
diff changeset
1891 _("Certificate Information"),
b8dff22498f6 - Fix some g_free()s of string constants that caused crashing
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19491
diff changeset
1892 "",
19489
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1893 secondary);
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1894
19489
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1895 /* Cleanup */
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1896 g_free(cn);
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1897 g_free(secondary);
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1898 g_free(sha_asc);
19668
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1899 g_free(activ_str);
2071903c58e4 Fix the win32 build for the cert SoC branch merge.
Daniel Atallah <datallah@pidgin.im>
parents: 19500
diff changeset
1900 g_free(expir_str);
19489
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1901 g_byte_array_free(sha_bin, TRUE);
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1902 }
772b691e901b - Add purple_certificate_display_x509
William Ehlhardt <williamehlhardt@gmail.com>
parents: 19484
diff changeset
1903

mercurial