summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorExalm <exalm7659@gmail.com>2017-11-05 12:38:27 +0500
committerMichael Catanzaro <mcatanzaro@igalia.com>2017-12-06 07:55:57 -0600
commit0fe4603036669127ad432eac338545c1d857a9ed (patch)
treecd8cc892aa0ed9c8522728d6950fd033ec83cc97
parent6e78119b555d436993c93b9987b5b98dca56a08f (diff)
downloadepiphany-wip/forms.tar.gz
web-extension: Save password in memory when handling form eventswip/forms
This allows to remember the password even if a website clears the password field immediately after submitting. https://bugzilla.gnome.org/show_bug.cgi?id=742573
-rw-r--r--embed/web-extension/ephy-embed-form-auth.c12
-rw-r--r--embed/web-extension/ephy-embed-form-auth.h4
-rw-r--r--embed/web-extension/ephy-web-extension.c51
3 files changed, 38 insertions, 29 deletions
diff --git a/embed/web-extension/ephy-embed-form-auth.c b/embed/web-extension/ephy-embed-form-auth.c
index dfd236d0f..dcd02a4f1 100644
--- a/embed/web-extension/ephy-embed-form-auth.c
+++ b/embed/web-extension/ephy-embed-form-auth.c
@@ -30,6 +30,7 @@ struct _EphyEmbedFormAuth {
WebKitDOMNode *username_node;
WebKitDOMNode *password_node;
char *username;
+ char *password;
gboolean password_updated;
};
@@ -43,6 +44,7 @@ ephy_embed_form_auth_finalize (GObject *object)
if (form_auth->uri)
soup_uri_free (form_auth->uri);
g_free (form_auth->username);
+ g_free (form_auth->password);
g_free (form_auth->target_origin);
g_clear_object (&form_auth->username_node);
g_clear_object (&form_auth->password_node);
@@ -68,7 +70,8 @@ ephy_embed_form_auth_new (WebKitWebPage *web_page,
const char *target_origin,
WebKitDOMNode *username_node,
WebKitDOMNode *password_node,
- const char *username)
+ const char *username,
+ const char *password)
{
EphyEmbedFormAuth *form_auth;
@@ -82,6 +85,7 @@ ephy_embed_form_auth_new (WebKitWebPage *web_page,
form_auth->username_node = username_node;
form_auth->password_node = password_node;
form_auth->username = g_strdup (username);
+ form_auth->password = g_strdup (password);
return form_auth;
}
@@ -122,6 +126,12 @@ ephy_embed_form_auth_get_username (EphyEmbedFormAuth *form_auth)
return form_auth->username;
}
+const char *
+ephy_embed_form_auth_get_password (EphyEmbedFormAuth *form_auth)
+{
+ return form_auth->password;
+}
+
gboolean
ephy_embed_form_auth_get_password_updated (EphyEmbedFormAuth *form_auth)
{
diff --git a/embed/web-extension/ephy-embed-form-auth.h b/embed/web-extension/ephy-embed-form-auth.h
index c3b7e6280..002bd2b60 100644
--- a/embed/web-extension/ephy-embed-form-auth.h
+++ b/embed/web-extension/ephy-embed-form-auth.h
@@ -34,13 +34,15 @@ EphyEmbedFormAuth *ephy_embed_form_auth_new (WebKitWebPage
const char *target_origin,
WebKitDOMNode *username_node,
WebKitDOMNode *password_node,
- const char *username);
+ const char *username,
+ const char *password);
WebKitDOMNode *ephy_embed_form_auth_get_username_node (EphyEmbedFormAuth *form_auth);
WebKitDOMNode *ephy_embed_form_auth_get_password_node (EphyEmbedFormAuth *form_auth);
const char *ephy_embed_form_auth_get_target_origin (EphyEmbedFormAuth *form_auth);
SoupURI *ephy_embed_form_auth_get_uri (EphyEmbedFormAuth *form_auth);
guint64 ephy_embed_form_auth_get_page_id (EphyEmbedFormAuth *form_auth);
const char *ephy_embed_form_auth_get_username (EphyEmbedFormAuth *form_auth);
+const char *ephy_embed_form_auth_get_password (EphyEmbedFormAuth *form_auth);
gboolean ephy_embed_form_auth_get_password_updated (EphyEmbedFormAuth *form_auth);
void ephy_embed_form_auth_set_password_updated (EphyEmbedFormAuth *form_auth,
gboolean password_updated);
diff --git a/embed/web-extension/ephy-web-extension.c b/embed/web-extension/ephy-web-extension.c
index 68b1d5cd6..925355d70 100644
--- a/embed/web-extension/ephy-web-extension.c
+++ b/embed/web-extension/ephy-web-extension.c
@@ -276,9 +276,9 @@ store_password (EphyEmbedFormAuth *form_auth)
char *uri_str;
char *origin;
char *username_field_name = NULL;
- char *username_field_value = NULL;
char *password_field_name = NULL;
- char *password_field_value = NULL;
+ const char *username = NULL;
+ const char *password = NULL;
const char *target_origin;
gboolean password_updated;
WebKitDOMNode *username_node;
@@ -287,15 +287,16 @@ store_password (EphyEmbedFormAuth *form_auth)
g_assert (extension->password_manager);
username_node = ephy_embed_form_auth_get_username_node (form_auth);
- if (username_node)
+ if (username_node) {
g_object_get (username_node,
"name", &username_field_name,
- "value", &username_field_value,
NULL);
+ username = ephy_embed_form_auth_get_username (form_auth);
+ }
g_object_get (ephy_embed_form_auth_get_password_node (form_auth),
"name", &password_field_name,
- "value", &password_field_value,
NULL);
+ password = ephy_embed_form_auth_get_password (form_auth);
uri = ephy_embed_form_auth_get_uri (form_auth);
uri_str = soup_uri_to_string (uri, FALSE);
@@ -305,8 +306,8 @@ store_password (EphyEmbedFormAuth *form_auth)
ephy_password_manager_save (extension->password_manager,
origin,
target_origin,
- username_field_value,
- password_field_value,
+ username,
+ password,
username_field_name,
password_field_name,
!password_updated);
@@ -314,9 +315,7 @@ store_password (EphyEmbedFormAuth *form_auth)
g_free (uri_str);
g_free (origin);
g_free (username_field_name);
- g_free (username_field_value);
g_free (password_field_name);
- g_free (password_field_value);
}
static void
@@ -391,7 +390,7 @@ should_store_cb (GList *records,
EphyPermission permission;
SoupURI *uri;
char *uri_string;
- char *password_field_value = NULL;
+ const char *password;
char *origin = NULL;
uri = ephy_embed_form_auth_get_uri (form_auth);
@@ -416,26 +415,20 @@ should_store_cb (GList *records,
if (permission == EPHY_PERMISSION_UNDECIDED && ephy_dot_dir_is_web_application ())
permission = EPHY_PERMISSION_PERMIT;
- g_object_get (ephy_embed_form_auth_get_password_node (form_auth),
- "value", &password_field_value, NULL);
- if (password_field_value == NULL || strlen (password_field_value) == 0)
+ password = ephy_embed_form_auth_get_username (form_auth);
+ if (password == NULL || strlen (password) == 0)
goto out;
if (records && records->data) {
EphyPasswordRecord *record = EPHY_PASSWORD_RECORD (records->data);
- WebKitDOMNode *username_node;
- char *username_field_value = NULL;
- const char *username = ephy_password_record_get_username (record);
- const char *password = ephy_password_record_get_password (record);
-
- username_node = ephy_embed_form_auth_get_username_node (form_auth);
- if (username_node)
- g_object_get (username_node, "value", &username_field_value, NULL);
+ const char *stored_username = ephy_password_record_get_username (record);
+ const char *stored_password = ephy_password_record_get_password (record);
+ const char *username = ephy_embed_form_auth_get_username (form_auth);
/* FIXME: We use only the first result, for now; We need to do
* something smarter here */
- if (g_strcmp0 (username, username_field_value) == 0 &&
- g_strcmp0 (password, password_field_value) == 0) {
+ if (g_strcmp0 (stored_username, username) == 0 &&
+ g_strcmp0 (stored_password, password) == 0) {
LOG ("User/password already stored. Not asking about storing.");
} else if (permission == EPHY_PERMISSION_PERMIT) {
LOG ("User/password not yet stored. Storing.");
@@ -447,7 +440,6 @@ should_store_cb (GList *records,
request_decision_on_storing (g_object_ref (form_auth));
}
- g_free (username_field_value);
} else {
LOG ("No result on query; asking whether we should store.");
ephy_embed_form_auth_set_password_updated (form_auth, FALSE);
@@ -455,8 +447,6 @@ should_store_cb (GList *records,
}
out:
- if (password_field_value)
- g_free (password_field_value);
if (origin != NULL)
g_free (origin);
g_free (uri_string);
@@ -477,6 +467,7 @@ on_form_submitted (WebKitWebPage *web_page,
char *username_field_name = NULL;
char *username_field_value = NULL;
char *password_field_name = NULL;
+ char *password_field_value = NULL;
char *uri_str;
char *origin;
char *form_action;
@@ -495,6 +486,9 @@ on_form_submitted (WebKitWebPage *web_page,
"value", &username_field_value,
NULL);
}
+ g_object_get (password_node,
+ "value", &password_field_value,
+ NULL);
form_action = webkit_dom_html_form_element_get_action (dom_form);
if (form_action == NULL)
@@ -506,7 +500,8 @@ on_form_submitted (WebKitWebPage *web_page,
target_origin,
username_node,
password_node,
- username_field_value);
+ username_field_value,
+ password_field_value);
uri = ephy_embed_form_auth_get_uri (form_auth);
soup_uri_set_query (uri, NULL);
@@ -531,6 +526,7 @@ on_form_submitted (WebKitWebPage *web_page,
g_free (username_field_name);
g_free (username_field_value);
g_free (password_field_name);
+ g_free (password_field_value);
g_free (uri_str);
g_free (origin);
@@ -1210,6 +1206,7 @@ web_page_form_controls_associated (WebKitWebPage *web_page,
target_origin,
username_node,
password_node,
+ NULL,
NULL);
/* Plug in the user autocomplete */