Bug 1867997 - Move nsIPrincipal/PrincipalInfo helpers to separate files; r=dom-storage-reviewers,jari

Differential Revision: https://phabricator.services.mozilla.com/D223992
This commit is contained in:
Jan Varga
2024-10-18 01:32:36 +00:00
parent dbc9573884
commit 8cdc63b5d9
21 changed files with 614 additions and 587 deletions

View File

@@ -94,7 +94,7 @@
#include "mozilla/dom/PermissionMessageUtils.h"
#include "mozilla/dom/Text.h"
#include "mozilla/dom/quota/PersistenceType.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/ContentChild.h"
#include "mozilla/layers/FrameUniformityData.h"
#include "nsPrintfCString.h"
@@ -3496,8 +3496,7 @@ nsDOMWindowUtils::GetFileReferences(const nsAString& aDatabaseName, int64_t aId,
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
quota::PrincipalMetadata principalMetadata;
MOZ_TRY_VAR(principalMetadata,
quota::QuotaManager::GetInfoFromWindow(window));
MOZ_TRY_VAR(principalMetadata, quota::GetInfoFromWindow(window));
RefPtr<IndexedDatabaseManager> mgr = IndexedDatabaseManager::Get();
if (mgr) {

View File

@@ -22,7 +22,7 @@
#include "mozilla/dom/cache/PCacheChild.h"
#include "mozilla/dom/cache/ReadStream.h"
#include "mozilla/dom/cache/TypeUtils.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/ResultExtensions.h"
#include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/ipc/BackgroundChild.h"
@@ -42,7 +42,6 @@
namespace mozilla::dom::cache {
using mozilla::ErrorResult;
using mozilla::dom::quota::QuotaManager;
using mozilla::ipc::BackgroundChild;
using mozilla::ipc::PBackgroundChild;
using mozilla::ipc::PrincipalInfo;
@@ -145,7 +144,7 @@ already_AddRefed<CacheStorage> CacheStorage::CreateOnMainThread(
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(aPrincipal, &principalInfo)),
nullptr, [&aRv](const nsresult rv) { aRv.Throw(rv); });
QM_TRY(OkIf(QuotaManager::IsPrincipalInfoValid(principalInfo)),
QM_TRY(OkIf(quota::IsPrincipalInfoValid(principalInfo)),
RefPtr{new CacheStorage(NS_ERROR_DOM_SECURITY_ERR)}.forget(),
[](const auto) {
NS_WARNING("CacheStorage not supported on invalid origins.");
@@ -193,7 +192,7 @@ already_AddRefed<CacheStorage> CacheStorage::CreateOnWorker(
const PrincipalInfo& principalInfo =
aWorkerPrivate->GetEffectiveStoragePrincipalInfo();
QM_TRY(OkIf(QuotaManager::IsPrincipalInfoValid(principalInfo)), nullptr,
QM_TRY(OkIf(quota::IsPrincipalInfoValid(principalInfo)), nullptr,
[&aRv](const auto) { aRv.Throw(NS_ERROR_FAILURE); });
// We have a number of cases where we want to skip the https scheme

View File

@@ -11,12 +11,11 @@
#include "mozilla/dom/cache/ActorUtils.h"
#include "mozilla/dom/cache/CacheOpParent.h"
#include "mozilla/dom/cache/ManagerId.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/ipc/PBackgroundParent.h"
namespace mozilla::dom::cache {
using mozilla::dom::quota::QuotaManager;
using mozilla::ipc::PBackgroundParent;
using mozilla::ipc::PrincipalInfo;
@@ -24,7 +23,7 @@ using mozilla::ipc::PrincipalInfo;
already_AddRefed<PCacheStorageParent> AllocPCacheStorageParent(
PBackgroundParent* aManagingActor, Namespace aNamespace,
const mozilla::ipc::PrincipalInfo& aPrincipalInfo) {
if (NS_WARN_IF(!QuotaManager::IsPrincipalInfoValid(aPrincipalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(aPrincipalInfo))) {
MOZ_ASSERT(false);
return nullptr;
}

View File

@@ -17,6 +17,7 @@
#include "mozilla/dom/quota/Assertions.h"
#include "mozilla/dom/quota/DirectoryLock.h"
#include "mozilla/dom/quota/DirectoryLockInlines.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/ResultExtensions.h"
#include "mozilla/dom/quota/ThreadUtils.h"
@@ -371,8 +372,8 @@ Context::QuotaInitRunnable::Run() {
MOZ_DIAGNOSTIC_ASSERT(quotaManager);
QM_TRY_UNWRAP(auto principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
*quotaManager, *mPrincipalInfo));
quota::GetInfoFromValidatedPrincipalInfo(*quotaManager,
*mPrincipalInfo));
mDirectoryMetadata.emplace(std::move(principalMetadata));

View File

@@ -8,7 +8,7 @@
#include "CacheCommon.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "nsIPrincipal.h"
#include "nsProxyRelease.h"
#include "mozilla/RefPtr.h"
@@ -23,11 +23,11 @@ Result<SafeRefPtr<ManagerId>, nsresult> ManagerId::Create(
nsIPrincipal* aPrincipal) {
MOZ_ASSERT(NS_IsMainThread());
// QuotaManager::GetOriginFromPrincipal() has special logic for system
// mozilla::dom::quota::GetOriginFromPrincipal() has special logic for system
// and about: principals. We need to use the same modified origin in
// order to interpret calls from QM correctly.
QM_TRY_INSPECT(const auto& quotaOrigin,
QuotaManager::GetOriginFromPrincipal(aPrincipal));
quota::GetOriginFromPrincipal(aPrincipal));
return MakeSafeRefPtr<ManagerId>(aPrincipal, quotaOrigin, ConstructorGuard{});
}

View File

@@ -12,6 +12,7 @@
#include "mozilla/dom/FileSystemLog.h"
#include "mozilla/dom/FileSystemManagerParent.h"
#include "mozilla/dom/FileSystemTypes.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaCommon.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/ResultExtensions.h"
@@ -34,8 +35,7 @@ mozilla::ipc::IPCResult CreateFileSystemManagerParent(
[aResolver](const auto&) { aResolver(NS_ERROR_INVALID_ARG); });
// This blocks Null and Expanded principals
QM_TRY(OkIf(quota::QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
IPC_OK(),
QM_TRY(OkIf(quota::IsPrincipalInfoValid(aPrincipalInfo)), IPC_OK(),
[aResolver](const auto&) { aResolver(NS_ERROR_DOM_SECURITY_ERR); });
QM_TRY(quota::QuotaManager::EnsureCreated(), IPC_OK(),
@@ -44,10 +44,10 @@ mozilla::ipc::IPCResult CreateFileSystemManagerParent(
auto* const quotaManager = quota::QuotaManager::Get();
MOZ_ASSERT(quotaManager);
QM_TRY_UNWRAP(auto principalMetadata,
quota::QuotaManager::GetInfoFromValidatedPrincipalInfo(
*quotaManager, aPrincipalInfo),
IPC_OK(), [aResolver](const auto rv) { aResolver(rv); });
QM_TRY_UNWRAP(
auto principalMetadata,
quota::GetInfoFromValidatedPrincipalInfo(*quotaManager, aPrincipalInfo),
IPC_OK(), [aResolver](const auto rv) { aResolver(rv); });
quota::OriginMetadata originMetadata(std::move(principalMetadata),
quota::PERSISTENCE_TYPE_DEFAULT);

View File

@@ -133,6 +133,7 @@
#include "mozilla/dom/quota/OriginScope.h"
#include "mozilla/dom/quota/PersistenceScope.h"
#include "mozilla/dom/quota/PersistenceType.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaCommon.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/QuotaObject.h"
@@ -9035,7 +9036,7 @@ Factory::AllocPBackgroundIDBFactoryRequestParent(
const PrincipalInfo& principalInfo = commonParams->principalInfo();
if (NS_AUUF_OR_WARN_IF(!QuotaManager::IsPrincipalInfoValid(principalInfo))) {
if (NS_AUUF_OR_WARN_IF(!quota::IsPrincipalInfoValid(principalInfo))) {
IPC_FAIL(this, "Invalid principal!");
return nullptr;
}
@@ -9119,7 +9120,7 @@ mozilla::ipc::IPCResult Factory::RecvGetDatabases(
QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(aPersistenceType)),
QM_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(quota::IsPrincipalInfoValid(aPrincipalInfo)),
QM_IPC_FAIL(this));
MOZ_ASSERT(aPrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo ||
@@ -14756,9 +14757,9 @@ nsresult FactoryOp::Open() {
QuotaManager* const quotaManager = QuotaManager::Get();
MOZ_ASSERT(quotaManager);
QM_TRY_UNWRAP(auto principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
*quotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(
auto principalMetadata,
quota::GetInfoFromValidatedPrincipalInfo(*quotaManager, mPrincipalInfo));
mOriginMetadata = {std::move(principalMetadata), mPersistenceType};

View File

@@ -16,6 +16,7 @@
#include "mozilla/dom/Document.h"
#include "mozilla/dom/IDBFactoryBinding.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/ResultExtensions.h"
#include "mozilla/dom/BrowserChild.h"
@@ -129,7 +130,7 @@ Result<RefPtr<IDBFactory>, nsresult> IDBFactory::CreateForWindow(
MOZ_ASSERT(principalInfo->type() == PrincipalInfo::TContentPrincipalInfo ||
principalInfo->type() == PrincipalInfo::TSystemPrincipalInfo);
if (NS_WARN_IF(!QuotaManager::IsPrincipalInfoValid(*principalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(*principalInfo))) {
IDB_REPORT_INTERNAL_ERR();
return Err(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
}
@@ -180,7 +181,7 @@ Result<RefPtr<IDBFactory>, nsresult> IDBFactory::CreateForMainThreadJS(
return Err(rv);
}
if (NS_WARN_IF(!QuotaManager::IsPrincipalInfoValid(*principalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(*principalInfo))) {
return Err(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
}
@@ -705,7 +706,7 @@ RefPtr<IDBOpenDBRequest> IDBFactory::OpenInternal(
return nullptr;
}
if (NS_WARN_IF(!QuotaManager::IsPrincipalInfoValid(principalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(principalInfo))) {
IDB_REPORT_INTERNAL_ERR();
aRv.Throw(NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR);
return nullptr;

View File

@@ -83,6 +83,7 @@
#include "mozilla/dom/quota/OriginScope.h"
#include "mozilla/dom/quota/PersistenceScope.h"
#include "mozilla/dom/quota/PersistenceType.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaCommon.h"
#include "mozilla/dom/quota/StorageHelpers.h"
#include "mozilla/dom/quota/QuotaManager.h"
@@ -3091,7 +3092,7 @@ bool VerifyPrincipalInfo(const PrincipalInfo& aPrincipalInfo,
bool aCheckClientPrincipal) {
AssertIsOnBackgroundThread();
if (NS_WARN_IF(!QuotaManager::IsPrincipalInfoValid(aPrincipalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(aPrincipalInfo))) {
return false;
}
@@ -6706,14 +6707,13 @@ nsresult PrepareDatastoreOp::Start() {
commonParams.storagePrincipalInfo();
if (storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo) {
mOriginMetadata = {QuotaManager::GetInfoForChrome(),
PERSISTENCE_TYPE_DEFAULT};
mOriginMetadata = {quota::GetInfoForChrome(), PERSISTENCE_TYPE_DEFAULT};
} else {
MOZ_ASSERT(storagePrincipalInfo.type() ==
PrincipalInfo::TContentPrincipalInfo);
QM_TRY_UNWRAP(auto principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
quota::GetInfoFromValidatedPrincipalInfo(
*QuotaManager::Get(), storagePrincipalInfo));
mOriginMetadata.mSuffix = std::move(principalMetadata.mSuffix);
@@ -7918,13 +7918,12 @@ nsresult PrepareObserverOp::Start() {
const PrincipalInfo& storagePrincipalInfo = params.storagePrincipalInfo();
if (storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo) {
mOrigin = QuotaManager::GetOriginForChrome();
mOrigin = quota::GetOriginForChrome();
} else {
MOZ_ASSERT(storagePrincipalInfo.type() ==
PrincipalInfo::TContentPrincipalInfo);
mOrigin =
QuotaManager::GetOriginFromValidatedPrincipalInfo(storagePrincipalInfo);
mOrigin = quota::GetOriginFromValidatedPrincipalInfo(storagePrincipalInfo);
}
mState = State::SendingReadyMessage;
@@ -8132,10 +8131,10 @@ nsresult PreloadedOp::Start() {
MOZ_ASSERT(
storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo ||
storagePrincipalInfo.type() == PrincipalInfo::TContentPrincipalInfo);
mOrigin = storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo
? nsCString{QuotaManager::GetOriginForChrome()}
: QuotaManager::GetOriginFromValidatedPrincipalInfo(
storagePrincipalInfo);
mOrigin =
storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo
? nsCString{quota::GetOriginForChrome()}
: quota::GetOriginFromValidatedPrincipalInfo(storagePrincipalInfo);
mState = State::SendingResults;
MOZ_ALWAYS_SUCCEEDS(OwningEventTarget()->Dispatch(this, NS_DISPATCH_NORMAL));
@@ -8189,10 +8188,10 @@ nsresult GetStateOp::Start() {
MOZ_ASSERT(
storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo ||
storagePrincipalInfo.type() == PrincipalInfo::TContentPrincipalInfo);
mOrigin = storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo
? nsCString{QuotaManager::GetOriginForChrome()}
: QuotaManager::GetOriginFromValidatedPrincipalInfo(
storagePrincipalInfo);
mOrigin =
storagePrincipalInfo.type() == PrincipalInfo::TSystemPrincipalInfo
? nsCString{quota::GetOriginForChrome()}
: quota::GetOriginFromValidatedPrincipalInfo(storagePrincipalInfo);
mState = State::SendingResults;
MOZ_ALWAYS_SUCCEEDS(OwningEventTarget()->Dispatch(this, NS_DISPATCH_NORMAL));
@@ -8596,7 +8595,7 @@ nsresult QuotaClient::AboutToClearOrigins(
// `CreateAerchivedOriginScope` because it calls `GenerateOriginKey2` which
// doesn't support the system principal.
if (aOriginScope.IsOrigin() &&
aOriginScope.GetOrigin() == QuotaManager::GetOriginForChrome()) {
aOriginScope.GetOrigin() == quota::GetOriginForChrome()) {
return NS_OK;
}

View File

@@ -31,7 +31,7 @@
#include "mozilla/dom/LocalStorageCommon.h"
#include "mozilla/dom/PBackgroundLSRequest.h"
#include "mozilla/dom/PBackgroundLSSharedTypes.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/glean/GleanMetrics.h"
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/ipc/BackgroundUtils.h"
@@ -278,23 +278,20 @@ nsresult LSObject::CreateForWindow(nsPIDOMWindowInner* aWindow,
MOZ_ASSERT(storagePrincipalInfo->type() ==
PrincipalInfo::TContentPrincipalInfo);
if (NS_WARN_IF(
!quota::QuotaManager::IsPrincipalInfoValid(*storagePrincipalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(*storagePrincipalInfo))) {
return NS_ERROR_FAILURE;
}
#ifdef DEBUG
QM_TRY_INSPECT(
const auto& principalMetadata,
quota::QuotaManager::GetInfoFromPrincipal(storagePrincipal.get()));
QM_TRY_INSPECT(const auto& principalMetadata,
quota::GetInfoFromPrincipal(storagePrincipal.get()));
MOZ_ASSERT(originAttrSuffix == principalMetadata.mSuffix);
const auto& origin = principalMetadata.mOrigin;
#else
QM_TRY_INSPECT(
const auto& origin,
quota::QuotaManager::GetOriginFromPrincipal(storagePrincipal.get()));
QM_TRY_INSPECT(const auto& origin,
quota::GetOriginFromPrincipal(storagePrincipal.get()));
#endif
uint32_t privateBrowsingId;
@@ -373,8 +370,7 @@ nsresult LSObject::CreateForPrincipal(nsPIDOMWindowInner* aWindow,
storagePrincipalInfo->type() == PrincipalInfo::TContentPrincipalInfo ||
storagePrincipalInfo->type() == PrincipalInfo::TSystemPrincipalInfo);
if (NS_WARN_IF(
!quota::QuotaManager::IsPrincipalInfoValid(*storagePrincipalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(*storagePrincipalInfo))) {
return NS_ERROR_FAILURE;
}
@@ -385,26 +381,26 @@ nsresult LSObject::CreateForPrincipal(nsPIDOMWindowInner* aWindow,
&aPrincipal]() -> Result<quota::PrincipalMetadata, nsresult> {
if (storagePrincipalInfo->type() ==
PrincipalInfo::TSystemPrincipalInfo) {
return quota::QuotaManager::GetInfoForChrome();
return quota::GetInfoForChrome();
}
QM_TRY_RETURN(quota::QuotaManager::GetInfoFromPrincipal(aPrincipal));
QM_TRY_RETURN(quota::GetInfoFromPrincipal(aPrincipal));
}()));
MOZ_ASSERT(originAttrSuffix == principalMetadata.mSuffix);
const auto& origin = principalMetadata.mOrigin;
#else
QM_TRY_INSPECT(
const auto& origin, ([&storagePrincipalInfo,
&aPrincipal]() -> Result<nsAutoCString, nsresult> {
if (storagePrincipalInfo->type() ==
PrincipalInfo::TSystemPrincipalInfo) {
return nsAutoCString{quota::QuotaManager::GetOriginForChrome()};
}
QM_TRY_INSPECT(const auto& origin,
([&storagePrincipalInfo,
&aPrincipal]() -> Result<nsAutoCString, nsresult> {
if (storagePrincipalInfo->type() ==
PrincipalInfo::TSystemPrincipalInfo) {
return nsAutoCString{quota::GetOriginForChrome()};
}
QM_TRY_RETURN(quota::QuotaManager::GetOriginFromPrincipal(aPrincipal));
}()));
QM_TRY_RETURN(quota::GetOriginFromPrincipal(aPrincipal));
}()));
#endif
Maybe<nsID> clientId;

View File

@@ -25,8 +25,8 @@
#include "mozilla/dom/PBackgroundLSSharedTypes.h"
#include "mozilla/dom/PBackgroundLSSimpleRequest.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/PromiseUtils.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/ipc/BackgroundUtils.h"
#include "mozilla/ipc/PBackgroundChild.h"
@@ -165,7 +165,7 @@ nsresult CheckedPrincipalToPrincipalInfo(
return rv;
}
if (NS_WARN_IF(!quota::QuotaManager::IsPrincipalInfoValid(aPrincipalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(aPrincipalInfo))) {
return NS_ERROR_FAILURE;
}

View File

@@ -99,6 +99,7 @@
#include "mozilla/dom/quota/FileUtils.h"
#include "mozilla/dom/quota/MozPromiseUtils.h"
#include "mozilla/dom/quota/PersistenceType.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaManagerImpl.h"
#include "mozilla/dom/quota/QuotaManagerService.h"
#include "mozilla/dom/quota/ResultExtensions.h"
@@ -109,7 +110,6 @@
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/ipc/BackgroundParent.h"
#include "mozilla/ipc/PBackgroundChild.h"
#include "mozilla/ipc/PBackgroundSharedTypes.h"
#include "mozilla/ipc/ProtocolUtils.h"
#include "mozilla/net/ExtensionProtocolHandler.h"
#include "mozilla/StorageOriginAttributes.h"
@@ -141,7 +141,6 @@
#include "nsIPlatformInfo.h"
#include "nsIPrincipal.h"
#include "nsIRunnable.h"
#include "nsIScriptObjectPrincipal.h"
#include "nsISupports.h"
#include "nsIThread.h"
#include "nsITimer.h"
@@ -149,7 +148,6 @@
#include "nsIWidget.h"
#include "nsLiteralString.h"
#include "nsNetUtil.h"
#include "nsPIDOMWindow.h"
#include "nsPrintfCString.h"
#include "nsStandardURL.h"
#include "nsServiceManagerUtils.h"
@@ -6515,297 +6513,6 @@ void QuotaManager::GetStorageId(PersistenceType aPersistenceType,
aDatabaseId = str;
}
// static
bool QuotaManager::IsPrincipalInfoValid(const PrincipalInfo& aPrincipalInfo) {
switch (aPrincipalInfo.type()) {
// A system principal is acceptable.
case PrincipalInfo::TSystemPrincipalInfo: {
return true;
}
// Validate content principals to ensure that the spec, originNoSuffix and
// baseDomain are sane.
case PrincipalInfo::TContentPrincipalInfo: {
const ContentPrincipalInfo& info =
aPrincipalInfo.get_ContentPrincipalInfo();
// Verify the principal spec parses.
nsCOMPtr<nsIURI> uri;
QM_TRY(MOZ_TO_RESULT(NS_NewURI(getter_AddRefs(uri), info.spec())), false);
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(uri, info.attrs());
QM_TRY(MOZ_TO_RESULT(principal), false);
// Verify the principal originNoSuffix matches spec.
QM_TRY_INSPECT(const auto& originNoSuffix,
MOZ_TO_RESULT_INVOKE_MEMBER_TYPED(nsAutoCString, principal,
GetOriginNoSuffix),
false);
if (NS_WARN_IF(originNoSuffix != info.originNoSuffix())) {
QM_WARNING("originNoSuffix (%s) doesn't match passed one (%s)!",
originNoSuffix.get(), info.originNoSuffix().get());
return false;
}
if (NS_WARN_IF(info.originNoSuffix().EqualsLiteral(kChromeOrigin))) {
return false;
}
if (NS_WARN_IF(info.originNoSuffix().FindChar('^', 0) != -1)) {
QM_WARNING("originNoSuffix (%s) contains the '^' character!",
info.originNoSuffix().get());
return false;
}
// Verify the principal baseDomain exists.
if (NS_WARN_IF(info.baseDomain().IsVoid())) {
return false;
}
// Verify the principal baseDomain matches spec.
QM_TRY_INSPECT(const auto& baseDomain,
MOZ_TO_RESULT_INVOKE_MEMBER_TYPED(nsAutoCString, principal,
GetBaseDomain),
false);
if (NS_WARN_IF(baseDomain != info.baseDomain())) {
QM_WARNING("baseDomain (%s) doesn't match passed one (%s)!",
baseDomain.get(), info.baseDomain().get());
return false;
}
return true;
}
default: {
break;
}
}
// Null and expanded principals are not acceptable.
return false;
}
// static
Result<PrincipalMetadata, nsresult>
QuotaManager::GetInfoFromValidatedPrincipalInfo(
QuotaManager& aQuotaManager, const PrincipalInfo& aPrincipalInfo) {
MOZ_ASSERT(IsPrincipalInfoValid(aPrincipalInfo));
switch (aPrincipalInfo.type()) {
case PrincipalInfo::TSystemPrincipalInfo: {
return GetInfoForChrome();
}
case PrincipalInfo::TContentPrincipalInfo: {
const ContentPrincipalInfo& info =
aPrincipalInfo.get_ContentPrincipalInfo();
nsCString suffix;
info.attrs().CreateSuffix(suffix);
nsCString origin = info.originNoSuffix() + suffix;
if (IsUUIDOrigin(origin)) {
QM_TRY_INSPECT(const auto& originalOrigin,
aQuotaManager.GetOriginFromStorageOrigin(origin));
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(originalOrigin);
QM_TRY(MOZ_TO_RESULT(principal));
PrincipalInfo principalInfo;
QM_TRY(
MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)));
return GetInfoFromValidatedPrincipalInfo(aQuotaManager, principalInfo);
}
PrincipalMetadata principalMetadata;
principalMetadata.mSuffix = suffix;
principalMetadata.mGroup = info.baseDomain() + suffix;
principalMetadata.mOrigin = origin;
if (info.attrs().IsPrivateBrowsing()) {
QM_TRY_UNWRAP(principalMetadata.mStorageOrigin,
aQuotaManager.EnsureStorageOriginFromOrigin(origin));
} else {
principalMetadata.mStorageOrigin = origin;
}
principalMetadata.mIsPrivate = info.attrs().IsPrivateBrowsing();
return principalMetadata;
}
default: {
MOZ_ASSERT_UNREACHABLE("Should never get here!");
return Err(NS_ERROR_UNEXPECTED);
}
}
}
// static
Result<PrincipalInfo, nsresult> QuotaManager::PrincipalMetadataToPrincipalInfo(
const PrincipalMetadata& aPrincipalMetadata) {
QM_TRY_INSPECT(
const auto& principal,
([&aPrincipalMetadata]() -> Result<nsCOMPtr<nsIPrincipal>, nsresult> {
if (aPrincipalMetadata.mOrigin.EqualsLiteral(kChromeOrigin)) {
return nsCOMPtr<nsIPrincipal>(SystemPrincipal::Get());
}
return nsCOMPtr<nsIPrincipal>(
BasePrincipal::CreateContentPrincipal(aPrincipalMetadata.mOrigin));
}()));
QM_TRY(MOZ_TO_RESULT(principal));
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)));
return std::move(principalInfo);
}
// static
nsAutoCString QuotaManager::GetOriginFromValidatedPrincipalInfo(
const PrincipalInfo& aPrincipalInfo) {
MOZ_ASSERT(IsPrincipalInfoValid(aPrincipalInfo));
switch (aPrincipalInfo.type()) {
case PrincipalInfo::TSystemPrincipalInfo: {
return nsAutoCString{GetOriginForChrome()};
}
case PrincipalInfo::TContentPrincipalInfo: {
const ContentPrincipalInfo& info =
aPrincipalInfo.get_ContentPrincipalInfo();
nsAutoCString suffix;
info.attrs().CreateSuffix(suffix);
return info.originNoSuffix() + suffix;
}
default: {
MOZ_CRASH("Should never get here!");
}
}
}
// static
Result<PrincipalMetadata, nsresult> QuotaManager::GetInfoFromPrincipal(
nsIPrincipal* aPrincipal) {
MOZ_ASSERT(aPrincipal);
if (aPrincipal->IsSystemPrincipal()) {
return GetInfoForChrome();
}
if (aPrincipal->GetIsNullPrincipal()) {
NS_WARNING("IndexedDB not supported from this principal!");
return Err(NS_ERROR_FAILURE);
}
PrincipalMetadata principalMetadata;
QM_TRY(MOZ_TO_RESULT(aPrincipal->GetOrigin(principalMetadata.mOrigin)));
if (principalMetadata.mOrigin.EqualsLiteral(kChromeOrigin)) {
NS_WARNING("Non-chrome principal can't use chrome origin!");
return Err(NS_ERROR_FAILURE);
}
aPrincipal->OriginAttributesRef().CreateSuffix(principalMetadata.mSuffix);
nsAutoCString baseDomain;
QM_TRY(MOZ_TO_RESULT(aPrincipal->GetBaseDomain(baseDomain)));
MOZ_ASSERT(!baseDomain.IsEmpty());
principalMetadata.mGroup = baseDomain + principalMetadata.mSuffix;
principalMetadata.mStorageOrigin = principalMetadata.mOrigin;
principalMetadata.mIsPrivate = aPrincipal->GetIsInPrivateBrowsing();
return principalMetadata;
}
Result<PrincipalMetadata, nsresult> QuotaManager::GetInfoFromWindow(
nsPIDOMWindowOuter* aWindow) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aWindow);
nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(aWindow);
QM_TRY(OkIf(sop), Err(NS_ERROR_FAILURE));
nsCOMPtr<nsIPrincipal> principal = sop->GetPrincipal();
QM_TRY(OkIf(principal), Err(NS_ERROR_FAILURE));
return GetInfoFromPrincipal(principal);
}
// static
Result<nsAutoCString, nsresult> QuotaManager::GetOriginFromPrincipal(
nsIPrincipal* aPrincipal) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aPrincipal);
if (aPrincipal->IsSystemPrincipal()) {
return nsAutoCString{GetOriginForChrome()};
}
if (aPrincipal->GetIsNullPrincipal()) {
NS_WARNING("IndexedDB not supported from this principal!");
return Err(NS_ERROR_FAILURE);
}
QM_TRY_UNWRAP(const auto origin, MOZ_TO_RESULT_INVOKE_MEMBER_TYPED(
nsAutoCString, aPrincipal, GetOrigin));
if (origin.EqualsLiteral(kChromeOrigin)) {
NS_WARNING("Non-chrome principal can't use chrome origin!");
return Err(NS_ERROR_FAILURE);
}
return origin;
}
// static
Result<nsAutoCString, nsresult> QuotaManager::GetOriginFromWindow(
nsPIDOMWindowOuter* aWindow) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aWindow);
nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(aWindow);
QM_TRY(OkIf(sop), Err(NS_ERROR_FAILURE));
nsCOMPtr<nsIPrincipal> principal = sop->GetPrincipal();
QM_TRY(OkIf(principal), Err(NS_ERROR_FAILURE));
QM_TRY_RETURN(GetOriginFromPrincipal(principal));
}
// static
PrincipalMetadata QuotaManager::GetInfoForChrome() {
return {{},
GetOriginForChrome(),
GetOriginForChrome(),
GetOriginForChrome(),
false};
}
// static
nsLiteralCString QuotaManager::GetOriginForChrome() {
return nsLiteralCString{kChromeOrigin};
}
// static
bool QuotaManager::IsOriginInternal(const nsACString& aOrigin) {
MOZ_ASSERT(!aOrigin.IsEmpty());
@@ -7792,7 +7499,7 @@ nsresult StorageOperationBase::ProcessOriginDirectories() {
for (auto& originProps : mOriginProps) {
switch (originProps.mType) {
case OriginProps::eChrome: {
originProps.mOriginMetadata = {QuotaManager::GetInfoForChrome(),
originProps.mOriginMetadata = {GetInfoForChrome(),
*originProps.mPersistenceType};
break;
}
@@ -7811,8 +7518,7 @@ nsresult StorageOperationBase::ProcessOriginDirectories() {
MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)));
QM_WARNONLY_TRY_UNWRAP(
auto valid,
MOZ_TO_RESULT(quotaManager->IsPrincipalInfoValid(principalInfo)));
auto valid, MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)));
if (!valid) {
// Unknown directories during upgrade are allowed. Just warn if we
@@ -7822,9 +7528,9 @@ nsresult StorageOperationBase::ProcessOriginDirectories() {
break;
}
QM_TRY_UNWRAP(auto principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
*quotaManager, principalInfo));
QM_TRY_UNWRAP(
auto principalMetadata,
GetInfoFromValidatedPrincipalInfo(*quotaManager, principalInfo));
originProps.mOriginMetadata = {std::move(principalMetadata),
*originProps.mPersistenceType};

View File

@@ -29,6 +29,7 @@
#include "mozilla/dom/quota/DirectoryLock.h"
#include "mozilla/dom/quota/DirectoryLockInlines.h"
#include "mozilla/dom/quota/PersistenceType.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/PQuota.h"
#include "mozilla/dom/quota/PQuotaRequest.h"
#include "mozilla/dom/quota/PQuotaUsageRequest.h"
@@ -1661,9 +1662,8 @@ GetOriginUsageOp::GetOriginUsageOp(
nsresult GetOriginUsageOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -1831,9 +1831,8 @@ InitializedOriginRequestBase::InitializedOriginRequestBase(
nsresult InitializedOriginRequestBase::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -2037,9 +2036,8 @@ InitializeOriginRequestBase::InitializeOriginRequestBase(
nsresult InitializeOriginRequestBase::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -2149,9 +2147,9 @@ InitializeClientBase::InitializeClientBase(
nsresult InitializeClientBase::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(PrincipalMetadata principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(
PrincipalMetadata principalMetadata,
GetInfoFromValidatedPrincipalInfo(aQuotaManager, mPrincipalInfo));
principalMetadata.AssertInvariants();
@@ -2268,8 +2266,8 @@ nsresult GetFullOriginMetadataOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(PrincipalMetadata principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mParams.principalInfo()));
GetInfoFromValidatedPrincipalInfo(aQuotaManager,
mParams.principalInfo()));
principalMetadata.AssertInvariants();
@@ -2329,9 +2327,8 @@ GetCachedOriginUsageOp::GetCachedOriginUsageOp(
nsresult GetCachedOriginUsageOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -2748,9 +2745,8 @@ ClearOriginOp::ClearOriginOp(
nsresult ClearOriginOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -2815,9 +2811,8 @@ ClearClientOp::ClearClientOp(MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
nsresult ClearClientOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -2926,9 +2921,8 @@ ClearStoragesForOriginPrefixOp::ClearStoragesForOriginPrefixOp(
nsresult ClearStoragesForOriginPrefixOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -3031,9 +3025,8 @@ ShutdownOriginOp::ShutdownOriginOp(
nsresult ShutdownOriginOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -3120,9 +3113,8 @@ ShutdownClientOp::ShutdownClientOp(
nsresult ShutdownClientOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -3176,9 +3168,8 @@ nsresult PersistRequestBase::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
// Figure out which origin we're dealing with.
QM_TRY_UNWRAP(mPrincipalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
QM_TRY_UNWRAP(mPrincipalMetadata, GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mPrincipalInfo));
mPrincipalMetadata.AssertInvariants();
@@ -3403,8 +3394,8 @@ nsresult EstimateOp::DoInit(QuotaManager& aQuotaManager) {
AssertIsOnOwningThread();
QM_TRY_UNWRAP(PrincipalMetadata principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
aQuotaManager, mParams.principalInfo()));
GetInfoFromValidatedPrincipalInfo(aQuotaManager,
mParams.principalInfo()));
principalMetadata.AssertInvariants();

View File

@@ -0,0 +1,306 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/dom/quota/PrincipalUtils.h"
#include "mozilla/SystemPrincipal.h"
#include "mozilla/dom/quota/Constants.h"
#include "mozilla/dom/quota/CommonMetadata.h"
#include "mozilla/dom/quota/QuotaCommon.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/ResultExtensions.h"
#include "mozilla/ipc/PBackgroundSharedTypes.h"
#include "nsIScriptObjectPrincipal.h"
#include "nsNetUtil.h"
#include "nsPIDOMWindow.h"
#include "OriginParser.h"
namespace mozilla::dom::quota {
using namespace mozilla::ipc;
bool IsPrincipalInfoValid(const PrincipalInfo& aPrincipalInfo) {
switch (aPrincipalInfo.type()) {
// A system principal is acceptable.
case PrincipalInfo::TSystemPrincipalInfo: {
return true;
}
// Validate content principals to ensure that the spec, originNoSuffix and
// baseDomain are sane.
case PrincipalInfo::TContentPrincipalInfo: {
const ContentPrincipalInfo& info =
aPrincipalInfo.get_ContentPrincipalInfo();
// Verify the principal spec parses.
nsCOMPtr<nsIURI> uri;
QM_TRY(MOZ_TO_RESULT(NS_NewURI(getter_AddRefs(uri), info.spec())), false);
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(uri, info.attrs());
QM_TRY(MOZ_TO_RESULT(principal), false);
// Verify the principal originNoSuffix matches spec.
QM_TRY_INSPECT(const auto& originNoSuffix,
MOZ_TO_RESULT_INVOKE_MEMBER_TYPED(nsAutoCString, principal,
GetOriginNoSuffix),
false);
if (NS_WARN_IF(originNoSuffix != info.originNoSuffix())) {
QM_WARNING("originNoSuffix (%s) doesn't match passed one (%s)!",
originNoSuffix.get(), info.originNoSuffix().get());
return false;
}
if (NS_WARN_IF(info.originNoSuffix().EqualsLiteral(kChromeOrigin))) {
return false;
}
if (NS_WARN_IF(info.originNoSuffix().FindChar('^', 0) != -1)) {
QM_WARNING("originNoSuffix (%s) contains the '^' character!",
info.originNoSuffix().get());
return false;
}
// Verify the principal baseDomain exists.
if (NS_WARN_IF(info.baseDomain().IsVoid())) {
return false;
}
// Verify the principal baseDomain matches spec.
QM_TRY_INSPECT(const auto& baseDomain,
MOZ_TO_RESULT_INVOKE_MEMBER_TYPED(nsAutoCString, principal,
GetBaseDomain),
false);
if (NS_WARN_IF(baseDomain != info.baseDomain())) {
QM_WARNING("baseDomain (%s) doesn't match passed one (%s)!",
baseDomain.get(), info.baseDomain().get());
return false;
}
return true;
}
default: {
break;
}
}
// Null and expanded principals are not acceptable.
return false;
}
Result<PrincipalMetadata, nsresult> GetInfoFromValidatedPrincipalInfo(
QuotaManager& aQuotaManager, const PrincipalInfo& aPrincipalInfo) {
MOZ_ASSERT(IsPrincipalInfoValid(aPrincipalInfo));
switch (aPrincipalInfo.type()) {
case PrincipalInfo::TSystemPrincipalInfo: {
return GetInfoForChrome();
}
case PrincipalInfo::TContentPrincipalInfo: {
const ContentPrincipalInfo& info =
aPrincipalInfo.get_ContentPrincipalInfo();
nsCString suffix;
info.attrs().CreateSuffix(suffix);
nsCString origin = info.originNoSuffix() + suffix;
if (IsUUIDOrigin(origin)) {
QM_TRY_INSPECT(const auto& originalOrigin,
aQuotaManager.GetOriginFromStorageOrigin(origin));
nsCOMPtr<nsIPrincipal> principal =
BasePrincipal::CreateContentPrincipal(originalOrigin);
QM_TRY(MOZ_TO_RESULT(principal));
PrincipalInfo principalInfo;
QM_TRY(
MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)));
return GetInfoFromValidatedPrincipalInfo(aQuotaManager, principalInfo);
}
PrincipalMetadata principalMetadata;
principalMetadata.mSuffix = suffix;
principalMetadata.mGroup = info.baseDomain() + suffix;
principalMetadata.mOrigin = origin;
if (info.attrs().IsPrivateBrowsing()) {
QM_TRY_UNWRAP(principalMetadata.mStorageOrigin,
aQuotaManager.EnsureStorageOriginFromOrigin(origin));
} else {
principalMetadata.mStorageOrigin = origin;
}
principalMetadata.mIsPrivate = info.attrs().IsPrivateBrowsing();
return principalMetadata;
}
default: {
MOZ_ASSERT_UNREACHABLE("Should never get here!");
return Err(NS_ERROR_UNEXPECTED);
}
}
}
Result<PrincipalInfo, nsresult> PrincipalMetadataToPrincipalInfo(
const PrincipalMetadata& aPrincipalMetadata) {
QM_TRY_INSPECT(
const auto& principal,
([&aPrincipalMetadata]() -> Result<nsCOMPtr<nsIPrincipal>, nsresult> {
if (aPrincipalMetadata.mOrigin.EqualsLiteral(kChromeOrigin)) {
return nsCOMPtr<nsIPrincipal>(SystemPrincipal::Get());
}
return nsCOMPtr<nsIPrincipal>(
BasePrincipal::CreateContentPrincipal(aPrincipalMetadata.mOrigin));
}()));
QM_TRY(MOZ_TO_RESULT(principal));
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(principal, &principalInfo)));
return std::move(principalInfo);
}
nsAutoCString GetOriginFromValidatedPrincipalInfo(
const PrincipalInfo& aPrincipalInfo) {
MOZ_ASSERT(IsPrincipalInfoValid(aPrincipalInfo));
switch (aPrincipalInfo.type()) {
case PrincipalInfo::TSystemPrincipalInfo: {
return nsAutoCString{GetOriginForChrome()};
}
case PrincipalInfo::TContentPrincipalInfo: {
const ContentPrincipalInfo& info =
aPrincipalInfo.get_ContentPrincipalInfo();
nsAutoCString suffix;
info.attrs().CreateSuffix(suffix);
return info.originNoSuffix() + suffix;
}
default: {
MOZ_CRASH("Should never get here!");
}
}
}
Result<PrincipalMetadata, nsresult> GetInfoFromPrincipal(
nsIPrincipal* aPrincipal) {
MOZ_ASSERT(aPrincipal);
if (aPrincipal->IsSystemPrincipal()) {
return GetInfoForChrome();
}
if (aPrincipal->GetIsNullPrincipal()) {
NS_WARNING("IndexedDB not supported from this principal!");
return Err(NS_ERROR_FAILURE);
}
PrincipalMetadata principalMetadata;
QM_TRY(MOZ_TO_RESULT(aPrincipal->GetOrigin(principalMetadata.mOrigin)));
if (principalMetadata.mOrigin.EqualsLiteral(kChromeOrigin)) {
NS_WARNING("Non-chrome principal can't use chrome origin!");
return Err(NS_ERROR_FAILURE);
}
aPrincipal->OriginAttributesRef().CreateSuffix(principalMetadata.mSuffix);
nsAutoCString baseDomain;
QM_TRY(MOZ_TO_RESULT(aPrincipal->GetBaseDomain(baseDomain)));
MOZ_ASSERT(!baseDomain.IsEmpty());
principalMetadata.mGroup = baseDomain + principalMetadata.mSuffix;
principalMetadata.mStorageOrigin = principalMetadata.mOrigin;
principalMetadata.mIsPrivate = aPrincipal->GetIsInPrivateBrowsing();
return principalMetadata;
}
Result<PrincipalMetadata, nsresult> GetInfoFromWindow(
nsPIDOMWindowOuter* aWindow) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aWindow);
nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(aWindow);
QM_TRY(OkIf(sop), Err(NS_ERROR_FAILURE));
nsCOMPtr<nsIPrincipal> principal = sop->GetPrincipal();
QM_TRY(OkIf(principal), Err(NS_ERROR_FAILURE));
return GetInfoFromPrincipal(principal);
}
Result<nsAutoCString, nsresult> GetOriginFromPrincipal(
nsIPrincipal* aPrincipal) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aPrincipal);
if (aPrincipal->IsSystemPrincipal()) {
return nsAutoCString{GetOriginForChrome()};
}
if (aPrincipal->GetIsNullPrincipal()) {
NS_WARNING("IndexedDB not supported from this principal!");
return Err(NS_ERROR_FAILURE);
}
QM_TRY_UNWRAP(const auto origin, MOZ_TO_RESULT_INVOKE_MEMBER_TYPED(
nsAutoCString, aPrincipal, GetOrigin));
if (origin.EqualsLiteral(kChromeOrigin)) {
NS_WARNING("Non-chrome principal can't use chrome origin!");
return Err(NS_ERROR_FAILURE);
}
return origin;
}
Result<nsAutoCString, nsresult> GetOriginFromWindow(
nsPIDOMWindowOuter* aWindow) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aWindow);
nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(aWindow);
QM_TRY(OkIf(sop), Err(NS_ERROR_FAILURE));
nsCOMPtr<nsIPrincipal> principal = sop->GetPrincipal();
QM_TRY(OkIf(principal), Err(NS_ERROR_FAILURE));
QM_TRY_RETURN(GetOriginFromPrincipal(principal));
}
PrincipalMetadata GetInfoForChrome() {
return {{},
GetOriginForChrome(),
GetOriginForChrome(),
GetOriginForChrome(),
false};
}
nsLiteralCString GetOriginForChrome() {
return nsLiteralCString{kChromeOrigin};
}
} // namespace mozilla::dom::quota

View File

@@ -0,0 +1,66 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef DOM_QUOTA_PRINCIPALUTILS_H_
#define DOM_QUOTA_PRINCIPALUTILS_H_
#include <cstdint>
#include "nsStringFwd.h"
class nsIPrincipal;
class nsPIDOMWindowOuter;
enum class nsresult : uint32_t;
namespace mozilla {
template <typename V, typename E>
class Result;
}
namespace mozilla::ipc {
class PrincipalInfo;
}
namespace mozilla::dom::quota {
struct PrincipalMetadata;
class QuotaManager;
bool IsPrincipalInfoValid(const mozilla::ipc::PrincipalInfo& aPrincipalInfo);
Result<PrincipalMetadata, nsresult> GetInfoFromValidatedPrincipalInfo(
QuotaManager& aQuotaManager,
const mozilla::ipc::PrincipalInfo& aPrincipalInfo);
Result<mozilla::ipc::PrincipalInfo, nsresult> PrincipalMetadataToPrincipalInfo(
const PrincipalMetadata& aPrincipalMetadata);
nsAutoCString GetOriginFromValidatedPrincipalInfo(
const mozilla::ipc::PrincipalInfo& aPrincipalInfo);
Result<PrincipalMetadata, nsresult> GetInfoFromPrincipal(
nsIPrincipal* aPrincipal);
Result<PrincipalMetadata, nsresult> GetInfoFromWindow(
nsPIDOMWindowOuter* aWindow);
Result<nsAutoCString, nsresult> GetOriginFromPrincipal(
nsIPrincipal* aPrincipal);
Result<nsAutoCString, nsresult> GetOriginFromWindow(
nsPIDOMWindowOuter* aWindow);
nsLiteralCString GetOriginForChrome();
PrincipalMetadata GetInfoForChrome();
} // namespace mozilla::dom::quota
#endif // DOM_QUOTA_PRINCIPALUTILS_H_

View File

@@ -47,11 +47,9 @@
class mozIStorageConnection;
class nsIEventTarget;
class nsIFile;
class nsIPrincipal;
class nsIRunnable;
class nsIThread;
class nsITimer;
class nsPIDOMWindowOuter;
namespace mozilla {
@@ -95,6 +93,10 @@ class QuotaManager final : public BackgroundThreadObject {
friend class OriginInfo;
friend class ShutdownStorageOp;
friend Result<PrincipalMetadata, nsresult> GetInfoFromValidatedPrincipalInfo(
QuotaManager& aQuotaManager,
const mozilla::ipc::PrincipalInfo& aPrincipalInfo);
using PrincipalInfo = mozilla::ipc::PrincipalInfo;
using DirectoryLockTable =
nsClassHashtable<nsCStringHashKey, nsTArray<NotNull<DirectoryLockImpl*>>>;
@@ -614,33 +616,6 @@ class QuotaManager final : public BackgroundThreadObject {
const nsACString& aOrigin, Client::Type aClientType,
nsACString& aDatabaseId);
static bool IsPrincipalInfoValid(const PrincipalInfo& aPrincipalInfo);
static Result<PrincipalMetadata, nsresult> GetInfoFromValidatedPrincipalInfo(
QuotaManager& aQuotaManager, const PrincipalInfo& aPrincipalInfo);
static Result<PrincipalInfo, nsresult> PrincipalMetadataToPrincipalInfo(
const PrincipalMetadata& aPrincipalMetadata);
static nsAutoCString GetOriginFromValidatedPrincipalInfo(
const PrincipalInfo& aPrincipalInfo);
static Result<PrincipalMetadata, nsresult> GetInfoFromPrincipal(
nsIPrincipal* aPrincipal);
static Result<PrincipalMetadata, nsresult> GetInfoFromWindow(
nsPIDOMWindowOuter* aWindow);
static Result<nsAutoCString, nsresult> GetOriginFromPrincipal(
nsIPrincipal* aPrincipal);
static Result<nsAutoCString, nsresult> GetOriginFromWindow(
nsPIDOMWindowOuter* aWindow);
static nsLiteralCString GetOriginForChrome();
static PrincipalMetadata GetInfoForChrome();
static bool IsOriginInternal(const nsACString& aOrigin);
static bool AreOriginsEqualOnDisk(const nsACString& aOrigin1,

View File

@@ -31,6 +31,7 @@
#include "mozilla/StaticPtr.h"
#include "mozilla/Unused.h"
#include "mozilla/Variant.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/PQuota.h"
#include "mozilla/dom/quota/PersistenceType.h"
#include "mozilla/dom/quota/QuotaUsageRequestChild.h"
@@ -83,7 +84,7 @@ nsresult CheckedPrincipalToPrincipalInfo(nsIPrincipal* aPrincipal,
return rv;
}
if (NS_WARN_IF(!QuotaManager::IsPrincipalInfoValid(aPrincipalInfo))) {
if (NS_WARN_IF(!IsPrincipalInfoValid(aPrincipalInfo))) {
return NS_ERROR_FAILURE;
}
@@ -577,18 +578,17 @@ QuotaManagerService::PersistentOriginInitialized(nsIPrincipal* aPrincipal,
QM_TRY(MOZ_TO_RESULT(EnsureBackgroundActor()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
RefPtr<Request> request = new Request();
@@ -628,18 +628,17 @@ QuotaManagerService::TemporaryOriginInitialized(
return persistenceType.ref();
}()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
RefPtr<Request> request = new Request();
@@ -727,18 +726,17 @@ QuotaManagerService::InitializePersistentOrigin(nsIPrincipal* aPrincipal,
QM_TRY(MOZ_TO_RESULT(EnsureBackgroundActor()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
auto request = MakeRefPtr<Request>();
@@ -778,18 +776,17 @@ QuotaManagerService::InitializeTemporaryOrigin(
return persistenceType.ref();
}()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
auto request = MakeRefPtr<Request>();
@@ -816,18 +813,17 @@ QuotaManagerService::InitializePersistentClient(nsIPrincipal* aPrincipal,
QM_TRY(MOZ_TO_RESULT(EnsureBackgroundActor()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
QM_TRY_INSPECT(const auto& clientType,
([&aClientType]() -> Result<Client::Type, nsresult> {
@@ -877,18 +873,17 @@ QuotaManagerService::InitializeTemporaryClient(
return persistenceType.ref();
}()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
QM_TRY_INSPECT(const auto& clientType,
([&aClientType]() -> Result<Client::Type, nsresult> {
@@ -929,8 +924,7 @@ QuotaManagerService::GetFullOriginMetadata(const nsACString& aPersistenceType,
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(OkIf(QuotaManager::IsPrincipalInfoValid(principalInfo)),
NS_ERROR_INVALID_ARG);
QM_TRY(OkIf(IsPrincipalInfoValid(principalInfo)), NS_ERROR_INVALID_ARG);
RefPtr<Request> request = new Request();
@@ -985,18 +979,17 @@ QuotaManagerService::GetUsageForPrincipal(nsIPrincipal* aPrincipal,
QM_TRY(MOZ_TO_RESULT(EnsureBackgroundActor()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
RefPtr<UsageRequest> request = new UsageRequest(aPrincipal, aCallback);
@@ -1026,18 +1019,17 @@ QuotaManagerService::GetCachedUsageForPrincipal(nsIPrincipal* aPrincipal,
QM_TRY(MOZ_TO_RESULT(EnsureBackgroundActor()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
RefPtr<Request> request = new Request();
@@ -1130,18 +1122,17 @@ QuotaManagerService::ClearStoragesForPrincipal(
return persistenceType;
}()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
RefPtr<Request> request = new Request();
@@ -1178,18 +1169,17 @@ QuotaManagerService::ClearStoragesForClient(nsIPrincipal* aPrincipal,
return persistenceType;
}()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
QM_TRY_INSPECT(const auto& clientType,
([&aClientType]() -> Result<Client::Type, nsresult> {
@@ -1243,7 +1233,7 @@ QuotaManagerService::ClearStoragesForOriginPrefix(
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
if (principalInfo.type() == PrincipalInfo::TContentPrincipalInfo) {
@@ -1311,18 +1301,17 @@ QuotaManagerService::ResetStoragesForPrincipal(
return persistenceType;
}()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
RefPtr<Request> request = new Request();
@@ -1360,18 +1349,17 @@ QuotaManagerService::ResetStoragesForClient(nsIPrincipal* aPrincipal,
return persistenceType;
}()));
QM_TRY_INSPECT(
const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY_INSPECT(const auto& principalInfo,
([&aPrincipal]() -> Result<PrincipalInfo, nsresult> {
PrincipalInfo principalInfo;
QM_TRY(MOZ_TO_RESULT(
PrincipalToPrincipalInfo(aPrincipal, &principalInfo)));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(principalInfo)),
Err(NS_ERROR_INVALID_ARG));
return principalInfo;
}()));
return principalInfo;
}()));
QM_TRY_INSPECT(const auto& clientType,
([&aClientType]() -> Result<Client::Type, nsresult> {

View File

@@ -9,6 +9,7 @@
#include <mozilla/Assertions.h>
#include "mozilla/RefPtr.h"
#include "mozilla/dom/quota/ErrorHandling.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/PQuota.h"
#include "mozilla/dom/quota/PQuotaRequestParent.h"
@@ -171,8 +172,7 @@ bool Quota::VerifyRequestParams(const RequestParams& aParams) const {
return false;
}
if (NS_WARN_IF(
!QuotaManager::IsPrincipalInfoValid(params.principalInfo()))) {
if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
MOZ_CRASH_UNLESS_FUZZING();
return false;
}
@@ -186,8 +186,7 @@ bool Quota::VerifyRequestParams(const RequestParams& aParams) const {
case RequestParams::TPersistedParams: {
const PersistedParams& params = aParams.get_PersistedParams();
if (NS_WARN_IF(
!QuotaManager::IsPrincipalInfoValid(params.principalInfo()))) {
if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
MOZ_CRASH_UNLESS_FUZZING();
return false;
}
@@ -198,8 +197,7 @@ bool Quota::VerifyRequestParams(const RequestParams& aParams) const {
case RequestParams::TPersistParams: {
const PersistParams& params = aParams.get_PersistParams();
if (NS_WARN_IF(
!QuotaManager::IsPrincipalInfoValid(params.principalInfo()))) {
if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
MOZ_CRASH_UNLESS_FUZZING();
return false;
}
@@ -210,8 +208,7 @@ bool Quota::VerifyRequestParams(const RequestParams& aParams) const {
case RequestParams::TEstimateParams: {
const EstimateParams& params = aParams.get_EstimateParams();
if (NS_WARN_IF(
!QuotaManager::IsPrincipalInfoValid(params.principalInfo()))) {
if (NS_WARN_IF(!IsPrincipalInfoValid(params.principalInfo()))) {
MOZ_CRASH_UNLESS_FUZZING();
return false;
}
@@ -371,7 +368,7 @@ mozilla::ipc::IPCResult Quota::RecvPersistentOriginInitialized(
ResolveBoolResponseAndReturn(aResolve));
if (!TrustParams()) {
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -399,7 +396,7 @@ mozilla::ipc::IPCResult Quota::RecvTemporaryOriginInitialized(
QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(aPersistenceType)),
QM_CUF_AND_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -459,7 +456,7 @@ mozilla::ipc::IPCResult Quota::RecvInitializePersistentOrigin(
ResolveBoolResponseAndReturn(aResolve));
if (!TrustParams()) {
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -487,7 +484,7 @@ mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryOrigin(
QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(aPersistenceType)),
QM_CUF_AND_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -513,7 +510,7 @@ mozilla::ipc::IPCResult Quota::RecvInitializePersistentClient(
ResolveBoolResponseAndReturn(aResolve));
if (!TrustParams()) {
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),
@@ -544,7 +541,7 @@ mozilla::ipc::IPCResult Quota::RecvInitializeTemporaryClient(
QM_TRY(MOZ_TO_RESULT(IsValidPersistenceType(aPersistenceType)),
QM_CUF_AND_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),
@@ -629,7 +626,7 @@ mozilla::ipc::IPCResult Quota::RecvGetOriginUsage(
ResolveUsageInfoResponseAndReturn(aResolve));
if (!TrustParams()) {
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -669,7 +666,7 @@ mozilla::ipc::IPCResult Quota::RecvGetCachedOriginUsage(
ResolveUInt64ResponseAndReturn(aResolver));
if (!TrustParams()) {
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -699,7 +696,7 @@ mozilla::ipc::IPCResult Quota::RecvClearStoragesForOrigin(
QM_CUF_AND_IPC_FAIL(this));
}
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -729,7 +726,7 @@ mozilla::ipc::IPCResult Quota::RecvClearStoragesForClient(
QM_CUF_AND_IPC_FAIL(this));
}
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),
@@ -763,7 +760,7 @@ mozilla::ipc::IPCResult Quota::RecvClearStoragesForOriginPrefix(
QM_CUF_AND_IPC_FAIL(this));
}
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -858,7 +855,7 @@ mozilla::ipc::IPCResult Quota::RecvShutdownStoragesForOrigin(
QM_CUF_AND_IPC_FAIL(this));
}
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
}
@@ -888,7 +885,7 @@ mozilla::ipc::IPCResult Quota::RecvShutdownStoragesForClient(
QM_CUF_AND_IPC_FAIL(this));
}
QM_TRY(MOZ_TO_RESULT(QuotaManager::IsPrincipalInfoValid(aPrincipalInfo)),
QM_TRY(MOZ_TO_RESULT(IsPrincipalInfoValid(aPrincipalInfo)),
QM_CUF_AND_IPC_FAIL(this));
QM_TRY(MOZ_TO_RESULT(Client::IsValidType(aClientType)),

View File

@@ -70,6 +70,7 @@ EXPORTS.mozilla.dom.quota += [
"OriginScope.h",
"PersistenceScope.h",
"PersistenceType.h",
"PrincipalUtils.h",
"PromiseUtils.h",
"QuotaCommon.h",
"QuotaManager.h",
@@ -125,6 +126,7 @@ UNIFIED_SOURCES += [
"OriginParser.cpp",
"PersistenceScope.cpp",
"PersistenceType.cpp",
"PrincipalUtils.cpp",
"PromiseUtils.cpp",
"QMResult.cpp",
"QuotaCommon.cpp",

View File

@@ -39,6 +39,7 @@
#include "mozilla/dom/quota/DirectoryLock.h"
#include "mozilla/dom/quota/DirectoryLockInlines.h"
#include "mozilla/dom/quota/FileStreams.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/dom/quota/QuotaCommon.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/ResultExtensions.h"
@@ -547,7 +548,7 @@ AllocPBackgroundSDBConnectionParent(const PersistenceType& aPersistenceType,
return nullptr;
}
if (NS_WARN_IF(!QuotaManager::IsPrincipalInfoValid(aPrincipalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(aPrincipalInfo))) {
MOZ_CRASH_UNLESS_FUZZING();
return nullptr;
}
@@ -1102,13 +1103,13 @@ nsresult OpenOp::FinishOpen() {
PersistenceType persistenceType = GetConnection()->GetPersistenceType();
if (principalInfo.type() == PrincipalInfo::TSystemPrincipalInfo) {
mOriginMetadata = {QuotaManager::GetInfoForChrome(), persistenceType};
mOriginMetadata = {quota::GetInfoForChrome(), persistenceType};
} else {
MOZ_ASSERT(principalInfo.type() == PrincipalInfo::TContentPrincipalInfo);
QM_TRY_UNWRAP(auto principalMetadata,
QuotaManager::GetInfoFromValidatedPrincipalInfo(
*quotaManager, principalInfo));
QM_TRY_UNWRAP(
auto principalMetadata,
quota::GetInfoFromValidatedPrincipalInfo(*quotaManager, principalInfo));
mOriginMetadata = {std::move(principalMetadata), persistenceType};
}

View File

@@ -26,7 +26,7 @@
#include "mozilla/Variant.h"
#include "mozilla/dom/PBackgroundSDBConnection.h"
#include "mozilla/dom/TypedArray.h"
#include "mozilla/dom/quota/QuotaManager.h"
#include "mozilla/dom/quota/PrincipalUtils.h"
#include "mozilla/fallible.h"
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/ipc/BackgroundUtils.h"
@@ -250,7 +250,7 @@ SDBConnection::Init(nsIPrincipal* aPrincipal,
return NS_ERROR_INVALID_ARG;
}
if (NS_WARN_IF(!quota::QuotaManager::IsPrincipalInfoValid(*principalInfo))) {
if (NS_WARN_IF(!quota::IsPrincipalInfoValid(*principalInfo))) {
return NS_ERROR_INVALID_ARG;
}