doc: Fix documentation of struct data types
[gpgme.git] / src / verify.c
index d63fc54..c32241a 100644 (file)
@@ -83,6 +83,7 @@ gpgme_op_verify_result (gpgme_ctx_t ctx)
   void *hook;
   op_data_t opd;
   gpgme_error_t err;
+  gpgme_signature_t sig;
 
   TRACE_BEG (DEBUG_CTX, "gpgme_op_verify_result", ctx);
   err = _gpgme_op_data_lookup (ctx, OPDATA_VERIFY, &hook, -1, NULL);
@@ -93,12 +94,37 @@ gpgme_op_verify_result (gpgme_ctx_t ctx)
       return NULL;
     }
 
+  /* It is possible that we saw a new signature only followed by an
+     ERROR line for that.  In particular a missing X.509 key triggers
+     this.  In this case it is surprising that the summary field has
+     not been updated.  We fix it here by explicitly looking for this
+     case.  The real fix would be to have GPGME emit ERRSIG.  */
+  for (sig = opd->result.signatures; sig; sig = sig->next)
+    {
+      if (!sig->summary)
+        {
+          switch (gpg_err_code (sig->status))
+            {
+            case GPG_ERR_KEY_EXPIRED:
+              sig->summary |= GPGME_SIGSUM_KEY_EXPIRED;
+              break;
+
+            case GPG_ERR_NO_PUBKEY:
+              sig->summary |= GPGME_SIGSUM_KEY_MISSING;
+              break;
+
+            default:
+              break;
+            }
+        }
+    }
+
+  /* Now for some tracing stuff. */
   if (_gpgme_debug_trace ())
     {
-      gpgme_signature_t sig = opd->result.signatures;
-      int i = 0;
+      int i;
 
-      while (sig)
+      for (sig = opd->result.signatures, i = 0; sig; sig = sig->next, i++)
        {
          TRACE_LOG4 ("sig[%i] = fpr %s, summary 0x%x, status %s",
                      i, sig->fpr, sig->summary, gpg_strerror (sig->status));
@@ -120,8 +146,6 @@ gpgme_op_verify_result (gpgme_ctx_t ctx)
            {
              TRACE_LOG1 ("sig[%i] = has notations (not shown)", i);
            }
-         sig = sig->next;
-         i++;
        }
     }
 
@@ -322,7 +346,7 @@ parse_new_sig (op_data_t opd, gpgme_status_code_t code, char *args)
       /* Parse the timestamp.  */
       sig->timestamp = _gpgme_parse_timestamp (end, &tail);
       if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' '))
-       return gpg_error (GPG_ERR_INV_ENGINE);
+       return trace_gpg_error (GPG_ERR_INV_ENGINE);
       end = tail;
       while (*end == ' ')
        end++;
@@ -396,12 +420,12 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
 
       sig->timestamp = _gpgme_parse_timestamp (end, &tail);
       if (sig->timestamp == -1 || end == tail || (*tail && *tail != ' '))
-       return gpg_error (GPG_ERR_INV_ENGINE);
+       return trace_gpg_error (GPG_ERR_INV_ENGINE);
       end = tail;
 
       sig->exp_timestamp = _gpgme_parse_timestamp (end, &tail);
       if (sig->exp_timestamp == -1 || end == tail || (*tail && *tail != ' '))
-       return gpg_error (GPG_ERR_INV_ENGINE);
+       return trace_gpg_error (GPG_ERR_INV_ENGINE);
       end = tail;
 
       while (*end == ' ')
@@ -421,7 +445,7 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
              gpg_err_set_errno (0);
              sig->pubkey_algo = strtol (end, &tail, 0);
              if (errno || end == tail || *tail != ' ')
-               return gpg_error (GPG_ERR_INV_ENGINE);
+               return trace_gpg_error (GPG_ERR_INV_ENGINE);
              end = tail;
 
              while (*end == ' ')
@@ -434,7 +458,7 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
                  gpg_err_set_errno (0);
                  sig->hash_algo = strtol (end, &tail, 0);
                  if (errno || end == tail || *tail != ' ')
-                   return gpg_error (GPG_ERR_INV_ENGINE);
+                   return trace_gpg_error (GPG_ERR_INV_ENGINE);
                  end = tail;
                }
            }
@@ -467,7 +491,7 @@ parse_notation (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
       if (notation)
        /* There is another notation name without data for the
           previous one.  The crypto backend misbehaves.  */
-       return gpg_error (GPG_ERR_INV_ENGINE);
+       return trace_gpg_error (GPG_ERR_INV_ENGINE);
 
       err = _gpgme_sig_notation_create (&notation, NULL, 0, NULL, 0, 0);
       if (err)
@@ -520,7 +544,7 @@ parse_notation (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
       if (!notation || !notation->name)
        /* There is notation data without a previous notation
           name.  The crypto backend misbehaves.  */
-       return gpg_error (GPG_ERR_INV_ENGINE);
+       return trace_gpg_error (GPG_ERR_INV_ENGINE);
 
       if (!notation->value)
        {
@@ -545,7 +569,7 @@ parse_notation (gpgme_signature_t sig, gpgme_status_code_t code, char *args)
       notation->value_len += strlen (dest);
     }
   else
-    return gpg_error (GPG_ERR_INV_ENGINE);
+    return trace_gpg_error (GPG_ERR_INV_ENGINE);
   return 0;
 }
 
@@ -621,7 +645,7 @@ parse_error (gpgme_signature_t sig, char *args, int set_status)
       where = args;
     }
   else
-    return gpg_error (GPG_ERR_INV_ENGINE);
+    return trace_gpg_error (GPG_ERR_INV_ENGINE);
 
   err = atoi (which);
 
@@ -684,7 +708,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
     case GPGME_STATUS_VALIDSIG:
       opd->only_newsig_seen = 0;
       return sig ? parse_valid_sig (sig, args)
-       : gpg_error (GPG_ERR_INV_ENGINE);
+       : trace_gpg_error (GPG_ERR_INV_ENGINE);
 
     case GPGME_STATUS_NODATA:
       opd->only_newsig_seen = 0;
@@ -705,7 +729,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
     case GPGME_STATUS_POLICY_URL:
       opd->only_newsig_seen = 0;
       return sig ? parse_notation (sig, code, args)
-       : gpg_error (GPG_ERR_INV_ENGINE);
+       : trace_gpg_error (GPG_ERR_INV_ENGINE);
 
     case GPGME_STATUS_TRUST_UNDEFINED:
     case GPGME_STATUS_TRUST_NEVER:
@@ -714,7 +738,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
     case GPGME_STATUS_TRUST_ULTIMATE:
       opd->only_newsig_seen = 0;
       return sig ? parse_trust (sig, code, args)
-       : gpg_error (GPG_ERR_INV_ENGINE);
+       : trace_gpg_error (GPG_ERR_INV_ENGINE);
 
     case GPGME_STATUS_PKA_TRUST_BAD:
     case GPGME_STATUS_PKA_TRUST_GOOD:
@@ -722,7 +746,7 @@ _gpgme_verify_status_handler (void *priv, gpgme_status_code_t code, char *args)
       /* Check that we only get one of these status codes per
          signature; if not the crypto backend misbehaves.  */
       if (!sig || sig->pka_trust || sig->pka_address)
-        return gpg_error (GPG_ERR_INV_ENGINE);
+        return trace_gpg_error (GPG_ERR_INV_ENGINE);
       sig->pka_trust = code == GPGME_STATUS_PKA_TRUST_GOOD? 2 : 1;
       end = strchr (args, ' ');
       if (end)