]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Functions to test nickname validity
authorNick Mathewson <nickm@torproject.org>
Wed, 18 Aug 2004 04:44:24 +0000 (04:44 +0000)
committerNick Mathewson <nickm@torproject.org>
Wed, 18 Aug 2004 04:44:24 +0000 (04:44 +0000)
svn:r2269

src/common/util.h
src/or/config.c
src/or/or.h
src/or/router.c
src/or/routerparse.c
src/or/test.c

index 05a41db18bc9445055f04cf94ca79f3a6be54f2c..3554b3673df226b0b6e90cda83a319d86c5ba3f2 100644 (file)
@@ -81,6 +81,8 @@ struct timeval {
 #define CONFIG_LEGAL_FILENAME_CHARACTERS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_/ "
 #endif
 
+#define HEX_CHARACTERS "0123456789ABCDEFabcdef"
+
 size_t strlcat(char *dst, const char *src, size_t siz);
 size_t strlcpy(char *dst, const char *src, size_t siz);
 
index faacdb2380c7ffc947d01973fe7d05eeb30dc986..6d09b77644e3f95775d4329a63843ab83c1b5a27 100644 (file)
@@ -735,6 +735,10 @@ int getconfig(int argc, char **argv, or_options_t *options) {
       log_fn(LOG_WARN, "Nickname '%s' contains illegal characters.", options->Nickname);
       result = -1;
     }
+    if (strlen(options->Nickname) == 0) {
+      log_fn(LOG_WARN, "Nickname must have at least one character");
+      result = -1;
+    }
     if (strlen(options->Nickname) > MAX_NICKNAME_LEN) {
       log_fn(LOG_WARN, "Nickname '%s' has more than %d characters.",
              options->Nickname, MAX_NICKNAME_LEN);
index fd5b9ccbd36c1c590900bf6708928b29fe9ddeef..cc2457c688242ac00c0bfe4ba172a2c8454fe933 100644 (file)
@@ -1386,6 +1386,8 @@ int router_is_me(routerinfo_t *router);
 int router_rebuild_descriptor(void);
 int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
                                  crypto_pk_env_t *ident_key);
+int is_legal_nickname(const char *s);
+int is_legal_nickname_or_hexdigest(const char *s);
 
 /********************************* routerlist.c ***************************/
 
index 440e404282389acf67ba26305eaf8964fa500e96..2b89bef8dcdac81bfd8ce86df4d1736ad5ead80a 100644 (file)
@@ -774,6 +774,26 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
   return written+1;
 }
 
+int is_legal_nickname(const char *s)
+{
+  size_t len;
+  tor_assert(s);
+  len = strlen(s);
+  return len > 0 && len <= MAX_NICKNAME_LEN &&
+    strspn(s,LEGAL_NICKNAME_CHARACTERS)==len;
+}
+int is_legal_nickname_or_hexdigest(const char *s)
+{
+  size_t len;
+  tor_assert(s);
+  if (*s!='$')
+    return is_legal_nickname(s);
+
+  len = strlen(s);
+  return len == HEX_DIGEST_LEN+1 && strspn(s+1,HEX_CHARACTERS)==len-1;
+}
+
+
 /*
   Local Variables:
   mode:c
index f3e6a53f8080419390bde83c65a9d6b61c14b58d..f434dcd660dbb256c414fc5aad0e6045c6915c33 100644 (file)
@@ -681,13 +681,8 @@ routerinfo_t *router_parse_entry_from_string(const char *s,
 
   if (tok->n_args == 2 || tok->n_args == 5 || tok->n_args == 6) {
     router->nickname = tor_strdup(tok->args[0]);
-    if (strlen(router->nickname) > MAX_NICKNAME_LEN) {
-      log_fn(LOG_WARN,"Router nickname too long.");
-      goto err;
-    }
-    if (strspn(router->nickname, LEGAL_NICKNAME_CHARACTERS) !=
-        strlen(router->nickname)) {
-      log_fn(LOG_WARN, "Router nickname contains illegal characters.");
+    if (!is_legal_nickname(router->nickname)) {
+      log_fn(LOG_WARN,"Router nickname is invalid");
       goto err;
     }
     router->address = tor_strdup(tok->args[1]);
index 80167bc57cda0c5e1a39d45b6bf8db77a36ba603..d9badb7462c0892f7c220423ca35215ecf6449f1 100644 (file)
@@ -758,6 +758,26 @@ test_dir_format()
   test_assert(! crypto_pk_generate_key(pk2));
   test_assert(! crypto_pk_generate_key(pk3));
 
+  test_assert( is_legal_nickname("a"));
+  test_assert(!is_legal_nickname(""));
+  test_assert(!is_legal_nickname("abcdefghijklmnopqrst")); /* 20 chars */
+  test_assert(!is_legal_nickname("abcdefghijklmnopqrst")); /* 20 chars */
+  test_assert(!is_legal_nickname("hyphen-")); /* bad char */
+  test_assert( is_legal_nickname("abcdefghijklmnopqrs")); /* 19 chars */
+  test_assert(!is_legal_nickname("$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA"));
+  /* valid */
+  test_assert( is_legal_nickname_or_hexdigest(
+                                 "$AAAAAAAA01234AAAAAAAAAAAAAAAAAAAAAAAAAAA"));
+  /* too short */
+  test_assert(!is_legal_nickname_or_hexdigest(
+                                 "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));
+  /* illegal char */
+  test_assert(!is_legal_nickname_or_hexdigest(
+                                 "$AAAAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"));
+  test_assert(is_legal_nickname_or_hexdigest("xyzzy"));
+  test_assert(is_legal_nickname_or_hexdigest("abcdefghijklmnopqrs"));
+  test_assert(!is_legal_nickname_or_hexdigest("abcdefghijklmnopqrst"));
+
   get_platform_str(platform, sizeof(platform));
 
   r1.address = "testaddr1.foo.bar";