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;
 
     "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);
       || 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
 
    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.)
 
    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
    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;
 
 {
   int err = 0;
 
@@ -455,7 +457,7 @@ ldap_connect (parsed_uri_t uri, LDAP **ldap_connp,
   char *pgpkeyattr = "pgpKey";
   int real_ldap = 0;
 
   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 ?: "",
             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;
 
 
   (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.  */
   /* 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.  */
     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)
   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;
 
 
   (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.  */
   /* 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.  */
     }
 
   /* 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)
   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)
 
 /* 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)
 
 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)
 
   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;
 
        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.  */
 
             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')
            {
            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);
                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.  */
 
             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')
            {
            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);
                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;
 
   /* 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)
   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.  */
        {
        /* 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;
          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
       if (! temp)
        assert ((char *) info + infolen - 1 == infoend);
       else
-       assert (infolen == -1);
+       {
+         assert (infolen == -1);
+         xfree (temp);
+       }
     }
 
   modlist_add (&addlist, "objectClass", "pgpKeyInfo");
     }
 
   modlist_add (&addlist, "objectClass", "pgpKeyInfo");