agent,dirmngr: Check for homedir removal also using stat(2).
[gnupg.git] / dirmngr / dirmngr_ldap.c
index daa2d1b..5a9ae97 100644 (file)
@@ -15,7 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -49,7 +49,6 @@
 #endif
 
 
-#define JNLIB_NEED_LOG_LOGV
 #include <gpg-error.h>
 #include "../common/logging.h"
 #include "../common/argparse.h"
@@ -57,8 +56,8 @@
 #include "../common/mischelp.h"
 #include "../common/strlist.h"
 
-#include "i18n.h"
-#include "util.h"
+#include "../common/i18n.h"
+#include "../common/util.h"
 #include "../common/init.h"
 
 /* With the ldap wrapper, there is no need for the npth_unprotect and leave
@@ -151,7 +150,7 @@ static ARGPARSE_OPTS opts[] = {
   { oAttr,     "attr",      2, N_("|STRING|return the attribute STRING")},
   { oOnlySearchTimeout, "only-search-timeout", 0, "@"},
   { oLogWithPID,"log-with-pid", 0, "@"},
-  { 0, NULL, 0, NULL }
+  ARGPARSE_end ()
 };
 
 
@@ -166,7 +165,7 @@ struct my_opt_s
   unsigned int alarm_timeout; /* And for the alarm based timeout.  */
   int multi;
 
-  estream_t outstream;    /* Send output to thsi stream.  */
+  estream_t outstream;    /* Send output to this stream.  */
 
   /* Note that we can't use const for the strings because ldap_* are
      not defined that way.  */
@@ -242,9 +241,11 @@ ldap_wrapper_main (char **argv, estream_t outstream)
 
   memset (&my_opt_buffer, 0, sizeof my_opt_buffer);
 
+  early_system_init ();
+
 #ifdef USE_LDAPWRAPPER
   set_strusage (my_strusage);
-  log_set_prefix ("dirmngr_ldap", JNLIB_LOG_WITH_PREFIX);
+  log_set_prefix ("dirmngr_ldap", GPGRT_LOG_WITH_PREFIX);
 
   /* Setup I18N and common subsystems. */
   i18n_init();
@@ -296,7 +297,7 @@ ldap_wrapper_main (char **argv, estream_t outstream)
           {
             unsigned int oldflags;
             log_get_prefix (&oldflags);
-            log_set_prefix (NULL, oldflags | JNLIB_LOG_WITH_PID);
+            log_set_prefix (NULL, oldflags | GPGRT_LOG_WITH_PID);
           }
           break;
 
@@ -640,10 +641,23 @@ fetch_ldap (my_opt_t myopt, const char *url, const LDAPURLDesc *ludp)
   /* Fixme:  Can we use MYOPT->user or is it shared with other theeads?.  */
   ret = my_ldap_simple_bind_s (ld, myopt->user, myopt->pass);
   npth_protect ();
+#ifdef LDAP_VERSION3
+  if (ret == LDAP_PROTOCOL_ERROR)
+    {
+      /* Protocol error could mean that the server only supports v3. */
+      int version = LDAP_VERSION3;
+      if (myopt->verbose)
+        log_info ("protocol error; retrying bind with v3 protocol\n");
+      npth_unprotect ();
+      ldap_set_option (ld, LDAP_OPT_PROTOCOL_VERSION, &version);
+      ret = my_ldap_simple_bind_s (ld, myopt->user, myopt->pass);
+      npth_protect ();
+    }
+#endif
   if (ret)
     {
       log_error (_("binding to '%s:%d' failed: %s\n"),
-                 host, port, strerror (errno));
+                 host, port, ldap_err2string (ret));
       ldap_unbind (ld);
       return -1;
     }