summaryrefslogtreecommitdiff
path: root/keyrings
diff options
context:
space:
mode:
authorStefan Walter <stefw@src.gnome.org>2007-07-23 15:06:32 +0000
committerStefan Walter <stefw@src.gnome.org>2007-07-23 15:06:32 +0000
commit8887741753c4235473639b015be42dbc370d1cd6 (patch)
tree94146146bfd83e337e27154108577b69cfcd8f5a /keyrings
parent62dbd6fe4ff4db384d8e8774b8dc8aad3a0c5612 (diff)
downloadgnome-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.c66
-rw-r--r--keyrings/gkr-keyring-item.h5
-rw-r--r--keyrings/gkr-keyring.c22
-rw-r--r--keyrings/gkr-keyring.h5
-rw-r--r--keyrings/gkr-keyrings.c22
-rw-r--r--keyrings/gkr-keyrings.h2
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);