mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-09-21 21:44:58 +02:00
Remember list of digests for trusted dirservers; use this list to tell whether you are a trusted dirserver
svn:r2064
This commit is contained in:
parent
d5999a24af
commit
d858a9e990
@ -1369,6 +1369,7 @@ routerinfo_t *router_get_by_addr_port(uint32_t addr, uint16_t port);
|
|||||||
routerinfo_t *router_get_by_nickname(const char *nickname);
|
routerinfo_t *router_get_by_nickname(const char *nickname);
|
||||||
routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
|
routerinfo_t *router_get_by_hexdigest(const char *hexdigest);
|
||||||
routerinfo_t *router_get_by_digest(const char *digest);
|
routerinfo_t *router_get_by_digest(const char *digest);
|
||||||
|
int router_digest_is_trusted_dir(const char *digest);
|
||||||
void router_get_routerlist(routerlist_t **prouterlist);
|
void router_get_routerlist(routerlist_t **prouterlist);
|
||||||
void routerlist_free(routerlist_t *routerlist);
|
void routerlist_free(routerlist_t *routerlist);
|
||||||
void routerlist_clear_trusted_directories(void);
|
void routerlist_clear_trusted_directories(void);
|
||||||
|
@ -516,12 +516,8 @@ int router_rebuild_descriptor(void) {
|
|||||||
log_fn(LOG_WARN, "Couldn't dump router to string.");
|
log_fn(LOG_WARN, "Couldn't dump router to string.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
/* XXX008 NM: no, we shouldn't just blindly assume we're an
|
ri->is_trusted_dir = ri->dir_port &&
|
||||||
* authdirserver just because our dir_port is set. We should
|
router_digest_is_trusted_dir(ri->identity_digest);
|
||||||
* take these next two lines out, and then set our is_trusted_dir
|
|
||||||
* variable if we find ourselves in the dirservers file. Yes/no? */
|
|
||||||
if (ri->dir_port)
|
|
||||||
ri->is_trusted_dir = 1;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,9 @@ static int router_resolve_routerlist(routerlist_t *dir);
|
|||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
|
||||||
|
/** List of digests of keys for servers that are trusted directories. */
|
||||||
|
static smartlist_t *trusted_dir_digests = NULL;
|
||||||
|
|
||||||
/****
|
/****
|
||||||
* Functions to manage and access our list of known routers. (Note:
|
* Functions to manage and access our list of known routers. (Note:
|
||||||
* dirservers maintain a separate, independent list of known router
|
* dirservers maintain a separate, independent list of known router
|
||||||
@ -306,6 +309,16 @@ routerinfo_t *router_get_by_nickname(const char *nickname)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return true iff <b>digest</b> is the digest of the identity key of
|
||||||
|
* a trusted directory. */
|
||||||
|
int router_digest_is_trusted_dir(const char *digest) {
|
||||||
|
if (!trusted_dir_digests)
|
||||||
|
return 0;
|
||||||
|
SMARTLIST_FOREACH(trusted_dir_digests, char *, cp,
|
||||||
|
if (!memcmp(digest, cp, DIGEST_LEN)) return 1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/** Return the router in our routerlist whose hexadecimal key digest
|
/** Return the router in our routerlist whose hexadecimal key digest
|
||||||
* is <b>hexdigest</b>. Return NULL if no such router is known. */
|
* is <b>hexdigest</b>. Return NULL if no such router is known. */
|
||||||
routerinfo_t *router_get_by_hexdigest(const char *hexdigest) {
|
routerinfo_t *router_get_by_hexdigest(const char *hexdigest) {
|
||||||
@ -527,10 +540,15 @@ int router_load_routerlist_from_file(char *routerfile, int trusted)
|
|||||||
/** Mark all directories in the routerlist as nontrusted. */
|
/** Mark all directories in the routerlist as nontrusted. */
|
||||||
void routerlist_clear_trusted_directories(void)
|
void routerlist_clear_trusted_directories(void)
|
||||||
{
|
{
|
||||||
if (!routerlist) return;
|
if (routerlist) {
|
||||||
SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, r,
|
SMARTLIST_FOREACH(routerlist->routers, routerinfo_t *, r,
|
||||||
r->is_trusted_dir = 0);
|
r->is_trusted_dir = 0);
|
||||||
}
|
}
|
||||||
|
if (trusted_dir_digests) {
|
||||||
|
SMARTLIST_FOREACH(trusted_dir_digests, char *, cp, tor_free(cp));
|
||||||
|
smartlist_clear(trusted_dir_digests);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Helper function: read routerinfo elements from s, and throw out the
|
/** Helper function: read routerinfo elements from s, and throw out the
|
||||||
* ones that don't parse and resolve. Add all remaining elements to the
|
* ones that don't parse and resolve. Add all remaining elements to the
|
||||||
@ -546,8 +564,19 @@ int router_load_routerlist_from_string(const char *s, int trusted)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (trusted) {
|
if (trusted) {
|
||||||
SMARTLIST_FOREACH(new_list->routers, routerinfo_t *, r,
|
int i;
|
||||||
if (r->dir_port) r->is_trusted_dir = 1);
|
if (!trusted_dir_digests)
|
||||||
|
trusted_dir_digests = smartlist_create();
|
||||||
|
for (i=0;i<smartlist_len(new_list->routers);++i) {
|
||||||
|
routerinfo_t *r = smartlist_get(new_list->routers, i);
|
||||||
|
if (r->dir_port) {
|
||||||
|
char *b;
|
||||||
|
r->is_trusted_dir = 1;
|
||||||
|
b = tor_malloc(DIGEST_LEN);
|
||||||
|
memcpy(b, r->identity_digest, DIGEST_LEN);
|
||||||
|
smartlist_add(trusted_dir_digests, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (routerlist) {
|
if (routerlist) {
|
||||||
SMARTLIST_FOREACH(new_list->routers, routerinfo_t *, r,
|
SMARTLIST_FOREACH(new_list->routers, routerinfo_t *, r,
|
||||||
|
Loading…
Reference in New Issue
Block a user