Mercurial > pidgin.yaz
changeset 19090:5310b1294287
- Add HOSTNAME CHECKING to tls_cached unknown_peer mode, which is kind
of important, I'd say. This is all still untested.
author | William Ehlhardt <williamehlhardt@gmail.com> |
---|---|
date | Fri, 10 Aug 2007 05:44:20 +0000 |
parents | c8962b52579e |
children | 489889091b14 |
files | libpurple/certificate.c |
diffstat | 1 files changed, 25 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/certificate.c Fri Aug 10 05:36:42 2007 +0000 +++ b/libpurple/certificate.c Fri Aug 10 05:44:20 2007 +0000 @@ -921,12 +921,35 @@ x509_tls_cached_unknown_peer(PurpleCertificateVerificationRequest *vrq) { PurpleCertificatePool *ca, *tls_peers; - PurpleCertificate *end_crt, *ca_crt; + PurpleCertificate *end_crt, *ca_crt, *peer_crt; GList *chain = vrq->cert_chain; GList *last; gchar *ca_id; - /* First, check that the certificate chain is valid */ + peer_crt = (PurpleCertificate *) chain->data; + + /* First, check that the hostname matches */ + if ( ! purple_certificate_check_subject_name(peer_crt, + vrq->subject_name) ) { + gchar *sn = purple_certificate_get_subject_name(peer_crt); + + purple_debug_info("certificate/x509/tls_cached", + "Name mismatch: Certificate given for %s " + "has a name of %s\n", + vrq->subject_name, sn); + g_free(sn); + + /* Prompt the user to authenticate the certificate */ + /* TODO: Provide the user with more guidance about why he is + being prompted */ + /* vrq will be completed by user_auth */ + x509_tls_cached_user_auth(vrq); + return; + } /* if (name mismatch) */ + + + + /* Next, check that the certificate chain is valid */ if ( ! purple_certificate_check_signature_chain(chain) ) { /* TODO: Tell the user where the chain broke? */ /* TODO: This error will hopelessly confuse any @@ -1022,7 +1045,6 @@ "tls_peers"); if (tls_peers) { - PurpleCertificate *peer_crt = (PurpleCertificate *)chain->data; g_assert(purple_certificate_pool_store(tls_peers, vrq->subject_name, peer_crt) );