summaryrefslogtreecommitdiff
path: root/src/or/connection_edge.c
diff options
context:
space:
mode:
authorRobert Hogan <robert@roberthogan.net>2010-12-13 22:13:01 +0000
committerNick Mathewson <nickm@torproject.org>2011-11-30 14:08:10 -0500
commit909e9769ece9e89ad0c4bbb558a6f8247c6a62bd (patch)
tree233006bc5a08a1d2c80ad6d43b8dda10876f4eae /src/or/connection_edge.c
parentc6d8c6baaa983aecd6a5121ec6ed8e2d9a2a24be (diff)
downloadtor-909e9769ece9e89ad0c4bbb558a6f8247c6a62bd.tar.gz
tor-909e9769ece9e89ad0c4bbb558a6f8247c6a62bd.zip
Address nickm's comments at https://trac.torproject.org/projects/tor/ticket/933#comment:4
1. Implement the following mapping rules: MapAddress a.b.c d.e.f # This is what we have now MapAddress .a.b.c d.e.f # Replaces any address ending with .a.b.c with d.e.f MapAddress .a.b.c .d.e.f # Replaces the .a.b.c at the end of any addr with .d.e.f (Note that 'a.b.c .d.e.f' is invalid, and will be rejected.) 2. Add tests for the new rules. 3. Allow proper wildcard annotation, i.e. '*.d.e' '.d.e' will still work. 4. Update addressmap_entry_t with an is_wildcard member.
Diffstat (limited to 'src/or/connection_edge.c')
-rw-r--r--src/or/connection_edge.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 4bb49c831c..2c8c9da259 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -794,6 +794,7 @@ typedef struct {
char *new_address;
time_t expires;
addressmap_entry_source_t source:3;
+ int is_wildcard:1;
short num_resolve_failures;
} addressmap_entry_t;
@@ -1037,8 +1038,12 @@ addressmap_free_all(void)
virtaddress_reversemap = NULL;
}
-/** Try to find a match for AddressMap directives that use
- * domain notation such as '.torproject.org .exitnode.exit'.
+/** Try to find a match for AddressMap expressions that use
+ * wildcard notation such as '*.c.d *.e.f' (so 'a.c.d' will map to 'a.e.f') or
+ * '*.c.d a.b.c' (so 'a.c.d' will map to a.b.c).
+ * Returns the matching entry in AddressMap or 0 if no match is found.
+ * For expressions such as '*.c.d *.e.f' the <b>address</b> 'a.c.d' will
+ * get truncated to 'a' before we return the matching AddressMap entry.
*/
static addressmap_entry_t *
addressmap_match_superdomains(char *address)
@@ -1047,13 +1052,18 @@ addressmap_match_superdomains(char *address)
const char *key;
void *_val;
addressmap_entry_t *val;
+ char *matched_domains = 0;
for (iter = strmap_iter_init(addressmap); !strmap_iter_done(iter); ) {
strmap_iter_get(iter, &key, &_val);
val = _val;
- if (key[0] == '.') { /* match end */
- if (!strcasecmpend(address, key) || !strcasecmp(address, &key[1]))
+ if (key[0] == '.') {
+ if (!strcasecmpend(address, key) || !strcasecmp(address, &key[1])) {
+ matched_domains = strstr(address, key);
+ if (val->is_wildcard && matched_domains)
+ *matched_domains = '\0';
return val;
+ }
}
iter = strmap_iter_next(addressmap,iter);
}
@@ -1073,7 +1083,6 @@ addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out)
addressmap_entry_t *ent;
int rewrites;
char *cp;
- char *s;
time_t expires = TIME_MAX;
for (rewrites = 0; rewrites < 16; rewrites++) {
@@ -1089,10 +1098,7 @@ addressmap_rewrite(char *address, size_t maxlen, time_t *expires_out)
}
cp = tor_strdup(escaped_safe_str_client(address));
- /* If the address to rewrite to is in the form '.exitnode.exit'
- then append it to the given address */
- s = strrchr(ent->new_address,'.');
- if (ent->new_address[0] == '.' && !strcmp(s+1,"exit"))
+ if (ent->is_wildcard)
strlcpy(address + strlen(address), ent->new_address,
(maxlen - strlen(address)));
else
@@ -1211,6 +1217,7 @@ addressmap_register(const char *address, char *new_address, time_t expires,
ent->expires = expires==2 ? 1 : expires;
ent->num_resolve_failures = 0;
ent->source = source;
+ ent->is_wildcard = (new_address[0] == '.') ? 1 : 0;
log_info(LD_CONFIG, "Addressmap: (re)mapped '%s' to '%s'",
safe_str_client(address),