dirmngr: Implement Tor mode for SRV RRs.
authorWerner Koch <wk@gnupg.org>
Thu, 22 Oct 2015 08:14:10 +0000 (10:14 +0200)
committerWerner Koch <wk@gnupg.org>
Thu, 22 Oct 2015 08:15:25 +0000 (10:15 +0200)
* dirmngr/dns-stuff.c (get_dns_cert): Factor adns init out to...
(my_adns_init): new.
(getsrv)[USE_ADNS]: Use my_adns_init.
(getsrv)[!USE_ADNS]: Return an error if Tor mode is active.

* dirmngr/t-dns-stuff.c: Add option --use-tor.

Signed-off-by: Werner Koch <wk@gnupg.org>
dirmngr/dns-stuff.c
dirmngr/t-dns-stuff.c

index 639388f..300d086 100644 (file)
@@ -219,6 +219,29 @@ resolve_dns_name (const char *name, unsigned short port,
 }
 
 
+#ifdef USE_ADNS
+/* Init ADNS and store the new state at R_STATE.  Returns 0 on
+   success; prints an error message and returns an error code on
+   failure.  */
+static gpg_error_t
+my_adns_init (adns_state *r_state)
+{
+  gpg_error_t err;
+
+  if (tor_mode? adns_init_strcfg (r_state,
+                                  adns_if_noerrprint|adns_if_tormode,
+                                  NULL, "nameserver 8.8.8.8")
+      /*    */: adns_init (r_state, adns_if_noerrprint, NULL))
+    {
+      err = gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
+      log_error ("error initializing adns: %s\n", gpg_strerror (err));
+      return err;
+    }
+  return 0;
+}
+#endif /*USE_ADNS*/
+
+
 /* Returns 0 on success or an error code.  If a PGP CERT record was
    found, the malloced data is returned at (R_KEY, R_KEYLEN) and
    the other return parameters are set to NULL/0.  If an IPGP CERT
@@ -250,14 +273,9 @@ get_dns_cert (const char *name, int want_certtype,
   *r_fprlen = 0;
   *r_url = NULL;
 
-  if (tor_mode? adns_init_strcfg (&state, adns_if_noerrprint|adns_if_tormode,
-                                  NULL, "nameserver 8.8.8.8")
-      /*    */: adns_init (&state, adns_if_noerrprint, NULL))
-    {
-      err = gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
-      log_error ("error initializing adns: %s\n", strerror (errno));
-      return err;
-    }
+  err = my_adns_init (&state);
+  if (err)
+    return err;
 
   if (adns_synchronous (state, name,
                         (adns_r_unknown
@@ -620,12 +638,8 @@ getsrv (const char *name,struct srventry **list)
     adns_state state;
     adns_answer *answer = NULL;
 
-    rc = adns_init (&state, adns_if_noerrprint, NULL);
-    if (rc)
-      {
-        log_error ("error initializing adns: %s\n", strerror (errno));
-        return -1;
-      }
+    if (my_adns_init (&state))
+      return -1;
 
     rc = adns_synchronous (state, name, adns_r_srv, adns_qf_quoteok_query,
                            &answer);
@@ -682,6 +696,10 @@ getsrv (const char *name,struct srventry **list)
     int r;
     u16 dlen;
 
+    /* Do not allow a query using the standard resolver in Tor mode.  */
+    if (tor_mode)
+      return -1;
+
     r = res_query (name, C_IN, T_SRV, answer, sizeof answer);
     if (r < sizeof (HEADER) || r > sizeof answer)
       return -1;
index d2ead8f..63d4cdd 100644 (file)
@@ -42,6 +42,7 @@ main (int argc, char **argv)
   int last_argc = -1;
   gpg_error_t err;
   int any_options = 0;
+  int opt_tor = 0;
   int opt_cert = 0;
   int opt_srv = 0;
   char const *name = NULL;
@@ -64,6 +65,7 @@ main (int argc, char **argv)
                  "Options:\n"
                  "  --verbose         print timings etc.\n"
                  "  --debug           flyswatter\n"
+                 "  --use-tor         use Tor\n"
                  "  --cert            lookup a CERT RR\n"
                  "  --srv             lookup a SRV RR\n"
                  , stdout);
@@ -80,6 +82,11 @@ main (int argc, char **argv)
           debug++;
           argc--; argv++;
         }
+      else if (!strcmp (*argv, "--use-tor"))
+        {
+          opt_tor = 1;
+          argc--; argv++;
+        }
       else if (!strcmp (*argv, "--cert"))
         {
           any_options = opt_cert = 1;
@@ -110,6 +117,17 @@ main (int argc, char **argv)
       exit (1);
     }
 
+  if (opt_tor)
+    {
+      err = enable_dns_tormode ();
+      if (err)
+        {
+          fprintf (stderr, "error switching into Tor mode: %s\n",
+                   gpg_strerror (err));
+          exit (1);
+        }
+    }
+
   if (opt_cert)
     {
       unsigned char *fpr;