aboutsummaryrefslogtreecommitdiff
path: root/src/gns/gnunet-service-gns.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-08-13 17:32:35 +0000
committerChristian Grothoff <christian@grothoff.org>2013-08-13 17:32:35 +0000
commit41d573de1a9bd510a15ec971762c0d7dc77f2901 (patch)
treed0e0249f5a7675d374562fd3ad129c5dac027b04 /src/gns/gnunet-service-gns.c
parentf76eea97484af4869b1c3aa96459bc7860634444 (diff)
-simplifying GNS API
Diffstat (limited to 'src/gns/gnunet-service-gns.c')
-rw-r--r--src/gns/gnunet-service-gns.c563
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);