| |
| |
| |
| |
| |
| |
| #ifndef mozilla_BasePrincipal_h |
| #define mozilla_BasePrincipal_h |
| |
| #include "nsJSPrincipals.h" |
| |
| #include "mozilla/Attributes.h" |
| #include "mozilla/OriginAttributes.h" |
| |
| class nsAtom; |
| class nsIContentSecurityPolicy; |
| class nsIObjectOutputStream; |
| class nsIObjectInputStream; |
| class nsIURI; |
| |
| class ExpandedPrincipal; |
| |
| namespace mozilla { |
| namespace extensions { |
| class WebExtensionPolicy; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| class BasePrincipal : public nsJSPrincipals { |
| public: |
| enum PrincipalKind { |
| eNullPrincipal, |
| eCodebasePrincipal, |
| eExpandedPrincipal, |
| eSystemPrincipal |
| }; |
| |
| explicit BasePrincipal(PrincipalKind aKind); |
| |
| template <typename T> |
| bool Is() const { |
| return mKind == T::Kind(); |
| } |
| |
| template <typename T> |
| T* As() { |
| MOZ_ASSERT(Is<T>()); |
| return static_cast<T*>(this); |
| } |
| |
| enum DocumentDomainConsideration { |
| DontConsiderDocumentDomain, |
| ConsiderDocumentDomain |
| }; |
| bool Subsumes(nsIPrincipal* aOther, |
| DocumentDomainConsideration aConsideration); |
| |
| NS_IMETHOD GetOrigin(nsACString& aOrigin) final; |
| NS_IMETHOD GetOriginNoSuffix(nsACString& aOrigin) final; |
| NS_IMETHOD Equals(nsIPrincipal* other, bool* _retval) final; |
| NS_IMETHOD EqualsConsideringDomain(nsIPrincipal* other, bool* _retval) final; |
| NS_IMETHOD Subsumes(nsIPrincipal* other, bool* _retval) final; |
| NS_IMETHOD SubsumesConsideringDomain(nsIPrincipal* other, |
| bool* _retval) final; |
| NS_IMETHOD SubsumesConsideringDomainIgnoringFPD(nsIPrincipal* other, |
| bool* _retval) final; |
| NS_IMETHOD CheckMayLoad(nsIURI* uri, bool report, |
| bool allowIfInheritsPrincipal) final; |
| NS_IMETHOD GetAddonPolicy(nsISupports** aResult) final; |
| NS_IMETHOD GetCsp(nsIContentSecurityPolicy** aCsp) override; |
| NS_IMETHOD SetCsp(nsIContentSecurityPolicy* aCsp) override; |
| NS_IMETHOD EnsureCSP(nsIDOMDocument* aDocument, |
| nsIContentSecurityPolicy** aCSP) override; |
| NS_IMETHOD GetPreloadCsp(nsIContentSecurityPolicy** aPreloadCSP) override; |
| NS_IMETHOD EnsurePreloadCSP(nsIDOMDocument* aDocument, |
| nsIContentSecurityPolicy** aCSP) override; |
| NS_IMETHOD GetCspJSON(nsAString& outCSPinJSON) override; |
| NS_IMETHOD GetIsNullPrincipal(bool* aResult) override; |
| NS_IMETHOD GetIsCodebasePrincipal(bool* aResult) override; |
| NS_IMETHOD GetIsExpandedPrincipal(bool* aResult) override; |
| NS_IMETHOD GetIsSystemPrincipal(bool* aResult) override; |
| NS_IMETHOD GetOriginAttributes(JSContext* aCx, |
| JS::MutableHandle<JS::Value> aVal) final; |
| NS_IMETHOD GetOriginSuffix(nsACString& aOriginSuffix) final; |
| NS_IMETHOD GetAppId(uint32_t* aAppId) final; |
| NS_IMETHOD GetIsInIsolatedMozBrowserElement( |
| bool* aIsInIsolatedMozBrowserElement) final; |
| NS_IMETHOD GetUserContextId(uint32_t* aUserContextId) final; |
| NS_IMETHOD GetPrivateBrowsingId(uint32_t* aPrivateBrowsingId) final; |
| |
| virtual bool AddonHasPermission(const nsAtom* aPerm); |
| |
| virtual bool IsCodebasePrincipal() const { return false; }; |
| |
| static BasePrincipal* Cast(nsIPrincipal* aPrin) { |
| return static_cast<BasePrincipal*>(aPrin); |
| } |
| |
| static already_AddRefed<BasePrincipal> CreateCodebasePrincipal( |
| const nsACString& aOrigin); |
| |
| |
| |
| |
| |
| static already_AddRefed<BasePrincipal> CreateCodebasePrincipal( |
| nsIURI* aURI, const OriginAttributes& aAttrs); |
| |
| const OriginAttributes& OriginAttributesRef() final { |
| return mOriginAttributes; |
| } |
| uint32_t AppId() const { return mOriginAttributes.mAppId; } |
| extensions::WebExtensionPolicy* AddonPolicy(); |
| uint32_t UserContextId() const { return mOriginAttributes.mUserContextId; } |
| uint32_t PrivateBrowsingId() const { |
| return mOriginAttributes.mPrivateBrowsingId; |
| } |
| bool IsInIsolatedMozBrowserElement() const { |
| return mOriginAttributes.mInIsolatedMozBrowser; |
| } |
| |
| PrincipalKind Kind() const { return mKind; } |
| |
| already_AddRefed<BasePrincipal> |
| CloneStrippingUserContextIdAndFirstPartyDomain(); |
| |
| |
| |
| |
| bool AddonAllowsLoad(nsIURI* aURI, bool aExplicit = false); |
| |
| |
| inline bool FastEquals(nsIPrincipal* aOther); |
| inline bool FastEqualsConsideringDomain(nsIPrincipal* aOther); |
| inline bool FastSubsumes(nsIPrincipal* aOther); |
| inline bool FastSubsumesConsideringDomain(nsIPrincipal* aOther); |
| inline bool FastSubsumesConsideringDomainIgnoringFPD(nsIPrincipal* aOther); |
| |
| |
| |
| |
| |
| |
| |
| nsIPrincipal* PrincipalToInherit(nsIURI* aRequestedURI = nullptr); |
| |
| |
| |
| |
| |
| |
| |
| bool OverridesCSP(nsIPrincipal* aDocumentPrincipal) { |
| |
| if (mKind == eSystemPrincipal) { |
| return true; |
| } |
| |
| |
| |
| if (mKind == eExpandedPrincipal) { |
| return FastSubsumes(aDocumentPrincipal); |
| } |
| |
| |
| |
| return (AddonPolicy() && |
| !BasePrincipal::Cast(aDocumentPrincipal)->AddonPolicy()); |
| } |
| |
| protected: |
| virtual ~BasePrincipal(); |
| |
| |
| |
| virtual bool SubsumesInternal(nsIPrincipal* aOther, |
| DocumentDomainConsideration aConsider) = 0; |
| |
| |
| |
| |
| virtual bool MayLoadInternal(nsIURI* aURI) = 0; |
| friend class ::ExpandedPrincipal; |
| |
| void SetHasExplicitDomain() { mHasExplicitDomain = true; } |
| |
| |
| |
| |
| void FinishInit(const nsACString& aOriginNoSuffix, |
| const OriginAttributes& aOriginAttributes); |
| |
| nsCOMPtr<nsIContentSecurityPolicy> mCSP; |
| nsCOMPtr<nsIContentSecurityPolicy> mPreloadCSP; |
| |
| private: |
| static already_AddRefed<BasePrincipal> CreateCodebasePrincipal( |
| nsIURI* aURI, const OriginAttributes& aAttrs, |
| const nsACString& aOriginNoSuffix); |
| |
| RefPtr<nsAtom> mOriginNoSuffix; |
| RefPtr<nsAtom> mOriginSuffix; |
| |
| OriginAttributes mOriginAttributes; |
| PrincipalKind mKind; |
| bool mHasExplicitDomain; |
| bool mInitialized; |
| }; |
| |
| inline bool BasePrincipal::FastEquals(nsIPrincipal* aOther) { |
| auto other = Cast(aOther); |
| if (Kind() != other->Kind()) { |
| |
| return false; |
| } |
| |
| |
| |
| |
| |
| |
| if (Kind() == eNullPrincipal || Kind() == eSystemPrincipal) { |
| return this == other; |
| } |
| |
| if (Kind() == eCodebasePrincipal) { |
| return mOriginNoSuffix == other->mOriginNoSuffix && |
| mOriginSuffix == other->mOriginSuffix; |
| } |
| |
| MOZ_ASSERT(Kind() == eExpandedPrincipal); |
| return mOriginNoSuffix == other->mOriginNoSuffix; |
| } |
| |
| inline bool BasePrincipal::FastEqualsConsideringDomain(nsIPrincipal* aOther) { |
| |
| |
| auto other = Cast(aOther); |
| if (!mHasExplicitDomain && !other->mHasExplicitDomain) { |
| return FastEquals(aOther); |
| } |
| |
| return Subsumes(aOther, ConsiderDocumentDomain) && |
| other->Subsumes(this, ConsiderDocumentDomain); |
| } |
| |
| inline bool BasePrincipal::FastSubsumes(nsIPrincipal* aOther) { |
| |
| |
| |
| |
| auto other = Cast(aOther); |
| if (Kind() == eNullPrincipal && other->Kind() == eNullPrincipal) { |
| return this == other; |
| } |
| if (FastEquals(aOther)) { |
| return true; |
| } |
| |
| |
| return Subsumes(aOther, DontConsiderDocumentDomain); |
| } |
| |
| inline bool BasePrincipal::FastSubsumesConsideringDomain(nsIPrincipal* aOther) { |
| |
| |
| |
| if (!mHasExplicitDomain && !Cast(aOther)->mHasExplicitDomain) { |
| return FastSubsumes(aOther); |
| } |
| |
| return Subsumes(aOther, ConsiderDocumentDomain); |
| } |
| |
| inline bool BasePrincipal::FastSubsumesConsideringDomainIgnoringFPD( |
| nsIPrincipal* aOther) { |
| if (Kind() == eCodebasePrincipal && |
| !dom::ChromeUtils::IsOriginAttributesEqualIgnoringFPD( |
| mOriginAttributes, Cast(aOther)->mOriginAttributes)) { |
| return false; |
| } |
| |
| return SubsumesInternal(aOther, ConsiderDocumentDomain); |
| } |
| |
| } |
| |
| #endif |