GNUnet  0.19.3
identity_api_suffix_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 
38 {
43 
47  char *suffix;
48 
53 
57  void *cb_cls;
58 };
59 
60 
69 static int
70 check_identity_result_code (void *cls, const struct ResultCodeMessage *rcm)
71 {
72  (void) cls;
73  if (sizeof(*rcm) != htons (rcm->header.size))
75  return GNUNET_OK;
76 }
77 
78 
85 static void
86 handle_identity_result_code (void *cls, const struct ResultCodeMessage *rcm)
87 {
88  struct GNUNET_IDENTITY_EgoSuffixLookup *el = cls;
89 
90  (void) rcm;
91  el->cb (el->cb_cls, NULL, NULL);
93 }
94 
95 
103 static int
104 check_identity_update (void *cls, const struct UpdateMessage *um)
105 {
106  uint16_t size = ntohs (um->header.size);
107  uint16_t name_len = ntohs (um->name_len);
108  const char *str = (const char *) &um[1];
109 
110  (void) cls;
111  if ((size < name_len + sizeof(struct UpdateMessage)) ||
112  ((0 != name_len) && ('\0' != str[name_len - 1])))
113  {
114  GNUNET_break (0);
115  return GNUNET_SYSERR;
116  }
117  return GNUNET_OK;
118 }
119 
120 
127 static void
128 handle_identity_update (void *cls, const struct UpdateMessage *um)
129 {
130  struct GNUNET_IDENTITY_EgoSuffixLookup *el = cls;
131  uint16_t name_len = ntohs (um->name_len);
132  const char *str;
133  size_t key_len;
134  size_t kb_read;
135  struct GNUNET_IDENTITY_PrivateKey private_key;
136  const char *tmp;
137 
138  tmp = (const char*) &um[1];
139  str = (0 == name_len) ? NULL : tmp;
140  memset (&private_key, 0, sizeof (private_key));
141  key_len = ntohs (um->header.size) - name_len - sizeof (*um);
142  if (0 < key_len)
143  {
146  key_len,
147  &private_key,
148  &kb_read));
149  GNUNET_assert (key_len == kb_read);
150  }
151  el->cb (el->cb_cls, &private_key, str);
153 }
154 
155 
164 static void
165 mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
166 {
167  struct GNUNET_IDENTITY_EgoSuffixLookup *el = cls;
168 
169  (void) error;
170  el->cb (el->cb_cls, NULL, NULL);
172 }
173 
174 
187  const char *suffix,
189  void *cb_cls)
190 {
192  struct GNUNET_MQ_Envelope *env;
193  struct GNUNET_MessageHeader *req;
194  size_t nlen;
195 
196  GNUNET_assert (NULL != cb);
198  el->cb = cb;
199  el->cb_cls = cb_cls;
200  {
202  { GNUNET_MQ_hd_var_size (identity_result_code,
204  struct ResultCodeMessage,
205  el),
206  GNUNET_MQ_hd_var_size (identity_update,
208  struct UpdateMessage,
209  el),
211 
212  el->mq =
214  }
215  if (NULL == el->mq)
216  {
217  GNUNET_break (0);
218  GNUNET_free (el);
219  return NULL;
220  }
221  el->suffix = GNUNET_strdup (suffix);
222  nlen = strlen (suffix) + 1;
223  env = GNUNET_MQ_msg_extra (req, nlen,
225  memcpy (&req[1], suffix, nlen);
226  GNUNET_MQ_send (el->mq, env);
227  return el;
228 }
229 
230 
236 void
239 {
241  GNUNET_free (el->suffix);
242  GNUNET_free (el);
243 }
244 
245 
246 /* end of identity_api_suffix_lookup.c */
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static struct GNUNET_IDENTITY_EgoLookup * el
EgoLookup.
Definition: gnunet-abd.c:51
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
Identity service; implements identity management for GNUnet.
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:1057
void(* GNUNET_IDENTITY_EgoSuffixCallback)(void *cls, const struct GNUNET_IDENTITY_PrivateKey *priv, const char *ego_name)
Function called with the result.
enum GNUNET_GenericReturnValue GNUNET_IDENTITY_read_private_key_from_buffer(const void *buffer, size_t len, struct GNUNET_IDENTITY_PrivateKey *key, size_t *kb_read)
Reads a GNUNET_IDENTITY_PrivateKey from a compact buffer.
Definition: identity_api.c:908
struct GNUNET_IDENTITY_EgoSuffixLookup * GNUNET_IDENTITY_ego_lookup_by_suffix(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *suffix, GNUNET_IDENTITY_EgoSuffixCallback cb, void *cb_cls)
Lookup an ego by name.
void GNUNET_IDENTITY_ego_lookup_by_suffix_cancel(struct GNUNET_IDENTITY_EgoSuffixLookup *el)
Abort ego lookup attempt.
@ GNUNET_OK
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_MQ_Error
Error codes for the queue.
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:304
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#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_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:62
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:683
#define GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE
Generic response from identity service with success and/or error message.
#define GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX
First message send from identity client to service to lookup a single ego matching the given suffix (...
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
Common type definitions for the identity service and API.
static void handle_identity_result_code(void *cls, const struct ResultCodeMessage *rcm)
We received a result code from the service.
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...
static void handle_identity_update(void *cls, const struct UpdateMessage *um)
Handle identity update message.
static int check_identity_result_code(void *cls, const struct ResultCodeMessage *rcm)
We received a result code from the service.
static unsigned int size
Size of the "table".
Definition: peer.c:68
struct GNUNET_MQ_Handle * mq
Connection to service.
void * cb_cls
Closure for cb.
GNUNET_IDENTITY_EgoCallback cb
Function to call with the result.
GNUNET_IDENTITY_EgoSuffixCallback cb
Function to call with the result.
struct GNUNET_MQ_Handle * mq
Connection to service.
char * suffix
Suffix we are looking up.
A private key for an identity as per LSD0001.
Handle to a message queue.
Definition: mq.c:87
Message handler for a specific message type.
Header for all communications.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
Answer from service to client about last operation; GET_DEFAULT maybe answered with this message on f...
Definition: identity.h:81
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE.
Definition: identity.h:85
Service informs client about status of a pseudonym.
Definition: identity.h:114
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:124
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE.
Definition: identity.h:118