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 117 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().

118 {
119  char *filename;
120 
121  GNUNET_asprintf(&filename,
122  "%s%s%s",
125  ego->identifier);
126  return filename;
127 }
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
#define DIR_SEPARATOR_STR
Definition: platform.h:168
static char * filename
char * identifier
String identifier for the ego.
static char * ego_directory
Directory where we store the identities.
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 137 of file gnunet-service-identity.c.

References GNUNET_ERROR_TYPE_DEBUG, and GNUNET_log.

Referenced by run().

140 {
141  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Client %p disconnected\n", client);
142 }
#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 154 of file gnunet-service-identity.c.

Referenced by run().

157 {
158  return client;
159 }
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 167 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().

168 {
169  struct Ego *e;
170 
171  if (NULL != nc)
172  {
174  nc = NULL;
175  }
176  if (NULL != stats)
177  {
179  stats = NULL;
180  }
182  subsystem_cfg = NULL;
184  subsystem_cfg_file = NULL;
186  ego_directory = NULL;
187  while (NULL != (e = ego_head))
188  {
190  GNUNET_free(e->pk);
192  GNUNET_free(e);
193  }
194 }
#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:78
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:135
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 205 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().

208 {
209  struct ResultCodeMessage *rcm;
210  struct GNUNET_MQ_Envelope *env;
211  size_t elen;
212 
213  if (NULL == emsg)
214  elen = 0;
215  else
216  elen = strlen(emsg) + 1;
217  env =
219  rcm->result_code = htonl(result_code);
220  if (0 < elen)
221  GNUNET_memcpy(&rcm[1], emsg, elen);
223  "Sending result %d (%s) to client\n",
224  (int)result_code,
225  emsg);
227 }
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2424
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#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
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
uint32_t result_code
Status code for the last operation, in NBO.
Definition: identity.h:52
#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:351
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 237 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().

