Bug 1347817 - Principal must always have a valid origin - part 2 - move OriginAttributes to the BasePrincipal, r=bholley

This commit is contained in:
Andrea Marchesini 2017-03-29 08:21:03 +02:00
Родитель d0aca06da7
Коммит 8d4516d1d9
8 изменённых файлов: 32 добавлений и 26 удалений

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

@ -30,7 +30,8 @@ namespace mozilla {
BasePrincipal::BasePrincipal(PrincipalKind aKind)
: mKind(aKind)
, mDomainSet(false)
, mHasExplicitDomain(false)
, mInitialized(false)
{}
BasePrincipal::~BasePrincipal()
@ -39,6 +40,8 @@ BasePrincipal::~BasePrincipal()
NS_IMETHODIMP
BasePrincipal::GetOrigin(nsACString& aOrigin)
{
MOZ_ASSERT(mInitialized);
nsresult rv = GetOriginNoSuffix(aOrigin);
NS_ENSURE_SUCCESS(rv, rv);
@ -52,6 +55,8 @@ BasePrincipal::GetOrigin(nsACString& aOrigin)
NS_IMETHODIMP
BasePrincipal::GetOriginNoSuffix(nsACString& aOrigin)
{
MOZ_ASSERT(mInitialized);
if (mOriginNoSuffix) {
return mOriginNoSuffix->ToUTF8String(aOrigin);
}
@ -456,8 +461,11 @@ BasePrincipal::AddonAllowsLoad(nsIURI* aURI, bool aExplicit /* = false */)
}
void
BasePrincipal::FinishInit()
BasePrincipal::FinishInit(const OriginAttributes& aOriginAttributes)
{
mInitialized = true;
mOriginAttributes = aOriginAttributes;
// First compute the origin suffix since it's infallible.
nsAutoCString originSuffix;
mOriginAttributes.CreateSuffix(originSuffix);

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

@ -115,18 +115,27 @@ protected:
virtual bool MayLoadInternal(nsIURI* aURI) = 0;
friend class ::ExpandedPrincipal;
void
SetHasExplicitDomain()
{
mHasExplicitDomain = true;
}
// This function should be called as the last step of the initialization of the
// principal objects. It's typically called as the last step from the Init()
// method of the child classes.
void FinishInit();
void FinishInit(const OriginAttributes& aOriginAttributes);
nsCOMPtr<nsIContentSecurityPolicy> mCSP;
nsCOMPtr<nsIContentSecurityPolicy> mPreloadCSP;
nsCOMPtr<nsIAtom> mOriginNoSuffix;
nsCOMPtr<nsIAtom> mOriginSuffix;
private:
OriginAttributes mOriginAttributes;
PrincipalKind mKind;
bool mDomainSet;
bool mHasExplicitDomain;
bool mInitialized;
};
inline bool
@ -169,7 +178,7 @@ BasePrincipal::FastEqualsConsideringDomain(nsIPrincipal* aOther)
// If neither of the principals have document.domain set, we use the fast path
// in Equals(). Otherwise, we fall back to the slow path below.
auto other = Cast(aOther);
if (!mDomainSet && !other->mDomainSet) {
if (!mHasExplicitDomain && !other->mHasExplicitDomain) {
return FastEquals(aOther);
}
@ -205,7 +214,7 @@ BasePrincipal::FastSubsumesConsideringDomain(nsIPrincipal* aOther)
// If neither of the principals have document.domain set, we hand off to
// FastSubsumes() which has fast paths for some special cases. Otherwise, we fall
// back to the slow path below.
if (!mDomainSet && !Cast(aOther)->mDomainSet) {
if (!mHasExplicitDomain && !Cast(aOther)->mHasExplicitDomain) {
return FastSubsumes(aOther);
}

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

@ -82,7 +82,6 @@ ContentPrincipal::ContentPrincipal()
: BasePrincipal(eCodebasePrincipal)
, mCodebaseImmutable(false)
, mDomainImmutable(false)
, mInitialized(false)
{
}
@ -98,11 +97,8 @@ nsresult
ContentPrincipal::Init(nsIURI *aCodebase,
const OriginAttributes& aOriginAttributes)
{
NS_ENSURE_STATE(!mInitialized);
NS_ENSURE_ARG(aCodebase);
mInitialized = true;
// Assert that the URI we get here isn't any of the schemes that we know we
// should not get here. These schemes always either inherit their principal
// or fall back to a null principal. These are schemes which return
@ -118,9 +114,8 @@ ContentPrincipal::Init(nsIURI *aCodebase,
mCodebase = NS_TryToMakeImmutable(aCodebase);
mCodebaseImmutable = URIIsImmutable(mCodebase);
mOriginAttributes = aOriginAttributes;
FinishInit();
FinishInit(aOriginAttributes);
return NS_OK;
}
@ -372,7 +367,7 @@ ContentPrincipal::SetDomain(nsIURI* aDomain)
{
mDomain = NS_TryToMakeImmutable(aDomain);
mDomainImmutable = URIIsImmutable(mDomain);
mDomainSet = true;
SetHasExplicitDomain();
// Recompute all wrappers between compartments using this principal and other
// non-chrome compartments.

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

@ -47,7 +47,6 @@ public:
// If mCodebaseImmutable is true, mCodebase is non-null and immutable
bool mCodebaseImmutable;
bool mDomainImmutable;
bool mInitialized;
protected:
virtual ~ContentPrincipal();

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

@ -43,8 +43,7 @@ struct OriginComparator
}
};
ExpandedPrincipal::ExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteList,
const OriginAttributes& aAttrs)
ExpandedPrincipal::ExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteList)
: BasePrincipal(eExpandedPrincipal)
{
// We force the principals to be sorted by origin so that ExpandedPrincipal
@ -53,7 +52,6 @@ ExpandedPrincipal::ExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteLis
for (size_t i = 0; i < aWhiteList.Length(); ++i) {
mPrincipals.InsertElementSorted(aWhiteList[i], c);
}
mOriginAttributes = aAttrs;
}
ExpandedPrincipal::~ExpandedPrincipal()
@ -63,8 +61,8 @@ already_AddRefed<ExpandedPrincipal>
ExpandedPrincipal::Create(nsTArray<nsCOMPtr<nsIPrincipal>>& aWhiteList,
const OriginAttributes& aAttrs)
{
RefPtr<ExpandedPrincipal> ep = new ExpandedPrincipal(aWhiteList, aAttrs);
ep->FinishInit();
RefPtr<ExpandedPrincipal> ep = new ExpandedPrincipal(aWhiteList);
ep->FinishInit(aAttrs);
return ep.forget();
}

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

@ -15,9 +15,6 @@
class ExpandedPrincipal : public nsIExpandedPrincipal
, public mozilla::BasePrincipal
{
ExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteList,
const mozilla::OriginAttributes& aAttrs);
public:
static already_AddRefed<ExpandedPrincipal>
Create(nsTArray<nsCOMPtr<nsIPrincipal>>& aWhiteList,
@ -40,6 +37,8 @@ public:
nsresult GetOriginNoSuffixInternal(nsACString& aOrigin) override;
protected:
explicit ExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteList);
virtual ~ExpandedPrincipal();
bool SubsumesInternal(nsIPrincipal* aOther,

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

@ -70,8 +70,6 @@ NullPrincipal::Create(const OriginAttributes& aOriginAttributes, nsIURI* aURI)
nsresult
NullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI)
{
mOriginAttributes = aOriginAttributes;
if (aURI) {
nsAutoCString scheme;
nsresult rv = aURI->GetScheme(scheme);
@ -86,7 +84,7 @@ NullPrincipal::Init(const OriginAttributes& aOriginAttributes, nsIURI* aURI)
NS_ENSURE_TRUE(mURI, NS_ERROR_NOT_AVAILABLE);
}
FinishInit();
FinishInit(aOriginAttributes);
return NS_OK;
}

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

@ -35,7 +35,7 @@ already_AddRefed<SystemPrincipal>
SystemPrincipal::Create()
{
RefPtr<SystemPrincipal> sp = new SystemPrincipal();
sp->FinishInit();
sp->FinishInit(OriginAttributes());
return sp.forget();
}