GNUnet  0.11.x
Data Structures | Macros | Functions
identity_api.c File Reference

api to interact with the identity service More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_constants.h"
#include "gnunet_protocols.h"
#include "gnunet_identity_service.h"
#include "identity.h"
Include dependency graph for identity_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_IDENTITY_Operation
 Handle for an operation with the identity service. More...
 
struct  GNUNET_IDENTITY_Handle
 Handle for the service. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "identity-api", __VA_ARGS__)
 

Functions

struct GNUNET_IDENTITY_EgoGNUNET_IDENTITY_ego_get_anonymous ()
 Obtain the ego representing 'anonymous' users. More...
 
static void reconnect (void *cls)
 Try again to connect to the identity service. More...
 
static int free_ego (void *cls, const struct GNUNET_HashCode *key, void *value)
 Free ego from hash map. More...
 
static void reschedule_connect (struct GNUNET_IDENTITY_Handle *h)
 Reschedule a connect attempt to the service. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue. More...
 
static int check_identity_result_code (void *cls, const struct ResultCodeMessage *rcm)
 We received a result code from the service. More...
 
static void handle_identity_result_code (void *cls, const struct ResultCodeMessage *rcm)
 We received a result code from the service. More...
 
static int check_identity_update (void *cls, const struct UpdateMessage *um)
 Check validity of identity update message. More...
 
static void handle_identity_update (void *cls, const struct UpdateMessage *um)
 Handle identity update message. More...
 
static int check_identity_set_default (void *cls, const struct SetDefaultMessage *sdm)
 Function called when we receive a set default message from the service. More...
 
static void handle_identity_set_default (void *cls, const struct SetDefaultMessage *sdm)
 Type of a function to call when we receive a message from the service. More...
 
struct GNUNET_IDENTITY_HandleGNUNET_IDENTITY_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_IDENTITY_Callback cb, void *cb_cls)
 Connect to the identity service. More...
 
const struct GNUNET_CRYPTO_EcdsaPrivateKeyGNUNET_IDENTITY_ego_get_private_key (const struct GNUNET_IDENTITY_Ego *ego)
 Obtain the ECC key associated with a ego. More...
 
void GNUNET_IDENTITY_ego_get_public_key (struct GNUNET_IDENTITY_Ego *ego, struct GNUNET_CRYPTO_EcdsaPublicKey *pk)
 Get the identifier (public key) of an ego. More...
 
struct GNUNET_IDENTITY_OperationGNUNET_IDENTITY_get (struct GNUNET_IDENTITY_Handle *h, const char *service_name, GNUNET_IDENTITY_Callback cb, void *cb_cls)
 Obtain the identity that is currently preferred/default for a service. More...
 
struct GNUNET_IDENTITY_OperationGNUNET_IDENTITY_set (struct GNUNET_IDENTITY_Handle *h, const char *service_name, struct GNUNET_IDENTITY_Ego *ego, GNUNET_IDENTITY_Continuation cont, void *cont_cls)
 Set the preferred/default identity for a service. More...
 
struct GNUNET_IDENTITY_OperationGNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *h, const char *name, const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey, GNUNET_IDENTITY_CreateContinuation cont, void *cont_cls)
 Create a new identity with the given name. More...
 
struct GNUNET_IDENTITY_OperationGNUNET_IDENTITY_rename (struct GNUNET_IDENTITY_Handle *h, const char *old_name, const char *new_name, GNUNET_IDENTITY_Continuation cb, void *cb_cls)
 Renames an existing identity. More...
 
struct GNUNET_IDENTITY_OperationGNUNET_IDENTITY_delete (struct GNUNET_IDENTITY_Handle *h, const char *name, GNUNET_IDENTITY_Continuation cb, void *cb_cls)
 Delete an existing identity. More...
 
void GNUNET_IDENTITY_cancel (struct GNUNET_IDENTITY_Operation *op)
 Cancel an identity operation. More...
 
void GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle *h)
 Disconnect from identity service. More...
 

Detailed Description

api to interact with the identity service

Author
Christian Grothoff

Definition in file identity_api.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "identity-api", __VA_ARGS__)

Definition at line 33 of file identity_api.c.

Referenced by reconnect(), and reschedule_connect().

Function Documentation

◆ reconnect()

static void reconnect ( void *  cls)
static

Try again to connect to the identity service.

Parameters
clshandle to the identity service.

Definition at line 515 of file identity_api.c.

