CSP: Extract helper classes into their own files
[WebKit-https.git] / Source / WebCore / page / csp / ContentSecurityPolicyDirectiveList.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 ContentSecurityPolicyDirectiveList_h
28 #define ContentSecurityPolicyDirectiveList_h
29
30 #include "ContentSecurityPolicy.h"
31 #include "ContentSecurityPolicyMediaListDirective.h"
32 #include "ContentSecurityPolicySourceListDirective.h"
33 #include "URL.h"
34 #include <wtf/Noncopyable.h>
35
36 namespace WebCore {
37
38 bool isCSPDirectiveName(const String&);
39
40 class ContentSecurityPolicyDirectiveList {
41     WTF_MAKE_FAST_ALLOCATED;
42     WTF_MAKE_NONCOPYABLE(ContentSecurityPolicyDirectiveList)
43 public:
44     static std::unique_ptr<ContentSecurityPolicyDirectiveList> create(ContentSecurityPolicy&, const String&, ContentSecurityPolicyHeaderType);
45     ContentSecurityPolicyDirectiveList(ContentSecurityPolicy&, ContentSecurityPolicyHeaderType);
46
47     const String& header() const { return m_header; }
48     ContentSecurityPolicyHeaderType headerType() const { return m_headerType; }
49
50     bool allowJavaScriptURLs(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const;
51     bool allowInlineEventHandlers(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const;
52     bool allowInlineScript(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const;
53     bool allowInlineStyle(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const;
54     bool allowEval(JSC::ExecState*, ContentSecurityPolicy::ReportingStatus) const;
55     bool allowPluginType(const String& type, const String& typeAttribute, const URL&, ContentSecurityPolicy::ReportingStatus) const;
56
57     bool allowScriptFromSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
58     bool allowObjectFromSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
59     bool allowChildFrameFromSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
60     bool allowImageFromSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
61     bool allowStyleFromSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
62     bool allowFontFromSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
63     bool allowMediaFromSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
64     bool allowConnectToSource(const URL&, ContentSecurityPolicy::ReportingStatus) const;
65     bool allowFormAction(const URL&, ContentSecurityPolicy::ReportingStatus) const;
66     bool allowBaseURI(const URL&, ContentSecurityPolicy::ReportingStatus) const;
67
68     const String& evalDisabledErrorMessage() const { return m_evalDisabledErrorMessage; }
69     ContentSecurityPolicy::ReflectedXSSDisposition reflectedXSSDisposition() const { return m_reflectedXSSDisposition; }
70     bool isReportOnly() const { return m_reportOnly; }
71     const Vector<String>& reportURIs() const { return m_reportURIs; }
72
73 private:
74     void parse(const String&);
75
76     bool parseDirective(const UChar* begin, const UChar* end, String& name, String& value);
77     void parseReportURI(const String& name, const String& value);
78     void parsePluginTypes(const String& name, const String& value);
79     void parseReflectedXSS(const String& name, const String& value);
80     void addDirective(const String& name, const String& value);
81     void applySandboxPolicy(const String& name, const String& sandboxPolicy);
82
83     template <class CSPDirectiveType>
84     void setCSPDirective(const String& name, const String& value, std::unique_ptr<CSPDirectiveType>&);
85
86     ContentSecurityPolicySourceListDirective* operativeDirective(ContentSecurityPolicySourceListDirective*) const;
87     void reportViolation(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const URL& blockedURL = URL(), const String& contextURL = String(), const WTF::OrdinalNumber& contextLine = WTF::OrdinalNumber::beforeFirst(), JSC::ExecState* = nullptr) const;
88
89     bool checkEval(ContentSecurityPolicySourceListDirective*) const;
90     bool checkInline(ContentSecurityPolicySourceListDirective*) const;
91     bool checkSource(ContentSecurityPolicySourceListDirective*, const URL&) const;
92     bool checkMediaType(ContentSecurityPolicyMediaListDirective*, const String& type, const String& typeAttribute) const;
93
94     void setEvalDisabledErrorMessage(const String& errorMessage) { m_evalDisabledErrorMessage = errorMessage; }
95
96     bool checkEvalAndReportViolation(ContentSecurityPolicySourceListDirective*, const String& consoleMessage, const String& contextURL = String(), const WTF::OrdinalNumber& contextLine = WTF::OrdinalNumber::beforeFirst(), JSC::ExecState* = nullptr) const;
97     bool checkInlineAndReportViolation(ContentSecurityPolicySourceListDirective*, const String& consoleMessage, const String& contextURL, const WTF::OrdinalNumber& contextLine, bool isScript) const;
98
99     bool checkSourceAndReportViolation(ContentSecurityPolicySourceListDirective*, const URL&, const String& effectiveDirective) const;
100     bool checkMediaTypeAndReportViolation(ContentSecurityPolicyMediaListDirective*, const String& type, const String& typeAttribute, const String& consoleMessage) const;
101
102     bool denyIfEnforcingPolicy() const { return m_reportOnly; }
103
104     // FIXME: Make this a const reference once we teach applySandboxPolicy() to store its policy as opposed to applying it directly onto ContentSecurityPolicy.
105     ContentSecurityPolicy& m_policy;
106
107     String m_header;
108     ContentSecurityPolicyHeaderType m_headerType;
109
110     bool m_reportOnly;
111     bool m_haveSandboxPolicy;
112     ContentSecurityPolicy::ReflectedXSSDisposition m_reflectedXSSDisposition;
113
114     std::unique_ptr<ContentSecurityPolicyMediaListDirective> m_pluginTypes;
115     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_baseURI;
116     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_connectSrc;
117     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_defaultSrc;
118     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_fontSrc;
119     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_formAction;
120     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_frameSrc;
121     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_imgSrc;
122     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_mediaSrc;
123     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_objectSrc;
124     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_scriptSrc;
125     std::unique_ptr<ContentSecurityPolicySourceListDirective> m_styleSrc;
126     
127     Vector<String> m_reportURIs;
128     
129     String m_evalDisabledErrorMessage;
130 };
131
132 } // namespace WebCore
133
134 #endif /* ContentSecurityPolicyDirectiveList_h */