GNUnet 0.21.1
gnunet_json_lib.h
Go to the documentation of this file.
1/*
2 This file is part of GNUnet
3 Copyright (C) 2014, 2015, 2016, 2020 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 */
27#ifndef GNUNET_JSON_LIB_H
28#define GNUNET_JSON_LIB_H
29
30
31#include "gnunet_util_lib.h"
32#include <jansson.h>
33#include <microhttpd.h>
34
35/* ****************** Generic parser interface ******************* */
36
41
42
53(*GNUNET_JSON_Parser)(void *cls,
54 json_t *root,
55 struct GNUNET_JSON_Specification *spec);
56
57
64typedef void
65(*GNUNET_JSON_Cleaner) (void *cls,
66 struct GNUNET_JSON_Specification *spec);
67
68
73{
78
83
87 void *cls;
88
93 const char *field;
94
98 void *ptr;
99
104 bool *missing;
105
109 size_t *size_ptr;
110
114 size_t ptr_size;
115
120};
121
122
137GNUNET_JSON_parse (const json_t *root,
138 struct GNUNET_JSON_Specification *spec,
139 const char **error_json_name,
140 unsigned int *error_line);
141
142
155void
157
158
159/* ****************** Canonical parser specifications ******************* */
160
161
167
168
178 bool *missing);
179
180
190GNUNET_JSON_spec_fixed (const char *name,
191 void *obj,
192 size_t size);
193
194
202#define GNUNET_JSON_spec_fixed_auto(name, obj) \
203 GNUNET_JSON_spec_fixed (name, obj, sizeof(*obj))
204
205
214GNUNET_JSON_spec_fixed64 (const char *name,
215 void *obj,
216 size_t size);
217
218
225#define GNUNET_JSON_spec_fixed64_auto(name, obj) \
226 GNUNET_JSON_spec_fixed (name, obj, sizeof(*obj))
227
228
238GNUNET_JSON_spec_varsize (const char *name,
239 void **obj,
240 size_t *size);
241
242
250GNUNET_JSON_spec_string (const char *name,
251 const char **strptr);
252
253
262GNUNET_JSON_spec_json (const char *name,
263 json_t **jsonp);
264
265
274 const json_t **jsonp);
275
276
285 const json_t **jsonp);
286
287
295GNUNET_JSON_spec_bool (const char *name,
296 bool *b);
297
298
306GNUNET_JSON_spec_double (const char *name,
307 double *f);
308
309
317GNUNET_JSON_spec_uint8 (const char *name,
318 uint8_t *u8);
319
320
328GNUNET_JSON_spec_uint16 (const char *name,
329 uint16_t *u16);
330
331
339GNUNET_JSON_spec_uint32 (const char *name,
340 uint32_t *u32);
341
342
350GNUNET_JSON_spec_uint64 (const char *name,
351 uint64_t *u64);
352
353
361GNUNET_JSON_spec_int64 (const char *name,
362 int64_t *i64);
363
364
372GNUNET_JSON_spec_boolean (const char *name,
373 int *boolean);
374
375
376/* ************ GNUnet-specific parser specifications ******************* */
377
386 struct GNUNET_TIME_Timestamp *t);
387
388
397 struct GNUNET_TIME_TimestampNBO *tn);
398
399
408 struct GNUNET_TIME_Relative *rt);
409
410
420
421
430 struct GNUNET_CRYPTO_RsaSignature **sig);
431
432
433/* ****************** Generic generator interface ******************* */
434
435
444json_t *
445GNUNET_JSON_from_data (const void *data,
446 size_t size);
447
448
457json_t *
458GNUNET_JSON_from_data64 (const void *data,
459 size_t size);
460
461
469#define GNUNET_JSON_from_data_auto(ptr) \
470 GNUNET_JSON_from_data (ptr, sizeof(*ptr))
471
472
480#define GNUNET_JSON_from_data64_auto(ptr) \
481 GNUNET_JSON_from_data64 (ptr, sizeof(*ptr))
482
483
490json_t *
492
493
500json_t *
502
503
510json_t *
512
513
520json_t *
522
523
530json_t *
532
533/* ******************* Helpers for MHD upload handling ******************* */
534
539{
544
549
554
559
565
566
583GNUNET_JSON_post_parser (size_t buffer_max,
584 struct MHD_Connection *connection,
585 void **con_cls,
586 const char *upload_data,
587 size_t *upload_data_size,
588 json_t **json);
589
590
598void
599GNUNET_JSON_post_parser_cleanup (void *con_cls);
600
601
602/* ****************** GETOPT JSON helper ******************* */
603
604
616 const char *name,
617 const char *argumentHelp,
618 const char *description,
619 json_t **json);
620
621
622/* ****************** JSON PACK helper ******************* */
623
624
629
630
638typedef json_t *
639(*GNUNET_JSON_PackCallback)(const struct GNUNET_JSON_PackSpec *se);
640
641
646{
650 const char *field_name;
651
655 json_t *object;
656
664};
665
666
674json_t *
676
677
685#define GNUNET_JSON_PACK(...) \
686 GNUNET_JSON_pack_ ((struct GNUNET_JSON_PackSpec[]) {__VA_ARGS__, \
687 GNUNET_JSON_pack_end_ ()})
688
689
697
698
707
708
718GNUNET_JSON_pack_bool (const char *name,
719 bool b);
720
721
731GNUNET_JSON_pack_double (const char *name,
732 double f);
733
734
744GNUNET_JSON_pack_string (const char *name,
745 const char *s);
746
747
758GNUNET_JSON_pack_uint64 (const char *name,
759 uint64_t num);
760
761
771GNUNET_JSON_pack_int64 (const char *name,
772 int64_t num);
773
774
786 json_t *o);
787
788
800 json_t *o);
801
802
814 json_t *a);
815
816
828 json_t *a);
829
830
842 const void *blob,
843 size_t blob_size);
844
845
854#define GNUNET_JSON_pack_data_auto(name,blob) \
855 GNUNET_JSON_pack_data_varsize (name, blob, sizeof (*blob))
856
857
871 const void *blob,
872 size_t blob_size);
873
874
885#define GNUNET_JSON_pack_data64_auto(name,blob) \
886 GNUNET_JSON_pack_data64_varsize (name, blob, sizeof (*blob))
887
888
900 struct GNUNET_TIME_Timestamp at);
901
902
914 struct GNUNET_TIME_TimestampNBO at);
915
916
927 struct GNUNET_TIME_Relative rt);
928
929
940 struct GNUNET_TIME_RelativeNBO rt);
941
942
953 const struct GNUNET_CRYPTO_RsaPublicKey *pk);
954
955
966 const struct GNUNET_CRYPTO_RsaSignature *sig);
967
968
969#endif
970
971/* end of gnunet_json_lib.h */
static char * data
The data to insert into the dht.
struct GNUNET_CRYPTO_PrivateKey pk
Private key from command line option, or NULL.
static char * name
Name (label) of the records to list.
static struct GNUNET_SCHEDULER_Task * t
Main task.
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_time_rel(const char *name, struct GNUNET_TIME_Relative rt)
Generate packer instruction for a JSON field of type relative time.
Definition: json_pack.c:320
struct GNUNET_JSON_Specification GNUNET_JSON_spec_object_const(const char *name, const json_t **jsonp)
JSON object, reference counter not incremented.
Definition: json_helper.c:385
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_end_(void)
Do not use directly.
Definition: json_pack.c:70
enum GNUNET_GenericReturnValue(* GNUNET_JSON_Parser)(void *cls, json_t *root, struct GNUNET_JSON_Specification *spec)
Function called to parse JSON argument.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_varsize(const char *name, void **obj, size_t *size)
Variable size object (in network byte order, encoded using Crockford Base32hex encoding).
Definition: json_helper.c:234
struct GNUNET_JSON_Specification GNUNET_JSON_spec_fixed(const char *name, void *obj, size_t size)
Variable size object (in network byte order, encoded using Crockford Base32hex encoding).
Definition: json_helper.c:93
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_array_steal(const char *name, json_t *a)
Generate packer instruction for a JSON field of type JSON array where the reference is taken over by ...
Definition: json_pack.c:211
json_t * GNUNET_JSON_from_rsa_public_key(const struct GNUNET_CRYPTO_RsaPublicKey *pk)
Convert RSA public key to JSON.
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_timestamp(const char *name, struct GNUNET_TIME_Timestamp at)
Generate packer instruction for a JSON field of type timestamp.
Definition: json_pack.c:290
void GNUNET_JSON_parse_free(struct GNUNET_JSON_Specification *spec)
Frees all elements allocated during a GNUNET_JSON_parse() operation.
Definition: json.c:94
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_data_varsize(const char *name, const void *blob, size_t blob_size)
Generate packer instruction for a JSON field of type variable size binary blob.
Definition: json_pack.c:256
json_t * GNUNET_JSON_from_timestamp(struct GNUNET_TIME_Timestamp stamp)
Convert timestamp to a json string.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_json(const char *name, json_t **jsonp)
JSON object or array.
Definition: json_helper.c:341
void(* GNUNET_JSON_Cleaner)(void *cls, struct GNUNET_JSON_Specification *spec)
Function called to clean up data from earlier parsing.
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_bool(const char *name, bool b)
Generate packer instruction for a JSON field of type bool.
Definition: json_pack.c:89
struct GNUNET_JSON_Specification GNUNET_JSON_spec_boolean(const char *name, int *boolean)
Boolean (true mapped to GNUNET_YES, false mapped to GNUNET_NO).
Definition: json_helper.c:1166
struct GNUNET_JSON_Specification GNUNET_JSON_spec_rsa_public_key(const char *name, struct GNUNET_CRYPTO_RsaPublicKey **pk)
Specification for parsing an RSA public key.
Definition: json_helper.c:1037
json_t * GNUNET_JSON_from_data(const void *data, size_t size)
Convert binary data to a JSON string with the base32crockford encoding.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint16(const char *name, uint16_t *u16)
16-bit integer.
Definition: json_helper.c:619
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_object_steal(const char *name, json_t *o)
Generate packer instruction for a JSON field of type JSON object where the reference is taken over by...
Definition: json_pack.c:166
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_array_incref(const char *name, json_t *a)
Generate packer instruction for a JSON field of type JSON array where the reference counter is increm...
Definition: json_pack.c:233
json_t * GNUNET_JSON_from_timestamp_nbo(struct GNUNET_TIME_TimestampNBO stamp)
Convert timestamp to a json string.
json_t * GNUNET_JSON_from_data64(const void *data, size_t size)
Convert binary data to a JSON string with base64 encoding.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_timestamp_nbo(const char *name, struct GNUNET_TIME_TimestampNBO *tn)
Timestamp in network byte order.
Definition: json_helper.c:883
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_allow_null(struct GNUNET_JSON_PackSpec in)
Modify packer instruction to allow NULL as a value.
Definition: json_pack.c:81
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint32(const char *name, uint32_t *u32)
32-bit integer.
Definition: json_helper.c:669
json_t * GNUNET_JSON_pack_(struct GNUNET_JSON_PackSpec spec[])
Pack a JSON object from a spec.
Definition: json_pack.c:30
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_double(const char *name, double f)
Generate packer instruction for a JSON field of type double.
Definition: json_pack.c:102
GNUNET_JSON_PostResult
Return codes from GNUNET_JSON_post_parser().
@ GNUNET_JSON_PR_CONTINUE
Parsing continues, call again soon!
@ GNUNET_JSON_PR_OUT_OF_MEMORY
Sorry, memory allocation (malloc()) failed.
@ GNUNET_JSON_PR_JSON_INVALID
JSON parsing failed.
@ GNUNET_JSON_PR_REQUEST_TOO_LARGE
Request size exceeded buffer_max argument.
@ GNUNET_JSON_PR_SUCCESS
Parsing successful, JSON result is in *json.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_string(const char *name, const char **strptr)
The expected field stores a string.
Definition: json_helper.c:282
struct GNUNET_JSON_Specification GNUNET_JSON_spec_double(const char *name, double *f)
double.
Definition: json_helper.c:519
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_timestamp_nbo(const char *name, struct GNUNET_TIME_TimestampNBO at)
Generate packer instruction for a JSON field of type timestamp in network byte order.
Definition: json_pack.c:311
struct GNUNET_JSON_Specification GNUNET_JSON_spec_mark_optional(struct GNUNET_JSON_Specification spec, bool *missing)
Set the "optional" flag for a parser specification entry.
Definition: json.c:82
struct GNUNET_JSON_Specification GNUNET_JSON_spec_int64(const char *name, int64_t *i64)
64-bit signed integer.
Definition: json_helper.c:759
struct GNUNET_JSON_Specification GNUNET_JSON_spec_rsa_signature(const char *name, struct GNUNET_CRYPTO_RsaSignature **sig)
Specification for parsing an RSA signature.
Definition: json_helper.c:1122
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_uint64(const char *name, uint64_t num)
Generate packer instruction for a JSON field of type unsigned integer.
Definition: json_pack.c:128
enum GNUNET_JSON_PostResult GNUNET_JSON_post_parser(size_t buffer_max, struct MHD_Connection *connection, void **con_cls, const char *upload_data, size_t *upload_data_size, json_t **json)
Process a POST request containing a JSON object.
Definition: json_mhd.c:265
json_t * GNUNET_JSON_from_rsa_signature(const struct GNUNET_CRYPTO_RsaSignature *sig)
Convert RSA signature to JSON.
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_object_incref(const char *name, json_t *o)
Generate packer instruction for a JSON field of type JSON object where the reference counter is incre...
Definition: json_pack.c:188
struct GNUNET_JSON_Specification GNUNET_JSON_spec_timestamp(const char *name, struct GNUNET_TIME_Timestamp *t)
Timestamp.
Definition: json_helper.c:838
json_t * GNUNET_JSON_from_time_rel(struct GNUNET_TIME_Relative stamp)
Convert relative timestamp to a json string.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_array_const(const char *name, const json_t **jsonp)
JSON array, reference counter not incremented.
Definition: json_helper.c:428
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_rsa_signature(const char *name, const struct GNUNET_CRYPTO_RsaSignature *sig)
Generate packer instruction for a JSON field of type RSA signature.
Definition: json_pack.c:355
struct GNUNET_GETOPT_CommandLineOption GNUNET_JSON_getopt(char shortName, const char *name, const char *argumentHelp, const char *description, json_t **json)
Allow user to specify a JSON input value.
Definition: json.c:141
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_data64_varsize(const char *name, const void *blob, size_t blob_size)
Generate packer instruction for a JSON field of type variable size binary blob.
Definition: json_pack.c:273
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_rsa_public_key(const char *name, const struct GNUNET_CRYPTO_RsaPublicKey *pk)
Generate packer instruction for a JSON field of type RSA public key.
Definition: json_pack.c:342
struct GNUNET_JSON_Specification GNUNET_JSON_spec_fixed64(const char *name, void *obj, size_t size)
Variable size object (in network byte order, encoded using base64 encoding).
Definition: json_helper.c:157
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_int64(const char *name, int64_t num)
Generate packer instruction for a JSON field of type signed integer.
Definition: json_pack.c:146
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_time_rel_nbo(const char *name, struct GNUNET_TIME_RelativeNBO rt)
Generate packer instruction for a JSON field of type relative time in network byte order.
Definition: json_pack.c:333
struct GNUNET_JSON_Specification GNUNET_JSON_spec_bool(const char *name, bool *b)
boolean.
Definition: json_helper.c:476
void GNUNET_JSON_post_parser_cleanup(void *con_cls)
Function called whenever we are done with a request to clean up our state.
Definition: json_mhd.c:367
struct GNUNET_JSON_Specification GNUNET_JSON_spec_relative_time(const char *name, struct GNUNET_TIME_Relative *rt)
Relative time.
Definition: json_helper.c:953
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint8(const char *name, uint8_t *u8)
8-bit integer.
Definition: json_helper.c:569
struct GNUNET_JSON_Specification GNUNET_JSON_spec_uint64(const char *name, uint64_t *u64)
64-bit integer.
Definition: json_helper.c:714
enum GNUNET_GenericReturnValue GNUNET_JSON_parse(const json_t *root, struct GNUNET_JSON_Specification *spec, const char **error_json_name, unsigned int *error_line)
Navigate and parse data in a JSON tree.
Definition: json.c:32
struct GNUNET_JSON_Specification GNUNET_JSON_spec_end(void)
End of a parser specification.
Definition: json_helper.c:32
struct GNUNET_JSON_PackSpec GNUNET_JSON_pack_string(const char *name, const char *s)
Generate packer instruction for a JSON field of type string.
Definition: json_pack.c:115
GNUNET_GenericReturnValue
Named constants for return values.
static unsigned int size
Size of the "table".
Definition: peer.c:68
The public information of an RSA key pair.
Definition: crypto_rsa.c:53
an RSA signature
Definition: crypto_rsa.c:65
Definition of a command line option.
const char * description
Help text for the option (description)
const char * argumentHelp
Name of the argument for the user in help text.
const char shortName
Short name of the option.
Element in the array to give to the packer.
bool allow_null
True if a NULL (or 0) argument is allowed.
json_t * object
Object to pack.
const char * field_name
Name of the field to pack.
Entry in parser specification for GNUNET_JSON_parse().
GNUNET_JSON_Cleaner cleaner
Function for how to clean up this type of entry.
bool * missing
Pointer to set to true if this argument is indeed missing.
void * ptr
Pointer, details specific to the parser.
const char * field
Name of the field to parse, use NULL to get the JSON of the main object instead of the JSON of an ind...
size_t ptr_size
Number of bytes available in ptr.
size_t * size_ptr
Where should we store the final size of ptr.
bool is_optional
Set to true if this component is optional.
void * cls
Closure for parser and cleaner.
GNUNET_JSON_Parser parser
Function for how to parse this type of entry.
Time for relative time used by GNUnet, in microseconds and in network byte order.
Time for relative time used by GNUnet, in microseconds.
Time for timestamps used by GNUnet, in seconds and in network byte order.
Rounded time for timestamps used by GNUnet, in seconds.