References GNUNET_IDENTITY_Handle::cb, GNUNET_IDENTITY_Handle::cfg, GNUNET_IDENTITY_Operation::cls, env, GNUNET_assert, GNUNET_CLIENT_connect(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, GNUNET_MESSAGE_TYPE_IDENTITY_START, GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE, GNUNET_MQ_handler_end, GNUNET_MQ_hd_var_size, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_IDENTITY_Operation::h, LOG, GNUNET_IDENTITY_Handle::mq, mq_error_handler(), GNUNET_IDENTITY_Operation::msg, and GNUNET_IDENTITY_Handle::reconnect_task.

Referenced by GNUNET_IDENTITY_connect(), GNUNET_IDENTITY_ego_get_anonymous(), and reschedule_connect().

516 {
517  struct GNUNET_IDENTITY_Handle *h = cls;
519  GNUNET_MQ_hd_var_size (identity_result_code,
521  struct ResultCodeMessage,
522  h),
523  GNUNET_MQ_hd_var_size (identity_update,
525  struct UpdateMessage,
526  h),
527  GNUNET_MQ_hd_var_size (identity_set_default,
529  struct SetDefaultMessage,
530  h),
532  };
533  struct GNUNET_MQ_Envelope *env;
534  struct GNUNET_MessageHeader *msg;
535 
536  h->reconnect_task = NULL;
538  "Connecting to identity service.\n");
539  GNUNET_assert (NULL == h->mq);
540  h->mq = GNUNET_CLIENT_connect (h->cfg,
541  "identity",
542  handlers,
544  h);
545  if (NULL == h->mq)
546  return;
547  if (NULL != h->cb)
548  {
549  env = GNUNET_MQ_msg (msg,
551  GNUNET_MQ_send (h->mq,
552  env);
553  }
554 }
#define GNUNET_MESSAGE_TYPE_IDENTITY_START
First message send from identity client to service (to subscribe to updates).
#define GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT
Client sets default identity; or service informs about default identity.
Used from service to client as a result to the GET_DEFAULT message, used from client to service to SE...
Definition: identity.h:134
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:1063
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
Definition: identity_api.c:271
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
#define LOG(kind,...)
Definition: identity_api.c:33
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
Handle for the service.
Definition: identity_api.c:95
struct GNUNET_SCHEDULER_Task * reconnect_task
Task doing exponential back-off trying to reconnect.
Definition: identity_api.c:136
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Definition: identity_api.c:100
Message handler for a specific message type.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
Header for all communications.
#define GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE
Generic response from identity service with success and/or error message.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:355
struct GNUNET_MQ_Handle * mq
Connection to service.
Definition: identity_api.c:105
GNUNET_IDENTITY_Callback cb
Function to call when we receive updates.
Definition: identity_api.c:116
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
Answer from service to client about last operation; GET_DEFAULT maybe answered with this message on f...
Definition: identity.h:42
Service informs client about status of a pseudonym.
Definition: identity.h:77
Here is the call graph for this function:
Here is the caller graph for this function:

◆ free_ego()

static int free_ego ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Free ego from hash map.

Parameters
clsidentity service handle
keyunused
valueego to free
Returns
GNUNET_OK (continue to iterate)

Definition at line 193 of file identity_api.c.

References GNUNET_IDENTITY_Handle::cb, GNUNET_IDENTITY_Handle::cb_cls, GNUNET_IDENTITY_Operation::cls, GNUNET_IDENTITY_Ego::ctx, GNUNET_IDENTITY_Handle::egos, GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove(), GNUNET_free, GNUNET_OK, GNUNET_YES, GNUNET_IDENTITY_Operation::h, GNUNET_IDENTITY_Ego::name, and value.

Referenced by GNUNET_IDENTITY_disconnect(), and reschedule_connect().

196 {
197  struct GNUNET_IDENTITY_Handle *h = cls;
198  struct GNUNET_IDENTITY_Ego *ego = value;
199 
200  if (NULL != h->cb)
201  h->cb (h->cb_cls, ego,
202  &ego->ctx,
203  NULL);
204  GNUNET_free (ego->name);
207  key,
208  value));
209  GNUNET_free (ego);
210  return GNUNET_OK;
211 }
struct GNUNET_CONTAINER_MultiHashMap * egos
Hash map from the hash of the private key to the respective GNUNET_IDENTITY_Ego handle.
Definition: identity_api.c:111
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
char * name
Current name associated with this ego.
Definition: identity.h:266
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
Handle for an ego.
Definition: identity.h:245
static char * value
Value of the record to add/remove.
Handle for the service.
Definition: identity_api.c:95
int GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
void * ctx
Client context associated with this ego.
Definition: identity.h:271
void * cb_cls
Closure for cb.
Definition: identity_api.c:121
GNUNET_IDENTITY_Callback cb
Function to call when we receive updates.
Definition: identity_api.c:116
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ reschedule_connect()

