diff options
-rw-r--r-- | src/identity/gnunet-service-identity.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/identity/gnunet-service-identity.c b/src/identity/gnunet-service-identity.c index 166f86697..4de7746b0 100644 --- a/src/identity/gnunet-service-identity.c +++ b/src/identity/gnunet-service-identity.c @@ -25,9 +25,6 @@ * * The purpose of this service is to manage private keys that * represent the various egos/pseudonyms/identities of a GNUnet user. - * - * TODO: - * - disk operations */ #include "platform.h" #include "gnunet_util_lib.h" @@ -484,8 +481,10 @@ handle_create_message (void *cls, struct GNUNET_SERVER_Client *client, uint16_t name_len; uint16_t pk_len; struct Ego *ego; + const char *pks; const char *str; struct GNUNET_CRYPTO_EccPrivateKey *pk; + char *fn; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CREATE message from client\n"); @@ -499,15 +498,15 @@ handle_create_message (void *cls, struct GNUNET_SERVER_Client *client, crm = (const struct GNUNET_IDENTITY_CreateRequestMessage *) message; name_len = ntohs (crm->name_len); pk_len = ntohs (crm->pk_len); - str = (const char *) &crm[1]; + pks = (const char *) &crm[1]; if ( (name_len + pk_len + sizeof (struct GNUNET_IDENTITY_CreateRequestMessage) != size) || - (NULL == (pk = GNUNET_CRYPTO_ecc_decode_key (str, pk_len, GNUNET_YES))) ) + (NULL == (pk = GNUNET_CRYPTO_ecc_decode_key (pks, pk_len, GNUNET_YES))) ) { GNUNET_break (0); GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; } - str = &str[pk_len]; + str = &pks[pk_len]; if ('\0' != str[name_len - 1]) { GNUNET_break (0); @@ -532,7 +531,15 @@ handle_create_message (void *cls, struct GNUNET_SERVER_Client *client, ego_tail, ego); send_result_code (client, 0, NULL); - /* FIXME: also write to file! */ + fn = get_ego_filename (ego); + (void) GNUNET_DISK_directory_create_for_file (fn); + if (pk_len != + GNUNET_DISK_fn_write (fn, pks, pk_len, + GNUNET_DISK_PERM_USER_READ | + GNUNET_DISK_PERM_USER_WRITE)) + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, + "write", fn); + GNUNET_free (fn); notify_listeners (ego); GNUNET_SERVER_receive_done (client, GNUNET_OK); } @@ -633,6 +640,8 @@ handle_rename_message (void *cls, struct GNUNET_SERVER_Client *client, GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); return; } + + /* check if new name is already in use */ for (ego = ego_head; NULL != ego; ego = ego->next) { if (0 == strcmp (ego->identifier, @@ -644,6 +653,7 @@ handle_rename_message (void *cls, struct GNUNET_SERVER_Client *client, } } + /* locate old name and, if found, perform rename */ for (ego = ego_head; NULL != ego; ego = ego->next) { if (0 == strcmp (ego->identifier, @@ -663,8 +673,7 @@ handle_rename_message (void *cls, struct GNUNET_SERVER_Client *client, _("Failed to write subsystem default identifier map to `%s'.\n"), subsystem_cfg_file); ego->identifier = GNUNET_strdup (new_name); - fn_new = get_ego_filename (ego); - + fn_new = get_ego_filename (ego); if (0 != RENAME (fn_old, fn_new)) GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "rename", fn_old); GNUNET_free (fn_old); @@ -676,6 +685,7 @@ handle_rename_message (void *cls, struct GNUNET_SERVER_Client *client, } } + /* failed to locate old name */ send_result_code (client, 1, gettext_noop ("no matching ego found")); GNUNET_SERVER_receive_done (client, GNUNET_OK); } |