summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2023-05-02 16:53:51 +0200
committerMilan Crha <mcrha@redhat.com>2023-05-02 16:53:51 +0200
commit0892c27bf4a91fb5c072f9e5a1fc082857e32c5b (patch)
tree46ab2c551c03cf41dec7eeee8574fa57e62a2a6f
parentee4425ff0a36f9e6c7b56f3c00f28e0e630bb88e (diff)
downloadevolution-data-server-0892c27bf4a91fb5c072f9e5a1fc082857e32c5b.tar.gz
I#474 - Camel: Set proper S/MIME signature verification status
Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/474
-rw-r--r--src/camel/camel-smime-context.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/camel/camel-smime-context.c b/src/camel/camel-smime-context.c
index 8e6739e30..e0eb82fa4 100644
--- a/src/camel/camel-smime-context.c
+++ b/src/camel/camel-smime-context.c
@@ -500,25 +500,31 @@ fail:
}
static const gchar *
-sm_status_description (NSSCMSVerificationStatus status)
+sm_status_description (NSSCMSVerificationStatus status,
+ CamelCipherValiditySign *out_sign_status)
{
/* could use this but then we can't control i18n? */
/*NSS_CMSUtil_VerificationStatusToString (status));*/
+ *out_sign_status = CAMEL_CIPHER_VALIDITY_SIGN_BAD;
+
switch (status) {
case NSSCMSVS_Unverified:
default:
/* Translators: A fallback message when couldn't verify an SMIME signature */
return _("Unverified");
case NSSCMSVS_GoodSignature:
+ *out_sign_status = CAMEL_CIPHER_VALIDITY_SIGN_GOOD;
return _("Good signature");
case NSSCMSVS_BadSignature:
return _("Bad signature");
case NSSCMSVS_DigestMismatch:
return _("Content tampered with or altered in transit");
case NSSCMSVS_SigningCertNotFound:
+ *out_sign_status = CAMEL_CIPHER_VALIDITY_SIGN_NEED_PUBLIC_KEY;
return _("Signing certificate not found");
case NSSCMSVS_SigningCertNotTrusted:
+ *out_sign_status = CAMEL_CIPHER_VALIDITY_SIGN_UNKNOWN;
return _("Signing certificate not trusted");
case NSSCMSVS_SignatureAlgorithmUnknown:
return _("Signature algorithm unknown");
@@ -551,12 +557,12 @@ sm_verify_cmsg (CamelCipherContext *context,
PLArenaPool *poolp = NULL;
CamelStream *mem;
NSSCMSVerificationStatus status;
+ CamelCipherValiditySign sign_status = CAMEL_CIPHER_VALIDITY_SIGN_UNKNOWN;
CamelCipherValidity *valid;
GString *description;
description = g_string_new ("");
valid = camel_cipher_validity_new ();
- camel_cipher_validity_set_valid (valid, TRUE);
status = NSSCMSVS_Unverified;
/* NB: this probably needs to go into a decoding routine that can be used for processing
@@ -659,7 +665,7 @@ sm_verify_cmsg (CamelCipherContext *context,
NSS_CMSSignedData_VerifySignerInfo (sigd, j, p->certdb, certUsageEmailSigner);
status = NSS_CMSSignerInfo_GetVerificationStatus (si);
- status_description = sm_status_description (status);
+ status_description = sm_status_description (status, &sign_status);
#if defined (NSS_VMAJOR) && defined (NSS_VMINOR) && (NSS_VMAJOR > 3 || (NSS_VMAJOR == 3 && NSS_VMINOR >= 89))
if (status == NSSCMSVS_BadSignature) {
@@ -719,9 +725,6 @@ sm_verify_cmsg (CamelCipherContext *context,
PORT_Free (cn);
if (em)
PORT_Free (em);
-
- if (status != NSSCMSVS_GoodSignature)
- camel_cipher_validity_set_valid (valid, FALSE);
}
}
break;
@@ -740,7 +743,7 @@ sm_verify_cmsg (CamelCipherContext *context,
}
}
- camel_cipher_validity_set_valid (valid, camel_cipher_validity_get_valid (valid) && status == NSSCMSVS_GoodSignature);
+ valid->sign.status = sign_status;
camel_cipher_validity_set_description (valid, description->str);
g_string_free (description, TRUE);