diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/SecurityPolicy.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/page/SecurityPolicy.cpp')
-rw-r--r-- | Source/WebCore/page/SecurityPolicy.cpp | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/Source/WebCore/page/SecurityPolicy.cpp b/Source/WebCore/page/SecurityPolicy.cpp index 9d18879f6..18f311d46 100644 --- a/Source/WebCore/page/SecurityPolicy.cpp +++ b/Source/WebCore/page/SecurityPolicy.cpp @@ -29,12 +29,13 @@ #include "config.h" #include "SecurityPolicy.h" -#include "URL.h" -#include <wtf/MainThread.h> #include "OriginAccessEntry.h" #include "SecurityOrigin.h" -#include <wtf/OwnPtr.h> -#include <wtf/PassOwnPtr.h> +#include "URL.h" +#include <memory> +#include <wtf/HashMap.h> +#include <wtf/MainThread.h> +#include <wtf/NeverDestroyed.h> #include <wtf/text/StringHash.h> namespace WebCore { @@ -42,11 +43,11 @@ namespace WebCore { static SecurityPolicy::LocalLoadPolicy localLoadPolicy = SecurityPolicy::AllowLocalLoadsForLocalOnly; typedef Vector<OriginAccessEntry> OriginAccessWhiteList; -typedef HashMap<String, OwnPtr<OriginAccessWhiteList>> OriginAccessMap; +typedef HashMap<String, std::unique_ptr<OriginAccessWhiteList>> OriginAccessMap; static OriginAccessMap& originAccessMap() { - DEFINE_STATIC_LOCAL(OriginAccessMap, originAccessMap, ()); + static NeverDestroyed<OriginAccessMap> originAccessMap; return originAccessMap; } @@ -68,6 +69,8 @@ bool SecurityPolicy::shouldHideReferrer(const URL& url, const String& referrer) String SecurityPolicy::generateReferrerHeader(ReferrerPolicy referrerPolicy, const URL& url, const String& referrer) { + ASSERT(referrer == URL(URL(), referrer).strippedForUseAsReferrer()); + if (referrer.isEmpty()) return String(); @@ -75,11 +78,11 @@ String SecurityPolicy::generateReferrerHeader(ReferrerPolicy referrerPolicy, con return String(); switch (referrerPolicy) { - case ReferrerPolicyNever: + case ReferrerPolicy::Never: return String(); - case ReferrerPolicyAlways: + case ReferrerPolicy::Always: return referrer; - case ReferrerPolicyOrigin: { + case ReferrerPolicy::Origin: { String origin = SecurityOrigin::createFromString(referrer)->toString(); if (origin == "null") return String(); @@ -87,7 +90,7 @@ String SecurityPolicy::generateReferrerHeader(ReferrerPolicy referrerPolicy, con // to turn it into a canonical URL we can use as referrer. return origin + "/"; } - case ReferrerPolicyDefault: + case ReferrerPolicy::Default: break; } @@ -112,18 +115,18 @@ bool SecurityPolicy::allowSubstituteDataAccessToLocal() bool SecurityPolicy::isAccessWhiteListed(const SecurityOrigin* activeOrigin, const SecurityOrigin* targetOrigin) { if (OriginAccessWhiteList* list = originAccessMap().get(activeOrigin->toString())) { - for (size_t i = 0; i < list->size(); ++i) { - if (list->at(i).matchesOrigin(*targetOrigin)) - return true; - } + for (auto& entry : *list) { + if (entry.matchesOrigin(*targetOrigin)) + return true; + } } return false; } bool SecurityPolicy::isAccessToURLWhiteListed(const SecurityOrigin* activeOrigin, const URL& url) { - RefPtr<SecurityOrigin> targetOrigin = SecurityOrigin::create(url); - return isAccessWhiteListed(activeOrigin, targetOrigin.get()); + Ref<SecurityOrigin> targetOrigin(SecurityOrigin::create(url)); + return isAccessWhiteListed(activeOrigin, &targetOrigin.get()); } void SecurityPolicy::addOriginAccessWhitelistEntry(const SecurityOrigin& sourceOrigin, const String& destinationProtocol, const String& destinationDomain, bool allowDestinationSubdomains) @@ -136,10 +139,10 @@ void SecurityPolicy::addOriginAccessWhitelistEntry(const SecurityOrigin& sourceO String sourceString = sourceOrigin.toString(); OriginAccessMap::AddResult result = originAccessMap().add(sourceString, nullptr); if (result.isNewEntry) - result.iterator->value = adoptPtr(new OriginAccessWhiteList); + result.iterator->value = std::make_unique<OriginAccessWhiteList>(); OriginAccessWhiteList* list = result.iterator->value.get(); - list->append(OriginAccessEntry(destinationProtocol, destinationDomain, allowDestinationSubdomains ? OriginAccessEntry::AllowSubdomains : OriginAccessEntry::DisallowSubdomains)); + list->append(OriginAccessEntry(destinationProtocol, destinationDomain, allowDestinationSubdomains ? OriginAccessEntry::AllowSubdomains : OriginAccessEntry::DisallowSubdomains, OriginAccessEntry::TreatIPAddressAsIPAddress)); } void SecurityPolicy::removeOriginAccessWhitelistEntry(const SecurityOrigin& sourceOrigin, const String& destinationProtocol, const String& destinationDomain, bool allowDestinationSubdomains) @@ -155,14 +158,12 @@ void SecurityPolicy::removeOriginAccessWhitelistEntry(const SecurityOrigin& sour if (it == map.end()) return; - OriginAccessWhiteList* list = it->value.get(); - size_t index = list->find(OriginAccessEntry(destinationProtocol, destinationDomain, allowDestinationSubdomains ? OriginAccessEntry::AllowSubdomains : OriginAccessEntry::DisallowSubdomains)); - if (index == notFound) + OriginAccessWhiteList& list = *it->value; + OriginAccessEntry originAccessEntry(destinationProtocol, destinationDomain, allowDestinationSubdomains ? OriginAccessEntry::AllowSubdomains : OriginAccessEntry::DisallowSubdomains, OriginAccessEntry::TreatIPAddressAsIPAddress); + if (!list.removeFirst(originAccessEntry)) return; - list->remove(index); - - if (list->isEmpty()) + if (list.isEmpty()) map.remove(it); } |