|
@@ -1927,6 +1927,22 @@ getinfo_helper_dir(control_connection_t *control_conn,
|
|
|
*errmsg = "Not found in cache";
|
|
|
return -1;
|
|
|
}
|
|
|
+ } else if (!strcmpstart(question, "hs/service/desc/id/")) {
|
|
|
+ rend_cache_entry_t *e = NULL;
|
|
|
+
|
|
|
+ question += strlen("hs/service/desc/id/");
|
|
|
+ if (strlen(question) != REND_SERVICE_ID_LEN_BASE32) {
|
|
|
+ *errmsg = "Invalid address";
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!rend_cache_lookup_entry(question, -1, &e, 1)) {
|
|
|
+ /* Descriptor found in cache */
|
|
|
+ *answer = tor_strdup(e->desc);
|
|
|
+ } else {
|
|
|
+ *errmsg = "Not found in cache";
|
|
|
+ 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;
|
|
@@ -2481,6 +2497,8 @@ static const getinfo_item_t getinfo_items[] = {
|
|
|
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("hs/service/desc/id/", dir,
|
|
|
+ "Hidden Service descriptor in services's cache by onion."),
|
|
|
PREFIX("net/listeners/", listeners, "Bound addresses by type"),
|
|
|
ITEM("ns/all", networkstatus,
|
|
|
"Brief summary of router status (v2 directory format)"),
|