Chromium Code Reviews| Index: third_party/WebKit/Source/core/frame/csp/SourceListDirectiveTest.cpp |
| diff --git a/third_party/WebKit/Source/core/frame/csp/SourceListDirectiveTest.cpp b/third_party/WebKit/Source/core/frame/csp/SourceListDirectiveTest.cpp |
| index 0e1fcc34adae68fd354a3501fc0c6cacfaf702bb..e0810de2d4cbda19cbcf064a36b601b57a8c94e3 100644 |
| --- a/third_party/WebKit/Source/core/frame/csp/SourceListDirectiveTest.cpp |
| +++ b/third_party/WebKit/Source/core/frame/csp/SourceListDirectiveTest.cpp |
| @@ -851,4 +851,200 @@ TEST_F(SourceListDirectiveTest, IsNone) { |
| } |
| } |
| +TEST_F(SourceListDirectiveTest, GetIntersectNonces) { |
| + SourceListDirective listA( |
| + "script-src", |
| + "http://example.com 'nonce-abc' 'nonce-xyz' 'nonce' 'unsafe-inline'", |
|
Mike West
2016/12/07 13:32:46
Is `'nonce'` the template bit we talked about? If
amalika
2016/12/07 15:11:51
it was intended to be a non-valid nonce. I changed
|
| + csp.get()); |
| + struct TestCase { |
| + String sources; |
| + String expected; |
| + String expectedReversed; |
|
Mike West
2016/12/07 13:32:46
You don't define this in any of the items below. D
amalika
2016/12/07 15:11:51
Hm yes, it is weird it compiles like this.
|
| + } cases[] = { |
| + {"http:", ""}, |
|
Mike West
2016/12/07 13:32:46
Might as well add tests for `'unsafe-inline'`, `ht
amalika
2016/12/07 15:11:51
Added!
|
| + {"'nonce-abc'", "'nonce-abc'"}, |
| + {"'nonce-xyz'", "'nonce-xyz'"}, |
| + {"'nonce-123'", ""}, |
| + {"'nonce-abc' 'nonce-xyz'", "'nonce-abc' 'nonce-xyz'"}, |
| + {"'nonce-abc' 'nonce-xyz' 'nonce'", "'nonce-abc' 'nonce-xyz'"}, |
| + {"'nonce-abc' 'nonce-123'", "'nonce-abc'"}, |
| + {"'nonce-123' 'nonce-123'", ""}, |
| + {"'nonce-123' 'nonce-abc'", "'nonce-abc'"}, |
| + {"'nonce-123' 'nonce-xyz'", "'nonce-xyz'"}, |
| + {"'nonce-123' 'nonce-xyx'", ""}, |
| + }; |
| + |
| + for (const auto& test : cases) { |
| + SourceListDirective listB("script-src", test.sources, csp.get()); |
| + HashSet<String> normalized = listA.getIntersectNonces(listB.m_nonces); |
| + |
| + SourceListDirective expectedList("script-src", test.expected, csp.get()); |
| + HashSet<String> expected = expectedList.m_nonces; |
| + EXPECT_EQ(normalized.size(), expected.size()); |
| + for (const auto& nonce : normalized) { |
| + EXPECT_TRUE(expected.contains(nonce)); |
| + } |
| + } |
| +} |
| + |
| +TEST_F(SourceListDirectiveTest, GetIntersectHashes) { |
| + SourceListDirective listA( |
| + "script-src", |
| + "http://example.com 'sha256-abc123' 'sha384-' 'sha512-321cba' 'self'", |
| + csp.get()); |
| + struct TestCase { |
| + String sources; |
| + String expected; |
| + String expectedReversed; |
| + } cases[] = { |
| + {"http:", ""}, |
| + {"'sha384-abc'", ""}, |
| + {"'sha384-'", ""}, |
| + {"'sha256-abc123'", "'sha256-abc123'"}, |
| + {"'sha256-abc123' 'sha384-'", "'sha256-abc123'"}, |
| + {"'sha256-abc123' 'sha512-321cba'", "'sha512-321cba' 'sha256-abc123'"}, |
| + {"'sha256-abc123' 'sha384-' 'sha512-321cba'", |
| + "'sha256-abc123' 'sha512-321cba' "}, |
| + {"'sha256-else' 'sha384-' 'sha512-321cba'", "'sha512-321cba' "}, |
| + {"'hash-123'", ""}, |
| + {"'sha256-123'", ""}, |
| + }; |
| + |
| + for (const auto& test : cases) { |
| + SourceListDirective listB("script-src", test.sources, csp.get()); |
| + HashSet<CSPHashValue> normalized = listA.getIntersectHashes(listB.m_hashes); |
| + |
| + SourceListDirective expectedList("script-src", test.expected, csp.get()); |
| + HashSet<CSPHashValue> expected = expectedList.m_hashes; |
| + EXPECT_EQ(normalized.size(), expected.size()); |
| + for (const auto& hash : normalized) { |
| + EXPECT_TRUE(expected.contains(hash)); |
| + } |
| + } |
| +} |
| + |
| +TEST_F(SourceListDirectiveTest, SubsumesNoncesAndHashes) { |
| + struct TestCase { |
| + bool isScriptSrc; |
| + String sourcesA; |
| + std::vector<String> sourcesB; |
| + bool expected; |
| + } cases[] = { |
| + // Check nonces. |
| + {true, |
| + "http://example1.com/foo/ 'unsafe-inline' 'nonce-abc'", |
| + {"'unsafe-inline'"}, |
| + false}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'nonce-abc'", |
| + {"'nonce-abc'"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline'", |
| + {"'unsafe-inline' 'nonce-yay'", "'nonce-yay'"}, |
| + false}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'nonce-yay'", |
| + {"'unsafe-inline' 'nonce-yay'", "'nonce-yay'"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'nonce-abc' 'nonce-yay'", |
| + {"'unsafe-inline' https://example.test/"}, |
| + false}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'nonce-abc' 'nonce-yay'", |
| + {"'nonce-abc' https://example1.com/foo/"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'nonce-yay' " |
| + "'strict-dynamic'", |
| + {"https://example.test/ 'nonce-yay'"}, |
| + false}, |
| + {false, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'nonce-yay' " |
| + "'strict-dynamic'", |
| + {"'nonce-yay' https://example1.com/foo/"}, |
| + true}, |
| + // Check hashes. |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321cba'", |
| + {"http://example1.com/foo/page.html 'strict-dynamic'", |
| + "https://example1.com/foo/ 'sha512-321cba'"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321cba'", |
| + {"http://some-other.com/ 'strict-dynamic' 'sha512-321cba'", |
| + "http://example1.com/foo/ 'unsafe-inline' 'sha512-321cba'"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321cba'", |
| + {"http://example1.com/foo/ 'sha512-321abc' 'sha512-321cba'", |
| + "http://example1.com/foo/ 'sha512-321abc' 'sha512-321cba'"}, |
| + false}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321cba'", |
| + {"http://example1.com/foo/ 'unsafe-inline'", |
| + "http://example1.com/foo/ 'sha512-321cba'"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321abc'", |
| + {"http://example1.com/foo/ 'unsafe-inline' 'sha512-321abc'", |
| + "http://example1.com/foo/ 'sha512-321abc'"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321abc'", |
| + {"'unsafe-inline' 'sha512-321abc'", |
| + "http://example1.com/foo/ 'sha512-321abc'"}, |
| + true}, |
| + // Nonces and hashes together. |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321abc' " |
| + "'nonce-abc'", |
| + {"'unsafe-inline' 'sha512-321abc' 'self'", |
| + "'unsafe-inline''sha512-321abc' https://example.test/"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321abc' " |
| + "'nonce-abc'", |
| + {"'unsafe-inline' 'sha512-321abc' 'self' 'nonce-abc'", |
| + "'sha512-321abc' https://example.test/"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321abc' " |
| + "'nonce-abc'", |
| + {"'unsafe-inline' 'sha512-321abc' 'self'", |
| + " 'sha512-321abc' https://example.test/ 'nonce-abc'"}, |
| + true}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321abc' " |
| + "'nonce-abc'", |
| + {"'unsafe-inline' 'sha512-321abc' 'self' 'nonce-xyz'", |
| + "unsafe-inline' 'sha512-321abc' https://example.test/ 'nonce-xyz'"}, |
| + false}, |
| + {true, |
| + "http://example1.com/foo/ 'self' 'unsafe-inline' 'sha512-321abc' " |
| + "'nonce-abc'", |
| + {"'unsafe-inline' 'sha512-321abc' 'self' 'sha512-xyz'", |
| + "unsafe-inline' 'sha512-321abc' https://example.test/ 'sha512-xyz'"}, |
| + false}, |
| + |
| + }; |
| + |
| + for (const auto& test : cases) { |
| + SourceListDirective A(test.isScriptSrc ? "script-src" : "style-src", |
| + test.sourcesA, csp.get()); |
| + ContentSecurityPolicy* cspB = |
| + SetUpWithOrigin("https://another.test/image.png"); |
| + |
| + HeapVector<Member<SourceListDirective>> vectorB; |
| + for (const auto& sources : test.sourcesB) { |
| + SourceListDirective* member = new SourceListDirective( |
| + test.isScriptSrc ? "script-src" : "style-src", sources, cspB); |
| + vectorB.append(member); |
| + } |
| + |
| + EXPECT_EQ(A.subsumes(vectorB), test.expected); |
| + } |
| +} |
| + |
| } // namespace blink |