6373d65d858b69892364faa6016782d6b30da7a7
[oweals/gnunet.git] / src / json / json_generator.c
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  */
20 /**
21  * @file json/json_generator.c
22  * @brief helper functions for generating JSON from GNUnet data structures
23  * @author Sree Harsha Totakura <sreeharsha@totakura.in>
24  */
25 #include "platform.h"
26 #include "gnunet_util_lib.h"
27 #include "gnunet_json_lib.h"
28
29
30 /**
31  * Convert binary data to a JSON string
32  * with the base32crockford encoding.
33  *
34  * @param data binary data
35  * @param size size of @a data in bytes
36  * @return json string that encodes @a data
37  */
38 json_t *
39 GNUNET_JSON_from_data (const void *data,
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   return json;
49 }
50
51
52 /**
53  * Convert absolute timestamp to a json string.
54  *
55  * @param stamp the time stamp
56  * @return a json string with the timestamp in @a stamp
57  */
58 json_t *
59 GNUNET_JSON_from_time_abs (struct GNUNET_TIME_Absolute stamp)
60 {
61   json_t *j;
62   char *mystr;
63   int ret;
64
65   GNUNET_assert (GNUNET_OK ==
66                  GNUNET_TIME_round_abs (&stamp));
67   if (stamp.abs_value_us == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value_us)
68     return json_string ("/never/");
69   ret = GNUNET_asprintf (&mystr,
70                          "/Date(%llu)/",
71                          (unsigned long long) (stamp.abs_value_us / (1000LL
72                                                                      * 1000LL)));
73   GNUNET_assert (ret > 0);
74   j = json_string (mystr);
75   GNUNET_free (mystr);
76   return j;
77 }
78
79
80 /**
81  * Convert absolute timestamp to a json string.
82  *
83  * @param stamp the time stamp
84  * @return a json string with the timestamp in @a stamp
85  */
86 json_t *
87 GNUNET_JSON_from_time_abs_nbo (struct GNUNET_TIME_AbsoluteNBO stamp)
88 {
89   return GNUNET_JSON_from_time_abs (GNUNET_TIME_absolute_ntoh (stamp));
90 }
91
92
93 /**
94  * Convert relative timestamp to a json string.
95  *
96  * @param stamp the time stamp
97  * @return a json string with the timestamp in @a stamp
98  */
99 json_t *
100 GNUNET_JSON_from_time_rel (struct GNUNET_TIME_Relative stamp)
101 {
102   json_t *j;
103   char *mystr;
104   int ret;
105
106   GNUNET_assert (GNUNET_OK ==
107                  GNUNET_TIME_round_rel (&stamp));
108   if (stamp.rel_value_us == GNUNET_TIME_UNIT_FOREVER_REL.rel_value_us)
109     return json_string ("/forever/");
110   ret = GNUNET_asprintf (&mystr,
111                          "/Delay(%llu)/",
112                          (unsigned long long) (stamp.rel_value_us / (1000LL
113                                                                      * 1000LL)));
114   GNUNET_assert (ret > 0);
115   j = json_string (mystr);
116   GNUNET_free (mystr);
117   return j;
118 }
119
120
121 /**
122  * Convert RSA public key to JSON.
123  *
124  * @param pk public key to convert
125  * @return corresponding JSON encoding
126  */
127 json_t *
128 GNUNET_JSON_from_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *pk)
129 {
130   char *buf;
131   size_t buf_len;
132   json_t *ret;
133
134   buf_len = GNUNET_CRYPTO_rsa_public_key_encode (pk,
135                                                  &buf);
136   ret = GNUNET_JSON_from_data (buf,
137                                buf_len);
138   GNUNET_free (buf);
139   return ret;
140 }
141
142
143 /**
144  * Convert RSA signature to JSON.
145  *
146  * @param sig signature to convert
147  * @return corresponding JSON encoding
148  */
149 json_t *
150 GNUNET_JSON_from_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *sig)
151 {
152   char *buf;
153   size_t buf_len;
154   json_t *ret;
155
156   buf_len = GNUNET_CRYPTO_rsa_signature_encode (sig,
157                                                 &buf);
158   ret = GNUNET_JSON_from_data (buf,
159                                buf_len);
160   GNUNET_free (buf);
161   return ret;
162 }
163
164
165 /**
166  * Convert GNS record to JSON.
167  *
168  * @param rname name of record
169  * @param rd record data
170  * @return corresponding JSON encoding
171  */
172 json_t *
173 GNUNET_JSON_from_gnsrecord (const char*rname,
174                             const struct GNUNET_GNSRECORD_Data *rd,
175                             unsigned int rd_count)
176 {
177   struct GNUNET_TIME_Absolute expiration_time;
178   const char *expiration_time_str;
179   const char *record_type_str;
180   char *value_str;
181   json_t *data;
182   json_t *record;
183   json_t *records;
184
185   data = json_object ();
186   json_object_set_new (data,
187                        "record_name",
188                        json_string (rname));
189   records = json_array ();
190   for (int i = 0; i < rd_count; i++)
191   {
192     value_str = GNUNET_GNSRECORD_value_to_string (rd[i].record_type,
193                                                   rd[i].data,
194                                                   rd[i].data_size);
195     expiration_time = GNUNET_GNSRECORD_record_get_expiration_time (1, &rd[i]);
196     expiration_time_str = GNUNET_STRINGS_absolute_time_to_string (
197       expiration_time);
198     record_type_str = GNUNET_GNSRECORD_number_to_typename (rd[i].record_type);
199     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
200                 "Packing %s %s %s %d\n",
201                 value_str, record_type_str, expiration_time_str, rd[i].flags);
202     record = json_pack ("{s:s,s:s,s:s,s:i}",
203                         "value",
204                         value_str,
205                         "record_type",
206                         record_type_str,
207                         "expiration_time",
208                         expiration_time_str,
209                         "flag",
210                         rd[i].flags);
211     GNUNET_assert (NULL != record);
212     GNUNET_free (value_str);
213     json_array_append_new (records, record);
214   }
215   json_object_set_new (data, "data", records);
216   return data;
217 }
218
219
220 /* End of json/json_generator.c */