From 359ae91eac67c3debf90c03e28c7e93dcb10ac31 Mon Sep 17 00:00:00 2001 From: Andrea Marchesini Date: Thu, 12 Jan 2017 17:38:48 +0100 Subject: [PATCH] Bug 1328653 - Merging all the various *OriginAttributes to just one, r=huseby --- browser/components/feeds/FeedWriter.js | 4 +- caps/BasePrincipal.cpp | 93 ++---------- caps/BasePrincipal.h | 142 ++++++------------ caps/nsIPrincipal.idl | 6 +- caps/nsJSPrincipals.cpp | 8 +- caps/nsNullPrincipal.cpp | 10 +- caps/nsNullPrincipal.h | 4 +- caps/nsPrincipal.cpp | 6 +- caps/nsPrincipal.h | 5 +- caps/nsScriptSecurityManager.cpp | 33 ++-- caps/nsScriptSecurityManager.h | 4 +- caps/tests/gtest/TestOriginAttributes.cpp | 18 +-- docshell/base/LoadContext.cpp | 7 +- docshell/base/LoadContext.h | 10 +- docshell/base/SerializedLoadContext.h | 2 +- docshell/base/nsDocShell.cpp | 43 +++--- docshell/base/nsDocShell.h | 6 +- docshell/base/nsILoadContext.idl | 4 +- dom/base/ChromeUtils.cpp | 6 +- dom/base/DOMParser.cpp | 2 +- dom/base/nsContentUtils.cpp | 22 ++- dom/base/nsContentUtils.h | 4 +- dom/base/nsFrameLoader.cpp | 30 ++-- dom/base/nsFrameLoader.h | 4 +- dom/base/nsGlobalWindow.cpp | 6 +- dom/base/nsOpenURIInFrameParams.cpp | 2 +- dom/base/nsOpenURIInFrameParams.h | 6 +- dom/cache/DBSchema.cpp | 2 +- dom/console/Console.cpp | 6 +- dom/ipc/ContentChild.cpp | 8 +- dom/ipc/ContentParent.cpp | 6 +- dom/ipc/ContentParent.h | 6 +- dom/ipc/PContent.ipdl | 6 +- dom/ipc/PTabContext.ipdlh | 4 +- dom/ipc/TabChild.cpp | 2 +- dom/ipc/TabContext.cpp | 6 +- dom/ipc/TabContext.h | 12 +- dom/media/gmp/GMPServiceParent.cpp | 4 +- dom/media/gtest/TestGMPCrossOrigin.cpp | 2 +- dom/media/systemservices/CamerasParent.cpp | 2 +- dom/offline/nsDOMOfflineResourceList.cpp | 2 +- dom/plugins/base/nsPluginInstanceOwner.cpp | 2 +- dom/presentation/PresentationRequest.cpp | 2 +- dom/quota/ActorsParent.cpp | 26 ++-- dom/quota/OriginScope.h | 2 +- dom/storage/StorageDBThread.cpp | 6 +- dom/storage/StorageDBUpdater.cpp | 2 +- dom/storage/StorageManager.cpp | 2 +- dom/workers/PServiceWorkerManager.ipdl | 6 +- dom/workers/RuntimeService.cpp | 2 +- dom/workers/ScriptLoader.cpp | 2 +- dom/workers/ServiceWorkerInfo.h | 4 +- dom/workers/ServiceWorkerManager.cpp | 22 +-- dom/workers/ServiceWorkerManager.h | 10 +- dom/workers/ServiceWorkerManagerChild.cpp | 2 +- dom/workers/ServiceWorkerManagerChild.h | 4 +- dom/workers/ServiceWorkerManagerParent.cpp | 2 +- dom/workers/ServiceWorkerManagerParent.h | 4 +- dom/workers/ServiceWorkerManagerService.cpp | 2 +- dom/workers/ServiceWorkerManagerService.h | 4 +- dom/workers/ServiceWorkerRegistrar.cpp | 10 +- dom/workers/WorkerPrivate.cpp | 2 +- dom/workers/WorkerPrivate.h | 2 +- dom/workers/Workers.h | 2 +- dom/workers/test/gtest/TestReadWrite.cpp | 8 +- dom/xhr/XMLHttpRequestMainThread.cpp | 6 +- dom/xslt/xslt/txMozillaStylesheetCompiler.cpp | 4 +- embedding/browser/nsIWebBrowser.idl | 4 +- embedding/browser/nsWebBrowser.cpp | 2 +- embedding/browser/nsWebBrowser.h | 2 +- .../windowwatcher/nsWindowWatcher.cpp | 4 +- extensions/cookie/nsPermission.cpp | 6 +- extensions/cookie/nsPermissionManager.cpp | 19 ++- image/ImageCacheKey.cpp | 6 +- image/ImageCacheKey.h | 8 +- image/imgLoader.cpp | 22 +-- ipc/glue/BackgroundUtils.cpp | 2 +- ipc/glue/BackgroundUtils.h | 16 +- ipc/glue/PBackgroundSharedTypes.ipdlh | 8 +- js/xpconnect/src/Sandbox.cpp | 8 +- netwerk/base/LoadContextInfo.cpp | 36 ++--- netwerk/base/LoadContextInfo.h | 6 +- netwerk/base/LoadInfo.cpp | 25 ++- netwerk/base/LoadInfo.h | 4 +- netwerk/base/Predictor.cpp | 2 +- netwerk/base/PrivateBrowsingChannel.h | 2 +- netwerk/base/nsILoadContextInfo.idl | 6 +- netwerk/base/nsILoadInfo.idl | 12 +- netwerk/base/nsISocketTransport.idl | 6 +- netwerk/base/nsNetUtil.cpp | 4 +- netwerk/base/nsNetUtil.h | 6 +- netwerk/base/nsSocketTransport2.cpp | 6 +- netwerk/base/nsSocketTransport2.h | 8 +- netwerk/cache/nsDiskCacheDeviceSQL.cpp | 4 +- netwerk/cache2/CacheFileMetadata.h | 4 +- netwerk/cache2/CacheFileUtils.cpp | 6 +- netwerk/cache2/CacheObserver.cpp | 8 +- netwerk/cache2/OldWrappers.cpp | 2 +- netwerk/cookie/CookieServiceChild.cpp | 4 +- netwerk/cookie/CookieServiceParent.cpp | 15 +- netwerk/cookie/CookieServiceParent.h | 6 +- netwerk/cookie/PCookieService.ipdl | 6 +- netwerk/cookie/nsCookieService.cpp | 40 ++--- netwerk/cookie/nsCookieService.h | 13 +- netwerk/cookie/nsICookieManager.idl | 6 +- netwerk/cookie/nsICookieManager2.idl | 4 +- netwerk/ipc/NeckoChannelParams.ipdlh | 4 +- netwerk/ipc/NeckoParent.cpp | 13 +- netwerk/ipc/NeckoParent.h | 2 +- netwerk/protocol/ftp/FTPChannelParent.cpp | 2 +- netwerk/protocol/http/AlternateServices.cpp | 6 +- netwerk/protocol/http/AlternateServices.h | 6 +- netwerk/protocol/http/HttpBaseChannel.cpp | 9 +- netwerk/protocol/http/HttpChannelParent.cpp | 9 +- netwerk/protocol/http/TunnelUtils.cpp | 6 +- netwerk/protocol/http/nsHttpAuthCache.cpp | 4 +- netwerk/protocol/http/nsHttpChannel.cpp | 4 +- .../http/nsHttpChannelAuthProvider.cpp | 2 +- .../protocol/http/nsHttpConnectionInfo.cpp | 6 +- netwerk/protocol/http/nsHttpConnectionInfo.h | 10 +- netwerk/protocol/http/nsHttpConnectionMgr.cpp | 7 +- netwerk/protocol/http/nsHttpHandler.cpp | 12 +- netwerk/protocol/http/nsHttpHandler.h | 2 +- netwerk/protocol/wyciwyg/nsWyciwygChannel.h | 2 +- netwerk/socket/nsISocketProvider.idl | 4 +- netwerk/socket/nsSOCKSSocketProvider.cpp | 6 +- netwerk/socket/nsUDPSocketProvider.cpp | 6 +- netwerk/test/TestCookie.cpp | 2 +- security/certverifier/CertVerifier.cpp | 4 +- security/certverifier/CertVerifier.h | 8 +- .../certverifier/NSSCertDBTrustDomain.cpp | 2 +- security/certverifier/NSSCertDBTrustDomain.h | 4 +- security/certverifier/OCSPCache.cpp | 12 +- security/certverifier/OCSPCache.h | 10 +- security/certverifier/OCSPRequestor.cpp | 2 +- security/certverifier/OCSPRequestor.h | 4 +- .../manager/ssl/TransportSecurityInfo.cpp | 2 +- security/manager/ssl/TransportSecurityInfo.h | 6 +- security/manager/ssl/nsClientAuthRemember.cpp | 8 +- security/manager/ssl/nsClientAuthRemember.h | 12 +- security/manager/ssl/nsNSSCallbacks.cpp | 6 +- security/manager/ssl/nsNSSCallbacks.h | 8 +- security/manager/ssl/nsNSSCertificateDB.cpp | 4 +- security/manager/ssl/nsNSSIOLayer.cpp | 4 +- security/manager/ssl/nsNSSIOLayer.h | 8 +- security/manager/ssl/nsSSLSocketProvider.cpp | 6 +- security/manager/ssl/nsTLSSocketProvider.cpp | 6 +- .../manager/ssl/tests/gtest/OCSPCacheTest.cpp | 52 +++---- .../downloads/ApplicationReputation.cpp | 11 +- .../nsUrlClassifierStreamUpdater.cpp | 8 +- .../prefetch/OfflineCacheUpdateParent.cpp | 3 +- .../prefetch/nsOfflineCacheUpdateService.cpp | 4 +- 152 files changed, 605 insertions(+), 756 deletions(-) diff --git a/browser/components/feeds/FeedWriter.js b/browser/components/feeds/FeedWriter.js index 54974fa1b396..cb38909a5e84 100644 --- a/browser/components/feeds/FeedWriter.js +++ b/browser/components/feeds/FeedWriter.js @@ -881,8 +881,8 @@ FeedWriter.prototype = { .QueryInterface(Ci.nsIDocShell); let chan = docShell.currentDocumentChannel; - // We probably need to call InheritFromDocShellToDoc for this, but right now - // we can't call it from JS. + // We probably need to call Inherit() for this, but right now we can't call + // it from JS. let attrs = docShell.getOriginAttributes(); let ssm = Services.scriptSecurityManager; let nullPrincipal = ssm.createNullPrincipal(attrs); diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index e59b2f3c57da..a38c6e8baa0f 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -15,7 +15,6 @@ #include "nsIEffectiveTLDService.h" #include "nsIObjectInputStream.h" #include "nsIObjectOutputStream.h" -#include "nsIScriptSecurityManager.h" #include "nsPrincipal.h" #include "nsNetUtil.h" @@ -35,13 +34,13 @@ namespace mozilla { using dom::URLParams; void -PrincipalOriginAttributes::InheritFromDocShellToDoc(const DocShellOriginAttributes& aAttrs, - const nsIURI* aURI) +OriginAttributes::Inherit(const OriginAttributes& aAttrs) { mAppId = aAttrs.mAppId; mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser; - // addonId is computed from the principal URI and never propagated + StripAttributes(STRIP_ADDON_ID); + mUserContextId = aAttrs.mUserContextId; mPrivateBrowsingId = aAttrs.mPrivateBrowsingId; @@ -49,70 +48,16 @@ PrincipalOriginAttributes::InheritFromDocShellToDoc(const DocShellOriginAttribut } void -PrincipalOriginAttributes::InheritFromNecko(const NeckoOriginAttributes& aAttrs) +OriginAttributes::SetFirstPartyDomain(const bool aIsTopLevelDocument, + nsIURI* aURI) { - mAppId = aAttrs.mAppId; - mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser; - - // addonId is computed from the principal URI and never propagated - mUserContextId = aAttrs.mUserContextId; - - mPrivateBrowsingId = aAttrs.mPrivateBrowsingId; - mFirstPartyDomain = aAttrs.mFirstPartyDomain; -} - -void -PrincipalOriginAttributes::StripUserContextIdAndFirstPartyDomain() -{ - mUserContextId = nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID; - mFirstPartyDomain.Truncate(); -} - -void -DocShellOriginAttributes::InheritFromDocToChildDocShell(const PrincipalOriginAttributes& aAttrs) -{ - mAppId = aAttrs.mAppId; - mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser; - - // addonId is computed from the principal URI and never propagated - mUserContextId = aAttrs.mUserContextId; - - mPrivateBrowsingId = aAttrs.mPrivateBrowsingId; - mFirstPartyDomain = aAttrs.mFirstPartyDomain; -} - -void -NeckoOriginAttributes::InheritFromDocToNecko(const PrincipalOriginAttributes& aAttrs) -{ - mAppId = aAttrs.mAppId; - mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser; - - // addonId is computed from the principal URI and never propagated - mUserContextId = aAttrs.mUserContextId; - - mPrivateBrowsingId = aAttrs.mPrivateBrowsingId; - mFirstPartyDomain = aAttrs.mFirstPartyDomain; -} - -void -NeckoOriginAttributes::InheritFromDocShellToNecko(const DocShellOriginAttributes& aAttrs, - const bool aIsTopLevelDocument, - nsIURI* aURI) -{ - mAppId = aAttrs.mAppId; - mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser; - - // addonId is computed from the principal URI and never propagated - mUserContextId = aAttrs.mUserContextId; - - mPrivateBrowsingId = aAttrs.mPrivateBrowsingId; - bool isFirstPartyEnabled = IsFirstPartyEnabled(); // When the pref is on, we also compute the firstPartyDomain attribute // if this is for top-level document. if (isFirstPartyEnabled && aIsTopLevelDocument) { - nsCOMPtr tldService = do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); + nsCOMPtr tldService = + do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID); MOZ_ASSERT(tldService); if (!tldService) { return; @@ -121,8 +66,6 @@ NeckoOriginAttributes::InheritFromDocShellToNecko(const DocShellOriginAttributes nsAutoCString baseDomain; tldService->GetBaseDomain(aURI, 0, baseDomain); mFirstPartyDomain = NS_ConvertUTF8toUTF16(baseDomain); - } else { - mFirstPartyDomain = aAttrs.mFirstPartyDomain; } } @@ -326,17 +269,6 @@ OriginAttributes::SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing) mPrivateBrowsingId = aInPrivateBrowsing ? 1 : 0; } -void -OriginAttributes::SetFromGenericAttributes(const GenericOriginAttributes& aAttrs) -{ - mAppId = aAttrs.mAppId; - mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser; - mAddonId = aAttrs.mAddonId; - mUserContextId = aAttrs.mUserContextId; - mPrivateBrowsingId = aAttrs.mPrivateBrowsingId; - mFirstPartyDomain = aAttrs.mFirstPartyDomain; -} - /* static */ bool OriginAttributes::IsFirstPartyEnabled() @@ -357,7 +289,7 @@ bool OriginAttributes::IsPrivateBrowsing(const nsACString& aOrigin) { nsAutoCString dummy; - PrincipalOriginAttributes attrs; + OriginAttributes attrs; if (NS_WARN_IF(!attrs.PopulateFromOrigin(aOrigin, dummy))) { return false; } @@ -684,7 +616,7 @@ BasePrincipal::AddonHasPermission(const nsAString& aPerm) } already_AddRefed -BasePrincipal::CreateCodebasePrincipal(nsIURI* aURI, const PrincipalOriginAttributes& aAttrs) +BasePrincipal::CreateCodebasePrincipal(nsIURI* aURI, const OriginAttributes& aAttrs) { // If the URI is supposed to inherit the security context of whoever loads it, // we shouldn't make a codebase principal for it. @@ -724,7 +656,7 @@ BasePrincipal::CreateCodebasePrincipal(const nsACString& aOrigin) "CreateCodebasePrincipal does not support nsNullPrincipal"); nsAutoCString originNoSuffix; - mozilla::PrincipalOriginAttributes attrs; + mozilla::OriginAttributes attrs; if (!attrs.PopulateFromOrigin(aOrigin, originNoSuffix)) { return nullptr; } @@ -739,8 +671,9 @@ BasePrincipal::CreateCodebasePrincipal(const nsACString& aOrigin) already_AddRefed BasePrincipal::CloneStrippingUserContextIdAndFirstPartyDomain() { - PrincipalOriginAttributes attrs = OriginAttributesRef(); - attrs.StripUserContextIdAndFirstPartyDomain(); + OriginAttributes attrs = OriginAttributesRef(); + attrs.StripAttributes(OriginAttributes::STRIP_USER_CONTEXT_ID | + OriginAttributes::STRIP_FIRST_PARTY_DOMAIN); nsAutoCString originNoSuffix; nsresult rv = GetOriginNoSuffix(originNoSuffix); diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 0baf1726b040..95778dde56d8 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -11,6 +11,7 @@ #include "mozilla/Attributes.h" #include "mozilla/dom/ChromeUtilsBinding.h" +#include "nsIScriptSecurityManager.h" class nsIContentSecurityPolicy; class nsIObjectOutputStream; @@ -21,13 +22,50 @@ class nsExpandedPrincipal; namespace mozilla { -class GenericOriginAttributes; - // Base OriginAttributes class. This has several subclass flavors, and is not // directly constructable itself. class OriginAttributes : public dom::OriginAttributesDictionary { public: + OriginAttributes() {} + + OriginAttributes(uint32_t aAppId, bool aInIsolatedMozBrowser) + { + mAppId = aAppId; + mInIsolatedMozBrowser = aInIsolatedMozBrowser; + } + + explicit OriginAttributes(const OriginAttributesDictionary& aOther) + : OriginAttributesDictionary(aOther) + {} + + // This method 'clones' the OriginAttributes ignoring the addonId value becaue + // this is computed from the principal URI and never propagated. + void Inherit(const OriginAttributes& aAttrs); + + void SetFirstPartyDomain(const bool aIsTopLevelDocument, nsIURI* aURI); + + enum { + STRIP_FIRST_PARTY_DOMAIN = 0x01, + STRIP_ADDON_ID = 0x02, + STRIP_USER_CONTEXT_ID = 0x04, + }; + + inline void StripAttributes(uint32_t aFlags) + { + if (aFlags & STRIP_FIRST_PARTY_DOMAIN) { + mFirstPartyDomain.Truncate(); + } + + if (aFlags & STRIP_ADDON_ID) { + mAddonId.Truncate(); + } + + if (aFlags & STRIP_USER_CONTEXT_ID) { + mUserContextId = nsIScriptSecurityManager::DEFAULT_USER_CONTEXT_ID; + } + } + bool operator==(const OriginAttributes& aOther) const { return mAppId == aOther.mAppId && @@ -37,6 +75,7 @@ public: mPrivateBrowsingId == aOther.mPrivateBrowsingId && mFirstPartyDomain == aOther.mFirstPartyDomain; } + bool operator!=(const OriginAttributes& aOther) const { return !(*this == aOther); @@ -61,105 +100,12 @@ public: // flags. Once all other flags are removed, this can be removed too. void SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing); - void SetFromGenericAttributes(const GenericOriginAttributes& aAttrs); - // check if "privacy.firstparty.isolate" is enabled. static bool IsFirstPartyEnabled(); // returns true if the originAttributes suffix has mPrivateBrowsingId value // different than 0. static bool IsPrivateBrowsing(const nsACString& aOrigin); - -protected: - OriginAttributes() {} - explicit OriginAttributes(const OriginAttributesDictionary& aOther) - : OriginAttributesDictionary(aOther) {} -}; - -class PrincipalOriginAttributes; -class DocShellOriginAttributes; -class NeckoOriginAttributes; - -// Various classes in Gecko contain OriginAttributes members, and those -// OriginAttributes get propagated to other classes according to certain rules. -// For example, the OriginAttributes on the docshell affect the OriginAttributes -// for the principal of a document loaded inside it, whose OriginAttributes in -// turn affect those of network loads and child docshells. To codify and -// centralize these rules, we introduce separate subclasses for the different -// flavors, and a variety of InheritFrom* methods to implement the transfer -// behavior. - -// For OriginAttributes stored on principals. -class PrincipalOriginAttributes : public OriginAttributes -{ -public: - PrincipalOriginAttributes() {} - PrincipalOriginAttributes(uint32_t aAppId, bool aInIsolatedMozBrowser) - { - mAppId = aAppId; - mInIsolatedMozBrowser = aInIsolatedMozBrowser; - } - - // Inheriting OriginAttributes from docshell to document when user navigates. - // - // @param aAttrs Origin Attributes of the docshell. - // @param aURI The URI of the document. - void InheritFromDocShellToDoc(const DocShellOriginAttributes& aAttrs, - const nsIURI* aURI); - - // Inherit OriginAttributes from Necko. - void InheritFromNecko(const NeckoOriginAttributes& aAttrs); - - void StripUserContextIdAndFirstPartyDomain(); -}; - -// For OriginAttributes stored on docshells / loadcontexts / browsing contexts. -class DocShellOriginAttributes : public OriginAttributes -{ -public: - DocShellOriginAttributes() {} - DocShellOriginAttributes(uint32_t aAppId, bool aInIsolatedMozBrowser) - { - mAppId = aAppId; - mInIsolatedMozBrowser = aInIsolatedMozBrowser; - } - - // Inheriting OriginAttributes from document to child docshell when an - //