X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fidentity%2Fidentity_api.c;h=a31086f5db88498b8288ea4f3cd347e7edfc3c0f;hb=8aa21ee7de6c4a6cb9c1e132ab4218d3d10e0e30;hp=1530aff39c3f2aa5f66c1e4109b9d16bdfda0220;hpb=5aade75659784566c4f8e3b554d98da3dfd09fd2;p=oweals%2Fgnunet.git diff --git a/src/identity/identity_api.c b/src/identity/identity_api.c index 1530aff39..a31086f5d 100644 --- a/src/identity/identity_api.c +++ b/src/identity/identity_api.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2013 Christian Grothoff (and other contributing authors) + Copyright (C) 2013 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Liceidentity as published @@ -32,7 +32,7 @@ #define LOG(kind,...) GNUNET_log_from (kind, "identity-api",__VA_ARGS__) -/** +/** * Handle for an ego. */ struct GNUNET_IDENTITY_Ego @@ -40,7 +40,7 @@ struct GNUNET_IDENTITY_Ego /** * Private key associated with this ego. */ - struct GNUNET_CRYPTO_EccPrivateKey *pk; + struct GNUNET_CRYPTO_EcdsaPrivateKey *pk; /** * Current name associated with this ego. @@ -59,7 +59,7 @@ struct GNUNET_IDENTITY_Ego }; -/** +/** * Handle for an operation with the identity service. */ struct GNUNET_IDENTITY_Operation @@ -69,7 +69,7 @@ struct GNUNET_IDENTITY_Operation * Main identity handle. */ struct GNUNET_IDENTITY_Handle *h; - + /** * We keep operations in a DLL. */ @@ -87,19 +87,19 @@ struct GNUNET_IDENTITY_Operation const struct GNUNET_MessageHeader *msg; /** - * Continuation to invoke with the result of the transmission; 'cb' + * Continuation to invoke with the result of the transmission; @e cb * will be NULL in this case. */ GNUNET_IDENTITY_Continuation cont; /** * Continuation to invoke with the result of the transmission for - * 'get' operations ('cont' will be NULL in this case). + * 'get' operations (@e cont will be NULL in this case). */ GNUNET_IDENTITY_Callback cb; /** - * Closure for 'cont' or 'cb'. + * Closure for @e cont or @e cb. */ void *cls; @@ -139,12 +139,12 @@ struct GNUNET_IDENTITY_Handle /** * Head of active operations. - */ + */ struct GNUNET_IDENTITY_Operation *op_head; /** * Tail of active operations. - */ + */ struct GNUNET_IDENTITY_Operation *op_tail; /** @@ -155,7 +155,7 @@ struct GNUNET_IDENTITY_Handle /** * Task doing exponential back-off trying to reconnect. */ - GNUNET_SCHEDULER_TaskIdentifier reconnect_task; + struct GNUNET_SCHEDULER_Task * reconnect_task; /** * Time for next connect retry. @@ -172,19 +172,19 @@ struct GNUNET_IDENTITY_Handle /** * Obtain the ego representing 'anonymous' users. - * + * * @return handle for the anonymous user, must not be freed */ const struct GNUNET_IDENTITY_Ego * GNUNET_IDENTITY_ego_get_anonymous () { static struct GNUNET_IDENTITY_Ego anon; - struct GNUNET_CRYPTO_EccPublicSignKey pub; + struct GNUNET_CRYPTO_EcdsaPublicKey pub; if (NULL != anon.pk) return &anon; - anon.pk = (struct GNUNET_CRYPTO_EccPrivateKey *) GNUNET_CRYPTO_ecc_key_get_anonymous (); - GNUNET_CRYPTO_ecc_key_get_public_for_signature (anon.pk, + anon.pk = (struct GNUNET_CRYPTO_EcdsaPrivateKey *) GNUNET_CRYPTO_ecdsa_key_get_anonymous (); + GNUNET_CRYPTO_ecdsa_key_get_public (anon.pk, &pub); GNUNET_CRYPTO_hash (&pub, sizeof (pub), &anon.id); return &anon; @@ -210,7 +210,7 @@ reconnect (void *cls, static void reschedule_connect (struct GNUNET_IDENTITY_Handle *h) { - GNUNET_assert (h->reconnect_task == GNUNET_SCHEDULER_NO_TASK); + GNUNET_assert (h->reconnect_task == NULL); if (NULL != h->th) { @@ -240,7 +240,7 @@ reschedule_connect (struct GNUNET_IDENTITY_Handle *h) * @param msg message received, NULL on timeout or fatal error */ static void -message_handler (void *cls, +message_handler (void *cls, const struct GNUNET_MessageHeader *msg) { struct GNUNET_IDENTITY_Handle *h = cls; @@ -249,7 +249,7 @@ message_handler (void *cls, const struct GNUNET_IDENTITY_ResultCodeMessage *rcm; const struct GNUNET_IDENTITY_UpdateMessage *um; const struct GNUNET_IDENTITY_SetDefaultMessage *sdm; - struct GNUNET_CRYPTO_EccPublicSignKey pub; + struct GNUNET_CRYPTO_EcdsaPublicKey pub; struct GNUNET_HashCode id; const char *str; uint16_t size; @@ -307,7 +307,7 @@ message_handler (void *cls, } um = (const struct GNUNET_IDENTITY_UpdateMessage *) msg; name_len = ntohs (um->name_len); - + str = (const char *) &um[1]; if ( (size != name_len + sizeof (struct GNUNET_IDENTITY_UpdateMessage)) || ( (0 != name_len) && @@ -326,7 +326,7 @@ message_handler (void *cls, h->cb (h->cb_cls, NULL, NULL, NULL); break; } - GNUNET_CRYPTO_ecc_key_get_public_for_signature (&um->private_key, + GNUNET_CRYPTO_ecdsa_key_get_public (&um->private_key, &pub); GNUNET_CRYPTO_hash (&pub, sizeof (pub), &id); if (0 == name_len) @@ -346,7 +346,7 @@ message_handler (void *cls, return; } ego = GNUNET_new (struct GNUNET_IDENTITY_Ego); - ego->pk = GNUNET_new (struct GNUNET_CRYPTO_EccPrivateKey); + ego->pk = GNUNET_new (struct GNUNET_CRYPTO_EcdsaPrivateKey); *ego->pk = um->private_key; ego->name = GNUNET_strdup (str); ego->id = id; @@ -369,7 +369,7 @@ message_handler (void *cls, /* ego changed name */ GNUNET_free (ego->name); ego->name = GNUNET_strdup (str); - } + } GNUNET_CLIENT_receive (h->client, &message_handler, h, GNUNET_TIME_UNIT_FOREVER_REL); /* inform application about change */ @@ -406,7 +406,7 @@ message_handler (void *cls, } /* Note: we know which service this should be for, so we're not really using 'str' henceforth */ - GNUNET_CRYPTO_ecc_key_get_public_for_signature (&sdm->private_key, + GNUNET_CRYPTO_ecdsa_key_get_public (&sdm->private_key, &pub); GNUNET_CRYPTO_hash (&pub, sizeof (pub), &id); ego = GNUNET_CONTAINER_multihashmap_get (h->egos, @@ -418,6 +418,14 @@ message_handler (void *cls, return; } op = h->op_head; + if (NULL == op) + { + GNUNET_break (0); + reschedule_connect (h); + return; + } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Received SET_DEFAULT message from identity service\n"); GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op); @@ -456,14 +464,14 @@ transmit_next (struct GNUNET_IDENTITY_Handle *h); * @return number of bytes copied to buf */ static size_t -send_next_message (void *cls, - size_t size, +send_next_message (void *cls, + size_t size, void *buf) { struct GNUNET_IDENTITY_Handle *h = cls; struct GNUNET_IDENTITY_Operation *op = h->op_head; size_t ret; - + h->th = NULL; if (NULL == op) return 0; @@ -472,7 +480,7 @@ send_next_message (void *cls, { reschedule_connect (h); return 0; - } + } LOG (GNUNET_ERROR_TYPE_DEBUG, "Sending message of type %d to identity service\n", ntohs (op->msg->type)); @@ -534,7 +542,7 @@ reconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) struct GNUNET_IDENTITY_Operation *op; struct GNUNET_MessageHeader msg; - h->reconnect_task = GNUNET_SCHEDULER_NO_TASK; + h->reconnect_task = NULL; LOG (GNUNET_ERROR_TYPE_DEBUG, "Connecting to identity service.\n"); GNUNET_assert (NULL == h->client); @@ -543,7 +551,7 @@ reconnect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if ( (NULL == h->op_head) || (GNUNET_MESSAGE_TYPE_IDENTITY_START != ntohs (h->op_head->msg->type)) ) { - op = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_Operation) + + op = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_Operation) + sizeof (struct GNUNET_MessageHeader)); op->h = h; op->msg = (const struct GNUNET_MessageHeader *) &op[1]; @@ -591,7 +599,7 @@ GNUNET_IDENTITY_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, * @param ego the ego * @return associated ECC key, valid as long as the ego is valid */ -const struct GNUNET_CRYPTO_EccPrivateKey * +const struct GNUNET_CRYPTO_EcdsaPrivateKey * GNUNET_IDENTITY_ego_get_private_key (const struct GNUNET_IDENTITY_Ego *ego) { return ego->pk; @@ -606,9 +614,9 @@ GNUNET_IDENTITY_ego_get_private_key (const struct GNUNET_IDENTITY_Ego *ego) */ void GNUNET_IDENTITY_ego_get_public_key (const struct GNUNET_IDENTITY_Ego *ego, - struct GNUNET_CRYPTO_EccPublicSignKey *pk) + struct GNUNET_CRYPTO_EcdsaPublicKey *pk) { - GNUNET_CRYPTO_ecc_key_get_public_for_signature (ego->pk, + GNUNET_CRYPTO_ecdsa_key_get_public (ego->pk, pk); } @@ -633,7 +641,7 @@ GNUNET_IDENTITY_get (struct GNUNET_IDENTITY_Handle *id, struct GNUNET_IDENTITY_GetDefaultMessage *gdm; size_t slen; - slen = strlen (service_name) + 1; + slen = strlen (service_name) + 1; if (slen >= GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (struct GNUNET_IDENTITY_GetDefaultMessage)) { GNUNET_break (0); @@ -641,7 +649,7 @@ GNUNET_IDENTITY_get (struct GNUNET_IDENTITY_Handle *id, } op = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_Operation) + sizeof (struct GNUNET_IDENTITY_GetDefaultMessage) + - slen); + slen); op->h = id; op->cb = cb; op->cls = cb_cls; @@ -691,7 +699,7 @@ GNUNET_IDENTITY_set (struct GNUNET_IDENTITY_Handle *id, } op = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_Operation) + sizeof (struct GNUNET_IDENTITY_SetDefaultMessage) + - slen); + slen); op->h = id; op->cont = cont; op->cls = cont_cls; @@ -713,7 +721,7 @@ GNUNET_IDENTITY_set (struct GNUNET_IDENTITY_Handle *id, } -/** +/** * Create a new identity with the given name. * * @param id identity service to use @@ -730,11 +738,11 @@ GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *id, { struct GNUNET_IDENTITY_Operation *op; struct GNUNET_IDENTITY_CreateRequestMessage *crm; - struct GNUNET_CRYPTO_EccPrivateKey *pk; + struct GNUNET_CRYPTO_EcdsaPrivateKey *pk; size_t slen; slen = strlen (name) + 1; - pk = GNUNET_CRYPTO_ecc_key_create (); + pk = GNUNET_CRYPTO_ecdsa_key_create (); if (slen >= GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (struct GNUNET_IDENTITY_CreateRequestMessage)) { @@ -744,7 +752,7 @@ GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *id, } op = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_Operation) + sizeof (struct GNUNET_IDENTITY_CreateRequestMessage) + - slen); + slen); op->h = id; op->cont = cont; op->cls = cont_cls; @@ -767,7 +775,7 @@ GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *id, } -/** +/** * Renames an existing identity. * * @param id identity service to use @@ -824,7 +832,7 @@ GNUNET_IDENTITY_rename (struct GNUNET_IDENTITY_Handle *id, } -/** +/** * Delete an existing identity. * * @param id identity service to use @@ -851,7 +859,7 @@ GNUNET_IDENTITY_delete (struct GNUNET_IDENTITY_Handle *id, } op = GNUNET_malloc (sizeof (struct GNUNET_IDENTITY_Operation) + sizeof (struct GNUNET_IDENTITY_DeleteMessage) + - slen); + slen); op->h = id; op->cont = cb; op->cls = cb_cls; @@ -879,9 +887,8 @@ GNUNET_IDENTITY_delete (struct GNUNET_IDENTITY_Handle *id, * the operation. * * @param op operation to cancel - * @return GNUNET_YES if the continuation was cancelled */ -int +void GNUNET_IDENTITY_cancel (struct GNUNET_IDENTITY_Operation *op) { struct GNUNET_IDENTITY_Handle *h = op->h; @@ -890,15 +897,19 @@ GNUNET_IDENTITY_cancel (struct GNUNET_IDENTITY_Operation *op) (NULL == h->client) ) { /* request not active, can simply remove */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client aborted non-head operation, simply removing it\n"); GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op); GNUNET_free (op); - return GNUNET_YES; + return; } if (NULL != h->th) { /* request active but not yet with service, can still abort */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client aborted head operation prior to transmission, aborting it\n"); GNUNET_CLIENT_notify_transmit_ready_cancel (h->th); h->th = NULL; GNUNET_CONTAINER_DLL_remove (h->op_head, @@ -906,12 +917,13 @@ GNUNET_IDENTITY_cancel (struct GNUNET_IDENTITY_Operation *op) op); GNUNET_free (op); transmit_next (h); - return GNUNET_YES; + return; } /* request active with service, simply ensure continuations are not called */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client aborted active request, NULLing continuation\n"); op->cont = NULL; op->cb = NULL; - return GNUNET_NO; } @@ -954,13 +966,10 @@ GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle *h) struct GNUNET_IDENTITY_Operation *op; GNUNET_assert (NULL != h); - while (NULL != (op = h->op_head)) - if (GNUNET_YES != GNUNET_IDENTITY_cancel (op)) - break; - if (h->reconnect_task != GNUNET_SCHEDULER_NO_TASK) + if (h->reconnect_task != NULL) { GNUNET_SCHEDULER_cancel (h->reconnect_task); - h->reconnect_task = GNUNET_SCHEDULER_NO_TASK; + h->reconnect_task = NULL; } if (NULL != h->th) { @@ -975,6 +984,14 @@ GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle *h) GNUNET_CONTAINER_multihashmap_destroy (h->egos); h->egos = NULL; } + while (NULL != (op = h->op_head)) + { + GNUNET_break (NULL == op->cont); + GNUNET_CONTAINER_DLL_remove (h->op_head, + h->op_tail, + op); + GNUNET_free (op); + } if (NULL != h->client) { GNUNET_CLIENT_disconnect (h->client);