Bug 1804093 - Part 2: Remove some values cached from nsIPrincipal from WorkerLoadInfo, r=asuth

Differential Revision: https://phabricator.services.mozilla.com/D163853
This commit is contained in:
Nika Layzell
2022-12-12 22:08:35 +00:00
parent bcb2cfb729
commit ea2c6edfce
6 changed files with 42 additions and 75 deletions

View File

@@ -157,9 +157,7 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
RefPtr<BroadcastChannel> bc =
new BroadcastChannel(global, aChannel, portUUID);
nsAutoCString origin;
nsAutoString originNoSuffix;
PrincipalInfo storagePrincipalInfo;
nsCOMPtr<nsIPrincipal> storagePrincipal;
StorageAccess storageAccess;
@@ -184,29 +182,11 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
return nullptr;
}
nsIPrincipal* storagePrincipal = sop->GetEffectiveStoragePrincipal();
storagePrincipal = sop->GetEffectiveStoragePrincipal();
if (!storagePrincipal) {
aRv.Throw(NS_ERROR_UNEXPECTED);
return nullptr;
}
aRv = storagePrincipal->GetOrigin(origin);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
nsAutoCString originNoSuffix8;
aRv = storagePrincipal->GetAsciiOrigin(originNoSuffix8);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
CopyUTF8toUTF16(originNoSuffix8, originNoSuffix);
aRv = PrincipalToPrincipalInfo(storagePrincipal, &storagePrincipalInfo);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
storageAccess = StorageAllowedForWindow(window);
Document* doc = window->GetExtantDoc();
@@ -229,10 +209,8 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
}
storageAccess = workerPrivate->StorageAccess();
storagePrincipalInfo = workerPrivate->GetEffectiveStoragePrincipalInfo();
origin = workerPrivate->EffectiveStoragePrincipalOrigin();
originNoSuffix = workerPrivate->GetLocationInfo().mOrigin;
storagePrincipal = workerPrivate->GetEffectiveStoragePrincipal();
bc->mWorkerRef = workerRef;
@@ -240,7 +218,7 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
}
// We want to allow opaque origins.
if (storagePrincipalInfo.type() != PrincipalInfo::TNullPrincipalInfo &&
if (!storagePrincipal->GetIsNullPrincipal() &&
(storageAccess == StorageAccess::eDeny ||
(ShouldPartitionStorage(storageAccess) &&
!StoragePartitioningEnabled(storageAccess, cjs)))) {
@@ -256,6 +234,24 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
return nullptr;
}
nsAutoCString origin;
aRv = storagePrincipal->GetOrigin(origin);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
nsString originForEvents;
aRv = nsContentUtils::GetUTFOrigin(storagePrincipal, originForEvents);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
PrincipalInfo storagePrincipalInfo;
aRv = PrincipalToPrincipalInfo(storagePrincipal, &storagePrincipalInfo);
if (NS_WARN_IF(aRv.Failed())) {
return nullptr;
}
PBroadcastChannelChild* actor = actorChild->SendPBroadcastChannelConstructor(
storagePrincipalInfo, origin, nsString(aChannel));
@@ -263,7 +259,7 @@ already_AddRefed<BroadcastChannel> BroadcastChannel::Constructor(
MOZ_ASSERT(bc->mActor);
bc->mActor->SetParent(bc);
bc->mOriginForEvents = originNoSuffix;
bc->mOriginForEvents = std::move(originForEvents);
return bc.forget();
}

View File

@@ -88,15 +88,12 @@ WorkerLoadInfoData::WorkerLoadInfoData()
: mLoadFlags(nsIRequest::LOAD_NORMAL),
mWindowID(UINT64_MAX),
mReferrerInfo(new ReferrerInfo(nullptr)),
mPrincipalHashValue(0),
mFromWindow(false),
mEvalAllowed(false),
mReportEvalCSPViolations(false),
mWasmEvalAllowed(false),
mReportWasmEvalCSPViolations(false),
mXHRParamsAllowed(false),
mPrincipalIsSystem(false),
mPrincipalIsAddonOrExpandedAddon(false),
mWatchedByDevTools(false),
mStorageAccess(StorageAccess::eDeny),
mUseRegularPrincipal(false),
@@ -114,9 +111,6 @@ nsresult WorkerLoadInfo::SetPrincipalsAndCSPOnMainThread(
mPrincipal = aPrincipal;
mPartitionedPrincipal = aPartitionedPrincipal;
mPrincipalIsSystem = aPrincipal->IsSystemPrincipal();
mPrincipalIsAddonOrExpandedAddon =
aPrincipal->GetIsAddonOrExpandedAddonPrincipal();
mCSP = aCsp;
@@ -145,26 +139,14 @@ nsresult WorkerLoadInfo::SetPrincipalsAndCSPOnMainThread(
nsresult rv = PrincipalToPrincipalInfo(aPrincipal, mPrincipalInfo.get());
NS_ENSURE_SUCCESS(rv, rv);
rv = nsContentUtils::GetUTFOrigin(aPrincipal, mOriginNoSuffix);
NS_ENSURE_SUCCESS(rv, rv);
rv = aPrincipal->GetOrigin(mOrigin);
NS_ENSURE_SUCCESS(rv, rv);
if (aPrincipal->Equals(aPartitionedPrincipal)) {
*mPartitionedPrincipalInfo = *mPrincipalInfo;
mPartitionedOrigin = mOrigin;
} else {
mPartitionedPrincipalInfo = MakeUnique<PrincipalInfo>();
rv = PrincipalToPrincipalInfo(aPartitionedPrincipal,
mPartitionedPrincipalInfo.get());
NS_ENSURE_SUCCESS(rv, rv);
rv = aPartitionedPrincipal->GetOrigin(mPartitionedOrigin);
NS_ENSURE_SUCCESS(rv, rv);
}
mPrincipalHashValue = aPrincipal->GetHashValue();
return NS_OK;
}

View File

@@ -109,11 +109,6 @@ struct WorkerLoadInfoData {
UniquePtr<mozilla::ipc::PrincipalInfo> mPrincipalInfo;
UniquePtr<mozilla::ipc::PrincipalInfo> mPartitionedPrincipalInfo;
nsCString mDomain;
nsString mOriginNoSuffix; // Derived from mPrincipal; can be used on worker
// thread.
nsCString mOrigin; // Derived from mPrincipal; can be used on worker thread.
nsCString mPartitionedOrigin; // Derived from mPartitionedPrincipal; can be
// used on worker thread.
nsString mServiceWorkerCacheName;
Maybe<ServiceWorkerDescriptor> mServiceWorkerDescriptor;
@@ -130,7 +125,6 @@ struct WorkerLoadInfoData {
uint64_t mWindowID;
nsCOMPtr<nsIReferrerInfo> mReferrerInfo;
uint32_t mPrincipalHashValue;
OriginTrials mTrials;
bool mFromWindow;
bool mEvalAllowed;
@@ -138,8 +132,6 @@ struct WorkerLoadInfoData {
bool mWasmEvalAllowed;
bool mReportWasmEvalCSPViolations;
bool mXHRParamsAllowed;
bool mPrincipalIsSystem;
bool mPrincipalIsAddonOrExpandedAddon;
bool mWatchedByDevTools;
StorageAccess mStorageAccess;
bool mUseRegularPrincipal;

View File

@@ -2259,7 +2259,7 @@ bool IsNewWorkerSecureContext(const WorkerPrivate* const aParent,
// Our secure context state depends on the kind of worker we have.
if (aLoadInfo.mPrincipalIsSystem) {
if (aLoadInfo.mPrincipal && aLoadInfo.mPrincipal->IsSystemPrincipal()) {
return true;
}
@@ -2774,8 +2774,6 @@ nsresult WorkerPrivate::GetLoadInfo(JSContext* aCx, nsPIDOMWindowInner* aWindow,
if (isChrome) {
rv = ssm->GetSystemPrincipal(getter_AddRefs(loadInfo.mLoadingPrincipal));
NS_ENSURE_SUCCESS(rv, rv);
loadInfo.mPrincipalIsSystem = true;
}
// See if we're being called from a window.
@@ -5711,6 +5709,16 @@ void WorkerPrivate::EnsureOwnerEmbedderPolicy() {
}
}
nsIPrincipal* WorkerPrivate::GetEffectiveStoragePrincipal() const {
AssertIsOnWorkerThread();
if (mLoadInfo.mUseRegularPrincipal) {
return mLoadInfo.mPrincipal;
}
return mLoadInfo.mPartitionedPrincipal;
}
const mozilla::ipc::PrincipalInfo&
WorkerPrivate::GetEffectiveStoragePrincipalInfo() const {
AssertIsOnWorkerThread();
@@ -5722,16 +5730,6 @@ WorkerPrivate::GetEffectiveStoragePrincipalInfo() const {
return *mLoadInfo.mPartitionedPrincipalInfo;
}
const nsACString& WorkerPrivate::EffectiveStoragePrincipalOrigin() const {
AssertIsOnWorkerThread();
if (mLoadInfo.mUseRegularPrincipal) {
return mLoadInfo.mOrigin;
}
return mLoadInfo.mPartitionedOrigin;
}
NS_IMPL_ADDREF(WorkerPrivate::EventTarget)
NS_IMPL_RELEASE(WorkerPrivate::EventTarget)

View File

@@ -13,6 +13,7 @@
#include "js/ContextOptions.h"
#include "mozilla/Attributes.h"
#include "mozilla/AutoRestore.h"
#include "mozilla/BasePrincipal.h"
#include "mozilla/CondVar.h"
#include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/Maybe.h"
@@ -747,20 +748,18 @@ class WorkerPrivate final
return mLoadInfo.mPartitionedPrincipal;
}
const nsAString& OriginNoSuffix() const { return mLoadInfo.mOriginNoSuffix; }
const nsACString& Origin() const { return mLoadInfo.mOrigin; }
const nsACString& EffectiveStoragePrincipalOrigin() const;
nsIPrincipal* GetEffectiveStoragePrincipal() const;
nsILoadGroup* GetLoadGroup() const {
AssertIsOnMainThread();
return mLoadInfo.mLoadGroup;
}
bool UsesSystemPrincipal() const { return mLoadInfo.mPrincipalIsSystem; }
bool UsesSystemPrincipal() const {
return GetPrincipal()->IsSystemPrincipal();
}
bool UsesAddonOrExpandedAddonPrincipal() const {
return mLoadInfo.mPrincipalIsAddonOrExpandedAddon;
return GetPrincipal()->GetIsAddonOrExpandedAddonPrincipal();
}
const mozilla::ipc::PrincipalInfo& GetPrincipalInfo() const {
@@ -772,7 +771,7 @@ class WorkerPrivate final
}
uint32_t GetPrincipalHashValue() const {
return mLoadInfo.mPrincipalHashValue;
return GetPrincipal()->GetHashValue();
}
const mozilla::ipc::PrincipalInfo& GetEffectiveStoragePrincipalInfo() const;

View File

@@ -664,7 +664,7 @@ int32_t WorkerGlobalScope::SetTimeoutOrInterval(JSContext* aCx,
void WorkerGlobalScope::GetOrigin(nsAString& aOrigin) const {
AssertIsOnWorkerThread();
aOrigin = mWorkerPrivate->OriginNoSuffix();
nsContentUtils::GetUTFOrigin(mWorkerPrivate->GetPrincipal(), aOrigin);
}
bool WorkerGlobalScope::CrossOriginIsolated() const {