Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2023 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify it
6 : under the terms of the GNU General Public License as published by
7 : the Free Software Foundation; either version 3, or (at your
8 : option) any later version.
9 :
10 : TALER 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 : General Public License for more details.
14 :
15 : You should have received a copy of the GNU General Public
16 : License along with TALER; see the file COPYING. If not, see
17 : <http://www.gnu.org/licenses/>
18 : */
19 : /**
20 : * @file testing/testing_api_cmd_set_officer.c
21 : * @brief command for testing /management/aml-officers
22 : * @author Christian Grothoff
23 : */
24 : #include "taler/platform.h"
25 :
26 : struct SetOfficerState;
27 : #define TALER_EXCHANGE_POST_MANAGEMENT_AML_OFFICERS_RESULT_CLOSURE \
28 : struct SetOfficerState
29 : #include "taler/taler-exchange/post-management-aml-officers.h"
30 :
31 : #include "taler/taler_json_lib.h"
32 : #include <gnunet/gnunet_curl_lib.h>
33 : #include "taler/taler_testing_lib.h"
34 : #include "taler/taler_signatures.h"
35 : #include "taler/backoff.h"
36 :
37 :
38 : /**
39 : * State for a "set_officer" CMD.
40 : */
41 : struct SetOfficerState
42 : {
43 :
44 : /**
45 : * Update AML officer handle while operation is running.
46 : */
47 : struct TALER_EXCHANGE_PostManagementAmlOfficersHandle *dh;
48 :
49 : /**
50 : * Our interpreter.
51 : */
52 : struct TALER_TESTING_Interpreter *is;
53 :
54 : /**
55 : * Reference to command to previous set officer
56 : * to update, or NULL.
57 : */
58 : const char *ref_cmd;
59 :
60 : /**
61 : * Name to use for the officer.
62 : */
63 : const char *name;
64 :
65 : /**
66 : * Private key of the AML officer.
67 : */
68 : struct TALER_AmlOfficerPrivateKeyP officer_priv;
69 :
70 : /**
71 : * Public key of the AML officer.
72 : */
73 : struct TALER_AmlOfficerPublicKeyP officer_pub;
74 :
75 : /**
76 : * Is the officer supposed to be enabled?
77 : */
78 : bool is_active;
79 :
80 : /**
81 : * Is access supposed to be read-only?
82 : */
83 : bool read_only;
84 :
85 : };
86 :
87 :
88 : /**
89 : * Callback to analyze the /management/XXX response, just used to check
90 : * if the response code is acceptable.
91 : *
92 : * @param ds our context
93 : * @param ar response details
94 : */
95 : static void
96 4 : set_officer_cb (
97 : struct SetOfficerState *ds,
98 : const struct TALER_EXCHANGE_PostManagementAmlOfficersResponse *ar)
99 : {
100 4 : const struct TALER_EXCHANGE_HttpResponse *hr = &ar->hr;
101 :
102 4 : ds->dh = NULL;
103 4 : if (MHD_HTTP_NO_CONTENT != hr->http_status)
104 : {
105 0 : TALER_TESTING_unexpected_status (ds->is,
106 : hr->http_status,
107 : MHD_HTTP_NO_CONTENT);
108 0 : return;
109 : }
110 4 : TALER_TESTING_interpreter_next (ds->is);
111 : }
112 :
113 :
114 : /**
115 : * Run the command.
116 : *
117 : * @param cls closure.
118 : * @param cmd the command to execute.
119 : * @param is the interpreter state.
120 : */
121 : static void
122 4 : set_officer_run (void *cls,
123 : const struct TALER_TESTING_Command *cmd,
124 : struct TALER_TESTING_Interpreter *is)
125 : {
126 4 : struct SetOfficerState *ds = cls;
127 : struct GNUNET_TIME_Timestamp now;
128 : struct TALER_MasterSignatureP master_sig;
129 : const char *exchange_url;
130 :
131 : (void) cmd;
132 : {
133 : const struct TALER_TESTING_Command *exchange_cmd;
134 :
135 4 : exchange_cmd = TALER_TESTING_interpreter_get_command (is,
136 : "exchange");
137 4 : if (NULL == exchange_cmd)
138 : {
139 0 : GNUNET_break (0);
140 0 : TALER_TESTING_interpreter_fail (is);
141 0 : return;
142 : }
143 4 : GNUNET_assert (GNUNET_OK ==
144 : TALER_TESTING_get_trait_exchange_url (exchange_cmd,
145 : &exchange_url));
146 : }
147 4 : now = GNUNET_TIME_timestamp_get ();
148 4 : ds->is = is;
149 4 : if (NULL == ds->ref_cmd)
150 : {
151 2 : GNUNET_CRYPTO_eddsa_key_create (&ds->officer_priv.eddsa_priv);
152 2 : GNUNET_CRYPTO_eddsa_key_get_public (&ds->officer_priv.eddsa_priv,
153 : &ds->officer_pub.eddsa_pub);
154 : }
155 : else
156 : {
157 : const struct TALER_TESTING_Command *ref;
158 : const struct TALER_AmlOfficerPrivateKeyP *officer_priv;
159 : const struct TALER_AmlOfficerPublicKeyP *officer_pub;
160 :
161 2 : ref = TALER_TESTING_interpreter_lookup_command (is,
162 : ds->ref_cmd);
163 2 : if (NULL == ref)
164 : {
165 0 : GNUNET_break (0);
166 0 : TALER_TESTING_interpreter_fail (is);
167 0 : return;
168 : }
169 2 : GNUNET_assert (GNUNET_OK ==
170 : TALER_TESTING_get_trait_officer_pub (ref,
171 : &officer_pub));
172 2 : GNUNET_assert (GNUNET_OK ==
173 : TALER_TESTING_get_trait_officer_priv (ref,
174 : &officer_priv));
175 2 : ds->officer_pub = *officer_pub;
176 2 : ds->officer_priv = *officer_priv;
177 : }
178 : {
179 : const struct TALER_TESTING_Command *exchange_cmd;
180 : const struct TALER_MasterPrivateKeyP *master_priv;
181 :
182 4 : exchange_cmd = TALER_TESTING_interpreter_get_command (is,
183 : "exchange");
184 4 : if (NULL == exchange_cmd)
185 : {
186 0 : GNUNET_break (0);
187 0 : TALER_TESTING_interpreter_fail (is);
188 0 : return;
189 : }
190 4 : GNUNET_assert (GNUNET_OK ==
191 : TALER_TESTING_get_trait_master_priv (exchange_cmd,
192 : &master_priv));
193 :
194 4 : TALER_exchange_offline_aml_officer_status_sign (&ds->officer_pub,
195 : ds->name,
196 : now,
197 4 : ds->is_active,
198 4 : ds->read_only,
199 : master_priv,
200 : &master_sig);
201 : }
202 4 : ds->dh = TALER_EXCHANGE_post_management_aml_officers_create (
203 : TALER_TESTING_interpreter_get_context (is),
204 : exchange_url,
205 4 : &ds->officer_pub,
206 : ds->name,
207 : now,
208 4 : ds->is_active,
209 4 : ds->read_only,
210 : &master_sig);
211 4 : if (NULL == ds->dh)
212 : {
213 0 : GNUNET_break (0);
214 0 : TALER_TESTING_interpreter_fail (is);
215 0 : return;
216 : }
217 4 : GNUNET_assert (TALER_EC_NONE ==
218 : TALER_EXCHANGE_post_management_aml_officers_start (
219 : ds->dh,
220 : &set_officer_cb,
221 : ds));
222 : }
223 :
224 :
225 : /**
226 : * Free the state of a "set_officer" CMD, and possibly cancel a
227 : * pending operation thereof.
228 : *
229 : * @param cls closure, must be a `struct SetOfficerState`.
230 : * @param cmd the command which is being cleaned up.
231 : */
232 : static void
233 4 : set_officer_cleanup (void *cls,
234 : const struct TALER_TESTING_Command *cmd)
235 : {
236 4 : struct SetOfficerState *ds = cls;
237 :
238 4 : if (NULL != ds->dh)
239 : {
240 0 : TALER_TESTING_command_incomplete (ds->is,
241 : cmd->label);
242 0 : TALER_EXCHANGE_post_management_aml_officers_cancel (ds->dh);
243 0 : ds->dh = NULL;
244 : }
245 4 : GNUNET_free (ds);
246 4 : }
247 :
248 :
249 : /**
250 : * Offer internal data of a "set officer" CMD state to other
251 : * commands.
252 : *
253 : * @param cls closure
254 : * @param[out] ret result (could be anything)
255 : * @param trait name of the trait
256 : * @param index index number of the object to offer.
257 : * @return #GNUNET_OK on success
258 : */
259 : static enum GNUNET_GenericReturnValue
260 12 : set_officer_traits (void *cls,
261 : const void **ret,
262 : const char *trait,
263 : unsigned int index)
264 : {
265 12 : struct SetOfficerState *ws = cls;
266 : struct TALER_TESTING_Trait traits[] = {
267 12 : TALER_TESTING_make_trait_officer_pub (&ws->officer_pub),
268 12 : TALER_TESTING_make_trait_officer_priv (&ws->officer_priv),
269 12 : TALER_TESTING_make_trait_officer_name (ws->name),
270 12 : TALER_TESTING_trait_end ()
271 : };
272 :
273 12 : return TALER_TESTING_get_trait (traits,
274 : ret,
275 : trait,
276 : index);
277 : }
278 :
279 :
280 : struct TALER_TESTING_Command
281 4 : TALER_TESTING_cmd_set_officer (
282 : const char *label,
283 : const char *ref_cmd,
284 : const char *name,
285 : bool is_active,
286 : bool read_only)
287 : {
288 : struct SetOfficerState *ds;
289 :
290 4 : ds = GNUNET_new (struct SetOfficerState);
291 4 : ds->ref_cmd = ref_cmd;
292 4 : ds->name = name;
293 4 : ds->is_active = is_active;
294 4 : ds->read_only = read_only;
295 : {
296 4 : struct TALER_TESTING_Command cmd = {
297 : .cls = ds,
298 : .label = label,
299 : .run = &set_officer_run,
300 : .cleanup = &set_officer_cleanup,
301 : .traits = &set_officer_traits
302 : };
303 :
304 4 : return cmd;
305 : }
306 : }
307 :
308 :
309 : /* end of testing_api_cmd_set_officer.c */
|