diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-08-13 17:32:35 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-08-13 17:32:35 +0000 |
commit | 41d573de1a9bd510a15ec971762c0d7dc77f2901 (patch) | |
tree | d0e0249f5a7675d374562fd3ad129c5dac027b04 /src/gns/gnunet-service-gns.c | |
parent | f76eea97484af4869b1c3aa96459bc7860634444 (diff) |
-simplifying GNS API
Diffstat (limited to 'src/gns/gnunet-service-gns.c')
-rw-r--r-- | src/gns/gnunet-service-gns.c | 563 |
1 files changed, 4 insertions, 559 deletions
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c index e1fc507fb1..822cc7d12c 100644 --- a/src/gns/gnunet-service-gns.c +++ b/src/gns/gnunet-service-gns.c @@ -62,98 +62,6 @@ /** - * Handle to a shorten operation from api - */ -struct ClientShortenHandle -{ - - /** - * List for all shorten requests - */ - struct ClientShortenHandle *next; - - /** - * List for all shorten requests - */ - struct ClientShortenHandle *prev; - - /** - * Handle to the requesting client - */ - struct GNUNET_SERVER_Client *client; - - /** - * Namestore lookup task - */ - struct GNUNET_NAMESTORE_QueueEntry *namestore_task; - - /** - * master zone - */ - struct GNUNET_CRYPTO_ShortHashCode root_zone; - - /** - * private zone - */ - struct GNUNET_CRYPTO_ShortHashCode private_zone; - - /** - * shorten zone - */ - struct GNUNET_CRYPTO_ShortHashCode shorten_zone; - - /** - * The request id - */ - uint32_t request_id; - - /** - * request type - */ - int type; - - /** - * name to shorten - */ - char name[GNUNET_DNSPARSER_MAX_NAME_LENGTH]; - - /** - * name of private zone (relative to root) - */ - char private_zone_id[GNUNET_DNSPARSER_MAX_NAME_LENGTH]; - - /** - * name of shorten zone (relative to root) - */ - char shorten_zone_id[GNUNET_DNSPARSER_MAX_NAME_LENGTH]; - -}; - - -/** - * Handle to a get authority operation from api - */ -struct ClientGetAuthHandle -{ - /** - * Handle to the requesting client - */ - struct GNUNET_SERVER_Client *client; - - /** - * name to lookup authority - */ - char *name; - - /** - * request id - */ - uint32_t request_id; - -}; - - -/** * Handle to a lookup operation from api */ struct ClientLookupHandle @@ -278,16 +186,6 @@ static int v6_enabled; static int v4_enabled; /** - * List for shorten requests - */ -static struct ClientShortenHandle *csh_head; - -/** - * List for shorten requests - */ -static struct ClientShortenHandle *csh_tail; - -/** * Handle to the statistics service */ static struct GNUNET_STATISTICS_Handle *statistics; @@ -306,11 +204,6 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Shutting down!\n"); - while (NULL != (csh_tmp = csh_head)) - { - GNUNET_CONTAINER_DLL_remove (csh_head, csh_tail, csh_tmp); - GNUNET_free (csh_tmp); - } GNUNET_SERVER_notification_context_destroy (nc); gns_interceptor_stop (); gns_resolver_cleanup (); @@ -581,433 +474,6 @@ publish_zone_dht_start (void *cls, /** - * Send shorten response back to client - * - * @param cls the closure containing a client shorten handle - * @param name the shortened name result or NULL if cannot be shortened - */ -static void -send_shorten_response (void* cls, const char* name) -{ - struct ClientShortenHandle *csh = cls; - struct GNUNET_GNS_ClientShortenResultMessage *rmsg; - size_t name_len; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending `%s' message with %s\n", - "SHORTEN_RESULT", name); - if (NULL == name) - name_len = 0; - else - name_len = strlen (name) + 1; - GNUNET_STATISTICS_update (statistics, - "Name shorten results", 1, GNUNET_NO); - - rmsg = GNUNET_malloc (sizeof (struct GNUNET_GNS_ClientShortenResultMessage) + - name_len); - - rmsg->id = csh->request_id; - rmsg->header.type = htons(GNUNET_MESSAGE_TYPE_GNS_SHORTEN_RESULT); - rmsg->header.size = - htons(sizeof(struct GNUNET_GNS_ClientShortenResultMessage) + - name_len); - memcpy (&rmsg[1], name, name_len); - GNUNET_SERVER_notification_context_unicast (nc, csh->client, - &rmsg->header, - GNUNET_NO); - if (NULL != csh->namestore_task) - GNUNET_NAMESTORE_cancel (csh->namestore_task); - GNUNET_free (rmsg); - GNUNET_free (csh); -} - - -/** - * Lookup the zone infos and shorten name - * - * @param cls the client shorten handle - * @param key key of the zone - * @param expiration expiration of record - * @param name name found or null if no result - * @param rd_count number of records found - * @param rd record data - * @param signature - * - */ -static void -process_shorten_in_private_zone_lookup (void *cls, - const struct GNUNET_CRYPTO_EccPublicKey *key, - struct GNUNET_TIME_Absolute expiration, - const char *name, - unsigned int rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd, - const struct GNUNET_CRYPTO_EccSignature *signature) -{ - struct ClientShortenHandle *csh = cls; - struct GNUNET_CRYPTO_ShortHashCode *szone = &csh->shorten_zone; - struct GNUNET_CRYPTO_ShortHashCode *pzone = &csh->private_zone; - - csh->namestore_task = NULL; - if (0 == strcmp (csh->private_zone_id, "")) - pzone = NULL; - if (0 == rd_count) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "No shorten zone in private zone!\n"); - strcpy (csh->shorten_zone_id, ""); - szone = NULL; - } - else - { - GNUNET_break (1 == rd_count); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Shorten zone %s found in private zone %s\n", - name, csh->private_zone_id); - - sprintf (csh->shorten_zone_id, "%s.%s", name, csh->private_zone_id); - } - GNUNET_CONTAINER_DLL_remove (csh_head, csh_tail, csh); - gns_resolver_shorten_name (&csh->root_zone, - pzone, - szone, - csh->name, - csh->private_zone_id, - csh->shorten_zone_id, - &send_shorten_response, csh); - -} - - -/** - * Lookup the zone infos and shorten name - * - * @param cls the shorten handle - * @param key key of the zone - * @param expiration expiration of record - * @param name name found or null if no result - * @param rd_count number of records found - * @param rd record data - * @param signature - * - */ -static void -process_shorten_in_root_zone_lookup (void *cls, - const struct GNUNET_CRYPTO_EccPublicKey *key, - struct GNUNET_TIME_Absolute expiration, - const char *name, - unsigned int rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd, - const struct GNUNET_CRYPTO_EccSignature *signature) -{ - struct ClientShortenHandle *csh = cls; - struct GNUNET_CRYPTO_ShortHashCode *szone = &csh->shorten_zone; - struct GNUNET_CRYPTO_ShortHashCode *pzone = &csh->private_zone; - - csh->namestore_task = NULL; - if (0 == strcmp (csh->private_zone_id, "")) - pzone = NULL; - if (0 == rd_count) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "No shorten zone in zone and no private zone!\n"); - - strcpy (csh->shorten_zone_id, ""); - GNUNET_CONTAINER_DLL_remove (csh_head, csh_tail, csh); - szone = NULL; - gns_resolver_shorten_name (&csh->root_zone, - pzone, - szone, - csh->name, - csh->private_zone_id, - csh->shorten_zone_id, - &send_shorten_response, csh); - return; - } - GNUNET_break (rd_count == 1); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Private zone %s found in root zone\n", name); - strcpy (csh->private_zone_id, name); - csh->namestore_task = GNUNET_NAMESTORE_zone_to_name (namestore_handle, - pzone, - szone, - &process_shorten_in_private_zone_lookup, - csh); -} - - -/** - * Lookup the zone infos and shorten name - * - * @param cls the shorten handle - * @param key key of the zone - * @param expiration expiration of record - * @param name name found or null if no result - * @param rd_count number of records found - * @param rd record data - * @param signature - */ -static void -process_private_in_root_zone_lookup (void *cls, - const struct GNUNET_CRYPTO_EccPublicKey *key, - struct GNUNET_TIME_Absolute expiration, - const char *name, - unsigned int rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd, - const struct GNUNET_CRYPTO_EccSignature *signature) -{ - struct ClientShortenHandle *csh = cls; - - csh->namestore_task = NULL; - if (0 == rd_count) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "No private zone in root zone\n"); - strcpy (csh->private_zone_id, ""); - csh->namestore_task = GNUNET_NAMESTORE_zone_to_name (namestore_handle, - &csh->root_zone, - &csh->shorten_zone, - &process_shorten_in_root_zone_lookup, - csh); - return; - } - GNUNET_break (1 == rd_count); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Private zone `%s' found in root zone\n", - name); - strcpy (csh->private_zone_id, name); - csh->namestore_task = GNUNET_NAMESTORE_zone_to_name (namestore_handle, - &csh->private_zone, - &csh->shorten_zone, - &process_shorten_in_private_zone_lookup, - csh); -} - - -/** - * Handle a shorten message from the api - * - * @param cls the closure (unused) - * @param client the client - * @param message the message - */ -static void -handle_shorten (void *cls, - struct GNUNET_SERVER_Client * client, - const struct GNUNET_MessageHeader * message) -{ - struct ClientShortenHandle *csh; - const char *utf_in; - char name[GNUNET_DNSPARSER_MAX_NAME_LENGTH]; - char* nameptr = name; - uint16_t msg_size; - const struct GNUNET_GNS_ClientShortenMessage *sh_msg; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message\n", "SHORTEN"); - msg_size = ntohs (message->size); - if (msg_size < sizeof (struct GNUNET_GNS_ClientShortenMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - sh_msg = (const struct GNUNET_GNS_ClientShortenMessage *) message; - utf_in = (const char *) &sh_msg[1]; - if ('\0' != utf_in[msg_size - sizeof (struct GNUNET_GNS_ClientShortenMessage) - 1]) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - csh = GNUNET_malloc(sizeof (struct ClientShortenHandle)); - csh->client = client; - csh->request_id = sh_msg->id; - GNUNET_CONTAINER_DLL_insert (csh_head, csh_tail, csh); - GNUNET_STRINGS_utf8_tolower (utf_in, &nameptr); - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "SHORTEN: Converted `%s' to `%s'\n", - utf_in, - nameptr); - GNUNET_SERVER_notification_context_add (nc, client); - if (strlen (name) < strlen (GNUNET_GNS_TLD)) - { - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "SHORTEN: %s is too short\n", name); - GNUNET_CONTAINER_DLL_remove (csh_head, csh_tail, csh); - send_shorten_response(csh, name); - GNUNET_SERVER_receive_done (client, GNUNET_OK); - return; - } - if (strlen (name) > GNUNET_DNSPARSER_MAX_NAME_LENGTH) - { - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "SHORTEN: %s is too long\n", name); - GNUNET_CONTAINER_DLL_remove (csh_head, csh_tail, csh); - send_shorten_response(csh, name); - GNUNET_SERVER_receive_done (client, GNUNET_OK); - return; - } - if ( (! is_gads_tld (name)) && - (! is_zkey_tld (name)) ) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "%s is not our domain. Returning\n", name); - GNUNET_CONTAINER_DLL_remove (csh_head, csh_tail, csh); - send_shorten_response (csh, name); - GNUNET_SERVER_receive_done (client, GNUNET_OK); - return; - } - csh->shorten_zone = sh_msg->shorten_zone; - csh->private_zone = sh_msg->private_zone; - strcpy (csh->name, name); - if (1 == ntohl(sh_msg->use_default_zone)) - csh->root_zone = zone_hash; //Default zone - else - csh->root_zone = sh_msg->zone; - csh->namestore_task = GNUNET_NAMESTORE_zone_to_name (namestore_handle, - &csh->root_zone, - &csh->private_zone, - &process_private_in_root_zone_lookup, - csh); - GNUNET_STATISTICS_update (statistics, - "Name shorten attempts", 1, GNUNET_NO); - GNUNET_SERVER_receive_done (client, GNUNET_OK); -} - - -/** - * Send get authority response back to client - * - * @param cls the closure containing a client get auth handle - * @param name the name of the authority, or NULL on error - */ -static void -send_get_auth_response (void *cls, - const char* name) -{ - struct ClientGetAuthHandle *cah = cls; - struct GNUNET_GNS_ClientGetAuthResultMessage *rmsg; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending `%s' message with `%s'\n", - "GET_AUTH_RESULT", name); - if (NULL != name) - { - GNUNET_STATISTICS_update (statistics, - "Authorities resolved", 1, GNUNET_NO); - } - if (NULL == name) - name = ""; - rmsg = GNUNET_malloc (sizeof (struct GNUNET_GNS_ClientGetAuthResultMessage) - + strlen (name) + 1); - - rmsg->id = cah->request_id; - rmsg->header.type = htons(GNUNET_MESSAGE_TYPE_GNS_GET_AUTH_RESULT); - rmsg->header.size = - htons(sizeof(struct GNUNET_GNS_ClientGetAuthResultMessage) + - strlen (name) + 1); - strcpy ((char*)&rmsg[1], name); - - GNUNET_SERVER_notification_context_unicast (nc, cah->client, - &rmsg->header, - GNUNET_NO); - GNUNET_SERVER_receive_done (cah->client, GNUNET_OK); - GNUNET_free(rmsg); - GNUNET_free_non_null(cah->name); - GNUNET_free(cah); -} - - -/** - * Handle a get authority message from the api - * - * @param cls the closure - * @param client the client - * @param message the message - */ -static void -handle_get_authority (void *cls, - struct GNUNET_SERVER_Client * client, - const struct GNUNET_MessageHeader * message) -{ - struct ClientGetAuthHandle *cah; - const char *utf_in; - char name[GNUNET_DNSPARSER_MAX_NAME_LENGTH]; - char* nameptr = name; - uint16_t msg_size; - const struct GNUNET_GNS_ClientGetAuthMessage *sh_msg; - - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Received `%s' message\n", "GET_AUTH"); - msg_size = ntohs(message->size); - if (msg_size < sizeof (struct GNUNET_GNS_ClientGetAuthMessage)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - GNUNET_SERVER_notification_context_add (nc, client); - sh_msg = (const struct GNUNET_GNS_ClientGetAuthMessage *) message; - utf_in = (const char *) &sh_msg[1]; - if ('\0' != utf_in[msg_size - sizeof (struct GNUNET_GNS_ClientGetAuthMessage) - 1]) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); - return; - } - GNUNET_STRINGS_utf8_tolower(utf_in, &nameptr); - cah = GNUNET_malloc(sizeof(struct ClientGetAuthHandle)); - cah->client = client; - cah->request_id = sh_msg->id; - if (strlen (name) < strlen(GNUNET_GNS_TLD)) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "GET_AUTH: `%s' is too short. Returning\n", name); - cah->name = NULL; - send_get_auth_response(cah, name); - return; - } - if (strlen (name) > GNUNET_DNSPARSER_MAX_NAME_LENGTH) - { - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "GET_AUTH: `%s' is too long", name); - cah->name = NULL; - send_get_auth_response(cah, name); - return; - } - if (0 != strcmp (name + strlen (name) - strlen (GNUNET_GNS_TLD), - GNUNET_GNS_TLD)) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "GET_AUTH: %s is not our domain. Returning\n", name); - cah->name = NULL; - send_get_auth_response (cah, name); - return; - } - - if (0 == strcmp (name, GNUNET_GNS_TLD)) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "GET_AUTH: %s is us. Returning\n", name); - cah->name = NULL; - send_get_auth_response(cah, name); - return; - } - - cah->name = GNUNET_malloc (strlen (name) - - strlen (GNUNET_GNS_TLD) + 1); - memcpy (cah->name, name, - strlen (name) - strlen (GNUNET_GNS_TLD)); - - /* Start delegation resolution in our namestore */ - gns_resolver_get_authority (zone_hash, zone_hash, name, - &send_get_auth_response, cah); - GNUNET_STATISTICS_update (statistics, - "Authority lookup attempts", 1, GNUNET_NO); -} - - -/** * Reply to client with the result from our lookup. * * @param cls the closure (our client lookup handle) @@ -1187,11 +653,9 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, const struct GNUNET_CONFIGURATION_Handle *c) { static const struct GNUNET_SERVER_MessageHandler handlers[] = { - {&handle_shorten, NULL, GNUNET_MESSAGE_TYPE_GNS_SHORTEN, 0}, - {&handle_lookup, NULL, GNUNET_MESSAGE_TYPE_GNS_LOOKUP, 0}, - {&handle_get_authority, NULL, GNUNET_MESSAGE_TYPE_GNS_GET_AUTH, 0} + { &handle_lookup, NULL, GNUNET_MESSAGE_TYPE_GNS_LOOKUP, 0}, + {NULL, NULL, 0, 0} }; - char* keyfile; struct GNUNET_CRYPTO_EccPublicKey pkey; unsigned long long max_parallel_bg_queries = 0; int ignore_pending = GNUNET_NO; @@ -1199,24 +663,6 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, v6_enabled = GNUNET_NETWORK_test_pf (PF_INET6); v4_enabled = GNUNET_NETWORK_test_pf (PF_INET); - if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (c, "gns", - "ZONEKEY", &keyfile)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "No private key for root zone specified!\n"); - GNUNET_SCHEDULER_shutdown (); - return; - } - - GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, - "Using keyfile %s for root zone.\n", keyfile); - - zone_key = GNUNET_CRYPTO_ecc_key_create_from_file (keyfile); - GNUNET_CRYPTO_ecc_key_get_public (zone_key, &pkey); - GNUNET_CRYPTO_short_hash (&pkey, - sizeof(struct GNUNET_CRYPTO_EccPublicKey), - &zone_hash); - GNUNET_free(keyfile); namestore_handle = GNUNET_NAMESTORE_connect (c); if (NULL == namestore_handle) { @@ -1313,9 +759,8 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, } /** - * Schedule periodic put - * for our records - * We have roughly an hour for all records; + * Schedule periodic put for our records We have roughly an hour for + * all records; */ first_zone_iteration = GNUNET_YES; zone_publish_task = GNUNET_SCHEDULER_add_now (&publish_zone_dht_start, NULL); |