Mercurial > pidgin
diff libpurple/certificate.c @ 18941:425f494bd1ec
- CertificateVerifier register/unregister/find
- certificate_verify added, probably will change
- struct Verifier: start_verification added
author | William Ehlhardt <williamehlhardt@gmail.com> |
---|---|
date | Fri, 22 Jun 2007 23:30:26 +0000 |
parents | 8c4d52bc0319 |
children | 02102eccc4be |
line wrap: on
line diff
--- a/libpurple/certificate.c Fri Jun 22 20:49:32 2007 +0000 +++ b/libpurple/certificate.c Fri Jun 22 23:30:26 2007 +0000 @@ -33,6 +33,35 @@ /** List holding pointers to all registered certificate schemes */ static GList *cert_schemes = NULL; +/** List of registered Verifiers */ +static GList *cert_verifiers = NULL; + +void +purple_certificate_verify (PurpleCertificateVerificationRequest *vrq, + gchar *scheme_name, gchar *ver_name, + gchar *subject_name, GList *cert_chain, + PurpleCertificateVerifiedCallback cb, + gpointer cb_data) +{ + PurpleCertificateScheme *scheme; + PurpleCertificateVerifier *verifier; + + g_return_val_if_fail(ver_name != NULL, NULL); + g_return_val_if_fail(subject_name != NULL, NULL); + /* If you don't have a cert to check, why are you requesting that it + be verified? */ + g_return_val_if_fail(cert_chain != NULL, NULL); + g_return_val_if_fail(cb != NULL, NULL); + + /* Locate the verifier, first */ + + /* Construct and fill in the request fields */ + vrq = g_new(PurpleCertificateVerificationRequest, 1); + vrq->cert_chain = cert_chain; + vrq->cb = cb; + vrq->cb_data = cb_data; + vrq->subject_name = g_strdup(subject_name); +} PurpleCertificateScheme * purple_certificate_find_scheme(const gchar *name) @@ -88,8 +117,72 @@ /* TODO: signalling? */ - /* TODO: unregister all CertificatePools for this scheme! */ + /* TODO: unregister all CertificateVerifiers for this scheme?*/ + /* TODO: unregister all CertificatePools for this scheme? */ + /* Neither of the above should be necessary, though */ cert_schemes = g_list_remove(cert_schemes, scheme); return TRUE; } + +PurpleCertificateVerifier * +purple_certificate_find_verifier(const gchar *scheme_name, const gchar *ver_name) +{ + PurpleCertificateVerifier *vr = NULL; + GList *l; + + g_return_val_if_fail(scheme_name, NULL); + g_return_val_if_fail(ver_name, NULL); + + /* Traverse the list of registered verifiers and locate the + one whose name matches */ + for(l = cert_verifiers; l; l = l->next) { + vr = (PurpleCertificateVerifier *)(l->data); + + /* Scheme and name match? */ + if(!g_ascii_strcasecmp(vr->scheme_name, scheme_name) && + !g_ascii_strcasecmp(vr->name, ver_name)) + return vr; + } + + purple_debug_warning("certificate", + "CertificateVerifier %s, %s requested but not found.\n", + scheme_name, ver_name); + + /* TODO: Signalling and such? */ + + return NULL; +} + + +gboolean +purple_certificate_register_verifier(PurpleCertificateVerifier *vr) +{ + g_return_val_if_fail(vr != NULL, FALSE); + + /* Make sure no verifier is registered with the same scheme/name */ + if (purple_certificate_find_verifier(vr->scheme_name, vr->name) != NULL) { + return FALSE; + } + + /* Okay, we're golden. Register it. */ + cert_verifiers = g_list_append(cert_verifiers, vr); + + /* TODO: Signalling and such? */ + return TRUE; +} + +gboolean +purple_certificate_unregister_verifier(PurpleCertificateVerifier *vr) +{ + if (NULL == vr) { + purple_debug_warning("certificate", + "Attempting to unregister NULL verifier"); + } + + /* TODO: signalling? */ + + cert_verifiers = g_list_remove(cert_verifiers, vr); + + return TRUE; +}