c8086ac8725d32b810352dfbb9c13c933fa0cc1a
[WebKit-https.git] / WebCore / page / SecurityOrigin.h
1 /*
2  * Copyright (C) 2007,2008 Apple 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  *
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  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #ifndef SecurityOrigin_h
30 #define SecurityOrigin_h
31
32 #include <wtf/HashSet.h>
33 #include <wtf/RefCounted.h>
34 #include <wtf/PassRefPtr.h>
35 #include <wtf/Threading.h>
36
37 #include "PlatformString.h"
38 #include "StringHash.h"
39
40 namespace WebCore {
41
42     typedef HashSet<String, CaseFoldingHash> URLSchemesMap;
43     
44     class KURL;
45     
46     class SecurityOrigin : public ThreadSafeShared<SecurityOrigin> {
47     public:
48         static PassRefPtr<SecurityOrigin> createFromDatabaseIdentifier(const String&);
49         static PassRefPtr<SecurityOrigin> createFromString(const String&);
50         static PassRefPtr<SecurityOrigin> create(const KURL&);
51         static PassRefPtr<SecurityOrigin> createEmpty();
52
53         // Create a deep copy of this SecurityOrigin.  This method is useful
54         // when marshalling a SecurityOrigin to another thread.
55         PassRefPtr<SecurityOrigin> copy();
56
57         // Set the domain property of this security origin to newDomain.  This
58         // function does not check whether newDomain is a suffix of the current
59         // domain.  The caller is responsible for validating newDomain.
60         void setDomainFromDOM(const String& newDomain);
61         bool domainWasSetInDOM() const { return m_domainWasSetInDOM; }
62
63         String protocol() const { return m_protocol; }
64         String host() const { return m_host; }
65         String domain() const { return m_domain; }
66         unsigned short port() const { return m_port; }
67
68         // Returns true if this SecurityOrigin can script objects in the given
69         // SecurityOrigin.  For example, call this function before allowing
70         // script from one security origin to read or write objects from
71         // another SecurityOrigin.
72         bool canAccess(const SecurityOrigin*) const;
73
74         // Returns true if this SecurityOrigin can read content retrieved from
75         // the given URL.  For example, call this function before issuing
76         // XMLHttpRequests.
77         bool canRequest(const KURL&) const;
78
79         // Returns true if this SecurityOrigin can load local resources, such
80         // as images, iframes, and style sheets, and can link to local URLs.
81         // For example, call this function before creating an iframe to a
82         // file:// URL.
83         //
84         // Note: A SecurityOrigin might be allowed to load local resources
85         //       without being able to issue an XMLHttpRequest for a local URL.
86         //       To determine whether the SecurityOrigin can issue an
87         //       XMLHttpRequest for a URL, call canRequest(url).
88         bool canLoadLocalResources() const { return m_canLoadLocalResources; }
89
90         // Explicitly grant the ability to load local resources to this
91         // SecurityOrigin.
92         //
93         // Note: This method exists only to support backwards compatibility
94         //       with older versions of WebKit.
95         void grantLoadLocalResources();
96
97         // Explicitly grant the ability to access very other SecurityOrigin.
98         //
99         // WARNING: This is an extremely powerful ability.  Use with caution!
100         void grantUniversalAccess();
101
102         bool isSecureTransitionTo(const KURL&) const;
103
104         // The local SecurityOrigin is the most privileged SecurityOrigin.
105         // The local SecurityOrigin can script any document, navigate to local
106         // resources, and can set arbitrary headers on XMLHttpRequests.
107         bool isLocal() const;
108
109         // The empty SecurityOrigin is the least privileged SecurityOrigin.
110         bool isEmpty() const;
111
112         // Convert this SecurityOrigin into a string.  The string
113         // representation of a SecurityOrigin is similar to a URL, except it
114         // lacks a path component.  The string representation does not encode
115         // the value of the SecurityOrigin's domain property.  The empty
116         // SecurityOrigin is represented with the string "null".
117         String toString() const;
118
119         // Serialize the security origin for storage in the database. This format is
120         // deprecated and should be used only for compatibility with old databases;
121         // use toString() and createFromString() instead.
122         String databaseIdentifier() const;
123
124         // This method checks for equality between SecurityOrigins, not whether
125         // one origin can access another.  It is used for hash table keys.
126         // For access checks, use canAccess().
127         // FIXME: If this method is really only useful for hash table keys, it
128         // should be refactored into SecurityOriginHash.
129         bool equal(const SecurityOrigin*) const;
130
131         // This method checks for equality, ignoring the value of document.domain
132         // (and whether it was set) but considering the host. It is used for postMessage.
133         bool isSameSchemeHostPort(const SecurityOrigin*) const;
134
135         static void registerURLSchemeAsLocal(const String&);
136         static void removeURLSchemeRegisteredAsLocal(const String&);
137         static const URLSchemesMap& localURLSchemes();
138         static bool shouldTreatURLAsLocal(const String&);
139         static bool shouldTreatURLSchemeAsLocal(const String&);
140
141         static void registerURLSchemeAsNoAccess(const String&);
142         static bool shouldTreatURLSchemeAsNoAccess(const String&);
143
144         static void whiteListAccessFromOrigin(const SecurityOrigin& sourceOrigin, const String& destinationProtocol, const String& destinationDomains, bool allowDestinationSubdomains);
145         static void resetOriginAccessWhiteLists();
146
147         static bool isDefaultPortForProtocol(unsigned short port, const String& protocol);
148
149     private:
150         explicit SecurityOrigin(const KURL&);
151         explicit SecurityOrigin(const SecurityOrigin*);
152
153         String m_protocol;
154         String m_host;
155         String m_domain;
156         unsigned short m_port;
157         bool m_noAccess;
158         bool m_universalAccess;
159         bool m_domainWasSetInDOM;
160         bool m_canLoadLocalResources;
161     };
162
163 } // namespace WebCore
164
165 #endif // SecurityOrigin_h