commit efa978124f067bf75c33c4ff9bba8dbf2f54a4ef Author: Nick Mathewson nickm@torproject.org Date: Tue Sep 25 16:22:11 2018 -0400
Extract nickname-checking functions from router.c --- src/core/include.am | 2 ++ src/feature/nodelist/describe.c | 5 ++++ src/feature/nodelist/nickname.c | 62 +++++++++++++++++++++++++++++++++++++++++ src/feature/nodelist/nickname.h | 19 +++++++++++++ src/feature/relay/router.c | 49 -------------------------------- src/feature/relay/router.h | 4 +-- 6 files changed, 89 insertions(+), 52 deletions(-)
diff --git a/src/core/include.am b/src/core/include.am index d4671bf6c..39eed0ab5 100644 --- a/src/core/include.am +++ b/src/core/include.am @@ -93,6 +93,7 @@ LIBTOR_APP_A_SOURCES = \ src/feature/nodelist/dirlist.c \ src/feature/nodelist/microdesc.c \ src/feature/nodelist/networkstatus.c \ + src/feature/nodelist/nickname.c \ src/feature/nodelist/nodelist.c \ src/feature/nodelist/node_select.c \ src/feature/nodelist/parsecommon.c \ @@ -309,6 +310,7 @@ noinst_HEADERS += \ src/feature/nodelist/networkstatus_sr_info_st.h \ src/feature/nodelist/networkstatus_st.h \ src/feature/nodelist/networkstatus_voter_info_st.h \ + src/feature/nodelist/nickname.h \ src/feature/nodelist/node_st.h \ src/feature/nodelist/nodelist.h \ src/feature/nodelist/node_select.h \ diff --git a/src/feature/nodelist/describe.c b/src/feature/nodelist/describe.c index ccf27e02d..0ef9e3e7f 100644 --- a/src/feature/nodelist/describe.c +++ b/src/feature/nodelist/describe.c @@ -4,6 +4,11 @@ * Copyright (c) 2007-2018, The Tor Project, Inc. */ /* See LICENSE for licensing information */
+/** + * \file describe.c + * \brief Format short descriptions of relays. + */ + #include "core/or/or.h" #include "feature/nodelist/describe.h" #include "feature/relay/router.h" diff --git a/src/feature/nodelist/nickname.c b/src/feature/nodelist/nickname.c new file mode 100644 index 000000000..7b0b29a93 --- /dev/null +++ b/src/feature/nodelist/nickname.c @@ -0,0 +1,62 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2018, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file nickname.c + * \brief Check and manipulate relay nicknames. + */ + +#include "core/or/or.h" +#include "feature/nodelist/nickname.h" + +/** Return true iff <b>s</b> is a valid server nickname. (That is, a string + * containing between 1 and MAX_NICKNAME_LEN characters from + * LEGAL_NICKNAME_CHARACTERS.) */ +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; +} + +/** Return true iff <b>s</b> is a valid server nickname or + * hex-encoded identity-key digest. */ +int +is_legal_nickname_or_hexdigest(const char *s) +{ + if (*s!='$') + return is_legal_nickname(s); + else + return is_legal_hexdigest(s); +} + +/** Return true iff <b>s</b> is a valid hex-encoded identity-key + * digest. (That is, an optional $, followed by 40 hex characters, + * followed by either nothing, or = or ~ followed by a nickname, or + * a character other than =, ~, or a hex character.) + */ +int +is_legal_hexdigest(const char *s) +{ + size_t len; + tor_assert(s); + if (s[0] == '$') s++; + len = strlen(s); + if (len > HEX_DIGEST_LEN) { + if (s[HEX_DIGEST_LEN] == '=' || + s[HEX_DIGEST_LEN] == '~') { + if (!is_legal_nickname(s+HEX_DIGEST_LEN+1)) + return 0; + } else { + return 0; + } + } + return (len >= HEX_DIGEST_LEN && + strspn(s,HEX_CHARACTERS)==HEX_DIGEST_LEN); +} diff --git a/src/feature/nodelist/nickname.h b/src/feature/nodelist/nickname.h new file mode 100644 index 000000000..86d430991 --- /dev/null +++ b/src/feature/nodelist/nickname.h @@ -0,0 +1,19 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2018, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file nickname.h + * \brief Header file for nickname.c. + **/ + +#ifndef TOR_NICKNAME_H +#define TOR_NICKNAME_H + +int is_legal_nickname(const char *s); +int is_legal_nickname_or_hexdigest(const char *s); +int is_legal_hexdigest(const char *s); + +#endif diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c index 494609b5b..3db7bcf25 100644 --- a/src/feature/relay/router.c +++ b/src/feature/relay/router.c @@ -3104,55 +3104,6 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo, return result; }
-/** Return true iff <b>s</b> is a valid server nickname. (That is, a string - * containing between 1 and MAX_NICKNAME_LEN characters from - * LEGAL_NICKNAME_CHARACTERS.) */ -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; -} - -/** Return true iff <b>s</b> is a valid server nickname or - * hex-encoded identity-key digest. */ -int -is_legal_nickname_or_hexdigest(const char *s) -{ - if (*s!='$') - return is_legal_nickname(s); - else - return is_legal_hexdigest(s); -} - -/** Return true iff <b>s</b> is a valid hex-encoded identity-key - * digest. (That is, an optional $, followed by 40 hex characters, - * followed by either nothing, or = or ~ followed by a nickname, or - * a character other than =, ~, or a hex character.) - */ -int -is_legal_hexdigest(const char *s) -{ - size_t len; - tor_assert(s); - if (s[0] == '$') s++; - len = strlen(s); - if (len > HEX_DIGEST_LEN) { - if (s[HEX_DIGEST_LEN] == '=' || - s[HEX_DIGEST_LEN] == '~') { - if (!is_legal_nickname(s+HEX_DIGEST_LEN+1)) - return 0; - } else { - return 0; - } - } - return (len >= HEX_DIGEST_LEN && - strspn(s,HEX_CHARACTERS)==HEX_DIGEST_LEN); -} - /** Forget that we have issued any router-related warnings, so that we'll * warn again if we see the same errors. */ void diff --git a/src/feature/relay/router.h b/src/feature/relay/router.h index d56ddc8a1..54b57cf7c 100644 --- a/src/feature/relay/router.h +++ b/src/feature/relay/router.h @@ -14,6 +14,7 @@
#include "lib/testsupport/testsupport.h" #include "feature/nodelist/describe.h" +#include "feature/nodelist/nickname.h"
struct curve25519_keypair_t; struct ed25519_keypair_t; @@ -119,9 +120,6 @@ int router_has_orport(const routerinfo_t *router, int extrainfo_dump_to_string(char **s, extrainfo_t *extrainfo, crypto_pk_t *ident_key, const struct ed25519_keypair_t *signing_keypair); -int is_legal_nickname(const char *s); -int is_legal_nickname_or_hexdigest(const char *s); -int is_legal_hexdigest(const char *s);
const char *routerinfo_err_to_string(int err); int routerinfo_err_is_transient(int err);
tor-commits@lists.torproject.org