Index: chrome/browser/password_manager/password_store_mac_unittest.cc |
diff --git a/chrome/browser/password_manager/password_store_mac_unittest.cc b/chrome/browser/password_manager/password_store_mac_unittest.cc |
index 28fed75a9efcbb7b97119e5983f1177151145400..4c7257ce1f0a186980cd897168a5c49684d56b0a 100644 |
--- a/chrome/browser/password_manager/password_store_mac_unittest.cc |
+++ b/chrome/browser/password_manager/password_store_mac_unittest.cc |
@@ -280,7 +280,7 @@ TEST_F(PasswordStoreMacInternalsTest, TestKeychainToFormTranslation) { |
reinterpret_cast<SecKeychainItemRef>(i + 1); |
PasswordForm form; |
bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
- *keychain_, keychain_item, &form); |
+ *keychain_, keychain_item, &form, true); |
EXPECT_TRUE(parsed) << "In iteration " << i; |
@@ -319,7 +319,7 @@ TEST_F(PasswordStoreMacInternalsTest, TestKeychainToFormTranslation) { |
SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(99); |
PasswordForm form; |
bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
- *keychain_, keychain_item, &form); |
+ *keychain_, keychain_item, &form, true); |
EXPECT_FALSE(parsed); |
} |
} |
@@ -388,8 +388,21 @@ TEST_F(PasswordStoreMacInternalsTest, TestKeychainSearch) { |
// Check matches treating the form as a merging target. |
EXPECT_EQ(test_data[i].expected_merge_matches > 0, |
keychain_adapter.HasPasswordsMergeableWithForm(*query_form)); |
- matching_items = keychain_adapter.PasswordsMergeableWithForm(*query_form); |
+ std::vector<SecKeychainItemRef> keychain_items; |
+ std::vector<internal_keychain_helpers::ItemFormPair> item_form_pairs = |
+ internal_keychain_helpers:: |
+ ExtractAllKeychainItemAttributesIntoPasswordForms(&keychain_items, |
+ *keychain_); |
+ matching_items = |
+ internal_keychain_helpers::ExtractPasswordsMergeableWithForm( |
+ *keychain_, item_form_pairs, *query_form); |
EXPECT_EQ(test_data[i].expected_merge_matches, matching_items.size()); |
+ STLDeleteContainerPairSecondPointers(item_form_pairs.begin(), |
+ item_form_pairs.end()); |
+ for (std::vector<SecKeychainItemRef>::iterator i = keychain_items.begin(); |
+ i != keychain_items.end(); ++i) { |
+ keychain_->Free(*i); |
+ } |
STLDeleteElements(&matching_items); |
// None of the pre-seeded items are owned by us, so none should match an |
@@ -558,7 +571,8 @@ TEST_F(PasswordStoreMacInternalsTest, TestKeychainAdd) { |
PasswordForm stored_form; |
internal_keychain_helpers::FillPasswordFormFromKeychainItem(*keychain_, |
keychain_item, |
- &stored_form); |
+ &stored_form, |
+ true); |
EXPECT_EQ(update_form->password_value, stored_form.password_value); |
} |
} |
@@ -862,6 +876,107 @@ TEST_F(PasswordStoreMacInternalsTest, TestPasswordBulkLookup) { |
STLDeleteElements(&merged_forms); |
} |
+TEST_F(PasswordStoreMacInternalsTest, TestBlacklistedFiltering) { |
+ PasswordFormData db_data[] = { |
+ { PasswordForm::SCHEME_HTML, "http://dont.remember.com/", |
+ "http://dont.remember.com/", |
+ "http://dont.remember.com/handlepage.cgi", |
+ L"submit", L"username", L"password", L"joe_user", L"non_empty_password", |
+ true, false, 1240000000 }, |
+ { PasswordForm::SCHEME_HTML, "https://dont.remember.com/", |
+ "https://dont.remember.com/", |
+ "https://dont.remember.com/handlepage_secure.cgi", |
+ L"submit", L"username", L"password", L"joe_user", L"non_empty_password", |
+ true, false, 1240000000 }, |
+ }; |
+ std::vector<PasswordForm*> database_forms; |
+ for (unsigned int i = 0; i < ARRAYSIZE_UNSAFE(db_data); ++i) { |
+ database_forms.push_back(CreatePasswordFormFromData(db_data[i])); |
+ } |
+ std::vector<PasswordForm*> merged_forms = |
+ internal_keychain_helpers::GetPasswordsForForms(*keychain_, |
+ &database_forms); |
+ EXPECT_EQ(2U, database_forms.size()); |
+ ASSERT_EQ(0U, merged_forms.size()); |
+ |
+ STLDeleteElements(&database_forms); |
+ STLDeleteElements(&merged_forms); |
+} |
+ |
+TEST_F(PasswordStoreMacInternalsTest, TestFillPasswordFormFromKeychainItem) { |
+ // When |extract_password_data| is false, the password field must be empty, |
+ // and |blacklisted_by_user| must be false. |
+ SecKeychainItemRef keychain_item = reinterpret_cast<SecKeychainItemRef>(1); |
+ PasswordForm form_without_extracted_password; |
+ bool parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
+ *keychain_, |
+ keychain_item, |
+ &form_without_extracted_password, |
+ false); // Do not extract password. |
+ EXPECT_TRUE(parsed); |
+ ASSERT_TRUE(form_without_extracted_password.password_value.empty()); |
+ ASSERT_FALSE(form_without_extracted_password.blacklisted_by_user); |
+ |
+ // When |extract_password_data| is true and the keychain entry has a non-empty |
+ // password, the password field must be non-empty, and the value of |
+ // |blacklisted_by_user| must be false. |
+ keychain_item = reinterpret_cast<SecKeychainItemRef>(1); |
+ PasswordForm form_with_extracted_password; |
+ parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
+ *keychain_, |
+ keychain_item, |
+ &form_with_extracted_password, |
+ true); // Extract password. |
+ EXPECT_TRUE(parsed); |
+ ASSERT_EQ(ASCIIToUTF16("sekrit"), |
+ form_with_extracted_password.password_value); |
+ ASSERT_FALSE(form_with_extracted_password.blacklisted_by_user); |
+ |
+ // When |extract_password_data| is true and the keychain entry has an empty |
+ // username and password (""), the password field must be empty, and the value |
+ // of |blacklisted_by_user| must be true. |
+ keychain_item = reinterpret_cast<SecKeychainItemRef>(4); |
+ PasswordForm negative_form; |
+ parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
+ *keychain_, |
+ keychain_item, |
+ &negative_form, |
+ true); // Extract password. |
+ EXPECT_TRUE(parsed); |
+ ASSERT_TRUE(negative_form.username_value.empty()); |
+ ASSERT_TRUE(negative_form.password_value.empty()); |
+ ASSERT_TRUE(negative_form.blacklisted_by_user); |
+ |
+ // When |extract_password_data| is true and the keychain entry has an empty |
+ // password (""), the password field must be empty (""), and the value of |
+ // |blacklisted_by_user| must be true. |
+ keychain_item = reinterpret_cast<SecKeychainItemRef>(5); |
+ PasswordForm form_with_empty_password_a; |
+ parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
+ *keychain_, |
+ keychain_item, |
+ &form_with_empty_password_a, |
+ true); // Extract password. |
+ EXPECT_TRUE(parsed); |
+ ASSERT_TRUE(form_with_empty_password_a.password_value.empty()); |
+ ASSERT_TRUE(form_with_empty_password_a.blacklisted_by_user); |
+ |
+ // When |extract_password_data| is true and the keychain entry has a single |
+ // space password (" "), the password field must be a single space (" "), and |
+ // the value of |blacklisted_by_user| must be true. |
+ keychain_item = reinterpret_cast<SecKeychainItemRef>(6); |
+ PasswordForm form_with_empty_password_b; |
+ parsed = internal_keychain_helpers::FillPasswordFormFromKeychainItem( |
+ *keychain_, |
+ keychain_item, |
+ &form_with_empty_password_b, |
+ true); // Extract password. |
+ EXPECT_TRUE(parsed); |
+ ASSERT_EQ(ASCIIToUTF16(" "), |
+ form_with_empty_password_b.password_value); |
+ ASSERT_TRUE(form_with_empty_password_b.blacklisted_by_user); |
+} |
+ |
TEST_F(PasswordStoreMacInternalsTest, TestPasswordGetAll) { |
MacKeychainPasswordFormAdapter keychain_adapter(keychain_); |
MacKeychainPasswordFormAdapter owned_keychain_adapter(keychain_); |