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 "testing/gmock/include/gmock/gmock.h" | 5 #include "testing/gmock/include/gmock/gmock.h" |
6 #include "testing/gtest/include/gtest/gtest.h" | 6 #include "testing/gtest/include/gtest/gtest.h" |
7 | 7 |
8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 "http://a.server.com/", L"abc", L"123", false, | 273 "http://a.server.com/", L"abc", L"123", false, |
274 1601, 1, 1, 0, 0, 0 }, | 274 1601, 1, 1, 0, 0, 0 }, |
275 }; | 275 }; |
276 | 276 |
277 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(expected); ++i) { | 277 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(expected); ++i) { |
278 // Create our fake KeychainItemRef; see MockAppleKeychain docs. | 278 // Create our fake KeychainItemRef; see MockAppleKeychain docs. |
279 SecKeychainItemRef keychain_item = | 279 SecKeychainItemRef keychain_item = |
280 reinterpret_cast<SecKeychainItemRef>(i + 1); | 280 reinterpret_cast<SecKeychainItemRef>(i + 1); |
281 PasswordForm form; | 281 PasswordForm form; |
282 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( | 282 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
283 *keychain_, keychain_item, &form); | 283 *keychain_, keychain_item, &form, true); |
284 | 284 |
285 EXPECT_TRUE(parsed) << "In iteration " << i; | 285 EXPECT_TRUE(parsed) << "In iteration " << i; |
286 | 286 |
287 EXPECT_EQ(expected[i].scheme, form.scheme) << "In iteration " << i; | 287 EXPECT_EQ(expected[i].scheme, form.scheme) << "In iteration " << i; |
288 EXPECT_EQ(GURL(expected[i].origin), form.origin) << "In iteration " << i; | 288 EXPECT_EQ(GURL(expected[i].origin), form.origin) << "In iteration " << i; |
289 EXPECT_EQ(expected[i].ssl_valid, form.ssl_valid) << "In iteration " << i; | 289 EXPECT_EQ(expected[i].ssl_valid, form.ssl_valid) << "In iteration " << i; |
290 EXPECT_EQ(std::string(expected[i].signon_realm), form.signon_realm) | 290 EXPECT_EQ(std::string(expected[i].signon_realm), form.signon_realm) |
291 << "In iteration " << i; | 291 << "In iteration " << i; |
292 if (expected[i].username) { | 292 if (expected[i].username) { |
293 EXPECT_EQ(WideToUTF16(expected[i].username), form.username_value) | 293 EXPECT_EQ(WideToUTF16(expected[i].username), form.username_value) |
(...skipping 18 matching lines...) Expand all Loading... |
312 << "In iteration " << i; | 312 << "In iteration " << i; |
313 EXPECT_EQ(expected[i].creation_second, exploded_time.second) | 313 EXPECT_EQ(expected[i].creation_second, exploded_time.second) |
314 << "In iteration " << i; | 314 << "In iteration " << i; |
315 } | 315 } |
316 | 316 |
317 { | 317 { |
318 // Use an invalid ref, to make sure errors are reported. | 318 // Use an invalid ref, to make sure errors are reported. |
319 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(99); | 319 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(99); |
320 PasswordForm form; | 320 PasswordForm form; |
321 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( | 321 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
322 *keychain_, keychain_item, &form); | 322 *keychain_, keychain_item, &form, true); |
323 EXPECT_FALSE(parsed); | 323 EXPECT_FALSE(parsed); |
324 } | 324 } |
325 } | 325 } |
326 | 326 |
327 TEST_F(PasswordStoreMacInternalsTest, TestKeychainSearch) { | 327 TEST_F(PasswordStoreMacInternalsTest, TestKeychainSearch) { |
328 struct TestDataAndExpectation { | 328 struct TestDataAndExpectation { |
329 const PasswordFormData data; | 329 const PasswordFormData data; |
330 const size_t expected_fill_matches; | 330 const size_t expected_fill_matches; |
331 const size_t expected_merge_matches; | 331 const size_t expected_merge_matches; |
332 }; | 332 }; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 | 381 |
382 // Check matches treating the form as a fill target. | 382 // Check matches treating the form as a fill target. |
383 std::vector<PasswordForm*> matching_items = | 383 std::vector<PasswordForm*> matching_items = |
384 keychain_adapter.PasswordsFillingForm(*query_form); | 384 keychain_adapter.PasswordsFillingForm(*query_form); |
385 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size()); | 385 EXPECT_EQ(test_data[i].expected_fill_matches, matching_items.size()); |
386 STLDeleteElements(&matching_items); | 386 STLDeleteElements(&matching_items); |
387 | 387 |
388 // Check matches treating the form as a merging target. | 388 // Check matches treating the form as a merging target. |
389 EXPECT_EQ(test_data[i].expected_merge_matches > 0, | 389 EXPECT_EQ(test_data[i].expected_merge_matches > 0, |
390 keychain_adapter.HasPasswordsMergeableWithForm(*query_form)); | 390 keychain_adapter.HasPasswordsMergeableWithForm(*query_form)); |
391 matching_items = keychain_adapter.PasswordsMergeableWithForm(*query_form); | 391 std::vector<SecKeychainItemRef> keychain_items; |
| 392 std::vector<internal_keychain_helpers::ItemFormPair> item_form_pairs = |
| 393 internal_keychain_helpers:: |
| 394 ExtractAllKeychainItemAttributesIntoPasswordForms(&keychain_items, |
| 395 *keychain_); |
| 396 matching_items = |
| 397 internal_keychain_helpers::ExtractPasswordsMergeableWithForm( |
| 398 *keychain_, item_form_pairs, *query_form); |
392 EXPECT_EQ(test_data[i].expected_merge_matches, matching_items.size()); | 399 EXPECT_EQ(test_data[i].expected_merge_matches, matching_items.size()); |
| 400 STLDeleteContainerPairSecondPointers(item_form_pairs.begin(), |
| 401 item_form_pairs.end()); |
| 402 for (std::vector<SecKeychainItemRef>::iterator i = keychain_items.begin(); |
| 403 i != keychain_items.end(); ++i) { |
| 404 keychain_->Free(*i); |
| 405 } |
393 STLDeleteElements(&matching_items); | 406 STLDeleteElements(&matching_items); |
394 | 407 |
395 // None of the pre-seeded items are owned by us, so none should match an | 408 // None of the pre-seeded items are owned by us, so none should match an |
396 // owned-passwords-only search. | 409 // owned-passwords-only search. |
397 matching_items = owned_keychain_adapter.PasswordsFillingForm(*query_form); | 410 matching_items = owned_keychain_adapter.PasswordsFillingForm(*query_form); |
398 EXPECT_EQ(0U, matching_items.size()); | 411 EXPECT_EQ(0U, matching_items.size()); |
399 STLDeleteElements(&matching_items); | 412 STLDeleteElements(&matching_items); |
400 } | 413 } |
401 } | 414 } |
402 | 415 |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 "http://some.domain.com/insecure.html", NULL, | 564 "http://some.domain.com/insecure.html", NULL, |
552 NULL, NULL, NULL, L"joe_user", L"updated_password", false, false, 0 | 565 NULL, NULL, NULL, L"joe_user", L"updated_password", false, false, 0 |
553 }; | 566 }; |
554 scoped_ptr<PasswordForm> update_form(CreatePasswordFormFromData(data)); | 567 scoped_ptr<PasswordForm> update_form(CreatePasswordFormFromData(data)); |
555 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); | 568 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); |
556 EXPECT_TRUE(keychain_adapter.AddPassword(*update_form)); | 569 EXPECT_TRUE(keychain_adapter.AddPassword(*update_form)); |
557 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(2); | 570 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(2); |
558 PasswordForm stored_form; | 571 PasswordForm stored_form; |
559 internal_keychain_helpers::FillPasswordFormFromKeychainItem(*keychain_, | 572 internal_keychain_helpers::FillPasswordFormFromKeychainItem(*keychain_, |
560 keychain_item, | 573 keychain_item, |
561 &stored_form); | 574 &stored_form, |
| 575 true); |
562 EXPECT_EQ(update_form->password_value, stored_form.password_value); | 576 EXPECT_EQ(update_form->password_value, stored_form.password_value); |
563 } | 577 } |
564 } | 578 } |
565 | 579 |
566 TEST_F(PasswordStoreMacInternalsTest, TestKeychainRemove) { | 580 TEST_F(PasswordStoreMacInternalsTest, TestKeychainRemove) { |
567 struct TestDataAndExpectation { | 581 struct TestDataAndExpectation { |
568 PasswordFormData data; | 582 PasswordFormData data; |
569 bool should_succeed; | 583 bool should_succeed; |
570 }; | 584 }; |
571 TestDataAndExpectation test_data[] = { | 585 TestDataAndExpectation test_data[] = { |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
855 EXPECT_EQ(2U, database_forms.size()); | 869 EXPECT_EQ(2U, database_forms.size()); |
856 ASSERT_EQ(3U, merged_forms.size()); | 870 ASSERT_EQ(3U, merged_forms.size()); |
857 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value); | 871 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[0]->password_value); |
858 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value); | 872 EXPECT_EQ(ASCIIToUTF16("sekrit"), merged_forms[1]->password_value); |
859 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user); | 873 EXPECT_TRUE(merged_forms[2]->blacklisted_by_user); |
860 | 874 |
861 STLDeleteElements(&database_forms); | 875 STLDeleteElements(&database_forms); |
862 STLDeleteElements(&merged_forms); | 876 STLDeleteElements(&merged_forms); |
863 } | 877 } |
864 | 878 |
| 879 TEST_F(PasswordStoreMacInternalsTest, TestBlacklistedFiltering) { |
| 880 PasswordFormData db_data[] = { |
| 881 { PasswordForm::SCHEME_HTML, "http://dont.remember.com/", |
| 882 "http://dont.remember.com/", |
| 883 "http://dont.remember.com/handlepage.cgi", |
| 884 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", |
| 885 true, false, 1240000000 }, |
| 886 { PasswordForm::SCHEME_HTML, "https://dont.remember.com/", |
| 887 "https://dont.remember.com/", |
| 888 "https://dont.remember.com/handlepage_secure.cgi", |
| 889 L"submit", L"username", L"password", L"joe_user", L"non_empty_password", |
| 890 true, false, 1240000000 }, |
| 891 }; |
| 892 std::vector<PasswordForm*> database_forms; |
| 893 for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(db_data); ++i) { |
| 894 database_forms.push_back(CreatePasswordFormFromData(db_data[i])); |
| 895 } |
| 896 std::vector<PasswordForm*> merged_forms = |
| 897 internal_keychain_helpers::GetPasswordsForForms(*keychain_, |
| 898 &database_forms); |
| 899 EXPECT_EQ(2U, database_forms.size()); |
| 900 ASSERT_EQ(0U, merged_forms.size()); |
| 901 |
| 902 STLDeleteElements(&database_forms); |
| 903 STLDeleteElements(&merged_forms); |
| 904 } |
| 905 |
| 906 TEST_F(PasswordStoreMacInternalsTest, TestFillPasswordFormFromKeychainItem) { |
| 907 // When |extract_password_data| is false, the password field must be empty, |
| 908 // and |blacklisted_by_user| must be false. |
| 909 SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(1); |
| 910 PasswordForm form_without_extracted_password; |
| 911 bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
| 912 *keychain_, |
| 913 keychain_item, |
| 914 &form_without_extracted_password, |
| 915 false); // Do not extract password. |
| 916 EXPECT_TRUE(parsed); |
| 917 ASSERT_TRUE(form_without_extracted_password.password_value.empty()); |
| 918 ASSERT_FALSE(form_without_extracted_password.blacklisted_by_user); |
| 919 |
| 920 // When |extract_password_data| is true and the keychain entry has a non-empty |
| 921 // password, the password field must be non-empty, and the value of |
| 922 // |blacklisted_by_user| must be false. |
| 923 keychain_item = reinterpret_cast<SecKeychainItemRef>(1); |
| 924 PasswordForm form_with_extracted_password; |
| 925 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
| 926 *keychain_, |
| 927 keychain_item, |
| 928 &form_with_extracted_password, |
| 929 true); // Extract password. |
| 930 EXPECT_TRUE(parsed); |
| 931 ASSERT_EQ(ASCIIToUTF16("sekrit"), |
| 932 form_with_extracted_password.password_value); |
| 933 ASSERT_FALSE(form_with_extracted_password.blacklisted_by_user); |
| 934 |
| 935 // When |extract_password_data| is true and the keychain entry has an empty |
| 936 // username and password (""), the password field must be empty, and the value |
| 937 // of |blacklisted_by_user| must be true. |
| 938 keychain_item = reinterpret_cast<SecKeychainItemRef>(4); |
| 939 PasswordForm negative_form; |
| 940 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
| 941 *keychain_, |
| 942 keychain_item, |
| 943 &negative_form, |
| 944 true); // Extract password. |
| 945 EXPECT_TRUE(parsed); |
| 946 ASSERT_TRUE(negative_form.username_value.empty()); |
| 947 ASSERT_TRUE(negative_form.password_value.empty()); |
| 948 ASSERT_TRUE(negative_form.blacklisted_by_user); |
| 949 |
| 950 // When |extract_password_data| is true and the keychain entry has an empty |
| 951 // password (""), the password field must be empty (""), and the value of |
| 952 // |blacklisted_by_user| must be true. |
| 953 keychain_item = reinterpret_cast<SecKeychainItemRef>(5); |
| 954 PasswordForm form_with_empty_password_a; |
| 955 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
| 956 *keychain_, |
| 957 keychain_item, |
| 958 &form_with_empty_password_a, |
| 959 true); // Extract password. |
| 960 EXPECT_TRUE(parsed); |
| 961 ASSERT_TRUE(form_with_empty_password_a.password_value.empty()); |
| 962 ASSERT_TRUE(form_with_empty_password_a.blacklisted_by_user); |
| 963 |
| 964 // When |extract_password_data| is true and the keychain entry has a single |
| 965 // space password (" "), the password field must be a single space (" "), and |
| 966 // the value of |blacklisted_by_user| must be true. |
| 967 keychain_item = reinterpret_cast<SecKeychainItemRef>(6); |
| 968 PasswordForm form_with_empty_password_b; |
| 969 parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
| 970 *keychain_, |
| 971 keychain_item, |
| 972 &form_with_empty_password_b, |
| 973 true); // Extract password. |
| 974 EXPECT_TRUE(parsed); |
| 975 ASSERT_EQ(ASCIIToUTF16(" "), |
| 976 form_with_empty_password_b.password_value); |
| 977 ASSERT_TRUE(form_with_empty_password_b.blacklisted_by_user); |
| 978 } |
| 979 |
865 TEST_F(PasswordStoreMacInternalsTest, TestPasswordGetAll) { | 980 TEST_F(PasswordStoreMacInternalsTest, TestPasswordGetAll) { |
866 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); | 981 MacKeychainPasswordFormAdapter keychain_adapter(keychain_); |
867 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); | 982 MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); |
868 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); | 983 owned_keychain_adapter.SetFindsOnlyOwnedItems(true); |
869 | 984 |
870 // Add a few passwords of various types so that we own some. | 985 // Add a few passwords of various types so that we own some. |
871 PasswordFormData owned_password_data[] = { | 986 PasswordFormData owned_password_data[] = { |
872 { PasswordForm::SCHEME_HTML, "http://web.site.com/", | 987 { PasswordForm::SCHEME_HTML, "http://web.site.com/", |
873 "http://web.site.com/path/to/page.html", NULL, NULL, NULL, NULL, | 988 "http://web.site.com/path/to/page.html", NULL, NULL, NULL, NULL, |
874 L"anonymous", L"knock-knock", false, false, 0 }, | 989 L"anonymous", L"knock-knock", false, false, 0 }, |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1021 EXPECT_EQ(0U, matching_items.size()) << "iteration " << i; | 1136 EXPECT_EQ(0U, matching_items.size()) << "iteration " << i; |
1022 } | 1137 } |
1023 STLDeleteElements(&matching_items); | 1138 STLDeleteElements(&matching_items); |
1024 | 1139 |
1025 login_db_->GetLogins(*query_form, &matching_items); | 1140 login_db_->GetLogins(*query_form, &matching_items); |
1026 EXPECT_EQ(updates[i].password ? 1U : 0U, matching_items.size()) | 1141 EXPECT_EQ(updates[i].password ? 1U : 0U, matching_items.size()) |
1027 << "iteration " << i; | 1142 << "iteration " << i; |
1028 STLDeleteElements(&matching_items); | 1143 STLDeleteElements(&matching_items); |
1029 } | 1144 } |
1030 } | 1145 } |
OLD | NEW |