OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "extensions/common/csp_validator.h" | 5 #include "extensions/common/csp_validator.h" |
| 6 #include "extensions/common/error_utils.h" |
| 7 #include "extensions/common/install_warning.h" |
| 8 #include "extensions/common/manifest_constants.h" |
6 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
7 | 10 |
8 using extensions::csp_validator::ContentSecurityPolicyIsLegal; | 11 using extensions::csp_validator::ContentSecurityPolicyIsLegal; |
9 using extensions::csp_validator::ContentSecurityPolicyIsSecure; | 12 using extensions::csp_validator::ContentSecurityPolicyIsSecure; |
10 using extensions::csp_validator::ContentSecurityPolicyIsSandboxed; | 13 using extensions::csp_validator::ContentSecurityPolicyIsSandboxed; |
| 14 using extensions::ErrorUtils; |
| 15 using extensions::InstallWarning; |
11 using extensions::Manifest; | 16 using extensions::Manifest; |
12 | 17 |
| 18 namespace { |
| 19 |
| 20 std::string InsecureValueWarning(const std::string& directive, |
| 21 const std::string& value) { |
| 22 return ErrorUtils::FormatErrorMessage( |
| 23 extensions::manifest_errors::kInvalidCSPInsecureValue, value, directive); |
| 24 } |
| 25 |
| 26 std::string MissingSecureSrcWarning(const std::string& directive) { |
| 27 return ErrorUtils::FormatErrorMessage( |
| 28 extensions::manifest_errors::kInvalidCSPMissingSecureSrc, directive); |
| 29 } |
| 30 |
| 31 }; // namespace |
| 32 |
13 TEST(ExtensionCSPValidator, IsLegal) { | 33 TEST(ExtensionCSPValidator, IsLegal) { |
14 EXPECT_TRUE(ContentSecurityPolicyIsLegal("foo")); | 34 EXPECT_TRUE(ContentSecurityPolicyIsLegal("foo")); |
15 EXPECT_TRUE(ContentSecurityPolicyIsLegal( | 35 EXPECT_TRUE(ContentSecurityPolicyIsLegal( |
16 "default-src 'self'; script-src http://www.google.com")); | 36 "default-src 'self'; script-src http://www.google.com")); |
17 EXPECT_FALSE(ContentSecurityPolicyIsLegal( | 37 EXPECT_FALSE(ContentSecurityPolicyIsLegal( |
18 "default-src 'self';\nscript-src http://www.google.com")); | 38 "default-src 'self';\nscript-src http://www.google.com")); |
19 EXPECT_FALSE(ContentSecurityPolicyIsLegal( | 39 EXPECT_FALSE(ContentSecurityPolicyIsLegal( |
20 "default-src 'self';\rscript-src http://www.google.com")); | 40 "default-src 'self';\rscript-src http://www.google.com")); |
21 EXPECT_FALSE(ContentSecurityPolicyIsLegal( | 41 EXPECT_FALSE(ContentSecurityPolicyIsLegal( |
22 "default-src 'self';,script-src http://www.google.com")); | 42 "default-src 'self';,script-src http://www.google.com")); |
23 } | 43 } |
24 | 44 |
25 TEST(ExtensionCSPValidator, IsSecure) { | 45 TEST(ExtensionCSPValidator, IsSecure) { |
26 EXPECT_FALSE( | 46 std::string csp; |
27 ContentSecurityPolicyIsSecure(std::string(), Manifest::TYPE_EXTENSION)); | 47 std::vector<InstallWarning> warnings; |
28 EXPECT_FALSE(ContentSecurityPolicyIsSecure("img-src https://google.com", | 48 |
29 Manifest::TYPE_EXTENSION)); | 49 warnings.push_back(InstallWarning("should not be removed")); |
30 | 50 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
31 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 51 std::string(), Manifest::TYPE_EXTENSION, &csp, &warnings)); |
32 "default-src *", Manifest::TYPE_EXTENSION)); | 52 EXPECT_EQ("script-src 'self' chrome-extension-resource:; object-src 'self';", |
33 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 53 csp); |
34 "default-src 'self'", Manifest::TYPE_EXTENSION)); | 54 EXPECT_EQ(3U, warnings.size()); |
35 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 55 // ContentSecurityPolicyIsSecure should append (not replace) warnings. |
36 "default-src 'none'", Manifest::TYPE_EXTENSION)); | 56 EXPECT_EQ("should not be removed", warnings[0].message); |
37 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 57 EXPECT_EQ(MissingSecureSrcWarning("script-src"), warnings[1].message); |
38 "default-src 'self' ftp://google.com", Manifest::TYPE_EXTENSION)); | 58 EXPECT_EQ(MissingSecureSrcWarning("object-src"), warnings[2].message); |
39 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 59 warnings.clear(); |
40 "default-src 'self' https://google.com", Manifest::TYPE_EXTENSION)); | 60 |
41 | 61 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
42 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 62 "img-src https://google.com", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
43 "default-src *; default-src 'self'", Manifest::TYPE_EXTENSION)); | 63 EXPECT_EQ("img-src https://google.com; script-src 'self'" |
44 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 64 " chrome-extension-resource:; object-src 'self';", csp); |
45 "default-src 'self'; default-src *", Manifest::TYPE_EXTENSION)); | 65 EXPECT_EQ(2U, warnings.size()); |
| 66 EXPECT_EQ(MissingSecureSrcWarning("script-src"), warnings[0].message); |
| 67 EXPECT_EQ(MissingSecureSrcWarning("object-src"), warnings[1].message); |
| 68 warnings.clear(); |
| 69 |
| 70 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 71 "script-src a b", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
| 72 EXPECT_EQ("script-src; object-src 'self';", csp); |
| 73 EXPECT_EQ(3U, warnings.size()); |
| 74 EXPECT_EQ(InsecureValueWarning("script-src", "a"), warnings[0].message); |
| 75 EXPECT_EQ(InsecureValueWarning("script-src", "b"), warnings[1].message); |
| 76 EXPECT_EQ(MissingSecureSrcWarning("object-src"), warnings[2].message); |
| 77 warnings.clear(); |
| 78 |
| 79 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 80 "default-src *", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
| 81 EXPECT_EQ("default-src;", csp); |
| 82 EXPECT_EQ(1U, warnings.size()); |
| 83 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 84 warnings.clear(); |
| 85 |
| 86 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 87 "default-src 'self'", Manifest::TYPE_EXTENSION, NULL, NULL)); |
| 88 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 89 "default-src 'none'", Manifest::TYPE_EXTENSION, NULL, NULL)); |
| 90 |
| 91 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 92 "default-src 'self' ftp://google.com", Manifest::TYPE_EXTENSION, &csp, |
| 93 &warnings)); |
| 94 EXPECT_EQ("default-src 'self';", csp); |
| 95 EXPECT_EQ(1U, warnings.size()); |
| 96 EXPECT_EQ(InsecureValueWarning("default-src", "ftp://google.com"), |
| 97 warnings[0].message); |
| 98 warnings.clear(); |
| 99 |
| 100 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 101 "default-src 'self' https://google.com", Manifest::TYPE_EXTENSION, NULL, |
| 102 NULL)); |
| 103 |
| 104 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 105 "default-src *; default-src 'self'", Manifest::TYPE_EXTENSION, &csp, |
| 106 &warnings)); |
| 107 EXPECT_EQ("default-src; default-src 'self';", csp); |
| 108 EXPECT_EQ(1U, warnings.size()); |
| 109 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 110 warnings.clear(); |
| 111 |
| 112 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 113 "default-src 'self'; default-src *", Manifest::TYPE_EXTENSION, NULL, |
| 114 NULL)); |
46 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 115 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
47 "default-src 'self'; default-src *; script-src *; script-src 'self'", | 116 "default-src 'self'; default-src *; script-src *; script-src 'self'", |
48 Manifest::TYPE_EXTENSION)); | 117 Manifest::TYPE_EXTENSION, &csp, &warnings)); |
| 118 EXPECT_EQ("default-src 'self'; default-src; script-src; script-src 'self';", |
| 119 csp); |
| 120 // No warning about "object-src *" because it comes after "object-src 'self'". |
| 121 EXPECT_EQ(1U, warnings.size()); |
| 122 EXPECT_EQ(InsecureValueWarning("script-src", "*"), warnings[0].message); |
| 123 warnings.clear(); |
| 124 |
49 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 125 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
50 "default-src 'self'; default-src *; script-src 'self'; script-src *", | 126 "default-src 'self'; default-src *; script-src 'self'; script-src *", |
51 Manifest::TYPE_EXTENSION)); | 127 Manifest::TYPE_EXTENSION, NULL, NULL)); |
52 | 128 |
53 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 129 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
54 "default-src *; script-src 'self'", Manifest::TYPE_EXTENSION)); | 130 "default-src *; script-src 'self'", Manifest::TYPE_EXTENSION, &csp, |
| 131 &warnings)); |
| 132 EXPECT_EQ("default-src; script-src 'self';", csp); |
| 133 EXPECT_EQ(1U, warnings.size()); |
| 134 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 135 warnings.clear(); |
| 136 |
55 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 137 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
56 "default-src *; script-src 'self'; img-src 'self'", | 138 "default-src *; script-src 'self'; img-src 'self'", |
57 Manifest::TYPE_EXTENSION)); | 139 Manifest::TYPE_EXTENSION, &csp, &warnings)); |
| 140 EXPECT_EQ("default-src; script-src 'self'; img-src 'self';", csp); |
| 141 EXPECT_EQ(1U, warnings.size()); |
| 142 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
| 143 warnings.clear(); |
| 144 |
58 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 145 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
59 "default-src *; script-src 'self'; object-src 'self'", | 146 "default-src *; script-src 'self'; object-src 'self'", |
60 Manifest::TYPE_EXTENSION)); | 147 Manifest::TYPE_EXTENSION, NULL, NULL)); |
61 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 148 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
62 "script-src 'self'; object-src 'self'", Manifest::TYPE_EXTENSION)); | 149 "script-src 'self'; object-src 'self'", Manifest::TYPE_EXTENSION, NULL, |
63 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 150 NULL)); |
64 "default-src 'unsafe-eval'", Manifest::TYPE_EXTENSION)); | 151 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
65 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 152 "default-src 'unsafe-eval'", Manifest::TYPE_EXTENSION, NULL, NULL)); |
66 "default-src 'unsafe-eval'", Manifest::TYPE_LEGACY_PACKAGED_APP)); | 153 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
67 | 154 "default-src 'unsafe-eval'", Manifest::TYPE_LEGACY_PACKAGED_APP, NULL, |
68 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 155 NULL)); |
69 "default-src 'unsafe-eval'", Manifest::TYPE_PLATFORM_APP)); | 156 |
70 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 157 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
71 "default-src 'unsafe-inline'", Manifest::TYPE_EXTENSION)); | 158 "default-src 'unsafe-eval'", Manifest::TYPE_PLATFORM_APP, &csp, |
72 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 159 &warnings)); |
73 "default-src 'unsafe-inline' 'none'", Manifest::TYPE_EXTENSION)); | 160 EXPECT_EQ("default-src;", csp); |
74 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 161 EXPECT_EQ(1U, warnings.size()); |
75 "default-src 'self' http://google.com", Manifest::TYPE_EXTENSION)); | 162 EXPECT_EQ(InsecureValueWarning("default-src", "'unsafe-eval'"), |
76 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 163 warnings[0].message); |
77 "default-src 'self' https://google.com", Manifest::TYPE_EXTENSION)); | 164 warnings.clear(); |
78 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 165 |
79 "default-src 'self' chrome://resources", Manifest::TYPE_EXTENSION)); | 166 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 167 "default-src 'unsafe-inline'", Manifest::TYPE_EXTENSION, &csp, |
| 168 &warnings)); |
| 169 EXPECT_EQ("default-src;", csp); |
| 170 EXPECT_EQ(1U, warnings.size()); |
| 171 EXPECT_EQ(InsecureValueWarning("default-src", "'unsafe-inline'"), |
| 172 warnings[0].message); |
| 173 warnings.clear(); |
| 174 |
| 175 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 176 "default-src 'unsafe-inline' 'none'", Manifest::TYPE_EXTENSION, &csp, |
| 177 &warnings)); |
| 178 EXPECT_EQ("default-src 'none';", csp); |
| 179 EXPECT_EQ(1U, warnings.size()); |
| 180 EXPECT_EQ(InsecureValueWarning("default-src", "'unsafe-inline'"), |
| 181 warnings[0].message); |
| 182 warnings.clear(); |
| 183 |
| 184 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 185 "default-src 'self' http://google.com", Manifest::TYPE_EXTENSION, &csp, |
| 186 &warnings)); |
| 187 EXPECT_EQ("default-src 'self';", csp); |
| 188 EXPECT_EQ(1U, warnings.size()); |
| 189 EXPECT_EQ(InsecureValueWarning("default-src", "http://google.com"), |
| 190 warnings[0].message); |
| 191 warnings.clear(); |
| 192 |
| 193 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 194 "default-src 'self' https://google.com", Manifest::TYPE_EXTENSION, NULL, |
| 195 NULL)); |
| 196 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 197 "default-src 'self' chrome://resources", Manifest::TYPE_EXTENSION, NULL, |
| 198 NULL)); |
80 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 199 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
81 "default-src 'self' chrome-extension://aabbcc", | 200 "default-src 'self' chrome-extension://aabbcc", |
82 Manifest::TYPE_EXTENSION)); | 201 Manifest::TYPE_EXTENSION, NULL, NULL)); |
83 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 202 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
84 "default-src 'self' chrome-extension-resource://aabbcc", | 203 "default-src 'self' chrome-extension-resource://aabbcc", |
85 Manifest::TYPE_EXTENSION)); | 204 Manifest::TYPE_EXTENSION, NULL, NULL)); |
86 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 205 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
87 "default-src 'self' https:", Manifest::TYPE_EXTENSION)); | 206 "default-src 'self' https:", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
88 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 207 EXPECT_EQ("default-src 'self';", csp); |
89 "default-src 'self' http:", Manifest::TYPE_EXTENSION)); | 208 EXPECT_EQ(1U, warnings.size()); |
90 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 209 EXPECT_EQ(InsecureValueWarning("default-src", "https:"), warnings[0].message); |
91 "default-src 'self' google.com", Manifest::TYPE_EXTENSION)); | 210 warnings.clear(); |
92 | 211 |
93 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 212 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
94 "default-src 'self' *", Manifest::TYPE_EXTENSION)); | 213 "default-src 'self' http:", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
95 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 214 EXPECT_EQ("default-src 'self';", csp); |
96 "default-src 'self' *:*", Manifest::TYPE_EXTENSION)); | 215 EXPECT_EQ(1U, warnings.size()); |
97 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 216 EXPECT_EQ(InsecureValueWarning("default-src", "http:"), warnings[0].message); |
98 "default-src 'self' *:*/", Manifest::TYPE_EXTENSION)); | 217 warnings.clear(); |
99 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 218 |
100 "default-src 'self' *:*/path", Manifest::TYPE_EXTENSION)); | 219 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
101 // "https://" is an invalid CSP, so it will be ignored by Blink. | 220 "default-src 'self' google.com", Manifest::TYPE_EXTENSION, &csp, |
102 // TODO(robwu): Change to EXPECT_FALSE once http://crbug.com/434773 is fixed. | 221 &warnings)); |
103 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 222 EXPECT_EQ("default-src 'self';", csp); |
104 "default-src 'self' https://", Manifest::TYPE_EXTENSION)); | 223 EXPECT_EQ(1U, warnings.size()); |
105 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 224 EXPECT_EQ(InsecureValueWarning("default-src", "google.com"), |
106 "default-src 'self' https://*:*", Manifest::TYPE_EXTENSION)); | 225 warnings[0].message); |
107 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 226 warnings.clear(); |
108 "default-src 'self' https://*:*/", Manifest::TYPE_EXTENSION)); | 227 |
109 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 228 |
110 "default-src 'self' https://*:*/path", Manifest::TYPE_EXTENSION)); | 229 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
111 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 230 "default-src 'self' *", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
112 "default-src 'self' https://*.com", Manifest::TYPE_EXTENSION)); | 231 EXPECT_EQ("default-src 'self';", csp); |
113 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 232 EXPECT_EQ(1U, warnings.size()); |
114 "default-src 'self' https://*.*.google.com/", Manifest::TYPE_EXTENSION)); | 233 EXPECT_EQ(InsecureValueWarning("default-src", "*"), warnings[0].message); |
115 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 234 warnings.clear(); |
116 "default-src 'self' https://*.*.google.com:*/", | 235 |
117 Manifest::TYPE_EXTENSION)); | 236 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
118 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 237 "default-src 'self' *:*", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
119 "default-src 'self' https://www.*.google.com/", | 238 EXPECT_EQ("default-src 'self';", csp); |
120 Manifest::TYPE_EXTENSION)); | 239 EXPECT_EQ(1U, warnings.size()); |
| 240 EXPECT_EQ(InsecureValueWarning("default-src", "*:*"), warnings[0].message); |
| 241 warnings.clear(); |
| 242 |
| 243 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 244 "default-src 'self' *:*/", Manifest::TYPE_EXTENSION, &csp, &warnings)); |
| 245 EXPECT_EQ("default-src 'self';", csp); |
| 246 EXPECT_EQ(1U, warnings.size()); |
| 247 EXPECT_EQ(InsecureValueWarning("default-src", "*:*/"), warnings[0].message); |
| 248 warnings.clear(); |
| 249 |
| 250 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 251 "default-src 'self' *:*/path", Manifest::TYPE_EXTENSION, &csp, |
| 252 &warnings)); |
| 253 EXPECT_EQ("default-src 'self';", csp); |
| 254 EXPECT_EQ(1U, warnings.size()); |
| 255 EXPECT_EQ(InsecureValueWarning("default-src", "*:*/path"), |
| 256 warnings[0].message); |
| 257 warnings.clear(); |
| 258 |
| 259 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 260 "default-src 'self' https://", Manifest::TYPE_EXTENSION, &csp, |
| 261 &warnings)); |
| 262 EXPECT_EQ("default-src 'self';", csp); |
| 263 EXPECT_EQ(1U, warnings.size()); |
| 264 EXPECT_EQ(InsecureValueWarning("default-src", "https://"), |
| 265 warnings[0].message); |
| 266 warnings.clear(); |
| 267 |
| 268 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 269 "default-src 'self' https://*:*", Manifest::TYPE_EXTENSION, &csp, |
| 270 &warnings)); |
| 271 EXPECT_EQ("default-src 'self';", csp); |
| 272 EXPECT_EQ(1U, warnings.size()); |
| 273 EXPECT_EQ(InsecureValueWarning("default-src", "https://*:*"), |
| 274 warnings[0].message); |
| 275 warnings.clear(); |
| 276 |
| 277 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 278 "default-src 'self' https://*:*/", Manifest::TYPE_EXTENSION, &csp, |
| 279 &warnings)); |
| 280 EXPECT_EQ("default-src 'self';", csp); |
| 281 EXPECT_EQ(1U, warnings.size()); |
| 282 EXPECT_EQ(InsecureValueWarning("default-src", "https://*:*/"), |
| 283 warnings[0].message); |
| 284 warnings.clear(); |
| 285 |
| 286 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 287 "default-src 'self' https://*:*/path", Manifest::TYPE_EXTENSION, &csp, |
| 288 &warnings)); |
| 289 EXPECT_EQ("default-src 'self';", csp); |
| 290 EXPECT_EQ(1U, warnings.size()); |
| 291 EXPECT_EQ(InsecureValueWarning("default-src", "https://*:*/path"), |
| 292 warnings[0].message); |
| 293 warnings.clear(); |
| 294 |
| 295 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 296 "default-src 'self' https://*.com", Manifest::TYPE_EXTENSION, &csp, |
| 297 &warnings)); |
| 298 EXPECT_EQ("default-src 'self';", csp); |
| 299 EXPECT_EQ(1U, warnings.size()); |
| 300 EXPECT_EQ(InsecureValueWarning("default-src", "https://*.com"), |
| 301 warnings[0].message); |
| 302 warnings.clear(); |
| 303 |
| 304 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 305 "default-src 'self' https://*.*.google.com/", Manifest::TYPE_EXTENSION, |
| 306 &csp, &warnings)); |
| 307 EXPECT_EQ("default-src 'self';", csp); |
| 308 EXPECT_EQ(1U, warnings.size()); |
| 309 EXPECT_EQ(InsecureValueWarning("default-src", "https://*.*.google.com/"), |
| 310 warnings[0].message); |
| 311 warnings.clear(); |
| 312 |
| 313 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 314 "default-src 'self' https://*.*.google.com:*/", Manifest::TYPE_EXTENSION, |
| 315 &csp, &warnings)); |
| 316 EXPECT_EQ("default-src 'self';", csp); |
| 317 EXPECT_EQ(1U, warnings.size()); |
| 318 EXPECT_EQ(InsecureValueWarning("default-src", "https://*.*.google.com:*/"), |
| 319 warnings[0].message); |
| 320 warnings.clear(); |
| 321 |
| 322 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
| 323 "default-src 'self' https://www.*.google.com/", Manifest::TYPE_EXTENSION, |
| 324 &csp, &warnings)); |
| 325 EXPECT_EQ("default-src 'self';", csp); |
| 326 EXPECT_EQ(1U, warnings.size()); |
| 327 EXPECT_EQ(InsecureValueWarning("default-src", "https://www.*.google.com/"), |
| 328 warnings[0].message); |
| 329 warnings.clear(); |
| 330 |
121 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 331 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
122 "default-src 'self' https://www.*.google.com:*/", | 332 "default-src 'self' https://www.*.google.com:*/", |
123 Manifest::TYPE_EXTENSION)); | 333 Manifest::TYPE_EXTENSION, &csp, &warnings)); |
124 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 334 EXPECT_EQ("default-src 'self';", csp); |
125 "default-src 'self' chrome://*", Manifest::TYPE_EXTENSION)); | 335 EXPECT_EQ(1U, warnings.size()); |
126 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 336 EXPECT_EQ(InsecureValueWarning("default-src", "https://www.*.google.com:*/"), |
127 "default-src 'self' chrome-extension://*", Manifest::TYPE_EXTENSION)); | 337 warnings[0].message); |
128 | 338 warnings.clear(); |
129 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 339 |
130 "default-src 'self' https://*.google.com", Manifest::TYPE_EXTENSION)); | 340 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
131 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 341 "default-src 'self' chrome://*", Manifest::TYPE_EXTENSION, &csp, |
132 "default-src 'self' https://*.google.com:1", Manifest::TYPE_EXTENSION)); | 342 &warnings)); |
133 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 343 EXPECT_EQ("default-src 'self';", csp); |
134 "default-src 'self' https://*.google.com:*", Manifest::TYPE_EXTENSION)); | 344 EXPECT_EQ(1U, warnings.size()); |
135 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 345 EXPECT_EQ(InsecureValueWarning("default-src", "chrome://*"), |
136 "default-src 'self' https://*.google.com:1/", Manifest::TYPE_EXTENSION)); | 346 warnings[0].message); |
137 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 347 warnings.clear(); |
138 "default-src 'self' https://*.google.com:*/", Manifest::TYPE_EXTENSION)); | 348 |
139 | 349 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
140 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 350 "default-src 'self' chrome-extension://*", Manifest::TYPE_EXTENSION, &csp, |
141 "default-src 'self' http://127.0.0.1", Manifest::TYPE_EXTENSION)); | 351 &warnings)); |
142 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 352 EXPECT_EQ("default-src 'self';", csp); |
143 "default-src 'self' http://localhost", Manifest::TYPE_EXTENSION)); | 353 EXPECT_EQ(1U, warnings.size()); |
144 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 354 EXPECT_EQ(InsecureValueWarning("default-src", "chrome-extension://*"), |
145 "default-src 'self' http://lOcAlHoSt", Manifest::TYPE_EXTENSION)); | 355 warnings[0].message); |
146 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 356 warnings.clear(); |
147 "default-src 'self' http://127.0.0.1:9999", Manifest::TYPE_EXTENSION)); | 357 |
148 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 358 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
149 "default-src 'self' http://localhost:8888", Manifest::TYPE_EXTENSION)); | 359 "default-src 'self' chrome-extension://", Manifest::TYPE_EXTENSION, &csp, |
| 360 &warnings)); |
| 361 EXPECT_EQ("default-src 'self';", csp); |
| 362 EXPECT_EQ(1U, warnings.size()); |
| 363 EXPECT_EQ(InsecureValueWarning("default-src", "chrome-extension://"), |
| 364 warnings[0].message); |
| 365 warnings.clear(); |
| 366 |
| 367 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 368 "default-src 'self' https://*.google.com", Manifest::TYPE_EXTENSION, |
| 369 NULL, NULL)); |
| 370 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 371 "default-src 'self' https://*.google.com:1", Manifest::TYPE_EXTENSION, |
| 372 NULL, NULL)); |
| 373 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 374 "default-src 'self' https://*.google.com:*", Manifest::TYPE_EXTENSION, |
| 375 NULL, NULL)); |
| 376 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 377 "default-src 'self' https://*.google.com:1/", Manifest::TYPE_EXTENSION, |
| 378 NULL, NULL)); |
| 379 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 380 "default-src 'self' https://*.google.com:*/", Manifest::TYPE_EXTENSION, |
| 381 NULL, NULL)); |
| 382 |
| 383 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 384 "default-src 'self' http://127.0.0.1", Manifest::TYPE_EXTENSION, NULL, |
| 385 NULL)); |
| 386 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 387 "default-src 'self' http://localhost", Manifest::TYPE_EXTENSION, NULL, |
| 388 NULL)); |
| 389 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 390 "default-src 'self' http://lOcAlHoSt", Manifest::TYPE_EXTENSION, NULL, |
| 391 NULL)); |
| 392 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 393 "default-src 'self' http://127.0.0.1:9999", Manifest::TYPE_EXTENSION, |
| 394 NULL, NULL)); |
| 395 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 396 "default-src 'self' http://localhost:8888", Manifest::TYPE_EXTENSION, |
| 397 NULL, NULL)); |
150 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 398 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
151 "default-src 'self' http://127.0.0.1.example.com", | 399 "default-src 'self' http://127.0.0.1.example.com", |
152 Manifest::TYPE_EXTENSION)); | 400 Manifest::TYPE_EXTENSION, &csp, &warnings)); |
| 401 EXPECT_EQ("default-src 'self';", csp); |
| 402 EXPECT_EQ(1U, warnings.size()); |
| 403 EXPECT_EQ(InsecureValueWarning("default-src", "http://127.0.0.1.example.com"), |
| 404 warnings[0].message); |
| 405 warnings.clear(); |
| 406 |
153 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 407 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
154 "default-src 'self' http://localhost.example.com", | 408 "default-src 'self' http://localhost.example.com", |
155 Manifest::TYPE_EXTENSION)); | 409 Manifest::TYPE_EXTENSION, &csp, &warnings)); |
156 | 410 EXPECT_EQ("default-src 'self';", csp); |
157 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 411 EXPECT_EQ(1U, warnings.size()); |
158 "default-src 'self' blob:", Manifest::TYPE_EXTENSION)); | 412 EXPECT_EQ(InsecureValueWarning("default-src", "http://localhost.example.com"), |
| 413 warnings[0].message); |
| 414 warnings.clear(); |
| 415 |
| 416 |
| 417 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 418 "default-src 'self' blob:", Manifest::TYPE_EXTENSION, NULL, NULL)); |
159 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 419 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
160 "default-src 'self' blob:http://example.com/XXX", | 420 "default-src 'self' blob:http://example.com/XXX", |
161 Manifest::TYPE_EXTENSION)); | 421 Manifest::TYPE_EXTENSION, &csp, &warnings)); |
162 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 422 EXPECT_EQ("default-src 'self';", csp); |
163 "default-src 'self' filesystem:", Manifest::TYPE_EXTENSION)); | 423 EXPECT_EQ(1U, warnings.size()); |
| 424 EXPECT_EQ(InsecureValueWarning("default-src", "blob:http://example.com/xxx"), |
| 425 warnings[0].message); |
| 426 warnings.clear(); |
| 427 |
| 428 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 429 "default-src 'self' filesystem:", Manifest::TYPE_EXTENSION, NULL, NULL)); |
164 EXPECT_FALSE(ContentSecurityPolicyIsSecure( | 430 EXPECT_FALSE(ContentSecurityPolicyIsSecure( |
165 "default-src 'self' filesystem:http://example.com/XXX", | 431 "default-src 'self' filesystem:http://example.com/XXX", |
166 Manifest::TYPE_EXTENSION)); | 432 Manifest::TYPE_EXTENSION, &csp, &warnings)); |
167 | 433 EXPECT_EQ("default-src 'self';", csp); |
168 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 434 EXPECT_EQ(1U, warnings.size()); |
169 "default-src 'self' https://*.googleapis.com", Manifest::TYPE_EXTENSION)); | 435 EXPECT_EQ(InsecureValueWarning("default-src", |
170 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 436 "filesystem:http://example.com/xxx"), |
171 "default-src 'self' https://x.googleapis.com", Manifest::TYPE_EXTENSION)); | 437 warnings[0].message); |
172 // "chrome-extension://" is an invalid CSP and ignored by Blink, but extension | 438 warnings.clear(); |
173 // authors have been using this string anyway, so we cannot refuse this string | 439 |
174 // until extensions can be loaded with an invalid CSP. http://crbug.com/434773 | 440 |
175 EXPECT_TRUE(ContentSecurityPolicyIsSecure( | 441 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
176 "default-src 'self' chrome-extension://", Manifest::TYPE_EXTENSION)); | 442 "default-src 'self' https://*.googleapis.com", Manifest::TYPE_EXTENSION, |
| 443 NULL, NULL)); |
| 444 EXPECT_TRUE(ContentSecurityPolicyIsSecure( |
| 445 "default-src 'self' https://x.googleapis.com", Manifest::TYPE_EXTENSION, |
| 446 NULL, NULL)); |
177 } | 447 } |
178 | 448 |
179 TEST(ExtensionCSPValidator, IsSandboxed) { | 449 TEST(ExtensionCSPValidator, IsSandboxed) { |
180 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed(std::string(), | 450 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed(std::string(), |
181 Manifest::TYPE_EXTENSION)); | 451 Manifest::TYPE_EXTENSION)); |
182 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed("img-src https://google.com", | 452 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed("img-src https://google.com", |
183 Manifest::TYPE_EXTENSION)); | 453 Manifest::TYPE_EXTENSION)); |
184 | 454 |
185 // Sandbox directive is required. | 455 // Sandbox directive is required. |
186 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( | 456 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( |
(...skipping 15 matching lines...) Expand all Loading... |
202 "sandbox allow-top-navigation", Manifest::TYPE_EXTENSION)); | 472 "sandbox allow-top-navigation", Manifest::TYPE_EXTENSION)); |
203 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed( | 473 EXPECT_FALSE(ContentSecurityPolicyIsSandboxed( |
204 "sandbox allow-top-navigation", Manifest::TYPE_PLATFORM_APP)); | 474 "sandbox allow-top-navigation", Manifest::TYPE_PLATFORM_APP)); |
205 | 475 |
206 // Popups are OK. | 476 // Popups are OK. |
207 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( | 477 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( |
208 "sandbox allow-popups", Manifest::TYPE_EXTENSION)); | 478 "sandbox allow-popups", Manifest::TYPE_EXTENSION)); |
209 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( | 479 EXPECT_TRUE(ContentSecurityPolicyIsSandboxed( |
210 "sandbox allow-popups", Manifest::TYPE_PLATFORM_APP)); | 480 "sandbox allow-popups", Manifest::TYPE_PLATFORM_APP)); |
211 } | 481 } |
OLD | NEW |