From 5ee2871524c367826a74a99e070fbda501837030 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 3 Jul 2024 17:02:32 +0200 Subject: [PATCH] Issue #2542 - Part 3: Expand BasePrincipal with an IsSameOrigin check Manual checking of the origins in SecFetch fails, so we add this capability to the base principal interface for sake of ease. We could use ScriptSecurityManager directly but it's more convenient this way and can be re-used elsewhere in the future. --- caps/BasePrincipal.cpp | 17 +++++++++++++++++ caps/BasePrincipal.h | 1 + caps/nsIPrincipal.idl | 6 ++++++ 3 files changed, 24 insertions(+) diff --git a/caps/BasePrincipal.cpp b/caps/BasePrincipal.cpp index cdd4665fc8..ade5b4e2e0 100644 --- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -560,6 +560,23 @@ BasePrincipal::GetCspJSON(nsAString& outCSPinJSON) return mCSP->ToJSON(outCSPinJSON); } +NS_IMETHODIMP +BasePrincipal::IsSameOrigin(nsIURI* aURI, bool aIsPrivateWin, bool* aRes) { + *aRes = false; + nsCOMPtr prinURI; + nsresult rv = GetURI(getter_AddRefs(prinURI)); + if (NS_FAILED(rv) || !prinURI) { + return NS_OK; + } + nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager(); + if (!ssm) { + return NS_ERROR_UNEXPECTED; + ; + } + *aRes = NS_SUCCEEDED(ssm->CheckSameOriginURI(prinURI, aURI, aIsPrivateWin)); + return NS_OK; +} + NS_IMETHODIMP BasePrincipal::GetIsNullPrincipal(bool* aResult) { diff --git a/caps/BasePrincipal.h b/caps/BasePrincipal.h index b1f151521f..dd60d33746 100644 --- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -282,6 +282,7 @@ public: NS_IMETHOD GetUnknownAppId(bool* aUnknownAppId) final; NS_IMETHOD GetUserContextId(uint32_t* aUserContextId) final; NS_IMETHOD GetPrivateBrowsingId(uint32_t* aPrivateBrowsingId) final; + NS_IMETHOD IsSameOrigin(nsIURI* aURI, bool aIsPrivateWin, bool* aRes) override; bool EqualsIgnoringAddonId(nsIPrincipal *aOther); diff --git a/caps/nsIPrincipal.idl b/caps/nsIPrincipal.idl index 1d58dcb7fa..03f293f7b2 100644 --- a/caps/nsIPrincipal.idl +++ b/caps/nsIPrincipal.idl @@ -223,6 +223,12 @@ interface nsIPrincipal : nsISerializable */ readonly attribute AUTF8String originSuffix; + /** + * Uses NS_Security Compare to determine if the + * other URI is same-origin as the uri of the Principal + */ + bool IsSameOrigin(in nsIURI otherURI, in bool aIsPrivateWin); + /** * The base domain of the codebase URI to which this principal pertains * (generally the document URI), handling null principals and