[evolution-data-server] Bug #372435 - Pass signer's certificate to the camel_cipher_validity



commit 24a704817cd3d6a814920ce35fe6d46dbebd16ba
Author: Milan Crha <mcrha redhat com>
Date:   Fri Oct 16 10:21:17 2009 +0200

    Bug #372435 - Pass signer's certificate to the camel_cipher_validity

 camel/camel-cipher-context.c |   39 +++++++++++++++++++++++++++++++++++----
 camel/camel-cipher-context.h |   12 ++++++++++++
 camel/camel-smime-context.c  |   21 ++++++++++++++++++++-
 3 files changed, 67 insertions(+), 5 deletions(-)
---
diff --git a/camel/camel-cipher-context.c b/camel/camel-cipher-context.c
index 263090b..fb7e330 100644
--- a/camel/camel-cipher-context.c
+++ b/camel/camel-cipher-context.c
@@ -361,6 +361,10 @@ ccv_certinfo_free(CamelCipherCertInfo *info)
 {
 	g_free(info->name);
 	g_free(info->email);
+
+	if (info->cert_data && info->cert_data_free)
+		info->cert_data_free (info->cert_data);
+
 	g_free(info);
 }
 
@@ -444,13 +448,19 @@ camel_cipher_validity_clone(CamelCipherValidity *vin)
 
 	info = (CamelCipherCertInfo *)vin->sign.signers.head;
 	while (info->next) {
-		camel_cipher_validity_add_certinfo(vo, CAMEL_CIPHER_VALIDITY_SIGN, info->name, info->email);
+		if (info->cert_data && info->cert_data_clone && info->cert_data_free)
+			camel_cipher_validity_add_certinfo_ex (vo, CAMEL_CIPHER_VALIDITY_SIGN, info->name, info->email, info->cert_data_clone (info->cert_data), info->cert_data_free, info->cert_data_clone);
+		else
+			camel_cipher_validity_add_certinfo (vo, CAMEL_CIPHER_VALIDITY_SIGN, info->name, info->email);
 		info = info->next;
 	}
 
 	info = (CamelCipherCertInfo *)vin->encrypt.encrypters.head;
 	while (info->next) {
-		camel_cipher_validity_add_certinfo(vo, CAMEL_CIPHER_VALIDITY_ENCRYPT, info->name, info->email);
+		if (info->cert_data && info->cert_data_clone && info->cert_data_free)
+			camel_cipher_validity_add_certinfo_ex (vo, CAMEL_CIPHER_VALIDITY_SIGN, info->name, info->email, info->cert_data_clone (info->cert_data), info->cert_data_free, info->cert_data_clone);
+		else
+			camel_cipher_validity_add_certinfo (vo, CAMEL_CIPHER_VALIDITY_ENCRYPT, info->name, info->email);
 		info = info->next;
 	}
 
@@ -469,17 +479,38 @@ camel_cipher_validity_clone(CamelCipherValidity *vin)
 void
 camel_cipher_validity_add_certinfo(CamelCipherValidity *vin, enum _camel_cipher_validity_mode_t mode, const gchar *name, const gchar *email)
 {
+	camel_cipher_validity_add_certinfo_ex (vin, mode, name, email, NULL, NULL, NULL);
+}
+
+/**
+ * camel_cipher_validity_add_certinfo_ex:
+ *
+ * Add a cert info to the signer or encrypter info, with extended data set.
+ **/
+void
+camel_cipher_validity_add_certinfo_ex (CamelCipherValidity *vin, camel_cipher_validity_mode_t mode, const gchar *name, const gchar *email, void *cert_data, void (*cert_data_free)(void *cert_data), void *(*cert_data_clone)(void *cert_data))
+{
 	CamelCipherCertInfo *info;
 	CamelDList *list;
 
 	info = g_malloc0(sizeof(*info));
 	info->name = g_strdup(name);
 	info->email = g_strdup(email);
+	if (cert_data) {
+		if (cert_data_free && cert_data_clone) {
+			info->cert_data = cert_data;
+			info->cert_data_free = cert_data_free;
+			info->cert_data_clone = cert_data_clone;
+		} else {
+			if (!cert_data_free)
+				g_warning ("%s: requires non-NULL cert_data_free function!", G_STRFUNC);
+			if (!cert_data_clone)
+				g_warning ("%s: requires non-NULL cert_data_clone function!", G_STRFUNC);
+		}
+	}
 
 	list = (mode==CAMEL_CIPHER_VALIDITY_SIGN)?&vin->sign.signers:&vin->encrypt.encrypters;
 	camel_dlist_addtail(list, (CamelDListNode *)info);
-
-	d (printf ("adding certinfo %s <%s>\n", name?name:"unset", email?email:"unset"));
 }
 
 /**
diff --git a/camel/camel-cipher-context.h b/camel/camel-cipher-context.h
index 828076c..0a82abf 100644
--- a/camel/camel-cipher-context.h
+++ b/camel/camel-cipher-context.h
@@ -76,6 +76,10 @@ struct _CamelCipherCertInfo {
 
 	gchar *name;		/* common name */
 	gchar *email;
