[gmime] Removed g_mime_signature_validity_get_status()



commit 0ac9806ca93348310fba93952378c9de25fb5a2b
Author: Jeffrey Stedfast <fejj gnome org>
Date:   Mon Nov 29 10:43:01 2010 -0500

    Removed g_mime_signature_validity_get_status()
    
    2010-11-29  Jeffrey Stedfast  <fejj novell com>
    
    	Fixes bug #635409.
    
    	* gmime/gmime-pkcs7-context.c (pkcs7_get_validity): Reworked the
    	logic to calculate the signer status. Also dropped
    	GMimeSignatureStatus logic.
    
    	* gmime/gmime-gpg-context.c (gpg_verify): Removed the (broken)
    	logic of calculating a GMimeSignatureStatus.
    	(gpg_decrypt): Same.
    	(gpg_ctx_parse_signer_info): Updated for the g_mime_signer_new()
    	API change.
    
    	* gmime/gmime-crypto-context.c (g_mime_signature_validity_new):
    	* No
    	longer initializes a GMimeSignatureStatus member.
    	(g_mime_signature_validity_get_status): Removed.
    	(g_mime_signature_validity_set_status): Removed.
    	(g_mime_signer_new): Now takes a GMimeSignerStatus so that I
    could
    	get rid of the default NONE status.
    
    	* gmime/gmime-crypto-context.h (GMimeSignatureStatus): Removed.

 ChangeLog                    |   25 ++++++++++++++-
 examples/basic-example.c     |   29 +++++++++++++----
 gmime/gmime-crypto-context.c |   64 +++++++++-----------------------------
 gmime/gmime-crypto-context.h |   31 ++----------------
 gmime/gmime-gpg-context.c    |   65 +++----------------------------------
 gmime/gmime-pkcs7-context.c  |   71 +++++++++++++++++++-----------------------
 tests/test-pgp.c             |   23 ++++++++++++--
 tests/test-pgpmime.c         |   42 ++++++++++++++++---------
 tests/test-pkcs7.c           |   23 ++++++++++++--
 tests/test-smime.c           |   42 ++++++++++++++++---------
 10 files changed, 197 insertions(+), 218 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 56e626f..2e2b831 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2010-11-29  Jeffrey Stedfast  <fejj novell com>
+
+	Fixes bug #635409.
+
+	* gmime/gmime-pkcs7-context.c (pkcs7_get_validity): Reworked the
+	logic to calculate the signer status. Also dropped
+	GMimeSignatureStatus logic.
+
+	* gmime/gmime-gpg-context.c (gpg_verify): Removed the (broken)
+	logic of calculating a GMimeSignatureStatus.
+	(gpg_decrypt): Same.
+	(gpg_ctx_parse_signer_info): Updated for the g_mime_signer_new()
+	API change.
+
+	* gmime/gmime-crypto-context.c (g_mime_signature_validity_new): No
+	longer initializes a GMimeSignatureStatus member.
+	(g_mime_signature_validity_get_status): Removed.
+	(g_mime_signature_validity_set_status): Removed.
+	(g_mime_signer_new): Now takes a GMimeSignerStatus so that I could
+	get rid of the default NONE status.
+
+	* gmime/gmime-crypto-context.h (GMimeSignatureStatus): Removed.
+
 2010-11-24  Jeffrey Stedfast  <fejj novell com>
 
 	Fixes bug #635661.
@@ -5,7 +28,7 @@
 	* gmime/gmime-crypto-context.c (g_mime_signer_new): Initialize
 	pubkey_algo and hash_algo.
 	(g_mime_signer_[g,s]et_pubkey_algo): Implemented.
-	(g_mime_signer_[g,s]et_hash_algo): Renamed from [g,s]_hash().
+	(g_mime_signer_[g,s]et_hash_algo): Renamed from [g,s]et_hash().
 
 	* gmime/gmime-crypto-context.h (GMimeCryptoPubKeyAlgo): Defined
 	enum.
diff --git a/examples/basic-example.c b/examples/basic-example.c
index b68e43e..6f83e68 100644
--- a/examples/basic-example.c
+++ b/examples/basic-example.c
@@ -136,6 +136,23 @@ count_parts_in_message (GMimeMessage *message)
 }
 
 #ifndef G_OS_WIN32
