| Index: chrome/browser/password_manager/login_database.cc
|
| diff --git a/chrome/browser/password_manager/login_database.cc b/chrome/browser/password_manager/login_database.cc
|
| index ff431de6da21eaf71d8c70b57e09a046d6e46285..d1b2b2674227eea15d4e87dd799710a1602c6d3c 100644
|
| --- a/chrome/browser/password_manager/login_database.cc
|
| +++ b/chrome/browser/password_manager/login_database.cc
|
| @@ -7,6 +7,7 @@
|
| #include <algorithm>
|
| #include <limits>
|
|
|
| +#include "base/command_line.h"
|
| #include "base/file_util.h"
|
| #include "base/files/file_path.h"
|
| #include "base/logging.h"
|
| @@ -15,6 +16,8 @@
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/time.h"
|
| #include "base/utf_string_conversions.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
|
| #include "sql/statement.h"
|
| #include "sql/transaction.h"
|
|
|
| @@ -100,6 +103,10 @@ bool LoginDatabase::Init(const base::FilePath& db_path) {
|
| db_.Close();
|
| return false;
|
| }
|
| +
|
| + psl_domain_matching_ = CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableAutofillPSLDomainMatching);
|
| +
|
| return true;
|
| }
|
|
|
| @@ -334,6 +341,8 @@ bool LoginDatabase::InitPasswordFormFromStatement(PasswordForm* form,
|
| form->submit_element = s.ColumnString16(COLUMN_SUBMIT_ELEMENT);
|
| tmp = s.ColumnString(COLUMN_SIGNON_REALM);
|
| form->signon_realm = tmp;
|
| + form->original_signon_realm = "";
|
| + form->is_psl_origin_match = false;
|
| form->ssl_valid = (s.ColumnInt(COLUMN_SSL_VALID) > 0);
|
| form->preferred = (s.ColumnInt(COLUMN_PREFERRED) > 0);
|
| form->date_created = base::Time::FromTimeT(
|
| @@ -357,19 +366,41 @@ bool LoginDatabase::GetLogins(const PasswordForm& form,
|
| std::vector<PasswordForm*>* forms) const {
|
| DCHECK(forms);
|
| // You *must* change LoginTableColumns if this query changes.
|
| - sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
|
| - "SELECT origin_url, action_url, "
|
| + std::string signon_realm_operator = psl_domain_matching_ ? "regexp" : "==";
|
| + std::string sql_query = "SELECT origin_url, action_url, "
|
| "username_element, username_value, "
|
| "password_element, password_value, submit_element, "
|
| "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, "
|
| "scheme, password_type, possible_usernames, times_used "
|
| - "FROM logins WHERE signon_realm == ? "));
|
| - s.BindString(0, form.signon_realm);
|
| + "FROM logins WHERE signon_realm " + signon_realm_operator + " ? ";
|
| + sql::Statement s;
|
| + if (psl_domain_matching_) {
|
| + // TODO(nyquist) Re-enable usage of cached statements if possible.
|
| + // s.Assign(db_.GetCachedStatement(SQL_FROM_HERE, sql_query.c_str()));
|
| + s.Assign(db_.GetUniqueStatement(sql_query.c_str()));
|
| + GURL signon_realm(form.signon_realm);
|
| + std::string domain =
|
| + net::registry_controlled_domains::GetDomainAndRegistry(
|
| + signon_realm,
|
| + net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
|
| + std::string regexp = "(.+)://(.*)" + domain + "(:\\d+)?/";
|
| + s.BindString(0, regexp);
|
| + } else {
|
| + s.Assign(db_.GetCachedStatement(SQL_FROM_HERE, sql_query.c_str()));
|
| + s.BindString(0, form.signon_realm);
|
| + }
|
|
|
| while (s.Step()) {
|
| scoped_ptr<PasswordForm> new_form(new PasswordForm());
|
| if (!InitPasswordFormFromStatement(new_form.get(), s))
|
| return false;
|
| + if (form.signon_realm != new_form->signon_realm) {
|
| + new_form->is_psl_origin_match = true;
|
| + new_form->origin = form.origin;
|
| + new_form->original_signon_realm = new_form->signon_realm;
|
| + new_form->signon_realm = form.signon_realm;
|
| + new_form->action = form.action;
|
| + }
|
| forms->push_back(new_form.release());
|
| }
|
| return s.Succeeded();
|
|
|