mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-03 02:25:34 +00:00
e5b57b5d4c
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
123 lines
3.5 KiB
C++
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
|