diff options
Diffstat (limited to 'Source/WebCore/dom/SecurityContext.cpp')
-rw-r--r-- | Source/WebCore/dom/SecurityContext.cpp | 56 |
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) |