GNUnet  0.10.x
Data Structures | Functions | Variables
gnunet-service-identity.c File Reference

identity management service More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_constants.h"
#include "gnunet_protocols.h"
#include "gnunet_statistics_service.h"
#include "gnunet_identity_service.h"
#include "identity.h"
Include dependency graph for gnunet-service-identity.c:

Go to the source code of this file.

Data Structures

struct  Ego
 Information we keep about each ego. More...
 
struct  RenameContext
 Closure for 'handle_ego_rename'. More...
 

Functions

static char * get_ego_filename (struct Ego *ego)
 Get the name of the file we use to store a given ego. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
 Called whenever a client is disconnected. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 Add a client to our list of active clients. More...
 
static void shutdown_task (void *cls)
 Task run during shutdown. More...
 
static void send_result_code (struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
 Send a result code back to the client. More...
 
static struct GNUNET_MQ_Envelopecreate_update_message (struct Ego *ego)
 Create an update message with information about the current state of an ego. More...
 
static struct GNUNET_MQ_Envelopecreate_set_default_message (struct Ego *ego, const char *servicename)
 Create a set default message with information about the current state of an ego. More...
 
static void handle_start_message (void *cls, const struct GNUNET_MessageHeader *message)
 Handler for START message from client, sends information about all identities to the client immediately and adds the client to the notification context for future updates. More...
 
static int check_lookup_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP message from client, sends information about ONE identity to the client immediately. More...
 
static void handle_lookup_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP message from client, sends information about ONE identity to the client immediately. More...
 
static int check_lookup_by_suffix_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP message from client, sends information about ONE identity to the client immediately. More...
 
static void handle_lookup_by_suffix_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP_BY_SUFFIX message from client, sends information about ONE identity to the client immediately. More...
 
static int check_get_default_message (void *cls, const struct GetDefaultMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT message. More...
 
static void handle_get_default_message (void *cls, const struct GetDefaultMessage *gdm)
 Handler for GET_DEFAULT message from client, returns default identity for some service. More...
 
static int key_cmp (const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk1, const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk2)
 Compare the given two private keys for equality. More...
 
static int check_set_default_message (void *cls, const struct SetDefaultMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT message. More...
 
static void handle_set_default_message (void *cls, const struct SetDefaultMessage *sdm)
 Handler for SET_DEFAULT message from client, updates default identity for some service. More...
 
static void notify_listeners (struct Ego *ego)
 Send an updated message for the given ego to all listeners. More...
 
static int check_create_message (void *cls, const struct CreateRequestMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_CREATE message. More...
 
static void handle_create_message (void *cls, const struct CreateRequestMessage *crm)
 Handler for CREATE message from client, creates new identity. More...
 
static void handle_ego_rename (void *cls, const char *section)
 An ego was renamed; rename it in all subsystems where it is currently set as the default. More...
 
static int check_rename_message (void *cls, const struct RenameMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_RENAME message. More...
 
static void handle_rename_message (void *cls, const struct RenameMessage *rm)
 Handler for RENAME message from client, creates new identity. More...
 
static void handle_ego_delete (void *cls, const char *section)
 An ego was removed, remove it from all subsystems where it is currently set as the default. More...
 
static int check_delete_message (void *cls, const struct DeleteMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_DELETE message. More...
 
static void handle_delete_message (void *cls, const struct DeleteMessage *dm)
 Handler for DELETE message from client, creates new identity. More...
 
static int process_ego_file (void *cls, const char *filename)
 Process the given file from the "EGODIR". More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
 Handle network size estimate clients. More...
 
 GNUNET_SERVICE_MAIN ("identity", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_fixed_size(start_message, GNUNET_MESSAGE_TYPE_IDENTITY_START, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_var_size(lookup_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP, struct LookupMessage, NULL), GNUNET_MQ_hd_var_size(lookup_by_suffix_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX, struct LookupMessage, NULL), GNUNET_MQ_hd_var_size(get_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT, struct GetDefaultMessage, NULL), GNUNET_MQ_hd_var_size(set_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, struct SetDefaultMessage, NULL), GNUNET_MQ_hd_var_size(create_message, GNUNET_MESSAGE_TYPE_IDENTITY_CREATE, struct CreateRequestMessage, NULL), GNUNET_MQ_hd_var_size(rename_message, GNUNET_MESSAGE_TYPE_IDENTITY_RENAME, struct RenameMessage, NULL), GNUNET_MQ_hd_var_size(delete_message, GNUNET_MESSAGE_TYPE_IDENTITY_DELETE, struct DeleteMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro. More...
 

Variables

static const struct GNUNET_CONFIGURATION_Handlecfg
 Handle to our current configuration. More...
 
static struct GNUNET_CONFIGURATION_Handlesubsystem_cfg
 Handle to subsystem configuration which for each subsystem contains the name of the default ego. More...
 
static struct GNUNET_STATISTICS_Handlestats
 Handle to the statistics service. More...
 
static struct GNUNET_NotificationContextnc
 Notification context, simplifies client broadcasts. More...
 
static char * ego_directory
 Directory where we store the identities. More...
 
static char * subsystem_cfg_file
 Configuration file name where subsystem information is kept. More...
 
static struct Egoego_head
 Head of DLL of all egos. More...
 
static struct Egoego_tail
 Tail of DLL of all egos. More...
 

Detailed Description

identity management service

Author
Christian Grothoff

The purpose of this service is to manage private keys that represent the various egos/pseudonyms/identities of a GNUnet user.

Todo:

Definition in file gnunet-service-identity.c.

Function Documentation

◆ get_ego_filename()

static char* get_ego_filename ( struct Ego ego)
static

Get the name of the file we use to store a given ego.

Parameters
egoego for which we need the filename
Returns
full filename for the given ego

Definition at line 120 of file gnunet-service-identity.c.

References DIR_SEPARATOR_STR, ego_directory, filename, GNUNET_asprintf(), and Ego::identifier.

Referenced by handle_create_message(), handle_delete_message(), and handle_rename_message().

121 {
122  char *filename;
123 
124  GNUNET_asprintf (&filename,
125  "%s%s%s",
128  ego->identifier);
129  return filename;
130 }
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
static char * filename
char * identifier
String identifier for the ego.
static char * ego_directory
Directory where we store the identities.
#define DIR_SEPARATOR_STR
Definition: plibc.h:632
Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  app_ctx 
)
static

Called whenever a client is disconnected.

Parameters
clsclosure
clientidentification of the client
app_ctxclient

Definition at line 140 of file gnunet-service-identity.c.

References GNUNET_ERROR_TYPE_DEBUG, and GNUNET_log.

Referenced by run().

143 {
145  "Client %p disconnected\n",
146  client);
147 }
#define GNUNET_log(kind,...)
Here is the caller graph for this function:

◆ client_connect_cb()

static void* client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

Add a client to our list of active clients.

Parameters
clsNULL
clientclient to add
mqmessage queue for client
Returns
internal namestore client structure for this client

Definition at line 159 of file gnunet-service-identity.c.

Referenced by run().

162 {
163  return client;
164 }
Here is the caller graph for this function:

◆ shutdown_task()

static void shutdown_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused

Definition at line 172 of file gnunet-service-identity.c.

References e, ego_directory, GNUNET_CONFIGURATION_destroy(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_NO, GNUNET_notification_context_destroy(), GNUNET_STATISTICS_destroy(), Ego::identifier, Ego::pk, and subsystem_cfg_file.

Referenced by run().

173 {
174  struct Ego *e;
175 
176  if (NULL != nc)
177  {
179  nc = NULL;
180  }
181  if (NULL != stats)
182  {
184  stats = NULL;
185  }
187  subsystem_cfg = NULL;
189  subsystem_cfg_file = NULL;
191  ego_directory = NULL;
192  while (NULL != (e = ego_head))
193  {
195  GNUNET_free (e->pk);
196  GNUNET_free (e->identifier);
197  GNUNET_free (e);
198  }
199 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct Experiment * e
#define GNUNET_NO
Definition: gnunet_common.h:81
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
static struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
char * identifier
String identifier for the ego.
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static char * ego_directory
Directory where we store the identities.
void GNUNET_notification_context_destroy(struct GNUNET_NotificationContext *nc)
Destroy the context, force disconnect for all subscribers.
Definition: nc.c:141
static struct Ego * ego_tail
Tail of DLL of all egos.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_result_code()

static void send_result_code ( struct GNUNET_SERVICE_Client client,
uint32_t  result_code,
const char *  emsg 
)
static

Send a result code back to the client.

Parameters
clientclient that should receive the result code
result_codecode to transmit
emsgerror message to include (or NULL for none)

Definition at line 210 of file gnunet-service-identity.c.

References env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_SERVICE_client_get_mq(), and ResultCodeMessage::result_code.

Referenced by handle_create_message(), handle_delete_message(), handle_get_default_message(), handle_lookup_by_suffix_message(), handle_lookup_message(), handle_rename_message(), and handle_set_default_message().

213 {
214  struct ResultCodeMessage *rcm;
215  struct GNUNET_MQ_Envelope *env;
216  size_t elen;
217 
218  if (NULL == emsg)
219  elen = 0;
220  else
221  elen = strlen (emsg) + 1;
222  env = GNUNET_MQ_msg_extra (rcm,
223  elen,
225  rcm->result_code = htonl (result_code);
226  if (0 < elen)
227  GNUNET_memcpy (&rcm[1], emsg, elen);
229  "Sending result %d (%s) to client\n",
230  (int) result_code,
231  emsg);
233 }
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2734
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
#define GNUNET_memcpy(dst, src, n)
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
uint32_t result_code
Status code for the last operation, in NBO.
Definition: identity.h:53
#define GNUNET_log(kind,...)
#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:353
Answer from service to client about last operation; GET_DEFAULT maybe answered with this message on f...
Definition: identity.h:42
Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_update_message()

static struct GNUNET_MQ_Envelope* create_update_message ( struct Ego ego)
static

Create an update message with information about the current state of an ego.

Parameters
egoego to create message for
Returns
corresponding update message

Definition at line 243 of file gnunet-service-identity.c.

References UpdateMessage::end_of_list, env, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE, GNUNET_MQ_msg_extra, GNUNET_NO, Ego::identifier, UpdateMessage::name_len, Ego::pk, and UpdateMessage::private_key.

Referenced by handle_lookup_by_suffix_message(), handle_lookup_message(), and handle_start_message().

244 {
245  struct UpdateMessage *um;
246  struct GNUNET_MQ_Envelope *env;
247  size_t name_len;
248 
249  name_len = (NULL == ego->identifier) ? 0 : (strlen (ego->identifier) + 1);
250  env = GNUNET_MQ_msg_extra (um,
251  name_len,
253  um->name_len = htons (name_len);
254  um->end_of_list = htons (GNUNET_NO);
255  um->private_key = *ego->pk;
256  GNUNET_memcpy (&um[1], ego->identifier, name_len);
257  return env;
258 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:98
#define GNUNET_NO
Definition: gnunet_common.h:81
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
#define GNUNET_memcpy(dst, src, n)
char * identifier
String identifier for the ego.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
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
Service informs client about status of a pseudonym.
Definition: identity.h:77
Here is the caller graph for this function:

◆ create_set_default_message()

static struct GNUNET_MQ_Envelope* create_set_default_message ( struct Ego ego,
const char *  servicename 
)
static

Create a set default message with information about the current state of an ego.

Parameters
egoego to create message for
servicenamename of the service to provide in the message
Returns
corresponding set default message

Definition at line 269 of file gnunet-service-identity.c.

References env, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, GNUNET_MQ_msg_extra, SetDefaultMessage::name_len, Ego::pk, SetDefaultMessage::private_key, and SetDefaultMessage::reserved.

Referenced by handle_get_default_message().

271 {
272  struct SetDefaultMessage *sdm;
273  struct GNUNET_MQ_Envelope *env;
274  size_t name_len;
275 
276  name_len = (NULL == servicename) ? 0 : (strlen (servicename) + 1);
277  env = GNUNET_MQ_msg_extra (sdm,
278  name_len,
280  sdm->name_len = htons (name_len);
281  sdm->reserved = htons (0);
282  sdm->private_key = *ego->pk;
283  GNUNET_memcpy (&sdm[1], servicename, name_len);
284  return env;
285 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:154
#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
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:144
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
uint16_t reserved
Always zero.
Definition: identity.h:149
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
#define GNUNET_memcpy(dst, src, n)
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
Here is the caller graph for this function:

◆ handle_start_message()

static void handle_start_message ( void *  cls,
const struct GNUNET_MessageHeader message 
)
static

Handler for START message from client, sends information about all identities to the client immediately and adds the client to the notification context for future updates.

Parameters
clsa struct GNUNET_SERVICE_Client *
messagethe message received

Definition at line 298 of file gnunet-service-identity.c.

References create_update_message(), UpdateMessage::end_of_list, env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_notification_context_add(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_disable_continue_warning(), GNUNET_SERVICE_client_get_mq(), GNUNET_SERVICE_client_mark_monitor(), GNUNET_YES, UpdateMessage::name_len, and Ego::next.

300 {
301  struct GNUNET_SERVICE_Client *client = cls;
302  struct UpdateMessage *ume;
303  struct GNUNET_MQ_Envelope *env;
304  struct Ego *ego;
305 
307  "Received START message from client\n");
312  for (ego = ego_head; NULL != ego; ego = ego->next)
313  {
314  env = create_update_message (ego);
316  }
317  env = GNUNET_MQ_msg_extra (ume,
318  0,
320  ume->end_of_list = htons (GNUNET_YES);
321  ume->name_len = htons (0);
324 }
struct Ego * next
We keep egos in a DLL.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2734
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
void GNUNET_notification_context_add(struct GNUNET_NotificationContext *nc, struct GNUNET_MQ_Handle *mq)
Add a subscriber to the notification context.
Definition: nc.c:164
Handle to a client that is connected to a service.
Definition: service.c:249
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
void GNUNET_SERVICE_client_mark_monitor(struct GNUNET_SERVICE_Client *c)
Set the &#39;monitor&#39; flag on this client.
Definition: service.c:2704
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
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
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:80
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:353
void GNUNET_SERVICE_client_disable_continue_warning(struct GNUNET_SERVICE_Client *c)
Disable the warning the server issues if a message is not acknowledged in a timely fashion...
Definition: service.c:2559
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
static struct GNUNET_MQ_Envelope * create_update_message(struct Ego *ego)
Create an update message with information about the current state of an ego.
Service informs client about status of a pseudonym.
Definition: identity.h:77
Here is the call graph for this function:

◆ check_lookup_message()

static int check_lookup_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP message from client, sends information about ONE identity to the client immediately.

Parameters
clsunused
messagethe message received
Returns
GNUNET_SYSERR if message was ill-formed

Definition at line 336 of file gnunet-service-identity.c.

References GNUNET_MQ_check_zero_termination, and GNUNET_OK.

338 {
340  return GNUNET_OK;
341 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ handle_lookup_message()

static void handle_lookup_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP message from client, sends information about ONE identity to the client immediately.

Parameters
clsa struct GNUNET_SERVICE_Client *
messagethe message received

Definition at line 352 of file gnunet-service-identity.c.

References create_update_message(), env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_get_mq(), Ego::identifier, name, Ego::next, and send_result_code().

354 {
355  struct GNUNET_SERVICE_Client *client = cls;
356  const char *name;
357  struct GNUNET_MQ_Envelope *env;
358  struct Ego *ego;
359 
361  "Received LOOKUP message from client\n");
362  name = (const char *) &message[1];
363  for (ego = ego_head; NULL != ego; ego = ego->next)
364  {
365  if (0 != strcasecmp (name,
366  ego->identifier))
367  continue;
368  env = create_update_message (ego);
371  return;
372  }
373  send_result_code (client,
374  0,
375  "ego not found");
377 }
struct Ego * next
We keep egos in a DLL.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2734
Handle to a client that is connected to a service.
Definition: service.c:249
char * identifier
String identifier for the ego.
const char * name
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
#define GNUNET_log(kind,...)
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:353
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
static struct GNUNET_MQ_Envelope * create_update_message(struct Ego *ego)
Create an update message with information about the current state of an ego.
Here is the call graph for this function:

◆ check_lookup_by_suffix_message()

static int check_lookup_by_suffix_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP message from client, sends information about ONE identity to the client immediately.

Parameters
clsunused
messagethe message received
Returns
GNUNET_SYSERR if message was ill-formed

Definition at line 389 of file gnunet-service-identity.c.

References GNUNET_MQ_check_zero_termination, and GNUNET_OK.

391 {
393  return GNUNET_OK;
394 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ handle_lookup_by_suffix_message()

static void handle_lookup_by_suffix_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP_BY_SUFFIX message from client, sends information about ONE identity to the client immediately.

Parameters
clsa struct GNUNET_SERVICE_Client *
messagethe message received

Definition at line 405 of file gnunet-service-identity.c.

References create_update_message(), env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_get_mq(), Ego::identifier, name, Ego::next, and send_result_code().

407 {
408  struct GNUNET_SERVICE_Client *client = cls;
409  const char *name;
410  struct GNUNET_MQ_Envelope *env;
411  struct Ego *lprefix;
412 
414  "Received LOOKUP_BY_SUFFIX message from client\n");
415  name = (const char *) &message[1];
416  lprefix = NULL;
417  for (struct Ego *ego = ego_head; NULL != ego; ego = ego->next)
418  {
419 
420  if ((strlen (ego->identifier) <= strlen (name)) &&
421  (0 == strcmp (ego->identifier,
422  &name[strlen (name) - strlen (ego->identifier)])) &&
423  ((strlen (name) == strlen (ego->identifier)) ||
424  ('.' == name[strlen (name) -
425  strlen (ego->identifier) - 1])) &&
426  ((NULL == lprefix) ||
427  (strlen (ego->identifier) > strlen (lprefix->identifier))))
428  {
429  /* found better match, update! */
430  lprefix = ego;
431  }
432  }
433  if (NULL != lprefix)
434  {
435  env = create_update_message (lprefix);
438  return;
439  }
440  send_result_code (client,
441  0,
442  "ego not found");
444 }
struct Ego * next
We keep egos in a DLL.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2734
Handle to a client that is connected to a service.
Definition: service.c:249
char * identifier
String identifier for the ego.
const char * name
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
#define GNUNET_log(kind,...)
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:353
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
static struct GNUNET_MQ_Envelope * create_update_message(struct Ego *ego)
Create an update message with information about the current state of an ego.
Here is the call graph for this function:

◆ check_get_default_message()

static int check_get_default_message ( void *  cls,
const struct GetDefaultMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT message.

Parameters
clsclient sending the message
msgmessage of type struct GetDefaultMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 455 of file gnunet-service-identity.c.

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

457 {
458  uint16_t size;
459  uint16_t name_len;
460  const char *name;
461 
462  size = ntohs (msg->header.size);
463  if (size <= sizeof (struct GetDefaultMessage))
464  {
465  GNUNET_break (0);
466  return GNUNET_SYSERR;
467  }
468  name = (const char *) &msg[1];
469  name_len = ntohs (msg->name_len);
470  if ( (name_len + sizeof (struct GetDefaultMessage) != size) ||
471  (0 != ntohs (msg->reserved)) ||
472  ('\0' != name[name_len - 1]) )
473  {
474  GNUNET_break (0);
475  return GNUNET_SYSERR;
476  }
477  return GNUNET_OK;
478 }
uint16_t reserved
Always zero.
Definition: identity.h:123
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:118
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT.
Definition: identity.h:113
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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...
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
static unsigned int size
Size of the "table".
Definition: peer.c:67
const char * name
Client requests knowledge about default identity for a subsystem from identity service.
Definition: identity.h:108

◆ handle_get_default_message()

static void handle_get_default_message ( void *  cls,
const struct GetDefaultMessage gdm 
)
static

Handler for GET_DEFAULT message from client, returns default identity for some service.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 490 of file gnunet-service-identity.c.

References create_set_default_message(), env, gettext_noop, GNUNET_CONFIGURATION_get_value_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MQ_send(), GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_get_mq(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), Ego::identifier, name, Ego::next, and send_result_code().

492 {
493  struct GNUNET_MQ_Envelope *env;
494  struct GNUNET_SERVICE_Client *client = cls;
495  struct Ego *ego;
496  char *name;
497  char *identifier;
498 
499 
500  name = GNUNET_strdup ((const char *) &gdm[1]);
501  GNUNET_STRINGS_utf8_tolower ((const char *) &gdm[1], name);
503  "Received GET_DEFAULT for service `%s' from client\n",
504  name);
505  if (GNUNET_OK !=
507  name,
508  "DEFAULT_IDENTIFIER",
509  &identifier))
510  {
511  send_result_code (client, 1, gettext_noop ("no default known"));
513  GNUNET_free (name);
514  return;
515  }
516  for (ego = ego_head; NULL != ego; ego = ego->next)
517  {
518  if (0 == strcmp (ego->identifier,
519  identifier))
520  {
521  env = create_set_default_message (ego,
522  name);
525  GNUNET_free (identifier);
526  GNUNET_free (name);
527  return;
528  }
529  }
530  GNUNET_free (identifier);
532  "Failed to find ego `%s'\n",
533  name);
534  GNUNET_free (name);
535  send_result_code (client, 1,
536  gettext_noop ("default configured, but ego unknown (internal error)"));
538 }
struct Ego * next
We keep egos in a DLL.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2734
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
Handle to a client that is connected to a service.
Definition: service.c:249
static struct GNUNET_MQ_Envelope * create_set_default_message(struct Ego *ego, const char *servicename)
Create a set default message with information about the current state of an ego.
char * identifier
String identifier for the ego.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
const char * name
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
#define GNUNET_log(kind,...)
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:353
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:558
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ key_cmp()

static int key_cmp ( const struct GNUNET_CRYPTO_EcdsaPrivateKey pk1,
const struct GNUNET_CRYPTO_EcdsaPrivateKey pk2 
)
static

Compare the given two private keys for equality.

Parameters
pk1one private key
pk2another private key
Returns
0 if the keys are equal

Definition at line 549 of file gnunet-service-identity.c.

References GNUNET_memcmp.

Referenced by handle_set_default_message().

551 {
552  return GNUNET_memcmp (pk1, pk2);
553 }
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
Here is the caller graph for this function:

◆ check_set_default_message()

static int check_set_default_message ( void *  cls,
const struct SetDefaultMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT message.

Parameters
clsclient sending the message
msgmessage of type struct SetDefaultMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 563 of file gnunet-service-identity.c.

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

565 {
566  uint16_t size;
567  uint16_t name_len;
568  const char *str;
569 
570  size = ntohs (msg->header.size);
571  if (size <= sizeof (struct SetDefaultMessage))
572  {
573  GNUNET_break (0);
574  return GNUNET_SYSERR;
575  }
576  name_len = ntohs (msg->name_len);
577  GNUNET_break (0 == ntohs (msg->reserved));
578  if (name_len + sizeof (struct SetDefaultMessage) != size)
579  {
580  GNUNET_break (0);
581  return GNUNET_SYSERR;
582  }
583  str = (const char *) &msg[1];
584  if ('\0' != str[name_len - 1])
585  {
586  GNUNET_break (0);
587  return GNUNET_SYSERR;
588  }
589  return GNUNET_OK;
590 }
Used from service to client as a result to the GET_DEFAULT message, used from client to service to SE...
Definition: identity.h:134
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:144
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
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_set_default_message()

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

Handler for SET_DEFAULT message from client, updates default identity for some service.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 601 of file gnunet-service-identity.c.

References _, GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONFIGURATION_write(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), Ego::identifier, key_cmp(), Ego::next, Ego::pk, send_result_code(), and subsystem_cfg_file.

603 {
604  struct Ego *ego;
605  struct GNUNET_SERVICE_Client *client = cls;
606  char *str;
607 
608  str = GNUNET_strdup ((const char *) &sdm[1]);
609  GNUNET_STRINGS_utf8_tolower ((const char *) &sdm[1], str);
610 
612  "Received SET_DEFAULT for service `%s' from client\n",
613  str);
614  for (ego = ego_head; NULL != ego; ego = ego->next)
615  {
616  if (0 == key_cmp (ego->pk,
617  &sdm->private_key))
618  {
620  str,
621  "DEFAULT_IDENTIFIER",
622  ego->identifier);
623  if (GNUNET_OK !=
627  _("Failed to write subsystem default identifier map to `%s'.\n"),
629  send_result_code (client, 0, NULL);
631  GNUNET_free (str);
632  return;
633  }
634  }
635  send_result_code (client, 1, _("Unknown ego specified for service (internal error)"));
636  GNUNET_free (str);
638 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:154
struct Ego * next
We keep egos in a DLL.
int GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
Handle to a client that is connected to a service.
Definition: service.c:249
char * identifier
String identifier for the ego.
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static int key_cmp(const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk1, const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk2)
Compare the given two private keys for equality.
#define GNUNET_log(kind,...)
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:558
Here is the call graph for this function:

◆ notify_listeners()

static void notify_listeners ( struct Ego ego)
static

Send an updated message for the given ego to all listeners.

Parameters
egoego to send the update for

Definition at line 647 of file gnunet-service-identity.c.

References UpdateMessage::end_of_list, GNUNET_free, GNUNET_malloc, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE, GNUNET_NO, GNUNET_notification_context_broadcast(), UpdateMessage::header, Ego::identifier, UpdateMessage::name_len, Ego::pk, UpdateMessage::private_key, GNUNET_MessageHeader::size, and GNUNET_MessageHeader::type.

Referenced by handle_create_message(), handle_delete_message(), and handle_rename_message().

648 {
649  struct UpdateMessage *um;
650  size_t name_len;
651 
652  name_len = (NULL == ego->identifier) ? 0 : (strlen (ego->identifier) + 1);
653  um = GNUNET_malloc (sizeof (struct UpdateMessage) + name_len);
655  um->header.size = htons (sizeof (struct UpdateMessage) + name_len);
656  um->name_len = htons (name_len);
657  um->end_of_list = htons (GNUNET_NO);
658  um->private_key = *ego->pk;
659  GNUNET_memcpy (&um[1], ego->identifier, name_len);
661  &um->header,
662  GNUNET_NO);
663  GNUNET_free (um);
664 }
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE.
Definition: identity.h:82
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:98
#define GNUNET_NO
Definition: gnunet_common.h:81
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
#define GNUNET_memcpy(dst, src, n)
char * identifier
String identifier for the ego.
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
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
void GNUNET_notification_context_broadcast(struct GNUNET_NotificationContext *nc, const struct GNUNET_MessageHeader *msg, int can_drop)
Send a message to all subscribers of this context.
Definition: nc.c:192
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:93
#define GNUNET_malloc(size)
Wrapper around malloc.
Service informs client about status of a pseudonym.
Definition: identity.h:77
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_create_message()

static int check_create_message ( void *  cls,
const struct CreateRequestMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_CREATE message.

Parameters
clsclient sending the message
msgmessage of type struct CreateRequestMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 674 of file gnunet-service-identity.c.

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

676 {
677 
678  uint16_t size;
679  uint16_t name_len;
680  const char *str;
681 
682  size = ntohs (msg->header.size);
683  if (size <= sizeof (struct CreateRequestMessage))
684  {
685  GNUNET_break (0);
686  return GNUNET_SYSERR;
687  }
688  name_len = ntohs (msg->name_len);
689  GNUNET_break (0 == ntohs (msg->reserved));
690  if (name_len + sizeof (struct CreateRequestMessage) != size)
691  {
692  GNUNET_break (0);
693  return GNUNET_SYSERR;
694  }
695  str = (const char *) &msg[1];
696  if ('\0' != str[name_len - 1])
697  {
698  GNUNET_break (0);
699  return GNUNET_SYSERR;
700  }
701  return GNUNET_OK;
702 }
uint16_t reserved
Always zero.
Definition: identity.h:179
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_CREATE.
Definition: identity.h:169
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
uint16_t name_len
Number of bytes in identity name string including 0-termination, in NBO.
Definition: identity.h:174
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
Client requests creation of an identity.
Definition: identity.h:164
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
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

◆ handle_create_message()

static void handle_create_message ( void *  cls,
const struct CreateRequestMessage crm 
)
static

Handler for CREATE message from client, creates new identity.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 713 of file gnunet-service-identity.c.

References fn, get_ego_filename(), gettext_noop, GNUNET_CONTAINER_DLL_insert, GNUNET_DISK_directory_create_for_file(), GNUNET_DISK_fn_write(), GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_log_strerror_file, GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), Ego::identifier, Ego::next, notify_listeners(), Ego::pk, and send_result_code().

715 {
716  struct GNUNET_SERVICE_Client *client = cls;
717  struct Ego *ego;
718  char *str;
719  char *fn;
720 
722  "Received CREATE message from client\n");
723  str = GNUNET_strdup ((const char *) &crm[1]);
724  GNUNET_STRINGS_utf8_tolower ((const char *) &crm[1], str);
725  for (ego = ego_head; NULL != ego; ego = ego->next)
726  {
727  if (0 == strcmp (ego->identifier,
728  str))
729  {
730  send_result_code (client, 1, gettext_noop ("identifier already in use for another ego"));
732  GNUNET_free (str);
733  return;
734  }
735  }
736  ego = GNUNET_new (struct Ego);
738  *ego->pk = crm->private_key;
739  ego->identifier = GNUNET_strdup (str);
741  ego_tail,
742  ego);
743  send_result_code (client, 0, NULL);
744  fn = get_ego_filename (ego);
746  if (sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey) !=
748  &crm->private_key,
749  sizeof (struct GNUNET_CRYPTO_EcdsaPrivateKey),
753  "write", fn);
754  GNUNET_free (fn);
755  GNUNET_free (str);
756  notify_listeners (ego);
758 }
struct Ego * next
We keep egos in a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static char * get_ego_filename(struct Ego *ego)
Get the name of the file we use to store a given ego.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
int GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:833
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Private ECC key encoded for transmission.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
ssize_t GNUNET_DISK_fn_write(const char *fn, const void *buffer, size_t n, enum GNUNET_DISK_AccessPermissions mode)
Write a buffer to a file.
Definition: disk.c:1203
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:184
Handle to a client that is connected to a service.
Definition: service.c:249
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
static char * fn
Filename of the unique file.
char * identifier
String identifier for the ego.
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
static void notify_listeners(struct Ego *ego)
Send an updated message for the given ego to all listeners.
#define GNUNET_log(kind,...)
static struct Ego * ego_tail
Tail of DLL of all egos.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:558
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ handle_ego_rename()

static void handle_ego_rename ( void *  cls,
const char *  section 
)
static

An ego was renamed; rename it in all subsystems where it is currently set as the default.

Parameters
clsthe 'struct RenameContext'
sectiona section in the configuration to process

Definition at line 785 of file gnunet-service-identity.c.

References GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_free, GNUNET_OK, id, RenameContext::new_name, and RenameContext::old_name.

Referenced by handle_rename_message().

787 {
788  struct RenameContext *rc = cls;
789  char *id;
790 
791  if (GNUNET_OK !=
793  section,
794  "DEFAULT_IDENTIFIER",
795  &id))
796  return;
797  if (0 != strcmp (id, rc->old_name))
798  {
799  GNUNET_free (id);
800  return;
801  }
803  section,
804  "DEFAULT_IDENTIFIER",
805  rc->new_name);
806  GNUNET_free (id);
807 }
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
Closure for &#39;handle_ego_rename&#39;.
static char * section
Name of the section.
Definition: gnunet-config.c:33
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
const char * new_name
New name.
const char * old_name
Old name.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_rename_message()

static int check_rename_message ( void *  cls,
const struct RenameMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_RENAME message.

Parameters
clsclient sending the message
msgmessage of type struct RenameMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 817 of file gnunet-service-identity.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, RenameMessage::header, RenameContext::new_name, RenameMessage::new_name_len, RenameContext::old_name, RenameMessage::old_name_len, size, and GNUNET_MessageHeader::size.

819 {
820  uint16_t size;
821  uint16_t old_name_len;
822  uint16_t new_name_len;
823  const char *old_name;
824  const char *new_name;
825 
826  size = ntohs (msg->header.size);
827  if (size <= sizeof (struct RenameMessage))
828  {
829  GNUNET_break (0);
830  return GNUNET_SYSERR;
831  }
832  old_name_len = ntohs (msg->old_name_len);
833  new_name_len = ntohs (msg->new_name_len);
834  old_name = (const char *) &msg[1];
835  new_name = &old_name[old_name_len];
836  if ( (old_name_len + new_name_len + sizeof (struct RenameMessage) != size) ||
837  ('\0' != old_name[old_name_len - 1]) ||
838  ('\0' != new_name[new_name_len - 1]) )
839  {
840  GNUNET_break (0);
841  return GNUNET_SYSERR;
842  }
843 
844  return GNUNET_OK;
845 }
uint16_t old_name_len
Number of characters in the old name including 0-termination, in NBO.
Definition: identity.h:204
Client requests renaming of an identity.
Definition: identity.h:194
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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...
const char * new_name
New name.
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
static unsigned int size
Size of the "table".
Definition: peer.c:67
uint16_t new_name_len
Number of characters in the new name including 0-termination, in NBO.
Definition: identity.h:209
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_RENAME.
Definition: identity.h:199
const char * old_name
Old name.

◆ handle_rename_message()

static void handle_rename_message ( void *  cls,
const struct RenameMessage rm 
)
static

Handler for RENAME message from client, creates new identity.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 857 of file gnunet-service-identity.c.

References _, get_ego_filename(), gettext_noop, GNUNET_CONFIGURATION_iterate_sections(), GNUNET_CONFIGURATION_write(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_log_strerror_file, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), handle_ego_rename(), Ego::identifier, RenameContext::new_name, Ego::next, notify_listeners(), RenameContext::old_name, RenameMessage::old_name_len, RENAME, send_result_code(), and subsystem_cfg_file.

859 {
860  uint16_t old_name_len;
861  struct Ego *ego;
862  char *old_name;
863  char *new_name;
864  struct RenameContext rename_ctx;
865  struct GNUNET_SERVICE_Client *client = cls;
866  char *fn_old;
867  char *fn_new;
868  const char *old_name_tmp;
869 
871  "Received RENAME message from client\n");
872  old_name_len = ntohs (rm->old_name_len);
873  old_name_tmp = (const char *) &rm[1];
874  old_name = GNUNET_strdup (old_name_tmp);
875  GNUNET_STRINGS_utf8_tolower (old_name_tmp, old_name);
876  new_name = GNUNET_strdup (&old_name_tmp[old_name_len]);
877  GNUNET_STRINGS_utf8_tolower (&old_name_tmp[old_name_len], new_name);
878 
879  /* check if new name is already in use */
880  for (ego = ego_head; NULL != ego; ego = ego->next)
881  {
882  if (0 == strcmp (ego->identifier,
883  new_name))
884  {
885  send_result_code (client, 1, gettext_noop ("target name already exists"));
887  GNUNET_free (old_name);
888  GNUNET_free (new_name);
889  return;
890  }
891  }
892 
893  /* locate old name and, if found, perform rename */
894  for (ego = ego_head; NULL != ego; ego = ego->next)
895  {
896  if (0 == strcmp (ego->identifier,
897  old_name))
898  {
899  fn_old = get_ego_filename (ego);
900  GNUNET_free (ego->identifier);
901  rename_ctx.old_name = old_name;
902  rename_ctx.new_name = new_name;
905  &rename_ctx);
906  if (GNUNET_OK !=
910  _("Failed to write subsystem default identifier map to `%s'.\n"),
912  ego->identifier = GNUNET_strdup (new_name);
913  fn_new = get_ego_filename (ego);
914  if (0 != RENAME (fn_old, fn_new))
916  GNUNET_free (fn_old);
917  GNUNET_free (fn_new);
918  GNUNET_free (old_name);
919  GNUNET_free (new_name);
920  notify_listeners (ego);
921  send_result_code (client, 0, NULL);
923  return;
924  }
925  }
926 
927  /* failed to locate old name */
928  send_result_code (client, 1, gettext_noop ("no matching ego found"));
929  GNUNET_free (old_name);
930  GNUNET_free (new_name);
932 }
struct Ego * next
We keep egos in a DLL.
int GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
static char * get_ego_filename(struct Ego *ego)
Get the name of the file we use to store a given ego.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
uint16_t old_name_len
Number of characters in the old name including 0-termination, in NBO.
Definition: identity.h:204
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
Closure for &#39;handle_ego_rename&#39;.
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
Handle to a client that is connected to a service.
Definition: service.c:249
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
char * identifier
String identifier for the ego.
#define RENAME(o, n)
Definition: plibc.h:662
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static void notify_listeners(struct Ego *ego)
Send an updated message for the given ego to all listeners.
void GNUNET_CONFIGURATION_iterate_sections(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_Section_Iterator iter, void *iter_cls)
Iterate over all sections in the configuration.
#define GNUNET_log(kind,...)
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
static void handle_ego_rename(void *cls, const char *section)
An ego was renamed; rename it in all subsystems where it is currently set as the default.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:558
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ handle_ego_delete()

static void handle_ego_delete ( void *  cls,
const char *  section 
)
static

An ego was removed, remove it from all subsystems where it is currently set as the default.

Parameters
clsname of the removed ego (const char *)
sectiona section in the configuration to process

Definition at line 943 of file gnunet-service-identity.c.

References GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_free, GNUNET_OK, id, and Ego::identifier.

Referenced by handle_delete_message().

945 {
946  const char *identifier = cls;
947  char *id;
948 
949  if (GNUNET_OK !=
951  section,
952  "DEFAULT_IDENTIFIER",
953  &id))
954  return;
955  if (0 != strcmp (id, identifier))
956  {
957  GNUNET_free (id);
958  return;
959  }
961  section,
962  "DEFAULT_IDENTIFIER",
963  NULL);
964  GNUNET_free (id);
965 }
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
static char * section
Name of the section.
Definition: gnunet-config.c:33
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_delete_message()

static int check_delete_message ( void *  cls,
const struct DeleteMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_DELETE message.

Parameters
clsclient sending the message
msgmessage of type struct DeleteMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 975 of file gnunet-service-identity.c.

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

977 {
978  uint16_t size;
979  uint16_t name_len;
980  const char *name;
981 
982  size = ntohs (msg->header.size);
983  if (size <= sizeof (struct DeleteMessage))
984  {
985  GNUNET_break (0);
986  return GNUNET_SYSERR;
987  }
988  name = (const char *) &msg[1];
989  name_len = ntohs (msg->name_len);
990  if ( (name_len + sizeof (struct DeleteMessage) != size) ||
991  (0 != ntohs (msg->reserved)) ||
992  ('\0' != name[name_len - 1]) )
993  {
994  GNUNET_break (0);
995  return GNUNET_SYSERR;
996  }
997  return GNUNET_OK;
998 }
uint16_t reserved
Always zero.
Definition: identity.h:235
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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...
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_DELETE.
Definition: identity.h:225
Client requests deletion of an identity.
Definition: identity.h:220
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
static unsigned int size
Size of the "table".
Definition: peer.c:67
const char * name
uint16_t name_len
Number of characters in the name including 0-termination, in NBO.
Definition: identity.h:230

◆ handle_delete_message()

static void handle_delete_message ( void *  cls,
const struct DeleteMessage dm 
)
static

Handler for DELETE message from client, creates new identity.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 1010 of file gnunet-service-identity.c.

References _, fn, get_ego_filename(), gettext_noop, GNUNET_CONFIGURATION_iterate_sections(), GNUNET_CONFIGURATION_write(), GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_log_strerror_file, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), handle_ego_delete(), Ego::identifier, name, Ego::next, notify_listeners(), Ego::pk, send_result_code(), subsystem_cfg_file, and UNLINK.

1012 {
1013  struct Ego *ego;
1014  char *name;
1015  char *fn;
1016  struct GNUNET_SERVICE_Client *client = cls;
1017 
1019  "Received DELETE message from client\n");
1020  name = GNUNET_strdup ((const char *) &dm[1]);
1021  GNUNET_STRINGS_utf8_tolower ((const char *) &dm[1], name);
1022 
1023  for (ego = ego_head; NULL != ego; ego = ego->next)
1024  {
1025  if (0 == strcmp (ego->identifier,
1026  name))
1027  {
1029  ego_tail,
1030  ego);
1033  ego->identifier);
1034  if (GNUNET_OK !=
1038  _("Failed to write subsystem default identifier map to `%s'.\n"),
1040  fn = get_ego_filename (ego);
1041  if (0 != UNLINK (fn))
1043  GNUNET_free (fn);
1044  GNUNET_free (ego->identifier);
1045  ego->identifier = NULL;
1046  notify_listeners (ego);
1047  GNUNET_free (ego->pk);
1048  GNUNET_free (ego);
1049  GNUNET_free (name);
1050  send_result_code (client, 0, NULL);
1052  return;
1053  }
1054  }
1055 
1056  send_result_code (client, 1, gettext_noop ("no matching ego found"));
1057  GNUNET_free (name);
1059 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct Ego * next
We keep egos in a DLL.
int GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
static char * get_ego_filename(struct Ego *ego)
Get the name of the file we use to store a given ego.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define UNLINK(f)
Definition: plibc.h:666
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
Handle to a client that is connected to a service.
Definition: service.c:249
static void handle_ego_delete(void *cls, const char *section)
An ego was removed, remove it from all subsystems where it is currently set as the default...
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
static char * fn
Filename of the unique file.
char * identifier
String identifier for the ego.
const char * name
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static void notify_listeners(struct Ego *ego)
Send an updated message for the given ego to all listeners.
void GNUNET_CONFIGURATION_iterate_sections(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_Section_Iterator iter, void *iter_cls)
Iterate over all sections in the configuration.
#define GNUNET_log(kind,...)
static struct Ego * ego_tail
Tail of DLL of all egos.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2533
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:558
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ process_ego_file()

static int process_ego_file ( void *  cls,
const char *  filename 
)
static

Process the given file from the "EGODIR".

Parses the file and creates the respective 'struct Ego' in memory.

Parameters
clsNULL
filenamename of the file to parse
Returns
GNUNET_OK to continue to iterate, GNUNET_NO to stop iteration with no error, GNUNET_SYSERR to abort iteration with error!

Definition at line 1073 of file gnunet-service-identity.c.

References _, DIR_SEPARATOR, fn, GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_ecdsa_key_create_from_file(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_new, GNUNET_OK, GNUNET_strdup, Ego::identifier, and Ego::pk.

Referenced by run().

1075 {
1076  struct Ego *ego;
1077  const char *fn;
1078 
1079  fn = strrchr (filename, (int) DIR_SEPARATOR);
1080  if (NULL == fn)
1081  {
1082  GNUNET_break (0);
1083  return GNUNET_OK;
1084  }
1085  ego = GNUNET_new (struct Ego);
1087  if (NULL == ego->pk)
1088  {
1089  GNUNET_free (ego);
1091  _("Failed to parse ego information in `%s'\n"),
1092  filename);
1093  return GNUNET_OK;
1094  }
1096  "Loaded ego `%s'\n",
1097  fn + 1);
1098  ego->identifier = GNUNET_strdup (fn + 1);
1100  ego_tail,
1101  ego);
1102  return GNUNET_OK;
1103 }
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#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...
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
static char * fn
Filename of the unique file.
static char * filename
char * identifier
String identifier for the ego.
#define DIR_SEPARATOR
Definition: plibc.h:631
struct GNUNET_CRYPTO_EcdsaPrivateKey * GNUNET_CRYPTO_ecdsa_key_create_from_file(const char *filename)
Create a new private key by reading it from a file.
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
#define GNUNET_log(kind,...)
static struct Ego * ego_tail
Tail of DLL of all egos.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle c,
struct GNUNET_SERVICE_Handle service 
)
static

Handle network size estimate clients.

Parameters
clsclosure
serverthe initialized server
cconfiguration to use

Definition at line 1114 of file gnunet-service-identity.c.

References _, client_connect_cb(), client_disconnect_cb(), ego_directory, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_parse(), GNUNET_DISK_directory_create(), GNUNET_DISK_directory_scan(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_log_config_missing(), GNUNET_MESSAGE_TYPE_IDENTITY_CREATE, GNUNET_MESSAGE_TYPE_IDENTITY_DELETE, GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX, GNUNET_MESSAGE_TYPE_IDENTITY_RENAME, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, GNUNET_MESSAGE_TYPE_IDENTITY_START, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_notification_context_create(), GNUNET_OK, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), GNUNET_SERVICE_MAIN(), GNUNET_SERVICE_OPTION_NONE, GNUNET_STATISTICS_create(), GNUNET_YES, process_ego_file(), shutdown_task(), and subsystem_cfg_file.

1117 {
1118  cfg = c;
1120  if (GNUNET_OK !=
1122  "EGODIR",
1123  &ego_directory))
1124  {
1125  GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "identity", "EGODIR");
1127  return;
1128  }
1129  if (GNUNET_OK !=
1131  "SUBSYSTEM_CFG",
1133  {
1134  GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "identity", "SUBSYSTEM_CFG");
1136  return;
1137  }
1139  "Loading subsystem configuration `%s'\n",
1142  if ( (GNUNET_YES ==
1144  (GNUNET_OK !=
1146  subsystem_cfg_file)) )
1147  {
1149  _("Failed to parse subsystem identity configuration file `%s'\n"),
1152  return;
1153  }
1154  stats = GNUNET_STATISTICS_create ("identity", cfg);
1155  if (GNUNET_OK !=
1157  {
1159  _("Failed to create directory `%s' for storing egos\n"),
1160  ego_directory);
1161  }
1164  NULL);
1166  NULL);
1167 }
int GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory)...
Definition: disk.c:669
int GNUNET_DISK_directory_create(const char *dir)
Implementation of "mkdir -p".
Definition: disk.c:714
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received, or when GNUNET_SCHEDULER_shutdown() is being invoked.
Definition: scheduler.c:1293
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
int GNUNET_CONFIGURATION_parse(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Parse a configuration file, add all of the options in the file to the configuration environment...
int GNUNET_DISK_directory_scan(const char *dir_name, GNUNET_FileNameCallback callback, void *callback_cls)
Scan a directory for files.
Definition: disk.c:1233
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:524
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
static const struct GNUNET_CONFIGURATION_Handle * cfg
Handle to our current configuration.
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
static struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
static void shutdown_task(void *cls)
Task run during shutdown.
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
struct GNUNET_NotificationContext * GNUNET_notification_context_create(unsigned int queue_length)
Create a new notification context.
Definition: nc.c:125
#define GNUNET_log(kind,...)
int GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
static char * ego_directory
Directory where we store the identities.
#define GNUNET_YES
Definition: gnunet_common.h:80
static int process_ego_file(void *cls, const char *filename)
Process the given file from the "EGODIR".
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

GNUNET_SERVICE_MAIN ( "identity"  ,
GNUNET_SERVICE_OPTION_NONE  ,
run,
client_connect_cb,
client_disconnect_cb,
NULL  ,
GNUNET_MQ_hd_fixed_size(start_message, GNUNET_MESSAGE_TYPE_IDENTITY_START, struct GNUNET_MessageHeader, NULL)  ,
GNUNET_MQ_hd_var_size(lookup_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP, struct LookupMessage, NULL)  ,
GNUNET_MQ_hd_var_size(lookup_by_suffix_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX, struct LookupMessage, NULL)  ,
GNUNET_MQ_hd_var_size(get_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT, struct GetDefaultMessage, NULL)  ,
GNUNET_MQ_hd_var_size(set_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, struct SetDefaultMessage, NULL)  ,
GNUNET_MQ_hd_var_size(create_message, GNUNET_MESSAGE_TYPE_IDENTITY_CREATE, struct CreateRequestMessage, NULL)  ,
GNUNET_MQ_hd_var_size(rename_message, GNUNET_MESSAGE_TYPE_IDENTITY_RENAME, struct RenameMessage, NULL)  ,
GNUNET_MQ_hd_var_size(delete_message, GNUNET_MESSAGE_TYPE_IDENTITY_DELETE, struct DeleteMessage, NULL)  ,
GNUNET_MQ_handler_end()   
)

Define "main" method using service macro.

Referenced by run().

Here is the caller graph for this function:

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Handle to our current configuration.

Definition at line 74 of file gnunet-service-identity.c.

◆ subsystem_cfg

struct GNUNET_CONFIGURATION_Handle* subsystem_cfg
static

Handle to subsystem configuration which for each subsystem contains the name of the default ego.

Definition at line 80 of file gnunet-service-identity.c.

◆ stats

struct GNUNET_STATISTICS_Handle* stats
static

Handle to the statistics service.

Definition at line 85 of file gnunet-service-identity.c.

◆ nc

struct GNUNET_NotificationContext* nc
static

Notification context, simplifies client broadcasts.

Definition at line 90 of file gnunet-service-identity.c.

◆ ego_directory

char* ego_directory
static

Directory where we store the identities.

Definition at line 95 of file gnunet-service-identity.c.

Referenced by get_ego_filename(), run(), and shutdown_task().

◆ subsystem_cfg_file

char* subsystem_cfg_file
static

Configuration file name where subsystem information is kept.

Definition at line 100 of file gnunet-service-identity.c.

Referenced by handle_delete_message(), handle_rename_message(), handle_set_default_message(), run(), and shutdown_task().

◆ ego_head

struct Ego* ego_head
static

Head of DLL of all egos.

Definition at line 105 of file gnunet-service-identity.c.

◆ ego_tail

struct Ego* ego_tail
static

Tail of DLL of all egos.

Definition at line 110 of file gnunet-service-identity.c.