Print status of CRL checks in the audit log.
[gnupg.git] / sm / call-dirmngr.c
index 3777092..33aebdf 100644 (file)
@@ -55,6 +55,7 @@ static int dirmngr2_ctx_locked;
 static int force_pipe_server = 0;
 
 struct inq_certificate_parm_s {
+  ctrl_t ctrl;
   assuan_context_t ctx;
   ksba_cert_t cert;
   ksba_cert_t issuer_cert;
@@ -141,7 +142,7 @@ get_membuf (struct membuf *mb, size_t *len)
 }
 
 
-/* This fucntion prepares the dirmngr for a new session.  The
+/* This function prepares the dirmngr for a new session.  The
    audit-events option is used so that other dirmngr clients won't get
    disturbed by such events.  */
 static void
@@ -320,17 +321,29 @@ start_dirmngr_ext (ctrl_t ctrl, assuan_context_t *ctx_r)
 static int
 start_dirmngr (ctrl_t ctrl)
 {
+  gpg_error_t err;
+
   assert (! dirmngr_ctx_locked);
   dirmngr_ctx_locked = 1;
 
-  return start_dirmngr_ext (ctrl, &dirmngr_ctx);
+  err = start_dirmngr_ext (ctrl, &dirmngr_ctx);
+  /* We do not check ERR but the existance of a context because the
+     error might come from a failed command send to the dirmngr.
+     Fixme: Why don't we close the drimngr context if we encountered
+     an error in prepare_dirmngr?  */
+  if (!dirmngr_ctx)
+    dirmngr_ctx_locked = 0;
+  return err;  
 }
 
 
 static void
 release_dirmngr (ctrl_t ctrl)
 {
-  assert (dirmngr_ctx_locked);
+  (void)ctrl;
+
+  if (!dirmngr_ctx_locked)
+    log_error ("WARNING: trying to release a non-locked dirmngr ctx\n");
   dirmngr_ctx_locked = 0;
 }
 
@@ -338,17 +351,25 @@ release_dirmngr (ctrl_t ctrl)
 static int
 start_dirmngr2 (ctrl_t ctrl)
 {
+  gpg_error_t err;
+
   assert (! dirmngr2_ctx_locked);
   dirmngr2_ctx_locked = 1;
 
-  return start_dirmngr_ext (ctrl, &dirmngr2_ctx);
+  err = start_dirmngr_ext (ctrl, &dirmngr2_ctx);
+  if (!dirmngr2_ctx)
+    dirmngr2_ctx_locked = 0;
+  return err;
 }
 
 
 static void
 release_dirmngr2 (ctrl_t ctrl)
 {
-  assert (dirmngr2_ctx_locked);
+  (void)ctrl;
+
+  if (!dirmngr2_ctx_locked)
+    log_error ("WARNING: trying to release a non-locked dirmngr2 ctx\n");
   dirmngr2_ctx_locked = 0;
 }
 
@@ -388,6 +409,33 @@ inq_certificate (void *opaque, const char *line)
       line += 14;
       issuer_mode = 1;
     }
+  else if (!strncmp (line, "ISTRUSTED", 9) && (line[9]==' ' || !line[9]))
+    {
+      /* The server is asking us whether the certificate is a trusted
+         root certificate.  */
+      const char *s;
+      size_t n;
+      char fpr[41];
+      struct rootca_flags_s rootca_flags;
+
+      line += 9;
+      while (*line == ' ')
+        line++;
+
+      for (s=line,n=0; hexdigitp (s); s++, n++)
+        ;
+      if (*s || n != 40)
+        return gpg_error (GPG_ERR_ASS_PARAMETER);
+      for (s=line, n=0; n < 40; s++, n++)
+        fpr[n] = (*s >= 'a')? (*s & 0xdf): *s;
+      fpr[n] = 0;
+      
+      if (!gpgsm_agent_istrusted (parm->ctrl, NULL, fpr, &rootca_flags))
+        rc = assuan_send_data (parm->ctx, "1", 1);
+      else
+        rc = 0;
+      return rc;
+    }
   else
     {
       log_error ("unsupported inquiry `%s'\n", line);
@@ -535,6 +583,7 @@ gpgsm_dirmngr_isvalid (ctrl_t ctrl,
     }
 
   parm.ctx = dirmngr_ctx;
+  parm.ctrl = ctrl;
   parm.cert = cert;
   parm.issuer_cert = issuer_cert;
 
@@ -698,7 +747,7 @@ pattern_from_strlist (strlist_t names)
   if (!pattern)
     return NULL;
 
-  for (n=0, sl=names; sl; sl = sl->next)
+  for (sl=names; sl; sl = sl->next)
     {
       for (s=sl->d; *s; s++)
         {
@@ -780,21 +829,24 @@ gpgsm_dirmngr_lookup (ctrl_t ctrl, strlist_t names, int cache_only,
 
   /* The lookup function can be invoked from the callback of a lookup
      function, for example to walk the chain.  */
-  assert (!dirmngr_ctx_locked || !dirmngr2_ctx_locked);
-  if (! dirmngr_ctx_locked)
+  if (!dirmngr_ctx_locked)
     {
       rc = start_dirmngr (ctrl);
       if (rc)
        return rc;
       ctx = dirmngr_ctx;
     }
-  else
+  else if (!dirmngr2_ctx_locked)
     {
       rc = start_dirmngr2 (ctrl);
       if (rc)
        return rc;
       ctx = dirmngr2_ctx;
     }
+  else
+    {
+      log_fatal ("both dirmngr contexts are in use\n");
+    }
 
   pattern = pattern_from_strlist (names);
   if (!pattern)
@@ -840,6 +892,8 @@ gpgsm_dirmngr_lookup (ctrl_t ctrl, strlist_t names, int cache_only,
 static int
 run_command_cb (void *opaque, const void *buffer, size_t length)
 {
+  (void)opaque;
+
   if (buffer)
     {
       if ( fwrite (buffer, length, 1, stdout) != 1 )