diff options
author | Claudio Saavedra <csaavedra@igalia.com> | 2013-02-19 19:28:32 +0800 |
---|---|---|
committer | Claudio Saavedra <csaavedra@igalia.com> | 2013-03-05 14:15:30 +0800 |
commit | 44bece7cc9da469292c6565e7e33d5be6eed0be2 (patch) | |
tree | 5088c8425d0aaaaa6f6d1757b23a3f3557d68005 | |
parent | 63952a6fdfc4759188baabe82962bbbf9519c141 (diff) | |
download | gsoc2013-epiphany-44bece7cc9da469292c6565e7e33d5be6eed0be2.tar gsoc2013-epiphany-44bece7cc9da469292c6565e7e33d5be6eed0be2.tar.gz gsoc2013-epiphany-44bece7cc9da469292c6565e7e33d5be6eed0be2.tar.bz2 gsoc2013-epiphany-44bece7cc9da469292c6565e7e33d5be6eed0be2.tar.lz gsoc2013-epiphany-44bece7cc9da469292c6565e7e33d5be6eed0be2.tar.xz gsoc2013-epiphany-44bece7cc9da469292c6565e7e33d5be6eed0be2.tar.zst gsoc2013-epiphany-44bece7cc9da469292c6565e7e33d5be6eed0be2.zip |
ephy-embed-single: cache form data using libsecret
Not only migrate this to libsecret, but also cache the data from the
EPHY_FORM_PASSWORD_SCHEMA schema instead of using the
GKR-compatibility one. Since we haven't migrated yet the passwords
from GKR secrets to the new EPHY_FORM_PASSWORD_SCHEMA schema,
the cache will be empty for now.
https://bugzilla.gnome.org/show_bug.cgi?id=679918
-rw-r--r-- | embed/ephy-embed-single.c | 96 |
1 files changed, 36 insertions, 60 deletions
diff --git a/embed/ephy-embed-single.c b/embed/ephy-embed-single.c index 35e57b9de..a628aaeba 100644 --- a/embed/ephy-embed-single.c +++ b/embed/ephy-embed-single.c @@ -32,9 +32,9 @@ #include "ephy-request-about.h" #include "ephy-settings.h" #include "ephy-signal-accumulator.h" +#include "ephy-string.h" #include <glib/gi18n.h> -#include <gnome-keyring.h> #include <libsoup/soup.h> #ifdef HAVE_WEBKIT2 #include <webkit2/webkit2.h> @@ -81,76 +81,52 @@ form_auth_data_new (const char *form_username, } static void -get_attr_cb (GnomeKeyringResult result, - GnomeKeyringAttributeList *attributes, - EphyEmbedSingle *single) +store_form_data_cb (SecretService *service, GAsyncResult *result, EphyEmbedSingle *single) { - int i = 0; - GnomeKeyringAttribute *attribute; - char *server = NULL, *username = NULL; + GList *results, *p; + SecretItem *item; + GHashTable *attributes; + char *host, *form_username, *form_password, *username; - if (result != GNOME_KEYRING_RESULT_OK) - return; - - attribute = (GnomeKeyringAttribute*)attributes->data; - for (i = 0; i < attributes->len; i++) { - if (server && username) - break; - - if (attribute[i].type == GNOME_KEYRING_ATTRIBUTE_TYPE_STRING) { - if (g_str_equal (attribute[i].name, "server")) - server = g_strdup (attribute[i].value.string); - else if (g_str_equal (attribute[i].name, "user")) - username = g_strdup (attribute[i].value.string); - } - } + GError *error = NULL; - if (server && username && - g_strstr_len (server, -1, "form%5Fusername") && - g_strstr_len (server, -1, "form%5Fpassword")) { - /* This is a stored login/password from a form, cache the form - * names locally so we don't need to hit the keyring daemon all - * the time */ - const char *form_username, *form_password; - GHashTable *t; - SoupURI *uri = soup_uri_new (server); - t = soup_form_decode (uri->query); - form_username = g_hash_table_lookup (t, FORM_USERNAME_KEY); - form_password = g_hash_table_lookup (t, FORM_PASSWORD_KEY); - ephy_embed_single_add_form_auth (single, uri->host, form_username, form_password, username); - soup_uri_free (uri); - g_hash_table_destroy (t); + results = secret_service_search_finish (service, result, &error); + if (error != NULL) { + g_warning ("Error caching form data: %s", error->message); + g_error_free (error); + return; } - g_free (server); - g_free (username); -} + for (p = results; p; p = p->next) { + item = (SecretItem *)p->data; + attributes = secret_item_get_attributes (item); + host = ephy_string_get_host_name (g_hash_table_lookup (attributes, "uri")); + form_username = g_hash_table_lookup (attributes, FORM_USERNAME_KEY); + form_password = g_hash_table_lookup (attributes, FORM_PASSWORD_KEY); + username = g_hash_table_lookup (attributes, "username"); -static void -store_form_data_cb (GnomeKeyringResult result, GList *l, EphyEmbedSingle *single) -{ - GList *p; - - if (result != GNOME_KEYRING_RESULT_OK) - return; + ephy_embed_single_add_form_auth (single, host, form_username, form_password, username); - for (p = l; p; p = p->next) { - guint key_id = GPOINTER_TO_UINT (p->data); - gnome_keyring_item_get_attributes (GNOME_KEYRING_DEFAULT, - key_id, - (GnomeKeyringOperationGetAttributesCallback) get_attr_cb, - single, - NULL); + g_free (host); + g_hash_table_unref (attributes); } + g_list_free_full (results, (GDestroyNotify)g_object_unref); } static void -cache_keyring_form_data (EphyEmbedSingle *single) +cache_secret_form_data (EphyEmbedSingle *single) { - gnome_keyring_list_item_ids (GNOME_KEYRING_DEFAULT, - (GnomeKeyringOperationGetListCallback)store_form_data_cb, - single, - NULL); + GHashTable *attributes; + + attributes = secret_attributes_build (EPHY_FORM_PASSWORD_SCHEMA, NULL); + secret_service_search (NULL, + EPHY_FORM_PASSWORD_SCHEMA, + attributes, + SECRET_SEARCH_UNLOCK | SECRET_SEARCH_ALL, + NULL, + (GAsyncReadyCallback)store_form_data_cb, + single); + g_hash_table_unref (attributes); } static void @@ -214,7 +190,7 @@ ephy_embed_single_init (EphyEmbedSingle *single) g_str_equal, g_free, NULL); - cache_keyring_form_data (single); + cache_secret_form_data (single); } static void |