Chromium Code Reviews| 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 <stdarg.h> | 5 #include <stdarg.h> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/prefs/pref_service.h" | 8 #include "base/prefs/pref_service.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 form_facebook_.signon_realm = "http://www.facebook.com/"; | 317 form_facebook_.signon_realm = "http://www.facebook.com/"; |
| 318 | 318 |
| 319 form_isc_.origin = GURL("http://www.isc.org/"); | 319 form_isc_.origin = GURL("http://www.isc.org/"); |
| 320 form_isc_.action = GURL("http://www.isc.org/auth"); | 320 form_isc_.action = GURL("http://www.isc.org/auth"); |
| 321 form_isc_.username_element = UTF8ToUTF16("id"); | 321 form_isc_.username_element = UTF8ToUTF16("id"); |
| 322 form_isc_.username_value = UTF8ToUTF16("janedoe"); | 322 form_isc_.username_value = UTF8ToUTF16("janedoe"); |
| 323 form_isc_.password_element = UTF8ToUTF16("passwd"); | 323 form_isc_.password_element = UTF8ToUTF16("passwd"); |
| 324 form_isc_.password_value = UTF8ToUTF16("ihazabukkit"); | 324 form_isc_.password_value = UTF8ToUTF16("ihazabukkit"); |
| 325 form_isc_.submit_element = UTF8ToUTF16("login"); | 325 form_isc_.submit_element = UTF8ToUTF16("login"); |
| 326 form_isc_.signon_realm = "http://www.isc.org/"; | 326 form_isc_.signon_realm = "http://www.isc.org/"; |
| 327 | |
| 328 basic_auth_.origin = GURL("http://www.example.com/"); | |
| 329 basic_auth_.username_value = UTF8ToUTF16("username"); | |
| 330 basic_auth_.password_value = UTF8ToUTF16("pass"); | |
| 331 basic_auth_.signon_realm = "http://www.example.com/Realm"; | |
| 332 basic_auth_.scheme = PasswordForm::SCHEME_BASIC; | |
| 327 } | 333 } |
| 328 | 334 |
| 329 virtual void TearDown() { | 335 virtual void TearDown() { |
| 330 base::MessageLoop::current()->PostTask(FROM_HERE, | 336 base::MessageLoop::current()->PostTask(FROM_HERE, |
| 331 base::MessageLoop::QuitClosure()); | 337 base::MessageLoop::QuitClosure()); |
| 332 base::MessageLoop::current()->Run(); | 338 base::MessageLoop::current()->Run(); |
| 333 db_thread_.Stop(); | 339 db_thread_.Stop(); |
| 334 } | 340 } |
| 335 | 341 |
| 336 void RunBothThreads() { | 342 void RunBothThreads() { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 CheckUint32Attribute(item, "scheme", form.scheme); | 406 CheckUint32Attribute(item, "scheme", form.scheme); |
| 401 CheckStringAttribute(item, "application", app_string); | 407 CheckStringAttribute(item, "application", app_string); |
| 402 } | 408 } |
| 403 | 409 |
| 404 // Saves |credentials| and then gets login for origin and realm |url|. Returns | 410 // Saves |credentials| and then gets login for origin and realm |url|. Returns |
| 405 // true when something is found, and in such case copies the result to | 411 // true when something is found, and in such case copies the result to |
| 406 // |result| when |result| is not NULL. (Note that there can be max. 1 result, | 412 // |result| when |result| is not NULL. (Note that there can be max. 1 result, |
| 407 // derived from |credentials|.) | 413 // derived from |credentials|.) |
| 408 bool CheckCredentialAvailability(const PasswordForm& credentials, | 414 bool CheckCredentialAvailability(const PasswordForm& credentials, |
| 409 const GURL& url, | 415 const GURL& url, |
| 416 const std::string& realm, | |
|
vabr (Chromium)
2014/05/07 07:57:38
Please explain the meaning of |realm| in the comme
Garrett Casto
2014/05/08 20:01:20
Done.
| |
| 410 PasswordForm* result) { | 417 PasswordForm* result) { |
| 411 NativeBackendGnome backend(321); | 418 NativeBackendGnome backend(321); |
| 412 backend.Init(); | 419 backend.Init(); |
| 413 | 420 |
| 414 BrowserThread::PostTask( | 421 BrowserThread::PostTask( |
| 415 BrowserThread::DB, | 422 BrowserThread::DB, |
| 416 FROM_HERE, | 423 FROM_HERE, |
| 417 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), | 424 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), |
| 418 base::Unretained(&backend), | 425 base::Unretained(&backend), |
| 419 credentials)); | 426 credentials)); |
| 420 | 427 |
| 421 PasswordForm target_form; | 428 PasswordForm target_form; |
| 422 target_form.origin = url; | 429 target_form.origin = url; |
| 423 target_form.signon_realm = url.spec(); | 430 target_form.signon_realm = url.spec(); |
| 431 if (!realm.empty()) { | |
| 432 target_form.signon_realm.append(realm); | |
| 433 target_form.scheme = PasswordForm::SCHEME_BASIC; | |
| 434 } | |
| 424 std::vector<PasswordForm*> form_list; | 435 std::vector<PasswordForm*> form_list; |
| 425 BrowserThread::PostTask( | 436 BrowserThread::PostTask( |
| 426 BrowserThread::DB, | 437 BrowserThread::DB, |
| 427 FROM_HERE, | 438 FROM_HERE, |
| 428 base::Bind(base::IgnoreResult(&NativeBackendGnome::GetLogins), | 439 base::Bind(base::IgnoreResult(&NativeBackendGnome::GetLogins), |
| 429 base::Unretained(&backend), | 440 base::Unretained(&backend), |
| 430 target_form, | 441 target_form, |
| 431 &form_list)); | 442 &form_list)); |
| 432 | 443 |
| 433 RunBothThreads(); | 444 RunBothThreads(); |
| 434 | 445 |
| 435 EXPECT_EQ(1u, mock_keyring_items.size()); | 446 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 436 if (mock_keyring_items.size() > 0) | 447 if (mock_keyring_items.size() > 0) |
| 437 CheckMockKeyringItem(&mock_keyring_items[0], credentials, "chrome-321"); | 448 CheckMockKeyringItem(&mock_keyring_items[0], credentials, "chrome-321"); |
| 449 mock_keyring_items.clear(); | |
| 438 | 450 |
| 439 if (form_list.empty()) | 451 if (form_list.empty()) |
| 440 return false; | 452 return false; |
| 441 EXPECT_EQ(1u, form_list.size()); | 453 EXPECT_EQ(1u, form_list.size()); |
| 442 if (result) | 454 if (result) |
| 443 *result = *form_list[0]; | 455 *result = *form_list[0]; |
| 444 STLDeleteElements(&form_list); | 456 STLDeleteElements(&form_list); |
| 445 return true; | 457 return true; |
| 446 } | 458 } |
| 447 | 459 |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 565 } | 577 } |
| 566 | 578 |
| 567 base::MessageLoopForUI message_loop_; | 579 base::MessageLoopForUI message_loop_; |
| 568 content::TestBrowserThread ui_thread_; | 580 content::TestBrowserThread ui_thread_; |
| 569 content::TestBrowserThread db_thread_; | 581 content::TestBrowserThread db_thread_; |
| 570 | 582 |
| 571 // Provide some test forms to avoid having to set them up in each test. | 583 // Provide some test forms to avoid having to set them up in each test. |
| 572 PasswordForm form_google_; | 584 PasswordForm form_google_; |
| 573 PasswordForm form_facebook_; | 585 PasswordForm form_facebook_; |
| 574 PasswordForm form_isc_; | 586 PasswordForm form_isc_; |
| 587 PasswordForm basic_auth_; | |
| 575 }; | 588 }; |
| 576 | 589 |
| 577 TEST_F(NativeBackendGnomeTest, BasicAddLogin) { | 590 TEST_F(NativeBackendGnomeTest, BasicAddLogin) { |
| 578 NativeBackendGnome backend(42); | 591 NativeBackendGnome backend(42); |
| 579 backend.Init(); | 592 backend.Init(); |
| 580 | 593 |
| 581 BrowserThread::PostTask( | 594 BrowserThread::PostTask( |
| 582 BrowserThread::DB, FROM_HERE, | 595 BrowserThread::DB, FROM_HERE, |
| 583 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), | 596 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), |
| 584 base::Unretained(&backend), form_google_)); | 597 base::Unretained(&backend), form_google_)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 616 if (mock_keyring_items.size() > 0) | 629 if (mock_keyring_items.size() > 0) |
| 617 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 630 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 618 } | 631 } |
| 619 | 632 |
| 620 // Save a password for www.facebook.com and see it suggested for m.facebook.com. | 633 // Save a password for www.facebook.com and see it suggested for m.facebook.com. |
| 621 TEST_F(NativeBackendGnomeTest, PSLMatchingPositive) { | 634 TEST_F(NativeBackendGnomeTest, PSLMatchingPositive) { |
| 622 PasswordForm result; | 635 PasswordForm result; |
| 623 const GURL kMobileURL("http://m.facebook.com/"); | 636 const GURL kMobileURL("http://m.facebook.com/"); |
| 624 password_manager::PSLMatchingHelper helper; | 637 password_manager::PSLMatchingHelper helper; |
| 625 ASSERT_TRUE(helper.IsMatchingEnabled()); | 638 ASSERT_TRUE(helper.IsMatchingEnabled()); |
| 626 EXPECT_TRUE(CheckCredentialAvailability(form_facebook_, kMobileURL, &result)); | 639 EXPECT_TRUE(CheckCredentialAvailability( |
| 640 form_facebook_, kMobileURL, "", &result)); | |
| 627 EXPECT_EQ(kMobileURL, result.origin); | 641 EXPECT_EQ(kMobileURL, result.origin); |
| 628 EXPECT_EQ(kMobileURL.spec(), result.signon_realm); | 642 EXPECT_EQ(kMobileURL.spec(), result.signon_realm); |
| 629 } | 643 } |
| 630 | 644 |
| 631 // Save a password for www.facebook.com and see it not suggested for | 645 // Save a password for www.facebook.com and see it not suggested for |
| 632 // m-facebook.com. | 646 // m-facebook.com. |
| 633 TEST_F(NativeBackendGnomeTest, PSLMatchingNegativeDomainMismatch) { | 647 TEST_F(NativeBackendGnomeTest, PSLMatchingNegativeDomainMismatch) { |
| 634 password_manager::PSLMatchingHelper helper; | 648 password_manager::PSLMatchingHelper helper; |
| 635 ASSERT_TRUE(helper.IsMatchingEnabled()); | 649 ASSERT_TRUE(helper.IsMatchingEnabled()); |
| 636 EXPECT_FALSE(CheckCredentialAvailability( | 650 EXPECT_FALSE(CheckCredentialAvailability( |
| 637 form_facebook_, GURL("http://m-facebook.com/"), NULL)); | 651 form_facebook_, GURL("http://m-facebook.com/"), "", NULL)); |
| 638 } | 652 } |
| 639 | 653 |
| 640 // Test PSL matching is off for domains excluded from it. | 654 // Test PSL matching is off for domains excluded from it. |
| 641 TEST_F(NativeBackendGnomeTest, PSLMatchingDisabledDomains) { | 655 TEST_F(NativeBackendGnomeTest, PSLMatchingDisabledDomains) { |
| 642 password_manager::PSLMatchingHelper helper; | 656 password_manager::PSLMatchingHelper helper; |
| 643 ASSERT_TRUE(helper.IsMatchingEnabled()); | 657 ASSERT_TRUE(helper.IsMatchingEnabled()); |
| 644 EXPECT_FALSE(CheckCredentialAvailability( | 658 EXPECT_FALSE(CheckCredentialAvailability( |
| 645 form_google_, GURL("http://one.google.com/"), NULL)); | 659 form_google_, GURL("http://one.google.com/"), "", NULL)); |
| 660 } | |
| 661 | |
| 662 // Make sure PSL matches aren't available for non-HTML forms. | |
| 663 TEST_F(NativeBackendGnomeTest, PSLMatchingDisabledForNonHTMLForms) { | |
|
vabr (Chromium)
2014/05/07 07:57:38
The code change applies to all possible schemes, b
Garrett Casto
2014/05/08 20:01:20
Done.
| |
| 664 password_manager::PSLMatchingHelper helper; | |
| 665 ASSERT_TRUE(helper.IsMatchingEnabled()); | |
| 666 // Don't match basic auth form with an HTML form. | |
| 667 EXPECT_FALSE(CheckCredentialAvailability( | |
| 668 basic_auth_, GURL("http://www.example.com"), "", NULL)); | |
| 669 // Don't match an HTML form with a basic auth form. | |
| 670 EXPECT_FALSE(CheckCredentialAvailability( | |
| 671 form_google_, GURL("http://www.google.com/"), "Realm", NULL)); | |
| 672 // Don't match two different basic auth forms with different origin. | |
| 673 EXPECT_FALSE(CheckCredentialAvailability( | |
| 674 basic_auth_, GURL("http://first.example.com"), "Realm", NULL)); | |
| 646 } | 675 } |
| 647 | 676 |
| 648 TEST_F(NativeBackendGnomeTest, PSLUpdatingStrictUpdateLogin) { | 677 TEST_F(NativeBackendGnomeTest, PSLUpdatingStrictUpdateLogin) { |
| 649 CheckPSLUpdate(UPDATE_BY_UPDATELOGIN); | 678 CheckPSLUpdate(UPDATE_BY_UPDATELOGIN); |
| 650 } | 679 } |
| 651 | 680 |
| 652 TEST_F(NativeBackendGnomeTest, PSLUpdatingStrictAddLogin) { | 681 TEST_F(NativeBackendGnomeTest, PSLUpdatingStrictAddLogin) { |
| 653 // TODO(vabr): if AddLogin becomes no longer valid for existing logins, then | 682 // TODO(vabr): if AddLogin becomes no longer valid for existing logins, then |
| 654 // just delete this test. | 683 // just delete this test. |
| 655 CheckPSLUpdate(UPDATE_BY_ADDLOGIN); | 684 CheckPSLUpdate(UPDATE_BY_ADDLOGIN); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 801 // Quick check that we got two results back. | 830 // Quick check that we got two results back. |
| 802 EXPECT_EQ(2u, form_list.size()); | 831 EXPECT_EQ(2u, form_list.size()); |
| 803 STLDeleteElements(&form_list); | 832 STLDeleteElements(&form_list); |
| 804 | 833 |
| 805 EXPECT_EQ(1u, mock_keyring_items.size()); | 834 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 806 if (mock_keyring_items.size() > 0) | 835 if (mock_keyring_items.size() > 0) |
| 807 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 836 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 808 } | 837 } |
| 809 | 838 |
| 810 // TODO(mdm): add more basic tests here at some point. | 839 // TODO(mdm): add more basic tests here at some point. |
| OLD | NEW |