Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2018, 2021, 2024 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify it under the
6 : terms of the GNU General Public License as published by the Free Software
7 : Foundation; either version 3, or (at your option) any later version.
8 :
9 : TALER is distributed in the hope that it will be useful, but WITHOUT ANY
10 : WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
11 : A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12 :
13 : You should have received a copy of the GNU General Public License along with
14 : TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
15 : */
16 : /**
17 : * @file json/json_wire.c
18 : * @brief helper functions to generate or check /wire replies
19 : * @author Christian Grothoff
20 : */
21 : #include <gnunet/gnunet_util_lib.h>
22 : #include "taler/taler_util.h"
23 : #include "taler/taler_json_lib.h"
24 :
25 :
26 : enum GNUNET_GenericReturnValue
27 108 : TALER_JSON_merchant_wire_signature_hash (const json_t *wire_s,
28 : struct TALER_MerchantWireHashP *hc)
29 : {
30 : struct TALER_FullPayto payto_uri;
31 : struct TALER_WireSaltP salt;
32 : struct GNUNET_JSON_Specification spec[] = {
33 108 : TALER_JSON_spec_full_payto_uri ("payto_uri",
34 : &payto_uri),
35 108 : GNUNET_JSON_spec_fixed_auto ("salt",
36 : &salt),
37 108 : GNUNET_JSON_spec_end ()
38 : };
39 :
40 108 : if (GNUNET_OK !=
41 108 : GNUNET_JSON_parse (wire_s,
42 : spec,
43 : NULL, NULL))
44 : {
45 0 : GNUNET_break_op (0);
46 0 : return GNUNET_SYSERR;
47 : }
48 108 : GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
49 : "Validating `%s'\n",
50 : payto_uri.full_payto);
51 : {
52 : char *err;
53 :
54 108 : err = TALER_payto_validate (payto_uri);
55 108 : if (NULL != err)
56 : {
57 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
58 : "URI `%s' ill-formed: %s\n",
59 : payto_uri.full_payto,
60 : err);
61 0 : GNUNET_free (err);
62 0 : return GNUNET_SYSERR;
63 : }
64 : }
65 108 : TALER_merchant_wire_signature_hash (payto_uri,
66 : &salt,
67 : hc);
68 108 : return GNUNET_OK;
69 : }
70 :
71 :
72 : struct TALER_FullPayto
73 0 : TALER_JSON_wire_to_payto (const json_t *wire_s)
74 : {
75 : json_t *payto_o;
76 : const char *payto_str;
77 0 : struct TALER_FullPayto payto = {
78 : NULL
79 : };
80 : char *err;
81 :
82 0 : payto_o = json_object_get (wire_s,
83 : "payto_uri");
84 0 : if ( (NULL == payto_o) ||
85 0 : (NULL == (payto_str = json_string_value (payto_o))) )
86 : {
87 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
88 : "Malformed wire record encountered: lacks payto://-url\n");
89 0 : return payto;
90 : }
91 0 : payto.full_payto = GNUNET_strdup (payto_str);
92 0 : if (NULL !=
93 0 : (err = TALER_payto_validate (payto)))
94 : {
95 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
96 : "Malformed wire record encountered: payto URI `%s' invalid: %s\n",
97 : payto_str,
98 : err);
99 0 : GNUNET_free (payto.full_payto);
100 0 : GNUNET_free (err);
101 0 : return payto;
102 : }
103 0 : return payto;
104 : }
105 :
106 :
107 : char *
108 0 : TALER_JSON_wire_to_method (const json_t *wire_s)
109 : {
110 : json_t *payto_o;
111 : const char *payto_str;
112 :
113 0 : payto_o = json_object_get (wire_s,
114 : "payto_uri");
115 0 : if ( (NULL == payto_o) ||
116 0 : (NULL == (payto_str = json_string_value (payto_o))) )
117 : {
118 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
119 : "Fatally malformed wire record encountered: lacks payto://-url\n");
120 0 : return NULL;
121 : }
122 0 : return TALER_payto_get_method (payto_str);
123 : }
124 :
125 :
126 : /* end of json_wire.c */
|