[or-cvs] Add a generic Comma-separated-value config type, and a Fire...

Nick Mathewson nickm at seul.org
Mon Aug 16 20:47:02 UTC 2004


Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/tmp/cvs-serv18601/src/or

Modified Files:
	circuitbuild.c config.c or.h routerlist.c 
Log Message:
Add a generic Comma-separated-value config type, and a FirewallPorts option to tell FascistFirewall which ports are open.  (Defaults to 80,443)

Index: circuitbuild.c
===================================================================
RCS file: /home/or/cvsroot/src/or/circuitbuild.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- circuitbuild.c	15 Aug 2004 20:14:44 -0000	1.22
+++ circuitbuild.c	16 Aug 2004 20:47:00 -0000	1.23
@@ -1112,6 +1112,7 @@
 {
   routerinfo_t *r, *choice;
   smartlist_t *excluded = smartlist_create();
+  char buf[16];
 
   if((r = router_get_by_digest(state->chosen_exit_digest)))
     smartlist_add(excluded, r);
@@ -1128,8 +1129,9 @@
 
     for(i=0; i < smartlist_len(rl->routers); i++) {
       r = smartlist_get(rl->routers, i);
-      if(r->or_port != REQUIRED_FIREWALL_ORPORT)
-        smartlist_add(excluded, r);
+      sprintf(buf, "%d", r->or_port);
+      if(!smartlist_string_isin(options.FirewallPorts, buf))
+         smartlist_add(excluded, r);
     }
   }
   choice = router_choose_random_node(options.EntryNodes,

Index: config.c
===================================================================
RCS file: /home/or/cvsroot/src/or/config.c,v
retrieving revision 1.134
retrieving revision 1.135
diff -u -d -r1.134 -r1.135
--- config.c	16 Aug 2004 11:43:18 -0000	1.134
+++ config.c	16 Aug 2004 20:47:00 -0000	1.135
@@ -17,6 +17,8 @@
   CONFIG_TYPE_INT, /**< An integer */
   CONFIG_TYPE_DOUBLE, /**< A floating-point value */
   CONFIG_TYPE_BOOL, /**< A boolean value, expressed as 0 or 1. */
+  CONFIG_TYPE_CSV, /**< A list of strings, separated by commas and optional
+                    * whitespace. */
   CONFIG_TYPE_LINELIST, /**< Uninterpreted config lines */
 } config_type_t;
 
@@ -126,6 +128,39 @@
   }
 }
 
+/**
+ * Given a list of comma-separated entries, each surrounded by optional
+ * whitespace, insert copies the entries (in order) into lst, without
+ * their surrounding whitespace.
+ */
+static void parse_csv_into_smartlist(smartlist_t *lst, const char *val)
+{
+  const char *cp, *start, *end;
+
+  cp = val;
+  while (1) {
+    while (isspace(*cp))
+      ++cp;
+    start = cp;
+    end = strchr(cp, ',');
+    if (!end)
+      end = strchr(cp, '\0');
+    for (cp=end-1; cp>=start && isspace(*cp); --cp)
+      ;
+    /* Now start points to the first nonspace character of an entry,
+     * end points to the terminator of that entry,
+     * and cp points to the last nonspace character of an entry. */
+    tor_assert(start <= cp);
+    tor_assert(cp <= end);
+    tor_assert(*end == '\0' || *end == ',');
+    tor_assert((!isspace(*start) && !isspace(*cp)) || start==cp);
+    smartlist_add(lst, tor_strndup(start, cp-start));
+    if (!*end)
+      break;
+    cp = end+1;
+  }
+}
+
 /** Search the linked list <b>c</b> for any option whose key is <b>key</b>.
  * If such an option is found, interpret it as of type <b>type</b>, and store
  * the result in <b>arg</b>.  If the option is misformatted, log a warning and
@@ -164,6 +199,14 @@
     case CONFIG_TYPE_DOUBLE:
       *(double *)arg = atof(c->value);
       break;
+    case CONFIG_TYPE_CSV:
+      if (arg) {
+        SMARTLIST_FOREACH((smartlist_t*)arg, char *, cp, tor_free(cp));
+        smartlist_free((smartlist_t*)arg);
+      }
+      arg = smartlist_create();
+      parse_csv_into_smartlist(arg, c->value);
+      break;
     case CONFIG_TYPE_LINELIST:
       /* Note: this reverses the order that the lines appear in.  That's
        * just fine, since we build up the list of lines reversed in the
@@ -210,6 +253,7 @@
     config_compare(list, "ExcludeNodes",   CONFIG_TYPE_STRING, &options->ExcludeNodes) ||
 
     config_compare(list, "FascistFirewall",CONFIG_TYPE_BOOL, &options->FascistFirewall) ||
+    config_compare(list, "FirewallPorts",CONFIG_TYPE_CSV, &options->FirewallPorts) ||
 
     config_compare(list, "Group",          CONFIG_TYPE_STRING, &options->Group) ||
 
@@ -529,6 +573,8 @@
   config_free_lines(options->DirBindAddress);
   config_free_lines(options->ExitPolicy);
   config_free_lines(options->SocksPolicy);
+  SMARTLIST_FOREACH(options->FirewallPorts, char *, cp, tor_free(cp));
+  smartlist_free(options->FirewallPorts);
 }
 
 /** Set <b>options</b> to hold reasonable defaults for most options. */
