OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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_store_mac.h" | 5 #include "chrome/browser/password_manager/password_store_mac.h" |
6 #include "chrome/browser/password_manager/password_store_mac_internal.h" | 6 #include "chrome/browser/password_manager/password_store_mac_internal.h" |
7 | 7 |
8 #include <CoreServices/CoreServices.h> | 8 #include <CoreServices/CoreServices.h> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 PasswordForm* form = new PasswordForm(); | 497 PasswordForm* form = new PasswordForm(); |
498 internal_keychain_helpers::FillPasswordFormFromKeychainItem(*keychain_, | 498 internal_keychain_helpers::FillPasswordFormFromKeychainItem(*keychain_, |
499 keychain_item, | 499 keychain_item, |
500 form); | 500 form); |
501 keychain_->Free(keychain_item); | 501 keychain_->Free(keychain_item); |
502 return form; | 502 return form; |
503 } | 503 } |
504 return NULL; | 504 return NULL; |
505 } | 505 } |
506 | 506 |
| 507 bool MacKeychainPasswordFormAdapter::HasPasswordsMergeableWithForm( |
| 508 const PasswordForm& query_form) { |
| 509 std::string username = UTF16ToUTF8(query_form.username_value); |
| 510 std::vector<SecKeychainItemRef> matches = |
| 511 MatchingKeychainItems(query_form.signon_realm, query_form.scheme, |
| 512 NULL, username.c_str()); |
| 513 for (std::vector<SecKeychainItemRef>::iterator i = matches.begin(); |
| 514 i != matches.end(); ++i) { |
| 515 keychain_->Free(*i); |
| 516 } |
| 517 |
| 518 return matches.size() != 0; |
| 519 } |
| 520 |
507 std::vector<PasswordForm*> | 521 std::vector<PasswordForm*> |
508 MacKeychainPasswordFormAdapter::GetAllPasswordFormPasswords() { | 522 MacKeychainPasswordFormAdapter::GetAllPasswordFormPasswords() { |
509 SecAuthenticationType supported_auth_types[] = { | 523 SecAuthenticationType supported_auth_types[] = { |
510 kSecAuthenticationTypeHTMLForm, | 524 kSecAuthenticationTypeHTMLForm, |
511 kSecAuthenticationTypeHTTPBasic, | 525 kSecAuthenticationTypeHTTPBasic, |
512 kSecAuthenticationTypeHTTPDigest, | 526 kSecAuthenticationTypeHTTPDigest, |
513 }; | 527 }; |
514 | 528 |
515 std::vector<SecKeychainItemRef> matches; | 529 std::vector<SecKeychainItemRef> matches; |
516 for (unsigned int i = 0; i < arraysize(supported_auth_types); ++i) { | 530 for (unsigned int i = 0; i < arraysize(supported_auth_types); ++i) { |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); | 769 changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); |
756 NotificationService::current()->Notify( | 770 NotificationService::current()->Notify( |
757 NotificationType::LOGINS_CHANGED, | 771 NotificationType::LOGINS_CHANGED, |
758 NotificationService::AllSources(), | 772 NotificationService::AllSources(), |
759 Details<PasswordStoreChangeList>(&changes)); | 773 Details<PasswordStoreChangeList>(&changes)); |
760 } | 774 } |
761 } | 775 } |
762 } | 776 } |
763 | 777 |
764 void PasswordStoreMac::UpdateLoginImpl(const PasswordForm& form) { | 778 void PasswordStoreMac::UpdateLoginImpl(const PasswordForm& form) { |
| 779 int update_count = 0; |
| 780 if (!login_metadata_db_->UpdateLogin(form, &update_count)) |
| 781 return; |
| 782 |
| 783 MacKeychainPasswordFormAdapter keychain_adapter(keychain_.get()); |
| 784 if (update_count == 0 && |
| 785 !keychain_adapter.HasPasswordsMergeableWithForm(form)) { |
| 786 // If the password isn't in either the DB or the keychain, then it must have |
| 787 // been deleted after autofill happened, and should not be re-added. |
| 788 return; |
| 789 } |
| 790 |
765 // The keychain add will update if there is a collision and add if there | 791 // The keychain add will update if there is a collision and add if there |
766 // isn't, which is the behavior we want, so there's no separate update call. | 792 // isn't, which is the behavior we want, so there's no separate update call. |
767 if (AddToKeychainIfNecessary(form)) { | 793 if (AddToKeychainIfNecessary(form)) { |
768 int update_count = 0; | 794 PasswordStoreChangeList changes; |
769 if (login_metadata_db_->UpdateLogin(form, &update_count)) { | 795 if (update_count == 0) { |
770 // Update will catch any database entries that we already had, but we | 796 if (login_metadata_db_->AddLogin(form)) { |
771 // could also be updating a keychain-only form, in which case we need to | 797 changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD, |
772 // add. | |
773 PasswordStoreChangeList changes; | |
774 if (update_count == 0) { | |
775 if (login_metadata_db_->AddLogin(form)) { | |
776 changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD, | |
777 form)); | |
778 } | |
779 } else { | |
780 changes.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, | |
781 form)); | 798 form)); |
782 } | 799 } |
783 if (!changes.empty()) { | 800 } else { |
784 NotificationService::current()->Notify( | 801 changes.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, |
785 NotificationType::LOGINS_CHANGED, | 802 form)); |
786 NotificationService::AllSources(), | 803 } |
787 Details<PasswordStoreChangeList>(&changes)); | 804 if (!changes.empty()) { |
788 } | 805 NotificationService::current()->Notify( |
| 806 NotificationType::LOGINS_CHANGED, |
| 807 NotificationService::AllSources(), |
| 808 Details<PasswordStoreChangeList>(&changes)); |
789 } | 809 } |
790 } | 810 } |
791 } | 811 } |
792 | 812 |
793 void PasswordStoreMac::RemoveLoginImpl(const PasswordForm& form) { | 813 void PasswordStoreMac::RemoveLoginImpl(const PasswordForm& form) { |
794 if (login_metadata_db_->RemoveLogin(form)) { | 814 if (login_metadata_db_->RemoveLogin(form)) { |
795 // See if we own a Keychain item associated with this item. We can do an | 815 // See if we own a Keychain item associated with this item. We can do an |
796 // exact search rather than messing around with trying to do fuzzy matching | 816 // exact search rather than messing around with trying to do fuzzy matching |
797 // because passwords that we created will always have an exact-match | 817 // because passwords that we created will always have an exact-match |
798 // database entry. | 818 // database entry. |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); | 1002 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); |
983 for (std::vector<PasswordForm*>::const_iterator i = forms.begin(); | 1003 for (std::vector<PasswordForm*>::const_iterator i = forms.begin(); |
984 i != forms.end(); ++i) { | 1004 i != forms.end(); ++i) { |
985 owned_keychain_adapter.RemovePassword(**i); | 1005 owned_keychain_adapter.RemovePassword(**i); |
986 } | 1006 } |
987 } | 1007 } |
988 | 1008 |
989 void PasswordStoreMac::CreateNotificationService() { | 1009 void PasswordStoreMac::CreateNotificationService() { |
990 notification_service_.reset(new NotificationService); | 1010 notification_service_.reset(new NotificationService); |
991 } | 1011 } |
OLD | NEW |