From d7220a241a7e05429d2a31588ad1e6d3841f1872 Mon Sep 17 00:00:00 2001 From: Tim Huang Date: Wed, 2 Jun 2021 19:46:19 +0000 Subject: [PATCH] Bug 1706615 - Part 1: Add a UnstrippedURI into the LoadInfo. r=valentin,necko-reviewers This patch adds a UnstrippedURI into the LoadInfo. This attribute represents the channel's URI has been stripped if this attributes is not a nullptr. Having this attribute allows us to be able to revert the query stripping in the case where the loading channel is in the content blocking allow list in the parent process. In addition, this patch removes the main thread assertion in URIUtils given that we've made the URL construction thread-safe. This will allow us to be able to use nsIURI directly in ParentLoadInfoForwarderArgs. Differential Revision: https://phabricator.services.mozilla.com/D116108 --- ipc/glue/BackgroundUtils.cpp | 16 +++++++++++++--- ipc/glue/URIUtils.cpp | 7 ------- netwerk/base/LoadInfo.cpp | 21 ++++++++++++++++++--- netwerk/base/LoadInfo.h | 5 ++++- netwerk/base/TRRLoadInfo.cpp | 8 ++++++++ netwerk/base/nsILoadInfo.idl | 6 ++++++ netwerk/ipc/NeckoChannelParams.ipdlh | 3 +++ 7 files changed, 52 insertions(+), 14 deletions(-) diff --git a/ipc/glue/BackgroundUtils.cpp b/ipc/glue/BackgroundUtils.cpp index c6200bff8bb2..53916e7031bd 100644 --- a/ipc/glue/BackgroundUtils.cpp +++ b/ipc/glue/BackgroundUtils.cpp @@ -499,6 +499,9 @@ nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo, maybeCspToInheritInfo.emplace(cspToInheritInfo); } + nsCOMPtr unstrippedURI; + Unused << aLoadInfo->GetUnstrippedURI(getter_AddRefs(unstrippedURI)); + *aOptionalLoadInfoArgs = Some(LoadInfoArgs( loadingPrincipalInfo, triggeringPrincipalInfo, principalToInheritInfo, sandboxedLoadingPrincipalInfo, topLevelPrincipalInfo, @@ -540,7 +543,8 @@ nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo, aLoadInfo->GetIsMediaRequest(), aLoadInfo->GetIsMediaInitialRequest(), cookieJarSettingsArgs, aLoadInfo->GetRequestBlockingReason(), maybeCspToInheritInfo, aLoadInfo->GetHasStoragePermission(), - aLoadInfo->GetIsMetaRefresh(), aLoadInfo->GetLoadingEmbedderPolicy())); + aLoadInfo->GetIsMetaRefresh(), aLoadInfo->GetLoadingEmbedderPolicy(), + unstrippedURI)); return NS_OK; } @@ -797,7 +801,7 @@ nsresult LoadInfoArgsToLoadInfo( loadInfoArgs.isInDevToolsContext(), loadInfoArgs.parserCreatedScript(), loadInfoArgs.hasStoragePermission(), loadInfoArgs.isMetaRefresh(), loadInfoArgs.requestBlockingReason(), loadingContext, - loadInfoArgs.loadingEmbedderPolicy()); + loadInfoArgs.loadingEmbedderPolicy(), loadInfoArgs.unstrippedURI()); if (loadInfoArgs.isFromProcessingFrameAttributes()) { loadInfo->SetIsFromProcessingFrameAttributes(); @@ -839,6 +843,9 @@ void LoadInfoToParentLoadInfoForwarder( cookieJarSettingsArgs = Some(args); } + nsCOMPtr unstrippedURI; + Unused << aLoadInfo->GetUnstrippedURI(getter_AddRefs(unstrippedURI)); + *aForwarderArgsOut = ParentLoadInfoForwarderArgs( aLoadInfo->GetAllowInsecureRedirectToDataURI(), ipcController, tainting, aLoadInfo->GetSkipContentSniffing(), aLoadInfo->GetHttpsOnlyStatus(), @@ -852,7 +859,7 @@ void LoadInfoToParentLoadInfoForwarder( cookieJarSettingsArgs, aLoadInfo->GetRequestBlockingReason(), aLoadInfo->GetHasStoragePermission(), aLoadInfo->GetIsMetaRefresh(), aLoadInfo->GetIsThirdPartyContextToTopWindow(), - aLoadInfo->GetIsInThirdPartyContext()); + aLoadInfo->GetIsInThirdPartyContext(), unstrippedURI); } nsresult MergeParentLoadInfoForwarder( @@ -936,6 +943,9 @@ nsresult MergeParentLoadInfoForwarder( aForwarderArgs.isInThirdPartyContext()); NS_ENSURE_SUCCESS(rv, rv); + rv = aLoadInfo->SetUnstrippedURI(aForwarderArgs.unstrippedURI()); + NS_ENSURE_SUCCESS(rv, rv); + return NS_OK; } diff --git a/ipc/glue/URIUtils.cpp b/ipc/glue/URIUtils.cpp index 45d88ec07113..e34c8f67af7d 100644 --- a/ipc/glue/URIUtils.cpp +++ b/ipc/glue/URIUtils.cpp @@ -40,7 +40,6 @@ namespace mozilla { namespace ipc { void SerializeURI(nsIURI* aURI, URIParams& aParams) { - MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aURI); aURI->Serialize(aParams); @@ -50,8 +49,6 @@ void SerializeURI(nsIURI* aURI, URIParams& aParams) { } void SerializeURI(nsIURI* aURI, Maybe& aParams) { - MOZ_ASSERT(NS_IsMainThread()); - if (aURI) { URIParams params; SerializeURI(aURI, params); @@ -62,8 +59,6 @@ void SerializeURI(nsIURI* aURI, Maybe& aParams) { } already_AddRefed DeserializeURI(const URIParams& aParams) { - MOZ_ASSERT(NS_IsMainThread()); - nsCOMPtr mutator; switch (aParams.type()) { @@ -132,8 +127,6 @@ already_AddRefed DeserializeURI(const URIParams& aParams) { } already_AddRefed DeserializeURI(const Maybe& aParams) { - MOZ_ASSERT(NS_IsMainThread()); - nsCOMPtr uri; if (aParams.isSome()) { diff --git a/netwerk/base/LoadInfo.cpp b/netwerk/base/LoadInfo.cpp index cea1906d4e81..cbe5be65c47f 100644 --- a/netwerk/base/LoadInfo.cpp +++ b/netwerk/base/LoadInfo.cpp @@ -595,7 +595,8 @@ LoadInfo::LoadInfo(const LoadInfo& rhs) mIsFromProcessingFrameAttributes(rhs.mIsFromProcessingFrameAttributes), mIsMediaRequest(rhs.mIsMediaRequest), mIsMediaInitialRequest(rhs.mIsMediaInitialRequest), - mLoadingEmbedderPolicy(rhs.mLoadingEmbedderPolicy) {} + mLoadingEmbedderPolicy(rhs.mLoadingEmbedderPolicy), + mUnstrippedURI(rhs.mUnstrippedURI) {} LoadInfo::LoadInfo( nsIPrincipal* aLoadingPrincipal, nsIPrincipal* aTriggeringPrincipal, @@ -635,7 +636,8 @@ LoadInfo::LoadInfo( bool aIsInDevToolsContext, bool aParserCreatedScript, bool aHasStoragePermission, bool aIsMetaRefresh, uint32_t aRequestBlockingReason, nsINode* aLoadingContext, - nsILoadInfo::CrossOriginEmbedderPolicy aLoadingEmbedderPolicy) + nsILoadInfo::CrossOriginEmbedderPolicy aLoadingEmbedderPolicy, + nsIURI* aUnstrippedURI) : mLoadingPrincipal(aLoadingPrincipal), mTriggeringPrincipal(aTriggeringPrincipal), mPrincipalToInherit(aPrincipalToInherit), @@ -703,7 +705,8 @@ LoadInfo::LoadInfo( mIsFromProcessingFrameAttributes(false), mIsMediaRequest(false), mIsMediaInitialRequest(false), - mLoadingEmbedderPolicy(aLoadingEmbedderPolicy) { + mLoadingEmbedderPolicy(aLoadingEmbedderPolicy), + mUnstrippedURI(aUnstrippedURI) { // Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal MOZ_ASSERT(mLoadingPrincipal || aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT); @@ -1717,6 +1720,18 @@ LoadInfo::GetRequestBlockingReason(uint32_t* aReason) { return NS_OK; } +NS_IMETHODIMP +LoadInfo::GetUnstrippedURI(nsIURI** aURI) { + *aURI = do_AddRef(mUnstrippedURI).take(); + return NS_OK; +} + +NS_IMETHODIMP +LoadInfo::SetUnstrippedURI(nsIURI* aURI) { + mUnstrippedURI = aURI; + return NS_OK; +} + void LoadInfo::SetClientInfo(const ClientInfo& aClientInfo) { mClientInfo.emplace(aClientInfo); } diff --git a/netwerk/base/LoadInfo.h b/netwerk/base/LoadInfo.h index f66812adc9da..84ee548be2da 100644 --- a/netwerk/base/LoadInfo.h +++ b/netwerk/base/LoadInfo.h @@ -222,7 +222,8 @@ class LoadInfo final : public nsILoadInfo { bool aIsInDevToolsContext, bool aParserCreatedScript, bool aHasStoragePermission, bool aIsMetaRefresh, uint32_t aRequestBlockingReason, nsINode* aLoadingContext, - nsILoadInfo::CrossOriginEmbedderPolicy aLoadingEmbedderPolicy); + nsILoadInfo::CrossOriginEmbedderPolicy aLoadingEmbedderPolicy, + nsIURI* aUnstrippedURI); LoadInfo(const LoadInfo& rhs); NS_IMETHOD GetRedirects(JSContext* aCx, @@ -340,6 +341,8 @@ class LoadInfo final : public nsILoadInfo { // See https://wicg.github.io/cross-origin-embedder-policy/#corp-check. nsILoadInfo::CrossOriginEmbedderPolicy mLoadingEmbedderPolicy = nsILoadInfo::EMBEDDER_POLICY_NULL; + + nsCOMPtr mUnstrippedURI; }; } // namespace net diff --git a/netwerk/base/TRRLoadInfo.cpp b/netwerk/base/TRRLoadInfo.cpp index 8d76efa49806..af62b314a46d 100644 --- a/netwerk/base/TRRLoadInfo.cpp +++ b/netwerk/base/TRRLoadInfo.cpp @@ -706,5 +706,13 @@ TRRLoadInfo::SetLoadingEmbedderPolicy( return NS_ERROR_NOT_IMPLEMENTED; } +NS_IMETHODIMP +TRRLoadInfo::GetUnstrippedURI(nsIURI** aURI) { + return NS_ERROR_NOT_IMPLEMENTED; +} + +NS_IMETHODIMP +TRRLoadInfo::SetUnstrippedURI(nsIURI* aURI) { return NS_ERROR_NOT_IMPLEMENTED; } + } // namespace net } // namespace mozilla diff --git a/netwerk/base/nsILoadInfo.idl b/netwerk/base/nsILoadInfo.idl index 1358e2981615..92248b28ed87 100644 --- a/netwerk/base/nsILoadInfo.idl +++ b/netwerk/base/nsILoadInfo.idl @@ -1372,4 +1372,10 @@ interface nsILoadInfo : nsISupports * element and it's an initial request. */ [infallible] attribute boolean isMediaInitialRequest; + + /** + * If this is non-null, this property holds the URI as it was before query + * stripping was performed. + */ + attribute nsIURI unstrippedURI; }; diff --git a/netwerk/ipc/NeckoChannelParams.ipdlh b/netwerk/ipc/NeckoChannelParams.ipdlh index 59c80a07fa7c..5fb354b83a88 100644 --- a/netwerk/ipc/NeckoChannelParams.ipdlh +++ b/netwerk/ipc/NeckoChannelParams.ipdlh @@ -159,6 +159,7 @@ struct LoadInfoArgs bool hasStoragePermission; bool isMetaRefresh; CrossOriginEmbedderPolicy loadingEmbedderPolicy; + nsIURI unstrippedURI; }; /** @@ -229,6 +230,8 @@ struct ParentLoadInfoForwarderArgs bool isInThirdPartyContext; + nsIURI unstrippedURI; + // IMPORTANT: when you add new properites here you must also update // LoadInfoToParentLoadInfoForwarder and MergeParentLoadInfoForwarder // in BackgroundUtils.cpp/.h!