Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5614)

Unified Diff: chrome/browser/password_manager/native_backend_gnome_x.cc

Issue 245563005: Passwords PSL Matching on Gnome: overwrite realm and origin (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comment about AddLogin added Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/password_manager/native_backend_gnome_x_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/password_manager/native_backend_gnome_x.cc
diff --git a/chrome/browser/password_manager/native_backend_gnome_x.cc b/chrome/browser/password_manager/native_backend_gnome_x.cc
index 83522a434e6f2eb16a13d70b030c13eb03c57ffd..02339183aba8699ff6d4a6981a4973b965b75cbc 100644
--- a/chrome/browser/password_manager/native_backend_gnome_x.cc
+++ b/chrome/browser/password_manager/native_backend_gnome_x.cc
@@ -143,11 +143,14 @@ scoped_ptr<PasswordForm> FormFromAttributes(GnomeKeyringAttributeList* attrs) {
// Parse all the results from the given GList into a PasswordFormList, and free
// the GList. PasswordForms are allocated on the heap, and should be deleted by
-// the consumer. If not empty, |filter_by_signon_realm| is used to filter out
-// results -- only credentials with signon realms passing the PSL matching
-// (done by |helper|) against |filter_by_signon_realm| will be kept.
+// the consumer. If not NULL, |lookup_form| is used to filter out results --
+// only credentials with signon realms passing the PSL matching (done by
+// |helper|) against |lookup_form->signon_realm| will be kept. PSL matched
+// results get their signon_realm, origin, and action rewritten to those of
+// |lookup_form_|, with the original signon_realm saved into the result's
+// original_signon_realm data member.
void ConvertFormList(GList* found,
- const std::string& filter_by_signon_realm,
+ const PasswordForm* lookup_form,
const PSLMatchingHelper& helper,
NativeBackendGnome::PasswordFormList* forms) {
PSLMatchingHelper::PSLDomainMatchMetric psl_domain_match_metric =
@@ -159,15 +162,17 @@ void ConvertFormList(GList* found,
scoped_ptr<PasswordForm> form(FormFromAttributes(attrs));
if (form) {
- if (!filter_by_signon_realm.empty() &&
- form->signon_realm != filter_by_signon_realm) {
+ if (lookup_form && form->signon_realm != lookup_form->signon_realm) {
// This is not an exact match, we try PSL matching.
if (!(PSLMatchingHelper::IsPublicSuffixDomainMatch(
- filter_by_signon_realm, form->signon_realm))) {
+ lookup_form->signon_realm, form->signon_realm))) {
continue;
}
psl_domain_match_metric = PSLMatchingHelper::PSL_DOMAIN_MATCH_FOUND;
form->original_signon_realm = form->signon_realm;
+ form->signon_realm = lookup_form->signon_realm;
+ form->origin = lookup_form->origin;
+ form->action = lookup_form->action;
}
if (data->secret) {
form->password_value = UTF8ToUTF16(data->secret);
@@ -179,7 +184,7 @@ void ConvertFormList(GList* found,
LOG(WARNING) << "Could not initialize PasswordForm from attributes!";
}
}
- if (!filter_by_signon_realm.empty()) {
+ if (lookup_form) {
UMA_HISTOGRAM_ENUMERATION(
"PasswordManager.PslDomainMatchTriggering",
helper.IsMatchingEnabled()
@@ -287,11 +292,14 @@ class GKRMethod : public GnomeKeyringLoader {
base::WaitableEvent event_;
GnomeKeyringResult result_;
NativeBackendGnome::PasswordFormList forms_;
- // Two additional arguments to OnOperationGetList:
- // If the credential search is related to a particular form,
- // |original_signon_realm_| contains the signon realm of that form. It is used
- // to filter the relevant results out of all the found ones.
- std::string original_signon_realm_;
+ // If the credential search is specified by a single form and needs to use PSL
+ // matching, then the specifying form is stored in |lookup_form_|. If PSL
+ // matching is used to find a result, then the results signon realm, origin
+ // and action are stored are replaced by those of |lookup_form_|.
+ // Additionally, |lookup_form_->signon_realm| is also used to narrow down the
+ // found logins to those which indeed PSL-match the look-up. And finally,
+ // |lookup_form_| set to NULL means that PSL matching is not required.
+ scoped_ptr<PasswordForm> lookup_form_;
const PSLMatchingHelper helper_;
};
@@ -331,7 +339,7 @@ void GKRMethod::AddLogin(const PasswordForm& form, const char* app_string) {
void GKRMethod::AddLoginSearch(const PasswordForm& form,
const char* app_string) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- original_signon_realm_ = form.signon_realm;
+ lookup_form_.reset(NULL);
// Search GNOME Keyring for matching passwords to update.
ScopedAttributeList attrs(gnome_keyring_attribute_list_new());
AppendString(&attrs, "origin_url", form.origin.spec());
@@ -351,7 +359,7 @@ void GKRMethod::AddLoginSearch(const PasswordForm& form,
void GKRMethod::UpdateLoginSearch(const PasswordForm& form,
const char* app_string) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- original_signon_realm_ = form.signon_realm;
+ lookup_form_.reset(NULL);
// Search GNOME Keyring for matching passwords to update.
ScopedAttributeList attrs(gnome_keyring_attribute_list_new());
AppendString(&attrs, "origin_url", form.origin.spec());
@@ -388,7 +396,7 @@ void GKRMethod::RemoveLogin(const PasswordForm& form, const char* app_string) {
void GKRMethod::GetLogins(const PasswordForm& form, const char* app_string) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- original_signon_realm_ = form.signon_realm;
+ lookup_form_.reset(new PasswordForm(form));
// Search GNOME Keyring for matching passwords.
ScopedAttributeList attrs(gnome_keyring_attribute_list_new());
if (!helper_.ShouldPSLDomainMatchingApply(
@@ -407,7 +415,7 @@ void GKRMethod::GetLogins(const PasswordForm& form, const char* app_string) {
void GKRMethod::GetLoginsList(uint32_t blacklisted_by_user,
const char* app_string) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- original_signon_realm_.clear();
+ lookup_form_.reset(NULL);
// Search GNOME Keyring for matching passwords.
ScopedAttributeList attrs(gnome_keyring_attribute_list_new());
AppendUint32(&attrs, "blacklisted_by_user", blacklisted_by_user);
@@ -421,7 +429,7 @@ void GKRMethod::GetLoginsList(uint32_t blacklisted_by_user,
void GKRMethod::GetAllLogins(const char* app_string) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- original_signon_realm_.clear();
+ lookup_form_.reset(NULL);
// We need to search for something, otherwise we get no results - so
// we search for the fixed application string.
ScopedAttributeList attrs(gnome_keyring_attribute_list_new());
@@ -489,8 +497,8 @@ void GKRMethod::OnOperationGetList(GnomeKeyringResult result, GList* list,
method->forms_.clear();
// |list| will be freed after this callback returns, so convert it now.
ConvertFormList(
- list, method->original_signon_realm_, method->helper_, &method->forms_);
- method->original_signon_realm_.clear();
+ list, method->lookup_form_.get(), method->helper_, &method->forms_);
+ method->lookup_form_.reset(NULL);
method->event_.Signal();
}
« no previous file with comments | « no previous file | chrome/browser/password_manager/native_backend_gnome_x_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698