1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
4 * This file is part of gsignond
6 * Copyright (C) 2012-2013 Intel Corporation.
8 * Contact: Imran Zaman <imran.zaman@intel.com>
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
28 #include "gsignond-digest-plugin.h"
29 #include "gsignond/gsignond-session-data.h"
30 #include "gsignond/gsignond-plugin-interface.h"
31 #include "gsignond/gsignond-error.h"
32 #include "gsignond/gsignond-log.h"
33 #include "gsignond/gsignond-config.h"
34 #include "common/gsignond-plugin-loader.h"
36 static void check_plugin(GSignondPlugin* plugin)
41 fail_if(plugin == NULL);
43 g_object_get(plugin, "type", &type, "mechanisms", &mechanisms, NULL);
45 fail_unless(g_strcmp0(type, "digest") == 0);
46 fail_unless(g_strcmp0(mechanisms[0], "digest") == 0);
47 fail_unless(mechanisms[1] == NULL);
50 g_strfreev(mechanisms);
53 START_TEST (test_digestplugin_create)
57 plugin = g_object_new(GSIGNOND_TYPE_DIGEST_PLUGIN, NULL);
59 g_object_unref(plugin);
65 GSignondPlugin* plugin,
66 GSignondSessionData* result,
69 GSignondSessionData** user_data_p = user_data;
70 *user_data_p = gsignond_dictionary_copy(result);
74 user_action_required_callback(
75 GSignondPlugin* plugin,
76 GSignondSignonuiData* ui_request,
79 GSignondSignonuiData** user_data_p = user_data;
80 *user_data_p = gsignond_dictionary_copy(ui_request);
81 gsignond_signonui_data_set_username(*user_data_p, "user1");
82 gsignond_signonui_data_set_password(*user_data_p, "password1");
87 GSignondPlugin* plugin,
91 GError** user_data_p = user_data;
92 *user_data_p = g_error_copy(error);
96 START_TEST (test_digestplugin_request)
101 plugin = g_object_new(GSIGNOND_TYPE_DIGEST_PLUGIN, NULL);
102 fail_if(plugin == NULL);
104 GSignondSessionData* result = NULL;
105 GSignondSignonuiData* ui_action = NULL;
106 GError* error = NULL;
108 g_signal_connect(plugin, "response-final", G_CALLBACK(response_callback),
110 g_signal_connect(plugin, "user-action-required",
111 G_CALLBACK(user_action_required_callback), &ui_action);
112 g_signal_connect(plugin, "error", G_CALLBACK(error_callback), &error);
114 GSignondSessionData* data = gsignond_dictionary_new();
116 // set only username and password
117 gsignond_session_data_set_username(data, "user1");
118 gsignond_session_data_set_secret(data, "password1");
120 gsignond_plugin_request_initial(plugin, data, "digest");
121 fail_if(result != NULL);
122 fail_if(ui_action != NULL);
123 fail_if(error == NULL);
124 fail_unless(g_error_matches(error, GSIGNOND_ERROR,
125 GSIGNOND_ERROR_MISSING_DATA));
129 // set all the required stuff so that no ui-action is required
130 gsignond_session_data_set_realm(data, "realm1");
131 gsignond_dictionary_set_string(data, "Algo", "md5-sess");
132 gsignond_dictionary_set_string(data, "Nonce",
133 "abg10b1234ee1f0e8b11d0f600bfb0c093");
134 gsignond_dictionary_set_string(data, "Method", "GET");
135 gsignond_dictionary_set_string(data, "DigestUri", "/test/index.html");
137 gsignond_plugin_request_initial(plugin, data, "digest");
138 fail_if(result == NULL);
139 fail_if(ui_action != NULL);
140 fail_if(error != NULL);
141 fail_if(g_strcmp0(gsignond_session_data_get_username(result),
143 fail_if(gsignond_dictionary_get_string(result, "Response") == NULL);
144 fail_if(gsignond_dictionary_get_string(result, "CNonce") == NULL);
145 gsignond_dictionary_unref(result);
148 //remove secret so that ui action is required
149 gsignond_dictionary_remove (data, "Secret");
150 gsignond_plugin_request_initial(plugin, data, "digest");
151 fail_if(result != NULL);
152 fail_if(ui_action == NULL);
153 fail_if(error != NULL);
154 fail_if(g_strcmp0(gsignond_signonui_data_get_username(ui_action),
156 fail_if(g_strcmp0(gsignond_signonui_data_get_password(ui_action),
158 fail_if(gsignond_dictionary_get_string(ui_action, "Realm") == NULL);
159 fail_if(gsignond_dictionary_get_string(ui_action, "DigestUri") == NULL);
160 gsignond_signonui_data_get_query_username(ui_action, &query_res);
161 fail_if(query_res == FALSE);
162 gsignond_signonui_data_get_query_password(ui_action, &query_res);
163 fail_if(query_res == FALSE);
164 gsignond_dictionary_unref(ui_action);
167 gsignond_dictionary_unref(data);
168 g_object_unref(plugin);
172 START_TEST (test_digestplugin_user_action_finished)
176 plugin = g_object_new(GSIGNOND_TYPE_DIGEST_PLUGIN, NULL);
177 fail_if(plugin == NULL);
179 GSignondSessionData *result = NULL, *data = NULL;
180 GSignondSignonuiData *ui_action = NULL, *ui_data = NULL;
181 GError* error = NULL;
183 g_signal_connect(plugin, "response-final", G_CALLBACK(response_callback),
185 g_signal_connect(plugin, "user-action-required",
186 G_CALLBACK(user_action_required_callback), &ui_action);
187 g_signal_connect(plugin, "error", G_CALLBACK(error_callback), &error);
189 ui_data = gsignond_signonui_data_new();
190 gsignond_signonui_data_set_query_error(ui_data, SIGNONUI_ERROR_NONE);
193 gsignond_plugin_user_action_finished(plugin, ui_data);
194 fail_if(result != NULL);
195 fail_if(ui_action != NULL);
196 fail_if(error == NULL);
197 fail_unless(g_error_matches(error, GSIGNOND_ERROR,
198 GSIGNOND_ERROR_USER_INTERACTION));
203 gsignond_signonui_data_set_query_error(ui_data, SIGNONUI_ERROR_CANCELED);
204 gsignond_plugin_user_action_finished(plugin, ui_data);
205 fail_if(result != NULL);
206 fail_if(ui_action != NULL);
207 fail_if(error == NULL);
208 fail_unless(g_error_matches(error, GSIGNOND_ERROR,
209 GSIGNOND_ERROR_SESSION_CANCELED));
213 // error in ui request
214 gsignond_signonui_data_set_query_error(ui_data, SIGNONUI_ERROR_GENERAL);
215 gsignond_plugin_user_action_finished(plugin, ui_data);
216 fail_if(result != NULL);
217 fail_if(ui_action != NULL);
218 fail_if(error == NULL);
219 fail_unless(g_error_matches(error, GSIGNOND_ERROR,
220 GSIGNOND_ERROR_USER_INTERACTION));
224 // correct values but no session data
225 gsignond_signonui_data_set_username (ui_data, "user1");
226 gsignond_signonui_data_set_password (ui_data, "password1");
227 gsignond_signonui_data_set_query_error (ui_data, SIGNONUI_ERROR_NONE);
228 gsignond_plugin_user_action_finished (plugin, ui_data);
229 fail_if(result != NULL);
230 fail_if(ui_action != NULL);
231 fail_if(error == NULL);
232 fail_unless(g_error_matches(error, GSIGNOND_ERROR,
233 GSIGNOND_ERROR_USER_INTERACTION));
238 data = gsignond_dictionary_new ();
239 gsignond_session_data_set_username (data, "user1");
240 gsignond_session_data_set_realm (data, "realm1");
241 gsignond_dictionary_set_string (data, "Algo", "md5-sess");
242 gsignond_dictionary_set_string (data, "Nonce",
243 "abg10b1234ee1f0e8b11d0f600bfb0c093");
244 gsignond_dictionary_set_string (data, "Method", "GET");
245 gsignond_dictionary_set_string (data, "DigestUri", "/test/index.html");
246 gsignond_plugin_request_initial (plugin, data, "digest");
247 gsignond_dictionary_unref (data); data = NULL;
249 gsignond_plugin_user_action_finished (plugin, ui_data);
250 fail_if (result == NULL);
251 fail_if (error != NULL);
252 fail_if(ui_action == NULL);
253 fail_if(g_strcmp0(gsignond_session_data_get_username(result),
255 fail_if(gsignond_dictionary_get_string(result, "Response") == NULL);
256 fail_if(gsignond_dictionary_get_string(result, "CNonce") == NULL);
257 gsignond_dictionary_unref(result);
259 gsignond_dictionary_unref(ui_action);
262 gsignond_dictionary_unref (ui_data);
263 g_object_unref (plugin);
267 START_TEST (test_digestplugin_refresh)
271 plugin = g_object_new(GSIGNOND_TYPE_DIGEST_PLUGIN, NULL);
272 fail_if(plugin == NULL);
274 GSignondSessionData* result = NULL;
275 GError* error = NULL;
277 g_signal_connect(plugin, "refreshed", G_CALLBACK(response_callback),
279 g_signal_connect(plugin, "error", G_CALLBACK(error_callback), &error);
281 GSignondSessionData* data = gsignond_dictionary_new();
282 gsignond_plugin_refresh(plugin, data);
283 fail_if(result == NULL);
284 fail_if(error != NULL);
285 gsignond_dictionary_unref(result);
288 gsignond_dictionary_unref(data);
289 g_object_unref(plugin);
293 Suite* digestplugin_suite (void)
295 Suite *s = suite_create ("Digest plugin");
298 TCase *tc_core = tcase_create ("Tests");
299 tcase_add_test (tc_core, test_digestplugin_create);
300 tcase_add_test (tc_core, test_digestplugin_request);
301 tcase_add_test (tc_core, test_digestplugin_user_action_finished);
302 tcase_add_test (tc_core, test_digestplugin_refresh);
303 suite_add_tcase (s, tc_core);
311 #if !GLIB_CHECK_VERSION (2, 36, 0)
315 Suite *s = digestplugin_suite();
316 SRunner *sr = srunner_create(s);
317 srunner_run_all(sr, CK_NORMAL);
318 number_failed = srunner_ntests_failed(sr);
320 return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;