Index: Source/core/frame/csp/CSPDirectiveList.h |
diff --git a/Source/core/frame/csp/CSPDirectiveList.h b/Source/core/frame/csp/CSPDirectiveList.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0c343d156c64492d051980cebe7debe33f5edffd |
--- /dev/null |
+++ b/Source/core/frame/csp/CSPDirectiveList.h |
@@ -0,0 +1,141 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CSPDirectiveList_h |
+#define CSPDirectiveList_h |
+ |
+#include "core/frame/ContentSecurityPolicy.h" |
+#include "core/frame/csp/MediaListDirective.h" |
+#include "core/frame/csp/SourceListDirective.h" |
+#include "platform/network/ContentSecurityPolicyParsers.h" |
+#include "platform/network/HTTPParsers.h" |
+#include "platform/weborigin/KURL.h" |
+#include "platform/weborigin/ReferrerPolicy.h" |
+#include "wtf/OwnPtr.h" |
+#include "wtf/Vector.h" |
+#include "wtf/text/WTFString.h" |
+ |
+namespace WebCore { |
+ |
+class ContentSecurityPolicy; |
+ |
+class CSPDirectiveList { |
+ WTF_MAKE_FAST_ALLOCATED; |
+ WTF_MAKE_NONCOPYABLE(CSPDirectiveList); |
+public: |
+ static PassOwnPtr<CSPDirectiveList> create(ContentSecurityPolicy*, const UChar* begin, const UChar* end, ContentSecurityPolicyHeaderType, ContentSecurityPolicyHeaderSource); |
+ |
+ void parse(const UChar* begin, const UChar* end); |
+ |
+ const String& header() const { return m_header; } |
+ ContentSecurityPolicyHeaderType headerType() const { return m_headerType; } |
+ ContentSecurityPolicyHeaderSource headerSource() const { return m_headerSource; } |
+ |
+ bool allowJavaScriptURLs(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowInlineEventHandlers(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowInlineScript(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowInlineStyle(const String& contextURL, const WTF::OrdinalNumber& contextLine, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowEval(ScriptState*, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowPluginType(const String& type, const String& typeAttribute, const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ |
+ bool allowScriptFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowObjectFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowChildFrameFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowImageFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowStyleFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowFontFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowMediaFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowConnectToSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowFormAction(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowBaseURI(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowAncestors(LocalFrame*, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowChildContextFromSource(const KURL&, ContentSecurityPolicy::ReportingStatus) const; |
+ bool allowScriptNonce(const String&) const; |
+ bool allowStyleNonce(const String&) const; |
+ bool allowScriptHash(const CSPHashValue&) const; |
+ bool allowStyleHash(const CSPHashValue&) const; |
+ |
+ const String& evalDisabledErrorMessage() const { return m_evalDisabledErrorMessage; } |
+ ReflectedXSSDisposition reflectedXSSDisposition() const { return m_reflectedXSSDisposition; } |
+ ReferrerPolicy referrerPolicy() const { return m_referrerPolicy; } |
+ bool didSetReferrerPolicy() const { return m_didSetReferrerPolicy; } |
+ bool isReportOnly() const { return m_reportOnly; } |
+ const Vector<KURL>& reportURIs() const { return m_reportURIs; } |
+ |
+private: |
+ CSPDirectiveList(ContentSecurityPolicy*, ContentSecurityPolicyHeaderType, ContentSecurityPolicyHeaderSource); |
+ |
+ bool parseDirective(const UChar* begin, const UChar* end, String& name, String& value); |
+ void parseReportURI(const String& name, const String& value); |
+ void parsePluginTypes(const String& name, const String& value); |
+ void parseReflectedXSS(const String& name, const String& value); |
+ void parseReferrer(const String& name, const String& value); |
+ void addDirective(const String& name, const String& value); |
+ void applySandboxPolicy(const String& name, const String& sandboxPolicy); |
+ |
+ template <class CSPDirectiveType> |
+ void setCSPDirective(const String& name, const String& value, OwnPtr<CSPDirectiveType>&); |
+ |
+ SourceListDirective* operativeDirective(SourceListDirective*) const; |
+ SourceListDirective* operativeDirective(SourceListDirective*, SourceListDirective* override) const; |
+ void reportViolation(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const KURL& blockedURL) const; |
+ void reportViolationWithLocation(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const KURL& blockedURL, const String& contextURL, const WTF::OrdinalNumber& contextLine) const; |
+ void reportViolationWithState(const String& directiveText, const String& effectiveDirective, const String& consoleMessage, const KURL& blockedURL, ScriptState*) const; |
+ |
+ bool checkEval(SourceListDirective*) const; |
+ bool checkInline(SourceListDirective*) const; |
+ bool checkNonce(SourceListDirective*, const String&) const; |
+ bool checkHash(SourceListDirective*, const CSPHashValue&) const; |
+ bool checkSource(SourceListDirective*, const KURL&) const; |
+ bool checkMediaType(MediaListDirective*, const String& type, const String& typeAttribute) const; |
+ bool checkAncestors(SourceListDirective*, LocalFrame*) const; |
+ |
+ void setEvalDisabledErrorMessage(const String& errorMessage) { m_evalDisabledErrorMessage = errorMessage; } |
+ |
+ bool checkEvalAndReportViolation(SourceListDirective*, const String& consoleMessage, ScriptState*) const; |
+ bool checkInlineAndReportViolation(SourceListDirective*, const String& consoleMessage, const String& contextURL, const WTF::OrdinalNumber& contextLine, bool isScript) const; |
+ |
+ bool checkSourceAndReportViolation(SourceListDirective*, const KURL&, const String& effectiveDirective) const; |
+ bool checkMediaTypeAndReportViolation(MediaListDirective*, const String& type, const String& typeAttribute, const String& consoleMessage) const; |
+ bool checkAncestorsAndReportViolation(SourceListDirective*, LocalFrame*) const; |
+ |
+ bool denyIfEnforcingPolicy() const { return m_reportOnly; } |
+ |
+ ContentSecurityPolicy* m_policy; |
+ |
+ String m_header; |
+ ContentSecurityPolicyHeaderType m_headerType; |
+ ContentSecurityPolicyHeaderSource m_headerSource; |
+ |
+ bool m_reportOnly; |
+ bool m_haveSandboxPolicy; |
+ ReflectedXSSDisposition m_reflectedXSSDisposition; |
+ |
+ bool m_didSetReferrerPolicy; |
+ ReferrerPolicy m_referrerPolicy; |
+ |
+ OwnPtr<MediaListDirective> m_pluginTypes; |
+ OwnPtr<SourceListDirective> m_baseURI; |
+ OwnPtr<SourceListDirective> m_childSrc; |
+ OwnPtr<SourceListDirective> m_connectSrc; |
+ OwnPtr<SourceListDirective> m_defaultSrc; |
+ OwnPtr<SourceListDirective> m_fontSrc; |
+ OwnPtr<SourceListDirective> m_formAction; |
+ OwnPtr<SourceListDirective> m_frameAncestors; |
+ OwnPtr<SourceListDirective> m_frameSrc; |
+ OwnPtr<SourceListDirective> m_imgSrc; |
+ OwnPtr<SourceListDirective> m_mediaSrc; |
+ OwnPtr<SourceListDirective> m_objectSrc; |
+ OwnPtr<SourceListDirective> m_scriptSrc; |
+ OwnPtr<SourceListDirective> m_styleSrc; |
+ |
+ Vector<KURL> m_reportURIs; |
+ |
+ String m_evalDisabledErrorMessage; |
+}; |
+ |
+ |
+} // namespace |
+ |
+#endif |