diff options
author | evanm@google.com <evanm@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-04 00:36:14 +0000 |
---|---|---|
committer | evanm@google.com <evanm@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-10-04 00:36:14 +0000 |
commit | 82a74f71d944bdc705e9140d7cd13e871689afbc (patch) | |
tree | cd74244b8e709872f1e62fd8c394e2708590ee8d /webkit | |
parent | 6a51384f1b940fa0155ba69b374c7c51c9f93c65 (diff) | |
download | chromium_src-82a74f71d944bdc705e9140d7cd13e871689afbc.zip chromium_src-82a74f71d944bdc705e9140d7cd13e871689afbc.tar.gz chromium_src-82a74f71d944bdc705e9140d7cd13e871689afbc.tar.bz2 |
Unfork SecurityOrigin.cpp, 2/2: update DEPS and build files, delete old files.
Review URL: http://codereview.chromium.org/6255
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2865 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/build/WebCore/SConscript | 2 | ||||
-rw-r--r-- | webkit/build/WebCore/WebCore.vcproj | 4 | ||||
-rw-r--r-- | webkit/pending/SecurityOrigin.cpp | 310 | ||||
-rw-r--r-- | webkit/pending/SecurityOrigin.h | 159 |
4 files changed, 3 insertions, 472 deletions
diff --git a/webkit/build/WebCore/SConscript b/webkit/build/WebCore/SConscript index 0d90292..0813005 100644 --- a/webkit/build/WebCore/SConscript +++ b/webkit/build/WebCore/SConscript @@ -349,7 +349,7 @@ input_files = [ '$WEBCORE_DIR/platform/Logging.cpp', '$PORT_DIR/platform/MIMETypeRegistry.cpp', '$WEBCORE_DIR/platform/ScrollBar.cpp', - '$PENDING_DIR/SecurityOrigin.cpp', + '$WEBCORE_DIR/platform/SecurityOrigin.cpp', '$WEBCORE_DIR/platform/SharedBuffer.cpp', '$WEBCORE_DIR/platform/Timer.cpp', '$WEBCORE_DIR/platform/Widget.cpp', diff --git a/webkit/build/WebCore/WebCore.vcproj b/webkit/build/WebCore/WebCore.vcproj index 99c9f2d..26d7011 100644 --- a/webkit/build/WebCore/WebCore.vcproj +++ b/webkit/build/WebCore/WebCore.vcproj @@ -1002,11 +1002,11 @@ > </File> <File - RelativePath="..\..\pending\SecurityOrigin.cpp" + RelativePath="..\..\..\third_party\WebKit\WebCore\platform\SecurityOrigin.cpp" > </File> <File - RelativePath="..\..\pending\SecurityOrigin.h" + RelativePath="..\..\..\third_party\WebKit\WebCore\platform\SecurityOrigin.h" > </File> <File diff --git a/webkit/pending/SecurityOrigin.cpp b/webkit/pending/SecurityOrigin.cpp deleted file mode 100644 index 2322cfd..0000000 --- a/webkit/pending/SecurityOrigin.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright (C) 2007 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "SecurityOrigin.h" - -#include "CString.h" -#include "FrameLoader.h" -#include "KURL.h" -#include "PlatformString.h" - -namespace WebCore { - -static bool isDefaultPortForProtocol(unsigned short port, const String& protocol) -{ - if (protocol.isEmpty()) - return false; - - static HashMap<String, unsigned> defaultPorts; - if (defaultPorts.isEmpty()) { - defaultPorts.set("http", 80); - defaultPorts.set("https", 443); - defaultPorts.set("ftp", 21); - defaultPorts.set("ftps", 990); - } - return defaultPorts.get(protocol) == port; -} - -SecurityOrigin::SecurityOrigin(const KURL& url) - : m_protocol(url.protocol().isNull() ? "" : url.protocol().lower()) - , m_host(url.host().isNull() ? "" : url.host().lower()) - , m_port(url.port()) - , m_noAccess(false) - , m_domainWasSetInDOM(false) -{ - // These protocols do not create security origins; the owner frame provides the origin - if (m_protocol == "about" || m_protocol == "javascript") - m_protocol = ""; - - // data: URLs are not allowed access to anything other than themselves. - if (m_protocol == "data") - m_noAccess = true; - - // document.domain starts as m_host, but can be set by the DOM. - m_domain = m_host; - - // By default, only local SecurityOrigins can load local resources. - m_canLoadLocalResources = isLocal(); - - if (isDefaultPortForProtocol(m_port, m_protocol)) - m_port = 0; -} - -SecurityOrigin::SecurityOrigin(const SecurityOrigin* other) - : m_protocol(other->m_protocol.copy()) - , m_host(other->m_host.copy()) - , m_domain(other->m_domain.copy()) - , m_port(other->m_port) - , m_noAccess(other->m_noAccess) - , m_domainWasSetInDOM(other->m_domainWasSetInDOM) - , m_canLoadLocalResources(other->m_canLoadLocalResources) -{ -} - -bool SecurityOrigin::isEmpty() const -{ - return m_protocol.isEmpty(); -} - -PassRefPtr<SecurityOrigin> SecurityOrigin::create(const KURL& url) -{ - return adoptRef(new SecurityOrigin(url)); -} - -PassRefPtr<SecurityOrigin> SecurityOrigin::createEmpty() -{ - return create(KURL()); -} - -PassRefPtr<SecurityOrigin> SecurityOrigin::copy() -{ - return adoptRef(new SecurityOrigin(this)); -} - -void SecurityOrigin::setDomainFromDOM(const String& newDomain) -{ - m_domainWasSetInDOM = true; - m_domain = newDomain.lower(); -} - -bool SecurityOrigin::canAccess(const SecurityOrigin* other) const -{ - if (m_noAccess || other->m_noAccess) - return false; - - // Here are two cases where we should permit access: - // - // 1) Neither document has set document.domain. In this case, we insist - // that the scheme, host, and port of the URLs match. - // - // 2) Both documents have set document.domain. In this case, we insist - // that the documents have set document.domain to the same value and - // that the scheme of the URLs match. - // - // This matches the behavior of Firefox 2 and Internet Explorer 6. - // - // Internet Explorer 7 and Opera 9 are more strict in that they require - // the port numbers to match when both pages have document.domain set. - // - // FIXME: Evaluate whether we can tighten this policy to require matched - // port numbers. - // - // Opera 9 allows access when only one page has set document.domain, but - // this is a security vulnerability. - - if (m_protocol == other->m_protocol) { - if (!m_domainWasSetInDOM && !other->m_domainWasSetInDOM) { - if (m_host == other->m_host && m_port == other->m_port) - return true; - } else if (m_domainWasSetInDOM && other->m_domainWasSetInDOM) { - if (m_domain == other->m_domain) - return true; - } - } - - return false; -} - -bool SecurityOrigin::canRequest(const KURL& url) const -{ - if (isLocal()) - return true; - - if (m_noAccess) - return false; - - RefPtr<SecurityOrigin> targetOrigin = SecurityOrigin::create(url); - - // We call isSameSchemeHostPort here instead of canAccess because we want - // to ignore document.domain effects. - return isSameSchemeHostPort(targetOrigin.get()); -} - -void SecurityOrigin::grantLoadLocalResources() -{ - // This method exists only to support backwards compatibility with older - // versions of WebKit. Granting privileges to some, but not all, documents - // in a SecurityOrigin is a security hazard because the documents without - // the privilege can obtain the privilege by injecting script into the - // documents that have been granted the privilege. - ASSERT(FrameLoader::allowSubstituteDataAccessToLocal()); - m_canLoadLocalResources = true; -} - -bool SecurityOrigin::isLocal() const -{ - return FrameLoader::shouldTreatSchemeAsLocal(m_protocol); -} - -bool SecurityOrigin::isSecureTransitionTo(const KURL& url) const -{ - // New window created by the application - if (isEmpty()) - return true; - - RefPtr<SecurityOrigin> other = SecurityOrigin::create(url); - return canAccess(other.get()); -} - -String SecurityOrigin::toString() const -{ - if (isEmpty()) - return String(); - - if (m_noAccess) - return String(); - - if (m_protocol == "file") - return String("file://"); - - Vector<UChar> result; - result.reserveCapacity(m_protocol.length() + m_host.length() + 10); - append(result, m_protocol); - append(result, "://"); - append(result, m_host); - - if (m_port) { - append(result, ":"); - append(result, String::number(m_port)); - } - - return String::adopt(result); -} - -PassRefPtr<SecurityOrigin> SecurityOrigin::createFromString(const String& originString) -{ - return SecurityOrigin::create(KURL(originString)); -} - -static const char SeparatorCharacter = '_'; - -PassRefPtr<SecurityOrigin> SecurityOrigin::createFromDatabaseIdentifier(const String& databaseIdentifier) -{ - // Make sure there's a first separator - int separator1 = databaseIdentifier.find(SeparatorCharacter); - if (separator1 == -1) - return create(KURL()); - - // Make sure there's a second separator - int separator2 = databaseIdentifier.find(SeparatorCharacter, separator1 + 1); - if (separator2 == -1) - return create(KURL()); - - // Make sure there's not a third separator - if (databaseIdentifier.reverseFind(SeparatorCharacter) != separator2) - return create(KURL()); - - // Make sure the port section is a valid port number or doesn't exist - bool portOkay; - int port = databaseIdentifier.right(databaseIdentifier.length() - separator2 - 1).toInt(&portOkay); - if (!portOkay && separator2 + 1 == static_cast<int>(databaseIdentifier.length())) - return create(KURL()); - - if (port < 0 || port > 65535) - return create(KURL()); - - // Split out the 3 sections of data - String protocol = databaseIdentifier.substring(0, separator1); - String host = databaseIdentifier.substring(separator1 + 1, separator2 - separator1 - 1); - return create(KURL(protocol + "://" + host + ":" + String::number(port))); -} - -String SecurityOrigin::databaseIdentifier() const -{ - static String separatorString = String(&SeparatorCharacter, 1); - return m_protocol + separatorString + m_host + separatorString + String::number(m_port); -} - -bool SecurityOrigin::equal(const SecurityOrigin* other) const -{ - if (!isSameSchemeHostPort(other)) - return false; - - if (m_domainWasSetInDOM != other->m_domainWasSetInDOM) - return false; - - if (m_domainWasSetInDOM && m_domain != other->m_domain) - return false; - - return true; -} - -bool SecurityOrigin::isSameSchemeHostPort(const SecurityOrigin* other) const -{ - if (m_host != other->m_host) - return false; - - if (m_protocol != other->m_protocol) - return false; - - if (m_port != other->m_port) - return false; - - return true; -} - -String SecurityOrigin::securityToken() const -{ - if (isEmpty()) - return String(); - - if (m_noAccess) - return String(); - - if (m_domainWasSetInDOM) { - // We could encode the document.domain state into the security token, - // but this is an uncommon case and leads to complexity. We're better - // off sending these accesses down the slow path. - return String(); - } - - return toString(); -} - -} // namespace WebCore diff --git a/webkit/pending/SecurityOrigin.h b/webkit/pending/SecurityOrigin.h deleted file mode 100644 index 031b61b..0000000 --- a/webkit/pending/SecurityOrigin.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2007 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef SecurityOrigin_h -#define SecurityOrigin_h - -#include <wtf/RefCounted.h> -#include <wtf/PassRefPtr.h> -#include <wtf/Threading.h> - -#include "PlatformString.h" - -namespace WebCore { - - class KURL; - - class SecurityOrigin : public ThreadSafeShared<SecurityOrigin> { - public: - static PassRefPtr<SecurityOrigin> createFromDatabaseIdentifier(const String&); - static PassRefPtr<SecurityOrigin> createFromString(const String&); - static PassRefPtr<SecurityOrigin> create(const KURL&); - static PassRefPtr<SecurityOrigin> createEmpty(); - - // Create a deep copy of this SecurityOrigin. This method is useful - // when marshalling a SecurityOrigin to another thread. - PassRefPtr<SecurityOrigin> copy(); - - // Set the domain property of this security origin to newDomain. This - // function does not check whether newDomain is a suffix of the current - // domain. The caller is responsible for validating newDomain. - void setDomainFromDOM(const String& newDomain); - - String protocol() const { return m_protocol; } - String host() const { return m_host; } - String domain() const { return m_domain; } - unsigned short port() const { return m_port; } - - // Returns true if this SecurityOrigin can script objects in the given - // SecurityOrigin. For example, call this function before allowing - // script from one security origin to read or write objects from - // another SecurityOrigin. - bool canAccess(const SecurityOrigin*) const; - - // Returns true if this SecurityOrigin can read content retrieved from - // the given URL. For example, call this function before issuing - // XMLHttpRequests. - bool canRequest(const KURL&) const; - - // Returns true if this SecurityOrigin can load local resources, such - // as images, iframes, and style sheets, and can link to local URLs. - // For example, call this function before creating an iframe to a - // file:// URL. - // - // Note: A SecurityOrigin might be allowed to load local resources - // without being able to issue an XMLHttpRequest for a local URL. - // To determine whether the SecurityOrigin can issue an - // XMLHttpRequest for a URL, call canRequest(url). - bool canLoadLocalResources() const { return m_canLoadLocalResources; } - - // Explicitly grant the ability to load local resources to this - // SecurityOrigin. - // - // Note: This method exists only to support backwards compatibility - // with older versions of WebKit. - void grantLoadLocalResources(); - - bool isSecureTransitionTo(const KURL&) const; - - // The local SecurityOrigin is the most privileged SecurityOrigin. - // The local SecurityOrigin can script any document, navigate to local - // resources, and can set arbitrary headers on XMLHttpRequests. - bool isLocal() const; - - // The empty SecurityOrigin is the least privileged SecurityOrigin. - bool isEmpty() const; - - // Convert this SecurityOrigin into a string. The string - // representation of a SecurityOrigin is similar to a URL, except it - // lacks a path component. The string representation does not encode - // the value of the SecurityOrigin's domain property. The empty - // SecurityOrigin is represented with the null string. - String toString() const; - - // Non-empty security tokens can be used for fast access checks. If the - // return value is a non-empty string, it can be used to compare with - // another security origin's securityToken. An empty security token is - // invalid and should not be used to check security. Instead, you must - // call canAccess. - // - // CAVEATS: - // - // 1) If either of the tokens is empty or if the tokens are not equal, - // you must call canAccess to see if they match. The tokens can be - // used for fast allow judgments, but cannot be used for deny - // judgments. - // - // 2) If one of the SecurityOrigins modifies their document.domain - // property after you read its securityToken, you might get false - // allows. - // - String securityToken() const; - - // Serialize the security origin for storage in the database. This format is - // deprecated and should be used only for compatibility with old databases; - // use toString() and createFromString() instead. - String databaseIdentifier() const; - - // This method checks for equality between SecurityOrigins, not whether - // one origin can access another. It is used for hash table keys. - // For access checks, use canAccess(). - // FIXME: If this method is really only useful for hash table keys, it - // should be refactored into SecurityOriginHash. - bool equal(const SecurityOrigin*) const; - - // This method checks for equality, ignoring the value of document.domain - // (and whether it was set) but considering the host. It is used for postMessage. - bool isSameSchemeHostPort(const SecurityOrigin*) const; - - private: - explicit SecurityOrigin(const KURL&); - explicit SecurityOrigin(const SecurityOrigin*); - - String m_protocol; - String m_host; - String m_domain; - unsigned short m_port; - bool m_noAccess; - bool m_domainWasSetInDOM; - bool m_canLoadLocalResources; - }; - -} // namespace WebCore - -#endif // SecurityOrigin_h |