author | Michael Layzell <michael@thelayzells.com> |
Thu, 13 Apr 2017 12:21:34 -0400 | |
changeset 353985 | 0a2fca8aa2e64c151f566c189e03f6dbf303e47b |
parent 353984 | bcf9341329ab5ade13acd349acc96cdafe5e883e |
child 353986 | 10e9a5b8150c898843b44b0373b60b8e66bd17e8 |
push id | 31684 |
push user | cbook@mozilla.com |
push date | Thu, 20 Apr 2017 09:13:26 +0000 |
treeherder | mozilla-central@27311156637f [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | ehsan |
bugs | 1356277 |
milestone | 55.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
dom/base/nsContentUtils.cpp | file | annotate | diff | comparison | revisions | |
dom/base/nsContentUtils.h | file | annotate | diff | comparison | revisions |
--- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -8786,16 +8786,54 @@ nsContentUtils::StorageAllowedForWindow( // static, public nsContentUtils::StorageAccess nsContentUtils::StorageAllowedForPrincipal(nsIPrincipal* aPrincipal) { return InternalStorageAllowedForPrincipal(aPrincipal, nullptr); } // static, private +void +nsContentUtils::GetCookieBehaviorForPrincipal(nsIPrincipal* aPrincipal, + uint32_t* aLifetimePolicy, + uint32_t* aBehavior) +{ + *aLifetimePolicy = sCookiesLifetimePolicy; + *aBehavior = sCookiesBehavior; + + // Any permissions set for the given principal will override our default + // settings from preferences. + nsCOMPtr<nsIPermissionManager> permissionManager = + services::GetPermissionManager(); + if (!permissionManager) { + return; + } + + uint32_t perm; + permissionManager->TestPermissionFromPrincipal(aPrincipal, "cookie", &perm); + switch (perm) { + case nsICookiePermission::ACCESS_ALLOW: + *aBehavior = nsICookieService::BEHAVIOR_ACCEPT; + break; + case nsICookiePermission::ACCESS_DENY: + *aBehavior = nsICookieService::BEHAVIOR_REJECT; + break; + case nsICookiePermission::ACCESS_SESSION: + *aLifetimePolicy = nsICookieService::ACCEPT_SESSION; + break; + case nsICookiePermission::ACCESS_ALLOW_FIRST_PARTY_ONLY: + *aBehavior = nsICookieService::BEHAVIOR_REJECT_FOREIGN; + break; + case nsICookiePermission::ACCESS_LIMIT_THIRD_PARTY: + *aBehavior = nsICookieService::BEHAVIOR_LIMIT_FOREIGN; + break; + } +} + +// static, private nsContentUtils::StorageAccess nsContentUtils::InternalStorageAllowedForPrincipal(nsIPrincipal* aPrincipal, nsPIDOMWindowInner* aWindow) { MOZ_ASSERT(aPrincipal); MOZ_ASSERT(!aWindow || aWindow->IsInnerWindow()); StorageAccess access = StorageAccess::eAllow; @@ -8814,38 +8852,22 @@ nsContentUtils::InternalStorageAllowedFo } // Check if we are in private browsing, and record that fact if (IsInPrivateBrowsing(document)) { access = StorageAccess::ePrivateBrowsing; } } - nsCOMPtr<nsIPermissionManager> permissionManager = - services::GetPermissionManager(); - if (!permissionManager) { - return StorageAccess::eDeny; - } - - // check the permission manager for any allow or deny permissions - // for cookies for the window. - uint32_t perm; - permissionManager->TestPermissionFromPrincipal(aPrincipal, "cookie", &perm); - if (perm == nsIPermissionManager::DENY_ACTION) { - return StorageAccess::eDeny; - } - if (perm == nsICookiePermission::ACCESS_SESSION) { - return std::min(access, StorageAccess::eSessionScoped); - } - if (perm == nsIPermissionManager::ALLOW_ACTION) { - return access; - } + uint32_t lifetimePolicy; + uint32_t behavior; + GetCookieBehaviorForPrincipal(aPrincipal, &lifetimePolicy, &behavior); // Check if we should only allow storage for the session, and record that fact - if (sCookiesLifetimePolicy == nsICookieService::ACCEPT_SESSION) { + if (lifetimePolicy == nsICookieService::ACCEPT_SESSION) { // Storage could be StorageAccess::ePrivateBrowsing or StorageAccess::eAllow // so perform a std::min comparison to make sure we preserve ePrivateBrowsing // if it has been set. access = std::min(StorageAccess::eSessionScoped, access); } // About URIs are allowed to access storage, even if they don't have chrome // privileges. If this is not desired, than the consumer will have to @@ -8876,23 +8898,23 @@ nsContentUtils::InternalStorageAllowedFo bool isAbout = false; MOZ_ALWAYS_SUCCEEDS(uri->SchemeIs("about", &isAbout)); if (isAbout) { return access; } } // We don't want to prompt for every attempt to access permissions. - if (sCookiesBehavior == nsICookieService::BEHAVIOR_REJECT) { + if (behavior == nsICookieService::BEHAVIOR_REJECT) { return StorageAccess::eDeny; } // In the absense of a window, we assume that we are first-party. - if (aWindow && (sCookiesBehavior == nsICookieService::BEHAVIOR_REJECT_FOREIGN || - sCookiesBehavior == nsICookieService::BEHAVIOR_LIMIT_FOREIGN)) { + if (aWindow && (behavior == nsICookieService::BEHAVIOR_REJECT_FOREIGN || + behavior == nsICookieService::BEHAVIOR_LIMIT_FOREIGN)) { nsCOMPtr<mozIThirdPartyUtil> thirdPartyUtil = do_GetService(THIRDPARTYUTIL_CONTRACTID); MOZ_ASSERT(thirdPartyUtil); bool thirdPartyWindow = false; if (NS_SUCCEEDED(thirdPartyUtil->IsThirdPartyWindow( aWindow->GetOuterWindow(), nullptr, &thirdPartyWindow)) && thirdPartyWindow) { // XXX For non-cookie forms of storage, we handle BEHAVIOR_LIMIT_FOREIGN by
--- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -2899,16 +2899,26 @@ private: // Fills in aInfo with the tokens from the supplied autocomplete attribute. static AutocompleteAttrState InternalSerializeAutocompleteAttribute(const nsAttrValue* aAttrVal, mozilla::dom::AutocompleteInfo& aInfo); static bool CallOnAllRemoteChildren(nsIMessageBroadcaster* aManager, CallOnRemoteChildFunction aCallback, void* aArg); + /** + * Gets the current cookie lifetime policy and cookie behavior for a given + * principal by checking with preferences and the permission manager. + * + * Used in the implementation of InternalStorageAllowedForPrincipal. + */ + static void GetCookieBehaviorForPrincipal(nsIPrincipal* aPrincipal, + uint32_t* aLifetimePolicy, + uint32_t* aBehavior); + /* * Checks if storage for a given principal is permitted by the user's * preferences. If aWindow is non-null, its principal must be passed as * aPrincipal, and the third-party iframe and sandboxing status of the window * are also checked. * * Used in the implementation of StorageAllowedForWindow and * StorageAllowedForPrincipal.