238 {
239  struct UpdateMessage *um;
240  struct GNUNET_MQ_Envelope *env;
241  size_t name_len;
242 
243  name_len = (NULL == ego->identifier) ? 0 : (strlen(ego->identifier) + 1);
245  um->name_len = htons(name_len);
246  um->end_of_list = htons(GNUNET_NO);
247  um->private_key = *ego->pk;
248  GNUNET_memcpy(&um[1], ego->identifier, name_len);
249  return env;
250 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:95
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_NO
Definition: gnunet_common.h:78
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
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:85
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:90
Service informs client about status of a pseudonym.
Definition: identity.h:75
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 261 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().

262 {
263  struct SetDefaultMessage *sdm;
264  struct GNUNET_MQ_Envelope *env;
265  size_t name_len;
266 
267  name_len = (NULL == servicename) ? 0 : (strlen(servicename) + 1);
268  env = GNUNET_MQ_msg_extra(sdm,
269  name_len,
271  sdm->name_len = htons(name_len);
272  sdm->reserved = htons(0);
273  sdm->private_key = *ego->pk;
274  GNUNET_memcpy(&sdm[1], servicename, name_len);
275  return env;
276 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:149
#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:130
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:139
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key of the ego.
uint16_t reserved
Always zero.
Definition: identity.h:144
#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
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 289 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.

290 {
291  struct GNUNET_SERVICE_Client *client = cls;
292  struct UpdateMessage *ume;
293  struct GNUNET_MQ_Envelope *env;
294  struct Ego *ego;
295 
296  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Received START message from client\n");
300  for (ego = ego_head; NULL != ego; ego = ego->next)
301  {
302  env = create_update_message(ego);
304  }
306  ume->end_of_list = htons(GNUNET_YES);
307  ume->name_len = htons(0);
310 }
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:2424
#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:158
Handle to a client that is connected to a service.
Definition: service.c:246
#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:2394
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:85
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:90
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:77
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:351
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:2258
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2234
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:75
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 322 of file gnunet-service-identity.c.

References GNUNET_MQ_check_zero_termination, and GNUNET_OK.

323 {
325  return GNUNET_OK;
326 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#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 337 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().

338 {
339  struct GNUNET_SERVICE_Client *client = cls;
340  const char *name;
341  struct GNUNET_MQ_Envelope *env;
342  struct Ego *ego;
343 
344  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Received LOOKUP message from client\n");
345  name = (const char *)&message[1];
346  for (ego = ego_head; NULL != ego; ego = ego->next)
347  {
348  if (0 != strcasecmp(name, ego->identifier))
349  continue;
350  env = create_update_message(ego);
353  return;
354  }
355  send_result_code(client, 0, "ego not found");
357 }
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:2424
Handle to a client that is connected to a service.
Definition: service.c:246
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:351
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2234
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 369 of file gnunet-service-identity.c.

References GNUNET_MQ_check_zero_termination, and GNUNET_OK.

370 {
372  return GNUNET_OK;
373 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#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 384 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().

385 {
386  struct GNUNET_SERVICE_Client *client = cls;
387  const char *name;
388  struct GNUNET_MQ_Envelope *env;
389  struct Ego *lprefix;
390 
392  "Received LOOKUP_BY_SUFFIX message from client\n");
393  name = (const char *)&message[1];
394  lprefix = NULL;
395  for (struct Ego *ego = ego_head; NULL != ego; ego = ego->next)
396  {
397  if ((strlen(ego->identifier) <= strlen(name)) &&
398  (0 == strcmp(ego->identifier,
399  &name[strlen(name) - strlen(ego->identifier)])) &&
400  ((strlen(name) == strlen(ego->identifier)) ||
401  ('.' == name[strlen(name) - strlen(ego->identifier) - 1])) &&
402  ((NULL == lprefix) ||
403  (strlen(ego->identifier) > strlen(lprefix->identifier))))
404  {
405  /* found better match, update! */
406  lprefix = ego;
407  }
408  }
409  if (NULL != lprefix)
410  {
411  env = create_update_message(lprefix);
414  return;
415  }
416  send_result_code(client, 0, "ego not found");
418 }
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:2424
Handle to a client that is connected to a service.
Definition: service.c:246
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:351
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2234
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 429 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.

430 {
431  uint16_t size;
432  uint16_t name_len;
433  const char *name;
434 
435  size = ntohs(msg->header.size);
436  if (size <= sizeof(struct GetDefaultMessage))
437  {
438  GNUNET_break(0);
439  return GNUNET_SYSERR;
440  }
441  name = (const char *)&msg[1];
442  name_len = ntohs(msg->name_len);
443  if ((name_len + sizeof(struct GetDefaultMessage) != size) ||
444  (0 != ntohs(msg->reserved)) || ('\0' != name[name_len - 1]))
445  {
446  GNUNET_break(0);
447  return GNUNET_SYSERR;
448  }
449  return GNUNET_OK;
450 }
uint16_t reserved
Always zero.
Definition: identity.h:119
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:114
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT.
Definition: identity.h:109
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
const char * name
Client requests knowledge about default identity for a subsystem from identity service.
Definition: identity.h:105

◆ 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 462 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().

463 {
464  struct GNUNET_MQ_Envelope *env;
465  struct GNUNET_SERVICE_Client *client = cls;
466  struct Ego *ego;
467  char *name;
468  char *identifier;
469 
470 
471  name = GNUNET_strdup((const char *)&gdm[1]);
472  GNUNET_STRINGS_utf8_tolower((const char *)&gdm[1], name);
474  "Received GET_DEFAULT for service `%s' from client\n",
475  name);
477  name,
478  "DEFAULT_IDENTIFIER",
479  &identifier))
480  {
481  send_result_code(client, 1, gettext_noop("no default known"));
483  GNUNET_free(name);
484  return;
485  }
486  for (ego = ego_head; NULL != ego; ego = ego->next)
487  {
488  if (0 == strcmp(ego->identifier, identifier))
489  {
490  env = create_set_default_message(ego, name);
493  GNUNET_free(identifier);
494  GNUNET_free(name);
495  return;
496  }
497  }
498  GNUNET_free(identifier);
499  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Failed to find ego `%s'\n", name);
500  GNUNET_free(name);
501  send_result_code(client,
502  1,
503  gettext_noop(
504  "default configured, but ego unknown (internal error)"));
506 }
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:2424
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
Handle to a client that is connected to a service.
Definition: service.c:246
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:351
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:2234
#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:552
#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 517 of file gnunet-service-identity.c.

References GNUNET_memcmp.

Referenced by handle_set_default_message().

519 {
520  return GNUNET_memcmp(pk1, pk2);
521 }
#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 531 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.

532 {
533  uint16_t size;
534  uint16_t name_len;
535  const char *str;
536 
537  size = ntohs(msg->header.size);
538  if (size <= sizeof(struct SetDefaultMessage))
539  {
540  GNUNET_break(0);
541  return GNUNET_SYSERR;
542  }
543  name_len = ntohs(msg->name_len);
544  GNUNET_break(0 == ntohs(msg->reserved));
545  if (name_len + sizeof(struct SetDefaultMessage) != size)
546  {
547  GNUNET_break(0);
548  return GNUNET_SYSERR;
549  }
550  str = (const char *)&msg[1];
551  if ('\0' != str[name_len - 1])
552  {
553  GNUNET_break(0);
554  return GNUNET_SYSERR;
555  }
556  return GNUNET_OK;
557 }
Used from service to client as a result to the GET_DEFAULT message, used from client to service to SE...
Definition: identity.h:130
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:139
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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:144
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT.
Definition: identity.h:134

◆ 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 568 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.

569 {
570  struct Ego *ego;
571  struct GNUNET_SERVICE_Client *client = cls;
572  char *str;
573 
574  str = GNUNET_strdup((const char *)&sdm[1]);
575  GNUNET_STRINGS_utf8_tolower((const char *)&sdm[1], str);
576 
578  "Received SET_DEFAULT for service `%s' from client\n",
579  str);
580  for (ego = ego_head; NULL != ego; ego = ego->next)
581  {
582  if (0 == key_cmp(ego->pk, &sdm->private_key))
583  {
585  str,
586  "DEFAULT_IDENTIFIER",
587  ego->identifier);
588  if (GNUNET_OK !=
590  GNUNET_log(
592  _("Failed to write subsystem default identifier map to `%s'.\n"),
594  send_result_code(client, 0, NULL);
596  GNUNET_free(str);
597  return;
598  }
599  }
600  send_result_code(client,
601  1,
602  _("Unknown ego specified for service (internal error)"));
603  GNUNET_free(str);
605 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:149
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:75
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
Handle to a client that is connected to a service.
Definition: service.c:246
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:2234
#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:552
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 614 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().

615 {
616  struct UpdateMessage *um;
617  size_t name_len;
618 
619  name_len = (NULL == ego->identifier) ? 0 : (strlen(ego->identifier) + 1);
620  um = GNUNET_malloc(sizeof(struct UpdateMessage) + name_len);
622  um->header.size = htons(sizeof(struct UpdateMessage) + name_len);
623  um->name_len = htons(name_len);
624  um->end_of_list = htons(GNUNET_NO);
625  um->private_key = *ego->pk;
626  GNUNET_memcpy(&um[1], ego->identifier, name_len);
628  GNUNET_free(um);
629 }
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE.
Definition: identity.h:79
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:95
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_NO
Definition: gnunet_common.h:78
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.
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:85
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:187
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:90
#define GNUNET_malloc(size)
Wrapper around malloc.
Service informs client about status of a pseudonym.
Definition: identity.h:75
#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 639 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.

640 {
641  uint16_t size;
642  uint16_t name_len;
643  const char *str;
644 
645  size = ntohs(msg->header.size);
646  if (size <= sizeof(struct CreateRequestMessage))
647  {
648  GNUNET_break(0);
649  return GNUNET_SYSERR;
650  }
651  name_len = ntohs(msg->name_len);
652  GNUNET_break(0 == ntohs(msg->reserved));
653  if (name_len + sizeof(struct CreateRequestMessage) != size)
654  {
655  GNUNET_break(0);
656  return GNUNET_SYSERR;
657  }
658  str = (const char *)&msg[1];
659  if ('\0' != str[name_len - 1])
660  {
661  GNUNET_break(0);
662  return GNUNET_SYSERR;
663  }
664  return GNUNET_OK;
665 }
uint16_t reserved
Always zero.
Definition: identity.h:173
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_CREATE.
Definition: identity.h:163
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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:168
#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:159
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
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:85

◆ 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 676 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().

677 {
678  struct GNUNET_SERVICE_Client *client = cls;
679  struct Ego *ego;
680  char *str;
681  char *fn;
682 
683  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Received CREATE message from client\n");
684  str = GNUNET_strdup((const char *)&crm[1]);
685  GNUNET_STRINGS_utf8_tolower((const char *)&crm[1], str);
686  for (ego = ego_head; NULL != ego; ego = ego->next)
687  {
688  if (0 == strcmp(ego->identifier, str))
689  {
690  send_result_code(client,
691  1,
692  gettext_noop(
693  "identifier already in use for another ego"));
695  GNUNET_free(str);
696  return;
697  }
698  }
699  ego = GNUNET_new(struct Ego);
701  *ego->pk = crm->private_key;
702  ego->identifier = GNUNET_strdup(str);
704  send_result_code(client, 0, NULL);
705  fn = get_ego_filename(ego);
707  if (sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey) !=
709  &crm->private_key,
710  sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey),
714  GNUNET_free(fn);
715  GNUNET_free(str);
716  notify_listeners(ego);
718 }
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:681
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:877
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:178
Handle to a client that is connected to a service.
Definition: service.c:246
#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:2234
#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:552
#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 744 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().

745 {
746  struct RenameContext *rc = cls;
747  char *id;
748 
750  section,
751  "DEFAULT_IDENTIFIER",
752  &id))
753  return;
754  if (0 != strcmp(id, rc->old_name))
755  {
756  GNUNET_free(id);
757  return;
758  }
760  section,
761  "DEFAULT_IDENTIFIER",
762  rc->new_name);
763  GNUNET_free(id);
764 }
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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 774 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.

