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

Side by Side Diff: components/password_manager/core/browser/password_form_manager.cc

Issue 870513002: [PasswordManager] Improve detection of ignorable change password forms. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Incorporated reviews. Created 5 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/password_manager/core/browser/password_form_manager.h" 5 #include "components/password_manager/core/browser/password_form_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 9
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 event, SUBMISSION_EVENT_ENUM_COUNT); 61 event, SUBMISSION_EVENT_ENUM_COUNT);
62 } 62 }
63 63
64 PasswordForm CopyAndModifySSLValidity(const PasswordForm& orig, 64 PasswordForm CopyAndModifySSLValidity(const PasswordForm& orig,
65 bool ssl_valid) { 65 bool ssl_valid) {
66 PasswordForm result(orig); 66 PasswordForm result(orig);
67 result.ssl_valid = ssl_valid; 67 result.ssl_valid = ssl_valid;
68 return result; 68 return result;
69 } 69 }
70 70
71 // Returns true if user-typed username and password field values match with one
72 // of the password form within |credentials| map; otherwise false.
73 bool DoesUsenameAndPasswordMatchCredentials(
74 const base::string16& typed_username,
75 const base::string16& typed_password,
76 const autofill::PasswordFormMap& credentials) {
77 for (auto match : credentials) {
78 if (match.second->username_value == typed_username &&
79 match.second->password_value == typed_password)
80 return true;
81 }
82 return false;
83 }
84
71 } // namespace 85 } // namespace
72 86
73 PasswordFormManager::PasswordFormManager( 87 PasswordFormManager::PasswordFormManager(
74 PasswordManager* password_manager, 88 PasswordManager* password_manager,
75 PasswordManagerClient* client, 89 PasswordManagerClient* client,
76 const base::WeakPtr<PasswordManagerDriver>& driver, 90 const base::WeakPtr<PasswordManagerDriver>& driver,
77 const PasswordForm& observed_form, 91 const PasswordForm& observed_form,
78 bool ssl_valid) 92 bool ssl_valid)
79 : best_matches_deleter_(&best_matches_), 93 : best_matches_deleter_(&best_matches_),
80 observed_form_(CopyAndModifySSLValidity(observed_form, ssl_valid)), 94 observed_form_(CopyAndModifySSLValidity(observed_form, ssl_valid)),
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 PasswordStore::AuthorizationPromptPolicy prompt_policy) { 383 PasswordStore::AuthorizationPromptPolicy prompt_policy) {
370 DCHECK_EQ(state_, PRE_MATCHING_PHASE); 384 DCHECK_EQ(state_, PRE_MATCHING_PHASE);
371 state_ = MATCHING_PHASE; 385 state_ = MATCHING_PHASE;
372 386
373 scoped_ptr<BrowserSavePasswordProgressLogger> logger; 387 scoped_ptr<BrowserSavePasswordProgressLogger> logger;
374 if (client_->IsLoggingActive()) { 388 if (client_->IsLoggingActive()) {
375 logger.reset(new BrowserSavePasswordProgressLogger(client_)); 389 logger.reset(new BrowserSavePasswordProgressLogger(client_));
376 logger->LogMessage(Logger::STRING_FETCH_LOGINS_METHOD); 390 logger->LogMessage(Logger::STRING_FETCH_LOGINS_METHOD);
377 } 391 }
378 392
379 // Do not autofill on sign-up or change password forms (until we have some
380 // working change password functionality).
381 if (!observed_form_.new_password_element.empty()) {
382 if (logger)
383 logger->LogMessage(Logger::STRING_FORM_NOT_AUTOFILLED);
384 client_->AutofillResultsComputed();
385 // There is no point in looking for the credentials in the store when they
386 // won't be autofilled, so pretend there were none.
387 OnGetPasswordStoreResults(ScopedVector<autofill::PasswordForm>());
388 return;
389 }
390
391 PasswordStore* password_store = client_->GetPasswordStore(); 393 PasswordStore* password_store = client_->GetPasswordStore();
392 if (!password_store) { 394 if (!password_store) {
393 if (logger) 395 if (logger)
394 logger->LogMessage(Logger::STRING_NO_STORE); 396 logger->LogMessage(Logger::STRING_NO_STORE);
395 NOTREACHED(); 397 NOTREACHED();
396 return; 398 return;
397 } 399 }
398 password_store->GetLogins(observed_form_, prompt_policy, this); 400 password_store->GetLogins(observed_form_, prompt_policy, this);
399 } 401 }
400 402
401 bool PasswordFormManager::HasCompletedMatching() const { 403 bool PasswordFormManager::HasCompletedMatching() const {
402 return state_ == POST_MATCHING_PHASE; 404 return state_ == POST_MATCHING_PHASE;
403 } 405 }
404 406
405 bool PasswordFormManager::IsIgnorableChangePasswordForm() const { 407 bool PasswordFormManager::IsIgnorableChangePasswordForm(
408 const base::string16& typed_username,
409 const base::string16& typed_password) const {
406 bool is_change_password_form = !observed_form_.new_password_element.empty() && 410 bool is_change_password_form = !observed_form_.new_password_element.empty() &&
407 !observed_form_.password_element.empty(); 411 !observed_form_.password_element.empty();
408 bool is_username_certainly_correct = observed_form_.username_marked_by_site; 412 return is_change_password_form && !observed_form_.username_marked_by_site &&
409 return is_change_password_form && !is_username_certainly_correct; 413 !DoesUsenameAndPasswordMatchCredentials(typed_username, typed_password,
414 best_matches_);
410 } 415 }
411 416
412 void PasswordFormManager::OnRequestDone( 417 void PasswordFormManager::OnRequestDone(
413 ScopedVector<PasswordForm> logins_result) { 418 ScopedVector<PasswordForm> logins_result) {
414 const size_t logins_result_size = logins_result.size(); 419 const size_t logins_result_size = logins_result.size();
415 420
416 scoped_ptr<BrowserSavePasswordProgressLogger> logger; 421 scoped_ptr<BrowserSavePasswordProgressLogger> logger;
417 if (client_->IsLoggingActive()) { 422 if (client_->IsLoggingActive()) {
418 logger.reset(new BrowserSavePasswordProgressLogger(client_)); 423 logger.reset(new BrowserSavePasswordProgressLogger(client_));
419 logger->LogMessage(Logger::STRING_ON_REQUEST_DONE_METHOD); 424 logger->LogMessage(Logger::STRING_ON_REQUEST_DONE_METHOD);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 534
530 if (!driver || manager_action_ == kManagerActionBlacklisted) 535 if (!driver || manager_action_ == kManagerActionBlacklisted)
531 return; 536 return;
532 537
533 // Allow generation for any non-blacklisted form. 538 // Allow generation for any non-blacklisted form.
534 driver->AllowPasswordGenerationForForm(observed_form_); 539 driver->AllowPasswordGenerationForForm(observed_form_);
535 540
536 if (best_matches_.empty()) 541 if (best_matches_.empty())
537 return; 542 return;
538 543
544 // Do not autofill on sign-up or change password forms (until we have some
545 // working change password functionality).
546 if (!observed_form_.new_password_element.empty()) {
547 if (client_->IsLoggingActive()) {
548 BrowserSavePasswordProgressLogger logger(client_);
549 logger.LogMessage(Logger::PROCESS_FRAME_METHOD);
550 logger.LogMessage(Logger::STRING_FORM_NOT_AUTOFILLED);
551 }
552 return;
553 }
554
539 // Proceed to autofill. 555 // Proceed to autofill.
540 // Note that we provide the choices but don't actually prefill a value if: 556 // Note that we provide the choices but don't actually prefill a value if:
541 // (1) we are in Incognito mode, (2) the ACTION paths don't match, 557 // (1) we are in Incognito mode, (2) the ACTION paths don't match,
542 // or (3) if it matched using public suffix domain matching. 558 // or (3) if it matched using public suffix domain matching.
543 bool wait_for_username = client_->IsOffTheRecord() || 559 bool wait_for_username = client_->IsOffTheRecord() ||
544 observed_form_.action.GetWithEmptyPath() != 560 observed_form_.action.GetWithEmptyPath() !=
545 preferred_match_->action.GetWithEmptyPath() || 561 preferred_match_->action.GetWithEmptyPath() ||
546 preferred_match_->IsPublicSuffixMatch(); 562 preferred_match_->IsPublicSuffixMatch();
547 if (wait_for_username) 563 if (wait_for_username)
548 manager_action_ = kManagerActionNone; 564 manager_action_ = kManagerActionNone;
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
873 LogPasswordGenerationSubmissionEvent(PASSWORD_SUBMITTED); 889 LogPasswordGenerationSubmissionEvent(PASSWORD_SUBMITTED);
874 } 890 }
875 891
876 void PasswordFormManager::SubmitFailed() { 892 void PasswordFormManager::SubmitFailed() {
877 submit_result_ = kSubmitResultFailed; 893 submit_result_ = kSubmitResultFailed;
878 if (has_generated_password_) 894 if (has_generated_password_)
879 LogPasswordGenerationSubmissionEvent(PASSWORD_SUBMISSION_FAILED); 895 LogPasswordGenerationSubmissionEvent(PASSWORD_SUBMISSION_FAILED);
880 } 896 }
881 897
882 } // namespace password_manager 898 } // namespace password_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698