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

Side by Side Diff: chrome/browser/password_manager/password_form_manager.cc

Issue 437032: Fixed handling of preferred login info in password manager. (Closed)
Patch Set: Fixed handling of preferred login info in password manager. Created 11 years 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
« no previous file with comments | « chrome/browser/password_manager/password_form_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "chrome/browser/password_manager/password_form_manager.h" 5 #include "chrome/browser/password_manager/password_form_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "chrome/browser/password_manager/password_manager.h" 10 #include "chrome/browser/password_manager/password_manager.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 // shows up in the future for this origin URL. However, we don't want to 113 // shows up in the future for this origin URL. However, we don't want to
114 // delete logins that were actually saved on a different page (hence with 114 // delete logins that were actually saved on a different page (hence with
115 // different origin URL) and just happened to match this form because of 115 // different origin URL) and just happened to match this form because of
116 // the scoring algorithm. See bug 1204493. 116 // the scoring algorithm. See bug 1204493.
117 if (iter->second->origin == observed_form_.origin) 117 if (iter->second->origin == observed_form_.origin)
118 password_store->RemoveLogin(*iter->second); 118 password_store->RemoveLogin(*iter->second);
119 } 119 }
120 } 120 }
121 121
122 // Save the pending_credentials_ entry marked as blacklisted. 122 // Save the pending_credentials_ entry marked as blacklisted.
123 SaveAsNewLogin(); 123 SaveAsNewLogin(false);
124 } 124 }
125 125
126 bool PasswordFormManager::IsNewLogin() { 126 bool PasswordFormManager::IsNewLogin() {
127 DCHECK_EQ(state_, POST_MATCHING_PHASE); 127 DCHECK_EQ(state_, POST_MATCHING_PHASE);
128 return is_new_login_; 128 return is_new_login_;
129 } 129 }
130 130
131 void PasswordFormManager::ProvisionallySave(const PasswordForm& credentials) { 131 void PasswordFormManager::ProvisionallySave(const PasswordForm& credentials) {
132 DCHECK_EQ(state_, POST_MATCHING_PHASE); 132 DCHECK_EQ(state_, POST_MATCHING_PHASE);
133 DCHECK(DoesManage(credentials)); 133 DCHECK(DoesManage(credentials));
(...skipping 20 matching lines...) Expand all
154 154
155 pending_credentials_.password_value = credentials.password_value; 155 pending_credentials_.password_value = credentials.password_value;
156 pending_credentials_.preferred = credentials.preferred; 156 pending_credentials_.preferred = credentials.preferred;
157 } 157 }
158 158
159 void PasswordFormManager::Save() { 159 void PasswordFormManager::Save() {
160 DCHECK_EQ(state_, POST_MATCHING_PHASE); 160 DCHECK_EQ(state_, POST_MATCHING_PHASE);
161 DCHECK(!profile_->IsOffTheRecord()); 161 DCHECK(!profile_->IsOffTheRecord());
162 162
163 if (IsNewLogin()) 163 if (IsNewLogin())
164 SaveAsNewLogin(); 164 SaveAsNewLogin(true);
165 else 165 else
166 UpdateLogin(); 166 UpdateLogin();
167 } 167 }
168 168
169 void PasswordFormManager::FetchMatchingLoginsFromWebDatabase() { 169 void PasswordFormManager::FetchMatchingLoginsFromWebDatabase() {
170 DCHECK_EQ(state_, PRE_MATCHING_PHASE); 170 DCHECK_EQ(state_, PRE_MATCHING_PHASE);
171 DCHECK(!pending_login_query_); 171 DCHECK(!pending_login_query_);
172 state_ = MATCHING_PHASE; 172 state_ = MATCHING_PHASE;
173 PasswordStore* password_store = 173 PasswordStore* password_store =
174 profile_->GetPasswordStore(Profile::EXPLICIT_ACCESS); 174 profile_->GetPasswordStore(Profile::EXPLICIT_ACCESS);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 return true; 286 return true;
287 } 287 }
288 // Don't match an invalid SSL form with one saved under secure 288 // Don't match an invalid SSL form with one saved under secure
289 // circumstances. 289 // circumstances.
290 if (form.ssl_valid && !observed_form_.ssl_valid) { 290 if (form.ssl_valid && !observed_form_.ssl_valid) {
291 return true; 291 return true;
292 } 292 }
293 return false; 293 return false;
294 } 294 }
295 295
296 void PasswordFormManager::SaveAsNewLogin() { 296 void PasswordFormManager::SaveAsNewLogin(bool reset_preferred_login) {
297 DCHECK_EQ(state_, POST_MATCHING_PHASE); 297 DCHECK_EQ(state_, POST_MATCHING_PHASE);
298 DCHECK(IsNewLogin()); 298 DCHECK(IsNewLogin());
299 // The new_form is being used to sign in, so it is preferred. 299 // The new_form is being used to sign in, so it is preferred.
300 DCHECK(pending_credentials_.preferred); 300 DCHECK(pending_credentials_.preferred);
301 // new_form contains the same basic data as observed_form_ (because its the 301 // new_form contains the same basic data as observed_form_ (because its the
302 // same form), but with the newly added credentials. 302 // same form), but with the newly added credentials.
303 303
304 DCHECK(!profile_->IsOffTheRecord()); 304 DCHECK(!profile_->IsOffTheRecord());
305 305
306 PasswordStore* password_store = 306 PasswordStore* password_store =
307 profile_->GetPasswordStore(Profile::IMPLICIT_ACCESS); 307 profile_->GetPasswordStore(Profile::IMPLICIT_ACCESS);
308 if (!password_store) { 308 if (!password_store) {
309 NOTREACHED(); 309 NOTREACHED();
310 return; 310 return;
311 } 311 }
312 312
313 pending_credentials_.date_created = Time::Now(); 313 pending_credentials_.date_created = Time::Now();
314 password_store->AddLogin(pending_credentials_); 314 password_store->AddLogin(pending_credentials_);
315
316 if (reset_preferred_login) {
317 UpdatePreferredLoginState(password_store);
318 }
319 }
320
321 void PasswordFormManager::UpdatePreferredLoginState(
322 PasswordStore* password_store) {
323 DCHECK(password_store);
324 PasswordFormMap::iterator iter;
325 for (iter = best_matches_.begin(); iter != best_matches_.end(); iter++) {
326 if (iter->second->username_value != pending_credentials_.username_value &&
327 iter->second->preferred) {
328 // This wasn't the selected login but it used to be preferred.
329 iter->second->preferred = false;
330 password_store->UpdateLogin(*iter->second);
331 }
332 }
315 } 333 }
316 334
317 void PasswordFormManager::UpdateLogin() { 335 void PasswordFormManager::UpdateLogin() {
318 DCHECK_EQ(state_, POST_MATCHING_PHASE); 336 DCHECK_EQ(state_, POST_MATCHING_PHASE);
319 DCHECK(preferred_match_); 337 DCHECK(preferred_match_);
320 // If we're doing an Update, its because we autofilled a form and the user 338 // If we're doing an Update, its because we autofilled a form and the user
321 // submitted it with a possibly new password value, page security, or selected 339 // submitted it with a possibly new password value, page security, or selected
322 // one of the non-preferred matches, thus requiring a swap of preferred bits. 340 // one of the non-preferred matches, thus requiring a swap of preferred bits.
323 DCHECK(!IsNewLogin() && pending_credentials_.preferred); 341 DCHECK(!IsNewLogin() && pending_credentials_.preferred);
324 DCHECK(!profile_->IsOffTheRecord()); 342 DCHECK(!profile_->IsOffTheRecord());
325 343
326 PasswordStore* password_store = 344 PasswordStore* password_store =
327 profile_->GetPasswordStore(Profile::IMPLICIT_ACCESS); 345 profile_->GetPasswordStore(Profile::IMPLICIT_ACCESS);
328 if (!password_store) { 346 if (!password_store) {
329 NOTREACHED(); 347 NOTREACHED();
330 return; 348 return;
331 } 349 }
332 350
333 // Update all matches to reflect new preferred status. 351 UpdatePreferredLoginState(password_store);
334 PasswordFormMap::iterator iter; 352
335 for (iter = best_matches_.begin(); iter != best_matches_.end(); iter++) {
336 if ((iter->second->username_value != pending_credentials_.username_value) &&
337 iter->second->preferred) {
338 // This wasn't the selected login but it used to be preferred.
339 iter->second->preferred = false;
340 password_store->UpdateLogin(*iter->second);
341 }
342 }
343 // Update the new preferred login. 353 // Update the new preferred login.
344 // Note origin.spec().length > signon_realm.length implies the origin has a 354 // Note origin.spec().length > signon_realm.length implies the origin has a
345 // path, since signon_realm is a prefix of origin for HTML password forms. 355 // path, since signon_realm is a prefix of origin for HTML password forms.
346 if ((observed_form_.scheme == PasswordForm::SCHEME_HTML) && 356 if ((observed_form_.scheme == PasswordForm::SCHEME_HTML) &&
347 (observed_form_.origin.spec().length() > 357 (observed_form_.origin.spec().length() >
348 observed_form_.signon_realm.length()) && 358 observed_form_.signon_realm.length()) &&
349 (observed_form_.signon_realm == pending_credentials_.origin.spec())) { 359 (observed_form_.signon_realm == pending_credentials_.origin.spec())) {
350 // The user logged in successfully with one of our autofilled logins on a 360 // The user logged in successfully with one of our autofilled logins on a
351 // page with non-empty path, but the autofilled entry was initially saved/ 361 // page with non-empty path, but the autofilled entry was initially saved/
352 // imported with an empty path. Rather than just mark this entry preferred, 362 // imported with an empty path. Rather than just mark this entry preferred,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 if (candidate.password_element == observed_form_.password_element) 429 if (candidate.password_element == observed_form_.password_element)
420 score += 1 << 2; 430 score += 1 << 2;
421 if (candidate.submit_element == observed_form_.submit_element) 431 if (candidate.submit_element == observed_form_.submit_element)
422 score += 1 << 1; 432 score += 1 << 1;
423 if (candidate.username_element == observed_form_.username_element) 433 if (candidate.username_element == observed_form_.username_element)
424 score += 1 << 0; 434 score += 1 << 0;
425 } 435 }
426 436
427 return score; 437 return score;
428 } 438 }
OLDNEW
« no previous file with comments | « chrome/browser/password_manager/password_form_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698