775 {
776  uint16_t size;
777  uint16_t old_name_len;
778  uint16_t new_name_len;
779  const char *old_name;
780  const char *new_name;
781 
782  size = ntohs(msg->header.size);
783  if (size <= sizeof(struct RenameMessage))
784  {
785  GNUNET_break(0);
786  return GNUNET_SYSERR;
787  }
788  old_name_len = ntohs(msg->old_name_len);
789  new_name_len = ntohs(msg->new_name_len);
790  old_name = (const char *)&msg[1];
791  new_name = &old_name[old_name_len];
792  if ((old_name_len + new_name_len + sizeof(struct RenameMessage) != size) ||
793  ('\0' != old_name[old_name_len - 1]) ||
794  ('\0' != new_name[new_name_len - 1]))
795  {
796  GNUNET_break(0);
797  return GNUNET_SYSERR;
798  }
799 
800  return GNUNET_OK;
801 }
uint16_t old_name_len
Number of characters in the old name including 0-termination, in NBO.
Definition: identity.h:197
Client requests renaming of an identity.
Definition: identity.h:188
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
uint16_t new_name_len
Number of characters in the new name including 0-termination, in NBO.
Definition: identity.h:202
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_RENAME.
Definition: identity.h:192
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 813 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, send_result_code(), and subsystem_cfg_file.

