|
@@ -13,9 +13,6 @@
|
|
|
*/
|
|
|
|
|
|
#include "or.h"
|
|
|
-#ifdef HAVE_UNAME
|
|
|
-#include <sys/utsname.h>
|
|
|
-#endif
|
|
|
|
|
|
/****************************************************************************/
|
|
|
|
|
@@ -771,6 +768,8 @@ routerinfo_t *router_get_entry_from_string(char**s) {
|
|
|
directory_token_t *tok = &_tok;
|
|
|
struct tm published;
|
|
|
|
|
|
+ int t;
|
|
|
+
|
|
|
#define NEXT_TOKEN() \
|
|
|
do { if (router_get_next_token(s, tok)) { \
|
|
|
log_fn(LOG_WARNING, "Error reading directory: %s", tok->val.error);\
|
|
@@ -779,8 +778,10 @@ routerinfo_t *router_get_entry_from_string(char**s) {
|
|
|
|
|
|
#define ARGS tok->val.cmd.args
|
|
|
|
|
|
- if (router_get_router_hash(*s, digest) < 0)
|
|
|
+ if (router_get_router_hash(*s, digest) < 0) {
|
|
|
+ log_fn(LOG_WARNING, "Couldn't compute router hash.");
|
|
|
return NULL;
|
|
|
+ }
|
|
|
|
|
|
NEXT_TOKEN();
|
|
|
|
|
@@ -802,11 +803,15 @@ routerinfo_t *router_get_entry_from_string(char**s) {
|
|
|
}
|
|
|
if (!(router->nickname = strdup(ARGS[0])))
|
|
|
goto err;
|
|
|
- if (strlen(router->nickname) > MAX_NICKNAME_LEN)
|
|
|
+ if (strlen(router->nickname) > MAX_NICKNAME_LEN) {
|
|
|
+ log_fn(LOG_WARNING,"Router nickname too long.");
|
|
|
goto err;
|
|
|
+ }
|
|
|
if (strspn(router->nickname, LEGAL_NICKNAME_CHARACTERS) !=
|
|
|
- strlen(router->nickname))
|
|
|
+ strlen(router->nickname)) {
|
|
|
+ log_fn(LOG_WARNING, "Router nickname contains illegal characters.");
|
|
|
goto err;
|
|
|
+ }
|
|
|
|
|
|
/* read router.address */
|
|
|
if (!(router->address = strdup(ARGS[1])))
|
|
@@ -830,6 +835,7 @@ routerinfo_t *router_get_entry_from_string(char**s) {
|
|
|
router->bandwidth = atoi(ARGS[5]);
|
|
|
if (!router->bandwidth) {
|
|
|
log_fn(LOG_WARNING,"bandwidth unreadable or 0. Failing.");
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
log_fn(LOG_DEBUG,"or_port %d, ap_port %d, dir_port %d, bandwidth %d.",
|
|
@@ -900,9 +906,9 @@ routerinfo_t *router_get_entry_from_string(char**s) {
|
|
|
}
|
|
|
assert (router->identity_pkey);
|
|
|
|
|
|
- if (crypto_pk_public_checksig(router->identity_pkey, tok->val.signature,
|
|
|
- 128, signed_digest) != 20) {
|
|
|
- log_fn(LOG_WARNING, "Invalid signature");
|
|
|
+ if ((t=crypto_pk_public_checksig(router->identity_pkey, tok->val.signature,
|
|
|
+ 128, signed_digest)) != 20) {
|
|
|
+ log_fn(LOG_WARNING, "Invalid signature %d",t);
|
|
|
goto err;
|
|
|
}
|
|
|
if (memcmp(digest, signed_digest, 20)) {
|
|
@@ -1082,20 +1088,12 @@ int router_rebuild_descriptor(void) {
|
|
|
|
|
|
static void get_platform_str(char *platform, int len)
|
|
|
{
|
|
|
-#ifdef HAVE_UNAME
|
|
|
- struct utsname u;
|
|
|
- if (!uname(&u)) {
|
|
|
- snprintf(platform, len-1, "Tor %s on %s %s %s %s %s",
|
|
|
- VERSION, u.sysname, u.nodename, u.release, u.version, u.machine);
|
|
|
- platform[len-1] = '\0';
|
|
|
- return;
|
|
|
- } else
|
|
|
-#endif
|
|
|
- {
|
|
|
- snprintf(platform, len-1, "Tor %s", VERSION);
|
|
|
- }
|
|
|
+ snprintf(platform, len-1, "Tor %s on %s", VERSION, get_uname());
|
|
|
+ platform[len-1] = '\0';
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
+#define DEBUG_ROUTER_DUMP_ROUTER_TO_STRING
|
|
|
int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
|
|
|
crypto_pk_env_t *ident_key) {
|
|
|
char *onion_pkey;
|
|
@@ -1109,9 +1107,18 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
|
|
|
int written;
|
|
|
int result=0;
|
|
|
struct exit_policy_t *tmpe;
|
|
|
+#ifdef DEBUG_ROUTER_DUMP_ROUTER_TO_STRING
|
|
|
+ char *s_tmp, *s_dup;
|
|
|
+ routerinfo_t *ri_tmp;
|
|
|
+#endif
|
|
|
|
|
|
get_platform_str(platform, sizeof(platform));
|
|
|
|
|
|
+ if (crypto_pk_cmp_keys(ident_key, router->identity_pkey)) {
|
|
|
+ log_fn(LOG_WARNING,"Tried to sign a router with a private key that didn't match router's public key!");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
if(crypto_pk_write_public_key_to_string(router->onion_pkey,
|
|
|
&onion_pkey,&onion_pkeylen)<0) {
|
|
|
log_fn(LOG_WARNING,"write onion_pkey to string failed!");
|
|
@@ -1196,6 +1203,19 @@ int router_dump_router_to_string(char *s, int maxlen, routerinfo_t *router,
|
|
|
/* include a last '\n' */
|
|
|
s[written] = '\n';
|
|
|
s[written+1] = 0;
|
|
|
+
|
|
|
+#ifdef DEBUG_ROUTER_DUMP_ROUTER_TO_STRING
|
|
|
+ s_tmp = s_dup = strdup(s);
|
|
|
+ ri_tmp = router_get_entry_from_string(&s_tmp);
|
|
|
+ if (!ri_tmp) {
|
|
|
+ log_fn(LOG_ERR, "We just generated a router descriptor we can't parse: <<%s>>",
|
|
|
+ s);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ free(s_dup);
|
|
|
+ routerinfo_free(ri_tmp);
|
|
|
+#endif
|
|
|
+
|
|
|
return written+1;
|
|
|
}
|
|
|
|