X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fgns%2Fgnunet-service-gns_resolver.c;h=7258f97a145db1d532cbae4ff7b4955ebdffe7c2;hb=9062e2e68f6675e65d45a1cc0d4cf7beac1ab007;hp=1f103f4213d4711af2984f8a747cbeb576ca5b38;hpb=f5ace9e5e65381e94c50a57df200503894fda2a0;p=oweals%2Fgnunet.git diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index 1f103f421..7258f97a1 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c @@ -19,8 +19,6 @@ */ /** - * - * * @file gns/gnunet-service-gns_resolver.c * @brief GNUnet GNS resolver logic * @author Martin Schanzenbach @@ -143,28 +141,36 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg; */ static unsigned long long rid = 0; +/* + * Check if name is in srv format (_x._y.xxx) + * + * @param name + * @return GNUNET_YES if true + */ static int is_srv (char* name) { char* ndup; - int ret = 1; + int ret = GNUNET_YES; if (*name != '_') - return 0; + return GNUNET_NO; if (NULL == strstr (name, "._")) - return 0; + return GNUNET_NO; ndup = GNUNET_strdup (name); strtok (ndup, "."); if (NULL == strtok (NULL, ".")) - ret = 0; + ret = GNUNET_NO; if (NULL == strtok (NULL, ".")) - ret = 0; + ret = GNUNET_NO; if (NULL != strtok (NULL, ".")) - ret = 0; + ret = GNUNET_NO; + + GNUNET_free (ndup); return ret; } @@ -176,10 +182,10 @@ is_srv (char* name) * a = canonical * * @param name the name to test - * @return 1 if canonical + * @return GNUNET_YES if canonical */ static int -is_canonical(char* name) +is_canonical (char* name) { char* ndup; char* tok; @@ -195,10 +201,10 @@ is_canonical(char* name) if (*tok == '_') continue; GNUNET_free (ndup); - return 0; + return GNUNET_NO; } GNUNET_free (ndup); - return 1; + return GNUNET_YES; } @@ -906,6 +912,9 @@ free_resolver_handle (struct ResolverHandle* rh) GNUNET_NETWORK_socket_close (rh->dns_sock); if (NULL != rh->dns_resolver_handle) GNUNET_RESOLVER_request_cancel (rh->dns_resolver_handle); + + if (NULL != rh->rd.data) + GNUNET_free ((void*)(rh->rd.data)); GNUNET_free(rh); } @@ -1094,7 +1103,7 @@ dht_lookup_timeout(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) rh->private_local_zone, rlh->record_type, new_name, - rh->priv_key, + NULL, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_NO, &background_lookup_result_processor, @@ -1878,7 +1887,8 @@ resolve_record_dns (struct ResolverHandle *rh, rh->timeout_task = GNUNET_SCHEDULER_NO_TASK; } /* Start shortening */ - if ((rh->priv_key != NULL) && is_canonical (rh->name)) + if ((rh->priv_key != NULL) && + (is_canonical (rh->name) == GNUNET_YES)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_REC_DNS-%llu: Trying to shorten authority chain\n", @@ -1997,7 +2007,8 @@ resolve_record_vpn (struct ResolverHandle *rh, rh->timeout_task = GNUNET_SCHEDULER_NO_TASK; } /* Start shortening */ - if ((rh->priv_key != NULL) && is_canonical (rh->name)) + if ((rh->priv_key != NULL) && + (is_canonical (rh->name) == GNUNET_YES)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_REC_VPN-%llu: Trying to shorten authority chain\n", @@ -2083,7 +2094,8 @@ resolve_record_ns(struct ResolverHandle *rh) rh->timeout_task = GNUNET_SCHEDULER_NO_TASK; } /* Start shortening */ - if ((rh->priv_key != NULL) && is_canonical (rh->name)) + if ((rh->priv_key != NULL) && + (is_canonical (rh->name) == GNUNET_YES)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_REC-%llu: Trying to shorten authority chain\n", @@ -2173,7 +2185,7 @@ dht_authority_lookup_timeout(void *cls, rh->private_local_zone, rlh->record_type, new_name, - rh->priv_key, + NULL, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_NO, &background_lookup_result_processor, @@ -2260,7 +2272,7 @@ process_pkey_revocation_result_ns (void *cls, rh->private_local_zone, GNUNET_GNS_RECORD_REV, GNUNET_GNS_TLD, - rh->priv_key, + NULL, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_NO, &background_lookup_result_processor, @@ -2275,9 +2287,10 @@ process_pkey_revocation_result_ns (void *cls, * else resolve again with new authority */ if (strcmp (rh->name, "") == 0) - rh->proc (rh->proc_cls, rh, 0, NULL); + rh->proc (rh->proc_cls, rh, rh->rd_count, &rh->rd); else resolve_delegation_ns (rh); + return; } @@ -2447,6 +2460,14 @@ process_delegation_result_dht(void* cls, rh->authority_chain_tail, auth); + if (NULL != rh->rd.data) + GNUNET_free ((void*)rh->rd.data); + + memcpy (&rh->rd, &rd[i], sizeof (struct GNUNET_NAMESTORE_RecordData)); + rh->rd.data = GNUNET_malloc (rd[i].data_size); + memcpy ((void*)(rh->rd.data), rd[i].data, rd[i].data_size); + rh->rd_count = 1; + /** try to import pkey if private key available */ //if (rh->priv_key && is_canonical (rh->name)) // process_discovered_authority(name, auth->zone, @@ -2508,7 +2529,8 @@ process_delegation_result_dht(void* cls, if (strcmp(rh->name, "") == 0) { /* Start shortening */ - if ((rh->priv_key != NULL) && is_canonical (rh->name)) + if ((rh->priv_key != NULL) && + (is_canonical (rh->name) == GNUNET_YES)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_DHT-%llu: Trying to shorten authority chain\n", @@ -2520,6 +2542,7 @@ process_delegation_result_dht(void* cls, else rh->proc = &handle_delegation_ns; + /* Check for key revocation and delegate */ rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle, &rh->authority, @@ -2795,7 +2818,7 @@ handle_record_ns (void* cls, struct ResolverHandle *rh, &rh->private_local_zone)) check_dht = GNUNET_NO; - if ((strcmp (rh->name, "+") != 0) && (is_srv (rh->name) != 0)) + if ((strcmp (rh->name, "+") != 0) && (is_srv (rh->name) == GNUNET_YES)) check_dht = GNUNET_NO; @@ -2835,7 +2858,7 @@ pop_tld(char* name, char* dest) { uint32_t len; - if (is_canonical (name)) + if (is_canonical (name) == GNUNET_YES) { strcpy(dest, name); strcpy(name, ""); @@ -2924,7 +2947,7 @@ handle_delegation_dht(void* cls, struct ResolverHandle *rh, /** * we still have some left **/ - if (is_canonical(rh->name)) + if (is_canonical (rh->name) == GNUNET_YES) { GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_DHT-%llu: Resolving canonical record %s in ns\n", @@ -3147,7 +3170,6 @@ handle_delegation_ns (void* cls, struct ResolverHandle *rh, } else if (rlh->record_type == GNUNET_GNS_RECORD_PKEY) { - GNUNET_assert(rd_count == 1); GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_NS-%llu: Resolved queried PKEY in NS.\n", rh->id); @@ -3204,7 +3226,7 @@ handle_delegation_ns (void* cls, struct ResolverHandle *rh, if (check_dht == GNUNET_NO) { - if (is_canonical(rh->name)) + if (is_canonical (rh->name) == GNUNET_YES) { GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_NS-%llu: Resolving canonical record %s\n", @@ -3432,7 +3454,13 @@ process_delegation_result_ns (void* cls, GNUNET_CONTAINER_DLL_insert (rh->authority_chain_head, rh->authority_chain_tail, auth); + if (NULL != rh->rd.data) + GNUNET_free ((void*)(rh->rd.data)); + memcpy (&rh->rd, &rd[i], sizeof (struct GNUNET_NAMESTORE_RecordData)); + rh->rd.data = GNUNET_malloc (rd[i].data_size); + memcpy ((void*)rh->rd.data, rd[i].data, rd[i].data_size); + rh->rd_count = 1; /* Check for key revocation and delegate */ rh->namestore_task = GNUNET_NAMESTORE_lookup_record (namestore_handle, &rh->authority, @@ -3453,10 +3481,11 @@ process_delegation_result_ns (void* cls, * If we have found some records for the LAST label * we return the results. Else null. */ - if (strcmp(rh->name, "") == 0) + if (strcmp (rh->name, "") == 0) { /* Start shortening */ - if ((rh->priv_key != NULL) && is_canonical (rh->name)) + if ((rh->priv_key != NULL) && + (is_canonical (rh->name) == GNUNET_YES)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_DELEGATE_NS-%llu: Trying to shorten authority chain\n", @@ -3465,15 +3494,18 @@ process_delegation_result_ns (void* cls, rh->priv_key); } /* simply promote back */ - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "GNS_PHASE_DELEGATE_NS-%llu: Promoting %s back to name\n", - rh->id, rh->authority_name); - strcpy(rh->name, rh->authority_name); - rh->proc(rh->proc_cls, rh, rd_count, rd); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "GNS_PHASE_DELEGATE_NS-%llu: Promoting %s back to name\n", + rh->id, rh->authority_name); + strcpy (rh->name, rh->authority_name); + rh->proc (rh->proc_cls, rh, rd_count, rd); } else { - rh->proc(rh->proc_cls, rh, 0, NULL); + GNUNET_snprintf (new_name, MAX_DNS_NAME_LENGTH, + "%s.%s", rh->name, rh->authority_name); + strcpy (rh->name, new_name); + rh->proc (rh->proc_cls, rh, 0, NULL); } } @@ -3536,7 +3568,8 @@ gns_resolver_lookup_record (struct GNUNET_CRYPTO_ShortHashCode zone, name, record_type); - if (is_canonical((char*)name) && (strcmp(GNUNET_GNS_TLD, name) != 0)) + if ((is_canonical ((char*)name) == GNUNET_YES) && + (strcmp(GNUNET_GNS_TLD, name) != 0)) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%s is canonical and not gnunet -> cannot resolve!\n", name); @@ -3557,6 +3590,7 @@ gns_resolver_lookup_record (struct GNUNET_CRYPTO_ShortHashCode zone, rh->private_local_zone = pzone; rh->only_cached = only_cached; rh->namestore_task = NULL; + rh->rd.data = NULL; GNUNET_CONTAINER_DLL_insert (rlh_head, rlh_tail, rh); @@ -3647,6 +3681,8 @@ gns_resolver_lookup_record (struct GNUNET_CRYPTO_ShortHashCode zone, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot handle this TLD %s\n", string_hash); + if (GNUNET_SCHEDULER_NO_TASK != rh->timeout_task) + GNUNET_SCHEDULER_cancel (rh->timeout_task); GNUNET_CONTAINER_DLL_remove (rlh_head, rlh_tail, rh); GNUNET_free (rh); GNUNET_free (rlh); @@ -4266,7 +4302,7 @@ gns_resolver_shorten_name (struct GNUNET_CRYPTO_ShortHashCode *zone, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting shorten for %s!\n", name); - if (is_canonical ((char*)name)) + if (is_canonical ((char*)name) == GNUNET_YES) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%s is canonical. Returning verbatim\n", name); @@ -4340,7 +4376,7 @@ gns_resolver_shorten_name (struct GNUNET_CRYPTO_ShortHashCode *zone, return; } - else + else if (is_gnunet_tld (name) == GNUNET_YES) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "TLD is gnunet\n"); @@ -4352,6 +4388,15 @@ gns_resolver_shorten_name (struct GNUNET_CRYPTO_ShortHashCode *zone, memcpy (rh->name, name, strlen (name)-strlen (GNUNET_GNS_TLD) - 1); } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Unknown TLD in %s\n", name); + GNUNET_free (rh); + GNUNET_free (nsh); + GNUNET_CONTAINER_DLL_remove (nsh_head, nsh_tail, rh); + proc (proc_cls, name); + return; + } rh->authority_chain_head = GNUNET_malloc (sizeof (struct AuthorityChain)); rh->authority_chain_tail = rh->authority_chain_head; @@ -4415,7 +4460,7 @@ handle_delegation_result_ns_get_auth(void* cls, GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Building response!\n"); - if (is_canonical(rh->name)) + if (is_canonical (rh->name) == GNUNET_YES) { /** * We successfully resolved the authority in the ns