814 {
815  uint16_t old_name_len;
816  struct Ego *ego;
817  char *old_name;
818  char *new_name;
819  struct RenameContext rename_ctx;
820  struct GNUNET_SERVICE_Client *client = cls;
821  char *fn_old;
822  char *fn_new;
823  const char *old_name_tmp;
824 
825  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Received RENAME message from client\n");
826  old_name_len = ntohs(rm->old_name_len);
827  old_name_tmp = (const char *)&rm[1];
828  old_name = GNUNET_strdup(old_name_tmp);
829  GNUNET_STRINGS_utf8_tolower(old_name_tmp, old_name);
830  new_name = GNUNET_strdup(&old_name_tmp[old_name_len]);
831  GNUNET_STRINGS_utf8_tolower(&old_name_tmp[old_name_len], new_name);
832 
833  /* check if new name is already in use */
834  for (ego = ego_head; NULL != ego; ego = ego->next)
835  {
836  if (0 == strcmp(ego->identifier, new_name))
837  {
838  send_result_code(client, 1, gettext_noop("target name already exists"));
840  GNUNET_free(old_name);
841  GNUNET_free(new_name);
842  return;
843  }
844  }
845 
846  /* locate old name and, if found, perform rename */
847  for (ego = ego_head; NULL != ego; ego = ego->next)
848  {
849  if (0 == strcmp(ego->identifier, old_name))
850  {
851  fn_old = get_ego_filename(ego);
852  GNUNET_free(ego->identifier);
853  rename_ctx.old_name = old_name;
854  rename_ctx.new_name = new_name;
857  &rename_ctx);
858  if (GNUNET_OK !=
860  GNUNET_log(
862  _("Failed to write subsystem default identifier map to `%s'.\n"),
864  ego->identifier = GNUNET_strdup(new_name);
865  fn_new = get_ego_filename(ego);
866  if (0 != rename(fn_old, fn_new))
868  GNUNET_free(fn_old);
869  GNUNET_free(fn_new);
870  GNUNET_free(old_name);
871  GNUNET_free(new_name);
872  notify_listeners(ego);
873  send_result_code(client, 0, NULL);
875  return;
876  }
877  }
878 
879  /* failed to locate old name */
880  send_result_code(client, 1, gettext_noop("no matching ego found"));
881  GNUNET_free(old_name);
882  GNUNET_free(new_name);
884 }
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:197
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
Closure for &#39;handle_ego_rename&#39;.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
Handle to a client that is connected to a service.
Definition: service.c:246
#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.
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:2234
#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:552
#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 895 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().

896 {
897  const char *identifier = cls;
898  char *id;
899 
901  section,
902  "DEFAULT_IDENTIFIER",
903  &id))
904  return;
905  if (0 != strcmp(id, identifier))
906  {
907  GNUNET_free(id);
908  return;
909  }
911  section,
912  "DEFAULT_IDENTIFIER",
913  NULL);
914  GNUNET_free(id);
915 }
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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 925 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.