static void reschedule_connect ( struct GNUNET_IDENTITY_Handle h)
static

Reschedule a connect attempt to the service.

Parameters
htransport service to reconnect

Definition at line 220 of file identity_api.c.

References GNUNET_IDENTITY_Operation::cb, GNUNET_IDENTITY_Operation::cls, GNUNET_IDENTITY_Operation::cont, GNUNET_IDENTITY_Operation::create_cont, GNUNET_IDENTITY_Handle::egos, free_ego(), GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_delayed(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_TIME_STD_BACKOFF, GNUNET_YES, LOG, GNUNET_IDENTITY_Handle::mq, op, GNUNET_IDENTITY_Handle::op_head, GNUNET_IDENTITY_Handle::op_tail, reconnect(), GNUNET_IDENTITY_Handle::reconnect_delay, and GNUNET_IDENTITY_Handle::reconnect_task.

Referenced by handle_identity_result_code(), handle_identity_set_default(), handle_identity_update(), and mq_error_handler().

221 {
223 
224  GNUNET_assert (NULL == h->reconnect_task);
225 
226  if (NULL != h->mq)
227  {
228  GNUNET_MQ_destroy (h->mq);
229  h->mq = NULL;
230  }
231  while (NULL != (op = h->op_head))
232  {
234  h->op_tail,
235  op);
236  if (NULL != op->cont)
237  op->cont (op->cls,
238  "Error in communication with the identity service");
239  else if (NULL != op->cb)
240  op->cb (op->cls, NULL, NULL, NULL);
241  else if (NULL != op->create_cont)
242  op->create_cont (op->cls,
243  NULL,
244  "Failed to communicate with the identity service");
245  GNUNET_free (op);
246  }
248  &free_ego,
249  h);
251  "Scheduling task to reconnect to identity service in %s.\n",
253  GNUNET_YES));
254  h->reconnect_task =
256  &reconnect,
257  h);
259 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_CONTAINER_MultiHashMap * egos
Hash map from the hash of the private key to the respective GNUNET_IDENTITY_Ego handle.
Definition: identity_api.c:111
struct GNUNET_TIME_Relative reconnect_delay
Time for next connect retry.
Definition: identity_api.c:141
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_IDENTITY_Operation * op_tail
Tail of active operations.
Definition: identity_api.c:131
Handle for an operation with the identity service.
Definition: identity_api.c:39
static void reconnect(void *cls)
Try again to connect to the identity service.
Definition: identity_api.c:515
#define LOG(kind,...)
Definition: identity_api.c:33
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1269
GNUNET_IDENTITY_CreateContinuation create_cont
Continuation to invoke with the result of the transmission; cb and cb will be NULL in this case...
Definition: identity_api.c:72
struct GNUNET_SCHEDULER_Task * reconnect_task
Task doing exponential back-off trying to reconnect.
Definition: identity_api.c:136
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:702
GNUNET_IDENTITY_Continuation cont
Continuation to invoke with the result of the transmission; cb and create_cont will be NULL in this c...
Definition: identity_api.c:66
struct GNUNET_IDENTITY_Operation * op_head
Head of active operations.
Definition: identity_api.c:126
#define GNUNET_TIME_STD_BACKOFF(r)
Perform our standard exponential back-off calculation, starting at 1 ms and then going by a factor of...
static int free_ego(void *cls, const struct GNUNET_HashCode *key, void *value)
Free ego from hash map.
Definition: identity_api.c:193
void * cls
Closure for cont or cb.
Definition: identity_api.c:88
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:837
struct GNUNET_MQ_Handle * mq
Connection to service.
Definition: identity_api.c:105
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:144
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
GNUNET_IDENTITY_Callback cb
Continuation to invoke with the result of the transmission for 'get' operations (cont and create_cont...
Definition: identity_api.c:83
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

Generic error handler, called with the appropriate error code and the same closure specified at the creation of the message queue.

Not every message queue implementation supports an error handler.

Parameters
clsclosure with the struct GNUNET_IDENTITY_Handle *
errorerror code

Definition at line 271 of file identity_api.c.

References GNUNET_IDENTITY_Operation::cls, GNUNET_IDENTITY_Operation::h, and reschedule_connect().

Referenced by reconnect().

273 {
274  struct GNUNET_IDENTITY_Handle *h = cls;
275 
276  reschedule_connect (h);
277 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
Handle for the service.
Definition: identity_api.c:95
static void reschedule_connect(struct GNUNET_IDENTITY_Handle *h)
Reschedule a connect attempt to the service.
Definition: identity_api.c:220
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_identity_result_code()

static int check_identity_result_code ( void *  cls,
const struct ResultCodeMessage rcm 
)
static

We received a result code from the service.

Check the message is well-formed.

Parameters
clsclosure
rcmresult message received
Returns
GNUNET_OK if the message is well-formed

Definition at line 289 of file identity_api.c.

References GNUNET_MQ_check_zero_termination, GNUNET_OK, ResultCodeMessage::header, and GNUNET_MessageHeader::size.

291 {
292  if (sizeof(*rcm) != htons (rcm->header.size))
294  return GNUNET_OK;
295 }
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE.
Definition: identity.h:47
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ handle_identity_result_code()

static void handle_identity_result_code ( void *  cls,
const struct ResultCodeMessage rcm 
)
static

We received a result code from the service.

Parameters
clsclosure
rcmresult message received

Definition at line 305 of file identity_api.c.

References GNUNET_IDENTITY_Operation::cb, GNUNET_IDENTITY_Operation::cls, GNUNET_IDENTITY_Operation::cont, GNUNET_IDENTITY_Operation::create_cont, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_IDENTITY_Operation::h, ResultCodeMessage::header, op, GNUNET_IDENTITY_Handle::op_head, GNUNET_IDENTITY_Handle::op_tail, GNUNET_IDENTITY_Operation::pk, reschedule_connect(), size, and GNUNET_MessageHeader::size.

307 {
308  struct GNUNET_IDENTITY_Handle *h = cls;
310  uint16_t size = ntohs (rcm->header.size) - sizeof(*rcm);
311  const char *str = (0 == size) ? NULL : (const char *) &rcm[1];
312 
313  op = h->op_head;
314  if (NULL == op)
315  {
316  GNUNET_break (0);
317  reschedule_connect (h);
318  return;
319  }
321  if (NULL != op->cont)
322  op->cont (op->cls, str);
323  else if (NULL != op->cb)
324  op->cb (op->cls, NULL, NULL, NULL);
325  else if (NULL != op->create_cont)
326  op->create_cont (op->cls, (NULL == str) ? &op->pk : NULL, str);
327  GNUNET_free (op);
328 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE.
Definition: identity.h:47
struct GNUNET_IDENTITY_Operation * op_tail
Tail of active operations.
Definition: identity_api.c:131
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
Handle for an operation with the identity service.
Definition: identity_api.c:39
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
GNUNET_IDENTITY_CreateContinuation create_cont
Continuation to invoke with the result of the transmission; cb and cb will be NULL in this case...
Definition: identity_api.c:72
Handle for the service.
Definition: identity_api.c:95
GNUNET_IDENTITY_Continuation cont
Continuation to invoke with the result of the transmission; cb and create_cont will be NULL in this c...
Definition: identity_api.c:66
struct GNUNET_IDENTITY_Operation * op_head
Head of active operations.
Definition: identity_api.c:126
static void reschedule_connect(struct GNUNET_IDENTITY_Handle *h)
Reschedule a connect attempt to the service.
Definition: identity_api.c:220
static unsigned int size
Size of the "table".
Definition: peer.c:67
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key to return to create_cont, or NULL.
Definition: identity_api.c:77
void * cls
Closure for cont or cb.
Definition: identity_api.c:88
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:144
GNUNET_IDENTITY_Callback cb
Continuation to invoke with the result of the transmission for 'get' operations (cont and create_cont...
Definition: identity_api.c:83
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ check_identity_update()

static int check_identity_update ( void *  cls,
const struct UpdateMessage um 
)
static

Check validity of identity update message.

Parameters
clsclosure
ummessage received
Returns
GNUNET_OK if the message is well-formed

Definition at line 339 of file identity_api.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, UpdateMessage::header, UpdateMessage::name_len, size, and GNUNET_MessageHeader::size.

341 {
342  uint16_t size = ntohs (um->header.size);
343  uint16_t name_len = ntohs (um->name_len);
344  const char *str = (const char *) &um[1];
345 
346  if ((size != name_len + sizeof(struct UpdateMessage)) ||
347  ((0 != name_len) && ('\0' != str[name_len - 1])))
348  {
349  GNUNET_break (0);
350  return GNUNET_SYSERR;
351  }
352  return GNUNET_OK;
353 }
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE.
Definition: identity.h:82
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static unsigned int size
Size of the "table".
Definition: peer.c:67
uint16_t name_len
Number of bytes in ego name string including 0-termination, in NBO; 0 if the ego was deleted...
Definition: identity.h:88
Service informs client about status of a pseudonym.
Definition: identity.h:77

◆ handle_identity_update()

static void handle_identity_update ( void *  cls,
const struct UpdateMessage um 
)
static

Handle identity update message.

Parameters
clsclosure
ummessage received

Definition at line 363 of file identity_api.c.

References GNUNET_IDENTITY_Handle::cb, GNUNET_IDENTITY_Handle::cb_cls, GNUNET_IDENTITY_Operation::cls, GNUNET_IDENTITY_Ego::ctx, GNUNET_IDENTITY_Handle::egos, UpdateMessage::end_of_list, GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_CRYPTO_hash(), GNUNET_free, GNUNET_new, GNUNET_NO, GNUNET_strdup, GNUNET_YES, GNUNET_IDENTITY_Operation::h, id, GNUNET_IDENTITY_Ego::id, GNUNET_IDENTITY_Ego::name, UpdateMessage::name_len, GNUNET_IDENTITY_Ego::pk, UpdateMessage::private_key, GNUNET_IDENTITY_Ego::pub_initialized, and reschedule_connect().

365 {
366  struct GNUNET_IDENTITY_Handle *h = cls;
367  uint16_t name_len = ntohs (um->name_len);
368  const char *str = (0 == name_len) ? NULL : (const char *) &um[1];
369  struct GNUNET_HashCode id;
370  struct GNUNET_IDENTITY_Ego *ego;
371 
372  if (GNUNET_YES == ntohs (um->end_of_list))
373  {
374  /* end of initial list of data */
375  if (NULL != h->cb)
376  h->cb (h->cb_cls, NULL, NULL, NULL);
377  return;
378  }
380  sizeof (um->private_key),
381  &id);
383  &id);
384  if (NULL == ego)
385  {
386  /* ego was created */
387  if (NULL == str)
388  {
389  /* deletion of unknown ego? not allowed */
390  GNUNET_break (0);
391  reschedule_connect (h);
392  return;
393  }
394  ego = GNUNET_new (struct GNUNET_IDENTITY_Ego);
395  ego->pub_initialized = GNUNET_NO;
396  ego->pk = um->private_key;
397  ego->name = GNUNET_strdup (str);
398  ego->id = id;
401  h->egos,
402  &ego->id,
403  ego,
405  }
406  if (NULL == str)
407  {
408  /* ego was deleted */
411  &ego->id,
412  ego));
413  }
414  else
415  {
416  /* ego changed name */
417  GNUNET_free (ego->name);
418  ego->name = GNUNET_strdup (str);
419  }
420  /* inform application about change */
421  if (NULL != h->cb)
422  h->cb (h->cb_cls,
423  ego,
424  &ego->ctx,
425  str);
426  /* complete deletion */
427  if (NULL == str)
428  {
429  GNUNET_free (ego->name);
430  GNUNET_free (ego);
431  }
432 }
struct GNUNET_CONTAINER_MultiHashMap * egos
Hash map from the hash of the private key to the respective GNUNET_IDENTITY_Ego handle.
Definition: identity_api.c:111
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key associated with this ego.
Definition: identity.h:255
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:98
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
char * name
Current name associated with this ego.
Definition: identity.h:266
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
Handle for an ego.
Definition: identity.h:245
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:48
Handle for the service.
Definition: identity_api.c:95
int GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
static void reschedule_connect(struct GNUNET_IDENTITY_Handle *h)
Reschedule a connect attempt to the service.
Definition: identity_api.c:220
A 512-bit hashcode.
struct GNUNET_HashCode id
Hash of the private key of this ego.
Definition: identity.h:250
There must only be one value per key; storing a value should fail if a value under the same key alrea...
void * ctx
Client context associated with this ego.
Definition: identity.h:271
int GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
uint16_t name_len
Number of bytes in ego name string including 0-termination, in NBO; 0 if the ego was deleted...
Definition: identity.h:88
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:93
bool pub_initialized
Set to true once pub was initialized.
Definition: identity.h:276
void * cb_cls
Closure for cb.
Definition: identity_api.c:121
GNUNET_IDENTITY_Callback cb
Function to call when we receive updates.
Definition: identity_api.c:116
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ check_identity_set_default()

