GNUnet  0.11.x
json_generator.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2014, 2015, 2016 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  */
25 #include "platform.h"
26 #include "gnunet_util_lib.h"
27 #include "gnunet_json_lib.h"
28 
29 
38 json_t *
40  size_t size)
41 {
42  char *buf;
43  json_t *json;
44 
45  buf = GNUNET_STRINGS_data_to_string_alloc (data, size);
46  json = json_string (buf);
47  GNUNET_free (buf);
48  GNUNET_break (NULL != json);
49  return json;
50 }
51 
52 
59 json_t *
61 {
62  json_t *j;
63 
65  GNUNET_TIME_round_abs (&stamp));
66 
67  j = json_object ();
68  if (NULL == j)
69  {
70  GNUNET_break (0);
71  return NULL;
72  }
73  if (stamp.abs_value_us == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us)
74  {
75  if (0 !=
76  json_object_set_new (j,
77  "t_ms",
78  json_string ("never")))
79  {
80  GNUNET_break (0);
81  json_decref (j);
82  return NULL;
83  }
84  return j;
85  }
86  if (0 !=
87  json_object_set_new (j,
88  "t_ms",
89  json_integer ((json_int_t) (stamp.abs_value_us
90  / 1000LL))))
91  {
92  GNUNET_break (0);
93  json_decref (j);
94  return NULL;
95  }
96  return j;
97 }
98 
99 
106 json_t *
108 {
110 }
111 
112 
119 json_t *
121 {
122  json_t *j;
123 
125  GNUNET_TIME_round_rel (&stamp));
126 
127  j = json_object ();
128  if (NULL == j)
129  {
130  GNUNET_break (0);
131  return NULL;
132  }
133  if (stamp.rel_value_us == GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us)
134  {
135  if (0 !=
136  json_object_set_new (j,
137  "d_ms",
138  json_string ("forever")))
139  {
140  GNUNET_break (0);
141  json_decref (j);
142  return NULL;
143  }
144  return j;
145  }
146  if (0 !=
147  json_object_set_new (j,
148  "d_ms",
149  json_integer ((json_int_t) (stamp.rel_value_us
150  / 1000LL))))
151  {
152  GNUNET_break (0);
153  json_decref (j);
154  return NULL;
155  }
156  return j;
157 }
158 
159 
166 json_t *
168 {
169  void *buf;
170  size_t buf_len;
171  json_t *ret;
172 
174  &buf);
175  ret = GNUNET_JSON_from_data (buf,
176  buf_len);
177  GNUNET_free (buf);
178  return ret;
179 }
180 
181 
188 json_t *
190 {
191  void *buf;
192  size_t buf_len;
193  json_t *ret;
194 
195  buf_len = GNUNET_CRYPTO_rsa_signature_encode (sig,
196  &buf);
197  ret = GNUNET_JSON_from_data (buf,
198  buf_len);
199  GNUNET_free (buf);
200  return ret;
201 }
202 
203 
211 json_t *
212 GNUNET_JSON_from_gnsrecord (const char*rname,
213  const struct GNUNET_GNSRECORD_Data *rd,
214  unsigned int rd_count)
215 {
216  struct GNUNET_TIME_Absolute abs_exp;
217  struct GNUNET_TIME_Relative rel_exp;
218  const char *expiration_time_str;
219  const char *record_type_str;
220  char *value_str;
221  json_t *data;
222  json_t *record;
223  json_t *records;
224 
225  data = json_object ();
226  if (NULL == data)
227  {
228  GNUNET_break (0);
229  return NULL;
230  }
231  if (0 !=
232  json_object_set_new (data,
233  "record_name",
234  json_string (rname)))
235  {
236  GNUNET_break (0);
237  json_decref (data);
238  return NULL;
239  }
240  records = json_array ();
241  if (NULL == records)
242  {
243  GNUNET_break (0);
244  json_decref (data);
245  return NULL;
246  }
247  for (int i = 0; i < rd_count; i++)
248  {
249  value_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
250  rd[i].data,
251  rd[i].data_size);
252  if (GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION & rd[i].flags)
253  {
254  rel_exp.rel_value_us = rd[i].expiration_time;
255  expiration_time_str = GNUNET_STRINGS_relative_time_to_string (rel_exp,
256  GNUNET_NO);
257  }
258  else
259  {
260  abs_exp.abs_value_us = rd[i].expiration_time;
261  expiration_time_str = GNUNET_STRINGS_absolute_time_to_string (abs_exp);
262  }
263  record_type_str = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
265  "Packing %s %s %s %d\n",
266  value_str, record_type_str, expiration_time_str, rd[i].flags);
267  record = json_pack ("{s:s,s:s,s:s,s:b,s:b,s:b,s:b}",
268  "value",
269  value_str,
270  "record_type",
271  record_type_str,
272  "expiration_time",
273  expiration_time_str,
274  "private",
275  rd[i].flags & GNUNET_GNSRECORD_RF_PRIVATE,
276  "relative_expiration",
278  "supplemental",
279  rd[i].flags & GNUNET_GNSRECORD_RF_SUPPLEMENTAL,
280  "shadow",
281  rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD);
282  GNUNET_free (value_str);
283  if (NULL == record)
284  {
285  GNUNET_break (0);
286  json_decref (records);
287  json_decref (data);
288  return NULL;
289  }
290  if (0 !=
291  json_array_append_new (records,
292  record))
293  {
294  GNUNET_break (0);
295  json_decref (records);
296  json_decref (data);
297  return NULL;
298  }
299  }
300  if (0 !=
301  json_object_set_new (data,
302  "data",
303  records))
304  {
305  GNUNET_break (0);
306  json_decref (data);
307  return NULL;
308  }
309  return data;
310 }
311 
312 
313 /* End of json/json_generator.c */
This record should not be used unless all (other) records with an absolute expiration time have expir...
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:673
uint64_t rel_value_us
The actual value.
an RSA signature
Definition: crypto_rsa.c:63
functions to parse JSON objects into GNUnet objects
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key from command line option, or NULL.
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
This is a supplemental record.
size_t GNUNET_CRYPTO_rsa_signature_encode(const struct GNUNET_CRYPTO_RsaSignature *sig, void **buffer)
Encode the given signature in a format suitable for storing it into a file.
Definition: crypto_rsa.c:1076
json_t * GNUNET_JSON_from_rsa_signature(const struct GNUNET_CRYPTO_RsaSignature *sig)
Convert RSA signature to JSON.
Time for absolute time used by GNUnet, in microseconds and in network byte order. ...
uint64_t abs_value_us
The actual value.
The public information of an RSA key pair.
Definition: crypto_rsa.c:51
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
static unsigned int records
Number of records we found.
int GNUNET_TIME_round_abs(struct GNUNET_TIME_Absolute *at)
Round a time value so that it is suitable for transmission via JSON encodings.
Definition: time.c:80
uint64_t expiration_time
Expiration time for the DNS record.
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition: strings.c:702
static char buf[2048]
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
This is a private record of this peer and it should thus not be handed out to other peers...
json_t * GNUNET_JSON_from_rsa_public_key(const struct GNUNET_CRYPTO_RsaPublicKey *pk)
Convert RSA public key to JSON.
static unsigned int size
Size of the "table".
Definition: peer.c:67
json_t * GNUNET_JSON_from_time_rel(struct GNUNET_TIME_Relative stamp)
Convert relative timestamp to a json string.
int GNUNET_TIME_round_rel(struct GNUNET_TIME_Relative *rt)
Round a time value so that it is suitable for transmission via JSON encodings.
Definition: time.c:100
json_t * GNUNET_JSON_from_time_abs(struct GNUNET_TIME_Absolute stamp)
Convert absolute timestamp to a json string.
json_t * GNUNET_JSON_from_time_abs_nbo(struct GNUNET_TIME_AbsoluteNBO stamp)
Convert absolute timestamp to a json string.
#define GNUNET_log(kind,...)
static void record(void *cls, size_t data_size, const void *data)
Process recorded audio data.
json_t * GNUNET_JSON_from_gnsrecord(const char *rname, const struct GNUNET_GNSRECORD_Data *rd, unsigned int rd_count)
Convert GNS record to JSON.
Time for absolute times used by GNUnet, in microseconds.
size_t GNUNET_CRYPTO_rsa_public_key_encode(const struct GNUNET_CRYPTO_RsaPublicKey *key, void **buffer)
Encode the public key in a format suitable for storing it into a file.
Definition: crypto_rsa.c:346
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition: strings.c:936
This expiration time of the record is a relative time (not an absolute time).
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:757
uint32_t data
The data value.
char * GNUNET_GNSRECORD_value_to_string(uint32_t type, const void *data, size_t data_size)
Convert the &#39;value&#39; of a record to a string.
Definition: gnsrecord.c:159
const char * GNUNET_GNSRECORD_number_to_typename(uint32_t type)
Convert a type number (i.e.
Definition: gnsrecord.c:247
#define GNUNET_free(ptr)
Wrapper around free.
json_t * GNUNET_JSON_from_data(const void *data, size_t size)
Convert binary data to a JSON string with the base32crockford encoding.
Time for relative time used by GNUnet, in microseconds.