| OLD | NEW |
| 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 "chrome/browser/password_manager/password_store_mac.h" | 5 #include "chrome/browser/password_manager/password_store_mac.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
| 9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 { PasswordForm::SCHEME_DIGEST, "https://some.domain.com/high_security", | 317 { PasswordForm::SCHEME_DIGEST, "https://some.domain.com/high_security", |
| 318 "https://some.domain.com/", L"digest_auth_user", L"digest", true, | 318 "https://some.domain.com/", L"digest_auth_user", L"digest", true, |
| 319 1998, 3, 30, 10, 0, 0 }, | 319 1998, 3, 30, 10, 0, 0 }, |
| 320 // This one gives us an invalid date, which we will treat as a "NULL" date | 320 // This one gives us an invalid date, which we will treat as a "NULL" date |
| 321 // which is 1601. | 321 // which is 1601. |
| 322 { PasswordForm::SCHEME_OTHER, "http://a.server.com/", | 322 { PasswordForm::SCHEME_OTHER, "http://a.server.com/", |
| 323 "http://a.server.com/", L"abc", L"123", false, | 323 "http://a.server.com/", L"abc", L"123", false, |
| 324 1601, 1, 1, 0, 0, 0 }, | 324 1601, 1, 1, 0, 0, 0 }, |
| 325 }; | 325 }; |
| 326 | 326 |
| 327 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(expected); ++i) { | 327 for (unsigned int i = 0; i < arraysize(expected); ++i) { |
| 328 // Create our fake KeychainItemRef; see MockAppleKeychain docs. | 328 // Create our fake KeychainItemRef; see MockAppleKeychain docs. |
| 329 SecKeychainItemRef keychain_item = | 329 SecKeychainItemRef keychain_item = |
| 330 reinterpret_cast<SecKeychainItemRef>(i + 1); | 330 reinterpret_cast<SecKeychainItemRef>(i + 1); |
| 331 PasswordForm form; | 331 PasswordForm form; |
| 332 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( | 332 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
| 333 *keychain_, keychain_item, &form, true); | 333 *keychain_, keychain_item, &form, true); |
| 334 | 334 |
| 335 EXPECT_TRUE(parsed) << "In iteration " << i; | 335 EXPECT_TRUE(parsed) << "In iteration " << i; |
| 336 | 336 |
| 337 EXPECT_EQ(expected[i].scheme, form.scheme) << "In iteration " << i; | 337 EXPECT_EQ(expected[i].scheme, form.scheme) << "In iteration " << i; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 0 }, | 418 0 }, |
| 419 0, 0 }, | 419 0, 0 }, |
| 420 // Garbage forms should have no matches. | 420 // Garbage forms should have no matches. |
| 421 { { PasswordForm::SCHEME_HTML, "foo/bar/baz", | 421 { { PasswordForm::SCHEME_HTML, "foo/bar/baz", |
| 422 NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, false, 0 }, 0, 0 }, | 422 NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, false, 0 }, 0, 0 }, |
| 423 }; | 423 }; |
| 424 | 424 |
| 425 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); | 425 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); |
| 426 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); | 426 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); |
| 427 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); | 427 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); |
| 428 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 428 for (unsigned int i = 0; i < arraysize(test_data); ++i) { |
| 429 scoped_ptr<PasswordForm> query_form( | 429 scoped_ptr<PasswordForm> query_form( |
| 430 CreatePasswordFormFromData(test_data[i].data)); | 430 CreatePasswordFormFromData(test_data[i].data)); |
| 431 | 431 |
| 432 // Check matches treating the form as a fill target. | 432 // Check matches treating the form as a fill target. |
| 433 std::vector<PasswordForm*> matching_items = | 433 std::vector<PasswordForm*> matching_items = |
| 434 keychain_adapter.PasswordsFillingForm(query_form->signon_realm, | 434 keychain_adapter.PasswordsFillingForm(query_form->signon_realm, |
| 435 query_form->scheme); | 435 query_form->scheme); |
| 436 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size()); | 436 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size()); |
| 437 STLDeleteElements(&matching_items); | 437 STLDeleteElements(&matching_items); |
| 438 | 438 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 575 // password; see MockAppleKeychain::ItemModifyAttributesAndData) is | 575 // password; see MockAppleKeychain::ItemModifyAttributesAndData) is |
| 576 // reported. | 576 // reported. |
| 577 { { PasswordForm::SCHEME_HTML, "http://some.domain.com", | 577 { { PasswordForm::SCHEME_HTML, "http://some.domain.com", |
| 578 "http://some.domain.com/insecure.html", NULL, NULL, NULL, NULL, | 578 "http://some.domain.com/insecure.html", NULL, NULL, NULL, NULL, |
| 579 L"joe_user", L"fail_me", false, false, 0 }, false }, | 579 L"joe_user", L"fail_me", false, false, 0 }, false }, |
| 580 }; | 580 }; |
| 581 | 581 |
| 582 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); | 582 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); |
| 583 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); | 583 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); |
| 584 | 584 |
| 585 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 585 for (unsigned int i = 0; i < arraysize(test_data); ++i) { |
| 586 scoped_ptr<PasswordForm> in_form( | 586 scoped_ptr<PasswordForm> in_form( |
| 587 CreatePasswordFormFromData(test_data[i].data)); | 587 CreatePasswordFormFromData(test_data[i].data)); |
| 588 bool add_succeeded = owned_keychain_adapter.AddPassword(*in_form); | 588 bool add_succeeded = owned_keychain_adapter.AddPassword(*in_form); |
| 589 EXPECT_EQ(test_data[i].should_succeed, add_succeeded); | 589 EXPECT_EQ(test_data[i].should_succeed, add_succeeded); |
| 590 if (add_succeeded) { | 590 if (add_succeeded) { |
| 591 EXPECT_TRUE(owned_keychain_adapter.HasPasswordsMergeableWithForm( | 591 EXPECT_TRUE(owned_keychain_adapter.HasPasswordsMergeableWithForm( |
| 592 *in_form)); | 592 *in_form)); |
| 593 EXPECT_TRUE(owned_keychain_adapter.HasPasswordExactlyMatchingForm( | 593 EXPECT_TRUE(owned_keychain_adapter.HasPasswordExactlyMatchingForm( |
| 594 *in_form)); | 594 *in_form)); |
| 595 } | 595 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 632 }; | 632 }; |
| 633 | 633 |
| 634 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); | 634 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); |
| 635 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); | 635 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); |
| 636 | 636 |
| 637 // Add our test item so that we can delete it. | 637 // Add our test item so that we can delete it. |
| 638 PasswordForm* add_form = CreatePasswordFormFromData(test_data[0].data); | 638 PasswordForm* add_form = CreatePasswordFormFromData(test_data[0].data); |
| 639 EXPECT_TRUE(owned_keychain_adapter.AddPassword(*add_form)); | 639 EXPECT_TRUE(owned_keychain_adapter.AddPassword(*add_form)); |
| 640 delete add_form; | 640 delete add_form; |
| 641 | 641 |
| 642 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { | 642 for (unsigned int i = 0; i < arraysize(test_data); ++i) { |
| 643 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData( | 643 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData( |
| 644 test_data[i].data)); | 644 test_data[i].data)); |
| 645 EXPECT_EQ(test_data[i].should_succeed, | 645 EXPECT_EQ(test_data[i].should_succeed, |
| 646 owned_keychain_adapter.RemovePassword(*form)); | 646 owned_keychain_adapter.RemovePassword(*form)); |
| 647 | 647 |
| 648 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); | 648 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); |
| 649 bool match = keychain_adapter.HasPasswordExactlyMatchingForm(*form); | 649 bool match = keychain_adapter.HasPasswordExactlyMatchingForm(*form); |
| 650 EXPECT_EQ(test_data[i].should_succeed, !match); | 650 EXPECT_EQ(test_data[i].should_succeed, !match); |
| 651 } | 651 } |
| 652 } | 652 } |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 "http://dont.remember.com/", | 888 "http://dont.remember.com/", |
| 889 "http://dont.remember.com/handlepage.cgi", | 889 "http://dont.remember.com/handlepage.cgi", |
| 890 L"submit", L"username", L"password", L"joe_user", L"", | 890 L"submit", L"username", L"password", L"joe_user", L"", |
| 891 true, false, 1240000000 }, | 891 true, false, 1240000000 }, |
| 892 { PasswordForm::SCHEME_HTML, "http://some.domain.com/", | 892 { PasswordForm::SCHEME_HTML, "http://some.domain.com/", |
| 893 "http://some.domain.com/path.html", "http://some.domain.com/action.cgi", | 893 "http://some.domain.com/path.html", "http://some.domain.com/action.cgi", |
| 894 L"submit", L"username", L"password", NULL, NULL, | 894 L"submit", L"username", L"password", NULL, NULL, |
| 895 true, false, 1212121212 }, | 895 true, false, 1212121212 }, |
| 896 }; | 896 }; |
| 897 std::vector<PasswordForm*> database_forms; | 897 std::vector<PasswordForm*> database_forms; |
| 898 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(db_data); ++i) { | 898 for (unsigned int i = 0; i < arraysize(db_data); ++i) { |
| 899 database_forms.push_back(CreatePasswordFormFromData(db_data[i])); | 899 database_forms.push_back(CreatePasswordFormFromData(db_data[i])); |
| 900 } | 900 } |
| 901 std::vector<PasswordForm*> merged_forms = | 901 std::vector<PasswordForm*> merged_forms = |
| 902 internal_keychain_helpers::GetPasswordsForForms(*keychain_, | 902 internal_keychain_helpers::GetPasswordsForForms(*keychain_, |
| 903 &database_forms); | 903 &database_forms); |
| 904 EXPECT_EQ(2U, database_forms.size()); | 904 EXPECT_EQ(2U, database_forms.size()); |
| 905 ASSERT_EQ(3U, merged_forms.size()); | 905 ASSERT_EQ(3U, merged_forms.size()); |
| 906 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value); | 906 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value); |
| 907 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value); | 907 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value); |
| 908 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user); | 908 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user); |
| 909 | 909 |
| 910 STLDeleteElements(&database_forms); | 910 STLDeleteElements(&database_forms); |
| 911 STLDeleteElements(&merged_forms); | 911 STLDeleteElements(&merged_forms); |
| 912 } | 912 } |
| 913 | 913 |
| 914 TEST_F(PasswordStoreMacInternalsTest, TestBlacklistedFiltering) { | 914 TEST_F(PasswordStoreMacInternalsTest, TestBlacklistedFiltering) { |
| 915 PasswordFormData db_data[] = { | 915 PasswordFormData db_data[] = { |
| 916 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/", | 916 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/", |
| 917 "http://dont.remember.com/", | 917 "http://dont.remember.com/", |
| 918 "http://dont.remember.com/handlepage.cgi", | 918 "http://dont.remember.com/handlepage.cgi", |
| 919 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", | 919 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", |
| 920 true, false, 1240000000 }, | 920 true, false, 1240000000 }, |
| 921 { PasswordForm::SCHEME_HTML, "https://dont.remember.com/", | 921 { PasswordForm::SCHEME_HTML, "https://dont.remember.com/", |
| 922 "https://dont.remember.com/", | 922 "https://dont.remember.com/", |
| 923 "https://dont.remember.com/handlepage_secure.cgi", | 923 "https://dont.remember.com/handlepage_secure.cgi", |
| 924 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", | 924 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", |
| 925 true, false, 1240000000 }, | 925 true, false, 1240000000 }, |
| 926 }; | 926 }; |
| 927 std::vector<PasswordForm*> database_forms; | 927 std::vector<PasswordForm*> database_forms; |
| 928 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(db_data); ++i) { | 928 for (unsigned int i = 0; i < arraysize(db_data); ++i) { |
| 929 database_forms.push_back(CreatePasswordFormFromData(db_data[i])); | 929 database_forms.push_back(CreatePasswordFormFromData(db_data[i])); |
| 930 } | 930 } |
| 931 std::vector<PasswordForm*> merged_forms = | 931 std::vector<PasswordForm*> merged_forms = |
| 932 internal_keychain_helpers::GetPasswordsForForms(*keychain_, | 932 internal_keychain_helpers::GetPasswordsForForms(*keychain_, |
| 933 &database_forms); | 933 &database_forms); |
| 934 EXPECT_EQ(2U, database_forms.size()); | 934 EXPECT_EQ(2U, database_forms.size()); |
| 935 ASSERT_EQ(0U, merged_forms.size()); | 935 ASSERT_EQ(0U, merged_forms.size()); |
| 936 | 936 |
| 937 STLDeleteElements(&database_forms); | 937 STLDeleteElements(&database_forms); |
| 938 STLDeleteElements(&merged_forms); | 938 STLDeleteElements(&merged_forms); |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 // Update a password that doesn't exist in either location. This tests the | 1148 // Update a password that doesn't exist in either location. This tests the |
| 1149 // case where a form is filled, then the stored login is removed, then the | 1149 // case where a form is filled, then the stored login is removed, then the |
| 1150 // form is submitted. | 1150 // form is submitted. |
| 1151 { { PasswordForm::SCHEME_HTML, "http://different.com/", | 1151 { { PasswordForm::SCHEME_HTML, "http://different.com/", |
| 1152 "http://different.com/index.html", "login.cgi", | 1152 "http://different.com/index.html", "login.cgi", |
| 1153 L"username", L"password", L"submit", L"abc", L"123", | 1153 L"username", L"password", L"submit", L"abc", L"123", |
| 1154 true, false, 2 }, | 1154 true, false, 2 }, |
| 1155 NULL, | 1155 NULL, |
| 1156 }, | 1156 }, |
| 1157 }; | 1157 }; |
| 1158 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(updates); ++i) { | 1158 for (unsigned int i = 0; i < arraysize(updates); ++i) { |
| 1159 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData( | 1159 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData( |
| 1160 updates[i].form_data)); | 1160 updates[i].form_data)); |
| 1161 store_->UpdateLogin(*form); | 1161 store_->UpdateLogin(*form); |
| 1162 } | 1162 } |
| 1163 | 1163 |
| 1164 WaitForStoreUpdate(); | 1164 WaitForStoreUpdate(); |
| 1165 | 1165 |
| 1166 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); | 1166 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); |
| 1167 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(updates); ++i) { | 1167 for (unsigned int i = 0; i < arraysize(updates); ++i) { |
| 1168 scoped_ptr<PasswordForm> query_form( | 1168 scoped_ptr<PasswordForm> query_form( |
| 1169 CreatePasswordFormFromData(updates[i].form_data)); | 1169 CreatePasswordFormFromData(updates[i].form_data)); |
| 1170 | 1170 |
| 1171 std::vector<PasswordForm*> matching_items = | 1171 std::vector<PasswordForm*> matching_items = |
| 1172 keychain_adapter.PasswordsFillingForm(query_form->signon_realm, | 1172 keychain_adapter.PasswordsFillingForm(query_form->signon_realm, |
| 1173 query_form->scheme); | 1173 query_form->scheme); |
| 1174 if (updates[i].password) { | 1174 if (updates[i].password) { |
| 1175 EXPECT_GT(matching_items.size(), 0U) << "iteration " << i; | 1175 EXPECT_GT(matching_items.size(), 0U) << "iteration " << i; |
| 1176 if (matching_items.size() >= 1) | 1176 if (matching_items.size() >= 1) |
| 1177 EXPECT_EQ(ASCIIToUTF16(updates[i].password), | 1177 EXPECT_EQ(ASCIIToUTF16(updates[i].password), |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1436 ASSERT_EQ(1u, matching_items.size()); | 1436 ASSERT_EQ(1u, matching_items.size()); |
| 1437 EXPECT_EQ(ASCIIToUTF16("joe_user"), matching_items[0]->username_value); | 1437 EXPECT_EQ(ASCIIToUTF16("joe_user"), matching_items[0]->username_value); |
| 1438 matching_items.clear(); | 1438 matching_items.clear(); |
| 1439 | 1439 |
| 1440 // Check the third-party password is still there. | 1440 // Check the third-party password is still there. |
| 1441 owned_keychain_adapter.SetFindsOnlyOwnedItems(false); | 1441 owned_keychain_adapter.SetFindsOnlyOwnedItems(false); |
| 1442 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( | 1442 matching_items.get() = owned_keychain_adapter.PasswordsFillingForm( |
| 1443 "http://some.domain.com/insecure.html", PasswordForm::SCHEME_HTML); | 1443 "http://some.domain.com/insecure.html", PasswordForm::SCHEME_HTML); |
| 1444 ASSERT_EQ(1u, matching_items.size()); | 1444 ASSERT_EQ(1u, matching_items.size()); |
| 1445 } | 1445 } |
| OLD | NEW |