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 |