build: Require latest released libraries
[gnupg.git] / dirmngr / ks-engine-ldap.c
index 66e4964..ad2110e 100644 (file)
@@ -306,7 +306,9 @@ ks_ldap_help (ctrl_t ctrl, parsed_uri_t uri)
     "Supported methods: search, get, put\n";
   gpg_error_t err;
 
-  if (strcmp (uri->scheme, "ldap") == 0
+  if(!uri)
+    err = ks_print_help (ctrl, "  ldap");
+  else if (strcmp (uri->scheme, "ldap") == 0
       || strcmp (uri->scheme, "ldaps") == 0
       || strcmp (uri->scheme, "ldapi") == 0)
     err = ks_print_help (ctrl, data);
@@ -431,16 +433,16 @@ keyspec_to_ldap_filter (const char *keyspec, char **filter, int only_exact)
 
    If this function successfully interrogated the server, it returns
    0.  If there was an LDAP error, it returns the LDAP error code.  If
-   an error occured, *basednp, etc., are undefined (and don't need to
+   an error occurred, *basednp, etc., are undefined (and don't need to
    be freed.)
 
-   If no LDAP error occured, you still need to check that *basednp is
+   If no LDAP error occurred, you still need to check that *basednp is
    valid.  If it is NULL, then the server does not appear to be an
    OpenPGP Keyserver.  In this case, you also do not need to xfree
    *pgpkeyattrp.  */
 static int
-ldap_connect (parsed_uri_t uri, LDAP **ldap_connp,
-             char **basednp, char **pgpkeyattrp, int *real_ldapp)
+my_ldap_connect (parsed_uri_t uri, LDAP **ldap_connp,
+                 char **basednp, char **pgpkeyattrp, int *real_ldapp)
 {
   int err = 0;
 
@@ -455,7 +457,7 @@ ldap_connect (parsed_uri_t uri, LDAP **ldap_connp,
   char *pgpkeyattr = "pgpKey";
   int real_ldap = 0;
 
-  log_debug ("ldap_connect(%s:%d/%s????%s%s%s%s%s)\n",
+  log_debug ("my_ldap_connect(%s:%d/%s????%s%s%s%s%s)\n",
             uri->host, uri->port,
             uri->path ?: "",
             uri->auth ? "bindname=" : "", uri->auth ?: "",
@@ -834,6 +836,13 @@ ks_ldap_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec,
 
   (void) ctrl;
 
+  if (opt.use_tor)
+    {
+      /* For now we do not support LDAP over Tor.  */
+      log_error (_("LDAP access not possible due to Tor mode\n"));
+      return gpg_error (GPG_ERR_NOT_SUPPORTED);
+    }
+
   /* Before connecting to the server, make sure we have a sane
      keyspec.  If not, there is no need to establish a network
      connection.  */
@@ -842,7 +851,7 @@ ks_ldap_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec,
     return (err);
 
   /* Make sure we are talking to an OpenPGP LDAP server.  */
-  ldap_err = ldap_connect (uri, &ldap_conn, &basedn, &pgpkeyattr, NULL);
+  ldap_err = my_ldap_connect (uri, &ldap_conn, &basedn, &pgpkeyattr, NULL);
   if (ldap_err || !basedn)
     {
       if (ldap_err)
@@ -1010,6 +1019,13 @@ ks_ldap_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
 
   (void) ctrl;
 
+  if (opt.use_tor)
+    {
+      /* For now we do not support LDAP over Tor.  */
+      log_error (_("LDAP access not possible due to Tor mode\n"));
+      return gpg_error (GPG_ERR_NOT_SUPPORTED);
+    }
+
   /* Before connecting to the server, make sure we have a sane
      keyspec.  If not, there is no need to establish a network
      connection.  */
@@ -1021,7 +1037,7 @@ ks_ldap_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
     }
 
   /* Make sure we are talking to an OpenPGP LDAP server.  */
-  ldap_err = ldap_connect (uri, &ldap_conn, &basedn, NULL, NULL);
+  ldap_err = my_ldap_connect (uri, &ldap_conn, &basedn, NULL, NULL);
   if (ldap_err || !basedn)
     {
       if (ldap_err)
@@ -1402,7 +1418,7 @@ modlist_lookup (LDAPMod **modlist, const char *attr)
 
 /* Dump a modlist to a file.  This is useful for debugging.  */
 static estream_t modlist_dump (LDAPMod **modlist, estream_t output)
-  GNUPG_GCC_A_USED;
+  GPGRT_ATTR_USED;
 
 static estream_t
 modlist_dump (LDAPMod **modlist, estream_t output)
@@ -1600,7 +1616,7 @@ extract_attributes (LDAPMod ***modlist, char *line)
 
   fields = strsplit (line, ':', '\0', &field_count);
   if (field_count == 1)
-    /* We only have a single field.  There is definately nothing to
+    /* We only have a single field.  There is definitely nothing to
        do.  */
     goto out;
 
@@ -1748,12 +1764,13 @@ extract_attributes (LDAPMod ***modlist, char *line)
             Check that first and then if it fails, then try
             parse_timestamp.  */
 
-         if (strptime (create_time, "%Y-%m-%d", &tm))
+         if (!isodate_human_to_tm (create_time, &tm))
            create_time = tm2ldaptime (&tm);
          else if ((t = parse_timestamp (create_time, &end)) != (time_t) -1
                   && *end == '\0')
            {
-             if (! gmtime_r (&t, &tm))
+
+             if (!gnupg_gmtime (&t, &tm))
                create_time = NULL;
              else
                create_time = tm2ldaptime (&tm);
@@ -1795,12 +1812,12 @@ extract_attributes (LDAPMod ***modlist, char *line)
             Check that first and then if it fails, then try
             parse_timestamp.  */
 
-         if (strptime (expire_time, "%Y-%m-%d", &tm))
+         if (!isodate_human_to_tm (expire_time, &tm))
            expire_time = tm2ldaptime (&tm);
          else if ((t = parse_timestamp (expire_time, &end)) != (time_t) -1
                   && *end == '\0')
            {
-             if (! gmtime_r (&t, &tm))
+             if (!gnupg_gmtime (&t, &tm))
                expire_time = NULL;
              else
                expire_time = tm2ldaptime (&tm);
@@ -1878,7 +1895,15 @@ ks_ldap_put (ctrl_t ctrl, parsed_uri_t uri,
   /* Elide a warning.  */
   (void) ctrl;
 
-  ldap_err = ldap_connect (uri, &ldap_conn, &basedn, &pgpkeyattr, &real_ldap);
+  if (opt.use_tor)
+    {
+      /* For now we do not support LDAP over Tor.  */
+      log_error (_("LDAP access not possible due to Tor mode\n"));
+      return gpg_error (GPG_ERR_NOT_SUPPORTED);
+    }
+
+  ldap_err = my_ldap_connect (uri,
+                              &ldap_conn, &basedn, &pgpkeyattr, &real_ldap);
   if (ldap_err || !basedn)
     {
       if (ldap_err)
@@ -1961,7 +1986,7 @@ ks_ldap_put (ctrl_t ctrl, parsed_uri_t uri,
        /* The last line is not \n terminated!  Make a copy so we can
           add a NUL terminator.  */
        {
-         temp = alloca (infolen + 1);
+         temp = xmalloc (infolen + 1);
          memcpy (temp, info, infolen);
          info = temp;
          newline = (char *) info + infolen;
@@ -1978,7 +2003,10 @@ ks_ldap_put (ctrl_t ctrl, parsed_uri_t uri,
       if (! temp)
        assert ((char *) info + infolen - 1 == infoend);
       else
-       assert (infolen == -1);
+       {
+         assert (infolen == -1);
+         xfree (temp);
+       }
     }
 
   modlist_add (&addlist, "objectClass", "pgpKeyInfo");