Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / dom / SecurityContext.cpp
1 /*
2  * Copyright (C) 2011 Google Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY GOOGLE, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  */
26
27 #include "config.h"
28 #include "SecurityContext.h"
29
30 #include "ContentSecurityPolicy.h"
31 #include "HTMLParserIdioms.h"
32 #include "SecurityOrigin.h"
33 #include "SecurityOriginPolicy.h"
34 #include <wtf/text/StringBuilder.h>
35
36 namespace WebCore {
37
38 SecurityContext::SecurityContext()
39     : m_haveInitializedSecurityOrigin(false)
40     , m_sandboxFlags(SandboxNone)
41 {
42 }
43
44 SecurityContext::~SecurityContext()
45 {
46 }
47
48 void SecurityContext::setSecurityOriginPolicy(RefPtr<SecurityOriginPolicy>&& securityOriginPolicy)
49 {
50     m_securityOriginPolicy = WTFMove(securityOriginPolicy);
51     m_haveInitializedSecurityOrigin = true;
52 }
53
54 SecurityOrigin* SecurityContext::securityOrigin() const
55 {
56     if (!m_securityOriginPolicy)
57         return nullptr;
58
59     return &m_securityOriginPolicy->origin();
60 }
61
62 void SecurityContext::setContentSecurityPolicy(std::unique_ptr<ContentSecurityPolicy> contentSecurityPolicy)
63 {
64     m_contentSecurityPolicy = WTFMove(contentSecurityPolicy);
65 }
66
67 bool SecurityContext::isSecureTransitionTo(const URL& url) const
68 {
69     // If we haven't initialized our security origin by now, this is probably
70     // a new window created via the API (i.e., that lacks an origin and lacks
71     // a place to inherit the origin from).
72     if (!haveInitializedSecurityOrigin())
73         return true;
74
75     return securityOriginPolicy()->origin().canAccess(SecurityOrigin::create(url).ptr());
76 }
77
78 void SecurityContext::enforceSandboxFlags(SandboxFlags mask)
79 {
80     m_sandboxFlags |= mask;
81
82     // The SandboxOrigin is stored redundantly in the security origin.
83     if (isSandboxed(SandboxOrigin) && securityOriginPolicy() && !securityOriginPolicy()->origin().isUnique())
84         setSecurityOriginPolicy(SecurityOriginPolicy::create(SecurityOrigin::createUnique()));
85 }
86
87 SandboxFlags SecurityContext::parseSandboxPolicy(const String& policy, String& invalidTokensErrorMessage)
88 {
89     // http://www.w3.org/TR/html5/the-iframe-element.html#attr-iframe-sandbox
90     // Parse the unordered set of unique space-separated tokens.
91     SandboxFlags flags = SandboxAll;
92     unsigned length = policy.length();
93     unsigned start = 0;
94     unsigned numberOfTokenErrors = 0;
95     StringBuilder tokenErrors;
96     while (true) {
97         while (start < length && isHTMLSpace(policy[start]))
98             ++start;
99         if (start >= length)
100             break;
101         unsigned end = start + 1;
102         while (end < length && !isHTMLSpace(policy[end]))
103             ++end;
104
105         // Turn off the corresponding sandbox flag if it's set as "allowed".
106         String sandboxToken = policy.substring(start, end - start);
107         if (equalIgnoringCase(sandboxToken, "allow-same-origin"))
108             flags &= ~SandboxOrigin;
109         else if (equalIgnoringCase(sandboxToken, "allow-forms"))
110             flags &= ~SandboxForms;
111         else if (equalIgnoringCase(sandboxToken, "allow-scripts")) {
112             flags &= ~SandboxScripts;
113             flags &= ~SandboxAutomaticFeatures;
114         } else if (equalIgnoringCase(sandboxToken, "allow-top-navigation"))
115             flags &= ~SandboxTopNavigation;
116         else if (equalIgnoringCase(sandboxToken, "allow-popups"))
117             flags &= ~SandboxPopups;
118         else if (equalIgnoringCase(sandboxToken, "allow-pointer-lock"))
119             flags &= ~SandboxPointerLock;
120         else {
121             if (numberOfTokenErrors)
122                 tokenErrors.appendLiteral(", '");
123             else
124                 tokenErrors.append('\'');
125             tokenErrors.append(sandboxToken);
126             tokenErrors.append('\'');
127             numberOfTokenErrors++;
128         }
129
130         start = end + 1;
131     }
132
133     if (numberOfTokenErrors) {
134         if (numberOfTokenErrors > 1)
135             tokenErrors.appendLiteral(" are invalid sandbox flags.");
136         else
137             tokenErrors.appendLiteral(" is an invalid sandbox flag.");
138         invalidTokensErrorMessage = tokenErrors.toString();
139     }
140
141     return flags;
142 }
143
144 }