2 This file is part of GNUnet.
3 Copyright (C) 2013 GNUnet e.V.
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.
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.
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/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file identity/identity_api_suffix_lookup.c
23 * @brief api to lookup an ego
24 * @author Christian Grothoff
27 #include "gnunet_util_lib.h"
28 #include "gnunet_identity_service.h"
31 #define LOG(kind, ...) GNUNET_log_from (kind, "identity-api", __VA_ARGS__)
35 * Handle for ego lookup.
37 struct GNUNET_IDENTITY_EgoSuffixLookup
40 * Connection to service.
42 struct GNUNET_MQ_Handle *mq;
45 * Suffix we are looking up.
50 * Function to call with the result.
52 GNUNET_IDENTITY_EgoSuffixCallback cb;
62 * We received a result code from the service. Check the message
66 * @param rcm result message received
67 * @return #GNUNET_OK if the message is well-formed
70 check_identity_result_code (void *cls, const struct ResultCodeMessage *rcm)
73 if (sizeof(*rcm) != htons (rcm->header.size))
74 GNUNET_MQ_check_zero_termination (rcm);
80 * We received a result code from the service.
83 * @param rcm result message received
86 handle_identity_result_code (void *cls, const struct ResultCodeMessage *rcm)
88 struct GNUNET_IDENTITY_EgoSuffixLookup *el = cls;
91 el->cb (el->cb_cls, NULL, NULL);
92 GNUNET_IDENTITY_ego_lookup_by_suffix_cancel (el);
97 * Check validity of identity update message.
100 * @param um message received
101 * @return #GNUNET_OK if the message is well-formed
104 check_identity_update (void *cls, const struct UpdateMessage *um)
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];
111 if ((size != name_len + sizeof(struct UpdateMessage)) ||
112 ((0 != name_len) && ('\0' != str[name_len - 1])))
115 return GNUNET_SYSERR;
122 * Handle identity update message.
125 * @param um message received
128 handle_identity_update (void *cls, const struct UpdateMessage *um)
130 struct GNUNET_IDENTITY_EgoSuffixLookup *el = cls;
131 uint16_t name_len = ntohs (um->name_len);
132 const char *str = (0 == name_len) ? NULL : (const char *) &um[1];
134 el->cb (el->cb_cls, &um->private_key, str);
135 GNUNET_IDENTITY_ego_lookup_by_suffix_cancel (el);
140 * Generic error handler, called with the appropriate error code and
141 * the same closure specified at the creation of the message queue.
142 * Not every message queue implementation supports an error handler.
144 * @param cls closure with the `struct GNUNET_IDENTITY_EgoSuffixLookup *`
145 * @param error error code
148 mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
150 struct GNUNET_IDENTITY_EgoSuffixLookup *el = cls;
153 el->cb (el->cb_cls, NULL, NULL);
154 GNUNET_IDENTITY_ego_lookup_by_suffix_cancel (el);
159 * Lookup an ego by name.
161 * @param cfg configuration to use
162 * @param name name to look up
163 * @param cb callback to invoke with the result
164 * @param cb_cls closure for @a cb
165 * @return NULL on error
167 struct GNUNET_IDENTITY_EgoSuffixLookup *
168 GNUNET_IDENTITY_ego_lookup_by_suffix (const struct
169 GNUNET_CONFIGURATION_Handle *cfg,
171 GNUNET_IDENTITY_EgoSuffixCallback cb,
174 struct GNUNET_IDENTITY_EgoSuffixLookup *el;
175 struct GNUNET_MQ_Envelope *env;
176 struct GNUNET_MessageHeader *req;
179 GNUNET_assert (NULL != cb);
180 el = GNUNET_new (struct GNUNET_IDENTITY_EgoSuffixLookup);
184 struct GNUNET_MQ_MessageHandler handlers[] =
185 { GNUNET_MQ_hd_var_size (identity_result_code,
186 GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE,
187 struct ResultCodeMessage,
189 GNUNET_MQ_hd_var_size (identity_update,
190 GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE,
191 struct UpdateMessage,
193 GNUNET_MQ_handler_end () };
196 GNUNET_CLIENT_connect (cfg, "identity", handlers, &mq_error_handler, el);
204 el->suffix = GNUNET_strdup (suffix);
205 nlen = strlen (suffix) + 1;
206 env = GNUNET_MQ_msg_extra (req, nlen,
207 GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX);
208 memcpy (&req[1], suffix, nlen);
209 GNUNET_MQ_send (el->mq, env);
215 * Abort ego lookup attempt.
217 * @param el handle for lookup to abort
220 GNUNET_IDENTITY_ego_lookup_by_suffix_cancel (struct
221 GNUNET_IDENTITY_EgoSuffixLookup *el)
223 GNUNET_MQ_destroy (el->mq);
224 GNUNET_free (el->suffix);
229 /* end of identity_api_suffix_lookup.c */