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

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

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

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

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

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

@ -246,6 +246,19 @@ interface nsILoadInfo : nsISupports
[noscript, notxpcom, nostdcall, binaryname(TriggeringPrincipal)]
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
* is a Document, in which case the LoadingDocument is the same as the

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

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