From 8fd2eb42b05be1d2fa7de50b0ba063aa9f5e6a40 Mon Sep 17 00:00:00 2001 From: Arthur Edelstein Date: Wed, 19 Apr 2017 15:54:41 -0700 Subject: [PATCH] Bug 21569: Add first-party domain to Permissions key --- .../originattributes/test/browser/browser.ini | 1 + .../browser/browser_permissions_isolation.js | 46 +++++++++++++++++++ caps/BasePrincipal.cpp | 18 -------- caps/BasePrincipal.h | 2 - dom/permission/PermissionStatus.cpp | 2 +- extensions/cookie/nsPermission.cpp | 4 +- extensions/cookie/nsPermissionManager.cpp | 16 ------- 7 files changed, 50 insertions(+), 39 deletions(-) create mode 100644 browser/components/originattributes/test/browser/browser_permissions_isolation.js diff --git a/browser/components/originattributes/test/browser/browser.ini b/browser/components/originattributes/test/browser/browser.ini index 24a6d4e17297e..7430f2dc84236 100644 --- a/browser/components/originattributes/test/browser/browser.ini +++ b/browser/components/originattributes/test/browser/browser.ini @@ -76,5 +76,6 @@ support-files = [browser_clientAuth.js] [browser_cacheAPI.js] [browser_permissions.js] +[browser_permissions_isolation.js] [browser_sanitize.js] [browser_windowOpenerRestriction.js] diff --git a/browser/components/originattributes/test/browser/browser_permissions_isolation.js b/browser/components/originattributes/test/browser/browser_permissions_isolation.js new file mode 100644 index 0000000000000..0fd535586cb5c --- /dev/null +++ b/browser/components/originattributes/test/browser/browser_permissions_isolation.js @@ -0,0 +1,46 @@ +/** + * Tor Bug 21569 - A test case for permissions isolation. + */ + +const TEST_PAGE = "http://mochi.test:8888/browser/browser/components/" + + "originattributes/test/browser/file_firstPartyBasic.html"; + +function* init() { + let permPromise = TestUtils.topicObserved("perm-changed"); + Services.perms.removeAll(); + info("called removeAll"); + yield permPromise; + info("cleared permissions for new test"); +} + +// Define the testing function +function* doTest(aBrowser) { + // Promise will result when permissions popup appears: + let popupShowPromise = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popupshown"); + let originalStatus = yield ContentTask.spawn(aBrowser, null, function* (key) { + let status = (yield content.navigator.permissions.query({name: "notifications"})).state; + content.Notification.requestPermission(); + return status; + }); + info(`originalStatus: '${originalStatus}'`); + if (originalStatus === "prompt") { + // Wait for the popup requesting permission to show notifications: + yield popupShowPromise; + let popupHidePromise = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popuphidden"); + let popupNotification = PopupNotifications.panel.childNodes[0]; + // Click to grant permission: + popupNotification.button.click(); + // Wait for popup to hide again. + yield popupHidePromise; + } + return originalStatus; +} + +add_task(function* () { + yield SpecialPowers.pushPrefEnv({ + set: [["dom.webnotifications.enabled", true]] + }); + IsolationTestTools.runTests(TEST_PAGE, doTest, + (isolated, val1, val2) => (isolated === ( val2 === "prompt")), + init, true); +}); diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index e9680dfc20c7e..baaebcffc8bfc 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -443,24 +443,6 @@ BasePrincipal::CreateCodebasePrincipal(const nsACString& aOrigin) return BasePrincipal::CreateCodebasePrincipal(uri, attrs); } -already_AddRefed -BasePrincipal::CloneStrippingUserContextIdAndFirstPartyDomain() -{ - OriginAttributes attrs = OriginAttributesRef(); - attrs.StripAttributes(OriginAttributes::STRIP_USER_CONTEXT_ID | - OriginAttributes::STRIP_FIRST_PARTY_DOMAIN); - - nsAutoCString originNoSuffix; - nsresult rv = GetOriginNoSuffix(originNoSuffix); - NS_ENSURE_SUCCESS(rv, nullptr); - - nsCOMPtr uri; - rv = NS_NewURI(getter_AddRefs(uri), originNoSuffix); - NS_ENSURE_SUCCESS(rv, nullptr); - - return BasePrincipal::CreateCodebasePrincipal(uri, attrs); -} - bool BasePrincipal::AddonAllowsLoad(nsIURI* aURI, bool aExplicit /* = false */) { diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index 97e8f45dbd99d..ca2b3a213e4b7 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -111,8 +111,6 @@ public: PrincipalKind Kind() const { return mKind; } - already_AddRefed CloneStrippingUserContextIdAndFirstPartyDomain(); - // Helper to check whether this principal is associated with an addon that // allows unprivileged code to load aURI. aExplicit == true will prevent // use of all_urls permission, requiring the domain in its permissions. diff --git a/dom/permission/PermissionStatus.cpp b/dom/permission/PermissionStatus.cpp index 680ece1d0f262..850dceeb32043 100644 --- a/dom/permission/PermissionStatus.cpp +++ b/dom/permission/PermissionStatus.cpp @@ -107,7 +107,7 @@ PermissionStatus::GetPrincipal() const } nsCOMPtr principal = - mozilla::BasePrincipal::Cast(doc->NodePrincipal())->CloneStrippingUserContextIdAndFirstPartyDomain(); + mozilla::BasePrincipal::Cast(doc->NodePrincipal()); NS_ENSURE_TRUE(principal, nullptr); return principal.forget(); diff --git a/extensions/cookie/nsPermission.cpp b/extensions/cookie/nsPermission.cpp index 633c47307a6cd..20ef4ab34460a 100644 --- a/extensions/cookie/nsPermission.cpp +++ b/extensions/cookie/nsPermission.cpp @@ -36,7 +36,7 @@ nsPermission::Create(nsIPrincipal* aPrincipal, { NS_ENSURE_TRUE(aPrincipal, nullptr); nsCOMPtr principal = - mozilla::BasePrincipal::Cast(aPrincipal)->CloneStrippingUserContextIdAndFirstPartyDomain(); + mozilla::BasePrincipal::Cast(aPrincipal); NS_ENSURE_TRUE(principal, nullptr); @@ -90,7 +90,7 @@ nsPermission::Matches(nsIPrincipal* aPrincipal, bool aExactHost, bool* aMatches) *aMatches = false; nsCOMPtr principal = - mozilla::BasePrincipal::Cast(aPrincipal)->CloneStrippingUserContextIdAndFirstPartyDomain(); + mozilla::BasePrincipal::Cast(aPrincipal); if (!principal) { *aMatches = false; diff --git a/extensions/cookie/nsPermissionManager.cpp b/extensions/cookie/nsPermissionManager.cpp index 6db764a18c1a9..29958695f8519 100644 --- a/extensions/cookie/nsPermissionManager.cpp +++ b/extensions/cookie/nsPermissionManager.cpp @@ -201,10 +201,6 @@ GetOriginFromPrincipal(nsIPrincipal* aPrincipal, nsACString& aOrigin) // any knowledge of private browsing. Allowing it to be true changes the suffix being hashed. attrs.mPrivateBrowsingId = 0; - // Disable userContext and firstParty isolation for permissions. - attrs.StripAttributes(mozilla::OriginAttributes::STRIP_USER_CONTEXT_ID | - mozilla::OriginAttributes::STRIP_FIRST_PARTY_DOMAIN); - attrs.CreateSuffix(suffix); aOrigin.Append(suffix); return NS_OK; @@ -223,10 +219,6 @@ GetPrincipalFromOrigin(const nsACString& aOrigin, nsIPrincipal** aPrincipal) // any knowledge of private browsing. Allowing it to be true changes the suffix being hashed. attrs.mPrivateBrowsingId = 0; - // Disable userContext and firstParty isolation for permissions. - attrs.StripAttributes(mozilla::OriginAttributes::STRIP_USER_CONTEXT_ID | - mozilla::OriginAttributes::STRIP_FIRST_PARTY_DOMAIN); - nsCOMPtr uri; nsresult rv = NS_NewURI(getter_AddRefs(uri), originNoSuffix); NS_ENSURE_SUCCESS(rv, rv); @@ -328,10 +320,6 @@ GetNextSubDomainPrincipal(nsIPrincipal* aPrincipal) // Copy the attributes over mozilla::OriginAttributes attrs = aPrincipal->OriginAttributesRef(); - // Disable userContext and firstParty isolation for permissions. - attrs.StripAttributes(mozilla::OriginAttributes::STRIP_USER_CONTEXT_ID | - mozilla::OriginAttributes::STRIP_FIRST_PARTY_DOMAIN); - nsCOMPtr principal = mozilla::BasePrincipal::CreateCodebasePrincipal(newURI, attrs); @@ -3304,10 +3292,6 @@ nsPermissionManager::GetKeyForOrigin(const nsACString& aOrigin, nsACString& aKey // any knowledge of private browsing. Allowing it to be true changes the suffix being hashed. attrs.mPrivateBrowsingId = 0; - // Disable userContext and firstParty isolation for permissions. - attrs.StripAttributes(OriginAttributes::STRIP_USER_CONTEXT_ID | - OriginAttributes::STRIP_FIRST_PARTY_DOMAIN); - #ifdef DEBUG // Parse the origin string into a principal, and extract some useful // information from it for assertions. -- GitLab