GNUnet  0.10.x
identity_api_lookup.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2013 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
26 #include "platform.h"
27 #include "gnunet_util_lib.h"
29 #include "identity.h"
30 
31 #define LOG(kind, ...) GNUNET_log_from(kind, "identity-api", __VA_ARGS__)
32 
33 
42 
46  char *name;
47 
52 
56  void *cb_cls;
57 };
58 
59 
68 static int
69 check_identity_result_code(void *cls, const struct ResultCodeMessage *rcm)
70 {
71  if (sizeof(*rcm) != htons(rcm->header.size))
73  return GNUNET_OK;
74 }
75 
76 
83 static void
84 handle_identity_result_code(void *cls, const struct ResultCodeMessage *rcm)
85 {
86  struct GNUNET_IDENTITY_EgoLookup *el = cls;
87 
88  el->cb(el->cb_cls, NULL);
90 }
91 
92 
100 static int
101 check_identity_update(void *cls, const struct UpdateMessage *um)
102 {
103  uint16_t size = ntohs(um->header.size);
104  uint16_t name_len = ntohs(um->name_len);
105  const char *str = (const char *)&um[1];
106 
107  if ((size != name_len + sizeof(struct UpdateMessage)) ||
108  ((0 != name_len) && ('\0' != str[name_len - 1])))
109  {
110  GNUNET_break(0);
111  return GNUNET_SYSERR;
112  }
113  return GNUNET_OK;
114 }
115 
116 
123 static void
124 handle_identity_update(void *cls, const struct UpdateMessage *um)
125 {
126  struct GNUNET_IDENTITY_EgoLookup *el = cls;
127  uint16_t name_len = ntohs(um->name_len);
128  const char *str = (0 == name_len) ? NULL : (const char *)&um[1];
129  struct GNUNET_CRYPTO_EcdsaPublicKey pub;
130  struct GNUNET_HashCode id;
131  struct GNUNET_IDENTITY_Ego ego;
132 
133  GNUNET_break(GNUNET_YES != ntohs(um->end_of_list));
135  GNUNET_CRYPTO_hash(&pub, sizeof(pub), &id);
136  ego.pk = (struct GNUNET_CRYPTO_EcdsaPrivateKey *)&um->private_key;
137  ego.name = (char *)str;
138  ego.id = id;
139  el->cb(el->cb_cls, &ego);
141 }
142 
143 
152 static void
153 mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
154 {
155  struct GNUNET_IDENTITY_EgoLookup *el = cls;
156 
157  el->cb(el->cb_cls, NULL);
158 }
159 
160 
172  const char *name,
174  void *cb_cls)
175 {
177  struct GNUNET_MQ_Envelope *env;
178  struct GNUNET_MessageHeader *req;
179  size_t nlen;
180 
181  GNUNET_assert(NULL != cb);
183  el->cb = cb;
184  el->cb_cls = cb_cls;
185  {
186  struct GNUNET_MQ_MessageHandler handlers[] =
187  { GNUNET_MQ_hd_var_size(identity_result_code,
189  struct ResultCodeMessage,
190  el),
191  GNUNET_MQ_hd_var_size(identity_update,
193  struct UpdateMessage,
194  el),
196 
197  el->mq =
198  GNUNET_CLIENT_connect(cfg, "identity", handlers, &mq_error_handler, el);
199  }
200  if (NULL == el->mq)
201  {
202  GNUNET_break(0);
203  GNUNET_free(el);
204  return NULL;
205  }
206  el->name = GNUNET_strdup(name);
207  nlen = strlen(name) + 1;
209  memcpy(&req[1], name, nlen);
210  GNUNET_MQ_send(el->mq, env);
211  return el;
212 }
213 
214 
220 void
222 {
223  GNUNET_MQ_destroy(el->mq);
224  GNUNET_free(el->name);
225  GNUNET_free(el);
226 }
227 
228 
229 /* end of identity_api_lookup.c */
static void handle_identity_result_code(void *cls, const struct ResultCodeMessage *rcm)
We received a result code from the service.
void GNUNET_IDENTITY_ego_lookup_cancel(struct GNUNET_IDENTITY_EgoLookup *el)
Abort ego lookup attempt.
Handle for ego lookup.
Common type definitions for the identity service and API.
static struct GNUNET_IDENTITY_EgoLookup * el
EgoLookup.
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:900
GNUNET_MQ_Error
Error codes for the queue.
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE.
Definition: identity.h:79
struct GNUNET_MQ_Handle * mq
Connection to service.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE.
Definition: identity.h:46
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:95
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#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.
Private ECC key encoded for transmission.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#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...
static int check_identity_result_code(void *cls, const struct ResultCodeMessage *rcm)
We received a result code from the service.
char * name
Current name associated with this ego.
Definition: identity.h: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
Handle for an ego.
Definition: identity.h:237
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:44
#define GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP
First message send from identity client to service to lookup a single ego.
static int check_identity_update(void *cls, const struct UpdateMessage *um)
Check validity of identity update message.
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
A 512-bit hashcode.
Message handler for a specific message type.
static void handle_identity_update(void *cls, const struct UpdateMessage *um)
Handle identity update message.
struct GNUNET_HashCode id
Hash of the public key of this ego.
Definition: identity.h:256
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:104
void(* GNUNET_IDENTITY_EgoCallback)(void *cls, const struct GNUNET_IDENTITY_Ego *ego)
Function called with the result.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
void GNUNET_CRYPTO_ecdsa_key_get_public(const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv, struct GNUNET_CRYPTO_EcdsaPublicKey *pub)
Extract the public key for the given private key.
Definition: crypto_ecc.c:241
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
Handle to a message queue.
Definition: mq.c:84
struct GNUNET_IDENTITY_EgoLookup * GNUNET_IDENTITY_ego_lookup(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *name, GNUNET_IDENTITY_EgoCallback cb, void *cb_cls)
Lookup an ego by name.
configuration data
Definition: configuration.c:83
char * name
Name of the ego we are looking up.
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:90
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and ECDS...
GNUNET_IDENTITY_EgoCallback cb
Function to call with the result.
Header for all communications.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:821
#define GNUNET_YES
Definition: gnunet_common.h:77
#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
void * cb_cls
Closure for cb.
struct GNUNET_CRYPTO_EcdsaPrivateKey * pk
Private key associated with this ego.
Definition: identity.h:241
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
Answer from service to client about last operation; GET_DEFAULT maybe answered with this message on f...
Definition: identity.h:42
Service informs client about status of a pseudonym.
Definition: identity.h:75
#define GNUNET_free(ptr)
Wrapper around free.