Merge lp:~mardy/signon-keyring-extension/libsecret into lp:signon-keyring-extension

Proposed by Alberto Mardegan
Status: Merged
Approved by: Ken VanDine
Approved revision: 30
Merged at revision: 30
Proposed branch: lp:~mardy/signon-keyring-extension/libsecret
Merge into: lp:signon-keyring-extension
Diff against target: 782 lines (+231/-322)
8 files modified
common-vars.pri (+1/-1)
debian/changelog (+7/-0)
debian/control (+1/-1)
src/secrets-storage.cpp (+70/-132)
src/secrets-storage.h (+0/-1)
src/src.pro (+3/-1)
tests/mocked-gnome-keyring.c (+148/-185)
tests/tests.pro (+1/-1)
To merge this branch: bzr merge lp:~mardy/signon-keyring-extension/libsecret
Reviewer Review Type Date Requested Status
Ken VanDine Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+171224@code.launchpad.net

Commit message

Migrate from libgnome-keyring to libsecret

Also tag a new upstream release.

Description of the change

Migrate from libgnome-keyring to libsecret

Also tag a new upstream release.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Ken VanDine (ken-vandine) wrote :

Excellent, looks much better than the gnome-keyring API. Tests pass and it works on the phone, ship it!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'common-vars.pri'
--- common-vars.pri 2013-06-03 15:28:51 +0000
+++ common-vars.pri 2013-06-25 07:19:28 +0000
@@ -14,7 +14,7 @@
14# Project version14# Project version
15# remember to update debian/* files if you changes this15# remember to update debian/* files if you changes this
16#-----------------------------------------------------------------------------16#-----------------------------------------------------------------------------
17PROJECT_VERSION = 0.5.117PROJECT_VERSION = 0.6
1818
19# End of File19# End of File
2020
2121
=== modified file 'debian/changelog'
--- debian/changelog 2013-06-05 18:49:03 +0000
+++ debian/changelog 2013-06-25 07:19:28 +0000
@@ -1,3 +1,10 @@
1signon-keyring-extension (0.6-0ubuntu1) UNRELEASED; urgency=low
2
3 * New upstream version
4 - migrate from libgnome-keyring to libsecret
5
6 -- Alberto Mardegan <alberto.mardegan@canonical.com> Tue, 25 Jun 2013 10:14:29 +0300
7
1signon-keyring-extension (0.5.1daily13.06.05.1-0ubuntu1) saucy; urgency=low8signon-keyring-extension (0.5.1daily13.06.05.1-0ubuntu1) saucy; urgency=low
29
3 [ Ken VanDine ]10 [ Ken VanDine ]
411
=== modified file 'debian/control'
--- debian/control 2013-06-03 15:28:51 +0000
+++ debian/control 2013-06-25 07:19:28 +0000
@@ -2,7 +2,7 @@
2Priority: optional2Priority: optional
3Maintainer: Ubuntu Desktop Team <ubuntu-desktop@lists.ubuntu.com>3Maintainer: Ubuntu Desktop Team <ubuntu-desktop@lists.ubuntu.com>
4Build-Depends: debhelper (>= 9),4Build-Depends: debhelper (>= 9),
5 libgnome-keyring-dev,5 libsecret-1-dev,
6 pkg-config,6 pkg-config,
7 qt5-default,7 qt5-default,
8 qt5-qmake,8 qt5-qmake,
99
=== modified file 'src/secrets-storage.cpp'
--- src/secrets-storage.cpp 2013-04-26 11:32:40 +0000
+++ src/secrets-storage.cpp 2013-06-25 07:19:28 +0000
@@ -25,10 +25,19 @@
25#include "secrets-storage.h"25#include "secrets-storage.h"
2626
27#include <QDataStream>27#include <QDataStream>
28#include <gnome-keyring.h>28#include <libsecret/secret.h>
2929
30using namespace SignOn;30using namespace SignOn;
3131
32static const SecretSchema signonSchema = {
33 "com.ubuntu.OnlineAccounts.Secrets", SECRET_SCHEMA_DONT_MATCH_NAME,
34 {
35 { "signon-type", SECRET_SCHEMA_ATTRIBUTE_INTEGER },
36 { "signon-id", SECRET_SCHEMA_ATTRIBUTE_INTEGER },
37 { "signon-method", SECRET_SCHEMA_ATTRIBUTE_INTEGER },
38 }
39};
40
32SecretsStorage::SecretsStorage(QObject *parent) :41SecretsStorage::SecretsStorage(QObject *parent) :
33 AbstractSecretsStorage(parent),42 AbstractSecretsStorage(parent),
34 m_keyringName()43 m_keyringName()
@@ -46,17 +55,7 @@
46 if (configuration.contains(QLatin1String("KeyringName"))) {55 if (configuration.contains(QLatin1String("KeyringName"))) {
47 m_keyringName = configuration.value(QLatin1String("KeyringName")).toByteArray();56 m_keyringName = configuration.value(QLatin1String("KeyringName")).toByteArray();
48 } else {57 } else {
49 GnomeKeyringResult ret;58 m_keyringName = QByteArray(SECRET_COLLECTION_DEFAULT);
50 gchar *name;
51
52 ret = gnome_keyring_get_default_keyring_sync(&name);
53 if (ret != GNOME_KEYRING_RESULT_OK) {
54 BLAME() << "Couldn't get default keyring name:" << ret;
55 return false;
56 }
57
58 m_keyringName = QByteArray(name);
59 g_free(name);
60 }59 }
61 TRACE() << "Using keyring:" << m_keyringName;60 TRACE() << "Using keyring:" << m_keyringName;
6261
@@ -157,39 +156,36 @@
157 quint32 method,156 quint32 method,
158 const QByteArray &secret)157 const QByteArray &secret)
159{158{
160 GnomeKeyringResult ret;
161 guint32 createdItemId;
162
163 TRACE() << "Storing secret:" << id <<159 TRACE() << "Storing secret:" << id <<
164 "type:" << type <<160 "type:" << type <<
165 "method:" << method;161 "method:" << method;
166162
167 GnomeKeyringAttributeList *attributes = gnome_keyring_attribute_list_new();
168 gnome_keyring_attribute_list_append_uint32(attributes, "signon-type", type);
169 gnome_keyring_attribute_list_append_uint32(attributes, "signon-id", id);
170 if (type == Data) {
171 gnome_keyring_attribute_list_append_uint32(attributes,
172 "signon-method", method);
173 }
174
175 QString displayName =163 QString displayName =
176 QString::fromLatin1("Ubuntu Web Account: id %1-%2").arg(id).arg(type);164 QString::fromLatin1("Ubuntu Web Account: id %1-%2").arg(id).arg(type);
177 QByteArray ba = displayName.toUtf8();165 QByteArray ba = displayName.toUtf8();
178166
179 ret = gnome_keyring_item_create_sync(keyring(),167 const gchar *signonMethod = (type == Data) ? "signon-method" : NULL;
180 GNOME_KEYRING_ITEM_GENERIC_SECRET,168
181 ba.constData(),169 gboolean ok;
182 attributes,170 GError *error = NULL;
183 secret.constData(),171 ok = secret_password_store_sync(&signonSchema,
184 TRUE,172 keyring(),
185 &createdItemId);173 ba.constData(),
186 gnome_keyring_attribute_list_free(attributes);174 secret.constData(),
187 if (ret != GNOME_KEYRING_RESULT_OK) {175 NULL,
188 TRACE() << "Got error from GNOME keyring:" << ret;176 &error,
177 "signon-type", type,
178 "signon-id", id,
179 signonMethod, method,
180 NULL);
181
182
183 if (!ok) {
184 TRACE() << "Got error from GNOME keyring:" << error->message;
185 g_error_free(error);
189 return false;186 return false;
190 }187 }
191188
192 Q_UNUSED(createdItemId);
193 return true;189 return true;
194}190}
195191
@@ -198,50 +194,29 @@
198 quint32 method,194 quint32 method,
199 QByteArray &secret)195 QByteArray &secret)
200{196{
201 GList *found = 0;
202 GnomeKeyringResult ret;
203
204 TRACE() << "id:" << id << "type:" << type << "method:" << method;197 TRACE() << "id:" << id << "type:" << type << "method:" << method;
205 GnomeKeyringAttributeList *attributes = gnome_keyring_attribute_list_new();198
206 gnome_keyring_attribute_list_append_uint32(attributes, "signon-type", type);199 const gchar *signonMethod = (type == Data) ? "signon-method" : NULL;
207 gnome_keyring_attribute_list_append_uint32(attributes, "signon-id", id);200
208 if (type == Data) {201 GError *error = NULL;
209 gnome_keyring_attribute_list_append_uint32(attributes, "signon-method",202 gchar *data = secret_password_lookup_sync(&signonSchema,
210 method);203 NULL,
211 }204 &error,
212205 "signon-type", type,
213 ret = gnome_keyring_find_items_sync(GNOME_KEYRING_ITEM_GENERIC_SECRET,206 "signon-id", id,
214 attributes,207 signonMethod, method,
215 &found);208 NULL);
216 gnome_keyring_attribute_list_free(attributes);209
217 if (ret != GNOME_KEYRING_RESULT_OK) {210 if (error != NULL) {
218 TRACE() << "Credentials loading failed:" << ret;211 TRACE() << "Credentials loading failed:" << error->message;
212 g_error_free(error);
219 return false;213 return false;
220 }214 }
221215
222 for (GList *list = found; list != 0; list = list->next) {216 secret = QByteArray(data);
223 GnomeKeyringFound *result = (GnomeKeyringFound *)list->data;217 g_free(data);
224218
225 if (!isActiveKeyring(result->keyring))219 return data != NULL;
226 continue;
227
228 GnomeKeyringItemInfo *info;
229 ret = gnome_keyring_item_get_info_sync(result->keyring,
230 result->item_id,
231 &info);
232 if (ret != GNOME_KEYRING_RESULT_OK) {
233 TRACE() << "Error loading credentials:" << ret;
234 break;
235 }
236
237 gchar *data = gnome_keyring_item_info_get_secret(info);
238 secret = QByteArray(data);
239 g_free(data);
240 gnome_keyring_item_info_free(info);
241 }
242 gnome_keyring_found_list_free(found);
243
244 return ret == GNOME_KEYRING_RESULT_OK;
245}220}
246221
247bool SecretsStorage::removeSecrets(SignonSecretType type,222bool SecretsStorage::removeSecrets(SignonSecretType type,
@@ -249,78 +224,41 @@
249 quint32 method,224 quint32 method,
250 QueryFields fields)225 QueryFields fields)
251{226{
252 GList *found = 0;227 GHashTable *attributes = g_hash_table_new(g_str_hash, g_str_equal);
253 GnomeKeyringResult ret;228 gchar id_str[16];
229 gchar method_str[16];
230 gchar type_str[16];
254231
255 GnomeKeyringAttributeList *attributes = gnome_keyring_attribute_list_new();
256 if (fields & IdField) {232 if (fields & IdField) {
257 gnome_keyring_attribute_list_append_uint32(attributes,233 snprintf(id_str, sizeof(id_str), "%d", id);
258 "signon-id", id);234 g_hash_table_insert(attributes, gpointer("signon-id"), id_str);
259 }235 }
260 if (fields & MethodField) {236 if (fields & MethodField) {
261 gnome_keyring_attribute_list_append_uint32(attributes,237 snprintf(method_str, sizeof(method_str), "%d", method);
262 "signon-method", method);238 g_hash_table_insert(attributes, gpointer("signon-method"), method_str);
263 }239 }
264 if (fields & TypeField) {240 if (fields & TypeField) {
265 gnome_keyring_attribute_list_append_uint32(attributes,241 snprintf(type_str, sizeof(type_str), "%d", type);
266 "signon-type", type);242 g_hash_table_insert(attributes, gpointer("signon-type"), type_str);
267 }243 }
268244
269 ret = gnome_keyring_find_items_sync(GNOME_KEYRING_ITEM_GENERIC_SECRET,245 GError *error = NULL;
270 attributes,246 secret_password_clearv_sync(&signonSchema,
271 &found);247 attributes,
272 if (ret != GNOME_KEYRING_RESULT_OK) {248 NULL,
273 if (ret == GNOME_KEYRING_RESULT_NO_MATCH) {249 &error);
274 return true;250 if (error != NULL) {
275 }251 TRACE() << "Credentials search failed:" << error->message;
276 TRACE() << "Credentials search failed:" << ret;252 g_error_free(error);
277 return false;253 return false;
278 }254 }
279255
280 for (GList *list = found; list != 0; list = list->next) {256 g_hash_table_unref(attributes);
281 GnomeKeyringFound *result = (GnomeKeyringFound *)list->data;257
282258 return true;
283 if (!isActiveKeyring(result->keyring))
284 continue;
285
286 ret = gnome_keyring_item_delete_sync(result->keyring, result->item_id);
287 if (ret != GNOME_KEYRING_RESULT_OK) {
288 TRACE() << "Error deleting credentials:" << ret;
289 break;
290 }
291 }
292 gnome_keyring_found_list_free(found);
293
294 return ret == GNOME_KEYRING_RESULT_OK;
295}259}
296260
297const char *SecretsStorage::keyring() const261const char *SecretsStorage::keyring() const
298{262{
299 return m_keyringName.isEmpty() ? 0 : m_keyringName.constData();263 return m_keyringName.isEmpty() ? 0 : m_keyringName.constData();
300}264}
301
302bool SecretsStorage::isActiveKeyring(const char *keyringName) const
303{
304 /* This method is needed not to apply the same hack in different parts of
305 * the code.
306 */
307 const gchar *activeKeyringName = keyring();
308 if (qstrcmp(keyringName, activeKeyringName) == 0)
309 return true;
310
311 /* Unfortunately GNOME keyring doesn't return the proper name of the
312 * default keyring (it returns NULL). This means that if the active
313 * keyring is the default keyring the above string comparison would fail.
314 * In other words, if the current keyring is NULL, we have no clue on what
315 * to return from this method.
316 * https://bugzilla.gnome.org/show_bug.cgi?id=664454
317 *
318 * If the current keyring is NULL, we just return true.
319 */
320 if (activeKeyringName == 0) {
321 return true;
322 } else {
323 return false;
324 }
325}
326
327265
=== modified file 'src/secrets-storage.h'
--- src/secrets-storage.h 2011-11-21 12:46:50 +0000
+++ src/secrets-storage.h 2013-06-25 07:19:28 +0000
@@ -82,7 +82,6 @@
82 quint32 method,82 quint32 method,
83 QueryFields fields);83 QueryFields fields);
84 const char *keyring() const;84 const char *keyring() const;
85 bool isActiveKeyring(const char *keyringName) const;
8685
87 QByteArray m_keyringName;86 QByteArray m_keyringName;
88};87};
8988
=== modified file 'src/src.pro'
--- src/src.pro 2011-11-18 17:06:13 +0000
+++ src/src.pro 2013-06-25 07:19:28 +0000
@@ -16,9 +16,11 @@
1616
17QMAKE_CXXFLAGS += -Wno-missing-field-initializers17QMAKE_CXXFLAGS += -Wno-missing-field-initializers
1818
19DEFINES += QT_NO_KEYWORDS
20
19PKGCONFIG += \21PKGCONFIG += \
20 SignOnExtension \22 SignOnExtension \
21 gnome-keyring-123 libsecret-1
2224
23# The following use of pkg-config + sed is a hack to workaround a qmake25# The following use of pkg-config + sed is a hack to workaround a qmake
24# limitation: the CFLAGS variable is not used with the moc compiler, so the26# limitation: the CFLAGS variable is not used with the moc compiler, so the
2527
=== modified file 'tests/mocked-gnome-keyring.c'
--- tests/mocked-gnome-keyring.c 2012-08-14 12:26:01 +0000
+++ tests/mocked-gnome-keyring.c 2013-06-25 07:19:28 +0000
@@ -21,18 +21,18 @@
21 */21 */
2222
23#include "mocked-gnome-keyring.h"23#include "mocked-gnome-keyring.h"
24#include <gnome-keyring.h>24#include <libsecret/secret.h>
2525
26#define DEFAULT_KEYRING "mock-keyring"26#define DEFAULT_KEYRING SECRET_COLLECTION_DEFAULT
2727
28static GHashTable *keyrings = NULL;28static GHashTable *keyrings = NULL;
29static guint32 last_item_id = 123;29static guint32 last_item_id = 123;
3030
31typedef struct {31typedef struct {
32 guint32 id;32 guint32 id;
33 GnomeKeyringItemType type;33 const SecretSchema *schema;
34 char *display_name;34 char *display_name;
35 GnomeKeyringAttributeList *attributes;35 GHashTable *attributes;
36 char *secret;36 char *secret;
37} MockedItem;37} MockedItem;
3838
@@ -40,55 +40,52 @@
40 GList *items;40 GList *items;
41} MockedKeyring;41} MockedKeyring;
4242
43static GHashTable *
44copy_g_hash_table(GHashTable *table)
45{
46 GHashTable *copy;
47 GHashTableIter iter;
48 gpointer key, value;
49
50 copy = g_hash_table_new_full(g_str_hash, g_str_equal,
51 g_free, g_free);
52 g_hash_table_iter_init(&iter, table);
53 while (g_hash_table_iter_next(&iter, &key, &value)) {
54 g_hash_table_insert(copy, g_strdup(key), g_strdup(value));
55 }
56
57 return copy;
58}
59
43static MockedItem *60static MockedItem *
44mocked_item_new(GnomeKeyringItemType type,61mocked_item_new(const SecretSchema *schema,
45 const char *display_name,62 const char *display_name,
46 GnomeKeyringAttributeList *attributes,63 GHashTable *attributes,
47 const char *secret)64 const char *secret)
48{65{
49 MockedItem *item = g_slice_new0(MockedItem);66 MockedItem *item = g_slice_new0(MockedItem);
50 item->id = last_item_id++;67 item->id = last_item_id++;
51 item->type = type;68 item->schema = schema;
52 item->display_name = g_strdup(display_name);69 item->display_name = g_strdup(display_name);
53 item->attributes = gnome_keyring_attribute_list_copy(attributes);70 item->attributes = copy_g_hash_table(attributes);
54 item->secret = g_strdup(secret);71 item->secret = g_strdup(secret);
55 return item;72 return item;
56}73}
5774
58static gboolean75static gboolean
59attributes_are_equal (GnomeKeyringAttribute *a1,
60 GnomeKeyringAttribute *a2)
61{
62 if (g_strcmp0(a1->name, a2->name) != 0) return FALSE;
63 if (a1->type != a2->type) return FALSE;
64 if (a1->type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING) {
65 return g_strcmp0(a1->value.string, a2->value.string) == 0;
66 } else {
67 return a1->value.integer == a2->value.integer;
68 }
69}
70
71static gboolean
72mocked_item_has_attributes(MockedItem *item,76mocked_item_has_attributes(MockedItem *item,
73 GnomeKeyringAttributeList *attributes)77 GHashTable *attributes)
74{78{
75 guint i, j;79 GHashTableIter iter;
7680 gpointer key, value;
77 for (i = 0; i < attributes->len; i++) {81
78 gboolean found = FALSE;82 g_hash_table_iter_init(&iter, attributes);
79 GnomeKeyringAttribute *required =83 while (g_hash_table_iter_next(&iter, &key, &value)) {
80 &g_array_index(attributes, GnomeKeyringAttribute, i);84 gpointer item_value;
8185
82 for (j = 0; j < item->attributes->len; j++) {86 item_value = g_hash_table_lookup(item->attributes, key);
83 GnomeKeyringAttribute *attribute =87 if (item_value == NULL || g_strcmp0(item_value, value) != 0)
84 &g_array_index(item->attributes, GnomeKeyringAttribute, j);88 return FALSE;
85 if (attributes_are_equal(attribute, required)) {
86 found = TRUE;
87 break;
88 }
89 }
90
91 if (!found) return FALSE;
92 }89 }
9390
94 return TRUE;91 return TRUE;
@@ -98,24 +95,11 @@
98mocked_item_free(MockedItem *item)95mocked_item_free(MockedItem *item)
99{96{
100 g_free(item->display_name);97 g_free(item->display_name);
101 gnome_keyring_attribute_list_free(item->attributes);98 g_hash_table_unref(item->attributes);
102 g_free(item->secret);99 g_free(item->secret);
103 g_slice_free(MockedItem, item);100 g_slice_free(MockedItem, item);
104}101}
105102
106static MockedItem *
107mocked_keyring_get_item(MockedKeyring *keyring, guint32 item_id)
108{
109 GList *list;
110
111 for (list = keyring->items; list != NULL; list = g_list_next(list)) {
112 MockedItem *item = list->data;
113 if (item->id == item_id) return item;
114 }
115
116 return NULL;
117}
118
119static MockedKeyring *103static MockedKeyring *
120mocked_keyring_new()104mocked_keyring_new()
121{105{
@@ -131,174 +115,153 @@
131 g_hash_table_insert(keyrings, TEST_KEYRING, mocked_keyring_new());115 g_hash_table_insert(keyrings, TEST_KEYRING, mocked_keyring_new());
132}116}
133117
134GnomeKeyringResult118GList *
135gnome_keyring_get_default_keyring_sync(char **keyring)119find_items(const SecretSchema *schema,
120 GHashTable *attributes)
136{121{
137 *keyring = g_strdup(DEFAULT_KEYRING);122 GHashTableIter iter;
138 return GNOME_KEYRING_RESULT_OK;123 const gchar *keyring_name;
124 MockedKeyring *keyring;
125 GList *results = NULL;
126
127 g_return_val_if_fail (attributes != NULL, NULL);
128
129 g_hash_table_iter_init(&iter, keyrings);
130 while (g_hash_table_iter_next(&iter,
131 (gpointer)&keyring_name,
132 (gpointer)&keyring)) {
133 GList *list;
134
135 for (list = keyring->items; list != NULL; list = g_list_next(list)) {
136 MockedItem *item = list->data;
137 if (item->schema != schema) continue;
138
139 if (!mocked_item_has_attributes(item, attributes)) continue;
140
141 results = g_list_prepend(results, item);
142 }
143 }
144
145 return results;
139}146}
140147
141GnomeKeyringResult148gboolean
142gnome_keyring_item_create_sync(const char *keyring,149secret_password_store_sync(const SecretSchema *schema,
143 GnomeKeyringItemType type,150 const gchar *collection,
144 const char *display_name,151 const gchar *display_name,
145 GnomeKeyringAttributeList *attributes,152 const gchar *secret,
146 const char *secret,153 G_GNUC_UNUSED GCancellable *cancellable,
147 gboolean update_if_exists,154 GError **error,
148 guint32 *item_id)155 ...)
149{156{
150 GList *list, *found = NULL;157 GList *found = NULL;
151 GnomeKeyringFound *existing_result = NULL;
152 MockedKeyring *mocked_keyring;158 MockedKeyring *mocked_keyring;
153159 GHashTable *attributes;
154 g_return_val_if_fail (keyring != NULL,160 gpointer existing_result;
155 GNOME_KEYRING_RESULT_BAD_ARGUMENTS);161 va_list va;
156 g_return_val_if_fail (type < GNOME_KEYRING_ITEM_LAST_TYPE,162
157 GNOME_KEYRING_RESULT_BAD_ARGUMENTS);163 g_return_val_if_fail (schema != NULL, FALSE);
158164 g_return_val_if_fail (collection != NULL, FALSE);
159 mocked_keyring = g_hash_table_lookup (keyrings, keyring);165
160 if (G_UNLIKELY (mocked_keyring == NULL))166 g_debug("%s, collection %s", G_STRFUNC, collection);
161 return GNOME_KEYRING_RESULT_NO_SUCH_KEYRING;167 mocked_keyring = g_hash_table_lookup (keyrings, collection);
162168 if (G_UNLIKELY (mocked_keyring == NULL)) {
163 gnome_keyring_find_items_sync(type, attributes, &found);169 g_set_error_literal(error, G_DBUS_ERROR, G_DBUS_ERROR_BAD_ADDRESS,
164 for (list = found; list != NULL; list = g_list_next(list)) {170 "No such keyring");
165 GnomeKeyringFound *result = list->data;171 return FALSE;
166 if (g_strcmp0(result->keyring, keyring) == 0) {
167 existing_result = result;
168 break;
169 }
170 }172 }
171 gnome_keyring_found_list_free(found);173
174 va_start (va, error);
175 attributes = secret_attributes_buildv (schema, va);
176 va_end (va);
177
178 found = find_items(schema, attributes);
179 existing_result = (found != NULL) ? found->data : NULL;
180 g_list_free(found);
172181
173 if (existing_result != NULL) {182 if (existing_result != NULL) {
174 if (!update_if_exists) return GNOME_KEYRING_RESULT_ALREADY_EXISTS;
175
176 /* Update the existing item */183 /* Update the existing item */
177 MockedItem *item = mocked_keyring_get_item(mocked_keyring,184 MockedItem *item = existing_result;
178 existing_result->item_id);
179 g_assert(item != NULL);
180185
181 g_free(item->display_name);186 g_free(item->display_name);
182 item->display_name = g_strdup(display_name);187 item->display_name = g_strdup(display_name);
183188
184 g_free(item->secret);189 g_free(item->secret);
185 item->secret = g_strdup(secret);190 item->secret = g_strdup(secret);
186
187 if (item_id != NULL)
188 *item_id = item->id;
189 } else {191 } else {
190 MockedItem *item =192 MockedItem *item =
191 mocked_item_new(type, display_name, attributes, secret);193 mocked_item_new(schema, display_name, attributes, secret);
192 if (item_id != NULL)
193 *item_id = item->id;
194194
195 mocked_keyring->items = g_list_prepend(mocked_keyring->items,195 mocked_keyring->items = g_list_prepend(mocked_keyring->items,
196 item);196 item);
197 }197 }
198 return GNOME_KEYRING_RESULT_OK;198
199}199 g_hash_table_unref(attributes);
200200 return TRUE;
201GnomeKeyringResult201}
202gnome_keyring_find_items_sync(GnomeKeyringItemType type,202
203 GnomeKeyringAttributeList *attributes,203gchar *
204 GList **found)204secret_password_lookup_sync(const SecretSchema *schema,
205 G_GNUC_UNUSED GCancellable *cancellable,
206 GError **error,
207 ...)
208{
209 MockedItem *item;
210 GHashTable *attributes;
211 GList *found;
212 va_list va;
213
214 g_return_val_if_fail (schema != NULL, FALSE);
215 g_debug("%s", G_STRFUNC);
216
217 va_start (va, error);
218 attributes = secret_attributes_buildv (schema, va);
219 va_end (va);
220
221 found = find_items(schema, attributes);
222 item = (found != NULL) ? found->data : NULL;
223 g_list_free(found);
224
225 if (item) {
226 g_debug("Found: %s", item->secret);
227 } else {
228 g_debug("Item not found");
229 }
230 return item ? g_strdup(item->secret) : NULL;
231}
232
233gboolean
234secret_password_clearv_sync(const SecretSchema* schema,
235 GHashTable *attributes,
236 G_GNUC_UNUSED GCancellable *cancellable,
237 G_GNUC_UNUSED GError **error)
205{238{
206 GHashTableIter iter;239 GHashTableIter iter;
207 const gchar *keyring_name;240 const gchar *keyring_name;
208 MockedKeyring *keyring;241 MockedKeyring *keyring;
209 GList *results = NULL;242 gboolean found = FALSE;
210243
211 g_return_val_if_fail (type < GNOME_KEYRING_ITEM_LAST_TYPE,244 g_return_val_if_fail (schema != NULL, FALSE);
212 GNOME_KEYRING_RESULT_BAD_ARGUMENTS);245 g_debug("%s", G_STRFUNC);
213246
214 g_hash_table_iter_init(&iter, keyrings);247 g_hash_table_iter_init(&iter, keyrings);
215 while (g_hash_table_iter_next(&iter,248 while (g_hash_table_iter_next(&iter,
216 (gpointer)&keyring_name,249 (gpointer)&keyring_name,
217 (gpointer)&keyring)) {250 (gpointer)&keyring)) {
218 GList *list;251 GList *list, *next;
219252
220 for (list = keyring->items; list != NULL; list = g_list_next(list)) {253 for (list = keyring->items; list != NULL; list = next) {
221 GnomeKeyringFound *found;
222 MockedItem *item = list->data;254 MockedItem *item = list->data;
223 if (item->type != type) continue;255 next = g_list_next(list);
256 if (item->schema != schema) continue;
224257
225 if (!mocked_item_has_attributes(item, attributes)) continue;258 if (!mocked_item_has_attributes(item, attributes)) continue;
226259
227 found = g_slice_new0(GnomeKeyringFound);260 g_debug("Found item!");
228 found->keyring = g_strdup(keyring_name);261 mocked_item_free(item);
229 found->item_id = item->id;262 keyring->items = g_list_delete_link(keyring->items, list);
230 found->attributes =263 found = TRUE;
231 gnome_keyring_attribute_list_copy(item->attributes);
232 found->secret = g_strdup(item->secret);
233 results = g_list_prepend(results, found);
234 }264 }
235 }265 }
236266 return found;
237 *found = results;
238 return results != NULL ?
239 GNOME_KEYRING_RESULT_OK : GNOME_KEYRING_RESULT_NO_MATCH;
240}
241
242void
243gnome_keyring_found_free(GnomeKeyringFound *found)
244{
245 g_free(found->keyring);
246 gnome_keyring_attribute_list_free(found->attributes);
247 g_free(found->secret);
248 g_slice_free(GnomeKeyringFound, found);
249}
250
251GnomeKeyringResult
252gnome_keyring_item_get_info_sync(const char *keyring,
253 guint32 id,
254 GnomeKeyringItemInfo **info)
255{
256 GnomeKeyringItemInfo *result;
257 MockedKeyring *mocked_keyring;
258 MockedItem *item;
259
260 g_return_val_if_fail (keyring != NULL,
261 GNOME_KEYRING_RESULT_BAD_ARGUMENTS);
262
263 mocked_keyring = g_hash_table_lookup (keyrings, keyring);
264 if (G_UNLIKELY (mocked_keyring == NULL))
265 return GNOME_KEYRING_RESULT_NO_SUCH_KEYRING;
266
267 item = mocked_keyring_get_item(mocked_keyring, id);
268 if (item == NULL) return GNOME_KEYRING_RESULT_NO_MATCH;
269
270 result = gnome_keyring_item_info_new();
271 gnome_keyring_item_info_set_type(result, item->type);
272 gnome_keyring_item_info_set_display_name(result, item->display_name);
273 gnome_keyring_item_info_set_secret(result, item->secret);
274 *info = result;
275 return GNOME_KEYRING_RESULT_OK;
276}
277
278GnomeKeyringResult
279gnome_keyring_item_delete_sync(const char *keyring,
280 guint32 item_id)
281{
282 MockedKeyring *mocked_keyring;
283 MockedItem *item;
284 GList *list;
285
286 g_return_val_if_fail (keyring != NULL,
287 GNOME_KEYRING_RESULT_BAD_ARGUMENTS);
288
289 mocked_keyring = g_hash_table_lookup (keyrings, keyring);
290 if (G_UNLIKELY (mocked_keyring == NULL))
291 return GNOME_KEYRING_RESULT_NO_SUCH_KEYRING;
292
293 for (list = mocked_keyring->items;
294 list != NULL;
295 list = g_list_next(list)) {
296 item = list->data;
297 if (item->id == item_id) break;
298 }
299
300 if (list == NULL) return GNOME_KEYRING_RESULT_NO_MATCH;
301 mocked_item_free(item);
302 mocked_keyring->items = g_list_delete_link(mocked_keyring->items, list);
303 return GNOME_KEYRING_RESULT_OK;
304}267}
305268
=== modified file 'tests/tests.pro'
--- tests/tests.pro 2012-12-05 16:16:14 +0000
+++ tests/tests.pro 2013-06-25 07:19:28 +0000
@@ -15,7 +15,7 @@
1515
16PKGCONFIG += \16PKGCONFIG += \
17 SignOnExtension \17 SignOnExtension \
18 gnome-keyring-118 libsecret-1
1919
20HEADERS = \20HEADERS = \
21 keyring-test.h21 keyring-test.h

Subscribers

People subscribed via source and target branches