Merge remote-tracking branch 'origin/tracking' into custom

This commit is contained in:
roytam1 2025-05-14 15:49:14 +08:00
commit 296db1641b
7 changed files with 42 additions and 27 deletions

View file

@ -343,7 +343,8 @@ OriginAttributes::IsFirstPartyEnabled()
return sFirstPartyIsolation; return sFirstPartyIsolation;
} }
BasePrincipal::BasePrincipal() BasePrincipal::BasePrincipal(PrincipalKind aKind)
: mKind(aKind)
{} {}
BasePrincipal::~BasePrincipal() BasePrincipal::~BasePrincipal()

View file

@ -251,7 +251,14 @@ public:
class BasePrincipal : public nsJSPrincipals class BasePrincipal : public nsJSPrincipals
{ {
public: public:
BasePrincipal(); enum PrincipalKind {
eNullPrincipal,
eCodebasePrincipal,
eExpandedPrincipal,
eSystemPrincipal
};
explicit BasePrincipal(PrincipalKind aKind);
enum DocumentDomainConsideration { DontConsiderDocumentDomain, ConsiderDocumentDomain}; enum DocumentDomainConsideration { DontConsiderDocumentDomain, ConsiderDocumentDomain};
bool Subsumes(nsIPrincipal* aOther, DocumentDomainConsideration aConsideration); bool Subsumes(nsIPrincipal* aOther, DocumentDomainConsideration aConsideration);
@ -301,17 +308,19 @@ public:
uint32_t PrivateBrowsingId() const { return mOriginAttributes.mPrivateBrowsingId; } uint32_t PrivateBrowsingId() const { return mOriginAttributes.mPrivateBrowsingId; }
bool IsInIsolatedMozBrowserElement() const { return mOriginAttributes.mInIsolatedMozBrowser; } bool IsInIsolatedMozBrowserElement() const { return mOriginAttributes.mInIsolatedMozBrowser; }
enum PrincipalKind { PrincipalKind Kind() const { return mKind; }
eNullPrincipal,
eCodebasePrincipal,
eExpandedPrincipal,
eSystemPrincipal
};
virtual PrincipalKind Kind() = 0;
already_AddRefed<BasePrincipal> CloneStrippingUserContextIdAndFirstPartyDomain(); already_AddRefed<BasePrincipal> CloneStrippingUserContextIdAndFirstPartyDomain();
/**
* Returns true if this principal's CSP should override a document's CSP for
* loads that it triggers. Currently true only for expanded principals which
* subsume the document principal.
*/
bool OverridesCSP(nsIPrincipal* aDocumentPrincipal) {
return mKind == eExpandedPrincipal && Subsumes(aDocumentPrincipal, DontConsiderDocumentDomain);
}
protected: protected:
virtual ~BasePrincipal(); virtual ~BasePrincipal();
@ -333,6 +342,7 @@ protected:
nsCOMPtr<nsIContentSecurityPolicy> mCSP; nsCOMPtr<nsIContentSecurityPolicy> mCSP;
nsCOMPtr<nsIContentSecurityPolicy> mPreloadCSP; nsCOMPtr<nsIContentSecurityPolicy> mPreloadCSP;
PrincipalOriginAttributes mOriginAttributes; PrincipalOriginAttributes mOriginAttributes;
PrincipalKind mKind;
}; };
} // namespace mozilla } // namespace mozilla

View file

@ -36,7 +36,9 @@ public:
// This should only be used by deserialization, and the factory constructor. // This should only be used by deserialization, and the factory constructor.
// Other consumers should use the Create and CreateWithInheritedAttributes // Other consumers should use the Create and CreateWithInheritedAttributes
// methods. // methods.
nsNullPrincipal() {} nsNullPrincipal()
: BasePrincipal(eNullPrincipal)
{}
NS_DECL_NSISERIALIZABLE NS_DECL_NSISERIALIZABLE
@ -60,8 +62,6 @@ public:
virtual nsresult GetScriptLocation(nsACString &aStr) override; virtual nsresult GetScriptLocation(nsACString &aStr) override;
PrincipalKind Kind() override { return eNullPrincipal; }
protected: protected:
virtual ~nsNullPrincipal() {} virtual ~nsNullPrincipal() {}

View file

