GNUnet 0.21.2
json_reclaim.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2009-2018 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"
28#include "gnunet_json_lib.h"
29#include "gnunet_reclaim_lib.h"
31
32
41static int
42parse_attr (void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
43{
44 struct GNUNET_RECLAIM_Attribute *attr;
45 const char *name_str = NULL;
46 const char *val_str = NULL;
47 const char *type_str = NULL;
48 const char *id_str = NULL;
49 const char *cred_str = NULL;
50 const char *flag_str = NULL;
51 char *data;
52 int unpack_state;
53 uint32_t type;
54 size_t data_size;
55
56 GNUNET_assert (NULL != root);
57
58 if (! json_is_object (root))
59 {
61 "Error json is not array nor object!\n");
62 return GNUNET_SYSERR;
63 }
64 // interpret single attribute
65 unpack_state = json_unpack (root,
66 "{s:s, s?s, s?s, s:s, s:s, s?s!}",
67 "name",
68 &name_str,
69 "id",
70 &id_str,
71 "credential",
72 &cred_str,
73 "type",
74 &type_str,
75 "value",
76 &val_str,
77 "flag",
78 &flag_str);
79 if ((0 != unpack_state) || (NULL == name_str) || (NULL == val_str) ||
80 (NULL == type_str))
81 {
83 "Error json object has a wrong format!\n");
84 return GNUNET_SYSERR;
85 }
87 if (GNUNET_SYSERR ==
89 val_str,
90 (void **) &data,
91 &data_size)))
92 {
93 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Attribute value invalid!\n");
94 return GNUNET_SYSERR;
95 }
96 attr = GNUNET_RECLAIM_attribute_new (name_str, NULL,
99 if ((NULL != cred_str) && (0 != strlen (cred_str)))
100 {
102 strlen (cred_str),
103 &attr->credential,
104 sizeof(attr->credential));
105 }
106 if ((NULL == id_str) || (0 == strlen (id_str)))
107 memset (&attr->id, 0, sizeof (attr->id));
108 else
110 strlen (id_str),
111 &attr->id,
112 sizeof(attr->id));
113
114 *(struct GNUNET_RECLAIM_Attribute **) spec->ptr = attr;
115 return GNUNET_OK;
116}
117
118
125static void
126clean_attr (void *cls, struct GNUNET_JSON_Specification *spec)
127{
128 struct GNUNET_RECLAIM_Attribute **attr;
129
130 attr = (struct GNUNET_RECLAIM_Attribute **) spec->ptr;
131 if (NULL != *attr)
132 {
133 GNUNET_free (*attr);
134 *attr = NULL;
135 }
136}
137
138
147{
148 struct GNUNET_JSON_Specification ret = { .parser = &parse_attr,
149 .cleaner = &clean_attr,
150 .cls = NULL,
151 .field = NULL,
152 .ptr = attr,
153 .ptr_size = 0,
154 .size_ptr = NULL };
155
156 *attr = NULL;
157 return ret;
158}
159
160
169static int
170parse_ticket (void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
171{
173 const char *gns_str;
174 int unpack_state;
175
176 GNUNET_assert (NULL != root);
177
178 if (! json_is_object (root))
179 {
181 "Error json is not array nor object!\n");
182 return GNUNET_SYSERR;
183 }
184 // interpret single ticket
185 unpack_state = json_unpack (root,
186 "{s:s}",
187 "gns_name",
188 &gns_str);
189 if (0 != unpack_state)
190 {
192 "Error json object has a wrong format!\n");
193 return GNUNET_SYSERR;
194 }
196 strncpy (ticket->gns_name, gns_str, sizeof (ticket->gns_name));
197
198 *(struct GNUNET_RECLAIM_Ticket **) spec->ptr = ticket;
199 return GNUNET_OK;
200}
201
202
209static void
211{
213
214 ticket = (struct GNUNET_RECLAIM_Ticket **) spec->ptr;
215 if (NULL != *ticket)
216 {
218 *ticket = NULL;
219 }
220}
221
222
231{
232 struct GNUNET_JSON_Specification ret = { .parser = &parse_ticket,
233 .cleaner = &clean_ticket,
234 .cls = NULL,
235 .field = NULL,
236 .ptr = ticket,
237 .ptr_size = 0,
238 .size_ptr = NULL };
239
240 *ticket = NULL;
241 return ret;
242}
243
244
253static int
254parse_credential (void *cls, json_t *root, struct GNUNET_JSON_Specification *
255 spec)
256{
257 struct GNUNET_RECLAIM_Credential *cred;
258 const char *name_str = NULL;
259 const char *type_str = NULL;
260 const char *id_str = NULL;
261 json_t *val_json;
262 char *data = NULL;
263 char *val_str = NULL;
264 int unpack_state;
265 uint32_t type;
266 size_t data_size;
267
268 GNUNET_assert (NULL != root);
269
270 if (! json_is_object (root))
271 {
273 "Error json is not array nor object!\n");
274 return GNUNET_SYSERR;
275 }
276 // interpret single attribute
277 unpack_state = json_unpack (root,
278 "{s:s, s?s, s:s, s:o!}",
279 "name",
280 &name_str,
281 "id",
282 &id_str,
283 "type",
284 &type_str,
285 "value",
286 &val_json);
287 if ((0 != unpack_state) || (NULL == name_str) || (NULL == val_json) ||
288 (NULL == type_str))
289 {
291 "Error json object has a wrong format!\n");
292 return GNUNET_SYSERR;
293 }
294 if (json_is_string (val_json))
295 {
296 val_str = GNUNET_strdup (json_string_value (val_json));
297 }
298 else
299 {
300 val_str = json_dumps (val_json, JSON_COMPACT);
301 }
303 if (GNUNET_SYSERR ==
305 val_str,
306 (void **) &data,
307 &data_size)))
308 {
309 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Credential value invalid!\n");
310 return GNUNET_SYSERR;
311 }
314 if ((NULL == id_str) || (0 == strlen (id_str)))
315 memset (&cred->id, 0, sizeof (cred->id));
316 else
318 strlen (id_str),
319 &cred->id,
320 sizeof(cred->id));
321
322 *(struct GNUNET_RECLAIM_Credential **) spec->ptr = cred;
323 return GNUNET_OK;
324}
325
326
333static void
335{
336 struct GNUNET_RECLAIM_Credential **attr;
337
338 attr = (struct GNUNET_RECLAIM_Credential **) spec->ptr;
339 if (NULL != *attr)
340 {
341 GNUNET_free (*attr);
342 *attr = NULL;
343 }
344}
345
346
356{
357 struct GNUNET_JSON_Specification ret = { .parser = &parse_credential,
358 .cleaner = &clean_credential,
359 .cls = NULL,
360 .field = NULL,
361 .ptr = cred,
362 .ptr_size = 0,
363 .size_ptr = NULL };
364
365 *cred = NULL;
366 return ret;
367}
static int ret
Final status code.
Definition: gnunet-arm.c:94
static char * data
The data to insert into the dht.
static uint32_t type
Type string converted to DNS type value.
static size_t data_size
Number of bytes in data.
static struct GNUNET_RECLAIM_Ticket ticket
Ticket to consume.
static char * type_str
Attribute type.
functions to parse JSON objects into GNUnet objects
Identity attribute definitions.
reclaim service; implements identity and personal data sharing for GNUnet
#define GNUNET_log(kind,...)
@ GNUNET_OK
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
#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.
int GNUNET_RECLAIM_credential_string_to_value(uint32_t type, const char *s, void **data, size_t *data_size)
Convert human-readable version of a 'claim' of an credential to the binary representation.
int GNUNET_RECLAIM_attribute_string_to_value(uint32_t type, const char *s, void **data, size_t *data_size)
Convert human-readable version of a 'claim' of an attribute to the binary representation.
uint32_t GNUNET_RECLAIM_credential_typename_to_number(const char *typename)
Convert an credential type name to the corresponding number.
struct GNUNET_RECLAIM_Attribute * GNUNET_RECLAIM_attribute_new(const char *attr_name, const struct GNUNET_RECLAIM_Identifier *credential, uint32_t type, const void *data, size_t data_size)
Create a new attribute claim.
uint32_t GNUNET_RECLAIM_attribute_typename_to_number(const char *typename)
Convert a type name to the corresponding number.
struct GNUNET_RECLAIM_Credential * GNUNET_RECLAIM_credential_new(const char *name, uint32_t type, const void *data, size_t data_size)
Create a new credential.
enum GNUNET_GenericReturnValue GNUNET_STRINGS_string_to_data(const char *enc, size_t enclen, void *out, size_t out_size)
Convert CrockfordBase32 encoding back to data.
Definition: strings.c:789
struct GNUNET_JSON_Specification GNUNET_RECLAIM_JSON_spec_credential(struct GNUNET_RECLAIM_Credential **cred)
JSON Specification for credential claims.
Definition: json_reclaim.c:354
static void clean_attr(void *cls, struct GNUNET_JSON_Specification *spec)
Cleanup data left from parsing RSA public key.
Definition: json_reclaim.c:126
static int parse_credential(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
Parse given JSON object to a credential claim.
Definition: json_reclaim.c:254
static int parse_attr(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
Parse given JSON object to a claim.
Definition: json_reclaim.c:42
struct GNUNET_JSON_Specification GNUNET_RECLAIM_JSON_spec_attribute(struct GNUNET_RECLAIM_Attribute **attr)
JSON Specification for Reclaim claims.
Definition: json_reclaim.c:146
static void clean_credential(void *cls, struct GNUNET_JSON_Specification *spec)
Cleanup data left from parsing RSA public key.
Definition: json_reclaim.c:334
struct GNUNET_JSON_Specification GNUNET_RECLAIM_JSON_spec_ticket(struct GNUNET_RECLAIM_Ticket **ticket)
JSON Specification for Reclaim tickets.
Definition: json_reclaim.c:230
static int parse_ticket(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
Parse given JSON object to a ticket.
Definition: json_reclaim.c:170
static void clean_ticket(void *cls, struct GNUNET_JSON_Specification *spec)
Cleanup data left from parsing RSA public key.
Definition: json_reclaim.c:210
Entry in parser specification for GNUNET_JSON_parse().
void * ptr
Pointer, details specific to the parser.
void * cls
Closure for parser and cleaner.
struct GNUNET_RECLAIM_Identifier credential
Referenced ID of credential (may be GNUNET_RECLAIM_ID_ZERO if self-creded)
struct GNUNET_RECLAIM_Identifier id
ID.
struct GNUNET_RECLAIM_Identifier id
ID.
The authorization ticket.
char gns_name[63 *2+2]
The ticket.