static int check_identity_set_default ( void *  cls,
const struct SetDefaultMessage sdm 
)
static

Function called when we receive a set default message from the service.

Parameters
clsclosure
sdmmessage received
Returns
GNUNET_OK if the message is well-formed

Definition at line 444 of file identity_api.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, SetDefaultMessage::header, SetDefaultMessage::name_len, SetDefaultMessage::reserved, size, and GNUNET_MessageHeader::size.

446 {
447  uint16_t size = ntohs (sdm->header.size) - sizeof(*sdm);
448  uint16_t name_len = ntohs (sdm->name_len);
449  const char *str = (const char *) &sdm[1];
450 
451  if ((size != name_len) || ((0 != name_len) && ('\0' != str[name_len - 1])))
452  {
453  GNUNET_break (0);
454  return GNUNET_SYSERR;
455  }
456  GNUNET_break (0 == ntohs (sdm->reserved));
457  return GNUNET_OK;
458 }
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:144
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint16_t reserved
Always zero.
Definition: identity.h:149
static unsigned int size
Size of the "table".
Definition: peer.c:67
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT.
Definition: identity.h:139

◆ handle_identity_set_default()

static void handle_identity_set_default ( void *  cls,
const struct SetDefaultMessage sdm 
)
static

Type of a function to call when we receive a message from the service.