@ -64,10 +64,11 @@ nsPrincipal::InitializeStatics()
} }
nsPrincipal::nsPrincipal() nsPrincipal::nsPrincipal()
: mCodebaseImmutable(false) : BasePrincipal(eCodebasePrincipal)
, mCodebaseImmutable(false)
, mDomainImmutable(false) , mDomainImmutable(false)
, mInitialized(false) , mInitialized(false)
{ } {}
nsPrincipal::~nsPrincipal() nsPrincipal::~nsPrincipal()
{ {
@ -514,6 +515,7 @@ struct OriginComparator
nsExpandedPrincipal::nsExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteList, nsExpandedPrincipal::nsExpandedPrincipal(nsTArray<nsCOMPtr<nsIPrincipal>> &aWhiteList,
const PrincipalOriginAttributes& aAttrs) const PrincipalOriginAttributes& aAttrs)
: BasePrincipal(eExpandedPrincipal)
{ {
// We force the principals to be sorted by origin so that nsExpandedPrincipal // We force the principals to be sorted by origin so that nsExpandedPrincipal
// origins can have a canonical form. // origins can have a canonical form.

View file

@ -46,8 +46,6 @@ public:
*/ */
static void InitializeStatics(); static void InitializeStatics();
PrincipalKind Kind() override { return eCodebasePrincipal; }
nsCOMPtr<nsIURI> mDomain; nsCOMPtr<nsIURI> mDomain;
nsCOMPtr<nsIURI> mCodebase; nsCOMPtr<nsIURI> mCodebase;
// If mCodebaseImmutable is true, mCodebase is non-null and immutable // If mCodebaseImmutable is true, mCodebase is non-null and immutable
@ -82,8 +80,6 @@ public:
virtual nsresult GetScriptLocation(nsACString &aStr) override; virtual nsresult GetScriptLocation(nsACString &aStr) override;
nsresult GetOriginInternal(nsACString& aOrigin) override; nsresult GetOriginInternal(nsACString& aOrigin) override;
PrincipalKind Kind() override { return eExpandedPrincipal; }
protected: protected:
virtual ~nsExpandedPrincipal(); virtual ~nsExpandedPrincipal();

View file

@ -36,7 +36,9 @@ public:
NS_IMETHOD GetBaseDomain(nsACString& aBaseDomain) override; NS_IMETHOD GetBaseDomain(nsACString& aBaseDomain) override;
nsresult GetOriginInternal(nsACString& aOrigin) override; nsresult GetOriginInternal(nsACString& aOrigin) override;
nsSystemPrincipal() {} nsSystemPrincipal()
: BasePrincipal(eSystemPrincipal)
{}
virtual nsresult GetScriptLocation(nsACString &aStr) override; virtual nsresult GetScriptLocation(nsACString &aStr) override;
@ -52,8 +54,6 @@ protected:
{ {
return true; return true;
} }
PrincipalKind Kind() override { return eSystemPrincipal; }
}; };
#endif // nsSystemPrincipal_h__ #endif // nsSystemPrincipal_h__

View file

@ -140,12 +140,18 @@ CSPService::ShouldLoad(uint32_t aContentType,
return NS_OK; return NS_OK;
} }
// query the principal of the document; if no document is passed, then // Find a principal to retrieve the CSP from. If we don't have a context node
// fall back to using the requestPrincipal (e.g. service workers do not // (because, for instance, the load originates in a service worker), or the
// pass a document). // requesting principal's CSP overrides our document CSP, use the request
// principal. Otherwise, use the document principal.
nsCOMPtr<nsINode> node(do_QueryInterface(aRequestContext)); nsCOMPtr<nsINode> node(do_QueryInterface(aRequestContext));
nsCOMPtr<nsIPrincipal> principal = node ? node->NodePrincipal() nsCOMPtr<nsIPrincipal> principal;
: aRequestPrincipal; if (!node || (aRequestPrincipal &&
BasePrincipal::Cast(aRequestPrincipal)->OverridesCSP(node->NodePrincipal()))) {
principal = aRequestPrincipal;
} else {
principal = node->NodePrincipal();
}
if (!principal) { if (!principal) {
// if we can't query a principal, then there is nothing to do. // if we can't query a principal, then there is nothing to do.
return NS_OK; return NS_OK;