CSP: Extract helper classes into their own files
[WebKit-https.git] / Source / WebCore / page / csp / ContentSecurityPolicy.h
1 /*
2  * Copyright (C) 2011 Google, Inc. All rights reserved.
3  * Copyright (C) 2016 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef ContentSecurityPolicy_h
28 #define ContentSecurityPolicy_h
29
30 #include "ContentSecurityPolicyResponseHeaders.h"
31 #include "ScriptState.h"
32 #include <wtf/Vector.h>
33 #include <wtf/text/TextPosition.h>
34
35 namespace WTF {
36 class OrdinalNumber;
37 }
38
39 namespace WebCore {
40
41 class ContentSecurityPolicyDirectiveList;
42 class ContentSecurityPolicySource;
43 class DOMStringList;
44 class ScriptExecutionContext;
45 class SecurityOrigin;
46 class URL;
47
48 typedef Vector<std::unique_ptr<ContentSecurityPolicyDirectiveList>> CSPDirectiveListVector;
49 typedef int SandboxFlags;
50
51 class ContentSecurityPolicy {
52     WTF_MAKE_FAST_ALLOCATED;
53 public:
54     explicit ContentSecurityPolicy(ScriptExecutionContext&);
55     explicit ContentSecurityPolicy(const SecurityOrigin&);
56     ~ContentSecurityPolicy();
57
58     void copyStateFrom(const ContentSecurityPolicy*);
59
60     // Be sure to update the behavior of XSSAuditor::combineXSSProtectionHeaderAndCSP whenever you change this enum's content or ordering.
61     enum ReflectedXSSDisposition {
62         ReflectedXSSUnset = 0,
63         AllowReflectedXSS,
64         ReflectedXSSInvalid,
65         FilterReflectedXSS,
66         BlockReflectedXSS
67     };
68     ReflectedXSSDisposition reflectedXSSDisposition() const;
69
70     ContentSecurityPolicyResponseHeaders responseHeaders() const;
71     void didReceiveHeaders(const ContentSecurityPolicyResponseHeaders&);
72     void didReceiveHeader(const String&, ContentSecurityPolicyHeaderType);
73
74     enum class ReportingStatus {
75         SendReport,
76         SuppressReport
77     };
78     bool allowJavaScriptURLs(const String& contextURL, const WTF::OrdinalNumber& contextLine, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
79     bool allowInlineEventHandlers(const String& contextURL, const WTF::OrdinalNumber& contextLine, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
80     bool allowInlineScript(const String& contextURL, const WTF::OrdinalNumber& contextLine, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
81     bool allowInlineStyle(const String& contextURL, const WTF::OrdinalNumber& contextLine, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
82     bool allowEval(JSC::ExecState* = nullptr, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
83     bool allowPluginType(const String& type, const String& typeAttribute, const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
84     bool allowScriptFromSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
85     bool allowObjectFromSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
86     bool allowChildFrameFromSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
87     bool allowImageFromSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
88     bool allowStyleFromSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
89     bool allowFontFromSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
90     bool allowMediaFromSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
91     bool allowConnectToSource(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
92     bool allowFormAction(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
93     bool allowBaseURI(const URL&, bool overrideContentSecurityPolicy = false, ContentSecurityPolicy::ReportingStatus = ContentSecurityPolicy::ReportingStatus::SendReport) const;
94
95     void setOverrideAllowInlineStyle(bool);
96
97     bool isActive() const;
98
99     void gatherReportURIs(DOMStringList&) const;
100
101     String evalDisabledErrorMessage() const;
102
103     bool experimentalFeaturesEnabled() const;
104
105     // The following functions are used by internal data structures to call back into this object when parsing, validating,
106     // and applying a Content Security Policy.
107     // FIXME: We should make the various directives serve only as state stores for the parsed policy and remove these functions.
108     // This class should traverse the directives, validating the policy, and applying it to the script execution context.
109
110     // Used by ContentSecurityPolicyMediaListDirective
111     void reportInvalidPluginTypes(const String&) const;
112
113     // Used by ContentSecurityPolicySourceList
114     void reportDirectiveAsSourceExpression(const String& directiveName, const String& sourceExpression) const;
115     void reportInvalidPathCharacter(const String& directiveName, const String& value, const char) const;
116     void reportInvalidSourceExpression(const String& directiveName, const String& source) const;
117     bool urlMatchesSelf(const URL&) const;
118
119     // Used by ContentSecurityPolicyDirectiveList
120     void reportDuplicateDirective(const String&) const;
121     void reportInvalidDirectiveValueCharacter(const String& directiveName, const String& value) const;
122     void reportInvalidSandboxFlags(const String&) const;
123     void reportInvalidReflectedXSS(const String&) const;
124     void reportMissingReportURI(const String&) const;
125     void reportUnsupportedDirective(const String&) const;
126     void reportViolation(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const URL& blockedURL, const Vector<String>& reportURIs, const String& header, const String& contextURL = String(), const WTF::OrdinalNumber& contextLine = WTF::OrdinalNumber::beforeFirst(), JSC::ExecState* = nullptr) const;
127     void reportBlockedScriptExecutionToInspector(const String& directiveText) const;
128     void enforceSandboxFlags(SandboxFlags sandboxFlags) { m_sandboxFlags |= sandboxFlags; }
129
130     // Used by ContentSecurityPolicySource
131     bool protocolMatchesSelf(const URL&) const;
132
133 private:
134     void logToConsole(const String& message, const String& contextURL = String(), const WTF::OrdinalNumber& contextLine = WTF::OrdinalNumber::beforeFirst(), JSC::ExecState* = nullptr) const;
135     void applyPolicyToScriptExecutionContext();
136
137     ScriptExecutionContext* m_scriptExecutionContext { nullptr };
138     std::unique_ptr<ContentSecurityPolicySource> m_selfSource;
139     String m_selfSourceProtocol;
140     CSPDirectiveListVector m_policies;
141     String m_lastPolicyEvalDisabledErrorMessage;
142     SandboxFlags m_sandboxFlags;
143     bool m_overrideInlineStyleAllowed { false };
144 };
145
146 }
147
148 #endif