[gmime] Use gpgme's sig->summary instead of our own status + errors



commit 756c6fe88e9d0482b5c9f7ccbd21a5266f805629
Author: Jeffrey Stedfast <jestedfa microsoft com>
Date:   Tue Feb 7 13:33:20 2017 -0500

    Use gpgme's sig->summary instead of our own status + errors

 gmime/gmime-gpg-context.c   |   47 +++++++----------------------
 gmime/gmime-pkcs7-context.c |   40 ++----------------------
 gmime/gmime-signature.c     |   40 +-----------------------
 gmime/gmime-signature.h     |   60 ++++++++++++++++--------------------
 tests/test-pgp.c            |   16 +++++++---
 tests/test-pgpmime.c        |   71 ++++++++++++++++++-------------------------
 tests/test-pkcs7.c          |   16 +++++++---
 tests/test-smime.c          |   71 ++++++++++++++++++-------------------------
 8 files changed, 125 insertions(+), 236 deletions(-)
---
diff --git a/gmime/gmime-gpg-context.c b/gmime/gmime-gpg-context.c
index 401bcd3..797b553 100644
--- a/gmime/gmime-gpg-context.c
+++ b/gmime/gmime-gpg-context.c
@@ -540,8 +540,8 @@ gpg_get_signatures (GMimeGpgContext *gpg, gboolean verify)
        GMimeSignatureList *signatures;
        GMimeSignature *signature;
        gpgme_verify_result_t result;
-       gpgme_subkey_t subkey;
        gpgme_signature_t sig;
+       gpgme_subkey_t subkey;
        gpgme_user_id_t uid;
        gpgme_key_t key;
        
@@ -557,23 +557,13 @@ gpg_get_signatures (GMimeGpgContext *gpg, gboolean verify)
        while (sig != NULL) {
                signature = g_mime_signature_new ();
                g_mime_signature_list_add (signatures, signature);
-               
-               if (sig->status != GPG_ERR_NO_ERROR)
-                       g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_ERROR);
-               else
-                       g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_GOOD);
+               g_mime_signature_set_status (signature, (GMimeSignatureStatus) sig->summary);
+               g_mime_signature_set_expires (signature, sig->exp_timestamp);
+               g_mime_signature_set_created (signature, sig->timestamp);
                
                g_mime_certificate_set_pubkey_algo (signature->cert, (GMimePubKeyAlgo) sig->pubkey_algo);
                g_mime_certificate_set_digest_algo (signature->cert, (GMimeDigestAlgo) sig->hash_algo);
                g_mime_certificate_set_fingerprint (signature->cert, sig->fpr);
