2009-09-19 Adam Barth <abarth@webkit.org>
[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 drawing an image from this URL taints a canvas from
80         // this security origin.  For example, call this function before
81         // drawing an image onto an HTML canvas element with the drawImage API.
82         bool taintsCanvas(const KURL&) const;
83
84         // Returns true if this SecurityOrigin can load local resources, such
85         // as images, iframes, and style sheets, and can link to local URLs.
86         // For example, call this function before creating an iframe to a
87         // file:// URL.
88         //
89         // Note: A SecurityOrigin might be allowed to load local resources
90         //       without being able to issue an XMLHttpRequest for a local URL.
91         //       To determine whether the SecurityOrigin can issue an
92         //       XMLHttpRequest for a URL, call canRequest(url).
93         bool canLoadLocalResources() const { return m_canLoadLocalResources; }
94
95         // Explicitly grant the ability to load local resources to this
96         // SecurityOrigin.
97         //
98         // Note: This method exists only to support backwards compatibility
99         //       with older versions of WebKit.
100         void grantLoadLocalResources();
101
102         // Explicitly grant the ability to access very other SecurityOrigin.
103         //
104         // WARNING: This is an extremely powerful ability.  Use with caution!
105         void grantUniversalAccess();
106
107         bool isSecureTransitionTo(const KURL&) const;
108
109         // The local SecurityOrigin is the most privileged SecurityOrigin.
110         // The local SecurityOrigin can script any document, navigate to local
111         // resources, and can set arbitrary headers on XMLHttpRequests.
112         bool isLocal() const;
113
114         // The empty SecurityOrigin is the least privileged SecurityOrigin.
115         bool isEmpty() const;
116
117         // Convert this SecurityOrigin into a string.  The string
118         // representation of a SecurityOrigin is similar to a URL, except it
119         // lacks a path component.  The string representation does not encode
120         // the value of the SecurityOrigin's domain property.  The empty
121         // SecurityOrigin is represented with the string "null".
122         String toString() const;
123
124         // Serialize the security origin for storage in the database. This format is
125         // deprecated and should be used only for compatibility with old databases;
126         // use toString() and createFromString() instead.
127         String databaseIdentifier() const;
128
129         // This method checks for equality between SecurityOrigins, not whether
130         // one origin can access another.  It is used for hash table keys.
131         // For access checks, use canAccess().
132         // FIXME: If this method is really only useful for hash table keys, it
133         // should be refactored into SecurityOriginHash.
134         bool equal(const SecurityOrigin*) const;
135
136         // This method checks for equality, ignoring the value of document.domain
137         // (and whether it was set) but considering the host. It is used for postMessage.
138         bool isSameSchemeHostPort(const SecurityOrigin*) const;
139
140         static void registerURLSchemeAsLocal(const String&);
141         static void removeURLSchemeRegisteredAsLocal(const String&);
142         static const URLSchemesMap& localURLSchemes();
143         static bool shouldTreatURLAsLocal(const String&);
144         static bool shouldTreatURLSchemeAsLocal(const String&);
145
146         static void registerURLSchemeAsNoAccess(const String&);
147         static bool shouldTreatURLSchemeAsNoAccess(const String&);
148
149         static void whiteListAccessFromOrigin(const SecurityOrigin& sourceOrigin, const String& destinationProtocol, const String& destinationDomains, bool allowDestinationSubdomains);
150         static void resetOriginAccessWhiteLists();
151
152         static bool isDefaultPortForProtocol(unsigned short port, const String& protocol);
153
154     private:
155         explicit SecurityOrigin(const KURL&);
156         explicit SecurityOrigin(const SecurityOrigin*);
157
158         String m_protocol;
159         String m_host;
160         String m_domain;
161         unsigned short m_port;
162         bool m_noAccess;
163         bool m_universalAccess;
164         bool m_domainWasSetInDOM;
165         bool m_canLoadLocalResources;
166     };
167
168 } // namespace WebCore
169
170 #endif // SecurityOrigin_h