Parameters
clsclosure
sdmmessage received

Definition at line 469 of file identity_api.c.

References GNUNET_IDENTITY_Operation::cb, GNUNET_IDENTITY_Operation::cls, GNUNET_IDENTITY_Ego::ctx, GNUNET_IDENTITY_Handle::egos, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_IDENTITY_Operation::h, GNUNET_IDENTITY_Ego::name, op, GNUNET_IDENTITY_Handle::op_head, GNUNET_IDENTITY_Handle::op_tail, SetDefaultMessage::private_key, and reschedule_connect().

471 {
472  struct GNUNET_IDENTITY_Handle *h = cls;
474  struct GNUNET_HashCode id;
475  struct GNUNET_IDENTITY_Ego *ego;
476 
478  sizeof(sdm->private_key),
479  &id);
481  &id);
482  if (NULL == ego)
483  {
484  GNUNET_break (0);
485  reschedule_connect (h);
486  return;
487  }
488  op = h->op_head;
489  if (NULL == op)
490  {
491  GNUNET_break (0);
492  reschedule_connect (h);
493  return;
494  }
496  "Received SET_DEFAULT message from identity service\n");
498  h->op_tail,
499  op);
500  if (NULL != op->cb)
501  op->cb (op->cls,
502  ego,
503  &ego->ctx,
504  ego->name);
505  GNUNET_free (op);
506 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_CONTAINER_MultiHashMap * egos
Hash map from the hash of the private key to the respective GNUNET_IDENTITY_Ego handle.
Definition: identity_api.c:111
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:154
struct GNUNET_IDENTITY_Operation * op_tail
Tail of active operations.
Definition: identity_api.c:131
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
Handle for an operation with the identity service.
Definition: identity_api.c:39
char * name
Current name associated with this ego.
Definition: identity.h:266
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
Handle for an ego.
Definition: identity.h:245
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:48
Handle for the service.
Definition: identity_api.c:95
struct GNUNET_IDENTITY_Operation * op_head
Head of active operations.
Definition: identity_api.c:126
static void reschedule_connect(struct GNUNET_IDENTITY_Handle *h)
Reschedule a connect attempt to the service.
Definition: identity_api.c:220
A 512-bit hashcode.
void * ctx
Client context associated with this ego.
Definition: identity.h:271
void * cls
Closure for cont or cb.
Definition: identity_api.c:88
#define GNUNET_log(kind,...)
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:144
GNUNET_IDENTITY_Callback cb
Continuation to invoke with the result of the transmission for 'get' operations (cont and create_cont...
Definition: identity_api.c:83
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function: