summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-08-18 04:44:24 +0000
committerNick Mathewson <nickm@torproject.org>2004-08-18 04:44:24 +0000
commit86980cf6e232dd30de59bec2c32e0a85c81eb1d2 (patch)
tree68b23af0d396f5b063638b3e9c4f50a33a4473b0
parentadccf3aea6ef7d33bd5cfcd322d5168b2c12415b (diff)
downloadtor-86980cf6e232dd30de59bec2c32e0a85c81eb1d2.tar.gz
tor-86980cf6e232dd30de59bec2c32e0a85c81eb1d2.zip
Functions to test nickname validity
svn:r2269
-rw-r--r--src/common/util.h2
-rw-r--r--src/or/config.c4
-rw-r--r--src/or/or.h2
-rw-r--r--src/or/router.c20
-rw-r--r--src/or/routerparse.c9
-rw-r--r--src/or/test.c20
6 files changed, 50 insertions, 7 deletions
diff --git a/src/common/util.h b/src/common/util.h
index 05a41db18b..3554b3673d 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -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);
diff --git a/src/or/config.c b/src/or/config.c
index faacdb2380..6d09b77644 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -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);
diff --git a/src/or/or.h b/src/or/or.h
index fd5b9ccbd3..cc2457c688 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -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 ***************************/
diff --git a/src/or/router.c b/src/or/router.c
index 440e404282..2b89bef8dc 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -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
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index f3e6a53f80..f434dcd660 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -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]);
diff --git a/src/or/test.c b/src/or/test.c
index 80167bc57c..d9badb7462 100644
--- a/src/or/test.c
+++ b/src/or/test.c
@@ -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";