1
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2
/* unit-test-secret-collection.c: Test the collection keyring
4
Copyright (C) 2009 Stefan Walter
6
The Gnome Keyring Library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Library General Public License as
8
published by the Free Software Foundation; either version 2 of the
9
License, or (at your option) any later version.
11
The Gnome Keyring Library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Library General Public License for more details.
16
You should have received a copy of the GNU Library General Public
17
License along with the Gnome Library; see the file COPYING.LIB. If not,
18
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
Boston, MA 02111-1307, USA.
21
Author: Stef Walter <stef@memberwebs.com>
26
#include "test-suite.h"
27
#include "test-secret-module.h"
29
#include "gkm-secret-collection.h"
30
#include "gkm-secret-fields.h"
31
#include "gkm-secret-item.h"
32
#include "gkm-secret-search.h"
34
#include "gkm/gkm-session.h"
35
#include "gkm/gkm-transaction.h"
37
#include "pkcs11/pkcs11i.h"
45
static GkmModule *module = NULL;
46
static GkmSession *session = NULL;
47
static GkmFactory *factory = NULL;
48
static GkmSecretCollection *collection = NULL;
49
static GkmSecretItem *item = NULL;
51
TESTING_SETUP(secret_search)
55
module = test_secret_module_initialize_and_enter ();
56
session = test_secret_module_open_session (TRUE);
57
factory = GKM_FACTORY_SECRET_SEARCH;
60
collection = g_object_new (GKM_TYPE_SECRET_COLLECTION,
62
"manager", gkm_session_get_manager (session),
63
"identifier", "test-collection",
67
item = gkm_secret_collection_new_item (collection, "test-item");
68
fields = gkm_secret_fields_new ();
69
gkm_secret_fields_add (fields, "name1", "value1");
70
gkm_secret_fields_add (fields, "name2", "value2");
71
gkm_secret_item_set_fields (item, fields);
72
g_hash_table_unref (fields);
74
gkm_object_expose (GKM_OBJECT (collection), TRUE);
77
TESTING_TEARDOWN(secret_search)
79
g_object_unref (collection);
81
test_secret_module_leave_and_finalize ();
86
TESTING_TEST(create_search_incomplete)
88
CK_ATTRIBUTE attrs[1];
89
GkmObject *object = NULL;
90
GkmTransaction *transaction = gkm_transaction_new ();
92
object = gkm_session_create_object_for_factory (session, factory, transaction, attrs, 0);
93
g_assert (gkm_transaction_complete_and_unref (transaction) == CKR_TEMPLATE_INCOMPLETE);
94
g_assert (object == NULL);
97
TESTING_TEST(create_search_bad_fields)
99
CK_ATTRIBUTE attrs[] = {
100
{ CKA_G_FIELDS, "bad-value", 9 },
103
GkmObject *object = NULL;
104
GkmTransaction *transaction = gkm_transaction_new ();
106
object = gkm_session_create_object_for_factory (session, factory, transaction, attrs, 1);
107
g_assert (gkm_transaction_complete_and_unref (transaction) == CKR_ATTRIBUTE_VALUE_INVALID);
108
g_assert (object == NULL);
111
TESTING_TEST(create_search)
113
CK_ATTRIBUTE attrs[] = {
114
{ CKA_G_FIELDS, "test\0value\0two\0value2", 22 },
117
const gchar *identifier;
118
GkmObject *object = NULL;
125
object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
126
g_assert (object != NULL);
127
g_assert (GKM_IS_SECRET_SEARCH (object));
129
if (!gkm_object_get_attribute_ulong (object, session, CKA_CLASS, &vulong))
130
g_assert_not_reached ();
131
g_assert (vulong == CKO_G_SEARCH);
133
if (!gkm_object_get_attribute_boolean (object, session, CKA_MODIFIABLE, &vbool))
134
g_assert_not_reached ();
135
g_assert (vbool == CK_TRUE);
137
vdata = gkm_object_get_attribute_data (object, session, CKA_G_FIELDS, &vsize);
139
g_assert (vsize == attrs[0].ulValueLen);
142
vdata = gkm_object_get_attribute_data (object, session, CKA_G_COLLECTION, &vsize);
144
g_assert (vsize == 0);
147
/* No objects matched */
148
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
150
g_assert (vsize == 0);
153
/* Get the fields object and check */
154
fields = gkm_secret_search_get_fields (GKM_SECRET_SEARCH (object));
156
g_assert_cmpstr (gkm_secret_fields_get (fields, "test"), ==, "value");
159
identifier = gkm_secret_search_get_collection_id (GKM_SECRET_SEARCH (object));
160
g_assert (identifier == NULL);
162
g_object_unref (object);
165
TESTING_TEST(create_search_and_match)
167
CK_ATTRIBUTE attrs[] = {
168
{ CKA_G_FIELDS, "name1\0value1\0name2\0value2", 26 },
171
GkmObject *object = NULL;
175
object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
176
g_assert (object != NULL);
177
g_assert (GKM_IS_SECRET_SEARCH (object));
179
/* One object matched */
180
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
182
g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
183
g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
186
g_object_unref (object);
189
TESTING_TEST(create_search_and_change_to_match)
191
CK_ATTRIBUTE attrs[] = {
192
{ CKA_G_FIELDS, "name1\0value1", 13 },
195
GkmObject *object = NULL;
200
/* Make it not match */
201
fields = gkm_secret_fields_new ();
202
gkm_secret_item_set_fields (item, fields);
203
g_hash_table_unref (fields);
205
object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
206
g_assert (object != NULL);
207
g_assert (GKM_IS_SECRET_SEARCH (object));
209
/* Nothing matched */
210
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
211
g_assert (vsize == 0);
215
fields = gkm_secret_fields_new ();
216
gkm_secret_fields_add (fields, "name1", "value1");
217
gkm_secret_fields_add (fields, "name2", "value2");
218
gkm_secret_item_set_fields (item, fields);
219
g_hash_table_unref (fields);
221
/* One object matched */
222
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
224
g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
225
g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
228
g_object_unref (object);
231
TESTING_TEST(create_search_and_change_to_not_match)
233
CK_ATTRIBUTE attrs[] = {
234
{ CKA_G_FIELDS, "name1\0value1", 13 },
237
GkmObject *object = NULL;
242
object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 1);
243
g_assert (object != NULL);
244
g_assert (GKM_IS_SECRET_SEARCH (object));
246
/* One object matched */
247
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
249
g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
250
g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
253
/* Make it not match */
254
fields = gkm_secret_fields_new ();
255
gkm_secret_item_set_fields (item, fields);
256
g_hash_table_unref (fields);
258
/* Nothing matched */
259
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
260
g_assert (vsize == 0);
263
g_object_unref (object);
266
TESTING_TEST(create_search_for_bad_collection)
268
CK_ATTRIBUTE attrs[] = {
269
{ CKA_G_FIELDS, "name1\0value1", 13 },
270
{ CKA_G_COLLECTION, "bad-collection", 14 },
273
GkmObject *object = NULL;
274
GkmTransaction *transaction = gkm_transaction_new ();
276
object = gkm_session_create_object_for_factory (session, factory, transaction, attrs, 2);
277
g_assert (gkm_transaction_complete_and_unref (transaction) == CKR_OK);
279
g_object_unref (object);
282
TESTING_TEST(create_search_for_collection)
284
CK_ATTRIBUTE attrs[] = {
285
{ CKA_G_FIELDS, "name1\0value1", 13 },
286
{ CKA_G_COLLECTION, "test-collection", 15 },
289
GkmObject *object = NULL;
293
object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 2);
294
g_assert (object != NULL);
295
g_assert (GKM_IS_SECRET_SEARCH (object));
297
/* Should have the collection set properly */
298
vdata = gkm_object_get_attribute_data (object, session, CKA_G_COLLECTION , &vsize);
300
g_assert (vsize == 15);
301
g_assert (memcmp (vdata, "test-collection", 15) == 0);
304
/* One object matched */
305
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
307
g_assert (vsize == sizeof (CK_OBJECT_HANDLE));
308
g_assert (*((CK_OBJECT_HANDLE_PTR)vdata) == gkm_object_get_handle (GKM_OBJECT (item)));
311
g_object_unref (object);
314
TESTING_TEST(create_search_for_collection_no_match)
316
CK_ATTRIBUTE attrs[] = {
317
{ CKA_G_FIELDS, "test\0value", 11 },
318
{ CKA_G_COLLECTION, "test-collection", 15 },
321
GkmObject *object = NULL;
322
GkmSecretCollection *ocoll;
323
GkmSecretItem *oitem;
328
ocoll = g_object_new (GKM_TYPE_SECRET_COLLECTION,
330
"manager", gkm_session_get_manager (session),
331
"identifier", "other-collection",
333
oitem = gkm_secret_collection_new_item (ocoll, "other-item");
334
gkm_object_expose (GKM_OBJECT (ocoll), TRUE);
336
/* Make it match, but remember, wrong collection*/
337
fields = gkm_secret_fields_new ();
338
gkm_secret_fields_add (fields, "test", "value");
339
gkm_secret_item_set_fields (oitem, fields);
340
g_hash_table_unref (fields);
342
object = gkm_session_create_object_for_factory (session, factory, NULL, attrs, 2);
343
g_assert (object != NULL);
344
g_assert (GKM_IS_SECRET_SEARCH (object));
346
/* No objects matched */
347
vdata = gkm_object_get_attribute_data (object, session, CKA_G_MATCHED, &vsize);
348
g_assert (vsize == 0);
351
g_object_unref (object);
352
g_object_unref (ocoll);