gecko-dev/extensions/permissions/Permission.cpp
Paul Zuehlcke e5b57b5d4c Bug 1706292 - Do not clone principal for CookieJarSettings cookie permission check. r=timhuang,ckerschb
For every cookie permission check CookieJarSettings::CookiePermission has to create a new principal.
This is slow. It uses a cloned principal so it can strip the origin attributes which should not be
used for the permission check.
With this patch we no longer need to clone the principal. We pass in the original principal and perform
the OA stripping on an OA copy in BasePrincipal::EqualsForPermission.
Before, EqualsForPermission was guaranteed to get a content principal, because ClonePrincipalForPermission
enforced it. BasePrincipal::EqualsForPermission was refactored to account for non content principals.

Differential Revision: https://phabricator.services.mozilla.com/D120834
2021-07-30 15:01:07 +00:00

123 lines
3.5 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/Permission.h"
#include "nsIClassInfoImpl.h"
#include "nsIEffectiveTLDService.h"
#include "nsNetCID.h"
#include "nsNetUtil.h"
#include "mozilla/BasePrincipal.h"
#include "mozilla/StaticPrefs_permissions.h"
#include "mozilla/PermissionManager.h"
namespace mozilla {
// Permission Implementation
NS_IMPL_CLASSINFO(Permission, nullptr, 0, {0})
NS_IMPL_ISUPPORTS_CI(Permission, nsIPermission)
Permission::Permission(nsIPrincipal* aPrincipal, const nsACString& aType,
uint32_t aCapability, uint32_t aExpireType,
int64_t aExpireTime, int64_t aModificationTime)
: mPrincipal(aPrincipal),
mType(aType),
mCapability(aCapability),
mExpireType(aExpireType),
mExpireTime(aExpireTime),
mModificationTime(aModificationTime) {}
already_AddRefed<nsIPrincipal> Permission::ClonePrincipalForPermission(
nsIPrincipal* aPrincipal) {
MOZ_ASSERT(aPrincipal);
mozilla::OriginAttributes attrs = aPrincipal->OriginAttributesRef();
PermissionManager::MaybeStripOriginAttributes(false, attrs);
nsAutoCString originNoSuffix;
nsresult rv = aPrincipal->GetOriginNoSuffix(originNoSuffix);
NS_ENSURE_SUCCESS(rv, nullptr);
nsCOMPtr<nsIURI> uri;
rv = NS_NewURI(getter_AddRefs(uri), originNoSuffix);
NS_ENSURE_SUCCESS(rv, nullptr);
return mozilla::BasePrincipal::CreateContentPrincipal(uri, attrs);
}
already_AddRefed<Permission> Permission::Create(
nsIPrincipal* aPrincipal, const nsACString& aType, uint32_t aCapability,
uint32_t aExpireType, int64_t aExpireTime, int64_t aModificationTime) {
NS_ENSURE_TRUE(aPrincipal, nullptr);
nsCOMPtr<nsIPrincipal> principal =
Permission::ClonePrincipalForPermission(aPrincipal);
NS_ENSURE_TRUE(principal, nullptr);
RefPtr<Permission> permission =
new Permission(principal, aType, aCapability, aExpireType, aExpireTime,
aModificationTime);
return permission.forget();
}
NS_IMETHODIMP
Permission::GetPrincipal(nsIPrincipal** aPrincipal) {
nsCOMPtr<nsIPrincipal> copy = mPrincipal;
copy.forget(aPrincipal);
return NS_OK;
}
NS_IMETHODIMP
Permission::GetType(nsACString& aType) {
aType = mType;
return NS_OK;
}
NS_IMETHODIMP
Permission::GetCapability(uint32_t* aCapability) {
*aCapability = mCapability;
return NS_OK;
}
NS_IMETHODIMP
Permission::GetExpireType(uint32_t* aExpireType) {
*aExpireType = mExpireType;
return NS_OK;
}
NS_IMETHODIMP
Permission::GetExpireTime(int64_t* aExpireTime) {
*aExpireTime = mExpireTime;
return NS_OK;
}
NS_IMETHODIMP
Permission::GetModificationTime(int64_t* aModificationTime) {
*aModificationTime = mModificationTime;
return NS_OK;
}
NS_IMETHODIMP
Permission::Matches(nsIPrincipal* aPrincipal, bool aExactHost, bool* aMatches) {
NS_ENSURE_ARG_POINTER(aPrincipal);
NS_ENSURE_ARG_POINTER(aMatches);
return mPrincipal->EqualsForPermission(aPrincipal, aExactHost, aMatches);
}
NS_IMETHODIMP
Permission::MatchesURI(nsIURI* aURI, bool aExactHost, bool* aMatches) {
NS_ENSURE_ARG_POINTER(aURI);
mozilla::OriginAttributes attrs;
nsCOMPtr<nsIPrincipal> principal =
mozilla::BasePrincipal::CreateContentPrincipal(aURI, attrs);
NS_ENSURE_TRUE(principal, NS_ERROR_FAILURE);
return Matches(principal, aExactHost, aMatches);
}
} // namespace mozilla