-               g_mime_signature_set_expires (signature, sig->exp_timestamp);
-               g_mime_signature_set_created (signature, sig->timestamp);
-               
-               if (sig->exp_timestamp != 0 && sig->exp_timestamp <= time (NULL)) {
-                       /* signature expired, automatically results in a BAD signature */
-                       signature->errors |= GMIME_SIGNATURE_ERROR_EXPSIG;
-                       signature->status = GMIME_SIGNATURE_STATUS_BAD;
-               }
                
                if (gpgme_get_key (gpg->ctx, sig->fpr, &key, 0) == GPG_ERR_NO_ERROR && key) {
                        /* get more signer info from their signing key */
@@ -607,25 +597,6 @@ gpg_get_signatures (GMimeGpgContext *gpg, gboolean verify)
                        if (subkey) {
                                g_mime_certificate_set_created (signature->cert, subkey->timestamp);
                                g_mime_certificate_set_expires (signature->cert, subkey->expires);
-                               
-                               if (subkey->revoked) {
-                                       /* signer's key has been revoked, automatic BAD status */
-                                       signature->errors |= GMIME_SIGNATURE_ERROR_REVKEYSIG;
-                                       signature->status = GMIME_SIGNATURE_STATUS_BAD;
-                               }
-                               
-                               if (subkey->expired) {
-                                       /* signer's key has expired, automatic BAD status */
-                                       signature->errors |= GMIME_SIGNATURE_ERROR_EXPKEYSIG;
-                                       signature->status = GMIME_SIGNATURE_STATUS_BAD;
-                               }
-                       } else {
-                               /* 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 (signature->status != GMIME_SIGNATURE_STATUS_BAD)
-                                       signature->status = GMIME_SIGNATURE_STATUS_ERROR;
-                               signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY;
                        }
                        
                        gpgme_key_unref (key);
@@ -634,9 +605,6 @@ gpg_get_signatures (GMimeGpgContext *gpg, gboolean verify)
                         * the status is, so set it to ERROR if it hasn't already been
                         * designated as BAD. */
                        g_mime_certificate_set_trust (signature->cert, GMIME_CERTIFICATE_TRUST_UNDEFINED);
-                       if (signature->status != GMIME_SIGNATURE_STATUS_BAD)
-                               signature->status = GMIME_SIGNATURE_STATUS_ERROR;
-                       signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY;
                }
                
                sig = sig->next;
@@ -793,9 +761,14 @@ gpg_get_decrypt_result (GMimeGpgContext *gpg)
        result->recipients = g_mime_certificate_list_new ();
        result->signatures = gpg_get_signatures (gpg, FALSE);
        
+       // TODO: ciper, mdc
+       
        if (!(res = gpgme_op_decrypt_result (gpg->ctx)) || !res->recipients)
                return result;
        
+       //if (res->session_key)
+       //      result->session_key = g_strdup (res->session_key);
+       
        recipient = res->recipients;
        while (recipient != NULL) {
                cert = g_mime_certificate_new ();
@@ -830,6 +803,8 @@ gpg_decrypt_session (GMimeCryptoContext *context, const char *session_key,
        gpgme_data_t input, output;
        gpgme_error_t error;
        
+       // TODO: make use of the session_key
+       
        if ((error = gpgme_data_new_from_cbs (&input, &gpg_stream_funcs, istream)) != GPG_ERR_NO_ERROR) {
                g_set_error (err, GMIME_GPGME_ERROR, error, _("Could not open input stream"));
                return NULL;
diff --git a/gmime/gmime-pkcs7-context.c b/gmime/gmime-pkcs7-context.c
index 84e4717..276ff1d 100644
--- a/gmime/gmime-pkcs7-context.c
+++ b/gmime/gmime-pkcs7-context.c
@@ -522,8 +522,8 @@ pkcs7_get_signatures (GMimePkcs7Context *pkcs7, gboolean verify)
        GMimeSignatureList *signatures;
        GMimeSignature *signature;
        gpgme_verify_result_t result;
-       gpgme_subkey_t subkey;
        gpgme_signature_t sig;
+       gpgme_subkey_t subkey;
        gpgme_user_id_t uid;
        gpgme_key_t key;
        
@@ -539,23 +539,13 @@ pkcs7_get_signatures (GMimePkcs7Context *pkcs7, gboolean verify)
        while (sig != NULL) {
                signature = g_mime_signature_new ();
                g_mime_signature_list_add (signatures, signature);
-               
-               if (sig->status != GPG_ERR_NO_ERROR)
-                       g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_ERROR);
-               else
-                       g_mime_signature_set_status (signature, GMIME_SIGNATURE_STATUS_GOOD);
+               g_mime_signature_set_status (signature, (GMimeSignatureStatus) sig->summary);
+               g_mime_signature_set_expires (signature, sig->exp_timestamp);
+               g_mime_signature_set_created (signature, sig->timestamp);
                
                g_mime_certificate_set_pubkey_algo (signature->cert, (GMimePubKeyAlgo) sig->pubkey_algo);
                g_mime_certificate_set_digest_algo (signature->cert, (GMimeDigestAlgo) sig->hash_algo);
                g_mime_certificate_set_fingerprint (signature->cert, sig->fpr);
-               g_mime_signature_set_expires (signature, sig->exp_timestamp);
-               g_mime_signature_set_created (signature, sig->timestamp);
-               
-               if (sig->exp_timestamp != 0 && sig->exp_timestamp <= time (NULL)) {
-                       /* signature expired, automatically results in a BAD signature */
-                       signature->errors |= GMIME_SIGNATURE_ERROR_EXPSIG;
-                       signature->status = GMIME_SIGNATURE_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 */
@@ -589,25 +579,6 @@ pkcs7_get_signatures (GMimePkcs7Context *pkcs7, gboolean verify)
                        if (subkey) {
                                g_mime_certificate_set_created (signature->cert, subkey->timestamp);
                                g_mime_certificate_set_expires (signature->cert, subkey->expires);
-                               
-                               if (subkey->revoked) {
-                                       /* signer's key has been revoked, automatic BAD status */
-                                       signature->errors |= GMIME_SIGNATURE_ERROR_REVKEYSIG;
-                                       signature->status = GMIME_SIGNATURE_STATUS_BAD;
-                               }
-                               
-                               if (subkey->expired) {
-                                       /* signer's key has expired, automatic BAD status */
-                                       signature->errors |= GMIME_SIGNATURE_ERROR_EXPKEYSIG;
-                                       signature->status = GMIME_SIGNATURE_STATUS_BAD;
-                               }
-                       } else {
-                               /* 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 (signature->status != GMIME_SIGNATURE_STATUS_BAD)
-                                       signature->status = GMIME_SIGNATURE_STATUS_ERROR;
-                               signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY;
                        }
                        
                        gpgme_key_unref (key);
@@ -616,9 +587,6 @@ pkcs7_get_signatures (GMimePkcs7Context *pkcs7, gboolean verify)
                         * the status is, so set it to ERROR if it hasn't already been
                         * designated as BAD. */
                        g_mime_certificate_set_trust (signature->cert, GMIME_CERTIFICATE_TRUST_UNDEFINED);
-                       if (signature->status != GMIME_SIGNATURE_STATUS_BAD)
-                               signature->status = GMIME_SIGNATURE_STATUS_ERROR;
-                       signature->errors |= GMIME_SIGNATURE_ERROR_NO_PUBKEY;
                }
                
                sig = sig->next;
diff --git a/gmime/gmime-signature.c b/gmime/gmime-signature.c
index b79bfda..3f74c05 100644
--- a/gmime/gmime-signature.c
+++ b/gmime/gmime-signature.c
@@ -83,11 +83,10 @@ g_mime_signature_class_init (GMimeSignatureClass *klass)
 static void
 g_mime_signature_init (GMimeSignature *sig, GMimeSignatureClass *klass)
 {
-       sig->status = GMIME_SIGNATURE_STATUS_GOOD;
-       sig->errors = GMIME_SIGNATURE_ERROR_NONE;
        sig->cert = g_mime_certificate_new ();
        sig->created = (time_t) -1;
        sig->expires = (time_t) -1;
+       sig->status = 0;
 }
 
 static void
@@ -143,48 +142,13 @@ g_mime_signature_set_status (GMimeSignature *sig, GMimeSignatureStatus status)
 GMimeSignatureStatus
 g_mime_signature_get_status (GMimeSignature *sig)
 {
-       g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_STATUS_BAD);
+       g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), 0);
        
        return sig->status;
 }
 
 
 /**
- * g_mime_signature_set_errors:
- * @sig: a #GMimeSignature
- * @errors: a #GMimeSignatureError
- *
- * Set the errors on the signature.
- **/
-void
-g_mime_signature_set_errors (GMimeSignature *sig, GMimeSignatureError errors)
-{
-       g_return_if_fail (GMIME_IS_SIGNATURE (sig));
-       
-       sig->errors = errors;
-}
-
-
-/**
- * g_mime_signature_get_errors:
- * @sig: a #GMimeSignature
- *
- * Get the signature errors. If the #GMimeSignatureStatus returned from
- * g_mime_signature_get_status() is not #GMIME_SIGNATURE_STATUS_GOOD, then the
- * errors may provide a clue as to why.
- *
- * Returns: a bitfield of errors.
- **/
-GMimeSignatureError
-g_mime_signature_get_errors (GMimeSignature *sig)
-{
-       g_return_val_if_fail (GMIME_IS_SIGNATURE (sig), GMIME_SIGNATURE_ERROR_NONE);
-       
-       return sig->errors;
-}
-
-
-/**
  * g_mime_signature_set_certificate:
  * @sig: a #GMimeSignature
  * @cert: a #GMimeCertificate
diff --git a/gmime/gmime-signature.h b/gmime/gmime-signature.h
index 4073cad..58f8ab7 100644
--- a/gmime/gmime-signature.h
+++ b/gmime/gmime-signature.h
@@ -50,46 +50,42 @@ typedef struct _GMimeSignatureListClass GMimeSignatureListClass;
 
 /**
  * GMimeSignatureStatus:
- * @GMIME_SIGNATURE_STATUS_GOOD: Good signature.
- * @GMIME_SIGNATURE_STATUS_ERROR: An error occurred.
- * @GMIME_SIGNATURE_STATUS_BAD: Bad signature.
+ * @GMIME_SIGNATURE_STATUS_VALID: The signature is fully valid.
+ * @GMIME_SIGNATURE_STATUS_GREEN: The signature is good.
+ * @GMIME_SIGNATURE_STATUS_RED: The signature is bad.
+ * @GMIME_SIGNATURE_STATUS_KEY_REVOKED: The key has been revoked.
+ * @GMIME_SIGNATURE_STATUS_KEY_EXPIRED: The key has expired.
+ * @GMIME_SIGNATURE_STATUS_SIG_EXPIRED: The signature has expired.
+ * @GMIME_SIGNATURE_STATUS_KEY_MISSING: Can't verify due to missing key.
+ * @GMIME_SIGNATURE_STATUS_CRL_MISSING: CRL not available.
+ * @GMIME_SIGNATURE_STATUS_CRL_TOO_OLD: Available CRL is too old.
+ * @GMIME_SIGNATURE_STATUS_BAD_POLICY: A policy was not met.
+ * @GMIME_SIGNATURE_STATUS_SYS_ERROR: A system error occurred.
+ * @GMIME_SIGNATURE_STATUS_TOFU_CONFLICT: Tofu conflict detected.
  *
- * A value representing the signature status for a particular
+ * A value representing the signature status flags for a particular
  * #GMimeSignature.
  **/
 typedef enum {
-       GMIME_SIGNATURE_STATUS_GOOD,
-       GMIME_SIGNATURE_STATUS_ERROR,
-       GMIME_SIGNATURE_STATUS_BAD
+       GMIME_SIGNATURE_STATUS_VALID         = 0x0001,
+       GMIME_SIGNATURE_STATUS_GREEN         = 0x0002,
+       GMIME_SIGNATURE_STATUS_RED           = 0x0004,
+       GMIME_SIGNATURE_STATUS_KEY_REVOKED   = 0x0010,
+       GMIME_SIGNATURE_STATUS_KEY_EXPIRED   = 0x0020,
+       GMIME_SIGNATURE_STATUS_SIG_EXPIRED   = 0x0040,
+       GMIME_SIGNATURE_STATUS_KEY_MISSING   = 0x0080,
+       GMIME_SIGNATURE_STATUS_CRL_MISSING   = 0x0100,
+       GMIME_SIGNATURE_STATUS_CRL_TOO_OLD   = 0x0200,
+       GMIME_SIGNATURE_STATUS_BAD_POLICY    = 0x0400,
+       GMIME_SIGNATURE_STATUS_SYS_ERROR     = 0x0800,
+       GMIME_SIGNATURE_STATUS_TOFU_CONFLICT = 0x1000
 } GMimeSignatureStatus;
 
 
 /**
- * GMimeSignatureError:
- * @GMIME_SIGNATURE_ERROR_NONE: No error.
- * @GMIME_SIGNATURE_ERROR_EXPSIG: Expired signature.
- * @GMIME_SIGNATURE_ERROR_NO_PUBKEY: No public key found.
- * @GMIME_SIGNATURE_ERROR_EXPKEYSIG: Expired signature key.
- * @GMIME_SIGNATURE_ERROR_REVKEYSIG: Revoked signature key.
- * @GMIME_SIGNATURE_ERROR_UNSUPP_ALGO: Unsupported algorithm.
- *
- * Possible errors that a #GMimeSignature could have.
- **/
-typedef enum {
-       GMIME_SIGNATURE_ERROR_NONE        = 0,
-       GMIME_SIGNATURE_ERROR_EXPSIG      = (1 << 0),  /* expired signature */
-       GMIME_SIGNATURE_ERROR_NO_PUBKEY   = (1 << 1),  /* no public key */
-       GMIME_SIGNATURE_ERROR_EXPKEYSIG   = (1 << 2),  /* expired key */
-       GMIME_SIGNATURE_ERROR_REVKEYSIG   = (1 << 3),  /* revoked key */
-       GMIME_SIGNATURE_ERROR_UNSUPP_ALGO = (1 << 4)   /* unsupported algorithm */
-} GMimeSignatureError;
-
-
-/**
  * GMimeSignature:
  * @parent_object: parent #GObject
- * @status: A #GMimeSignatureStatus.
- * @errors: A bitfield of #GMimeSignatureError values.
+ * @status: A bitfield of #GMimeSignatureStatus values.
  * @cert: The #GMimeCertificate used in the signature.
  * @created: The creation date of the signature.
  * @expires: The expiration date of the signature.
@@ -100,7 +96,6 @@ struct _GMimeSignature {
        GObject parent_object;
        
        GMimeSignatureStatus status;
-       GMimeSignatureError errors;
        GMimeCertificate *cert;
        time_t created;
        time_t expires;
@@ -122,9 +117,6 @@ GMimeCertificate *g_mime_signature_get_certificate (GMimeSignature *sig);
 void g_mime_signature_set_status (GMimeSignature *sig, GMimeSignatureStatus status);
 GMimeSignatureStatus g_mime_signature_get_status (GMimeSignature *sig);
 
-void g_mime_signature_set_errors (GMimeSignature *sig, GMimeSignatureError errors);
-GMimeSignatureError g_mime_signature_get_errors (GMimeSignature *sig);
-
 void g_mime_signature_set_created (GMimeSignature *sig, time_t created);
 time_t g_mime_signature_get_created (GMimeSignature *sig);
 
diff --git a/tests/test-pgp.c b/tests/test-pgp.c
index eb0c32c..122649d 100644
--- a/tests/test-pgp.c
+++ b/tests/test-pgp.c
@@ -51,16 +51,16 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 static GMimeSignatureStatus
 get_sig_status (GMimeSignatureList *signatures)
 {
-       GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+       GMimeSignatureStatus status = 0;
        GMimeSignature *sig;
        int i;
        
        if (!signatures || signatures->array->len == 0)
-               return GMIME_SIGNATURE_STATUS_ERROR;
+               return GMIME_SIGNATURE_STATUS_RED;
        
        for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
                sig = g_mime_signature_list_get_signature (signatures, i);
-               status = MAX (status, sig->status);
+               status |= sig->status;
        }
        
        return status;
@@ -93,6 +93,7 @@ static void
 test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
        GMimeSignatureList *signatures;
+       GMimeSignatureStatus status;
        GError *err = NULL;
        Exception *ex;
        
@@ -105,7 +106,9 @@ test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphe
                throw (ex);
        }
        
-       if (get_sig_status (signatures) != GMIME_SIGNATURE_STATUS_GOOD) {
+       status = get_sig_status (signatures);
+       
+       if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) {
                g_object_unref (signatures);
                throw (exception_new ("signature BAD"));
        }
@@ -142,6 +145,7 @@ test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 static void
 test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
+       GMimeSignatureStatus status;
        GMimeDecryptResult *result;
        Exception *ex = NULL;
        GMimeStream *stream;
@@ -158,7 +162,9 @@ test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
        }
        
        if (sign) {
-               if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
+               status = get_sig_status (result->signatures);
+               
+               if ((status & GMIME_SIGNATURE_STATUS_RED) != 0)
                        ex = exception_new ("expected GOOD signature");
        } else {
                if (result->signatures != NULL)
diff --git a/tests/test-pgpmime.c b/tests/test-pgpmime.c
index 3032890..1002ff0 100644
--- a/tests/test-pgpmime.c
+++ b/tests/test-pgpmime.c
@@ -52,16 +52,16 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 static GMimeSignatureStatus
 get_sig_status (GMimeSignatureList *signatures)
 {
-       GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+       GMimeSignatureStatus status = 0;
        GMimeSignature *sig;
        int i;
        
        if (!signatures || signatures->array->len == 0)
-               return GMIME_SIGNATURE_STATUS_ERROR;
+               return GMIME_SIGNATURE_STATUS_RED;
        
        for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
                sig = g_mime_signature_list_get_signature (signatures, i);
-               status = MAX (status, sig->status);
+               status |= sig->status;
        }
        
        return status;
@@ -70,23 +70,18 @@ get_sig_status (GMimeSignatureList *signatures)
 static void
 print_verify_results (GMimeSignatureList *signatures)
 {
+       GMimeSignatureStatus status;
        GMimeSignature *sig;
        int count, i;
        
-       switch (get_sig_status (signatures)) {
-       case GMIME_SIGNATURE_STATUS_GOOD:
-               fputs ("GOOD\n", stdout);
-               break;
-       case GMIME_SIGNATURE_STATUS_BAD:
+       status = get_sig_status (signatures);
+       
+       if ((status & GMIME_SIGNATURE_STATUS_RED) != 0)
                fputs ("BAD\n", stdout);
-               break;
-       case GMIME_SIGNATURE_STATUS_ERROR:
-               fputs ("ERROR status\n", stdout);
-               break;
-       default:
-               fputs ("Unknown enum value\n", stdout);
-               break;
-       }
+       else if ((status & GMIME_SIGNATURE_STATUS_GREEN) != 0)
+               fputs ("GOOD\n", stdout);
+       else
+               fputs ("UNKNOWN\n", stdout);
        
        fputs ("\nSignatures:\n", stdout);
        count = g_mime_signature_list_length (signatures);
@@ -120,17 +115,12 @@ print_verify_results (GMimeSignatureList *signatures)
                }
                
                fprintf (stdout, "\tStatus: ");
-               switch (sig->status) {
-               case GMIME_SIGNATURE_STATUS_GOOD:
-                       fputs ("GOOD\n", stdout);
-                       break;
-               case GMIME_SIGNATURE_STATUS_BAD:
+               if ((sig->status & GMIME_SIGNATURE_STATUS_RED) != 0)
                        fputs ("BAD\n", stdout);
-                       break;
-               case GMIME_SIGNATURE_STATUS_ERROR:
-                       fputs ("ERROR\n", stdout);
-                       break;
-               }
+               else if ((sig->status & GMIME_SIGNATURE_STATUS_GREEN) != 0)
+                       fputs ("GOOD\n", stdout);
+               else
+                       fputs ("UNKNOWN\n", stdout);
                
                fprintf (stdout, "\tSignature made on %s", ctime (&sig->created));
                if (sig->expires != (time_t) 0)
@@ -138,20 +128,16 @@ print_verify_results (GMimeSignatureList *signatures)
                else
                        fprintf (stdout, "\tSignature never expires\n");
                
-               if (sig->errors) {
-                       fprintf (stdout, "\tErrors: ");
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG)
-                               fputs ("Expired, ", stdout);
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY)
-                               fputs ("No Pub Key, ", stdout);
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG)
-                               fputs ("Key Expired, ", stdout);
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG)
-                               fputs ("Key Revoked", stdout);
-                       fputc ('\n', stdout);
-               } else {
-                       fprintf (stdout, "\tNo errors for this signer\n");
-               }
+               fprintf (stdout, "\tErrors: ");
+               if (sig->status & GMIME_SIGNATURE_STATUS_SIG_EXPIRED)
+                       fputs ("Expired, ", stdout);
+               if (sig->status & GMIME_SIGNATURE_STATUS_KEY_MISSING)
+                       fputs ("No Pub Key, ", stdout);
+               if (sig->status & GMIME_SIGNATURE_STATUS_KEY_EXPIRED)
+                       fputs ("Key Expired, ", stdout);
+               if (sig->status & GMIME_SIGNATURE_STATUS_KEY_REVOKED)
+                       fputs ("Key Revoked", stdout);
+               fputc ('\n', stdout);
                
                if (i + 1 < count)
                        fputc ('\n', stdout);
@@ -360,6 +346,7 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign,
                          GMimeStream *cleartext, GMimeStream *stream,
                          const char *session_key)
 {
+       GMimeSignatureStatus status;
        GMimeStream *test_stream;
        GMimeMultipartEncrypted *mpe;
        GMimeDecryptResult *result;
@@ -407,7 +394,9 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign,
                v(print_verify_results (result->signatures));
 
        if (sign) {
-               if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
+               status = get_sig_status (result->signatures);
+               
+               if ((status & GMIME_SIGNATURE_STATUS_RED) != 0)
                        ex = exception_new ("signature status expected to be GOOD");
        } else {
                if (result->signatures)
diff --git a/tests/test-pkcs7.c b/tests/test-pkcs7.c
index be05d44..eafbef7 100644
--- a/tests/test-pkcs7.c
+++ b/tests/test-pkcs7.c
@@ -52,16 +52,16 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 static GMimeSignatureStatus
 get_sig_status (GMimeSignatureList *signatures)
 {
-       GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+       GMimeSignatureStatus status = 0;
        GMimeSignature *sig;
        int i;
        
        if (!signatures || signatures->array->len == 0)
-               return GMIME_SIGNATURE_STATUS_ERROR;
+               return GMIME_SIGNATURE_STATUS_RED;
        
        for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
                sig = g_mime_signature_list_get_signature (signatures, i);
-               status = MAX (status, sig->status);
+               status |= sig->status;
        }
        
        return status;
@@ -94,6 +94,7 @@ static void
 test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
        GMimeSignatureList *signatures;
+       GMimeSignatureStatus status;
        GError *err = NULL;
        Exception *ex;
        
@@ -105,8 +106,10 @@ test_verify (GMimeCryptoContext *ctx, GMimeStream *cleartext, GMimeStream *ciphe
                g_error_free (err);
                throw (ex);
        }
+
+       status = get_sig_status (signatures);
        
-       if (get_sig_status (signatures) != GMIME_SIGNATURE_STATUS_GOOD) {
+       if ((status & GMIME_SIGNATURE_STATUS_RED) != 0) {
                g_object_unref (signatures);
                throw (exception_new ("signature BAD"));
        }
@@ -144,6 +147,7 @@ test_encrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
 static void
 test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GMimeStream *ciphertext)
 {
+       GMimeSignatureStatus status;
        GMimeDecryptResult *result;
        Exception *ex = NULL;
        GMimeStream *stream;
@@ -160,7 +164,9 @@ test_decrypt (GMimeCryptoContext *ctx, gboolean sign, GMimeStream *cleartext, GM
        }
        
        if (sign) {
-               if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
+               status = get_sig_status (result->signatures);
+               
+               if ((status & GMIME_SIGNATURE_STATUS_RED) != 0)
                        ex = exception_new ("expected GOOD signature");
        } else {
                if (result->signatures)
diff --git a/tests/test-smime.c b/tests/test-smime.c
index 168a8c1..957e96a 100644
--- a/tests/test-smime.c
+++ b/tests/test-smime.c
@@ -53,16 +53,16 @@ request_passwd (GMimeCryptoContext *ctx, const char *user_id, const char *prompt
 static GMimeSignatureStatus
 get_sig_status (GMimeSignatureList *signatures)
 {
-       GMimeSignatureStatus status = GMIME_SIGNATURE_STATUS_GOOD;
+       GMimeSignatureStatus status = 0;
        GMimeSignature *sig;
        int i;
        
        if (!signatures || signatures->array->len == 0)
-               return GMIME_SIGNATURE_STATUS_ERROR;
+               return GMIME_SIGNATURE_STATUS_RED;
        
        for (i = 0; i < g_mime_signature_list_length (signatures); i++) {
                sig = g_mime_signature_list_get_signature (signatures, i);
-               status = MAX (status, sig->status);
+               status |= sig->status;
        }
        
        return status;
@@ -71,23 +71,18 @@ get_sig_status (GMimeSignatureList *signatures)
 static void
 print_verify_results (GMimeSignatureList *signatures)
 {
+       GMimeSignatureStatus status;
        GMimeSignature *sig;
        int count, i;
        
-       switch (get_sig_status (signatures)) {
-       case GMIME_SIGNATURE_STATUS_GOOD:
-               fputs ("GOOD\n", stdout);
-               break;
-       case GMIME_SIGNATURE_STATUS_BAD:
+       status = get_sig_status (signatures);
+       
+       if ((status & GMIME_SIGNATURE_STATUS_RED) != 0)
                fputs ("BAD\n", stdout);
-               break;
-       case GMIME_SIGNATURE_STATUS_ERROR:
-               fputs ("ERROR status\n", stdout);
-               break;
-       default:
-               fputs ("Unknown enum value\n", stdout);
-               break;
-       }
+       else if ((status & GMIME_SIGNATURE_STATUS_GREEN) != 0)
+               fputs ("GOOD\n", stdout);
+       else
+               fputs ("UNKNOWN\n", stdout);
        
        fputs ("\nSignatures:\n", stdout);
        count = g_mime_signature_list_length (signatures);
@@ -121,17 +116,12 @@ print_verify_results (GMimeSignatureList *signatures)
                }
                
                fprintf (stdout, "\tStatus: ");
-               switch (sig->status) {
-               case GMIME_SIGNATURE_STATUS_GOOD:
-                       fputs ("GOOD\n", stdout);
-                       break;
-               case GMIME_SIGNATURE_STATUS_BAD:
+               if ((sig->status & GMIME_SIGNATURE_STATUS_RED) != 0)
                        fputs ("BAD\n", stdout);
-                       break;
-               case GMIME_SIGNATURE_STATUS_ERROR:
-                       fputs ("ERROR\n", stdout);
-                       break;
-               }
+               else if ((sig->status & GMIME_SIGNATURE_STATUS_GREEN) != 0)
+                       fputs ("GOOD\n", stdout);
+               else
+                       fputs ("UNKNOWN\n", stdout);
                
                fprintf (stdout, "\tSignature made on %s", ctime (&sig->created));
                if (sig->expires != (time_t) 0)
@@ -139,20 +129,16 @@ print_verify_results (GMimeSignatureList *signatures)
                else
                        fprintf (stdout, "\tSignature never expires\n");
                
-               if (sig->errors) {
-                       fprintf (stdout, "\tErrors: ");
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_EXPSIG)
-                               fputs ("Expired, ", stdout);
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_NO_PUBKEY)
-                               fputs ("No Pub Key, ", stdout);
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_EXPKEYSIG)
-                               fputs ("Key Expired, ", stdout);
-                       if (sig->errors & GMIME_SIGNATURE_ERROR_REVKEYSIG)
-                               fputs ("Key Revoked", stdout);
-                       fputc ('\n', stdout);
-               } else {
-                       fprintf (stdout, "\tNo errors for this signer\n");
-               }
+               fprintf (stdout, "\tErrors: ");
+               if (sig->status & GMIME_SIGNATURE_STATUS_SIG_EXPIRED)
+                       fputs ("Expired, ", stdout);
+               if (sig->status & GMIME_SIGNATURE_STATUS_KEY_MISSING)
+                       fputs ("No Pub Key, ", stdout);
+               if (sig->status & GMIME_SIGNATURE_STATUS_KEY_EXPIRED)
+                       fputs ("Key Expired, ", stdout);
+               if (sig->status & GMIME_SIGNATURE_STATUS_KEY_REVOKED)
+                       fputs ("Key Revoked", stdout);
+               fputc ('\n', stdout);
                
                if (i + 1 < count)
                        fputc ('\n', stdout);
@@ -277,6 +263,7 @@ test_multipart_signed (GMimeCryptoContext *ctx)
 static void
 test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
 {
+       GMimeSignatureStatus status;
        GMimeStream *cleartext, *stream;
        GMimeMultipartEncrypted *mpe;
        GMimeDecryptResult *result;
@@ -384,7 +371,9 @@ test_multipart_encrypted (GMimeCryptoContext *ctx, gboolean sign)
                v(print_verify_results (result->signatures));
        
        if (sign) {
-               if (!result->signatures || get_sig_status (result->signatures) != GMIME_SIGNATURE_STATUS_GOOD)
+               status = get_sig_status (result->signatures);
+               
+               if ((status & GMIME_SIGNATURE_STATUS_RED) != 0)
                        ex = exception_new ("signature status expected to be GOOD");
        } else {
                if (result->signatures)


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