summaryrefslogtreecommitdiff
path: root/Source/WebCore/dom/SecurityContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/dom/SecurityContext.cpp')
-rw-r--r--Source/WebCore/dom/SecurityContext.cpp56
1 files changed, 39 insertions, 17 deletions
diff --git a/Source/WebCore/dom/SecurityContext.cpp b/Source/WebCore/dom/SecurityContext.cpp
index d83fdf22c..af29a164b 100644
--- a/Source/WebCore/dom/SecurityContext.cpp
+++ b/Source/WebCore/dom/SecurityContext.cpp
@@ -13,7 +13,7 @@
* THIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
@@ -30,13 +30,14 @@
#include "ContentSecurityPolicy.h"
#include "HTMLParserIdioms.h"
#include "SecurityOrigin.h"
+#include "SecurityOriginPolicy.h"
+#include <wtf/NeverDestroyed.h>
#include <wtf/text/StringBuilder.h>
namespace WebCore {
SecurityContext::SecurityContext()
- : m_mayDisplaySeamlesslyWithParent(false)
- , m_haveInitializedSecurityOrigin(false)
+ : m_haveInitializedSecurityOrigin(false)
, m_sandboxFlags(SandboxNone)
{
}
@@ -45,15 +46,23 @@ SecurityContext::~SecurityContext()
{
}
-void SecurityContext::setSecurityOrigin(PassRefPtr<SecurityOrigin> securityOrigin)
+void SecurityContext::setSecurityOriginPolicy(RefPtr<SecurityOriginPolicy>&& securityOriginPolicy)
{
- m_securityOrigin = securityOrigin;
+ m_securityOriginPolicy = WTFMove(securityOriginPolicy);
m_haveInitializedSecurityOrigin = true;
}
-void SecurityContext::setContentSecurityPolicy(PassOwnPtr<ContentSecurityPolicy> contentSecurityPolicy)
+SecurityOrigin* SecurityContext::securityOrigin() const
{
- m_contentSecurityPolicy = contentSecurityPolicy;
+ if (!m_securityOriginPolicy)
+ return nullptr;
+
+ return &m_securityOriginPolicy->origin();
+}
+
+void SecurityContext::setContentSecurityPolicy(std::unique_ptr<ContentSecurityPolicy> contentSecurityPolicy)
+{
+ m_contentSecurityPolicy = WTFMove(contentSecurityPolicy);
}
bool SecurityContext::isSecureTransitionTo(const URL& url) const
@@ -64,8 +73,7 @@ bool SecurityContext::isSecureTransitionTo(const URL& url) const
if (!haveInitializedSecurityOrigin())
return true;
- RefPtr<SecurityOrigin> other = SecurityOrigin::create(url);
- return securityOrigin()->canAccess(other.get());
+ return securityOriginPolicy()->origin().canAccess(SecurityOrigin::create(url).get());
}
void SecurityContext::enforceSandboxFlags(SandboxFlags mask)
@@ -73,10 +81,24 @@ void SecurityContext::enforceSandboxFlags(SandboxFlags mask)
m_sandboxFlags |= mask;
// The SandboxOrigin is stored redundantly in the security origin.
- if (isSandboxed(SandboxOrigin) && securityOrigin() && !securityOrigin()->isUnique())
- setSecurityOrigin(SecurityOrigin::createUnique());
+ if (isSandboxed(SandboxOrigin) && securityOriginPolicy() && !securityOriginPolicy()->origin().isUnique())
+ setSecurityOriginPolicy(SecurityOriginPolicy::create(SecurityOrigin::createUnique()));
+}
+
+bool SecurityContext::isSupportedSandboxPolicy(StringView policy)
+{
+ static const char* const supportedPolicies[] = {
+ "allow-forms", "allow-same-origin", "allow-scripts", "allow-top-navigation", "allow-pointer-lock", "allow-popups"
+ };
+
+ for (auto* supportedPolicy : supportedPolicies) {
+ if (equalIgnoringASCIICase(policy, supportedPolicy))
+ return true;
+ }
+ return false;
}
+// Keep SecurityContext::isSupportedSandboxPolicy() in sync when updating this function.
SandboxFlags SecurityContext::parseSandboxPolicy(const String& policy, String& invalidTokensErrorMessage)
{
// http://www.w3.org/TR/html5/the-iframe-element.html#attr-iframe-sandbox
@@ -97,18 +119,18 @@ SandboxFlags SecurityContext::parseSandboxPolicy(const String& policy, String& i
// Turn off the corresponding sandbox flag if it's set as "allowed".
String sandboxToken = policy.substring(start, end - start);
- if (equalIgnoringCase(sandboxToken, "allow-same-origin"))
+ if (equalLettersIgnoringASCIICase(sandboxToken, "allow-same-origin"))
flags &= ~SandboxOrigin;
- else if (equalIgnoringCase(sandboxToken, "allow-forms"))
+ else if (equalLettersIgnoringASCIICase(sandboxToken, "allow-forms"))
flags &= ~SandboxForms;
- else if (equalIgnoringCase(sandboxToken, "allow-scripts")) {
+ else if (equalLettersIgnoringASCIICase(sandboxToken, "allow-scripts")) {
flags &= ~SandboxScripts;
flags &= ~SandboxAutomaticFeatures;
- } else if (equalIgnoringCase(sandboxToken, "allow-top-navigation"))
+ } else if (equalLettersIgnoringASCIICase(sandboxToken, "allow-top-navigation"))
flags &= ~SandboxTopNavigation;
- else if (equalIgnoringCase(sandboxToken, "allow-popups"))
+ else if (equalLettersIgnoringASCIICase(sandboxToken, "allow-popups"))
flags &= ~SandboxPopups;
- else if (equalIgnoringCase(sandboxToken, "allow-pointer-lock"))
+ else if (equalLettersIgnoringASCIICase(sandboxToken, "allow-pointer-lock"))
flags &= ~SandboxPointerLock;
else {
if (numberOfTokenErrors)