Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2021 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU General Public License as
7 : published by the Free Software Foundation; either version 3, or
8 : (at your 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
13 : GNU 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 src/testing/testing_api_cmd_instance_auth.c
21 : * @brief command to test /private/auth POSTing
22 : * @author Christian Grothoff
23 : */
24 : #include "platform.h"
25 : struct AuthInstanceState;
26 : #define TALER_MERCHANT_POST_MANAGEMENT_INSTANCES_AUTH_RESULT_CLOSURE struct AuthInstanceState
27 : #include <taler/taler_exchange_service.h>
28 : #include <taler/taler_testing_lib.h>
29 : #include "taler/taler_merchant_service.h"
30 : #include "taler/taler_merchant_testing_lib.h"
31 : #include <taler/merchant/post-management-instances-INSTANCE-auth.h>
32 :
33 :
34 : /**
35 : * State of a "POST /instances/$ID/private/auth" CMD.
36 : */
37 : struct AuthInstanceState
38 : {
39 :
40 : /**
41 : * Handle for a "POST auth" request.
42 : */
43 : struct TALER_MERCHANT_PostManagementInstancesAuthHandle *iaph;
44 :
45 : /**
46 : * The interpreter state.
47 : */
48 : struct TALER_TESTING_Interpreter *is;
49 :
50 : /**
51 : * Base URL of the merchant serving the request.
52 : */
53 : const char *merchant_url;
54 :
55 : /**
56 : * ID of the instance to run GET for.
57 : */
58 : const char *instance_id;
59 :
60 : /**
61 : * Desired token. Can be NULL
62 : */
63 : const char *auth_token;
64 :
65 : /**
66 : * Current password, required for self-service changes.
67 : */
68 : const char *old_password;
69 :
70 : /**
71 : * Expected HTTP response code.
72 : */
73 : unsigned int http_status;
74 :
75 : };
76 :
77 :
78 : /**
79 : * Callback for a POST /instances/$ID/private/auth operation.
80 : *
81 : * @param cls closure for this function
82 : * @param iar response being processed
83 : */
84 : static void
85 6 : auth_instance_cb (struct AuthInstanceState *ais,
86 : const struct
87 : TALER_MERCHANT_PostManagementInstancesAuthResponse *iar)
88 : {
89 :
90 6 : ais->iaph = NULL;
91 6 : if (ais->http_status != iar->hr.http_status)
92 : {
93 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
94 : "Unexpected response code %u (%d) to command %s\n",
95 : iar->hr.http_status,
96 : (int) iar->hr.ec,
97 : TALER_TESTING_interpreter_get_current_label (ais->is));
98 0 : TALER_TESTING_interpreter_fail (ais->is);
99 0 : return;
100 : }
101 6 : switch (iar->hr.http_status)
102 : {
103 6 : case MHD_HTTP_NO_CONTENT:
104 6 : break;
105 0 : case MHD_HTTP_BAD_REQUEST:
106 : /* likely invalid auth_token value, we do not check client-side */
107 0 : break;
108 0 : case MHD_HTTP_FORBIDDEN:
109 0 : break;
110 0 : default:
111 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
112 : "Unhandled HTTP status %u (%d) returned from /private/auth operation.\n",
113 : iar->hr.http_status,
114 : iar->hr.ec);
115 : }
116 6 : TALER_TESTING_interpreter_next (ais->is);
117 : }
118 :
119 :
120 : /**
121 : * Run the "AUTH /instances/$ID" CMD.
122 : *
123 : *
124 : * @param cls closure.
125 : * @param cmd command being run now.
126 : * @param is interpreter state.
127 : */
128 : static void
129 6 : auth_instance_run (void *cls,
130 : const struct TALER_TESTING_Command *cmd,
131 : struct TALER_TESTING_Interpreter *is)
132 : {
133 6 : struct AuthInstanceState *ais = cls;
134 :
135 6 : ais->is = is;
136 6 : ais->iaph = TALER_MERCHANT_post_management_instances_auth_create (
137 : TALER_TESTING_interpreter_get_context (is),
138 : ais->merchant_url,
139 : ais->instance_id);
140 6 : TALER_MERCHANT_post_management_instances_auth_set_options (
141 : ais->iaph,
142 : TALER_MERCHANT_post_management_instances_auth_option_password (ais->auth_token),
143 : TALER_MERCHANT_post_management_instances_auth_option_old_password (
144 : ais->old_password));
145 : {
146 : enum TALER_ErrorCode ec;
147 :
148 6 : ec = TALER_MERCHANT_post_management_instances_auth_start (
149 : ais->iaph,
150 : &auth_instance_cb,
151 : ais);
152 6 : GNUNET_assert (TALER_EC_NONE == ec);
153 : }
154 6 : }
155 :
156 :
157 : /**
158 : * Free the state of a "POST instance auth" CMD, and possibly
159 : * cancel a pending operation thereof.
160 : *
161 : * @param cls closure.
162 : * @param cmd command being run.
163 : */
164 : static void
165 6 : auth_instance_cleanup (void *cls,
166 : const struct TALER_TESTING_Command *cmd)
167 : {
168 6 : struct AuthInstanceState *ais = cls;
169 :
170 6 : if (NULL != ais->iaph)
171 : {
172 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
173 : "POST /instance/$ID/auth operation did not complete\n");
174 0 : TALER_MERCHANT_post_management_instances_auth_cancel (ais->iaph);
175 : }
176 6 : GNUNET_free (ais);
177 6 : }
178 :
179 :
180 : /**
181 : * Offer internal data to other commands.
182 : *
183 : * @param cls closure
184 : * @param[out] ret result (could be anything)
185 : * @param trait name of the trait
186 : * @param index index number of the object to extract.
187 : * @return #GNUNET_OK on success
188 : */
189 : static enum GNUNET_GenericReturnValue
190 0 : auth_instance_traits (void *cls,
191 : const void **ret,
192 : const char *trait,
193 : unsigned int index)
194 : {
195 0 : struct AuthInstanceState *ais = cls;
196 : struct TALER_TESTING_Trait traits[] = {
197 0 : TALER_TESTING_make_trait_auth_token (ais->auth_token),
198 0 : TALER_TESTING_trait_end ()
199 : };
200 :
201 0 : return TALER_TESTING_get_trait (traits,
202 : ret,
203 : trait,
204 : index);
205 : }
206 :
207 :
208 : struct TALER_TESTING_Command
209 6 : TALER_TESTING_cmd_merchant_post_instance_auth2 (const char *label,
210 : const char *merchant_url,
211 : const char *instance_id,
212 : const char *auth_token,
213 : const char *old_password,
214 : unsigned int http_status)
215 : {
216 : struct AuthInstanceState *ais;
217 :
218 6 : ais = GNUNET_new (struct AuthInstanceState);
219 6 : ais->merchant_url = merchant_url;
220 6 : ais->instance_id = instance_id;
221 6 : ais->auth_token = auth_token;
222 6 : ais->old_password = old_password;
223 6 : ais->http_status = http_status;
224 :
225 : {
226 6 : struct TALER_TESTING_Command cmd = {
227 : .cls = ais,
228 : .label = label,
229 : .run = &auth_instance_run,
230 : .cleanup = &auth_instance_cleanup,
231 : .traits = &auth_instance_traits
232 : };
233 :
234 6 : return cmd;
235 : }
236 : }
237 :
238 :
239 : struct TALER_TESTING_Command
240 2 : TALER_TESTING_cmd_merchant_post_instance_auth (const char *label,
241 : const char *merchant_url,
242 : const char *instance_id,
243 : const char *auth_token,
244 : unsigned int http_status)
245 : {
246 2 : return TALER_TESTING_cmd_merchant_post_instance_auth2 (label,
247 : merchant_url,
248 : instance_id,
249 : auth_token,
250 : NULL,
251 : http_status);
252 : }
253 :
254 :
255 : /* end of testing_api_cmd_auth_instance.c */
|