Added
Link Here
|
1 |
--- libpurple/plugins/ssl/ssl-nss.c |
2 |
+++ libpurple/plugins/ssl/ssl-nss.c |
3 |
@@ -282,39 +282,32 @@ x509_import_from_nss(CERTCertificate* ce |
4 |
static GList * |
5 |
ssl_nss_get_peer_certificates(PRFileDesc *socket, PurpleSslConnection * gsc) |
6 |
{ |
7 |
+ CERTCertList *peerChain; |
8 |
+ CERTCertListNode *cursor; |
9 |
CERTCertificate *curcert; |
10 |
- CERTCertificate *issuerCert; |
11 |
PurpleCertificate * newcrt; |
12 |
|
13 |
/* List of Certificate instances to return */ |
14 |
GList * peer_certs = NULL; |
15 |
- int count; |
16 |
- int64 now = PR_Now(); |
17 |
|
18 |
- curcert = SSL_PeerCertificate(socket); |
19 |
- if (curcert == NULL) { |
20 |
- purple_debug_error("nss", "could not DupCertificate\n"); |
21 |
+ peerChain = SSL_PeerCertificateChain(socket); |
22 |
+ if (peerChain == NULL) { |
23 |
+ purple_debug_error("nss", "no peer certificates\n"); |
24 |
return NULL; |
25 |
} |
26 |
|
27 |
- for (count = 0 ; count < CERT_MAX_CERT_CHAIN ; count++) { |
28 |
+ for (cursor = CERT_LIST_HEAD(peerChain); !CERT_LIST_END(cursor, peerChain); cursor = CERT_LIST_NEXT(cursor)) { |
29 |
+ curcert = cursor->cert; |
30 |
+ if (!curcert) { |
31 |
+ purple_debug_error("nss", "cursor->cert == NULL\n"); |
32 |
+ break; |
33 |
+ } |
34 |
purple_debug_info("nss", "subject=%s issuer=%s\n", curcert->subjectName, |
35 |
curcert->issuerName ? curcert->issuerName : "(null)"); |
36 |
newcrt = x509_import_from_nss(curcert); |
37 |
peer_certs = g_list_append(peer_certs, newcrt); |
38 |
- |
39 |
- if (curcert->isRoot) { |
40 |
- break; |
41 |
- } |
42 |
- issuerCert = CERT_FindCertIssuer(curcert, now, certUsageSSLServer); |
43 |
- if (!issuerCert) { |
44 |
- purple_debug_error("nss", "partial certificate chain\n"); |
45 |
- break; |
46 |
- } |
47 |
- CERT_DestroyCertificate(curcert); |
48 |
- curcert = issuerCert; |
49 |
} |
50 |
- CERT_DestroyCertificate(curcert); |
51 |
+ CERT_DestroyCertList(peerChain); |
52 |
|
53 |
return peer_certs; |
54 |
} |