[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r28064 - gnunet/src/identity
From: |
gnunet |
Subject: |
[GNUnet-SVN] r28064 - gnunet/src/identity |
Date: |
Mon, 15 Jul 2013 23:40:26 +0200 |
Author: grothoff
Date: 2013-07-15 23:40:26 +0200 (Mon, 15 Jul 2013)
New Revision: 28064
Modified:
gnunet/src/identity/gnunet-service-identity.c
Log:
-towards handling identifier creation
Modified: gnunet/src/identity/gnunet-service-identity.c
===================================================================
--- gnunet/src/identity/gnunet-service-identity.c 2013-07-15 21:34:40 UTC
(rev 28063)
+++ gnunet/src/identity/gnunet-service-identity.c 2013-07-15 21:40:26 UTC
(rev 28064)
@@ -302,12 +302,62 @@
handle_create_message (void *cls, struct GNUNET_SERVER_Client *client,
const struct GNUNET_MessageHeader *message)
{
+ const struct GNUNET_IDENTITY_CreateRequestMessage *crm;
+ uint16_t size;
+ uint16_t name_len;
+ uint16_t pk_len;
+ struct Ego *ego;
+ const char *str;
+ struct GNUNET_CRYPTO_EccPrivateKey *pk;
+
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Received CREATE message from client\n");
- // setup_estimate_message (&em);
- // GNUNET_SERVER_notification_context_unicast (nc, client, &em.header,
GNUNET_YES);
- GNUNET_break (0); // not implemented!
- GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ size = ntohs (message->size);
+ if (size <= sizeof (struct GNUNET_IDENTITY_CreateRequestMessage))
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ crm = (const struct GNUNET_IDENTITY_CreateRequestMessage *) message;
+ name_len = ntohs (crm->name_len);
+ pk_len = ntohs (crm->pk_len);
+ str = (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)))
)
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ str = &str[pk_len];
+ if ('\0' != str[name_len - 1])
+ {
+ GNUNET_break (0);
+ GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+ return;
+ }
+ for (ego = ego_head; NULL != ego; ego = ego->next)
+ {
+ if (0 == strcmp (ego->identifier,
+ str))
+ {
+ send_result_code (client, 1, gettext_noop ("identifier already in use
for another ego"));
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
+ GNUNET_CRYPTO_ecc_key_free (pk);
+ return;
+ }
+ }
+ ego = GNUNET_new (struct Ego);
+ ego->pk = pk;
+ ego->identifier = GNUNET_strdup (str);
+ GNUNET_CONTAINER_DLL_insert (ego_head,
+ ego_tail,
+ ego);
+ send_result_code (client, 0, NULL);
+ /* FIXME: also write to file! */
+ notify_listeners (ego);
+ GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r28064 - gnunet/src/identity,
gnunet <=