Bug 1591748 - nsPermissionMgr: Added principal oa strip permission list for userContext and privateBrowsing. r=Ehsan

Differential Revision: https://phabricator.services.mozilla.com/D58831

--HG--
extra : moz-landing-system : lando
This commit is contained in:
pbz 2020-01-08 13:06:28 +00:00
parent f258769124
commit 2945018d83
2 changed files with 179 additions and 55 deletions

View File

@ -153,16 +153,37 @@ bool IsPreloadPermission(const nsACString& aType) {
return false; return false;
} }
// Strip private browsing and user context (if enabled by pref) // Array of permission types which should not be isolated by origin attributes,
// Flipping these prefs changes the suffix being hashed. // for user context and private browsing.
void MaybeStripOAs(OriginAttributes& aOriginAttributes) { static constexpr std::array<nsLiteralCString, 1> kStripOAPermissions = {
{NS_LITERAL_CSTRING("cookie")}};
bool IsOAForceStripPermission(const nsACString& aType) {
if (aType.IsEmpty()) {
return false;
}
for (const auto& perm : kStripOAPermissions) {
if (perm.Equals(aType)) {
return true;
}
}
return false;
}
/**
* Strip origin attributes depending on pref state
* @param aForceStrip If true, strips user context and private browsing id,
* ignoring stripping prefs.
* @param aOriginAttributes object to strip.
*/
void MaybeStripOAs(bool aForceStrip, OriginAttributes& aOriginAttributes) {
uint32_t flags = 0; uint32_t flags = 0;
if (!StaticPrefs::permissions_isolateBy_privateBrowsing()) { if (aForceStrip || !StaticPrefs::permissions_isolateBy_privateBrowsing()) {
flags |= OriginAttributes::STRIP_PRIVATE_BROWSING_ID; flags |= OriginAttributes::STRIP_PRIVATE_BROWSING_ID;
} }
if (!StaticPrefs::permissions_isolateBy_userContext()) { if (aForceStrip || !StaticPrefs::permissions_isolateBy_userContext()) {
flags |= OriginAttributes::STRIP_USER_CONTEXT_ID; flags |= OriginAttributes::STRIP_USER_CONTEXT_ID;
} }
@ -172,15 +193,16 @@ void MaybeStripOAs(OriginAttributes& aOriginAttributes) {
} }
void OriginAppendOASuffix(OriginAttributes aOriginAttributes, void OriginAppendOASuffix(OriginAttributes aOriginAttributes,
nsACString& aOrigin) { bool aForceStripOA, nsACString& aOrigin) {
MaybeStripOAs(aOriginAttributes); MaybeStripOAs(aForceStripOA, aOriginAttributes);
nsAutoCString oaSuffix; nsAutoCString oaSuffix;
aOriginAttributes.CreateSuffix(oaSuffix); aOriginAttributes.CreateSuffix(oaSuffix);
aOrigin.Append(oaSuffix); aOrigin.Append(oaSuffix);
} }
nsresult GetOriginFromPrincipal(nsIPrincipal* aPrincipal, nsACString& aOrigin) { nsresult GetOriginFromPrincipal(nsIPrincipal* aPrincipal, bool aForceStripOA,
nsACString& aOrigin) {
nsresult rv = aPrincipal->GetOriginNoSuffix(aOrigin); nsresult rv = aPrincipal->GetOriginNoSuffix(aOrigin);
// The principal may belong to the about:blank content viewer, so this can be // The principal may belong to the about:blank content viewer, so this can be
// expected to fail. // expected to fail.
@ -197,26 +219,26 @@ nsresult GetOriginFromPrincipal(nsIPrincipal* aPrincipal, nsACString& aOrigin) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
OriginAppendOASuffix(attrs, aOrigin); OriginAppendOASuffix(attrs, aForceStripOA, aOrigin);
return NS_OK; return NS_OK;
} }
nsresult GetOriginFromURIAndOA(nsIURI* aURI, nsresult GetOriginFromURIAndOA(nsIURI* aURI,
const OriginAttributes* aOriginAttributes, const OriginAttributes* aOriginAttributes,
nsACString& aOrigin) { bool aForceStripOA, nsACString& aOrigin) {
nsAutoCString origin(aOrigin); nsAutoCString origin(aOrigin);
nsresult rv = ContentPrincipal::GenerateOriginNoSuffixFromURI(aURI, origin); nsresult rv = ContentPrincipal::GenerateOriginNoSuffixFromURI(aURI, origin);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
OriginAppendOASuffix(*aOriginAttributes, origin); OriginAppendOASuffix(*aOriginAttributes, aForceStripOA, origin);
aOrigin = origin; aOrigin = origin;
return NS_OK; return NS_OK;
} }
nsresult GetPrincipalFromOrigin(const nsACString& aOrigin, nsresult GetPrincipalFromOrigin(const nsACString& aOrigin, bool aForceStripOA,
nsIPrincipal** aPrincipal) { nsIPrincipal** aPrincipal) {
nsAutoCString originNoSuffix; nsAutoCString originNoSuffix;
mozilla::OriginAttributes attrs; mozilla::OriginAttributes attrs;
@ -224,7 +246,7 @@ nsresult GetPrincipalFromOrigin(const nsACString& aOrigin,
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
MaybeStripOAs(attrs); MaybeStripOAs(aForceStripOA, attrs);
nsCOMPtr<nsIURI> uri; nsCOMPtr<nsIURI> uri;
nsresult rv = NS_NewURI(getter_AddRefs(uri), originNoSuffix); nsresult rv = NS_NewURI(getter_AddRefs(uri), originNoSuffix);
@ -397,7 +419,8 @@ class MOZ_STACK_CLASS UpgradeHostToOriginHostfileImport final
uint32_t aPermission, uint32_t aExpireType, uint32_t aPermission, uint32_t aExpireType,
int64_t aExpireTime, int64_t aModificationTime) final { int64_t aExpireTime, int64_t aModificationTime) final {
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
nsresult rv = GetPrincipalFromOrigin(aOrigin, getter_AddRefs(principal)); nsresult rv = GetPrincipalFromOrigin(
aOrigin, IsOAForceStripPermission(aType), getter_AddRefs(principal));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
return mPm->AddInternal(principal, aType, aPermission, mID, aExpireType, return mPm->AddInternal(principal, aType, aPermission, mID, aExpireType,
@ -530,7 +553,8 @@ nsresult UpgradeHostToOriginAndInsert(
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
nsAutoCString origin; nsAutoCString origin;
rv = GetOriginFromPrincipal(principal, origin); rv = GetOriginFromPrincipal(principal, IsOAForceStripPermission(aType),
origin);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
return aHelper->Insert(origin, aType, aPermission, aExpireType, aExpireTime, return aHelper->Insert(origin, aType, aPermission, aExpireType, aExpireTime,
@ -645,7 +669,8 @@ nsresult UpgradeHostToOriginAndInsert(
if (NS_WARN_IF(NS_FAILED(rv))) continue; if (NS_WARN_IF(NS_FAILED(rv))) continue;
nsAutoCString origin; nsAutoCString origin;
rv = GetOriginFromPrincipal(principal, origin); rv = GetOriginFromPrincipal(principal, IsOAForceStripPermission(aType),
origin);
if (NS_WARN_IF(NS_FAILED(rv))) continue; if (NS_WARN_IF(NS_FAILED(rv))) continue;
// Ensure that we don't insert the same origin repeatedly // Ensure that we don't insert the same origin repeatedly
@ -692,7 +717,8 @@ nsresult UpgradeHostToOriginAndInsert(
getter_AddRefs(principal)); getter_AddRefs(principal));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
rv = GetOriginFromPrincipal(principal, origin); rv = GetOriginFromPrincipal(principal, IsOAForceStripPermission(aType),
origin);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
aHelper->Insert(origin, aType, aPermission, aExpireType, aExpireTime, aHelper->Insert(origin, aType, aPermission, aExpireType, aExpireTime,
@ -707,7 +733,8 @@ nsresult UpgradeHostToOriginAndInsert(
getter_AddRefs(principal)); getter_AddRefs(principal));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
rv = GetOriginFromPrincipal(principal, origin); rv = GetOriginFromPrincipal(principal, IsOAForceStripPermission(aType),
origin);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
aHelper->Insert(origin, aType, aPermission, aExpireType, aExpireTime, aHelper->Insert(origin, aType, aPermission, aExpireType, aExpireTime,
@ -741,9 +768,9 @@ static bool IsPersistentExpire(uint32_t aExpire, const nsACString& aType) {
nsPermissionManager::PermissionKey* nsPermissionManager::PermissionKey*
nsPermissionManager::PermissionKey::CreateFromPrincipal( nsPermissionManager::PermissionKey::CreateFromPrincipal(
nsIPrincipal* aPrincipal, nsresult& aResult) { nsIPrincipal* aPrincipal, bool aForceStripOA, nsresult& aResult) {
nsAutoCString origin; nsAutoCString origin;
aResult = GetOriginFromPrincipal(aPrincipal, origin); aResult = GetOriginFromPrincipal(aPrincipal, aForceStripOA, origin);
if (NS_WARN_IF(NS_FAILED(aResult))) { if (NS_WARN_IF(NS_FAILED(aResult))) {
return nullptr; return nullptr;
} }
@ -753,10 +780,11 @@ nsPermissionManager::PermissionKey::CreateFromPrincipal(
nsPermissionManager::PermissionKey* nsPermissionManager::PermissionKey*
nsPermissionManager::PermissionKey::CreateFromURIAndOriginAttributes( nsPermissionManager::PermissionKey::CreateFromURIAndOriginAttributes(
nsIURI* aURI, const OriginAttributes* aOriginAttributes, nsIURI* aURI, const OriginAttributes* aOriginAttributes, bool aForceStripOA,
nsresult& aResult) { nsresult& aResult) {
nsAutoCString origin; nsAutoCString origin;
aResult = GetOriginFromURIAndOA(aURI, aOriginAttributes, origin); aResult =
GetOriginFromURIAndOA(aURI, aOriginAttributes, aForceStripOA, origin);
if (NS_WARN_IF(NS_FAILED(aResult))) { if (NS_WARN_IF(NS_FAILED(aResult))) {
return nullptr; return nullptr;
} }
@ -1714,7 +1742,8 @@ nsresult nsPermissionManager::AddInternal(
int64_t aModificationTime, NotifyOperationType aNotifyOperation, int64_t aModificationTime, NotifyOperationType aNotifyOperation,
DBOperationType aDBOperation, const bool aIgnoreSessionPermissions) { DBOperationType aDBOperation, const bool aIgnoreSessionPermissions) {
nsAutoCString origin; nsAutoCString origin;
nsresult rv = GetOriginFromPrincipal(aPrincipal, origin); nsresult rv = GetOriginFromPrincipal(aPrincipal,
IsOAForceStripPermission(aType), origin);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
// For private browsing only store permissions for the session // For private browsing only store permissions for the session
@ -1753,8 +1782,8 @@ nsresult nsPermissionManager::AddInternal(
// When an entry already exists, PutEntry will return that, instead // When an entry already exists, PutEntry will return that, instead
// of adding a new one // of adding a new one
RefPtr<PermissionKey> key = RefPtr<PermissionKey> key = PermissionKey::CreateFromPrincipal(
PermissionKey::CreateFromPrincipal(aPrincipal, rv); aPrincipal, IsOAForceStripPermission(aType), rv);
if (!key) { if (!key) {
MOZ_ASSERT(NS_FAILED(rv)); MOZ_ASSERT(NS_FAILED(rv));
return rv; return rv;
@ -2063,8 +2092,10 @@ nsresult nsPermissionManager::RemovePermissionEntries(T aCondition) {
} }
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
nsresult rv = GetPrincipalFromOrigin(entry->GetKey()->mOrigin, nsresult rv = GetPrincipalFromOrigin(
getter_AddRefs(principal)); entry->GetKey()->mOrigin,
IsOAForceStripPermission(mTypeArray[permEntry.mType]),
getter_AddRefs(principal));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
continue; continue;
} }
@ -2266,6 +2297,7 @@ nsPermissionManager::GetPermissionObject(nsIPrincipal* aPrincipal,
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
nsresult rv = GetPrincipalFromOrigin(entry->GetKey()->mOrigin, nsresult rv = GetPrincipalFromOrigin(entry->GetKey()->mOrigin,
IsOAForceStripPermission(aType),
getter_AddRefs(principal)); getter_AddRefs(principal));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
@ -2333,8 +2365,8 @@ nsPermissionManager::GetPermissionHashKey(nsIPrincipal* aPrincipal,
MOZ_ASSERT(PermissionAvailable(aPrincipal, mTypeArray[aType])); MOZ_ASSERT(PermissionAvailable(aPrincipal, mTypeArray[aType]));
nsresult rv; nsresult rv;
RefPtr<PermissionKey> key = RefPtr<PermissionKey> key = PermissionKey::CreateFromPrincipal(
PermissionKey::CreateFromPrincipal(aPrincipal, rv); aPrincipal, IsOAForceStripPermission(mTypeArray[aType]), rv);
if (!key) { if (!key) {
return nullptr; return nullptr;
} }
@ -2402,7 +2434,8 @@ nsPermissionManager::GetPermissionHashKey(
if (aOriginAttributes) { if (aOriginAttributes) {
key = PermissionKey::CreateFromURIAndOriginAttributes( key = PermissionKey::CreateFromURIAndOriginAttributes(
aURI, aOriginAttributes, rv); aURI, aOriginAttributes, IsOAForceStripPermission(mTypeArray[aType]),
rv);
} else { } else {
key = PermissionKey::CreateFromURI(aURI, rv); key = PermissionKey::CreateFromURI(aURI, rv);
} }
@ -2490,8 +2523,10 @@ NS_IMETHODIMP nsPermissionManager::GetAllWithTypePrefix(
} }
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
nsresult rv = GetPrincipalFromOrigin(entry->GetKey()->mOrigin, nsresult rv = GetPrincipalFromOrigin(
getter_AddRefs(principal)); entry->GetKey()->mOrigin,
IsOAForceStripPermission(mTypeArray[permEntry.mType]),
getter_AddRefs(principal));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
continue; continue;
} }
@ -2510,6 +2545,45 @@ NS_IMETHODIMP nsPermissionManager::GetAllWithTypePrefix(
return NS_OK; return NS_OK;
} }
nsresult nsPermissionManager::GetStripPermsForPrincipal(
nsIPrincipal* aPrincipal, nsTArray<PermissionEntry>& aResult) {
aResult.Clear();
aResult.SetCapacity(kStripOAPermissions.size());
// No special strip permissions
if (kStripOAPermissions.empty()) {
return NS_OK;
}
nsresult rv;
// Create a key for the principal, but strip any origin attributes
RefPtr<PermissionKey> key =
PermissionKey::CreateFromPrincipal(aPrincipal, true, rv);
if (!key) {
MOZ_ASSERT(NS_FAILED(rv));
return rv;
}
PermissionHashKey* hashKey = mPermissionTable.GetEntry(key);
if (!hashKey) {
return NS_OK;
}
for (const auto& permType : kStripOAPermissions) {
int32_t index = GetTypeIndex(permType, false);
if (index == -1) {
continue;
}
PermissionEntry perm = hashKey->GetPermission(index);
if (perm.mPermission == nsIPermissionManager::UNKNOWN_ACTION) {
continue;
}
aResult.AppendElement(perm);
}
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
nsPermissionManager::GetAllForPrincipal( nsPermissionManager::GetAllForPrincipal(
nsIPrincipal* aPrincipal, nsTArray<RefPtr<nsIPermission>>& aResult) { nsIPrincipal* aPrincipal, nsTArray<RefPtr<nsIPermission>>& aResult) {
@ -2519,14 +2593,19 @@ nsPermissionManager::GetAllForPrincipal(
nsresult rv; nsresult rv;
RefPtr<PermissionKey> key = RefPtr<PermissionKey> key =
PermissionKey::CreateFromPrincipal(aPrincipal, rv); PermissionKey::CreateFromPrincipal(aPrincipal, false, rv);
if (!key) { if (!key) {
MOZ_ASSERT(NS_FAILED(rv)); MOZ_ASSERT(NS_FAILED(rv));
return rv; return rv;
} }
PermissionHashKey* entry = mPermissionTable.GetEntry(key); PermissionHashKey* entry = mPermissionTable.GetEntry(key);
nsTArray<PermissionEntry> strippedPerms;
rv = GetStripPermsForPrincipal(aPrincipal, strippedPerms);
if (NS_FAILED(rv)) {
return rv;
}
if (entry) { if (entry) {
for (const auto& permEntry : entry->GetPermissions()) { for (const auto& permEntry : entry->GetPermissions()) {
// Only return custom permissions // Only return custom permissions
@ -2534,10 +2613,23 @@ nsPermissionManager::GetAllForPrincipal(
continue; continue;
} }
// Stripped principal permissions overwrite regular ones
// For each permission check if there is a stripped permission we should
// use instead
PermissionEntry perm = permEntry;
nsTArray<PermissionEntry>::index_type index = 0;
for (const auto& strippedPerm : strippedPerms) {
if (strippedPerm.mType == permEntry.mType) {
perm = strippedPerm;
strippedPerms.RemoveElementAt(index);
break;
}
index++;
}
RefPtr<nsIPermission> permission = nsPermission::Create( RefPtr<nsIPermission> permission = nsPermission::Create(
aPrincipal, mTypeArray[permEntry.mType], permEntry.mPermission, aPrincipal, mTypeArray[perm.mType], perm.mPermission,
permEntry.mExpireType, permEntry.mExpireTime, perm.mExpireType, perm.mExpireTime, perm.mModificationTime);
permEntry.mModificationTime);
if (NS_WARN_IF(!permission)) { if (NS_WARN_IF(!permission)) {
continue; continue;
} }
@ -2545,6 +2637,16 @@ nsPermissionManager::GetAllForPrincipal(
} }
} }
for (const auto& perm : strippedPerms) {
RefPtr<nsIPermission> permission = nsPermission::Create(
aPrincipal, mTypeArray[perm.mType], perm.mPermission, perm.mExpireType,
perm.mExpireTime, perm.mModificationTime);
if (NS_WARN_IF(!permission)) {
continue;
}
aResult.AppendElement(permission);
}
return NS_OK; return NS_OK;
} }
@ -2607,7 +2709,7 @@ nsresult nsPermissionManager::RemovePermissionsWithAttributes(
PermissionHashKey* entry = iter.Get(); PermissionHashKey* entry = iter.Get();
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
nsresult rv = GetPrincipalFromOrigin(entry->GetKey()->mOrigin, nsresult rv = GetPrincipalFromOrigin(entry->GetKey()->mOrigin, false,
getter_AddRefs(principal)); getter_AddRefs(principal));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
continue; continue;
@ -2743,7 +2845,8 @@ nsresult nsPermissionManager::Read() {
modificationTime = stmt->AsInt64(6); modificationTime = stmt->AsInt64(6);
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
nsresult rv = GetPrincipalFromOrigin(origin, getter_AddRefs(principal)); nsresult rv = GetPrincipalFromOrigin(origin, IsOAForceStripPermission(type),
getter_AddRefs(principal));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
readError = true; readError = true;
continue; continue;
@ -2867,7 +2970,9 @@ nsresult nsPermissionManager::_DoImport(nsIInputStream* inputStream,
if (NS_FAILED(error)) continue; if (NS_FAILED(error)) continue;
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
error = GetPrincipalFromOrigin(lineArray[3], getter_AddRefs(principal)); error = GetPrincipalFromOrigin(lineArray[3],
IsOAForceStripPermission(lineArray[1]),
getter_AddRefs(principal));
if (NS_FAILED(error)) { if (NS_FAILED(error)) {
NS_WARNING("Couldn't import an origin permission - malformed origin"); NS_WARNING("Couldn't import an origin permission - malformed origin");
continue; continue;
@ -2975,7 +3080,8 @@ bool nsPermissionManager::GetPermissionsWithKey(
PermissionHashKey* entry = iter.Get(); PermissionHashKey* entry = iter.Get();
nsAutoCString permissionKey; nsAutoCString permissionKey;
GetKeyForOrigin(entry->GetKey()->mOrigin, permissionKey); GetKeyForOrigin(entry->GetKey()->mOrigin,
IsOAForceStripPermission(aPermissionKey), permissionKey);
// If the keys don't match, and we aren't getting the default "" key, then // If the keys don't match, and we aren't getting the default "" key, then
// we can exit early. We have to keep looking if we're getting the default // we can exit early. We have to keep looking if we're getting the default
@ -3032,7 +3138,8 @@ void nsPermissionManager::SetPermissionsWithKey(
for (IPC::Permission& perm : aPerms) { for (IPC::Permission& perm : aPerms) {
nsCOMPtr<nsIPrincipal> principal; nsCOMPtr<nsIPrincipal> principal;
nsresult rv = nsresult rv =
GetPrincipalFromOrigin(perm.origin, getter_AddRefs(principal)); GetPrincipalFromOrigin(perm.origin, IsOAForceStripPermission(perm.type),
getter_AddRefs(principal));
if (NS_WARN_IF(NS_FAILED(rv))) { if (NS_WARN_IF(NS_FAILED(rv))) {
continue; continue;
} }
@ -3056,6 +3163,7 @@ void nsPermissionManager::SetPermissionsWithKey(
/* static */ /* static */
void nsPermissionManager::GetKeyForOrigin(const nsACString& aOrigin, void nsPermissionManager::GetKeyForOrigin(const nsACString& aOrigin,
bool aForceStripOA,
nsACString& aKey) { nsACString& aKey) {
aKey.Truncate(); aKey.Truncate();
@ -3079,14 +3187,14 @@ void nsPermissionManager::GetKeyForOrigin(const nsACString& aOrigin,
return; return;
} }
MaybeStripOAs(attrs); MaybeStripOAs(aForceStripOA, attrs);
#ifdef DEBUG #ifdef DEBUG
// Parse the origin string into a principal, and extract some useful // Parse the origin string into a principal, and extract some useful
// information from it for assertions. // information from it for assertions.
nsCOMPtr<nsIPrincipal> dbgPrincipal; nsCOMPtr<nsIPrincipal> dbgPrincipal;
MOZ_ALWAYS_SUCCEEDS( MOZ_ALWAYS_SUCCEEDS(GetPrincipalFromOrigin(aOrigin, aForceStripOA,
GetPrincipalFromOrigin(aOrigin, getter_AddRefs(dbgPrincipal))); getter_AddRefs(dbgPrincipal)));
MOZ_ASSERT(dbgPrincipal->SchemeIs("http") || MOZ_ASSERT(dbgPrincipal->SchemeIs("http") ||
dbgPrincipal->SchemeIs("https") || dbgPrincipal->SchemeIs("ftp")); dbgPrincipal->SchemeIs("https") || dbgPrincipal->SchemeIs("ftp"));
MOZ_ASSERT(dbgPrincipal->OriginAttributesRef() == attrs); MOZ_ASSERT(dbgPrincipal->OriginAttributesRef() == attrs);
@ -3100,6 +3208,7 @@ void nsPermissionManager::GetKeyForOrigin(const nsACString& aOrigin,
/* static */ /* static */
void nsPermissionManager::GetKeyForPrincipal(nsIPrincipal* aPrincipal, void nsPermissionManager::GetKeyForPrincipal(nsIPrincipal* aPrincipal,
bool aForceStripOA,
nsACString& aKey) { nsACString& aKey) {
nsAutoCString origin; nsAutoCString origin;
nsresult rv = aPrincipal->GetOrigin(origin); nsresult rv = aPrincipal->GetOrigin(origin);
@ -3107,7 +3216,7 @@ void nsPermissionManager::GetKeyForPrincipal(nsIPrincipal* aPrincipal,
aKey.Truncate(); aKey.Truncate();
return; return;
} }
GetKeyForOrigin(origin, aKey); GetKeyForOrigin(origin, aForceStripOA, aKey);
} }
/* static */ /* static */
@ -3120,7 +3229,7 @@ void nsPermissionManager::GetKeyForPermission(nsIPrincipal* aPrincipal,
return; return;
} }
GetKeyForPrincipal(aPrincipal, aKey); GetKeyForPrincipal(aPrincipal, IsOAForceStripPermission(aType), aKey);
} }
/* static */ /* static */
@ -3133,7 +3242,7 @@ nsTArray<nsCString> nsPermissionManager::GetAllKeysForPrincipal(
while (prin) { while (prin) {
// Add the key to the list // Add the key to the list
nsCString* key = keys.AppendElement(); nsCString* key = keys.AppendElement();
GetKeyForPrincipal(prin, *key); GetKeyForPrincipal(prin, false, *key);
// Get the next subdomain principal and loop back around. // Get the next subdomain principal and loop back around.
prin = GetNextSubDomainPrincipal(prin); prin = GetNextSubDomainPrincipal(prin);

View File

@ -78,11 +78,12 @@ class nsPermissionManager final : public nsIPermissionManager,
class PermissionKey { class PermissionKey {
public: public:
static PermissionKey* CreateFromPrincipal(nsIPrincipal* aPrincipal, static PermissionKey* CreateFromPrincipal(nsIPrincipal* aPrincipal,
bool aForceStripOA,
nsresult& aResult); nsresult& aResult);
static PermissionKey* CreateFromURI(nsIURI* aURI, nsresult& aResult); static PermissionKey* CreateFromURI(nsIURI* aURI, nsresult& aResult);
static PermissionKey* CreateFromURIAndOriginAttributes( static PermissionKey* CreateFromURIAndOriginAttributes(
nsIURI* aURI, const mozilla::OriginAttributes* aOriginAttributes, nsIURI* aURI, const mozilla::OriginAttributes* aOriginAttributes,
nsresult& aResult); bool aForceStripOA, nsresult& aResult);
explicit PermissionKey(const nsACString& aOrigin) explicit PermissionKey(const nsACString& aOrigin)
: mOrigin(aOrigin), mHashCode(mozilla::HashString(aOrigin)) {} : mOrigin(aOrigin), mHashCode(mozilla::HashString(aOrigin)) {}
@ -222,11 +223,13 @@ class nsPermissionManager final : public nsIPermissionManager,
* https://, or ftp:// schemes are given the default "" Permission Key. * https://, or ftp:// schemes are given the default "" Permission Key.
* *
* @param aPrincipal The Principal which the key is to be extracted from. * @param aPrincipal The Principal which the key is to be extracted from.
* @param aPermissionKey A string which will be filled with the permission * @param aForceStripOA Whether to force stripping the principals origin
* attributes prior to generating the key.
* @param aKey A string which will be filled with the permission
* key. * key.
*/ */
static void GetKeyForPrincipal(nsIPrincipal* aPrincipal, static void GetKeyForPrincipal(nsIPrincipal* aPrincipal, bool aForceStripOA,
nsACString& aPermissionKey); nsACString& aKey);
/** /**
* See `nsIPermissionManager::GetPermissionsWithKey` for more info on * See `nsIPermissionManager::GetPermissionsWithKey` for more info on
@ -240,11 +243,13 @@ class nsPermissionManager final : public nsIPermissionManager,
* nonsensical permission key result. * nonsensical permission key result.
* *
* @param aOrigin The origin which the key is to be extracted from. * @param aOrigin The origin which the key is to be extracted from.
* @param aPermissionKey A string which will be filled with the permission * @param aForceStripOA Whether to force stripping the origins attributes
* prior to generating the key.
* @param aKey A string which will be filled with the permission
* key. * key.
*/ */
static void GetKeyForOrigin(const nsACString& aOrigin, static void GetKeyForOrigin(const nsACString& aOrigin, bool aForceStripOA,
nsACString& aPermissionKey); nsACString& aKey);
/** /**
* See `nsIPermissionManager::GetPermissionsWithKey` for more info on * See `nsIPermissionManager::GetPermissionsWithKey` for more info on
@ -361,6 +366,16 @@ class nsPermissionManager final : public nsIPermissionManager,
private: private:
virtual ~nsPermissionManager(); virtual ~nsPermissionManager();
/**
* Get all permissions for a given principal, which should not be isolated
* by user context or private browsing. The principal has its origin
* attributes stripped before perm db lookup. This is currently only affects
* the "cookie" permission.
* @param aPrincipal Used for creating the permission key.
*/
nsresult GetStripPermsForPrincipal(nsIPrincipal* aPrincipal,
nsTArray<PermissionEntry>& aResult);
// NOTE: nullptr can be passed as aType - if it is this function will return // NOTE: nullptr can be passed as aType - if it is this function will return
// "false" unconditionally. // "false" unconditionally.
static bool HasDefaultPref(const nsACString& aType) { static bool HasDefaultPref(const nsACString& aType) {