TestRedirectChainURITruncation.cpp (8129B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 #include "gtest/gtest.h" 5 #include "mozilla/BasePrincipal.h" 6 #include "mozilla/ContentPrincipal.h" 7 #include "mozilla/NullPrincipal.h" 8 #include "mozilla/SystemPrincipal.h" 9 #include "mozilla/ExpandedPrincipal.h" 10 #include "nsContentUtils.h" 11 #include "mozilla/LoadInfo.h" 12 13 namespace mozilla { 14 15 void checkPrincipalTruncation(nsIPrincipal* aPrincipal, 16 const nsACString& aExpectedSpec = ""_ns, 17 const nsTArray<nsCString>& aExpectedSpecs = {}) { 18 nsCOMPtr<nsIPrincipal> truncatedPrincipal = 19 net::CreateTruncatedPrincipal(aPrincipal); 20 ASSERT_TRUE(truncatedPrincipal); 21 22 if (aPrincipal->IsSystemPrincipal()) { 23 ASSERT_TRUE(truncatedPrincipal->IsSystemPrincipal()); 24 return; 25 } 26 27 if (aPrincipal->GetIsNullPrincipal()) { 28 nsCOMPtr<nsIPrincipal> precursorPrincipal = 29 aPrincipal->GetPrecursorPrincipal(); 30 31 nsAutoCString principalSpecEnding("}"); 32 nsAutoCString expectedTestSpec(aExpectedSpec); 33 if (!aExpectedSpec.IsEmpty()) { 34 principalSpecEnding += "?"_ns; 35 expectedTestSpec += "/"_ns; 36 } 37 38 if (precursorPrincipal) { 39 nsAutoCString precursorSpec; 40 precursorPrincipal->GetAsciiSpec(precursorSpec); 41 ASSERT_TRUE(precursorSpec.Equals(expectedTestSpec)); 42 } 43 44 // NullPrincipals have UUIDs as part of their scheme i.e. 45 // moz-nullprincipal:{9bebdabb-828a-4284-8b00-432a968c6e42} 46 // To avoid having to know the UUID beforehand we check the principal's spec 47 // before and after the UUID 48 nsAutoCString principalSpec; 49 truncatedPrincipal->GetAsciiSpec(principalSpec); 50 ASSERT_TRUE(StringBeginsWith(principalSpec, "moz-nullprincipal:{"_ns)); 51 ASSERT_TRUE( 52 StringEndsWith(principalSpec, principalSpecEnding + aExpectedSpec)); 53 return; 54 } 55 56 if (aPrincipal->GetIsExpandedPrincipal()) { 57 const nsTArray<nsCOMPtr<nsIPrincipal>>& truncatedAllowList = 58 BasePrincipal::Cast(truncatedPrincipal) 59 ->As<ExpandedPrincipal>() 60 ->AllowList(); 61 62 for (size_t i = 0; i < aExpectedSpecs.Length(); ++i) { 63 nsAutoCString principalSpec; 64 truncatedAllowList[i]->GetAsciiSpec(principalSpec); 65 ASSERT_TRUE(principalSpec.Equals(aExpectedSpecs[i])); 66 } 67 return; 68 } 69 70 if (aPrincipal->GetIsContentPrincipal()) { 71 nsAutoCString principalSpec; 72 truncatedPrincipal->GetAsciiSpec(principalSpec); 73 ASSERT_TRUE(principalSpec.Equals(aExpectedSpec)); 74 return; 75 } 76 77 // Tests should not reach this point 78 ADD_FAILURE(); 79 } 80 81 void checkPrincipalTruncation(nsIPrincipal* aPrincipal, 82 const nsTArray<nsCString>& aExpectedSpecs = {}) { 83 checkPrincipalTruncation(aPrincipal, ""_ns, aExpectedSpecs); 84 } 85 86 TEST(RedirectChainURITruncation, ContentPrincipal) 87 { 88 // ======================= HTTP Scheme ======================= 89 nsAutoCString httpSpec( 90 "http://root:toor@www.example.com:200/foo/bar/baz.html?qux#thud"); 91 nsCOMPtr<nsIURI> uri; 92 nsresult rv = NS_NewURI(getter_AddRefs(uri), httpSpec); 93 ASSERT_EQ(rv, NS_OK); 94 95 nsCOMPtr<nsIPrincipal> principal; 96 OriginAttributes attrs; 97 principal = BasePrincipal::CreateContentPrincipal(uri, attrs); 98 ASSERT_TRUE(principal); 99 100 checkPrincipalTruncation(principal, 101 "http://www.example.com:200/foo/bar/baz.html"_ns); 102 103 // ======================= HTTPS Scheme ======================= 104 nsAutoCString httpsSpec( 105 "https://root:toor@www.example.com:200/foo/bar/baz.html?qux#thud"); 106 rv = NS_NewURI(getter_AddRefs(uri), httpsSpec); 107 ASSERT_EQ(rv, NS_OK); 108 109 principal = BasePrincipal::CreateContentPrincipal(uri, attrs); 110 ASSERT_TRUE(principal); 111 112 checkPrincipalTruncation(principal, 113 "https://www.example.com:200/foo/bar/baz.html"_ns); 114 115 // ======================= View Source Scheme ======================= 116 nsAutoCString viewSourceSpec( 117 "view-source:https://root:toor@www.example.com:200/foo/bar/" 118 "baz.html?qux#thud"); 119 rv = NS_NewURI(getter_AddRefs(uri), viewSourceSpec); 120 ASSERT_EQ(rv, NS_OK); 121 122 principal = BasePrincipal::CreateContentPrincipal(uri, attrs); 123 ASSERT_TRUE(principal); 124 125 checkPrincipalTruncation( 126 principal, "view-source:https://www.example.com:200/foo/bar/baz.html"_ns); 127 128 // ======================= About Scheme ======================= 129 nsAutoCString aboutSpec("about:config"); 130 rv = NS_NewURI(getter_AddRefs(uri), aboutSpec); 131 ASSERT_EQ(rv, NS_OK); 132 133 principal = BasePrincipal::CreateContentPrincipal(uri, attrs); 134 ASSERT_TRUE(principal); 135 136 checkPrincipalTruncation(principal, "about:config"_ns); 137 138 // ======================= Resource Scheme ======================= 139 nsAutoCString resourceSpec("resource://testing/"); 140 rv = NS_NewURI(getter_AddRefs(uri), resourceSpec); 141 ASSERT_EQ(rv, NS_OK); 142 143 principal = BasePrincipal::CreateContentPrincipal(uri, attrs); 144 ASSERT_TRUE(principal); 145 146 checkPrincipalTruncation(principal, "resource://testing/"_ns); 147 148 // ======================= Chrome Scheme ======================= 149 nsAutoCString chromeSpec("chrome://foo/content/bar.xul"); 150 rv = NS_NewURI(getter_AddRefs(uri), chromeSpec); 151 ASSERT_EQ(rv, NS_OK); 152 153 principal = BasePrincipal::CreateContentPrincipal(uri, attrs); 154 ASSERT_TRUE(principal); 155 156 checkPrincipalTruncation(principal, "chrome://foo/content/bar.xul"_ns); 157 } 158 159 TEST(RedirectChainURITruncation, NullPrincipal) 160 { 161 // ======================= NullPrincipal ======================= 162 nsCOMPtr<nsIPrincipal> principal = 163 NullPrincipal::CreateWithoutOriginAttributes(); 164 ASSERT_TRUE(principal); 165 166 checkPrincipalTruncation(principal, ""_ns); 167 168 // ======================= NullPrincipal & Precursor ======================= 169 nsAutoCString precursorSpec( 170 "https://root:toor@www.example.com:200/foo/bar/baz.html?qux#thud"); 171 172 nsCOMPtr<nsIURI> precursorURI; 173 nsresult rv = NS_NewURI(getter_AddRefs(precursorURI), precursorSpec); 174 ASSERT_EQ(rv, NS_OK); 175 176 OriginAttributes attrs; 177 nsCOMPtr<nsIPrincipal> precursorPrincipal = 178 BasePrincipal::CreateContentPrincipal(precursorURI, attrs); 179 principal = NullPrincipal::CreateWithInheritedAttributes(precursorPrincipal); 180 ASSERT_TRUE(principal); 181 182 checkPrincipalTruncation(principal, "https://www.example.com:200"_ns); 183 } 184 185 TEST(RedirectChainURITruncation, SystemPrincipal) 186 { 187 nsCOMPtr<nsIPrincipal> principal = nsContentUtils::GetSystemPrincipal(); 188 ASSERT_TRUE(principal); 189 190 checkPrincipalTruncation(principal, ""_ns); 191 } 192 193 TEST(RedirectChainURITruncation, ExtendedPrincipal) 194 { 195 // ======================= HTTP Scheme ======================= 196 nsAutoCString httpSpec( 197 "http://root:toor@www.example.com:200/foo/bar/baz.html?qux#thud"); 198 nsCOMPtr<nsIURI> uri; 199 nsresult rv = NS_NewURI(getter_AddRefs(uri), httpSpec); 200 ASSERT_EQ(rv, NS_OK); 201 202 nsCOMPtr<nsIPrincipal> firstContentPrincipal; 203 OriginAttributes attrs; 204 firstContentPrincipal = BasePrincipal::CreateContentPrincipal(uri, attrs); 205 ASSERT_TRUE(firstContentPrincipal); 206 207 // ======================= HTTPS Scheme ======================= 208 nsCOMPtr<nsIPrincipal> secondContentPrincipal; 209 nsAutoCString httpsSpec( 210 "https://root:toor@www.example.com:200/foo/bar/baz.html?qux#thud"); 211 rv = NS_NewURI(getter_AddRefs(uri), httpsSpec); 212 ASSERT_EQ(rv, NS_OK); 213 214 secondContentPrincipal = BasePrincipal::CreateContentPrincipal(uri, attrs); 215 ASSERT_TRUE(secondContentPrincipal); 216 217 // ======================= ExpandedPrincipal ======================= 218 const nsTArray<nsCString>& expectedSpecs = { 219 "http://www.example.com:200/foo/bar/baz.html"_ns, 220 "https://www.example.com:200/foo/bar/baz.html"_ns, 221 }; 222 nsTArray<nsCOMPtr<nsIPrincipal>> allowList = {firstContentPrincipal, 223 secondContentPrincipal}; 224 nsCOMPtr<nsIPrincipal> principal = 225 ExpandedPrincipal::Create(allowList, attrs); 226 ASSERT_TRUE(principal); 227 228 checkPrincipalTruncation(principal, expectedSpecs); 229 } 230 231 } // namespace mozilla