+
+	void *cert_data;  /* custom certificate data; can be NULL */
+	void (*cert_data_free) (void *cert_data); /* called to free cert_data; can be NULL only if cert_data is NULL */
+	void *(*cert_data_clone) (void *cert_data); /* called to clone cert_data; can be NULL only if cert_data is NULL */
 };
 
 struct _CamelCipherValidity {
@@ -174,6 +178,14 @@ void                 camel_cipher_validity_set_description (CamelCipherValidity
 void                 camel_cipher_validity_clear (CamelCipherValidity *validity);
 CamelCipherValidity *camel_cipher_validity_clone(CamelCipherValidity *vin);
 void		     camel_cipher_validity_add_certinfo(CamelCipherValidity *vin, camel_cipher_validity_mode_t mode, const gchar *name, const gchar *email);
+void		     camel_cipher_validity_add_certinfo_ex (
+					CamelCipherValidity *vin,
+					camel_cipher_validity_mode_t mode,
+					const gchar *name,
+					const gchar *email,
+					void *cert_data,
+					void (*cert_data_free) (void *cert_data),
+					void *(*cert_data_clone) (void *cert_data));
 void		     camel_cipher_validity_envelope(CamelCipherValidity *parent, CamelCipherValidity *valid);
 void                 camel_cipher_validity_free (CamelCipherValidity *validity);
 
diff --git a/camel/camel-smime-context.c b/camel/camel-smime-context.c
index 9b23279..70f4b4e 100644
--- a/camel/camel-smime-context.c
+++ b/camel/camel-smime-context.c
@@ -62,6 +62,9 @@
 
 #define d(x)
 
+void smime_cert_data_free (void *cert_data);
+void *smime_cert_data_clone (void *cert_data);
+
 struct _CamelSMIMEContextPrivate {
 	CERTCertDBHandle *certdb;
 
@@ -716,6 +719,22 @@ sm_status_description(NSSCMSVerificationStatus status)
 	}
 }
 
+void
+smime_cert_data_free (void *cert_data)
+{
+	g_return_if_fail (cert_data != NULL);
+
+	CERT_DestroyCertificate (cert_data);
+}
+
+void *
+smime_cert_data_clone (void *cert_data)
+{
+	g_return_val_if_fail (cert_data != NULL, NULL);
+
+	return CERT_DupCertificate (cert_data);
+}
+
 static CamelCipherValidity *
 sm_verify_cmsg(CamelCipherContext *context, NSSCMSMessage *cmsg, CamelStream *extstream, CamelException *ex)
 {
@@ -841,7 +860,7 @@ sm_verify_cmsg(CamelCipherContext *context, NSSCMSMessage *cmsg, CamelStream *ex
 							       cn?cn:"<unknown>", em?em:"<unknown>",
 							       sm_status_description(status));
 
-					camel_cipher_validity_add_certinfo(valid, CAMEL_CIPHER_VALIDITY_SIGN, cn, em);
+					camel_cipher_validity_add_certinfo_ex (valid, CAMEL_CIPHER_VALIDITY_SIGN, cn, em, smime_cert_data_clone (NSS_CMSSignerInfo_GetSigningCertificate (si, p->certdb)), smime_cert_data_free, smime_cert_data_clone);
 
 					if (cn)
 						PORT_Free(cn);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]