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 "net/cookies/canonical_cookie.h" | 5 #include "net/cookies/canonical_cookie.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/test/histogram_tester.h" | 10 #include "base/test/histogram_tester.h" |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 COOKIE_PRIORITY_DEFAULT)); | 37 COOKIE_PRIORITY_DEFAULT)); |
| 38 EXPECT_EQ("A", cookie2->Name()); | 38 EXPECT_EQ("A", cookie2->Name()); |
| 39 EXPECT_EQ("2", cookie2->Value()); | 39 EXPECT_EQ("2", cookie2->Value()); |
| 40 EXPECT_EQ(".www.example.com", cookie2->Domain()); | 40 EXPECT_EQ(".www.example.com", cookie2->Domain()); |
| 41 EXPECT_EQ("/", cookie2->Path()); | 41 EXPECT_EQ("/", cookie2->Path()); |
| 42 EXPECT_FALSE(cookie2->IsSecure()); | 42 EXPECT_FALSE(cookie2->IsSecure()); |
| 43 EXPECT_FALSE(cookie2->IsHttpOnly()); | 43 EXPECT_FALSE(cookie2->IsHttpOnly()); |
| 44 EXPECT_EQ(CookieSameSite::NO_RESTRICTION, cookie2->SameSite()); | 44 EXPECT_EQ(CookieSameSite::NO_RESTRICTION, cookie2->SameSite()); |
| 45 } | 45 } |
| 46 | 46 |
| 47 TEST(CanonicalCookie, CreateConstraints) { | |
|
mmenke
2017/06/15 21:30:24
What's this supposed to check? Space in the name?
Randy Smith (Not in Mondays)
2017/06/16 15:25:21
Changed to "SpaceInName".
(When I first wrote it
| |
| 48 GURL url("http://www.example.com/test/foo.html"); | |
| 49 base::Time creation_time = base::Time::Now(); | |
| 50 CookieOptions options; | |
| 51 std::unique_ptr<CanonicalCookie> cookie( | |
| 52 CanonicalCookie::Create(url, "A C=2", creation_time, options)); | |
| 53 EXPECT_TRUE(cookie.get()); | |
| 54 EXPECT_EQ("A C", cookie->Name()); | |
| 55 } | |
| 56 | |
| 47 TEST(CanonicalCookieTest, Create) { | 57 TEST(CanonicalCookieTest, Create) { |
| 48 // Test creating cookies from a cookie string. | 58 // Test creating cookies from a cookie string. |
| 49 GURL url("http://www.example.com/test/foo.html"); | 59 GURL url("http://www.example.com/test/foo.html"); |
| 50 base::Time creation_time = base::Time::Now(); | 60 base::Time creation_time = base::Time::Now(); |
| 51 CookieOptions options; | 61 CookieOptions options; |
| 52 | 62 |
| 53 std::unique_ptr<CanonicalCookie> cookie( | 63 std::unique_ptr<CanonicalCookie> cookie( |
| 54 CanonicalCookie::Create(url, "A=2", creation_time, options)); | 64 CanonicalCookie::Create(url, "A=2", creation_time, options)); |
| 55 EXPECT_EQ("A", cookie->Name()); | 65 EXPECT_EQ("A", cookie->Name()); |
| 56 EXPECT_EQ("2", cookie->Value()); | 66 EXPECT_EQ("2", cookie->Value()); |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 589 CanonicalCookie::Create(https_url, "a=b", creation_time, options)); | 599 CanonicalCookie::Create(https_url, "a=b", creation_time, options)); |
| 590 std::unique_ptr<CanonicalCookie> https_cookie_secure(CanonicalCookie::Create( | 600 std::unique_ptr<CanonicalCookie> https_cookie_secure(CanonicalCookie::Create( |
| 591 https_url, "a=b; Secure", creation_time, options)); | 601 https_url, "a=b; Secure", creation_time, options)); |
| 592 | 602 |
| 593 EXPECT_TRUE(http_cookie_no_secure.get()); | 603 EXPECT_TRUE(http_cookie_no_secure.get()); |
| 594 EXPECT_FALSE(http_cookie_secure.get()); | 604 EXPECT_FALSE(http_cookie_secure.get()); |
| 595 EXPECT_TRUE(https_cookie_no_secure.get()); | 605 EXPECT_TRUE(https_cookie_no_secure.get()); |
| 596 EXPECT_TRUE(https_cookie_secure.get()); | 606 EXPECT_TRUE(https_cookie_secure.get()); |
| 597 } | 607 } |
| 598 | 608 |
| 609 TEST(CanonicalCookieTest, IsCanonical) { | |
| 610 // Base correct template. | |
| 611 EXPECT_TRUE(CanonicalCookie("A", "B", "x.y", "/path", base::Time(), | |
| 612 base::Time(), base::Time(), false, false, | |
| 613 CookieSameSite::NO_RESTRICTION, | |
| 614 COOKIE_PRIORITY_LOW) | |
| 615 .IsCanonical()); | |
| 616 | |
| 617 // Newline in name. | |
| 618 EXPECT_FALSE(CanonicalCookie("A\n", "B", "x.y", "/path", base::Time(), | |
| 619 base::Time(), base::Time(), false, false, | |
| 620 CookieSameSite::NO_RESTRICTION, | |
| 621 COOKIE_PRIORITY_LOW) | |
| 622 .IsCanonical()); | |
| 623 | |
| 624 // Carriage return in name. | |
| 625 EXPECT_FALSE(CanonicalCookie("A\r", "B", "x.y", "/path", base::Time(), | |
| 626 base::Time(), base::Time(), false, false, | |
| 627 CookieSameSite::NO_RESTRICTION, | |
| 628 COOKIE_PRIORITY_LOW) | |
| 629 .IsCanonical()); | |
| 630 | |
| 631 // Null character in name. | |
| 632 EXPECT_FALSE(CanonicalCookie(std::string("A\0Z", 3), "B", "x.y", "/path", | |
| 633 base::Time(), base::Time(), base::Time(), false, | |
| 634 false, CookieSameSite::NO_RESTRICTION, | |
| 635 COOKIE_PRIORITY_LOW) | |
| 636 .IsCanonical()); | |
| 637 | |
| 638 // Name begins with whitespace. | |
| 639 EXPECT_FALSE(CanonicalCookie(" A", "B", "x.y", "/path", base::Time(), | |
| 640 base::Time(), base::Time(), false, false, | |
| 641 CookieSameSite::NO_RESTRICTION, | |
| 642 COOKIE_PRIORITY_LOW) | |
| 643 .IsCanonical()); | |
| 644 | |
| 645 // Name ends with whitespace. | |
| 646 EXPECT_FALSE(CanonicalCookie("A ", "B", "x.y", "/path", base::Time(), | |
| 647 base::Time(), base::Time(), false, false, | |
| 648 CookieSameSite::NO_RESTRICTION, | |
| 649 COOKIE_PRIORITY_LOW) | |
| 650 .IsCanonical()); | |
| 651 | |
| 652 // Empty name. (Note this is against the spec but compatible with other | |
| 653 // browsers.) | |
| 654 EXPECT_TRUE(CanonicalCookie("", "B", "x.y", "/path", base::Time(), | |
| 655 base::Time(), base::Time(), false, false, | |
| 656 CookieSameSite::NO_RESTRICTION, | |
| 657 COOKIE_PRIORITY_LOW) | |
| 658 .IsCanonical()); | |
| 659 | |
| 660 // Space in name | |
| 661 EXPECT_TRUE(CanonicalCookie("A C", "B", "x.y", "/path", base::Time(), | |
| 662 base::Time(), base::Time(), false, false, | |
| 663 CookieSameSite::NO_RESTRICTION, | |
| 664 COOKIE_PRIORITY_LOW) | |
| 665 .IsCanonical()); | |
| 666 | |
| 667 // Extra space suffixing name. | |
| 668 EXPECT_FALSE(CanonicalCookie("A ", "B", "x.y", "/path", base::Time(), | |
| 669 base::Time(), base::Time(), false, false, | |
| 670 CookieSameSite::NO_RESTRICTION, | |
| 671 COOKIE_PRIORITY_LOW) | |
| 672 .IsCanonical()); | |
| 673 | |
| 674 // '=' character in name. | |
| 675 EXPECT_FALSE(CanonicalCookie("A=", "B", "x.y", "/path", base::Time(), | |
| 676 base::Time(), base::Time(), false, false, | |
| 677 CookieSameSite::NO_RESTRICTION, | |
| 678 COOKIE_PRIORITY_LOW) | |
| 679 .IsCanonical()); | |
| 680 | |
| 681 // Separator in name. | |
| 682 EXPECT_FALSE(CanonicalCookie("A;", "B", "x.y", "/path", base::Time(), | |
| 683 base::Time(), base::Time(), false, false, | |
| 684 CookieSameSite::NO_RESTRICTION, | |
| 685 COOKIE_PRIORITY_LOW) | |
| 686 .IsCanonical()); | |
| 687 | |
| 688 // '=' character in value. | |
| 689 EXPECT_TRUE(CanonicalCookie("A", "B=", "x.y", "/path", base::Time(), | |
| 690 base::Time(), base::Time(), false, false, | |
| 691 CookieSameSite::NO_RESTRICTION, | |
| 692 COOKIE_PRIORITY_LOW) | |
| 693 .IsCanonical()); | |
| 694 | |
| 695 // Separator in value. | |
| 696 EXPECT_FALSE(CanonicalCookie("A", "B;", "x.y", "/path", base::Time(), | |
| 697 base::Time(), base::Time(), false, false, | |
| 698 CookieSameSite::NO_RESTRICTION, | |
| 699 COOKIE_PRIORITY_LOW) | |
| 700 .IsCanonical()); | |
| 701 | |
| 702 // Separator in domain. | |
| 703 EXPECT_FALSE(CanonicalCookie("A", "B", ";x.y", "/path", base::Time(), | |
| 704 base::Time(), base::Time(), false, false, | |
| 705 CookieSameSite::NO_RESTRICTION, | |
| 706 COOKIE_PRIORITY_LOW) | |
| 707 .IsCanonical()); | |
| 708 | |
| 709 // Space in domain. | |
| 710 EXPECT_FALSE(CanonicalCookie("A", "B", "x.y ", "/path", base::Time(), | |
| 711 base::Time(), base::Time(), false, false, | |
| 712 CookieSameSite::NO_RESTRICTION, | |
| 713 COOKIE_PRIORITY_LOW) | |
| 714 .IsCanonical()); | |
| 715 | |
| 716 // Empty domain. (This is against cookie spec, but needed for Chrome's | |
| 717 // out-of-spec use of cookies for extensions; see http://crbug.com/730633. | |
| 718 EXPECT_TRUE(CanonicalCookie("A", "B", "", "/path", base::Time(), base::Time(), | |
| 719 base::Time(), false, false, | |
| 720 CookieSameSite::NO_RESTRICTION, | |
| 721 COOKIE_PRIORITY_LOW) | |
| 722 .IsCanonical()); | |
| 723 | |
| 724 // Path does not start with a "/". | |
| 725 EXPECT_FALSE(CanonicalCookie("A", "B", "x.y", "path", base::Time(), | |
| 726 base::Time(), base::Time(), false, false, | |
| 727 CookieSameSite::NO_RESTRICTION, | |
| 728 COOKIE_PRIORITY_LOW) | |
| 729 .IsCanonical()); | |
| 730 | |
| 731 // Empty path. | |
| 732 EXPECT_FALSE(CanonicalCookie("A", "B", "x.y", "", base::Time(), base::Time(), | |
| 733 base::Time(), false, false, | |
| 734 CookieSameSite::NO_RESTRICTION, | |
| 735 COOKIE_PRIORITY_LOW) | |
| 736 .IsCanonical()); | |
| 737 | |
| 738 // Path suffixed with a space. | |
| 739 EXPECT_FALSE(CanonicalCookie("A", "B", "x.y", "/path ", base::Time(), | |
| 740 base::Time(), base::Time(), false, false, | |
| 741 CookieSameSite::NO_RESTRICTION, | |
| 742 COOKIE_PRIORITY_LOW) | |
| 743 .IsCanonical()); | |
| 744 | |
| 745 // Path suffixed with separator. | |
| 746 EXPECT_FALSE(CanonicalCookie("A", "B", "x.y", "/path;", base::Time(), | |
| 747 base::Time(), base::Time(), false, false, | |
| 748 CookieSameSite::NO_RESTRICTION, | |
| 749 COOKIE_PRIORITY_LOW) | |
| 750 .IsCanonical()); | |
| 751 | |
| 752 // Simple IPv4 address as domain. | |
| 753 EXPECT_TRUE(CanonicalCookie("A", "B", "1.2.3.4", "/path", base::Time(), | |
| 754 base::Time(), base::Time(), false, false, | |
| 755 CookieSameSite::NO_RESTRICTION, | |
| 756 COOKIE_PRIORITY_LOW) | |
| 757 .IsCanonical()); | |
| 758 | |
| 759 // NOn-canonical IPv4 address as domain. | |
| 760 EXPECT_FALSE(CanonicalCookie("A", "B", "01.2.03.4", "/path", base::Time(), | |
| 761 base::Time(), base::Time(), false, false, | |
| 762 CookieSameSite::NO_RESTRICTION, | |
| 763 COOKIE_PRIORITY_LOW) | |
| 764 .IsCanonical()); | |
| 765 | |
| 766 // Null IPv6 address as domain. | |
| 767 EXPECT_TRUE(CanonicalCookie("A", "B", "[::]", "/path", base::Time(), | |
| 768 base::Time(), base::Time(), false, false, | |
| 769 CookieSameSite::NO_RESTRICTION, | |
| 770 COOKIE_PRIORITY_LOW) | |
| 771 .IsCanonical()); | |
| 772 | |
| 773 // Localhost IPv6 address as domain. | |
| 774 EXPECT_TRUE(CanonicalCookie("A", "B", "[::1]", "/path", base::Time(), | |
| 775 base::Time(), base::Time(), false, false, | |
| 776 CookieSameSite::NO_RESTRICTION, | |
| 777 COOKIE_PRIORITY_LOW) | |
| 778 .IsCanonical()); | |
| 779 | |
| 780 // Fully speced IPv6 address as domain. | |
| 781 EXPECT_FALSE(CanonicalCookie( | |
| 782 "A", "B", "[2001:0DB8:AC10:FE01:0000:0000:0000:0000]", | |
| 783 "/path", base::Time(), base::Time(), base::Time(), false, | |
| 784 false, CookieSameSite::NO_RESTRICTION, COOKIE_PRIORITY_LOW) | |
| 785 .IsCanonical()); | |
| 786 | |
| 787 // Zero abbreviated IPv6 address as domain. Not canonical because of leading | |
| 788 // zeros & uppercase hex letters. | |
| 789 EXPECT_FALSE(CanonicalCookie("A", "B", "[2001:0DB8:AC10:FE01::]", "/path", | |
| 790 base::Time(), base::Time(), base::Time(), false, | |
| 791 false, CookieSameSite::NO_RESTRICTION, | |
| 792 COOKIE_PRIORITY_LOW) | |
| 793 .IsCanonical()); | |
| 794 | |
| 795 // Zero prefixes removed IPv6 address as domain. Not canoncial because of | |
| 796 // uppercase hex letters. | |
| 797 EXPECT_FALSE(CanonicalCookie("A", "B", "[2001:DB8:AC10:FE01::]", "/path", | |
| 798 base::Time(), base::Time(), base::Time(), false, | |
| 799 false, CookieSameSite::NO_RESTRICTION, | |
| 800 COOKIE_PRIORITY_LOW) | |
| 801 .IsCanonical()); | |
| 802 | |
| 803 // Lowercased hex IPv6 address as domain. | |
| 804 EXPECT_TRUE(CanonicalCookie("A", "B", "[2001:db8:ac10:fe01::]", "/path", | |
| 805 base::Time(), base::Time(), base::Time(), false, | |
| 806 false, CookieSameSite::NO_RESTRICTION, | |
| 807 COOKIE_PRIORITY_LOW) | |
| 808 .IsCanonical()); | |
| 809 | |
| 810 // Properly formatted host cookie. | |
| 811 EXPECT_TRUE(CanonicalCookie("__Host-A", "B", "x.y", "/", base::Time(), | |
| 812 base::Time(), base::Time(), false, false, | |
| 813 CookieSameSite::NO_RESTRICTION, | |
| 814 COOKIE_PRIORITY_LOW) | |
| 815 .IsCanonical()); | |
| 816 | |
| 817 // Host cookie with non-null path. | |
| 818 EXPECT_FALSE(CanonicalCookie("__Host-A", "B", "x.y", "/path", base::Time(), | |
| 819 base::Time(), base::Time(), false, false, | |
| 820 CookieSameSite::NO_RESTRICTION, | |
| 821 COOKIE_PRIORITY_LOW) | |
| 822 .IsCanonical()); | |
| 823 | |
| 824 // Host cookie with empty domain. | |
| 825 EXPECT_FALSE(CanonicalCookie("__Host-A", "B", "", "/", base::Time(), | |
| 826 base::Time(), base::Time(), false, false, | |
| 827 CookieSameSite::NO_RESTRICTION, | |
| 828 COOKIE_PRIORITY_LOW) | |
| 829 .IsCanonical()); | |
| 830 | |
| 831 // Host cookie with period prefixed domain. | |
| 832 EXPECT_FALSE(CanonicalCookie("__Host-A", "B", ".x.y", "/", base::Time(), | |
| 833 base::Time(), base::Time(), false, false, | |
| 834 CookieSameSite::NO_RESTRICTION, | |
| 835 COOKIE_PRIORITY_LOW) | |
| 836 .IsCanonical()); | |
| 837 } | |
| 838 | |
| 599 TEST(CanonicalCookieTest, TestPrefixHistograms) { | 839 TEST(CanonicalCookieTest, TestPrefixHistograms) { |
| 600 base::HistogramTester histograms; | 840 base::HistogramTester histograms; |
| 601 const char kCookiePrefixHistogram[] = "Cookie.CookiePrefix"; | 841 const char kCookiePrefixHistogram[] = "Cookie.CookiePrefix"; |
| 602 const char kCookiePrefixBlockedHistogram[] = "Cookie.CookiePrefixBlocked"; | 842 const char kCookiePrefixBlockedHistogram[] = "Cookie.CookiePrefixBlocked"; |
| 603 GURL https_url("https://www.example.test"); | 843 GURL https_url("https://www.example.test"); |
| 604 base::Time creation_time = base::Time::Now(); | 844 base::Time creation_time = base::Time::Now(); |
| 605 CookieOptions options; | 845 CookieOptions options; |
| 606 | 846 |
| 607 EXPECT_FALSE(CanonicalCookie::Create(https_url, "__Host-A=B;", creation_time, | 847 EXPECT_FALSE(CanonicalCookie::Create(https_url, "__Host-A=B;", creation_time, |
| 608 options)); | 848 options)); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 640 CanonicalCookie::COOKIE_PREFIX_SECURE, 1); | 880 CanonicalCookie::COOKIE_PREFIX_SECURE, 1); |
| 641 EXPECT_TRUE(CanonicalCookie::Create(https_url, "__SecureA=B; Path=/; Secure", | 881 EXPECT_TRUE(CanonicalCookie::Create(https_url, "__SecureA=B; Path=/; Secure", |
| 642 creation_time, options)); | 882 creation_time, options)); |
| 643 histograms.ExpectBucketCount(kCookiePrefixHistogram, | 883 histograms.ExpectBucketCount(kCookiePrefixHistogram, |
| 644 CanonicalCookie::COOKIE_PREFIX_SECURE, 2); | 884 CanonicalCookie::COOKIE_PREFIX_SECURE, 2); |
| 645 histograms.ExpectBucketCount(kCookiePrefixBlockedHistogram, | 885 histograms.ExpectBucketCount(kCookiePrefixBlockedHistogram, |
| 646 CanonicalCookie::COOKIE_PREFIX_SECURE, 1); | 886 CanonicalCookie::COOKIE_PREFIX_SECURE, 1); |
| 647 } | 887 } |
| 648 | 888 |
| 649 } // namespace net | 889 } // namespace net |
| OLD | NEW |