From bf44ef7e821576c72f91f40decd2bc902bd3caff Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Fri, 23 Oct 2015 17:58:21 -0700 Subject: [PATCH] Bug 1218039 - Add a nice interface for both C++ and JS to access the principal kind. r=gabor --- caps/BasePrincipal.cpp | 25 +++++++++++++++++++++++-- caps/BasePrincipal.h | 14 +++++++++++++- caps/nsIPrincipal.idl | 19 +++++++++++++++++-- caps/nsNullPrincipal.cpp | 7 ------- caps/nsNullPrincipal.h | 3 ++- caps/nsPrincipal.h | 4 ++++ caps/nsSystemPrincipal.h | 2 ++ caps/tests/unit/test_origin.js | 12 ++++++++++++ 8 files changed, 73 insertions(+), 13 deletions(-) diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index 01bec09b4476..006bb320f56e 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -340,9 +340,30 @@ BasePrincipal::GetCspJSON(nsAString& outCSPinJSON) } NS_IMETHODIMP -BasePrincipal::GetIsNullPrincipal(bool* aIsNullPrincipal) +BasePrincipal::GetIsNullPrincipal(bool* aResult) { - *aIsNullPrincipal = false; + *aResult = Kind() == eNullPrincipal; + return NS_OK; +} + +NS_IMETHODIMP +BasePrincipal::GetIsCodebasePrincipal(bool* aResult) +{ + *aResult = Kind() == eCodebasePrincipal; + return NS_OK; +} + +NS_IMETHODIMP +BasePrincipal::GetIsExpandedPrincipal(bool* aResult) +{ + *aResult = Kind() == eExpandedPrincipal; + return NS_OK; +} + +NS_IMETHODIMP +BasePrincipal::GetIsSystemPrincipal(bool* aResult) +{ + *aResult = Kind() == eSystemPrincipal; return NS_OK; } diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 0c1c036ce1d7..97ef77b0d2ff 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -147,7 +147,10 @@ class BasePrincipal : public nsJSPrincipals NS_IMETHOD GetCsp(nsIContentSecurityPolicy** aCsp) override; NS_IMETHOD SetCsp(nsIContentSecurityPolicy* aCsp) override; NS_IMETHOD GetCspJSON(nsAString& outCSPinJSON) override; - NS_IMETHOD GetIsNullPrincipal(bool* aIsNullPrincipal) 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 GetJarPrefix(nsACString& aJarPrefix) final; NS_IMETHOD GetOriginAttributes(JSContext* aCx, JS::MutableHandle aVal) final; NS_IMETHOD GetOriginSuffix(nsACString& aOriginSuffix) final; @@ -171,6 +174,15 @@ class BasePrincipal : public nsJSPrincipals uint32_t UserContextId() const { return mOriginAttributes.mUserContextId; } bool IsInBrowserElement() const { return mOriginAttributes.mInBrowser; } + enum PrincipalKind { + eNullPrincipal, + eCodebasePrincipal, + eExpandedPrincipal, + eSystemPrincipal + }; + + virtual PrincipalKind Kind() = 0; + protected: virtual ~BasePrincipal(); diff --git a/caps/nsIPrincipal.idl b/caps/nsIPrincipal.idl index 352ecc0b9cba..7263d5eb8536 100644 --- a/caps/nsIPrincipal.idl +++ b/caps/nsIPrincipal.idl @@ -20,7 +20,7 @@ interface nsIContentSecurityPolicy; [ptr] native JSPrincipals(JSPrincipals); [ptr] native PrincipalArray(nsTArray >); -[scriptable, builtinclass, uuid(a083acd0-1ebf-4585-85ab-08cfdd9c96bd)] +[scriptable, builtinclass, uuid(86e5fd29-dccb-4547-8918-f224005479a0)] interface nsIPrincipal : nsISerializable { /** @@ -280,11 +280,26 @@ interface nsIPrincipal : nsISerializable [infallible] readonly attribute boolean unknownAppId; /** - * Returns true iff this principal is a null principal (corresponding to an + * Returns true iff this is a null principal (corresponding to an * unknown, hence assumed minimally privileged, security context). */ [infallible] readonly attribute boolean isNullPrincipal; + /** + * Returns true iff this principal corresponds to a codebase origin. + */ + [infallible] readonly attribute boolean isCodebasePrincipal; + + /** + * Returns true iff this is an expanded principal. + */ + [infallible] readonly attribute boolean isExpandedPrincipal; + + /** + * Returns true iff this is the system principal. + */ + [infallible] readonly attribute boolean isSystemPrincipal; + /** * Returns true if this principal's origin is recognized as being on the * whitelist of sites that can use the CSS Unprefixing Service. diff --git a/caps/nsNullPrincipal.cpp b/caps/nsNullPrincipal.cpp index 6f31aae5f457..6c06f7b94028 100644 --- a/caps/nsNullPrincipal.cpp +++ b/caps/nsNullPrincipal.cpp @@ -124,13 +124,6 @@ nsNullPrincipal::MayLoadInternal(nsIURI* aURI) return false; } -NS_IMETHODIMP -nsNullPrincipal::GetIsNullPrincipal(bool* aIsNullPrincipal) -{ - *aIsNullPrincipal = true; - return NS_OK; -} - NS_IMETHODIMP nsNullPrincipal::GetBaseDomain(nsACString& aBaseDomain) { diff --git a/caps/nsNullPrincipal.h b/caps/nsNullPrincipal.h index f2852ba7d207..04c7b0590bd2 100644 --- a/caps/nsNullPrincipal.h +++ b/caps/nsNullPrincipal.h @@ -44,7 +44,6 @@ class nsNullPrincipal final : public mozilla::BasePrincipal NS_IMETHOD GetURI(nsIURI** aURI) override; NS_IMETHOD GetDomain(nsIURI** aDomain) override; NS_IMETHOD SetDomain(nsIURI* aDomain) override; - NS_IMETHOD GetIsNullPrincipal(bool* aIsNullPrincipal) override; NS_IMETHOD GetBaseDomain(nsACString& aBaseDomain) override; nsresult GetOriginInternal(nsACString& aOrigin) override; @@ -59,6 +58,8 @@ class nsNullPrincipal final : public mozilla::BasePrincipal virtual void GetScriptLocation(nsACString &aStr) override; + PrincipalKind Kind() override { return eNullPrincipal; } + protected: virtual ~nsNullPrincipal() {} diff --git a/caps/nsPrincipal.h b/caps/nsPrincipal.h index 1c4360629057..0c5075bfd1c1 100644 --- a/caps/nsPrincipal.h +++ b/caps/nsPrincipal.h @@ -49,6 +49,8 @@ class nsPrincipal final : public mozilla::BasePrincipal */ static void InitializeStatics(); + PrincipalKind Kind() override { return eCodebasePrincipal; } + nsCOMPtr mDomain; nsCOMPtr mCodebase; // If mCodebaseImmutable is true, mCodebase is non-null and immutable @@ -83,6 +85,8 @@ class nsExpandedPrincipal : public nsIExpandedPrincipal, public mozilla::BasePri virtual void GetScriptLocation(nsACString &aStr) override; nsresult GetOriginInternal(nsACString& aOrigin) override; + PrincipalKind Kind() override { return eExpandedPrincipal; } + protected: virtual ~nsExpandedPrincipal(); diff --git a/caps/nsSystemPrincipal.h b/caps/nsSystemPrincipal.h index 06c456226c12..5542d09898bf 100644 --- a/caps/nsSystemPrincipal.h +++ b/caps/nsSystemPrincipal.h @@ -50,6 +50,8 @@ class nsSystemPrincipal final : public mozilla::BasePrincipal { return true; } + + PrincipalKind Kind() override { return eSystemPrincipal; } }; #endif // nsSystemPrincipal_h__ diff --git a/caps/tests/unit/test_origin.js b/caps/tests/unit/test_origin.js index 30b9e367d252..8bd4d5058495 100644 --- a/caps/tests/unit/test_origin.js +++ b/caps/tests/unit/test_origin.js @@ -162,4 +162,16 @@ function run_test() { checkCrossOrigin(exampleOrg_signedPkg, exampleOrg); checkCrossOrigin(exampleOrg_signedPkg, exampleOrg_signedPkg_browser); checkCrossOrigin(exampleOrg_signedPkg, exampleOrg_signedPkg_another); + + // Check Principal kinds. + function checkKind(prin, kind) { + do_check_eq(prin.isNullPrincipal, kind == 'nullPrincipal'); + do_check_eq(prin.isCodebasePrincipal, kind == 'codebasePrincipal'); + do_check_eq(prin.isExpandedPrincipal, kind == 'expandedPrincipal'); + do_check_eq(prin.isSystemPrincipal, kind == 'systemPrincipal'); + } + checkKind(ssm.createNullPrincipal({}), 'nullPrincipal'); + checkKind(ssm.createCodebasePrincipal(makeURI('http://www.example.com'), {}), 'codebasePrincipal'); + checkKind(ssm.createExpandedPrincipal([ssm.createCodebasePrincipal(makeURI('http://www.example.com'), {})]), 'expandedPrincipal'); + checkKind(ssm.getSystemPrincipal(), 'systemPrincipal'); }