diff options
author | Exalm <exalm7659@gmail.com> | 2017-11-05 12:38:27 +0500 |
---|---|---|
committer | Michael Catanzaro <mcatanzaro@igalia.com> | 2017-12-06 07:55:57 -0600 |
commit | 0fe4603036669127ad432eac338545c1d857a9ed (patch) | |
tree | cd8cc892aa0ed9c8522728d6950fd033ec83cc97 | |
parent | 6e78119b555d436993c93b9987b5b98dca56a08f (diff) | |
download | epiphany-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.c | 12 | ||||
-rw-r--r-- | embed/web-extension/ephy-embed-form-auth.h | 4 | ||||
-rw-r--r-- | embed/web-extension/ephy-web-extension.c | 51 |
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 */ |