| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/login_database.h" | 5 #include "components/password_manager/core/browser/login_database.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
| 10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 using ::testing::Eq; | 22 using ::testing::Eq; |
| 23 | 23 |
| 24 namespace password_manager { | 24 namespace password_manager { |
| 25 namespace { | 25 namespace { |
| 26 PasswordStoreChangeList AddChangeForForm(const PasswordForm& form) { | 26 PasswordStoreChangeList AddChangeForForm(const PasswordForm& form) { |
| 27 return PasswordStoreChangeList(1, | 27 return PasswordStoreChangeList(1, |
| 28 PasswordStoreChange(PasswordStoreChange::ADD, | 28 PasswordStoreChange(PasswordStoreChange::ADD, |
| 29 form)); | 29 form)); |
| 30 } | 30 } |
| 31 | 31 |
| 32 PasswordStoreChangeList UpdateChangeForForm(const PasswordForm& form) { |
| 33 return PasswordStoreChangeList(1, PasswordStoreChange( |
| 34 PasswordStoreChange::UPDATE, form)); |
| 35 } |
| 36 |
| 32 } // namespace | 37 } // namespace |
| 33 | 38 |
| 34 // Serialization routines for vectors implemented in login_database.cc. | 39 // Serialization routines for vectors implemented in login_database.cc. |
| 35 Pickle SerializeVector(const std::vector<base::string16>& vec); | 40 Pickle SerializeVector(const std::vector<base::string16>& vec); |
| 36 std::vector<base::string16> DeserializeVector(const Pickle& pickle); | 41 std::vector<base::string16> DeserializeVector(const Pickle& pickle); |
| 37 | 42 |
| 38 class LoginDatabaseTest : public testing::Test { | 43 class LoginDatabaseTest : public testing::Test { |
| 39 protected: | 44 protected: |
| 40 virtual void SetUp() { | 45 virtual void SetUp() { |
| 41 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 46 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 delete result[0]; | 212 delete result[0]; |
| 208 result.clear(); | 213 result.clear(); |
| 209 | 214 |
| 210 // User changes his password. | 215 // User changes his password. |
| 211 PasswordForm form6(form5); | 216 PasswordForm form6(form5); |
| 212 form6.password_value = ASCIIToUTF16("test6"); | 217 form6.password_value = ASCIIToUTF16("test6"); |
| 213 form6.preferred = true; | 218 form6.preferred = true; |
| 214 | 219 |
| 215 // We update, and check to make sure it matches the | 220 // We update, and check to make sure it matches the |
| 216 // old form, and there is only one record. | 221 // old form, and there is only one record. |
| 217 int rows_changed = 0; | 222 EXPECT_EQ(UpdateChangeForForm(form6), db_.UpdateLogin(form6)); |
| 218 EXPECT_TRUE(db_.UpdateLogin(form6, &rows_changed)); | |
| 219 EXPECT_EQ(1, rows_changed); | |
| 220 // matches | 223 // matches |
| 221 EXPECT_TRUE(db_.GetLogins(form5, &result)); | 224 EXPECT_TRUE(db_.GetLogins(form5, &result)); |
| 222 EXPECT_EQ(1U, result.size()); | 225 EXPECT_EQ(1U, result.size()); |
| 223 delete result[0]; | 226 delete result[0]; |
| 224 result.clear(); | 227 result.clear(); |
| 225 // Only one record. | 228 // Only one record. |
| 226 EXPECT_TRUE(db_.GetAutofillableLogins(&result)); | 229 EXPECT_TRUE(db_.GetAutofillableLogins(&result)); |
| 227 EXPECT_EQ(1U, result.size()); | 230 EXPECT_EQ(1U, result.size()); |
| 228 // Password element was updated. | 231 // Password element was updated. |
| 229 #if defined(OS_MACOSX) && !defined(OS_IOS) | 232 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 ClearResults(&result); | 744 ClearResults(&result); |
| 742 | 745 |
| 743 // Let's say this login form worked. Now update the stored credentials with | 746 // Let's say this login form worked. Now update the stored credentials with |
| 744 // 'action', 'username_element', 'password_element' and 'submit_element' from | 747 // 'action', 'username_element', 'password_element' and 'submit_element' from |
| 745 // the encountered form. | 748 // the encountered form. |
| 746 PasswordForm completed_form(incomplete_form); | 749 PasswordForm completed_form(incomplete_form); |
| 747 completed_form.action = encountered_form.action; | 750 completed_form.action = encountered_form.action; |
| 748 completed_form.username_element = encountered_form.username_element; | 751 completed_form.username_element = encountered_form.username_element; |
| 749 completed_form.password_element = encountered_form.password_element; | 752 completed_form.password_element = encountered_form.password_element; |
| 750 completed_form.submit_element = encountered_form.submit_element; | 753 completed_form.submit_element = encountered_form.submit_element; |
| 751 EXPECT_TRUE(db_.UpdateLogin(completed_form, NULL)); | 754 EXPECT_EQ(AddChangeForForm(completed_form), db_.AddLogin(completed_form)); |
| 755 EXPECT_TRUE(db_.RemoveLogin(incomplete_form)); |
| 752 | 756 |
| 753 // Get matches for encountered_form again. | 757 // Get matches for encountered_form again. |
| 754 EXPECT_TRUE(db_.GetLogins(encountered_form, &result)); | 758 EXPECT_TRUE(db_.GetLogins(encountered_form, &result)); |
| 755 ASSERT_EQ(1U, result.size()); | 759 ASSERT_EQ(1U, result.size()); |
| 756 | 760 |
| 757 // This time we should have all the info available. | 761 // This time we should have all the info available. |
| 758 PasswordForm expected_form(completed_form); | 762 PasswordForm expected_form(completed_form); |
| 759 #if defined(OS_MACOSX) && !defined(OS_IOS) | 763 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 760 expected_form.password_value.clear(); | 764 expected_form.password_value.clear(); |
| 761 #endif // OS_MACOSX && !OS_IOS | 765 #endif // OS_MACOSX && !OS_IOS |
| (...skipping 18 matching lines...) Expand all Loading... |
| 780 EXPECT_EQ(AddChangeForForm(incomplete_form), db_.AddLogin(incomplete_form)); | 784 EXPECT_EQ(AddChangeForForm(incomplete_form), db_.AddLogin(incomplete_form)); |
| 781 | 785 |
| 782 // Save a complete version of the previous form. Both forms could exist if | 786 // Save a complete version of the previous form. Both forms could exist if |
| 783 // the user created the complete version before importing the incomplete | 787 // the user created the complete version before importing the incomplete |
| 784 // version from a different browser. | 788 // version from a different browser. |
| 785 PasswordForm complete_form = incomplete_form; | 789 PasswordForm complete_form = incomplete_form; |
| 786 complete_form.action = GURL("http://accounts.google.com/Login"); | 790 complete_form.action = GURL("http://accounts.google.com/Login"); |
| 787 complete_form.username_element = ASCIIToUTF16("username_element"); | 791 complete_form.username_element = ASCIIToUTF16("username_element"); |
| 788 complete_form.password_element = ASCIIToUTF16("password_element"); | 792 complete_form.password_element = ASCIIToUTF16("password_element"); |
| 789 complete_form.submit_element = ASCIIToUTF16("submit"); | 793 complete_form.submit_element = ASCIIToUTF16("submit"); |
| 794 |
| 795 // An update fails because the primary key for |complete_form| is different. |
| 796 EXPECT_EQ(PasswordStoreChangeList(), db_.UpdateLogin(complete_form)); |
| 790 EXPECT_EQ(AddChangeForForm(complete_form), db_.AddLogin(complete_form)); | 797 EXPECT_EQ(AddChangeForForm(complete_form), db_.AddLogin(complete_form)); |
| 791 | 798 |
| 792 // Make sure both passwords exist. | 799 // Make sure both passwords exist. |
| 793 ScopedVector<autofill::PasswordForm> result; | 800 ScopedVector<autofill::PasswordForm> result; |
| 794 EXPECT_TRUE(db_.GetAutofillableLogins(&result.get())); | 801 EXPECT_TRUE(db_.GetAutofillableLogins(&result.get())); |
| 795 ASSERT_EQ(2U, result.size()); | 802 ASSERT_EQ(2U, result.size()); |
| 796 result.clear(); | 803 result.clear(); |
| 797 | 804 |
| 798 // Simulate the user changing their password. | 805 // Simulate the user changing their password. |
| 799 complete_form.password_value = ASCIIToUTF16("new_password"); | 806 complete_form.password_value = ASCIIToUTF16("new_password"); |
| 800 EXPECT_TRUE(db_.UpdateLogin(complete_form, NULL)); | 807 EXPECT_EQ(UpdateChangeForForm(complete_form), db_.UpdateLogin(complete_form)); |
| 801 | 808 |
| 802 // Only one updated form should exist now. | 809 // Both still exist now. |
| 803 EXPECT_TRUE(db_.GetAutofillableLogins(&result.get())); | 810 EXPECT_TRUE(db_.GetAutofillableLogins(&result.get())); |
| 804 ASSERT_EQ(1U, result.size()); | 811 ASSERT_EQ(2U, result.size()); |
| 805 | 812 |
| 806 PasswordForm expected_form(complete_form); | |
| 807 #if defined(OS_MACOSX) && !defined(OS_IOS) | 813 #if defined(OS_MACOSX) && !defined(OS_IOS) |
| 808 // On Mac, passwords are not stored in login database, instead they're in | 814 // On Mac, passwords are not stored in login database, instead they're in |
| 809 // the keychain. | 815 // the keychain. |
| 810 expected_form.password_value.clear(); | 816 complete_form.password_value.clear(); |
| 817 incomplete_form.password_value.clear(); |
| 811 #endif // OS_MACOSX && !OS_IOS | 818 #endif // OS_MACOSX && !OS_IOS |
| 812 EXPECT_EQ(expected_form, *result[0]); | 819 if (result[0]->username_element.empty()) |
| 820 std::swap(result[0], result[1]); |
| 821 EXPECT_EQ(complete_form, *result[0]); |
| 822 EXPECT_EQ(incomplete_form, *result[1]); |
| 813 } | 823 } |
| 814 | 824 |
| 815 TEST_F(LoginDatabaseTest, DoubleAdd) { | 825 TEST_F(LoginDatabaseTest, DoubleAdd) { |
| 816 PasswordForm form; | 826 PasswordForm form; |
| 817 form.origin = GURL("http://accounts.google.com/LoginAuth"); | 827 form.origin = GURL("http://accounts.google.com/LoginAuth"); |
| 818 form.signon_realm = "http://accounts.google.com/"; | 828 form.signon_realm = "http://accounts.google.com/"; |
| 819 form.username_value = ASCIIToUTF16("my_username"); | 829 form.username_value = ASCIIToUTF16("my_username"); |
| 820 form.password_value = ASCIIToUTF16("my_password"); | 830 form.password_value = ASCIIToUTF16("my_password"); |
| 821 form.ssl_valid = false; | 831 form.ssl_valid = false; |
| 822 form.preferred = true; | 832 form.preferred = true; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 839 // This tests that sql::Connection::set_restrict_to_user() was called, | 849 // This tests that sql::Connection::set_restrict_to_user() was called, |
| 840 // and that function is a noop on non-POSIX platforms in any case. | 850 // and that function is a noop on non-POSIX platforms in any case. |
| 841 TEST_F(LoginDatabaseTest, FilePermissions) { | 851 TEST_F(LoginDatabaseTest, FilePermissions) { |
| 842 int mode = base::FILE_PERMISSION_MASK; | 852 int mode = base::FILE_PERMISSION_MASK; |
| 843 EXPECT_TRUE(base::GetPosixFilePermissions(file_, &mode)); | 853 EXPECT_TRUE(base::GetPosixFilePermissions(file_, &mode)); |
| 844 EXPECT_EQ((mode & base::FILE_PERMISSION_USER_MASK), mode); | 854 EXPECT_EQ((mode & base::FILE_PERMISSION_USER_MASK), mode); |
| 845 } | 855 } |
| 846 #endif // defined(OS_POSIX) | 856 #endif // defined(OS_POSIX) |
| 847 | 857 |
| 848 } // namespace password_manager | 858 } // namespace password_manager |
| OLD | NEW |