diff options
author | George Kadianakis <desnacked@riseup.net> | 2013-05-23 22:38:39 +0300 |
---|---|---|
committer | David Goulet <dgoulet@ev0ke.net> | 2015-02-17 11:30:25 -0500 |
commit | 6517219093aeaf692c233d30d5d16686b0f79420 (patch) | |
tree | 19146d8eab6d7db07746a18775444fa1a65f8081 /src/or/control.c | |
parent | 1447324a6ca380a29fe84081d30eb7023d60cece (diff) | |
download | tor-6517219093aeaf692c233d30d5d16686b0f79420.tar.gz tor-6517219093aeaf692c233d30d5d16686b0f79420.zip |
Control: command to lookup cached HS descriptor
This adds the key "hs/client/desc/id/<ADDR>" to the GETINFO command used to
lookup the given onion address in the client hs descriptor cache.
If found, prints it formatted as specified in section 1.3 of rend-spec.txt.
Fixes #14845
Signed-off-by: David Goulet <dgoulet@ev0ke.net>
Diffstat (limited to 'src/or/control.c')
-rw-r--r-- | src/or/control.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/or/control.c b/src/or/control.c index 064b745c9f..8d899dc9f7 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -41,6 +41,8 @@ #include "router.h" #include "routerlist.h" #include "routerparse.h" +#include "rendclient.h" +#include "rendcommon.h" #ifndef _WIN32 #include <pwd.h> @@ -1713,6 +1715,25 @@ getinfo_helper_dir(control_connection_t *control_conn, *answer = smartlist_join_strings(sl, "", 0, NULL); SMARTLIST_FOREACH(sl, char *, c, tor_free(c)); smartlist_free(sl); + } else if (!strcmpstart(question, "hs/client/desc/id/")) { + char *msg; + rend_cache_entry_t *e = NULL; + + question += strlen("hs/client/desc/id/"); + if (strlen(question) != REND_SERVICE_ID_LEN_BASE32) { + tor_asprintf(&msg, "\"%s\" invalid address.", question); + *errmsg = msg; + return -1; + } + + if (rend_cache_lookup_entry(question, -1, &e) > 0) { + /* Descriptor found in cache */ + *answer = tor_strdup(e->desc); + } else { + tor_asprintf(&msg, "\"%s\" not found in cache.", question); + *errmsg = msg; + return -1; + } } else if (!strcmpstart(question, "md/id/")) { const node_t *node = node_get_by_hex_id(question+strlen("md/id/")); const microdesc_t *md = NULL; @@ -2176,6 +2197,8 @@ static const getinfo_item_t getinfo_items[] = { PREFIX("md/id/", dir, "Microdescriptors by ID"), PREFIX("md/name/", dir, "Microdescriptors by name"), PREFIX("extra-info/digest/", dir, "Extra-info documents by digest."), + PREFIX("hs/client/desc/id", dir, + "Hidden Service descriptor in client's cache by onion."), PREFIX("net/listeners/", listeners, "Bound addresses by type"), ITEM("ns/all", networkstatus, "Brief summary of router status (v2 directory format)"), |