+static GMimeSignerStatus
+sig_status (GMimeSignatureValidity *validity)
+{
+	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
+	GMimeSigner *signer = validity->signers;
+	
+	if (signer == NULL)
+		return GMIME_SIGNER_STATUS_ERROR;
+	
+	while (signer != NULL) {
+		status = MAX (status, signer->status);
+		signer = signer->next;
+	}
+	
+	return status;
+}
+
 static void
 verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_data)
 {
@@ -145,7 +162,6 @@ verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_d
 		/* this is a multipart/signed part, so we can verify the pgp signature */
 		GMimeMultipartSigned *mps = (GMimeMultipartSigned *) part;
 		GMimeSignatureValidity *validity;
-		GMimeSignatureStatus status;
 		GError *err = NULL;
 		const char *str;
 		
@@ -160,16 +176,15 @@ verify_foreach_callback (GMimeObject *parent, GMimeObject *part, gpointer user_d
 			g_error_free (err);
 		} else {
 			/* print out validity info - GOOD vs BAD and "why" */
-			status = g_mime_signature_validity_get_status (validity);
-			switch (status) {
-			case GMIME_SIGNATURE_STATUS_GOOD:
+			switch (sig_status (validity)) {
+			case GMIME_SIGNER_STATUS_GOOD:
 				str = "Good";
 				break;
-			case GMIME_SIGNATURE_STATUS_BAD:
+			case GMIME_SIGNER_STATUS_BAD:
 				str = "Bad";
 				break;
-			case GMIME_SIGNATURE_STATUS_UNKNOWN:
-				str = "Unknown";
+			case GMIME_SIGNER_STATUS_ERROR:
+				str = "Error";
 				break;
 			default:
 				str = NULL;
diff --git a/gmime/gmime-crypto-context.c b/gmime/gmime-crypto-context.c
index e2f7223..1f14b68 100644
--- a/gmime/gmime-crypto-context.c
+++ b/gmime/gmime-crypto-context.c
@@ -354,13 +354,11 @@ crypto_decrypt (GMimeCryptoContext *ctx, GMimeStream *istream,
  * cleartext to the output stream.
  *
  * If the encrypted input stream was also signed, the returned
- * #GMimeSignatureValidity will have signer information included and
- * the signature status will be one of #GMIME_SIGNATURE_STATUS_GOOD,
- * #GMIME_SIGNATURE_STATUS_BAD, or #GMIME_SIGNATURE_STATUS_UNKNOWN.
+ * #GMimeSignatureValidity will contain a list of signers, each with a
+ * #GMimeSignerStatus (among other details).
  *
- * If the encrypted input text was not signed, then the signature
- * status of the returned #GMimeSignatureValidity will be
- * #GMIME_SIGNATURE_STATUS_NONE.
+ * If the encrypted input text was not signed, then the
+ * #GMimeSignatureValidity will not contain any signers.
  *
  * Returns: a #GMimeSignatureValidity on success or %NULL on error.
  **/
@@ -444,22 +442,23 @@ g_mime_crypto_context_export_keys (GMimeCryptoContext *ctx, GPtrArray *keys,
 
 /**
  * g_mime_signer_new:
+ * @status: A #GMimeSignerStatus
  *
- * Allocates an new #GMimeSigner. This function is meant to be used in
- * #GMimeCryptoContext subclasses when allocating signers to add to a
- * #GMimeSignatureValidity.
+ * Allocates an new #GMimeSigner with the designated @status. This
+ * function is meant to be used in #GMimeCryptoContext subclasses when
+ * allocating signers to add to a #GMimeSignatureValidity.
  *
- * Returns: a new #GMimeSigner.
+ * Returns: a new #GMimeSigner with the designated @status.
  **/
 GMimeSigner *
-g_mime_signer_new (void)
+g_mime_signer_new (GMimeSignerStatus status)
 {
 	GMimeSigner *signer;
 	
 	signer = g_slice_new (GMimeSigner);
 	signer->pubkey_algo = GMIME_CRYPTO_PUBKEY_ALGO_DEFAULT;
 	signer->hash_algo = GMIME_CRYPTO_HASH_DEFAULT;
-	signer->status = GMIME_SIGNER_STATUS_NONE;
+	signer->status = status;
 	signer->errors = GMIME_SIGNER_ERROR_NONE;
 	signer->trust = GMIME_SIGNER_TRUST_NONE;
 	signer->sig_created = (time_t) -1;
@@ -543,7 +542,7 @@ g_mime_signer_set_status (GMimeSigner *signer, GMimeSignerStatus status)
 GMimeSignerStatus
 g_mime_signer_get_status (const GMimeSigner *signer)
 {
-	g_return_val_if_fail (signer != NULL, GMIME_SIGNER_STATUS_NONE);
+	g_return_val_if_fail (signer != NULL, GMIME_SIGNER_STATUS_BAD);
 	
 	return signer->status;
 }
@@ -569,7 +568,9 @@ g_mime_signer_set_errors (GMimeSigner *signer, GMimeSignerError errors)
  * g_mime_signer_get_errors:
  * @signer: a #GMimeSigner
  *
- * Get the signer errors.
+ * Get the signer errors. If the #GMimeSignerStatus returned from
+ * g_mime_signer_get_status() is not #GMIME_SIGNER_STATUS_GOOD, then
+ * the errors may provide a clue as to why.
  *
  * Returns: the signer errors.
  **/
@@ -1032,7 +1033,6 @@ g_mime_signature_validity_new (void)
 	GMimeSignatureValidity *validity;
 	
 	validity = g_slice_new (GMimeSignatureValidity);
-	validity->status = GMIME_SIGNATURE_STATUS_NONE;
 	validity->signers = NULL;
 	validity->details = NULL;
 	
@@ -1068,40 +1068,6 @@ g_mime_signature_validity_free (GMimeSignatureValidity *validity)
 
 
 /**
- * g_mime_signature_validity_get_status:
- * @validity: signature validity
- *
- * Gets the signature status (GOOD, BAD, UNKNOWN).
- *
- * Returns: a #GMimeSignatureStatus value.
- **/
-GMimeSignatureStatus
-g_mime_signature_validity_get_status (const GMimeSignatureValidity *validity)
-{
-	g_return_val_if_fail (validity != NULL, GMIME_SIGNATURE_STATUS_NONE);
-	
-	return validity->status;
-}
-
-
-/**
- * g_mime_signature_validity_set_status:
- * @validity: signature validity
- * @status: GOOD, BAD or UNKNOWN
- *
- * Sets the status of the signature on @validity.
- **/
-void
-g_mime_signature_validity_set_status (GMimeSignatureValidity *validity, GMimeSignatureStatus status)
-{
-	g_return_if_fail (status != GMIME_SIGNATURE_STATUS_NONE);
-	g_return_if_fail (validity != NULL);
-	
-	validity->status = status;
-}
-
-
-/**
  * g_mime_signature_validity_get_details:
  * @validity: signature validity
  *
diff --git a/gmime/gmime-crypto-context.h b/gmime/gmime-crypto-context.h
index 26d49b7..b6d57ad 100644
--- a/gmime/gmime-crypto-context.h
+++ b/gmime/gmime-crypto-context.h
@@ -231,19 +231,17 @@ typedef enum {
 
 /**
  * GMimeSignerStatus:
- * @GMIME_SIGNER_STATUS_NONE: No status.
  * @GMIME_SIGNER_STATUS_GOOD: Good signature.
- * @GMIME_SIGNER_STATUS_BAD: Bad signature.
  * @GMIME_SIGNER_STATUS_ERROR: An error occurred.
+ * @GMIME_SIGNER_STATUS_BAD: Bad signature.
  *
  * A value representing the signature status for a particular
  * #GMimeSigner.
  **/
 typedef enum {
-	GMIME_SIGNER_STATUS_NONE,
 	GMIME_SIGNER_STATUS_GOOD,
-	GMIME_SIGNER_STATUS_BAD,
-	GMIME_SIGNER_STATUS_ERROR
+	GMIME_SIGNER_STATUS_ERROR,
+	GMIME_SIGNER_STATUS_BAD
 } GMimeSignerStatus;
 
 
@@ -309,7 +307,7 @@ struct _GMimeSigner {
 };
 
 
-GMimeSigner *g_mime_signer_new (void);
+GMimeSigner *g_mime_signer_new (GMimeSignerStatus status);
 void         g_mime_signer_free (GMimeSigner *signer);
 
 GMimeSigner *g_mime_signer_next (GMimeSigner *signer);
@@ -361,23 +359,6 @@ time_t g_mime_signer_get_key_expires (const GMimeSigner *signer);
 
 
 /**
- * GMimeSignatureStatus:
- * @GMIME_SIGNATURE_STATUS_NONE: No status.
- * @GMIME_SIGNATURE_STATUS_GOOD: Good signature.
- * @GMIME_SIGNATURE_STATUS_BAD: Bad signature.
- * @GMIME_SIGNATURE_STATUS_UNKNOWN: Unknown signature status.
- *
- * The status of a message signature.
- **/
-typedef enum {
-	GMIME_SIGNATURE_STATUS_NONE,
-	GMIME_SIGNATURE_STATUS_GOOD,
-	GMIME_SIGNATURE_STATUS_BAD,
-	GMIME_SIGNATURE_STATUS_UNKNOWN
-} GMimeSignatureStatus;
-
-
-/**
  * GMimeSignatureValidity:
  * @status: The overall signature status.
  * @signers: A list of #GMimeSigner structures.
@@ -387,7 +368,6 @@ typedef enum {
  * a signed stream.
  **/
 struct _GMimeSignatureValidity {
-	GMimeSignatureStatus status;
 	GMimeSigner *signers;
 	char *details;
 };
@@ -396,9 +376,6 @@ struct _GMimeSignatureValidity {
 GMimeSignatureValidity *g_mime_signature_validity_new (void);
 void                    g_mime_signature_validity_free (GMimeSignatureValidity *validity);
 
-GMimeSignatureStatus    g_mime_signature_validity_get_status (const GMimeSignatureValidity *validity);
-void                    g_mime_signature_validity_set_status (GMimeSignatureValidity *validity, GMimeSignatureStatus status);
-
 const char             *g_mime_signature_validity_get_details (const GMimeSignatureValidity *validity);
 void                    g_mime_signature_validity_set_details (GMimeSignatureValidity *validity, const char *details);
 
diff --git a/gmime/gmime-gpg-context.c b/gmime/gmime-gpg-context.c
index e010ec5..82dba35 100644
--- a/gmime/gmime-gpg-context.c
+++ b/gmime/gmime-gpg-context.c
@@ -292,17 +292,9 @@ struct _GpgCtx {
 	unsigned int always_trust:1;
 	unsigned int armor:1;
 	unsigned int need_passwd:1;
-	
 	unsigned int bad_passwds:2;
 	
-	unsigned int badsig:1;
-	unsigned int errsig:1;
-	unsigned int goodsig:1;
-	unsigned int validsig:1;
-	unsigned int nopubkey:1;
-	unsigned int nodata:1;
-	
-	unsigned int padding:15;
+	unsigned int padding:21;
 };
 
 static struct _GpgCtx *
@@ -344,13 +336,6 @@ gpg_ctx_new (GMimeGpgContext *ctx)
 	gpg->need_passwd = FALSE;
 	gpg->need_id = NULL;
 	
-	gpg->nodata = FALSE;
-	gpg->badsig = FALSE;
-	gpg->errsig = FALSE;
-	gpg->goodsig = FALSE;
-	gpg->validsig = FALSE;
-	gpg->nopubkey = FALSE;
-	
 	gpg->signers = NULL;
 	gpg->signer = (GMimeSigner *) &gpg->signers;
 	
@@ -846,11 +831,9 @@ gpg_ctx_parse_signer_info (struct _GpgCtx *gpg, char *status)
 	if (!strncmp (status, "SIG_ID ", 7)) {
 		/* not sure if this contains anything we care about... */
 	} else if (!strncmp (status, "GOODSIG ", 8)) {
-		gpg->goodsig = TRUE;
 		status += 8;
 		
-		signer = g_mime_signer_new ();
-		signer->status = GMIME_SIGNER_STATUS_GOOD;
+		signer = g_mime_signer_new (GMIME_SIGNER_STATUS_GOOD);
 		gpg->signer->next = signer;
 		gpg->signer = signer;
 		
@@ -860,11 +843,9 @@ gpg_ctx_parse_signer_info (struct _GpgCtx *gpg, char *status)
 		/* the rest of the string is the signer's name */
 		signer->name = g_strdup (status);
 	} else if (!strncmp (status, "BADSIG ", 7)) {
-		gpg->badsig = TRUE;
 		status += 7;
 		
-		signer = g_mime_signer_new ();
-		signer->status = GMIME_SIGNER_STATUS_BAD;
+		signer = g_mime_signer_new (GMIME_SIGNER_STATUS_BAD);
 		gpg->signer->next = signer;
 		gpg->signer = signer;
 		
@@ -875,11 +856,9 @@ gpg_ctx_parse_signer_info (struct _GpgCtx *gpg, char *status)
 		signer->name = g_strdup (status);
 	} else if (!strncmp (status, "ERRSIG ", 7)) {
 		/* Note: NO_PUBKEY often comes after an ERRSIG */
-		gpg->errsig = TRUE;
 		status += 7;
 		
-		signer = g_mime_signer_new ();
-		signer->status = GMIME_SIGNER_STATUS_ERROR;
+		signer = g_mime_signer_new (GMIME_SIGNER_STATUS_ERROR);
 		gpg->signer->next = signer;
 		gpg->signer = signer;
 		
@@ -903,7 +882,6 @@ gpg_ctx_parse_signer_info (struct _GpgCtx *gpg, char *status)
 	} else if (!strncmp (status, "NO_PUBKEY ", 10)) {
 		/* the only token is the keyid, but we've already got it */
 		gpg->signer->errors |= GMIME_SIGNER_ERROR_NO_PUBKEY;
-		gpg->nopubkey = TRUE;
 	} else if (!strncmp (status, "EXPSIG", 6)) {
 		/* FIXME: see what else we can glean from this... */
 		gpg->signer->errors |= GMIME_SIGNER_ERROR_EXPSIG;
@@ -914,7 +892,6 @@ gpg_ctx_parse_signer_info (struct _GpgCtx *gpg, char *status)
 	} else if (!strncmp (status, "VALIDSIG ", 9)) {
 		char *inend;
 		
-		gpg->validsig = TRUE;
 		status += 9;
 		
 		signer = gpg->signer;
@@ -1181,8 +1158,6 @@ gpg_ctx_parse_status (struct _GpgCtx *gpg, GError **err)
 		else
 			g_set_error_literal (err, GMIME_ERROR, GMIME_ERROR_GENERAL, _("No data provided"));
 		
-		gpg->nodata = TRUE;
-		
 		return -1;
 	} else {
 		switch (gpg->mode) {
@@ -1799,19 +1774,6 @@ gpg_verify (GMimeCryptoContext *context, GMimeCryptoHash hash,
 	
 	validity = g_mime_signature_validity_new ();
 	g_mime_signature_validity_set_details (validity, diagnostics);
-	
-	if (gpg->goodsig && !(gpg->badsig || gpg->errsig || gpg->nodata)) {
-		/* all signatures were good */
-		validity->status = GMIME_SIGNATURE_STATUS_GOOD;
-	} else if (gpg->badsig && !(gpg->goodsig && !gpg->errsig)) {
-		/* all signatures were bad */
-		validity->status = GMIME_SIGNATURE_STATUS_BAD;
-	} else if (!gpg->nodata) {
-		validity->status = GMIME_SIGNATURE_STATUS_UNKNOWN;
-	} else {
-		validity->status = GMIME_SIGNATURE_STATUS_BAD;
-	}
-	
 	validity->signers = gpg->signers;
 	gpg->signers = NULL;
 	
@@ -1931,23 +1893,8 @@ gpg_decrypt (GMimeCryptoContext *context, GMimeStream *istream,
 	
 	validity = g_mime_signature_validity_new ();
 	g_mime_signature_validity_set_details (validity, diagnostics);
-	
-	if (gpg->signers) {
-		if (gpg->goodsig && !(gpg->badsig || gpg->errsig || gpg->nodata)) {
-			/* all signatures were good */
-			validity->status = GMIME_SIGNATURE_STATUS_GOOD;
-		} else if (gpg->badsig && !(gpg->goodsig && !gpg->errsig)) {
-			/* all signatures were bad */
-			validity->status = GMIME_SIGNATURE_STATUS_BAD;
-		} else if (!gpg->nodata) {
-			validity->status = GMIME_SIGNATURE_STATUS_UNKNOWN;
-		} else {
-			validity->status = GMIME_SIGNATURE_STATUS_BAD;
-		}
-		
-		validity->signers = gpg->signers;
-		gpg->signers = NULL;
-	}
+	validity->signers = gpg->signers;
+	gpg->signers = NULL;
 	
 	gpg_ctx_free (gpg);
 	
diff --git a/gmime/gmime-pkcs7-context.c b/gmime/gmime-pkcs7-context.c
index 249f295..22a02b5 100644
--- a/gmime/gmime-pkcs7-context.c
+++ b/gmime/gmime-pkcs7-context.c
@@ -503,11 +503,9 @@ pkcs7_hash_algo (gpgme_hash_algo_t id)
 static GMimeSignatureValidity *
 pkcs7_get_validity (Pkcs7Ctx *pkcs7, gboolean verify)
 {
-	GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
 	GMimeSignatureValidity *validity;
 	GMimeSigner *signers, *signer;
 	gpgme_verify_result_t result;
-	GMimeSignerError errors;
 	gpgme_subkey_t subkey;
 	gpgme_signature_t sig;
 	gpgme_user_id_t uid;
@@ -517,19 +515,18 @@ pkcs7_get_validity (Pkcs7Ctx *pkcs7, gboolean verify)
 	validity = g_mime_signature_validity_new ();
 	
 	/* get the signature verification results from GpgMe */
-	if (!(result = gpgme_op_verify_result (pkcs7->ctx)) || !result->signatures) {
-		if (verify)
-			g_mime_signature_validity_set_status (validity, GMIME_SIGNATURE_STATUS_UNKNOWN);
-		
+	if (!(result = gpgme_op_verify_result (pkcs7->ctx)) || !result->signatures)
 		return validity;
-	}
 	
 	/* collect the signers for this signature */
 	signers = (GMimeSigner *) &validity->signers;
 	sig = result->signatures;
 	
 	while (sig != NULL) {
-		signer = g_mime_signer_new ();
+		if (sig->status != GPG_ERR_NO_ERROR)
+			signer = g_mime_signer_new (GMIME_SIGNER_STATUS_ERROR);
+		else
+			signer = g_mime_signer_new (GMIME_SIGNER_STATUS_GOOD);
 		signers->next = signer;
 		signers = signer;
 		
@@ -539,10 +536,11 @@ pkcs7_get_validity (Pkcs7Ctx *pkcs7, gboolean verify)
 		g_mime_signer_set_sig_created (signer, sig->timestamp);
 		g_mime_signer_set_fingerprint (signer, sig->fpr);
 		
-		errors = GMIME_SIGNER_ERROR_NONE;
-		
-		if (sig->exp_timestamp != 0 && sig->exp_timestamp <= time (NULL))
-			errors |= GMIME_SIGNER_ERROR_EXPSIG;
+		if (sig->exp_timestamp != 0 && sig->exp_timestamp <= time (NULL)) {
+			/* signature expired, automatically results in a BAD signature */
+			signer->errors |= GMIME_SIGNER_ERROR_EXPSIG;
+			signer->status = GMIME_SIGNER_STATUS_BAD;
+		}
 		
 		if (gpgme_get_key (pkcs7->ctx, sig->fpr, &key, 0) == GPG_ERR_NO_ERROR && key) {
 			/* get more signer info from their signing key */
@@ -577,45 +575,40 @@ pkcs7_get_validity (Pkcs7Ctx *pkcs7, gboolean verify)
 				g_mime_signer_set_key_created (signer, subkey->timestamp);
 				g_mime_signer_set_key_expires (signer, subkey->expires);
 				
-				if (subkey->revoked)
-					errors |= GMIME_SIGNER_ERROR_REVKEYSIG;
+				if (subkey->revoked) {
+					/* signer's key has been revoked, automatic BAD status */
+					signer->errors |= GMIME_SIGNER_ERROR_REVKEYSIG;
+					signer->status = GMIME_SIGNER_STATUS_BAD;
+				}
 				
-				if (subkey->expired)
-					errors |= GMIME_SIGNER_ERROR_EXPKEYSIG;
+				if (subkey->expired) {
+					/* signer's key has expired, automatic BAD status */
+					signer->errors |= GMIME_SIGNER_ERROR_EXPKEYSIG;
+					signer->status = GMIME_SIGNER_STATUS_BAD;
+				}
 			} else {
-				errors |= GMIME_SIGNER_ERROR_NO_PUBKEY;
+				/* If we don't have the subkey used by the signer, then we can't
+				 * tell what the status is, so set to ERROR if it hasn't already
+				 * been designated as BAD. */
+				if (signer->status != GMIME_SIGNER_STATUS_BAD)
+					signer->status = GMIME_SIGNER_STATUS_ERROR;
+				signer->errors |= GMIME_SIGNER_ERROR_NO_PUBKEY;
 			}
 			
 			gpgme_key_unref (key);
 		} else {
-			/* don't have any key information available... */
+			/* If we don't have the signer's public key, then we can't tell what
+			 * the status is, so set it to ERROR if it hasn't already been
+			 * designated as BAD. */
 			g_mime_signer_set_trust (signer, GMIME_SIGNER_TRUST_UNDEFINED);
-			errors |= GMIME_SIGNER_ERROR_NO_PUBKEY;
-		}
-		
-		/* set the accumulated signer errors */
-		g_mime_signer_set_errors (signer, errors);
-		
-		/* get the signer's status and update overall status */
-		if (sig->status != GPG_ERR_NO_ERROR) {
-			if (signer->errors && signer->errors != GMIME_SIGNER_ERROR_NO_PUBKEY) {
-				g_mime_signer_set_status (signer, GMIME_SIGNER_STATUS_ERROR);
-				if (status != GMIME_SIGNATURE_STATUS_BAD)
-					status = GMIME_SIGNATURE_STATUS_UNKNOWN;
-			} else {
-				g_mime_signer_set_status (signer, GMIME_SIGNER_STATUS_BAD);
-				status = GMIME_SIGNATURE_STATUS_BAD;
-			}
-		} else {
-			g_mime_signer_set_status (signer, GMIME_SIGNER_STATUS_GOOD);
+			if (signer->status != GMIME_SIGNER_STATUS_BAD)
+				signer->status = GMIME_SIGNER_STATUS_ERROR;
+			signer->errors |= GMIME_SIGNER_ERROR_NO_PUBKEY;
 		}
 		
 		sig = sig->next;
 	}
 	
-	/* set the resulting overall signature status */
-	g_mime_signature_validity_set_status (validity, status);
-	
 	return validity;
 }
 #endif /* ENABLE_SMIME */
diff --git a/tests/test-pgp.c b/tests/test-pgp.c
index 7e63693..f66fa99 100644
--- a/tests/test-pgp.c
+++ b/tests/test-pgp.c
@@ -46,6 +46,23 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
+static GMimeSignerStatus
+get_sig_status (GMimeSigner *signers)
+{
+	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
+	GMimeSigner *signer = signers;
+	
+	if (signers == NULL)
+		return GMIME_SIGNER_STATUS_ERROR;
+	
+	while (signer != NULL) {
+		status = MAX (status, signer->status);
+		signer = signer->next;
+	}
+	
+	return status;
+}
+
 static void
 test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
@@ -85,7 +102,7 @@ test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphe
 		throw (ex);
 	}
 	
-	if (validity->status != GMIME_SIGNATURE_STATUS_GOOD) {
+	if (get_sig_status (validity->signers) != GMIME_SIGNER_STATUS_GOOD) {
 		g_mime_signature_validity_free (validity);
 		throw (exception_new ("signature BAD"));
 	}
@@ -138,10 +155,10 @@ test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 	}
 	
 	if (sign) {
-		if (sv->status != GMIME_SIGNATURE_STATUS_GOOD)
+		if (get_sig_status (sv->signers) != GMIME_SIGNER_STATUS_GOOD)
 			ex = exception_new ("expected GOOD signature");
 	} else {
-		if (sv->status != GMIME_SIGNATURE_STATUS_NONE)
+		if (sv->signers != NULL)
 			ex = exception_new ("unexpected signature");
 	}
 	
diff --git a/tests/test-pgpmime.c b/tests/test-pgpmime.c
index 4cbf8b1..cb00547 100644
--- a/tests/test-pgpmime.c
+++ b/tests/test-pgpmime.c
@@ -47,23 +47,37 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
+static GMimeSignerStatus
+get_sig_status (GMimeSigner *signers)
+{
+	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
+	GMimeSigner *signer = signers;
+	
+	if (signers == NULL)
+		return GMIME_SIGNER_STATUS_ERROR;
+	
+	while (signer != NULL) {
+		status = MAX (status, signer->status);
+		signer = signer->next;
+	}
+	
+	return status;
+}
+
 static void
 print_verify_results (const GMimeSignatureValidity *validity)
 {
 	GMimeSigner *signer;
 	
-	switch (validity->status) {
-	case GMIME_SIGNATURE_STATUS_NONE:
-		fputs ("NONE\n", stdout);
-		break;
-	case GMIME_SIGNATURE_STATUS_GOOD:
+	switch (get_sig_status (validity->signers)) {
+	case GMIME_SIGNER_STATUS_GOOD:
 		fputs ("GOOD\n", stdout);
 		break;
-	case GMIME_SIGNATURE_STATUS_BAD:
+	case GMIME_SIGNER_STATUS_BAD:
 		fputs ("BAD\n", stdout);
 		break;
-	case GMIME_SIGNATURE_STATUS_UNKNOWN:
-		fputs ("Unknown status\n", stdout);
+	case GMIME_SIGNER_STATUS_ERROR:
+		fputs ("ERROR status\n", stdout);
 		break;
 	default:
 		fputs ("Unknown enum value\n", stdout);
@@ -84,6 +98,7 @@ print_verify_results (const GMimeSignatureValidity *validity)
 			break;
 		case GMIME_SIGNER_TRUST_NEVER:
 			fputs ("Never\n", stdout);
+			break;
 		case GMIME_SIGNER_TRUST_UNDEFINED:
 			fputs ("Undefined\n", stdout);
 			break;
@@ -100,9 +115,6 @@ print_verify_results (const GMimeSignatureValidity *validity)
 		
 		fprintf (stdout, "\tStatus: ");
 		switch (signer->status) {
-		case GMIME_SIGNER_STATUS_NONE:
-			fputs ("None\n", stdout);
-			break;
 		case GMIME_SIGNER_STATUS_GOOD:
 			fputs ("GOOD\n", stdout);
 			break;
@@ -342,11 +354,11 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 	v(print_verify_results (sv));
 	
 	if (sign) {
-		if (sv->status != GMIME_SIGNATURE_STATUS_GOOD)
-			ex = exception_new ("signature validity status expected to be GOOD");
+		if (get_sig_status (sv->signers) != GMIME_SIGNER_STATUS_GOOD)
+			ex = exception_new ("signature status expected to be GOOD");
 	} else {
-		if (sv->status != GMIME_SIGNATURE_STATUS_NONE)
-			ex = exception_new ("signature validity status expected to be NONE");
+		if (sv->signers != NULL)
+			ex = exception_new ("signature status expected to be NONE");
 	}
 	
 	if (ex != NULL) {
diff --git a/tests/test-pkcs7.c b/tests/test-pkcs7.c
index e4e47a9..21fcb9a 100644
--- a/tests/test-pkcs7.c
+++ b/tests/test-pkcs7.c
@@ -47,6 +47,23 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
+static GMimeSignerStatus
+get_sig_status (GMimeSigner *signers)
+{
+	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
+	GMimeSigner *signer = signers;
+	
+	if (signers == NULL)
+		return GMIME_SIGNER_STATUS_ERROR;
+	
+	while (signer != NULL) {
+		status = MAX (status, signer->status);
+		signer = signer->next;
+	}
+	
+	return status;
+}
+
 static void
 test_sign (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
@@ -86,7 +103,7 @@ test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphe
 		throw (ex);
 	}
 	
-	if (validity->status != GMIME_SIGNATURE_STATUS_GOOD) {
+	if (get_sig_status (validity->signers) != GMIME_SIGNER_STATUS_GOOD) {
 		g_mime_signature_validity_free (validity);
 		throw (exception_new ("signature BAD"));
 	}
@@ -140,10 +157,10 @@ test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 	}
 	
 	if (sign) {
-		if (sv->status != GMIME_SIGNATURE_STATUS_GOOD)
+		if (get_sig_status (sv->signers) != GMIME_SIGNER_STATUS_GOOD)
 			ex = exception_new ("expected GOOD signature");
 	} else {
-		if (sv->status != GMIME_SIGNATURE_STATUS_NONE)
+		if (sv->signers != NULL)
 			ex = exception_new ("unexpected signature");
 	}
 	
diff --git a/tests/test-smime.c b/tests/test-smime.c
index a3ef830..2cb2a0c 100644
--- a/tests/test-smime.c
+++ b/tests/test-smime.c
@@ -48,23 +48,37 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 	return TRUE;
 }
 
+static GMimeSignerStatus
+get_sig_status (GMimeSigner *signers)
+{
+	GMimeSignerStatus status = GMIME_SIGNER_STATUS_GOOD;
+	GMimeSigner *signer = signers;
+	
+	if (signers == NULL)
+		return GMIME_SIGNER_STATUS_ERROR;
+	
+	while (signer != NULL) {
+		status = MAX (status, signer->status);
+		signer = signer->next;
+	}
+	
+	return status;
+}
+
 static void
 print_verify_results (const GMimeSignatureValidity *validity)
 {
 	GMimeSigner *signer;
 	
-	switch (validity->status) {
-	case GMIME_SIGNATURE_STATUS_NONE:
-		fputs ("NONE\n", stdout);
-		break;
-	case GMIME_SIGNATURE_STATUS_GOOD:
+	switch (get_sig_status (validity->signers)) {
+	case GMIME_SIGNER_STATUS_GOOD:
 		fputs ("GOOD\n", stdout);
 		break;
-	case GMIME_SIGNATURE_STATUS_BAD:
+	case GMIME_SIGNER_STATUS_BAD:
 		fputs ("BAD\n", stdout);
 		break;
-	case GMIME_SIGNATURE_STATUS_UNKNOWN:
-		fputs ("Unknown status\n", stdout);
+	case GMIME_SIGNER_STATUS_ERROR:
+		fputs ("ERROR status\n", stdout);
 		break;
 	default:
 		fputs ("Unknown enum value\n", stdout);
@@ -85,6 +99,7 @@ print_verify_results (const GMimeSignatureValidity *validity)
 			break;
 		case GMIME_SIGNER_TRUST_NEVER:
 			fputs ("Never\n", stdout);
+			break;
 		case GMIME_SIGNER_TRUST_UNDEFINED:
 			fputs ("Undefined\n", stdout);
 			break;
@@ -101,9 +116,6 @@ print_verify_results (const GMimeSignatureValidity *validity)
 		
 		fprintf (stdout, "\tStatus: ");
 		switch (signer->status) {
-		case GMIME_SIGNER_STATUS_NONE:
-			fputs ("None\n", stdout);
-			break;
 		case GMIME_SIGNER_STATUS_GOOD:
 			fputs ("GOOD\n", stdout);
 			break;
@@ -343,11 +355,11 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 	v(print_verify_results (sv));
 	
 	if (sign) {
-		if (sv->status != GMIME_SIGNATURE_STATUS_GOOD)
-			ex = exception_new ("signature validity status expected to be GOOD");
+		if (get_sig_status (sv->signers) != GMIME_SIGNER_STATUS_GOOD)
+			ex = exception_new ("signature status expected to be GOOD");
 	} else {
-		if (sv->status != GMIME_SIGNATURE_STATUS_NONE)
-			ex = exception_new ("signature validity status expected to be NONE");
+		if (sv->signers != NULL)
+			ex = exception_new ("signature status expected to be NONE");
 	}
 	
 	if (ex != NULL) {



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