aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ephy-profile-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ephy-profile-utils.c')
-rw-r--r--lib/ephy-profile-utils.c211
1 files changed, 166 insertions, 45 deletions
diff --git a/lib/ephy-profile-utils.c b/lib/ephy-profile-utils.c
index 2c685e05f..5a8f1a33b 100644
--- a/lib/ephy-profile-utils.c
+++ b/lib/ephy-profile-utils.c
@@ -25,10 +25,27 @@
#include "ephy-debug.h"
#include "ephy-file-helpers.h"
+#include <glib/gi18n.h>
#include <libsoup/soup.h>
#define PROFILE_MIGRATION_FILE ".migrated"
+const SecretSchema*
+ephy_profile_get_form_password_schema (void)
+{
+ static const SecretSchema schema = {
+ "org.epiphany.FormPassword", SECRET_SCHEMA_NONE,
+ {
+ { URI_KEY, SECRET_SCHEMA_ATTRIBUTE_STRING },
+ { FORM_USERNAME_KEY, SECRET_SCHEMA_ATTRIBUTE_STRING },
+ { FORM_PASSWORD_KEY, SECRET_SCHEMA_ATTRIBUTE_STRING },
+ { USERNAME_KEY, SECRET_SCHEMA_ATTRIBUTE_STRING },
+ { "NULL", 0 },
+ }
+ };
+ return &schema;
+}
+
int
ephy_profile_utils_get_migration_version ()
{
@@ -89,17 +106,7 @@ ephy_profile_utils_set_migration_version (int version)
}
static void
-store_form_password_cb (GnomeKeyringResult result,
- guint32 id,
- gpointer data)
-{
- /* FIXME: should we do anything if the operation failed? */
-}
-
-static void
-normalize_and_prepare_uri (SoupURI *uri,
- const char *form_username,
- const char *form_password)
+normalize_and_prepare_uri (SoupURI *uri)
{
g_return_if_fail (uri != NULL);
@@ -110,26 +117,52 @@ normalize_and_prepare_uri (SoupURI *uri,
soup_uri_set_scheme (uri, SOUP_URI_SCHEME_HTTP);
soup_uri_set_path (uri, "/");
+}
- /* Store the form login and password names encoded in the
- * URL. A bit of an abuse of keyring, but oh well */
- soup_uri_set_query_from_fields (uri,
- FORM_USERNAME_KEY,
- form_username,
- FORM_PASSWORD_KEY,
- form_password,
+static GHashTable *
+ephy_profile_utils_get_attributes_table (const char *uri,
+ const char *field_username,
+ const char *field_password,
+ const char *username)
+{
+ return secret_attributes_build (EPHY_FORM_PASSWORD_SCHEMA,
+ URI_KEY, uri,
+ FORM_USERNAME_KEY, field_username,
+ FORM_PASSWORD_KEY, field_password,
+ username ? USERNAME_KEY : NULL, username,
NULL);
}
+static void
+store_form_password_cb (SecretService *service,
+ GAsyncResult *res,
+ GSimpleAsyncResult *async)
+{
+ GError *error = NULL;
+
+ secret_service_store_finish (service, res, &error);
+ if (error != NULL)
+ g_simple_async_result_take_error (async, error);
+
+ g_simple_async_result_complete (async);
+ g_object_unref (async);
+}
+
void
_ephy_profile_utils_store_form_auth_data (const char *uri,
const char *form_username,
const char *form_password,
const char *username,
- const char *password)
+ const char *password,
+ GAsyncReadyCallback callback,
+ gpointer userdata)
{
SoupURI *fake_uri;
char *fake_uri_str;
+ SecretValue *value;
+ GHashTable *attributes;
+ char *label;
+ GSimpleAsyncResult *res;
g_return_if_fail (uri);
g_return_if_fail (form_username);
@@ -138,38 +171,119 @@ _ephy_profile_utils_store_form_auth_data (const char *uri,
g_return_if_fail (password);
fake_uri = soup_uri_new (uri);
+
if (fake_uri == NULL)
return;
- normalize_and_prepare_uri (fake_uri, form_username, form_password);
- fake_uri_str = soup_uri_to_string (fake_uri, FALSE);
+ res = g_simple_async_result_new (NULL, callback, userdata,
+ _ephy_profile_utils_store_form_auth_data);
- gnome_keyring_set_network_password (NULL,
- username,
- NULL,
- fake_uri_str,
- NULL,
- fake_uri->scheme,
- NULL,
- fake_uri->port,
- password,
- (GnomeKeyringOperationGetIntCallback)store_form_password_cb,
- NULL,
- NULL);
+ normalize_and_prepare_uri (fake_uri);
+ fake_uri_str = soup_uri_to_string (fake_uri, FALSE);
+ value = secret_value_new (password, -1, "text/plain");
+ attributes = ephy_profile_utils_get_attributes_table (fake_uri_str, form_username,
+ form_password, username);
+ /* Translators: The first %s is the username and the second one is the
+ * hostname where this is happening. Example: gnome@gmail.com and
+ * mail.google.com.
+ */
+ label = g_strdup_printf (_("Password for %s in a form in %s"),
+ username, fake_uri_str);
+ secret_service_store (NULL, EPHY_FORM_PASSWORD_SCHEMA,
+ attributes, NULL, label, value,
+ NULL,
+ (GAsyncReadyCallback)store_form_password_cb,
+ g_object_ref (res));
+
+ g_free (label);
+ secret_value_unref (value);
+ g_hash_table_unref (attributes);
soup_uri_free (fake_uri);
g_free (fake_uri_str);
+ g_object_unref (res);
+}
+
+
+gboolean
+_ephy_profile_utils_store_form_auth_data_finish (GAsyncResult *result,
+ GError **error)
+{
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+ g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL, _ephy_profile_utils_store_form_auth_data), FALSE);
+
+ return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error);
+}
+
+typedef struct
+{
+ EphyQueryFormDataCallback callback;
+ gpointer data;
+ GDestroyNotify destroy_data;
+} EphyProfileQueryClosure;
+
+static void
+ephy_profile_query_closure_free (EphyProfileQueryClosure *closure)
+{
+ if (closure->destroy_data)
+ closure->destroy_data (closure->data);
+
+ g_slice_free (EphyProfileQueryClosure, closure);
+}
+
+static void
+search_form_data_cb (SecretService *service,
+ GAsyncResult *res,
+ EphyProfileQueryClosure *closure)
+{
+ GList *results;
+ SecretItem *item;
+ const char* username = NULL, *password = NULL;
+ SecretValue *value = NULL;
+ GHashTable *attributes = NULL;
+ GError *error = NULL;
+
+ results = secret_service_search_finish (service, res, &error);
+ if (error) {
+ g_warning ("Couldn't retrieve form data: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ if (!results)
+ goto out;
+
+ item = (SecretItem*)results->data;
+ attributes = secret_item_get_attributes (item);
+ username = g_hash_table_lookup (attributes, USERNAME_KEY);
+ value = secret_item_get_secret (item);
+ password = secret_value_get (value, NULL);
+
+ g_list_free_full (results, (GDestroyNotify)g_object_unref);
+
+out:
+ if (closure->callback)
+ closure->callback (username, password, closure->data);
+
+ if (value)
+ secret_value_unref (value);
+ if (attributes)
+ g_hash_table_unref (attributes);
+
+ ephy_profile_query_closure_free (closure);
}
void
_ephy_profile_utils_query_form_auth_data (const char *uri,
const char *form_username,
const char *form_password,
- GnomeKeyringOperationGetListCallback callback,
+ EphyQueryFormDataCallback callback,
gpointer data,
GDestroyNotify destroy_data)
{
SoupURI *key;
char *key_str;
+ EphyProfileQueryClosure *closure;
+ GHashTable *attributes;
g_return_if_fail (uri);
g_return_if_fail (form_username);
@@ -178,21 +292,28 @@ _ephy_profile_utils_query_form_auth_data (const char *uri,
key = soup_uri_new (uri);
g_return_if_fail (key);
- normalize_and_prepare_uri (key, form_username, form_password);
+ normalize_and_prepare_uri (key);
key_str = soup_uri_to_string (key, FALSE);
+ attributes = ephy_profile_utils_get_attributes_table (key_str, form_username,
+ form_password, NULL);
+
+ closure = g_slice_new0 (EphyProfileQueryClosure);
+ closure->callback = callback;
+ closure->data = data;
+ closure->destroy_data = destroy_data;
+
LOG ("Querying Keyring: %s", key_str);
- gnome_keyring_find_network_password (NULL,
- NULL,
- key_str,
- NULL,
- NULL,
- NULL,
- 0,
- callback,
- data,
- destroy_data);
+
+ secret_service_search (NULL,
+ EPHY_FORM_PASSWORD_SCHEMA,
+ attributes,
+ SECRET_SEARCH_UNLOCK | SECRET_SEARCH_LOAD_SECRETS,
+ NULL, (GAsyncReadyCallback)search_form_data_cb,
+ closure);
+
+ g_hash_table_unref (attributes);
soup_uri_free (key);
g_free (key_str);
}