926 {
927  uint16_t size;
928  uint16_t name_len;
929  const char *name;
930 
931  size = ntohs(msg->header.size);
932  if (size <= sizeof(struct DeleteMessage))
933  {
934  GNUNET_break(0);
935  return GNUNET_SYSERR;
936  }
937  name = (const char *)&msg[1];
938  name_len = ntohs(msg->name_len);
939  if ((name_len + sizeof(struct DeleteMessage) != size) ||
940  (0 != ntohs(msg->reserved)) || ('\0' != name[name_len - 1]))
941  {
942  GNUNET_break(0);
943  return GNUNET_SYSERR;
944  }
945  return GNUNET_OK;
946 }
uint16_t reserved
Always zero.
Definition: identity.h:227
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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:217
Client requests deletion of an identity.
Definition: identity.h:213
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
const char * name
uint16_t name_len
Number of characters in the name including 0-termination, in NBO.
Definition: identity.h:222

◆ 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 958 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(), and subsystem_cfg_file.

959 {
960  struct Ego *ego;
961  char *name;
962  char *fn;
963  struct GNUNET_SERVICE_Client *client = cls;
964 
965  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Received DELETE message from client\n");
966  name = GNUNET_strdup((const char *)&dm[1]);
967  GNUNET_STRINGS_utf8_tolower((const char *)&dm[1], name);
968 
969  for (ego = ego_head; NULL != ego; ego = ego->next)
970  {
971  if (0 == strcmp(ego->identifier, name))
972  {
976  ego->identifier);
977  if (GNUNET_OK !=
979  GNUNET_log(
981  _("Failed to write subsystem default identifier map to `%s'.\n"),
983  fn = get_ego_filename(ego);
984  if (0 != unlink(fn))
986  GNUNET_free(fn);
987  GNUNET_free(ego->identifier);
988  ego->identifier = NULL;
989  notify_listeners(ego);
990  GNUNET_free(ego->pk);
991  GNUNET_free(ego);
992  GNUNET_free(name);
993  send_result_code(client, 0, NULL);
995  return;
996  }
997  }
998 
999  send_result_code(client, 1, gettext_noop("no matching ego found"));
1000  GNUNET_free(name);
1002 }
#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:75
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
Handle to a client that is connected to a service.
Definition: service.c:246
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:2234
#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:552
#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 1016 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().

1017 {
1018  struct Ego *ego;
1019  const char *fn;
1020 
1021  fn = strrchr(filename, (int)DIR_SEPARATOR);
1022  if (NULL == fn)
1023  {
1024  GNUNET_break(0);
1025  return GNUNET_OK;
1026  }
1027  ego = GNUNET_new(struct Ego);
1029  if (NULL == ego->pk)
1030  {
1031  GNUNET_free(ego);
1033  _("Failed to parse ego information in `%s'\n"),
1034  filename);
1035  return GNUNET_OK;
1036  }
1037  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Loaded ego `%s'\n", fn + 1);
1038  ego->identifier = GNUNET_strdup(fn + 1);
1040  return GNUNET_OK;
1041 }
#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:75
#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:181
static char * fn
Filename of the unique file.
static char * filename
char * identifier
String identifier for the ego.
#define DIR_SEPARATOR
Definition: platform.h:167
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 1052 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.

1055 {
1056  cfg = c;
1059  "identity",
1060  "EGODIR",
1061  &ego_directory))
1062  {
1063  GNUNET_log_config_missing(GNUNET_ERROR_TYPE_ERROR, "identity", "EGODIR");
1065  return;
1066  }
1067  if (GNUNET_OK !=
1069  "identity",
1070  "SUBSYSTEM_CFG",
1072  {
1074  "identity",
1075  "SUBSYSTEM_CFG");
1077  return;
1078  }
1080  "Loading subsystem configuration `%s'\n",
1084  (GNUNET_OK !=
1086  {
1088  _(
1089  "Failed to parse subsystem identity configuration file `%s'\n"),
1092  return;
1093  }
1094  stats = GNUNET_STATISTICS_create("identity", cfg);
1096  {
1098  _("Failed to create directory `%s' for storing egos\n"),
1099  ego_directory);
1100  }
1103 }
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:541
int GNUNET_DISK_directory_create(const char *dir)
Implementation of "mkdir -p".
Definition: disk.c:586
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:1284
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:75
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:909
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:517
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
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:119
#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:77
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 71 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 77 of file gnunet-service-identity.c.

◆ stats

struct GNUNET_STATISTICS_Handle* stats
static

Handle to the statistics service.

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

◆ nc

struct GNUNET_NotificationContext* nc
static

Notification context, simplifies client broadcasts.

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

◆ ego_directory

char* ego_directory
static

Directory where we store the identities.

Definition at line 92 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 97 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 102 of file gnunet-service-identity.c.

◆ ego_tail

struct Ego* ego_tail
static

Tail of DLL of all egos.

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