summaryrefslogtreecommitdiff
path: root/src/or/rendcommon.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-04-30 17:46:13 +0000
committerNick Mathewson <nickm@torproject.org>2007-04-30 17:46:13 +0000
commit18ba9fe81f159c3df0bbdcff4fe0efbcf3a0db56 (patch)
tree7e48242fd20edc47a1790b562c7a93c6c90072d8 /src/or/rendcommon.c
parent6875559c4969462d4f0969e6841c3badf9352de0 (diff)
downloadtor-18ba9fe81f159c3df0bbdcff4fe0efbcf3a0db56.tar.gz
tor-18ba9fe81f159c3df0bbdcff4fe0efbcf3a0db56.zip
r12580@catbus: nickm | 2007-04-30 13:29:05 -0400
Initial version of patch from Karsten Loesing: Add an HSAuthorityRecordStats option to track statistics of overall hidden service usage without logging information that would be useful to an attacker. svn:r10067
Diffstat (limited to 'src/or/rendcommon.c')
-rw-r--r--src/or/rendcommon.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c
index 69f614e5cc..77fb984ba3 100644
--- a/src/or/rendcommon.c
+++ b/src/or/rendcommon.c
@@ -360,17 +360,18 @@ rend_cache_lookup_desc(const char *query, int version, const char **desc,
* If we have an older descriptor with the same ID, replace it.
* Return -1 if it's malformed or otherwise rejected; return 0 if
* it's the same or older than one we've already got; return 1 if
- * it's novel.
+ * it's novel. The published flag tells us if we store the descriptor
+ * in our role aus directory (1) or if we cache it as client (0).
*/
int
-rend_cache_store(const char *desc, size_t desc_len)
+rend_cache_store(const char *desc, size_t desc_len, int published)
{
rend_cache_entry_t *e;
rend_service_descriptor_t *parsed;
char query[REND_SERVICE_ID_LEN+1];
char key[REND_SERVICE_ID_LEN+2]; /* 1<query>\0 or 0<query>\0 */
time_t now;
-
+ or_options_t *options = get_options();
tor_assert(rend_cache);
parsed = rend_parse_service_descriptor(desc,desc_len);
if (!parsed) {
@@ -396,6 +397,10 @@ rend_cache_store(const char *desc, size_t desc_len)
rend_service_descriptor_free(parsed);
return -1;
}
+ /* report novel publication to statistic */
+ if (published && options->HSAuthorityRecordStats) {
+ hs_usage_note_publish_total(query, time(NULL));
+ }
e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key);
if (e && e->parsed->timestamp > parsed->timestamp) {
log_info(LD_REND,"We already have a newer service descriptor %s with the "
@@ -413,6 +418,10 @@ rend_cache_store(const char *desc, size_t desc_len)
if (!e) {
e = tor_malloc_zero(sizeof(rend_cache_entry_t));
strmap_set_lc(rend_cache, key, e);
+ /* report novel publication to statistic */
+ if (published && options->HSAuthorityRecordStats) {
+ hs_usage_note_publish_novel(query, time(NULL));
+ }
} else {
rend_service_descriptor_free(e->parsed);
tor_free(e->desc);
@@ -477,3 +486,9 @@ rend_process_relay_cell(circuit_t *circ, int command, size_t length,
(void)r;
}
+int
+rend_cache_size(void)
+{
+ return strmap_size(rend_cache);
+}
+