diff options
author | Stefan Walter <stefw@src.gnome.org> | 2007-07-23 15:06:32 +0000 |
---|---|---|
committer | Stefan Walter <stefw@src.gnome.org> | 2007-07-23 15:06:32 +0000 |
commit | 8887741753c4235473639b015be42dbc370d1cd6 (patch) | |
tree | 94146146bfd83e337e27154108577b69cfcd8f5a /keyrings | |
parent | 62dbd6fe4ff4db384d8e8774b8dc8aad3a0c5612 (diff) | |
download | gnome-keyring-8887741753c4235473639b015be42dbc370d1cd6.tar.gz |
Add support for automatically unlocking other keyrings when their password
* daemon/gnome-keyring-daemon.c:
* daemon/gnome-keyring-daemon-ops.c:
* keyrings/gkr-keyring.c:
* keyrings/gkr-keyring.h:
* keyrings/gkr-keyring-item.c:
* keyrings/gkr-keyring-item.h:
* keyrings/gkr-keyrings.c:
* keyrings/gkr-keyrings.h:
* library/gnome-keyring.c:
* library/gnome-keyring.h:
* library/gnome-keyring-utils.c:
* tests/Makefile.am:
* tests/unit-test-keyrings.c:
* tests/unit-test-login-prompt.c:
* ui/gkr-ask-request.c:
* ui/gkr-ask-requset.h:
* ui/gkr-ask-tool.c: Add support for automatically unlocking other
keyrings when their password is entered into the 'login' keyring.
Fixes bug #459069
svn path=/trunk/; revision=711
Diffstat (limited to 'keyrings')
-rw-r--r-- | keyrings/gkr-keyring-item.c | 66 | ||||
-rw-r--r-- | keyrings/gkr-keyring-item.h | 5 | ||||
-rw-r--r-- | keyrings/gkr-keyring.c | 22 | ||||
-rw-r--r-- | keyrings/gkr-keyring.h | 5 | ||||
-rw-r--r-- | keyrings/gkr-keyrings.c | 22 | ||||
-rw-r--r-- | keyrings/gkr-keyrings.h | 2 |
6 files changed, 114 insertions, 8 deletions
diff --git a/keyrings/gkr-keyring-item.c b/keyrings/gkr-keyring-item.c index 00dfbf3b..8b6a8c7b 100644 --- a/keyrings/gkr-keyring-item.c +++ b/keyrings/gkr-keyring-item.c @@ -23,13 +23,15 @@ #include "config.h" -#include <glib.h> - #include "gkr-keyring-item.h" #include "gkr-keyring.h" #include "library/gnome-keyring-memory.h" +#include <glib.h> + +#include <string.h> + enum { PROP_0, PROP_NAME @@ -146,3 +148,63 @@ gkr_keyring_item_create (GkrKeyring* keyring, GnomeKeyringItemType type) return item; } + +gboolean +gkr_keyring_item_match (GkrKeyringItem *item, GnomeKeyringItemType type, + GnomeKeyringAttributeList *attributes, gboolean match_all) +{ + int i, j; + GnomeKeyringAttribute *item_attribute; + GnomeKeyringAttribute *attribute; + gboolean found; + int attributes_matching; + + if ((item->type & GNOME_KEYRING_ITEM_TYPE_MASK) != (type & GNOME_KEYRING_ITEM_TYPE_MASK)) + return FALSE; + + attributes_matching = 0; + for (i = 0; i < attributes->len; i++) { + found = FALSE; + attribute = &g_array_index (attributes, + GnomeKeyringAttribute, + i); + for (j = 0; j < item->attributes->len; j++) { + item_attribute = &g_array_index (item->attributes, + GnomeKeyringAttribute, + j); + if (strcmp (attribute->name, item_attribute->name) == 0) { + found = TRUE; + attributes_matching++; + if (attribute->type != item_attribute->type) { + return FALSE; + } + switch (attribute->type) { + case GNOME_KEYRING_ATTRIBUTE_TYPE_STRING: + if ((attribute->value.string == NULL || item_attribute->value.string == NULL) && + attribute->value.string != item_attribute->value.string) { + return FALSE; + } + if (strcmp (attribute->value.string, item_attribute->value.string) != 0) { + return FALSE; + } + break; + case GNOME_KEYRING_ATTRIBUTE_TYPE_UINT32: + if (attribute->value.integer != item_attribute->value.integer) { + return FALSE; + } + break; + default: + g_assert_not_reached (); + } + } + } + if (!found) { + return FALSE; + } + } + if (match_all) { + return attributes_matching == attributes->len; + } + + return TRUE; +} diff --git a/keyrings/gkr-keyring-item.h b/keyrings/gkr-keyring-item.h index b6871441..876982f0 100644 --- a/keyrings/gkr-keyring-item.h +++ b/keyrings/gkr-keyring-item.h @@ -83,6 +83,11 @@ GkrKeyringItem* gkr_keyring_item_new (GkrKeyring* keyring, guint id, GkrKeyringItem* gkr_keyring_item_create (GkrKeyring* keyring, GnomeKeyringItemType type); +gboolean gkr_keyring_item_match (GkrKeyringItem *item, + GnomeKeyringItemType type, + GnomeKeyringAttributeList *attributes, + gboolean match_all); + G_END_DECLS #endif /* __GKR_KEYRING_ITEM_H__ */ diff --git a/keyrings/gkr-keyring.c b/keyrings/gkr-keyring.c index 6f25c718..9c89f0a9 100644 --- a/keyrings/gkr-keyring.c +++ b/keyrings/gkr-keyring.c @@ -515,7 +515,7 @@ remove_unavailable_item (gpointer key, gpointer dummy, GkrKeyring *keyring) g_assert (GKR_IS_KEYRING (keyring)); - item = gkr_keyring_find_item (keyring, id); + item = gkr_keyring_get_item (keyring, id); if (item) gkr_keyring_remove_item (keyring, item); } @@ -717,7 +717,7 @@ update_keyring_from_data (GkrKeyring *keyring, GkrBuffer *buffer) /* We've seen this id */ g_hash_table_remove (checks, GUINT_TO_POINTER (items[i].id)); - item = gkr_keyring_find_item (keyring, items[i].id); + item = gkr_keyring_get_item (keyring, items[i].id); if (item == NULL) { item = gkr_keyring_item_new (keyring, items[i].id, items[i].type); gkr_keyring_add_item (keyring, item); @@ -982,7 +982,7 @@ gkr_keyring_get_new_id (GkrKeyring *keyring) } GkrKeyringItem* -gkr_keyring_find_item (GkrKeyring *keyring, guint id) +gkr_keyring_get_item (GkrKeyring *keyring, guint id) { GkrKeyringItem *item; GList *l; @@ -996,6 +996,22 @@ gkr_keyring_find_item (GkrKeyring *keyring, guint id) return NULL; } +GkrKeyringItem* +gkr_keyring_find_item (GkrKeyring *keyring, GnomeKeyringItemType type, + GnomeKeyringAttributeList *attrs) +{ + GkrKeyringItem *item; + GList *l; + + for (l = keyring->items; l; l = g_list_next (l)) { + item = GKR_KEYRING_ITEM (l->data); + if (gkr_keyring_item_match (item, type, attrs, TRUE)) + return item; + } + + return NULL; +} + void gkr_keyring_add_item (GkrKeyring* keyring, GkrKeyringItem* item) { diff --git a/keyrings/gkr-keyring.h b/keyrings/gkr-keyring.h index afcd4be3..2aefcda2 100644 --- a/keyrings/gkr-keyring.h +++ b/keyrings/gkr-keyring.h @@ -88,7 +88,10 @@ GkrKeyring* gkr_keyring_create (const gchar* name, const gchar* guint gkr_keyring_get_new_id (GkrKeyring *keyring); -GkrKeyringItem* gkr_keyring_find_item (GkrKeyring *keyring, guint id); +GkrKeyringItem* gkr_keyring_get_item (GkrKeyring *keyring, guint id); + +GkrKeyringItem* gkr_keyring_find_item (GkrKeyring *keyring, GnomeKeyringItemType type, + GnomeKeyringAttributeList *attrs); void gkr_keyring_add_item (GkrKeyring* keyring, GkrKeyringItem* item); diff --git a/keyrings/gkr-keyrings.c b/keyrings/gkr-keyrings.c index f649ec59..baa461e9 100644 --- a/keyrings/gkr-keyrings.c +++ b/keyrings/gkr-keyrings.c @@ -105,6 +105,18 @@ update_default (void) g_free (path); g_free (dirname); + /* + * We prefer to make the 'login' keyring the default + * keyring when nothing else is setup. + */ + if (keyring == NULL) + keyring = gkr_keyrings_get_login (); + + /* + * Otherwise fall back to the 'default' keyring setup + * if PAM integration is borked, and the user had to + * create a new keyring. + */ if (keyring == NULL) keyring = gkr_keyrings_find ("default"); @@ -213,6 +225,12 @@ gkr_keyrings_set_default (GkrKeyring *keyring) default_keyring = keyring; } +GkrKeyring* +gkr_keyrings_get_login (void) +{ + return gkr_keyrings_find ("login"); +} + void gkr_keyrings_update (void) { @@ -273,7 +291,7 @@ gkr_keyrings_update (void) keyring = g_hash_table_lookup (checks, path); if (keyring == NULL) { /* Make a new blank keyring and add it */ - keyring = gkr_keyring_new (NULL, path); + keyring = gkr_keyring_new ("", path); gkr_keyrings_add (keyring); g_object_unref (keyring); } else { @@ -283,7 +301,7 @@ gkr_keyrings_update (void) /* Try and update/load it */ if (!gkr_keyring_update_from_disk (keyring, FALSE) || - keyring->keyring_name == NULL) { + !keyring->keyring_name || !keyring->keyring_name[0]) { gkr_keyrings_remove (keyring); } diff --git a/keyrings/gkr-keyrings.h b/keyrings/gkr-keyrings.h index 1f4bd487..685147c7 100644 --- a/keyrings/gkr-keyrings.h +++ b/keyrings/gkr-keyrings.h @@ -34,6 +34,8 @@ GkrKeyring* gkr_keyrings_get_default (void); void gkr_keyrings_set_default (GkrKeyring *keyring); +GkrKeyring* gkr_keyrings_get_login (void); + void gkr_keyrings_add (GkrKeyring *keyring); void gkr_keyrings_remove (GkrKeyring *keyring); |