forked from mirrors/gecko-dev
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
122 lines
3.5 KiB
C++
122 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
|