From: Martin Schanzenbach Date: Thu, 21 Jun 2012 15:19:45 +0000 (+0000) Subject: -fix cnames #2448 X-Git-Tag: initial-import-from-subversion-38251~12897 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=1980c195fb4b84015ffc65d5a107e30a19bb0daa;p=oweals%2Fgnunet.git -fix cnames #2448 --- diff --git a/src/gns/gns.h b/src/gns/gns.h index e34d0a086..e856a3312 100644 --- a/src/gns/gns.h +++ b/src/gns/gns.h @@ -30,6 +30,7 @@ #define GNUNET_GNS_TLD "gnunet" #define GNUNET_GNS_TLD_ZKEY "zkey" +#define GNUNET_GNS_TLD_PLUS "+" #define GNUNET_GNS_DHT_MAX_UPDATE_INTERVAL 3600 #define MAX_DNS_LABEL_LENGTH 63 diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index cfd6be5f3..045112eae 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c @@ -2757,6 +2757,7 @@ handle_delegation_ns (void* cls, struct ResolverHandle *rh, { struct RecordLookupHandle* rlh; rlh = (struct RecordLookupHandle*) cls; + int s_len = 0; GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_NS-%llu: Resolution status: %d.\n", @@ -2783,16 +2784,44 @@ handle_delegation_ns (void* cls, struct ResolverHandle *rh, GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_NS-%llu: Resolved queried CNAME in NS.\n", rh->id); - finish_lookup(rh, rlh, rd_count, rd); - free_resolver_handle(rh); + strcpy (rh->name, rh->authority_name); + finish_lookup (rh, rlh, rd_count, rd); + free_resolver_handle (rh); return; } - /* A CNAME can only occur alone */ - GNUNET_assert (is_canonical ((char*)rd->data)); - strcpy (rh->name, rd->data); - resolve_delegation_ns (rh); - return; + /* A .+ CNAME */ + if (is_tld ((char*)rd->data, GNUNET_GNS_TLD_PLUS)) + { + s_len = strlen (rd->data) - 2; + memcpy (rh->name, rd->data, s_len); + rh->name[s_len] = '\0'; + resolve_delegation_ns (rh); + return; + } + else if (is_tld ((char*)rd->data, GNUNET_GNS_TLD_ZKEY)) + { + gns_resolver_lookup_record (rh->authority, + rh->private_local_zone, + rlh->record_type, + (char*)rd->data, + rh->priv_key, + rh->timeout, + rh->only_cached, + rlh->proc, + rlh->proc_cls); + GNUNET_free (rlh); + free_resolver_handle (rh); + return; + } + else + { + //Try DNS resolver + strcpy (rh->dns_name, (char*)rd->data); + resolve_dns_name (rh); + return; + } + } else if (rh->status & RSL_DELEGATE_VPN) { @@ -3051,9 +3080,6 @@ process_delegation_result_ns (void* cls, GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_NS-%llu: CNAME found.\n", rh->id); - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "GNS_PHASE_DELEGATE_NS-%llu: new name to resolve: %s.\n", - rh->id, rh->name); rh->status |= RSL_CNAME_FOUND; rh->proc (rh->proc_cls, rh, rd_count, rd); @@ -3219,15 +3245,15 @@ resolve_delegation_ns (struct ResolverHandle *rh) * @param cls the closure to pass to proc */ void -gns_resolver_lookup_record(struct GNUNET_CRYPTO_ShortHashCode zone, - struct GNUNET_CRYPTO_ShortHashCode pzone, - uint32_t record_type, - const char* name, - struct GNUNET_CRYPTO_RsaPrivateKey *key, - struct GNUNET_TIME_Relative timeout, - int only_cached, - RecordLookupProcessor proc, - void* cls) +gns_resolver_lookup_record (struct GNUNET_CRYPTO_ShortHashCode zone, + struct GNUNET_CRYPTO_ShortHashCode pzone, + uint32_t record_type, + const char* name, + struct GNUNET_CRYPTO_RsaPrivateKey *key, + struct GNUNET_TIME_Relative timeout, + int only_cached, + RecordLookupProcessor proc, + void* cls) { struct ResolverHandle *rh; struct RecordLookupHandle* rlh; diff --git a/src/gns/test_gns_cname_lookup.c b/src/gns/test_gns_cname_lookup.c index a925e529d..8a319f821 100644 --- a/src/gns/test_gns_cname_lookup.c +++ b/src/gns/test_gns_cname_lookup.c @@ -41,10 +41,22 @@ #define DEFAULT_NUM_PEERS 2 /* test records to resolve */ -#define TEST_DOMAIN "www.gnunet" -#define TEST_IP "127.0.0.1" -#define TEST_RECORD_NAME "server" -#define TEST_RECORD_CNAME "www" +#define TEST_DOMAIN_PLUS "www.gnunet" +#define TEST_DOMAIN_ZKEY "www2.gnunet" +#define TEST_DOMAIN_DNS "www3.gnunet" +#define TEST_IP_PLUS "127.0.0.1" +#define TEST_IP_ZKEY "127.0.0.2" +#define TEST_IP_DNS "131.159.74.67" +#define TEST_RECORD_CNAME_SERVER "server.gnunet" +#define TEST_RECORD_CNAME_PLUS "server.+" +#define TEST_RECORD_CNAME_ZKEY "www.188JSUMKEF25GVU8TTV0PBNNN8JVCPUEDFV1UHJJU884JD25V0T0.zkey" +#define TEST_RECORD_CNAME_DNS "gnunet.org" +#define TEST_RECORD_NAME_SERVER "server" +#define TEST_RECORD_NAME_PLUS "www" +#define TEST_RECORD_NAME_ZKEY "www2" +#define TEST_RECORD_NAME_DNS "www3" + +#define KEYFILE_BOB "zonefiles/188JSUMKEF25GVU8TTV0PBNNN8JVCPUEDFV1UHJJU884JD25V0T0.zkey" /* Globals */ @@ -106,10 +118,10 @@ on_lookup_result_cname (void *cls, uint32_t rd_count, if (rd[i].record_type == GNUNET_GNS_RECORD_TYPE_CNAME) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "CNAME: %s\n", rd[i].data); - if (0 == strcmp(rd[i].data, TEST_RECORD_NAME)) + if (0 == strcmp(rd[i].data, TEST_RECORD_CNAME_SERVER)) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%s correctly resolved to %s!\n", TEST_DOMAIN, rd[i].data); + "%s correctly resolved to %s!\n", TEST_DOMAIN_PLUS, rd[i].data); ok = 0; } } @@ -123,8 +135,55 @@ on_lookup_result_cname (void *cls, uint32_t rd_count, GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shutting down peer1!\n"); GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL); } + +static void +on_lookup_result_dns (void *cls, uint32_t rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd) +{ + struct in_addr a; + int i; + char* addr; + + if (rd_count == 0) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Lookup failed, rp_filtering?\n"); + ok = 2; + } + else + { + ok = 1; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "name: %s\n", (char*)cls); + for (i=0; i