{
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",
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)
{
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);
* @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;
#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 */
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;
}
}
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<rd_count; i++)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "type: %d\n", rd[i].record_type);
+ if (rd[i].record_type == GNUNET_GNS_RECORD_TYPE_A)
+ {
+ memcpy(&a, rd[i].data, sizeof(a));
+ addr = inet_ntoa(a);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "address: %s\n", addr);
+ if (0 == strcmp(addr, TEST_IP_DNS))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "%s correctly resolved to %s!\n", TEST_DOMAIN_DNS, addr);
+ ok = 0;
+ }
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No resolution!\n");
+ }
+ }
+ }
+
+ GNUNET_GNS_lookup (gns_handle, TEST_DOMAIN_PLUS, GNUNET_GNS_RECORD_TYPE_CNAME,
+ GNUNET_YES,
+ NULL,
+ &on_lookup_result_cname, TEST_DOMAIN_PLUS);
+}
+
static void
-on_lookup_result(void *cls, uint32_t rd_count,
+on_lookup_result_zkey (void *cls, uint32_t rd_count,
const struct GNUNET_NAMESTORE_RecordData *rd)
{
struct in_addr a;
memcpy(&a, rd[i].data, sizeof(a));
addr = inet_ntoa(a);
GNUNET_log (GNUNET_ERROR_TYPE_INFO, "address: %s\n", addr);
- if (0 == strcmp(addr, TEST_IP))
+ if (0 == strcmp(addr, TEST_IP_ZKEY))
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "%s correctly resolved to %s!\n", TEST_DOMAIN, addr);
+ "%s correctly resolved to %s!\n", TEST_DOMAIN_ZKEY, addr);
ok = 0;
}
}
}
}
- GNUNET_GNS_lookup(gns_handle, TEST_DOMAIN, GNUNET_GNS_RECORD_TYPE_CNAME,
+ GNUNET_GNS_lookup(gns_handle, TEST_DOMAIN_DNS, GNUNET_GNS_RECORD_TYPE_A,
GNUNET_YES,
NULL,
- &on_lookup_result_cname, TEST_DOMAIN);
+ &on_lookup_result_dns, TEST_DOMAIN_DNS);
+}
+
+static void
+on_lookup_result_plus (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<rd_count; i++)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "type: %d\n", rd[i].record_type);
+ if (rd[i].record_type == GNUNET_GNS_RECORD_TYPE_A)
+ {
+ memcpy(&a, rd[i].data, sizeof(a));
+ addr = inet_ntoa(a);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "address: %s\n", addr);
+ if (0 == strcmp(addr, TEST_IP_PLUS))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "%s correctly resolved to %s!\n", TEST_DOMAIN_PLUS, addr);
+ ok = 0;
+ }
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No resolution!\n");
+ }
+ }
+ }
+
+ GNUNET_GNS_lookup(gns_handle, TEST_DOMAIN_ZKEY, GNUNET_GNS_RECORD_TYPE_A,
+ GNUNET_YES,
+ NULL,
+ &on_lookup_result_zkey, TEST_DOMAIN_ZKEY);
}
ok = 2;
}
- GNUNET_GNS_lookup(gns_handle, TEST_DOMAIN, GNUNET_GNS_RECORD_TYPE_A,
+ GNUNET_GNS_lookup(gns_handle, TEST_DOMAIN_PLUS, GNUNET_GNS_RECORD_TYPE_A,
GNUNET_YES,
NULL,
- &on_lookup_result, TEST_DOMAIN);
+ &on_lookup_result_plus, TEST_DOMAIN_PLUS);
}
{
struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded alice_pkey;
struct GNUNET_CRYPTO_RsaPrivateKey *alice_key;
+ struct GNUNET_CRYPTO_RsaPrivateKey *bob_key;
char* alice_keyfile;
cfg = _cfg;
GNUNET_free(alice_keyfile);
+ bob_key = GNUNET_CRYPTO_rsa_key_create_from_file (KEYFILE_BOB);
+
struct GNUNET_NAMESTORE_RecordData rd;
- char* ip = TEST_IP;
+ char* ip = TEST_IP_PLUS;
struct in_addr *web = GNUNET_malloc(sizeof(struct in_addr));
rd.expiration_time = UINT64_MAX;
GNUNET_assert(1 == inet_pton (AF_INET, ip, web));
GNUNET_NAMESTORE_record_create (namestore_handle,
alice_key,
- TEST_RECORD_NAME,
+ TEST_RECORD_NAME_SERVER,
+ &rd,
+ NULL,
+ NULL);
+
+ rd.data_size = strlen (TEST_RECORD_CNAME_PLUS);
+ rd.data = TEST_RECORD_CNAME_PLUS;
+ rd.record_type = GNUNET_GNS_RECORD_TYPE_CNAME;
+
+ GNUNET_NAMESTORE_record_create (namestore_handle,
+ alice_key,
+ TEST_RECORD_NAME_PLUS,
+ &rd,
+ NULL,
+ NULL);
+
+ rd.data_size = strlen (TEST_RECORD_CNAME_ZKEY);
+ rd.data = TEST_RECORD_CNAME_ZKEY;
+ rd.record_type = GNUNET_GNS_RECORD_TYPE_CNAME;
+
+ GNUNET_NAMESTORE_record_create (namestore_handle,
+ alice_key,
+ TEST_RECORD_NAME_ZKEY,
&rd,
NULL,
NULL);
- rd.data_size = strlen (TEST_RECORD_NAME);
- rd.data = TEST_RECORD_NAME;
+ rd.data_size = strlen (TEST_RECORD_CNAME_DNS);
+ rd.data = TEST_RECORD_CNAME_DNS;
rd.record_type = GNUNET_GNS_RECORD_TYPE_CNAME;
GNUNET_NAMESTORE_record_create (namestore_handle,
alice_key,
- TEST_RECORD_CNAME,
+ TEST_RECORD_NAME_DNS,
+ &rd,
+ NULL,
+ NULL);
+
+ GNUNET_assert(1 == inet_pton (AF_INET, TEST_IP_ZKEY, web));
+ rd.data_size = sizeof(struct in_addr);
+ rd.data = web;
+ rd.record_type = GNUNET_DNSPARSER_TYPE_A;
+
+ GNUNET_NAMESTORE_record_create (namestore_handle,
+ bob_key,
+ TEST_RECORD_NAME_PLUS,
&rd,
&commence_testing,
NULL);
GNUNET_CRYPTO_rsa_key_free(alice_key);
+ GNUNET_CRYPTO_rsa_key_free(bob_key);
GNUNET_free(web);
}