dirmngr: Fix alignment of ADDR.
[gnupg.git] / dirmngr / server.c
index 05ef439..f4aeadb 100644 (file)
@@ -51,9 +51,9 @@
 # include "ldap-parse-uri.h"
 #endif
 #include "dns-stuff.h"
-#include "mbox-util.h"
-#include "zb32.h"
-#include "server-help.h"
+#include "../common/mbox-util.h"
+#include "../common/zb32.h"
+#include "../common/server-help.h"
 
 /* To avoid DoS attacks we limit the size of a certificate to
    something reasonable.  The DoS was actually only an issue back when
@@ -190,7 +190,7 @@ data_line_write (assuan_context_t ctx, const void *buffer_arg, size_t size)
   const char *buffer = buffer_arg;
   gpg_error_t err;
 
-  /* If we do not want logging, enable it it here.  */
+  /* If we do not want logging, enable it here.  */
   if (ctrl && ctrl->server_local && ctrl->server_local->inhibit_data_logging)
     ctrl->server_local->inhibit_data_logging_now = 1;
 
@@ -370,14 +370,15 @@ do_get_cert_local (ctrl_t ctrl, const char *name, const char *command)
   char *buf;
   ksba_cert_t cert;
 
-  if (name)
-    buf = xstrconcat (command, " ", name, NULL);
+  buf = name? strconcat (command, " ", name, NULL) : xtrystrdup (command);
+  if (!buf)
+    rc = gpg_error_from_syserror ();
   else
-    buf = xstrdup (command);
-
-  rc = assuan_inquire (ctrl->server_local->assuan_ctx, buf,
-                       &value, &valuelen, MAX_CERT_LENGTH);
-  xfree (buf);
+    {
+      rc = assuan_inquire (ctrl->server_local->assuan_ctx, buf,
+                           &value, &valuelen, MAX_CERT_LENGTH);
+      xfree (buf);
+    }
   if (rc)
     {
       log_error (_("assuan_inquire(%s) failed: %s\n"),
@@ -626,6 +627,11 @@ option_handler (assuan_context_t ctx, const char *key, const char *value)
       if (dirmngr_use_tor ())
         err = gpg_error (GPG_ERR_FORBIDDEN);
     }
+  else if (!strcmp (key, "http-crl"))
+    {
+      int i = *value? atoi (value) : 0;
+      ctrl->http_no_crl = !i;
+    }
   else
     err = gpg_error (GPG_ERR_UNKNOWN_OPTION);
 
@@ -1733,7 +1739,7 @@ cmd_cachecert (assuan_context_t ctx, char *line)
 
 
 static const char hlp_validate[] =
-  "VALIDATE [--systrust] [--tls]\n"
+  "VALIDATE [--systrust] [--tls] [--no-crl]\n"
   "\n"
   "Validate a certificate using the certificate validation function\n"
   "used internally by dirmngr.  This command is only useful for\n"
@@ -1753,7 +1759,8 @@ static const char hlp_validate[] =
   "need to be PEM encoded.\n"
   "\n"
   "The option --systrust changes the behaviour to include the system\n"
-  "provided root certificates as trust anchors.";
+  "provided root certificates as trust anchors.  The option --no-crl\n"
+  "skips CRL checks";
 static gpg_error_t
 cmd_validate (assuan_context_t ctx, char *line)
 {
@@ -1763,10 +1770,11 @@ cmd_validate (assuan_context_t ctx, char *line)
   certlist_t certlist = NULL;
   unsigned char *value = NULL;
   size_t valuelen;
-  int systrust_mode, tls_mode;
+  int systrust_mode, tls_mode, no_crl;
 
   systrust_mode = has_option (line, "--systrust");
   tls_mode = has_option (line, "--tls");
+  no_crl = has_option (line, "--no-crl");
   line = skip_options (line);
 
   if (tls_mode)
@@ -1843,14 +1851,12 @@ cmd_validate (assuan_context_t ctx, char *line)
         cache_cert (cl->cert);
     }
 
-
-  err = validate_cert_chain
-    (ctrl, cert, NULL,
-     tls_mode && systrust_mode ? VALIDATE_MODE_TLS_SYSTRUST  :
-     tls_mode                  ? VALIDATE_MODE_TLS           :
-     /**/        systrust_mode ? VALIDATE_MODE_CERT_SYSTRUST :
-     /**/                        VALIDATE_MODE_CERT,
-     NULL);
+  err = validate_cert_chain (ctrl, cert, NULL,
+                             (VALIDATE_FLAG_TRUST_CONFIG
+                              | (tls_mode ? VALIDATE_FLAG_TLS : 0)
+                              | (systrust_mode ? VALIDATE_FLAG_TRUST_SYSTEM : 0)
+                              | (no_crl ? VALIDATE_FLAG_NOCRLCHECK : 0)),
+                             NULL);
 
  leave:
   ksba_cert_release (cert);