@@ -561,6 +607,7 @@
   options->BandwidthBurst = 10000000; /* max burst on the token bucket */
   options->NumCpus = 1;
   options->RendConfigLines = NULL;
+  options->FirewallPorts = NULL;
 }
 
 /** Read a configuration file into <b>options</b>, finding the configuration
@@ -754,6 +801,21 @@
     result = -1;
   }
 
+  if(options->FascistFirewall && !options->FirewallPorts) {
+    options->FirewallPorts = smartlist_create();
+    smartlist_add(options->FirewallPorts, "80");
+    smartlist_add(options->FirewallPorts, "443");
+  }
+  if(options->FirewallPorts) {
+    SMARTLIST_FOREACH(options->FirewallPorts, const char *, cp,
+    { i = atoi(cp); 
+      if (i < 1 || i > 65535) {
+        log(LOG_WARN, "Port %s out of range in FirewallPorts", cp);
+        result=-1;
+      }
+    });
+  }
+
   if(options->SocksPort >= 1 &&
      (options->PathlenCoinWeight < 0.0 || options->PathlenCoinWeight >= 1.0)) {
     log(LOG_WARN,"PathlenCoinWeight option must be >=0.0 and <1.0.");

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.405
retrieving revision 1.406
diff -u -d -r1.405 -r1.406
--- or.h	16 Aug 2004 11:43:18 -0000	1.405
+++ or.h	16 Aug 2004 20:47:00 -0000	1.406
@@ -863,7 +863,8 @@
   int IgnoreVersion; /**< If true, run no matter what versions of Tor the
                       * directory recommends. */
   int RunAsDaemon; /**< If true, run in the background. (Unix only) */
-  int FascistFirewall; /**< Whether to prefer ORs reachable on 80/443. */
+  int FascistFirewall; /**< Whether to prefer ORs reachable on open ports. */
+  smartlist_t *FirewallPorts; /** Which ports our firewall allows. */
   int DirFetchPostPeriod; /**< How often do we fetch new directories
                            * and post server descriptros to the directory
                            * server? */

Index: routerlist.c
===================================================================
RCS file: /home/or/cvsroot/src/or/routerlist.c,v
retrieving revision 1.120
retrieving revision 1.121
diff -u -d -r1.120 -r1.121
--- routerlist.c	15 Aug 2004 20:14:44 -0000	1.120
+++ routerlist.c	16 Aug 2004 20:47:00 -0000	1.121
@@ -84,6 +84,7 @@
   int i;
   routerinfo_t *router;
   smartlist_t *sl;
+  char buf[16];
 
   if(!routerlist)
     return NULL;
@@ -98,9 +99,11 @@
       continue;
     if(requireothers && router_is_me(router))
       continue;
-    if(options.FascistFirewall &&
-       router->dir_port != REQUIRED_FIREWALL_DIRPORT)
-      continue;
+    if(options.FascistFirewall) {
+      sprintf(buf,"%d",router->dir_port);
+      if (!smartlist_string_isin(options.FirewallPorts, buf))
+        continue;
+    }
     smartlist_add(sl, router);
   }
 



More information about the tor-commits mailing list