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 Intel Corporation.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
29 #include <glib/gstdio.h>
31 #include "gsignond/gsignond-config.h"
32 #include "gsignond/gsignond-log.h"
33 #include "gsignond/gsignond-credentials.h"
34 #include "gsignond/gsignond-secret-storage.h"
35 #include "common/db/gsignond-db-error.h"
36 #include "common/db/gsignond-db-secret-database.h"
37 #include "common/db/gsignond-db-sql-database.h"
38 #include "daemon/gsignond-daemon.h"
39 #include "daemon/db/gsignond-db-metadata-database.h"
40 #include "daemon/db/gsignond-db-credentials-database.h"
43 _sequence_new (gchar *data)
45 GSequence *value = NULL;
46 value = g_sequence_new (NULL);
47 g_sequence_append (value, (guint8 *)data);
62 GVariant *value2 = (GVariant *)g_hash_table_lookup (user_data->table, key);
64 if (value2 && g_variant_get_size (value) == g_variant_get_size (value2)
65 && memcmp (g_variant_get_data(value2),
66 g_variant_get_data(value),
67 g_variant_get_size(value2)) == 0
68 && g_variant_is_of_type(value2, g_variant_get_type (value))) {
71 user_data->status = 0;
74 static GSignondIdentityInfo *
75 _get_filled_identity_info_2 (
76 GSignondIdentityInfo **identity_inp,
84 const gchar *username = "username1";
85 const gchar *secret = "secret1";
86 const gchar *caption = "caption1";
87 GSignondIdentityInfo *identity = NULL;
88 GSignondSecurityContextList *ctx_list = NULL;
89 GSignondSecurityContext *ctx1, *ctx2, *ctx3 ;
90 GHashTable *methods = NULL;
91 GSequence *seq1 = NULL, *seq_realms;
92 identity = *identity_inp;
95 identity = gsignond_identity_info_new ();
96 gsignond_identity_info_set_identity_new (identity);
97 gsignond_identity_info_set_secret (identity, secret);
98 gsignond_identity_info_set_store_secret (identity, TRUE);
100 gsignond_identity_info_set_username (identity, username);
101 gsignond_identity_info_set_username_secret (identity, TRUE);
102 gsignond_identity_info_set_caption (identity, caption);
107 seq_realms = _sequence_new("realms1");
108 gsignond_identity_info_set_realms (identity, seq_realms);
109 g_sequence_free (seq_realms);
114 methods = g_hash_table_new_full ((GHashFunc)g_str_hash,
115 (GEqualFunc)g_str_equal,
116 (GDestroyNotify)NULL,
117 (GDestroyNotify)g_sequence_free);
118 seq1 = _sequence_new("mech11"); g_sequence_append (seq1, "mech12");
119 g_hash_table_insert (methods, "method1", seq1);
120 g_hash_table_insert (methods, "method2", _sequence_new("mech21"));
121 g_hash_table_insert (methods, "method3", _sequence_new("mech31"));
122 gsignond_identity_info_set_methods (identity, methods);
123 g_hash_table_unref (methods);
127 ctx1 = gsignond_security_context_new_from_values ("sysctx1", "appctx1");
128 ctx2 = gsignond_security_context_new_from_values ("sysctx2", "appctx2");
129 ctx3 = gsignond_security_context_new_from_values ("sysctx3", "appctx3");
130 ctx_list = g_list_append (ctx_list,ctx1);
131 ctx_list = g_list_append (ctx_list,ctx2);
132 ctx_list = g_list_append (ctx_list,ctx3);
134 gsignond_identity_info_set_access_control_list (identity, ctx_list);
139 gsignond_identity_info_set_owner (identity, ctx1);
141 gsignond_security_context_list_free (ctx_list);
143 gsignond_identity_info_set_validated (identity, FALSE);
144 gsignond_identity_info_set_identity_type (identity, type);
148 static GSignondIdentityInfo *
149 _get_filled_identity_info (void)
151 GSignondIdentityInfo *identity = NULL;
152 return _get_filled_identity_info_2 (&identity,
153 TRUE, TRUE, TRUE, TRUE, TRUE);
157 _gsignond_query_read_int (
161 *status = sqlite3_column_int (stmt, 0);
165 _gsignond_query_read_string (
169 const gchar* str = NULL;
171 str = (const gchar *)sqlite3_column_text (stmt, 0);
172 if (str && strlen(str) > 0 &&
173 g_strcmp0 (str, "username1") == 0) {
179 START_TEST (test_sql_database)
181 GSignondDbSecretDatabase *database = NULL;
182 gchar *filename = NULL;
183 const gchar *dir = NULL;
184 GSignondCredentials *creds = NULL;
185 guint32 id = 1, method = 2;
186 GHashTable *data = NULL;
187 GSignondDictionary *data2 = NULL;
189 sqlite3_stmt *stmt = NULL;
192 GHashTable* hashtable = NULL;
193 GArray *array = NULL;
194 GSignondDbSqlDatabase *sqldb = NULL;
195 GError *error = NULL;
198 database = gsignond_db_secret_database_new ();
199 fail_if (database == NULL);
200 sqldb = GSIGNOND_DB_SQL_DATABASE (database);
202 fail_unless (gsignond_db_sql_database_clear (sqldb) == FALSE);
203 fail_unless (gsignond_db_sql_database_is_open (sqldb) == FALSE);
204 fail_unless (gsignond_db_secret_database_load_credentials (
205 database, 1) == NULL);
206 fail_unless (gsignond_db_secret_database_update_credentials (
207 database, NULL) == FALSE);
208 fail_unless (gsignond_db_secret_database_remove_credentials (
209 database, 1) == FALSE);
210 fail_unless (gsignond_db_secret_database_load_data (
211 database, 1, 2) == NULL);
212 fail_unless (gsignond_db_secret_database_update_data (
213 database, 1, 2, NULL) == FALSE);
214 fail_unless (gsignond_db_secret_database_remove_data (
215 database, 1, 2) == FALSE);
217 dir = "/tmp/gsignond";
218 g_mkdir_with_parents (dir, S_IRWXU);
219 filename = g_build_filename (dir, "sql_db_test.db", NULL);
220 fail_unless (gsignond_db_sql_database_open (sqldb, filename,
221 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) == TRUE);
222 /* don't open the db again if its already open */
223 fail_unless (gsignond_db_sql_database_open (sqldb, filename,
224 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) == TRUE);
227 creds = gsignond_credentials_new ();
228 fail_if (creds == NULL);
230 fail_unless (gsignond_credentials_set_data (
231 creds, id, "user 1", "pass 1") == TRUE);
233 fail_unless (gsignond_db_secret_database_update_credentials (
234 database, creds) == TRUE);
235 g_object_unref (creds); creds = NULL;
237 creds = gsignond_db_secret_database_load_credentials (database, id);
238 fail_if (creds == NULL);
239 g_object_unref (creds);
241 /* remove the added credentials */
242 fail_unless (gsignond_db_secret_database_remove_credentials (
243 database, id) == TRUE);
245 /* add data to store */
246 data = g_hash_table_new_full ((GHashFunc)g_str_hash,
247 (GEqualFunc)g_str_equal,
248 (GDestroyNotify)NULL,
249 (GDestroyNotify)g_variant_unref);
250 fail_if (data == NULL);
252 GVariantBuilder builder;
253 g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT);
254 g_variant_builder_add (&builder, "{sv}", "key1", g_variant_new_string ("string_value"));
255 g_variant_builder_add (&builder, "{sv}", "key2",g_variant_new_double (12223.4223));
256 g_variant_builder_add (&builder, "{sv}", "key3",g_variant_new_uint16(20));
257 g_variant_builder_add (&builder, "{sv}", "key4",g_variant_new("^ay", "byte_value"));
259 g_hash_table_insert (data, "dummy_client_id", g_variant_builder_end (&builder));
261 fail_unless (gsignond_db_secret_database_update_data (
262 database, id, method, data) == TRUE);
263 data2 = gsignond_db_secret_database_load_data (database, id, method);
264 fail_if (data2 == NULL);
267 g_hash_table_foreach (data2, (GHFunc)_compare_key_value, &input);
268 fail_if (input.status != 1);
270 gsignond_dictionary_unref (data2);
271 g_hash_table_unref(data);
274 /*sql database tests*/
275 fail_unless (gsignond_db_sql_database_clear (sqldb) == TRUE);
276 stmt = gsignond_db_sql_database_prepare_statement (
277 sqldb, "INSERT INTO CREDENTIALS "
278 "(id, username, password) VALUES (1, \"username1\",\"password\");");
279 fail_if (stmt == NULL);
280 fail_unless (sqlite3_finalize (stmt) == SQLITE_OK); stmt = NULL;
282 fail_unless (gsignond_db_sql_database_exec (
283 sqldb, "INSERT INTO CREDENTIALS (id, username, password) "
284 "VALUES (1, \"username1\",\"password\");") == TRUE);
286 fail_unless (gsignond_db_sql_database_exec (
287 sqldb, "INSERT INTO CREDENTIALS (id, username, password) "
288 "VALUES (2, \"username2\",\"password2\");") == TRUE);
290 fail_unless (gsignond_db_sql_database_exec (
291 sqldb, "SELECT id from CREDENTIALS limit 1;") == TRUE);
293 fail_unless (gsignond_db_sql_database_query_exec (
294 sqldb, "SELECT id from CREDENTIALS limit 1;",
295 (GSignondDbSqlDatabaseQueryCallback)_gsignond_query_read_int,
297 fail_unless (status == 1);
299 fail_unless (gsignond_db_sql_database_query_exec (
300 sqldb, "SELECT username from CREDENTIALS where id=1;",
301 (GSignondDbSqlDatabaseQueryCallback)_gsignond_query_read_string,
303 fail_unless (status == 1);
305 list = gsignond_db_sql_database_query_exec_string_list (
306 sqldb, "SELECT username from CREDENTIALS;");
307 fail_if (list == NULL);
308 fail_unless (g_list_length (list) == 2);
309 g_list_free_full (list, g_free);
311 hashtable = gsignond_db_sql_database_query_exec_string_tuple (
312 sqldb, "SELECT username, password from CREDENTIALS;");
313 fail_if (hashtable == NULL);
314 fail_unless (g_hash_table_size (hashtable) == 2);
315 g_hash_table_unref (hashtable);
317 hashtable = gsignond_db_sql_database_query_exec_int_string_tuple (
318 sqldb, "SELECT id, username from CREDENTIALS "
319 "where password=\"password2\";");
320 fail_if (hashtable == NULL);
321 fail_unless (g_hash_table_size (hashtable) == 1);
322 g_hash_table_unref (hashtable);
324 fail_unless (gsignond_db_sql_database_query_exec_int (
325 sqldb,"SELECT id from CREDENTIALS where username=\"username2\";",
327 fail_unless (status == 2);
329 array = gsignond_db_sql_database_query_exec_int_array (
330 sqldb,"SELECT id from CREDENTIALS;");
331 fail_if (array == NULL);
332 fail_unless (array->len == 2);
333 g_array_free (array, TRUE);
335 stmt = gsignond_db_sql_database_prepare_statement (
336 sqldb, "SELECT id from CREDENTIALS where username=\"username1\";");
337 fail_if (stmt == NULL);
338 fail_unless (gsignond_db_sql_database_query_exec_stmt (
339 sqldb, stmt, NULL, NULL) == 1);
342 fail_unless (gsignond_db_sql_database_start_transaction (sqldb) == TRUE);
343 fail_unless (gsignond_db_sql_database_commit_transaction (sqldb) == TRUE);
344 fail_unless (gsignond_db_sql_database_start_transaction (sqldb) == TRUE);
345 fail_unless (gsignond_db_sql_database_rollback_transaction (sqldb) == TRUE);
346 fail_unless (gsignond_db_sql_database_start_transaction (sqldb) == TRUE);
347 fail_unless (gsignond_db_sql_database_start_transaction (sqldb) == FALSE);
348 fail_unless (gsignond_db_sql_database_rollback_transaction (sqldb) == TRUE);
350 fail_unless (gsignond_db_sql_database_transaction_exec (
351 sqldb, "SELECT id from CREDENTIALS "
352 "where username=\"username1\";") == TRUE);
354 fail_unless (gsignond_db_sql_database_get_db_version (
355 sqldb, "PRAGMA user_version;") == 1);
357 error = gsignond_db_create_error(GSIGNOND_DB_ERROR_UNKNOWN,"Unknown error");
358 gsignond_db_sql_database_clear_last_error (sqldb);
359 fail_unless (gsignond_db_sql_database_get_last_error (sqldb) == NULL);
360 gsignond_db_sql_database_set_last_error (sqldb, error);
361 fail_unless (gsignond_db_sql_database_get_last_error (sqldb) != NULL);
362 gsignond_db_sql_database_clear_last_error (sqldb);
363 fail_unless (gsignond_db_sql_database_get_last_error (sqldb) == NULL);
365 fail_unless (gsignond_db_sql_database_exec (
366 sqldb, "INSERT INTO CREDENTIALS (id, username, password) "
367 "VALUES (4, \"username4\",\"password3\");") == TRUE);
368 fail_unless (gsignond_db_sql_database_get_last_insert_rowid (
371 fail_unless (gsignond_db_secret_database_remove_data (
372 database, id, method) == TRUE);
373 fail_unless (gsignond_db_sql_database_clear (sqldb) == TRUE);
374 fail_unless (gsignond_db_sql_database_close (sqldb) == TRUE);
375 g_object_unref(database);
379 START_TEST (test_secret_storage)
381 GSignondSecretStorage *storage = NULL;
382 GSignondConfig *config = NULL;
383 GSignondCredentials *creds = NULL;
384 guint32 id = 1, method = 2;
385 GHashTable *data = NULL;
386 GHashTable *data2 = NULL;
388 const gchar *dir = NULL;
390 config = gsignond_config_new ();
391 gsignond_config_set_string (config, GSIGNOND_CONFIG_GENERAL_SECURE_DIR, "/tmp/gsignond");
394 storage = g_object_new (GSIGNOND_TYPE_SECRET_STORAGE,
395 "config", config, NULL);
396 g_object_unref(config);
397 fail_if (storage == NULL);
399 dir = gsignond_config_get_string (config,
400 GSIGNOND_CONFIG_GENERAL_SECURE_DIR);
402 dir = g_get_user_data_dir ();
404 g_mkdir_with_parents (dir, S_IRWXU);
406 fail_unless (gsignond_secret_storage_get_last_error (storage) == NULL);
407 fail_unless (gsignond_secret_storage_clear_db (storage) == FALSE);
408 fail_unless (gsignond_secret_storage_is_open_db (storage) == FALSE);
409 fail_unless (gsignond_secret_storage_load_credentials (storage, 1) == NULL);
410 fail_unless (gsignond_secret_storage_update_credentials (
411 storage, NULL) == FALSE);
412 fail_unless (gsignond_secret_storage_remove_credentials (
413 storage, 1) == FALSE);
414 fail_unless (gsignond_secret_storage_load_data (
415 storage, 1, 2) == NULL);
416 fail_unless (gsignond_secret_storage_update_data (
417 storage, 1, 2, NULL) == FALSE);
418 fail_unless (gsignond_secret_storage_remove_data (
419 storage, 1, 2) == FALSE);
421 fail_unless (gsignond_secret_storage_open_db (storage) == TRUE);
422 /* don't open the db again if its already open */
423 fail_unless (gsignond_secret_storage_open_db (storage) == TRUE);
425 creds = gsignond_credentials_new ();
426 fail_if (creds == NULL);
428 fail_unless (gsignond_credentials_set_data (
429 creds, id, "user 1", "pass 1") == TRUE);
431 fail_unless (gsignond_secret_storage_update_credentials (
432 storage, creds) == TRUE);
433 g_object_unref (creds); creds = NULL;
435 creds = gsignond_secret_storage_load_credentials (storage, id);
436 fail_if (creds == NULL);
438 fail_unless (gsignond_secret_storage_check_credentials (
439 storage, creds) == TRUE);
441 gsignond_credentials_set_id (creds, 3);
442 fail_unless (gsignond_secret_storage_check_credentials (
443 storage, creds) == FALSE);
444 g_object_unref (creds);
446 /* remove the added credentials */
447 fail_unless (gsignond_secret_storage_remove_credentials (
448 storage, id) == TRUE);
450 /* add data to store */
451 data = g_hash_table_new_full ((GHashFunc)g_str_hash,
452 (GEqualFunc)g_str_equal,
453 (GDestroyNotify)NULL,
454 (GDestroyNotify)g_variant_unref);
455 fail_if (data == NULL);
457 g_hash_table_insert (data,"key1",g_variant_new_string ("string_value"));
458 g_hash_table_insert (data,"key2",g_variant_new_double (12223.4223));
459 g_hash_table_insert (data,"key3",g_variant_new_uint16(20));
460 g_hash_table_insert (data,"key4",g_variant_new("^ay", "byte_value"));
462 fail_unless (gsignond_secret_storage_update_data (
463 storage, id, method, data) == TRUE);
464 data2 = gsignond_secret_storage_load_data (storage, id, method);
465 fail_if (data2 == NULL);
468 g_hash_table_foreach (data2, (GHFunc)_compare_key_value, &input);
469 fail_if (input.status != 1);
471 gsignond_dictionary_unref(data2);
472 g_hash_table_unref(data);
474 fail_unless (gsignond_secret_storage_remove_data (
475 storage, id, method) == TRUE);
476 fail_unless (gsignond_secret_storage_clear_db (storage) == TRUE);
477 fail_unless (gsignond_secret_storage_close_db (storage) == TRUE);
478 g_object_unref(storage);
482 START_TEST (test_metadata_database)
484 GSignondConfig *config = NULL;
485 guint32 methodid = 0;
486 guint32 identity_id = 5;
487 const gchar *method1 = "method1";
488 GSignondIdentityInfo *identity = NULL, *identity2= NULL;
489 GSignondIdentityInfoList *identities = NULL;
490 GSignondSecurityContext *ctx1 = NULL;
491 GList *methods = NULL, *reflist = NULL;
492 GSignondSecurityContextList *acl;
493 GSignondSecurityContext *owner = NULL;
495 config = gsignond_config_new ();
496 gsignond_config_set_string (config, GSIGNOND_CONFIG_GENERAL_SECURE_DIR, "/tmp/gsignond");
497 GSignondDbMetadataDatabase* metadata_db = NULL;
498 metadata_db = gsignond_db_metadata_database_new (config);
499 g_object_unref(config);
500 fail_if (metadata_db == NULL);
502 ctx1 = gsignond_security_context_new_from_values ("sysctx1", "appctx1");
503 identity = _get_filled_identity_info_2 (&identity,
504 FALSE, FALSE, FALSE, FALSE, FALSE);
505 fail_unless (gsignond_db_metadata_database_insert_method (
506 metadata_db, method1, &methodid) == FALSE);
507 fail_unless (gsignond_db_metadata_database_get_method_id (
508 metadata_db, method1) == 0);
509 fail_unless (gsignond_db_metadata_database_get_methods (
510 metadata_db, identity_id, ctx1) == NULL);
511 fail_unless (gsignond_db_metadata_database_get_methods (
512 metadata_db, identity_id, ctx1) == NULL);
513 fail_unless (gsignond_db_metadata_database_update_identity (
514 metadata_db, identity) == FALSE);
515 fail_unless (gsignond_db_metadata_database_get_identity (
516 metadata_db, identity_id) == NULL);
517 fail_unless (gsignond_db_metadata_database_get_identities (
518 metadata_db, NULL) == NULL);
519 fail_unless (gsignond_db_metadata_database_remove_identity (
520 metadata_db, identity_id) == FALSE);
521 fail_unless (gsignond_db_metadata_database_remove_reference (
522 metadata_db, identity_id, ctx1, "reference1") == FALSE);
523 fail_unless (gsignond_db_metadata_database_get_references (
524 metadata_db, identity_id, ctx1) == NULL);
525 fail_unless (gsignond_db_metadata_database_get_accesscontrol_list (
526 metadata_db, identity_id) == NULL);
527 fail_unless (gsignond_db_metadata_database_get_owner (
528 metadata_db, identity_id) == NULL);
530 fail_unless (gsignond_db_metadata_database_open (metadata_db) == TRUE);
532 fail_unless (gsignond_db_metadata_database_open (metadata_db) == TRUE);
534 fail_unless (gsignond_db_sql_database_clear (
535 GSIGNOND_DB_SQL_DATABASE (metadata_db)) == TRUE);
537 fail_unless (gsignond_db_metadata_database_get_accesscontrol_list (
538 metadata_db, identity_id) == NULL);
540 fail_unless (gsignond_db_metadata_database_get_owner (
541 metadata_db, identity_id) == NULL);
543 fail_unless (gsignond_db_metadata_database_get_method_id (
544 metadata_db, method1) == 0);
545 fail_unless (gsignond_db_metadata_database_insert_method (
546 metadata_db, method1, &methodid) == TRUE);
548 fail_unless (methodid == gsignond_db_metadata_database_get_method_id (
549 metadata_db, method1));
552 identity = _get_filled_identity_info_2 (&identity,
553 TRUE, FALSE, FALSE, FALSE, FALSE);
554 fail_unless (gsignond_db_metadata_database_update_identity (
555 metadata_db, identity) == 0);
557 identity = _get_filled_identity_info_2 (&identity,
558 FALSE, TRUE, FALSE, FALSE, FALSE);
559 fail_unless (gsignond_db_metadata_database_update_identity (
560 metadata_db, identity) == 0);
562 identity = _get_filled_identity_info_2 (&identity,
563 FALSE, FALSE, TRUE, FALSE, FALSE);
564 fail_unless (gsignond_db_metadata_database_update_identity (
565 metadata_db, identity) == 0);
567 identity = _get_filled_identity_info_2 (&identity,
568 FALSE, FALSE, FALSE, TRUE, FALSE);
569 fail_unless (gsignond_db_metadata_database_update_identity (
570 metadata_db, identity) == 0);
572 identity = _get_filled_identity_info_2 (&identity,
573 FALSE, FALSE, FALSE, FALSE, TRUE);
574 identity_id = gsignond_db_metadata_database_update_identity (
575 metadata_db, identity);
576 fail_unless (identity_id != 0);
577 gsignond_identity_info_set_id (identity, identity_id);
579 identity2 = gsignond_db_metadata_database_get_identity (
580 metadata_db, identity_id);
581 fail_if (identity2 == NULL);
582 gsignond_identity_info_unref (identity2);
584 /*get_identity/identities*/
585 fail_unless (gsignond_db_metadata_database_get_identity (
586 metadata_db, 2222) == NULL);
588 identities = gsignond_db_metadata_database_get_identities (metadata_db, NULL);
589 fail_unless (identities != NULL);
590 fail_unless (g_list_length (identities) == 1);
591 gsignond_identity_info_list_free (identities);
594 methods = gsignond_db_metadata_database_get_methods (metadata_db,
596 fail_if (methods == NULL);
597 g_list_free_full (methods, g_free);
600 fail_unless (gsignond_db_metadata_database_get_references (
601 metadata_db, identity_id, ctx1) == NULL);
602 fail_unless (gsignond_db_metadata_database_remove_reference (
603 metadata_db, identity_id, ctx1, "reference1" ) == FALSE);
605 fail_unless (gsignond_db_metadata_database_insert_reference (
606 metadata_db, identity_id, ctx1, "reference1") == TRUE);
608 fail_unless (gsignond_db_metadata_database_insert_reference (
609 metadata_db, identity_id, ctx1, "reference1") == TRUE);
611 reflist = gsignond_db_metadata_database_get_references (
612 metadata_db, identity_id, ctx1);
613 fail_if (reflist == NULL);
614 fail_unless (g_list_length (reflist) == 1);
615 g_list_free_full (reflist, g_free);
617 fail_unless (gsignond_db_metadata_database_remove_reference (
618 metadata_db, identity_id, ctx1, "reference1" ) == TRUE);
619 gsignond_security_context_free (ctx1);
622 acl = gsignond_db_metadata_database_get_accesscontrol_list (metadata_db,
624 fail_if (acl == NULL);
625 gsignond_security_context_list_free (acl);
628 owner = gsignond_db_metadata_database_get_owner (metadata_db,
630 fail_if (owner == NULL);
632 fail_unless (gsignond_db_metadata_database_remove_identity (
633 metadata_db, identity_id) == TRUE);
634 fail_unless (gsignond_db_metadata_database_get_identities (
635 metadata_db, NULL) == NULL);
637 fail_unless (gsignond_db_metadata_database_get_methods (
638 metadata_db, identity_id, owner) == NULL);
640 gsignond_security_context_free (owner);
642 gsignond_identity_info_unref (identity);
644 fail_unless (gsignond_db_sql_database_close (
645 GSIGNOND_DB_SQL_DATABASE (metadata_db)) == TRUE);
646 g_object_unref(metadata_db);
650 START_TEST (test_credentials_database)
652 GSignondConfig *config = NULL;
653 guint32 identity_id = 5;
654 GSignondIdentityInfo *identity = NULL, *identity2= NULL;
655 GSignondIdentityInfoList *identities = NULL;
656 GSignondSecurityContext *ctx1 = NULL;
657 GList *methods = NULL, *reflist = NULL;
658 GSignondSecurityContextList *acl = NULL ;
659 GSignondSecurityContext *owner = NULL;
660 GSignondDbCredentialsDatabase *credentials_db = NULL;
661 GSignondSecretStorage *storage =NULL;
662 GHashTable *data = NULL;
663 GHashTable *data2 = NULL;
665 GSignondDictionary *cap_filter = NULL;
666 GSignondDictionary *type_filter = NULL;
667 GSignondDictionary *cap_type_filter = NULL;
668 GSignondDictionary *no_cap_filter = NULL;
670 config = gsignond_config_new ();
671 gsignond_config_set_string (config, GSIGNOND_CONFIG_GENERAL_SECURE_DIR, "/tmp/gsignond");
672 storage = g_object_new (GSIGNOND_TYPE_SECRET_STORAGE,
673 "config", config, NULL);
674 g_object_unref(config);
675 credentials_db = gsignond_db_credentials_database_new (
677 g_object_unref (storage);
678 fail_if (credentials_db == NULL);
680 fail_unless (gsignond_db_credentials_database_open_secret_storage (
681 credentials_db) == TRUE);
683 fail_unless (gsignond_db_credentials_database_clear (
684 credentials_db) == TRUE);
686 identity = _get_filled_identity_info ();
688 /*identity load/update*/
689 identity_id = gsignond_db_credentials_database_update_identity (
690 credentials_db, identity);
691 fail_unless (identity_id != 0);
692 gsignond_identity_info_set_id (identity, identity_id);
694 fail_unless (gsignond_db_credentials_database_load_identity (
695 credentials_db, 555, FALSE) == NULL);
696 identity2 = gsignond_db_credentials_database_load_identity (
697 credentials_db, identity_id, FALSE);
698 fail_if (identity2 == NULL);
699 gsignond_identity_info_unref (identity2);
701 identity2 = gsignond_db_credentials_database_load_identity (
702 credentials_db, identity_id, TRUE);
703 fail_if (identity2 == NULL);
705 fail_unless (g_strcmp0 (gsignond_identity_info_get_username (
706 identity2), "username1") == 0);
707 fail_unless (g_strcmp0 (gsignond_identity_info_get_secret (
708 identity2), "secret1") == 0);
709 gsignond_identity_info_unref (identity2);
711 fail_unless (gsignond_db_credentials_database_check_secret (
712 credentials_db, identity_id, "username2", "secret1") == FALSE);
714 fail_unless (gsignond_db_credentials_database_check_secret (
715 credentials_db, identity_id, "username1", "secret2") == FALSE);
717 fail_unless (gsignond_db_credentials_database_check_secret (
718 credentials_db, 0, "username1", "secret2") == FALSE);
720 fail_unless (gsignond_db_credentials_database_check_secret (
721 credentials_db, identity_id, "username1", "secret1") == TRUE);
723 ctx1 = gsignond_security_context_new_from_values ("sysctx1", "appctx1");
724 methods = gsignond_db_credentials_database_get_methods (credentials_db,
726 fail_if (methods == NULL);
727 g_list_free_full (methods, g_free);
729 /* add data to store */
730 data = g_hash_table_new_full ((GHashFunc)g_str_hash,
731 (GEqualFunc)g_str_equal,
732 (GDestroyNotify)NULL,
733 (GDestroyNotify)g_variant_unref);
734 g_hash_table_insert (data,"key1",g_variant_new_string ("string_value"));
735 g_hash_table_insert (data,"key2",g_variant_new_double (12223.4223));
736 g_hash_table_insert (data,"key3",g_variant_new_uint16(20));
737 g_hash_table_insert (data,"key4",g_variant_new("^ay", "byte_value"));
739 fail_unless (gsignond_db_credentials_database_update_data (
740 credentials_db, 0, "method1", data) == FALSE);
742 fail_unless (gsignond_db_credentials_database_update_data (
743 credentials_db, identity_id, "method1", data) == TRUE);
745 fail_unless (gsignond_db_credentials_database_update_data (
746 credentials_db, identity_id, "method1", data) == TRUE);
748 fail_unless (gsignond_db_credentials_database_load_data (
749 credentials_db, 0, "method1") == NULL);
750 fail_unless (gsignond_db_credentials_database_load_data (
751 credentials_db, identity_id, "method2") == NULL);
753 data2 = gsignond_db_credentials_database_load_data (credentials_db,
754 identity_id, "method1");
755 fail_if (data2 == NULL);
758 g_hash_table_foreach (data2, (GHFunc)_compare_key_value, &input);
759 fail_if (input.status != 1);
760 gsignond_dictionary_unref(data2);
761 g_hash_table_unref(data);
763 fail_unless (gsignond_db_credentials_database_remove_data (
764 credentials_db, 0, "method1") == FALSE);
766 fail_unless (gsignond_db_credentials_database_remove_data (
767 credentials_db, identity_id, "method1") == TRUE);
770 fail_unless (gsignond_db_credentials_database_insert_reference (
771 credentials_db, identity_id, ctx1, "reference1") == TRUE);
773 reflist = gsignond_db_credentials_database_get_references (credentials_db,
775 fail_if (reflist == NULL);
776 fail_unless (g_list_length (reflist) == 1);
777 g_list_free_full (reflist, g_free);
779 fail_unless (gsignond_db_credentials_database_remove_reference (
780 credentials_db, identity_id, ctx1, "reference2") == FALSE);
782 fail_unless (gsignond_db_credentials_database_remove_reference (
783 credentials_db, identity_id, ctx1, "reference1") == TRUE);
784 gsignond_security_context_free (ctx1);
786 acl = gsignond_db_credentials_database_get_accesscontrol_list (
787 credentials_db, identity_id);
788 fail_if (acl == NULL);
789 gsignond_security_context_list_free (acl);
791 owner = gsignond_db_credentials_database_get_owner (
792 credentials_db, identity_id);
793 fail_if (owner == NULL);
794 gsignond_security_context_free (owner);
796 owner = gsignond_db_credentials_database_get_identity_owner (
797 credentials_db, identity_id);
798 fail_if (owner == NULL);
799 gsignond_security_context_free (owner);
801 /* load_identities : matched with caption and security context */
802 cap_filter = gsignond_dictionary_new ();
803 GSignondSecurityContext *ctx =
804 gsignond_security_context_new_from_values("sysctx1", "appctx1");
805 gsignond_dictionary_set_string (cap_filter, "Caption", "cap");
806 gsignond_dictionary_set(cap_filter, "Owner",
807 gsignond_security_context_to_variant(ctx));
808 gsignond_security_context_free (ctx);
809 identities = gsignond_db_credentials_database_load_identities (
810 credentials_db, cap_filter);
811 gsignond_dictionary_unref (cap_filter);
813 fail_if (identities == NULL);
814 fail_unless (g_list_length (identities) == 1);
815 gsignond_identity_info_list_free (identities);
817 /* load_identities: matched with type */
818 type_filter = gsignond_dictionary_new();
819 gsignond_dictionary_set_int32 (type_filter, "Type", 456);
820 identities = gsignond_db_credentials_database_load_identities (
821 credentials_db, type_filter);
822 gsignond_dictionary_unref (type_filter);
824 fail_if (identities == NULL);
825 fail_unless (g_list_length (identities) == 1);
826 gsignond_identity_info_list_free (identities);
828 /* load_identities: matched with type and caption */
829 cap_type_filter = gsignond_dictionary_new();
830 gsignond_dictionary_set_int32 (cap_type_filter, "Type", 456);
831 gsignond_dictionary_set_string (cap_type_filter, "Caption", "CAP");
832 identities = gsignond_db_credentials_database_load_identities (
833 credentials_db, cap_type_filter);
834 gsignond_dictionary_unref (cap_type_filter);
836 fail_if (identities == NULL);
837 fail_unless (g_list_length (identities) == 1);
838 gsignond_identity_info_list_free (identities);
840 /* Negative load_identities query */
841 no_cap_filter = gsignond_dictionary_new();
842 gsignond_dictionary_set_string (no_cap_filter, "Caption", "non_existing");
844 identities = gsignond_db_credentials_database_load_identities (
845 credentials_db, no_cap_filter);
846 gsignond_dictionary_unref (no_cap_filter);
847 fail_unless (identities == NULL);
849 fail_unless (gsignond_db_credentials_database_remove_identity (
850 credentials_db, identity_id) == TRUE);
851 gsignond_identity_info_unref (identity);
853 g_object_unref(credentials_db);
857 Suite* db_suite (void)
859 Suite *s = suite_create ("Database");
861 TCase *tc_core = tcase_create ("Tests");
863 tcase_add_test (tc_core, test_sql_database);
864 tcase_add_test (tc_core, test_secret_storage);
865 tcase_add_test (tc_core, test_metadata_database);
866 tcase_add_test (tc_core, test_credentials_database);
867 suite_add_tcase (s, tc_core);
875 #if !GLIB_CHECK_VERSION (2, 36, 0)
879 Suite *s = db_suite ();
880 SRunner *sr = srunner_create (s);
881 srunner_run_all (sr, CK_NORMAL);
882 number_failed = srunner_ntests_failed (sr);
884 return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;