[evolution-data-server] Bug #372435 - Pass signer's certificate to the camel_cipher_validity
- From: Milan Crha <mcrha src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [evolution-data-server] Bug #372435 - Pass signer's certificate to the camel_cipher_validity
- Date: Fri, 16 Oct 2009 08:22:35 +0000 (UTC)
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]