GNUnet  0.10.x
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 
28 #include "gnunet_util_lib.h"
29 
30 #include "gnunet_json_lib.h"
32 #include "gnunet_reclaim_service.h"
33 
34 
43 static int
44 parse_attr(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
45 {
46  struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr;
47  const char *name_str = NULL;
48  const char *val_str = NULL;
49  const char *type_str = NULL;
50  const char *id_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!}",
67  "name",
68  &name_str,
69  "id",
70  &id_str,
71  "type",
72  &type_str,
73  "value",
74  &val_str);
75  if ((0 != unpack_state) || (NULL == name_str) || (NULL == val_str) ||
76  (NULL == type_str))
77  {
79  "Error json object has a wrong format!\n");
80  return GNUNET_SYSERR;
81  }
83  if (GNUNET_SYSERR ==
85  val_str,
86  (void **)&data,
87  &data_size)))
88  {
89  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Attribute value invalid!\n");
90  return GNUNET_SYSERR;
91  }
92  attr = GNUNET_RECLAIM_ATTRIBUTE_claim_new(name_str, type, data, data_size);
93  if ((NULL == id_str) || (0 == strlen(id_str)))
94  attr->id = 0;
95  else
97  strlen(id_str),
98  &attr->id,
99  sizeof(uint64_t));
100 
101  *(struct GNUNET_RECLAIM_ATTRIBUTE_Claim **)spec->ptr = attr;
102  return GNUNET_OK;
103 }
104 
111 static void
112 clean_attr(void *cls, struct GNUNET_JSON_Specification *spec)
113 {
114  struct GNUNET_RECLAIM_ATTRIBUTE_Claim **attr;
115 
116  attr = (struct GNUNET_RECLAIM_ATTRIBUTE_Claim **)spec->ptr;
117  if (NULL != *attr)
118  {
119  GNUNET_free(*attr);
120  *attr = NULL;
121  }
122 }
123 
132 {
133  struct GNUNET_JSON_Specification ret = { .parser = &parse_attr,
134  .cleaner = &clean_attr,
135  .cls = NULL,
136  .field = NULL,
137  .ptr = attr,
138  .ptr_size = 0,
139  .size_ptr = NULL };
140 
141  *attr = NULL;
142  return ret;
143 }
152 static int
153 parse_ticket(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
154 {
156  const char *rnd_str;
157  const char *aud_str;
158  const char *id_str;
159  int unpack_state;
160 
161  GNUNET_assert(NULL != root);
162 
163  if (!json_is_object(root))
164  {
166  "Error json is not array nor object!\n");
167  return GNUNET_SYSERR;
168  }
169  // interpret single ticket
170  unpack_state = json_unpack(root,
171  "{s:s, s:s, s:s!}",
172  "rnd",
173  &rnd_str,
174  "audience",
175  &aud_str,
176  "issuer",
177  &id_str);
178  if (0 != unpack_state)
179  {
181  "Error json object has a wrong format!\n");
182  return GNUNET_SYSERR;
183  }
184  ticket = GNUNET_new(struct GNUNET_RECLAIM_Ticket);
186  strlen(rnd_str),
187  &ticket->rnd,
188  sizeof(uint64_t)))
189  {
190  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Rnd invalid\n");
191  GNUNET_free(ticket);
192  return GNUNET_SYSERR;
193  }
194  if (GNUNET_OK !=
196  strlen(id_str),
197  &ticket->identity,
198  sizeof(
200  {
201  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Identity invalid\n");
202  GNUNET_free(ticket);
203  return GNUNET_SYSERR;
204  }
205 
206  if (GNUNET_OK !=
208  strlen(aud_str),
209  &ticket->audience,
210  sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
211  {
212  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Audience invalid\n");
213  GNUNET_free(ticket);
214  return GNUNET_SYSERR;
215  }
216 
217  *(struct GNUNET_RECLAIM_Ticket **)spec->ptr = ticket;
218  return GNUNET_OK;
219 }
220 
227 static void
228 clean_ticket(void *cls, struct GNUNET_JSON_Specification *spec)
229 {
230  struct GNUNET_RECLAIM_Ticket **ticket;
231 
232  ticket = (struct GNUNET_RECLAIM_Ticket **)spec->ptr;
233  if (NULL != *ticket)
234  {
235  GNUNET_free(*ticket);
236  *ticket = NULL;
237  }
238 }
239 
248 {
249  struct GNUNET_JSON_Specification ret = { .parser = &parse_ticket,
250  .cleaner = &clean_ticket,
251  .cls = NULL,
252  .field = NULL,
253  .ptr = ticket,
254  .ptr_size = 0,
255  .size_ptr = NULL };
256 
257  *ticket = NULL;
258  return ret;
259 }
void * cls
Closure for parser and cleaner.
The authorization ticket.
functions to parse JSON objects into GNUnet objects
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
uint32_t GNUNET_RECLAIM_ATTRIBUTE_typename_to_number(const char *typename)
Convert a type name to the corresponding number.
Entry in parser specification for GNUNET_JSON_parse().
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
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 &#39;claim&#39; of an attribute to the binary representation.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static void clean_attr(void *cls, struct GNUNET_JSON_Specification *spec)
Cleanup data left from parsing RSA public key.
Definition: json_reclaim.c:112
static int ret
Final status code.
Definition: gnunet-arm.c:89
static struct GNUNET_RECLAIM_Ticket ticket
Ticket to consume.
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:153
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:44
GNUNET_JSON_Parser parser
Function for how to parse this type of entry.
struct GNUNET_CRYPTO_EcdsaPublicKey identity
The ticket issuer (= the user)
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
uint64_t rnd
The ticket random (NBO)
static char * type_str
Attribute type.
void * ptr
Pointer, details specific to the parser.
struct GNUNET_JSON_Specification GNUNET_RECLAIM_JSON_spec_claim(struct GNUNET_RECLAIM_ATTRIBUTE_Claim **attr)
JSON Specification for Reclaim claims.
Definition: json_reclaim.c:131
struct GNUNET_RECLAIM_ATTRIBUTE_Claim * GNUNET_RECLAIM_ATTRIBUTE_claim_new(const char *attr_name, uint32_t type, const void *data, size_t data_size)
Create a new attribute claim.
struct GNUNET_CRYPTO_EcdsaPublicKey audience
The ticket audience (= relying party)
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and ECDS...
#define GNUNET_log(kind,...)
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
uint32_t data
The data value.
static void clean_ticket(void *cls, struct GNUNET_JSON_Specification *spec)
Cleanup data left from parsing RSA public key.
Definition: json_reclaim.c:228
static size_t data_size
Number of bytes in data.
int 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:953
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_JSON_Specification GNUNET_RECLAIM_JSON_spec_ticket(struct GNUNET_RECLAIM_Ticket **ticket)
JSON Specification for Reclaim tickets.
Definition: json_reclaim.c:247