Bug 1297338 - Extend LoadInfo with a PrincipalToInherit member. r=bz

This commit is contained in:
Christoph Kerschbaumer 2016-09-20 08:35:45 +02:00
Родитель e822f3e9cc
Коммит 8500d497a7
5 изменённых файлов: 55 добавлений и 0 удалений

Просмотреть файл

@ -224,6 +224,10 @@ LoadInfoToLoadInfoArgs(nsILoadInfo *aLoadInfo,
rv = PrincipalToPrincipalInfo(aLoadInfo->TriggeringPrincipal(), rv = PrincipalToPrincipalInfo(aLoadInfo->TriggeringPrincipal(),
&triggeringPrincipalInfo); &triggeringPrincipalInfo);
PrincipalInfo principalToInheritInfo;
rv = PrincipalToPrincipalInfo(aLoadInfo->PrincipalToInherit(),
&principalToInheritInfo);
nsTArray<PrincipalInfo> redirectChainIncludingInternalRedirects; nsTArray<PrincipalInfo> redirectChainIncludingInternalRedirects;
for (const nsCOMPtr<nsIPrincipal>& principal : aLoadInfo->RedirectChainIncludingInternalRedirects()) { for (const nsCOMPtr<nsIPrincipal>& principal : aLoadInfo->RedirectChainIncludingInternalRedirects()) {
rv = PrincipalToPrincipalInfo(principal, redirectChainIncludingInternalRedirects.AppendElement()); rv = PrincipalToPrincipalInfo(principal, redirectChainIncludingInternalRedirects.AppendElement());
@ -240,6 +244,7 @@ LoadInfoToLoadInfoArgs(nsILoadInfo *aLoadInfo,
LoadInfoArgs( LoadInfoArgs(
loadingPrincipalInfo, loadingPrincipalInfo,
triggeringPrincipalInfo, triggeringPrincipalInfo,
principalToInheritInfo,
aLoadInfo->GetSecurityFlags(), aLoadInfo->GetSecurityFlags(),
aLoadInfo->InternalContentPolicyType(), aLoadInfo->InternalContentPolicyType(),
static_cast<uint32_t>(aLoadInfo->GetTainting()), static_cast<uint32_t>(aLoadInfo->GetTainting()),
@ -288,6 +293,10 @@ LoadInfoArgsToLoadInfo(const OptionalLoadInfoArgs& aOptionalLoadInfoArgs,
PrincipalInfoToPrincipal(loadInfoArgs.triggeringPrincipalInfo(), &rv); PrincipalInfoToPrincipal(loadInfoArgs.triggeringPrincipalInfo(), &rv);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIPrincipal> principalToInherit =
PrincipalInfoToPrincipal(loadInfoArgs.principalToInheritInfo(), &rv);
NS_ENSURE_SUCCESS(rv, rv);
nsTArray<nsCOMPtr<nsIPrincipal>> redirectChainIncludingInternalRedirects; nsTArray<nsCOMPtr<nsIPrincipal>> redirectChainIncludingInternalRedirects;
for (const PrincipalInfo& principalInfo : loadInfoArgs.redirectChainIncludingInternalRedirects()) { for (const PrincipalInfo& principalInfo : loadInfoArgs.redirectChainIncludingInternalRedirects()) {
nsCOMPtr<nsIPrincipal> redirectedPrincipal = nsCOMPtr<nsIPrincipal> redirectedPrincipal =
@ -307,6 +316,7 @@ LoadInfoArgsToLoadInfo(const OptionalLoadInfoArgs& aOptionalLoadInfoArgs,
nsCOMPtr<nsILoadInfo> loadInfo = nsCOMPtr<nsILoadInfo> loadInfo =
new mozilla::LoadInfo(loadingPrincipal, new mozilla::LoadInfo(loadingPrincipal,
triggeringPrincipal, triggeringPrincipal,
principalToInherit,
loadInfoArgs.securityFlags(), loadInfoArgs.securityFlags(),
loadInfoArgs.contentPolicyType(), loadInfoArgs.contentPolicyType(),
static_cast<LoadTainting>(loadInfoArgs.tainting()), static_cast<LoadTainting>(loadInfoArgs.tainting()),

Просмотреть файл

@ -44,6 +44,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
aLoadingContext->NodePrincipal() : aLoadingPrincipal) aLoadingContext->NodePrincipal() : aLoadingPrincipal)
, mTriggeringPrincipal(aTriggeringPrincipal ? , mTriggeringPrincipal(aTriggeringPrincipal ?
aTriggeringPrincipal : mLoadingPrincipal.get()) aTriggeringPrincipal : mLoadingPrincipal.get())
, mPrincipalToInherit(mTriggeringPrincipal)
, mLoadingContext(do_GetWeakReference(aLoadingContext)) , mLoadingContext(do_GetWeakReference(aLoadingContext))
, mSecurityFlags(aSecurityFlags) , mSecurityFlags(aSecurityFlags)
, mInternalContentPolicyType(aContentPolicyType) , mInternalContentPolicyType(aContentPolicyType)
@ -64,6 +65,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
{ {
MOZ_ASSERT(mLoadingPrincipal); MOZ_ASSERT(mLoadingPrincipal);
MOZ_ASSERT(mTriggeringPrincipal); MOZ_ASSERT(mTriggeringPrincipal);
MOZ_ASSERT(mPrincipalToInherit);
#ifdef DEBUG #ifdef DEBUG
// TYPE_DOCUMENT loads initiated by javascript tests will go through // TYPE_DOCUMENT loads initiated by javascript tests will go through
@ -214,6 +216,7 @@ LoadInfo::LoadInfo(nsPIDOMWindowOuter* aOuterWindow,
nsSecurityFlags aSecurityFlags) nsSecurityFlags aSecurityFlags)
: mLoadingPrincipal(nullptr) : mLoadingPrincipal(nullptr)
, mTriggeringPrincipal(aTriggeringPrincipal) , mTriggeringPrincipal(aTriggeringPrincipal)
, mPrincipalToInherit(mTriggeringPrincipal)
, mSecurityFlags(aSecurityFlags) , mSecurityFlags(aSecurityFlags)
, mInternalContentPolicyType(nsIContentPolicy::TYPE_DOCUMENT) , mInternalContentPolicyType(nsIContentPolicy::TYPE_DOCUMENT)
, mTainting(LoadTainting::Basic) , mTainting(LoadTainting::Basic)
@ -235,6 +238,7 @@ LoadInfo::LoadInfo(nsPIDOMWindowOuter* aOuterWindow,
// Grab the information we can out of the window. // Grab the information we can out of the window.
MOZ_ASSERT(aOuterWindow); MOZ_ASSERT(aOuterWindow);
MOZ_ASSERT(mTriggeringPrincipal); MOZ_ASSERT(mTriggeringPrincipal);
MOZ_ASSERT(mPrincipalToInherit);
// if the load is sandboxed, we can not also inherit the principal // if the load is sandboxed, we can not also inherit the principal
if (mSecurityFlags & nsILoadInfo::SEC_SANDBOXED) { if (mSecurityFlags & nsILoadInfo::SEC_SANDBOXED) {
@ -270,6 +274,7 @@ LoadInfo::LoadInfo(nsPIDOMWindowOuter* aOuterWindow,
LoadInfo::LoadInfo(const LoadInfo& rhs) LoadInfo::LoadInfo(const LoadInfo& rhs)
: mLoadingPrincipal(rhs.mLoadingPrincipal) : mLoadingPrincipal(rhs.mLoadingPrincipal)
, mTriggeringPrincipal(rhs.mTriggeringPrincipal) , mTriggeringPrincipal(rhs.mTriggeringPrincipal)
, mPrincipalToInherit(rhs.mPrincipalToInherit)
, mLoadingContext(rhs.mLoadingContext) , mLoadingContext(rhs.mLoadingContext)
, mSecurityFlags(rhs.mSecurityFlags) , mSecurityFlags(rhs.mSecurityFlags)
, mInternalContentPolicyType(rhs.mInternalContentPolicyType) , mInternalContentPolicyType(rhs.mInternalContentPolicyType)
@ -297,6 +302,7 @@ LoadInfo::LoadInfo(const LoadInfo& rhs)
LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal, LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
nsIPrincipal* aTriggeringPrincipal, nsIPrincipal* aTriggeringPrincipal,
nsIPrincipal* aPrincipalToInherit,
nsSecurityFlags aSecurityFlags, nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType, nsContentPolicyType aContentPolicyType,
LoadTainting aTainting, LoadTainting aTainting,
@ -319,6 +325,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
bool aIsPreflight) bool aIsPreflight)
: mLoadingPrincipal(aLoadingPrincipal) : mLoadingPrincipal(aLoadingPrincipal)
, mTriggeringPrincipal(aTriggeringPrincipal) , mTriggeringPrincipal(aTriggeringPrincipal)
, mPrincipalToInherit(aPrincipalToInherit)
, mSecurityFlags(aSecurityFlags) , mSecurityFlags(aSecurityFlags)
, mInternalContentPolicyType(aContentPolicyType) , mInternalContentPolicyType(aContentPolicyType)
, mTainting(aTainting) , mTainting(aTainting)
@ -341,6 +348,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
// Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal // Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal
MOZ_ASSERT(mLoadingPrincipal || aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT); MOZ_ASSERT(mLoadingPrincipal || aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT);
MOZ_ASSERT(mTriggeringPrincipal); MOZ_ASSERT(mTriggeringPrincipal);
MOZ_ASSERT(mPrincipalToInherit);
mRedirectChainIncludingInternalRedirects.SwapElements( mRedirectChainIncludingInternalRedirects.SwapElements(
aRedirectChainIncludingInternalRedirects); aRedirectChainIncludingInternalRedirects);
@ -425,6 +433,27 @@ LoadInfo::TriggeringPrincipal()
return mTriggeringPrincipal; return mTriggeringPrincipal;
} }
NS_IMETHODIMP
LoadInfo::GetPrincipalToInherit(nsIPrincipal** aPrincipalToInherit)
{
NS_ADDREF(*aPrincipalToInherit = mPrincipalToInherit);
return NS_OK;
}
NS_IMETHODIMP
LoadInfo::SetPrincipalToInherit(nsIPrincipal* aPrincipalToInherit)
{
MOZ_ASSERT(aPrincipalToInherit, "must be a valid principal to inherit");
mPrincipalToInherit = aPrincipalToInherit;
return NS_OK;
}
nsIPrincipal*
LoadInfo::PrincipalToInherit()
{
return mPrincipalToInherit;
}
NS_IMETHODIMP NS_IMETHODIMP
LoadInfo::GetLoadingDocument(nsIDOMDocument** aResult) LoadInfo::GetLoadingDocument(nsIDOMDocument** aResult)
{ {

Просмотреть файл

@ -86,6 +86,7 @@ private:
// Please note that aRedirectChain uses swapElements. // Please note that aRedirectChain uses swapElements.
LoadInfo(nsIPrincipal* aLoadingPrincipal, LoadInfo(nsIPrincipal* aLoadingPrincipal,
nsIPrincipal* aTriggeringPrincipal, nsIPrincipal* aTriggeringPrincipal,
nsIPrincipal* aPrincipalToInherit,
nsSecurityFlags aSecurityFlags, nsSecurityFlags aSecurityFlags,
nsContentPolicyType aContentPolicyType, nsContentPolicyType aContentPolicyType,
LoadTainting aTainting, LoadTainting aTainting,
@ -126,6 +127,7 @@ private:
// if you add a member, please also update the copy constructor // if you add a member, please also update the copy constructor
nsCOMPtr<nsIPrincipal> mLoadingPrincipal; nsCOMPtr<nsIPrincipal> mLoadingPrincipal;
nsCOMPtr<nsIPrincipal> mTriggeringPrincipal; nsCOMPtr<nsIPrincipal> mTriggeringPrincipal;
nsCOMPtr<nsIPrincipal> mPrincipalToInherit;
nsWeakPtr mLoadingContext; nsWeakPtr mLoadingContext;
nsSecurityFlags mSecurityFlags; nsSecurityFlags mSecurityFlags;
nsContentPolicyType mInternalContentPolicyType; nsContentPolicyType mInternalContentPolicyType;

Просмотреть файл

@ -246,6 +246,19 @@ interface nsILoadInfo : nsISupports
[noscript, notxpcom, nostdcall, binaryname(TriggeringPrincipal)] [noscript, notxpcom, nostdcall, binaryname(TriggeringPrincipal)]
nsIPrincipal binaryTriggeringPrincipal(); nsIPrincipal binaryTriggeringPrincipal();
/**
* The principalToInherit is the principal that is used when the inherit flag
* is set. For loads that are not TYPE_DOCUMENT or TYPE_SUBDOCUMENT that
* principal is always identical to the triggeringPrincipal.
*/
attribute nsIPrincipal principalToInherit;
/**
* A C++-friendly version of principalToInherit.
*/
[noscript, notxpcom, nostdcall, binaryname(PrincipalToInherit)]
nsIPrincipal binaryPrincipalToInherit();
/** /**
* This is the ownerDocument of the LoadingNode. Unless the LoadingNode * This is the ownerDocument of the LoadingNode. Unless the LoadingNode
* is a Document, in which case the LoadingDocument is the same as the * is a Document, in which case the LoadingDocument is the same as the

Просмотреть файл

@ -30,6 +30,7 @@ struct LoadInfoArgs
{ {
OptionalPrincipalInfo requestingPrincipalInfo; OptionalPrincipalInfo requestingPrincipalInfo;
PrincipalInfo triggeringPrincipalInfo; PrincipalInfo triggeringPrincipalInfo;
PrincipalInfo principalToInheritInfo;
uint32_t securityFlags; uint32_t securityFlags;
uint32_t contentPolicyType; uint32_t contentPolicyType;
uint32_t tainting; uint32_t tainting;