From 26a25edaec6a71173e866d4632ace6af22de892f Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 16 Jul 2007 16:58:11 +0000 Subject: [PATCH] r13777@catbus: nickm | 2007-07-16 12:58:08 -0400 Patch from tup: new address-mappings/ GETINFO that includes expiry times. svn:r10844 --- ChangeLog | 15 ++++++++------- doc/spec/control-spec.txt | 16 +++++++++++----- src/or/connection_edge.c | 28 ++++++++++++++++++++-------- src/or/control.c | 35 +++++++++++++++++++++++++---------- src/or/or.h | 2 +- 5 files changed, 65 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index c90323759..8d29eb865 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,14 @@ Changes in version 0.2.0.3-alpha - 2007-??-?? from Robert Hogan.) - Add GETINFO status/enough-dir-info to let controllers tell whether Tor has downloaded sufficient directory information. (Patch from Tup.) + - You can now use the ControlSocket option to tell Tor to listen for + controller connections on Unix domain sockets on systems that support + them. (Patch from Peter Palfrader.) + - STREAM NEW events are generated for DNSPort requests and for tunneled + directory connections. (Patch from Robert Hogan.) + - New GETINFO address-mappings/* command to get address mappings with + expiry information. addr-mappings/* is now deprecated. + (Patch from Tup.) o Performance improvements (win32): - Use Critical Sections rather than Mutexes for synchronizing threads @@ -30,13 +38,6 @@ Changes in version 0.2.0.3-alpha - 2007-??-?? o Deprecated features: - RedirectExits is now deprecated. - o Minor features (controller): - - You can now use the ControlSocket option to tell Tor to listen for - controller connections on Unix domain sockets on systems that support - them. (Patch from Peter Palfrader.) - - STREAM NEW events are generated for DNSPort requests and for tunneled - directory connections. (Patch from Robert Hogan.) - o Major bugfixes (directory): - Fix a crash bug in directory authorities when we re-number the routerlist while inserting a new router. [Bugfix on 0.1.2.x] diff --git a/doc/spec/control-spec.txt b/doc/spec/control-spec.txt index e3725e5fc..2c3e961e4 100644 --- a/doc/spec/control-spec.txt +++ b/doc/spec/control-spec.txt @@ -377,16 +377,22 @@ $Id$ space-separated list of LongName, each preceded by a "!" if it is believed to be not running.) - "addr-mappings/all" - "addr-mappings/config" - "addr-mappings/cache" - "addr-mappings/control" -- a \r\n-separated list of address - mappings, each in the form of "from-address to-address". + "address-mappings/all" + "address-mappings/config" + "address-mappings/cache" + "address-mappings/control" -- a \r\n-separated list of address + mappings, each in the form of "from-address to-address expiry". The 'config' key returns those address mappings set in the configuration; the 'cache' key returns the mappings in the client-side DNS cache; the 'control' key returns the mappings set via the control interface; the 'all' target returns the mappings set through any mechanism. + Expiry is formatted as with ADDRMAP events; see section 4.1.7. + First introduced in 0.2.0.3-alpha. + + "addr-mappings/*" -- as for address-mappings/*, but without the + expiry portion of the value. Use of this value is deprecated + since 0.2.0.3-alpha; use address-mappings instead. "address" -- the best guess at our external IP address. If we have no guess, return a 551 error. (Added in 0.1.2.2-alpha) diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 5eea4a0ff..49151b99a 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -617,14 +617,14 @@ addressmap_ent_remove(const char *address, addressmap_entry_t *ent) void addressmap_clear_configured(void) { - addressmap_get_mappings(NULL, 0, 0); + addressmap_get_mappings(NULL, 0, 0, 0); } /** Remove all entries from the addressmap that are set to expire, ever. */ void addressmap_clear_transient(void) { - addressmap_get_mappings(NULL, 2, TIME_MAX); + addressmap_get_mappings(NULL, 2, TIME_MAX, 0); } /** Clean out entries from the addressmap cache that were @@ -633,7 +633,7 @@ addressmap_clear_transient(void) void addressmap_clean(time_t now) { - addressmap_get_mappings(NULL, 2, now); + addressmap_get_mappings(NULL, 2, now, 0); } /** Free all the elements in the addressmap, and free the addressmap @@ -1136,12 +1136,13 @@ address_is_invalid_destination(const char *address, int client) /** Iterate over all address mappings which have expiry times between * min_expires and max_expires, inclusive. If sl is provided, add an - * "old-addr new-addr" string to sl for each mapping. If sl is NULL, - * remove the mappings. + * "old-addr new-addr expiry" string to sl for each mapping, omitting + * the expiry time if want_expiry is false. If sl is NULL, remove the + * mappings. */ void addressmap_get_mappings(smartlist_t *sl, time_t min_expires, - time_t max_expires) + time_t max_expires, int want_expiry) { strmap_iter_t *iter; const char *key; @@ -1160,9 +1161,20 @@ addressmap_get_mappings(smartlist_t *sl, time_t min_expires, addressmap_ent_remove(key, val); continue; } else if (val->new_address) { - size_t len = strlen(key)+strlen(val->new_address)+2; + size_t len = strlen(key)+strlen(val->new_address)+ISO_TIME_LEN+5; char *line = tor_malloc(len); - tor_snprintf(line, len, "%s %s", key, val->new_address); + if (want_expiry) { + if (val->expires < 3 || val->expires == TIME_MAX) + tor_snprintf(line, len, "%s %s NEVER", key, val->new_address); + else { + char time[ISO_TIME_LEN+1]; + format_local_iso_time(time, val->expires); + tor_snprintf(line, len, "%s %s \"%s\"", key, val->new_address, + time); + } + } else { + tor_snprintf(line, len, "%s %s", key, val->new_address); + } smartlist_add(sl, line); } } diff --git a/src/or/control.c b/src/or/control.c index f103982e0..775dda3c3 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -1457,22 +1457,28 @@ getinfo_helper_events(control_connection_t *control_conn, *answer = smartlist_join_strings(status, "\r\n", 0, NULL); SMARTLIST_FOREACH(status, char *, cp, tor_free(cp)); smartlist_free(status); - } else if (!strcmpstart(question, "addr-mappings/")) { + } else if (!strcmpstart(question, "addr-mappings/") || + !strcmpstart(question, "address-mappings/")) { + /* XXXX020 Warn about deprecated addr-mappings variant? Or wait for + * 0.2.1.x? */ time_t min_e, max_e; smartlist_t *mappings; - if (!strcmp(question, "addr-mappings/all")) { + int want_expiry = !strcmpstart(question, "address-mappings/"); + question += strlen(want_expiry ? "address-mappings/" + : "addr-mappings/"); + if (!strcmp(question, "all")) { min_e = 0; max_e = TIME_MAX; - } else if (!strcmp(question, "addr-mappings/cache")) { + } else if (!strcmp(question, "cache")) { min_e = 2; max_e = TIME_MAX; - } else if (!strcmp(question, "addr-mappings/config")) { + } else if (!strcmp(question, "config")) { min_e = 0; max_e = 0; - } else if (!strcmp(question, "addr-mappings/control")) { + } else if (!strcmp(question, "control")) { min_e = 1; max_e = 1; } else { return 0; } mappings = smartlist_create(); - addressmap_get_mappings(mappings, min_e, max_e); + addressmap_get_mappings(mappings, min_e, max_e, want_expiry); *answer = smartlist_join_strings(mappings, "\r\n", 0, NULL); SMARTLIST_FOREACH(mappings, char *, cp, tor_free(cp)); smartlist_free(mappings); @@ -1587,11 +1593,20 @@ static const getinfo_item_t getinfo_items[] = { ITEM("circuit-status", events, "List of current circuits originating here."), ITEM("stream-status", events,"List of current streams."), ITEM("orconn-status", events, "A list of current OR connections."), + PREFIX("address-mappings/", events, NULL), + DOC("address-mappings/all", "Current address mappings."), + DOC("address-mappings/cache", "Current cached DNS replies."), + DOC("address-mappings/config", + "Current address mappings from configuration."), + DOC("address-mappings/control", "Current address mappings from controller."), PREFIX("addr-mappings/", events, NULL), - DOC("addr-mappings/all", "Current address mappings."), - DOC("addr-mappings/cache", "Current cached DNS replies."), - DOC("addr-mappings/config", "Current address mappings from configuration."), - DOC("addr-mappings/control", "Current address mappings from controller."), + DOC("addr-mappings/all", "Current address mappings without expiry times."), + DOC("addr-mappings/cache", + "Current cached DNS replies without expiry times."), + DOC("addr-mappings/config", + "Current address mappings from configuration without expiry times."), + DOC("addr-mappings/control", + "Current address mappings from controller without expiry times."), PREFIX("status/", events, NULL), DOC("status/circuit-established", "Whether we think client functionality is working."), diff --git a/src/or/or.h b/src/or/or.h index 03b2d97e7..b14f687ba 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2511,7 +2511,7 @@ void client_dns_set_addressmap(const char *address, uint32_t val, int address_is_in_virtual_range(const char *addr); const char *addressmap_register_virtual_address(int type, char *new_address); void addressmap_get_mappings(smartlist_t *sl, time_t min_expires, - time_t max_expires); + time_t max_expires, int want_expiry); int connection_ap_handshake_rewrite_and_attach(edge_connection_t *conn, origin_circuit_t *circ, crypt_path_t *cpath);