Commit 7809758d authored by Sebastian Streich's avatar Sebastian Streich
Browse files

Bug 1597704 - Move is OriginPotentially Trustworthy into Principal r=ckerschb

Differential Revision: https://phabricator.services.mozilla.com/D53830

--HG--
extra : moz-landing-system : lando
parent 9958b430
......@@ -24,6 +24,7 @@
#include "mozilla/dom/BlobURLProtocolHandler.h"
#include "mozilla/dom/ChromeUtils.h"
#include "mozilla/dom/ToJSValue.h"
#include "mozilla/dom/nsMixedContentBlocker.h"
#include "json/json.h"
#include "nsSerializationHelper.h"
......@@ -500,6 +501,21 @@ BasePrincipal::IsURIInPrefList(const char* aPref, bool* aResult) {
return NS_OK;
}
NS_IMETHODIMP
BasePrincipal::GetIsOriginPotentiallyTrustworthy(bool* aResult) {
MOZ_ASSERT(NS_IsMainThread());
*aResult = false;
nsCOMPtr<nsIURI> uri;
nsresult rv = GetURI(getter_AddRefs(uri));
if (NS_FAILED(rv) || !uri) {
return NS_OK;
}
*aResult = nsMixedContentBlocker::IsPotentiallyTrustworthyOrigin(uri);
return NS_OK;
}
NS_IMETHODIMP
BasePrincipal::GetAboutModuleFlags(uint32_t* flags) {
*flags = 0;
......
......@@ -133,6 +133,7 @@ class BasePrincipal : public nsJSPrincipals {
NS_IMETHOD GetSiteOrigin(nsACString& aOrigin) override;
NS_IMETHOD IsThirdPartyURI(nsIURI* uri, bool* aRes) override;
NS_IMETHOD IsThirdPartyPrincipal(nsIPrincipal* uri, bool* aRes) override;
NS_IMETHOD GetIsOriginPotentiallyTrustworthy(bool* aResult) override;
nsresult ToJSON(nsACString& aJSON);
static already_AddRefed<BasePrincipal> FromJSON(const nsACString& aJSON);
......
......@@ -136,6 +136,11 @@ NullPrincipal::GetURI(nsIURI** aURI) {
uri.forget(aURI);
return NS_OK;
}
NS_IMETHODIMP
NullPrincipal::GetIsOriginPotentiallyTrustworthy(bool* aResult) {
*aResult = false;
return NS_OK;
}
NS_IMETHODIMP
NullPrincipal::GetDomain(nsIURI** aDomain) {
......
......@@ -51,6 +51,7 @@ class NullPrincipal final : public BasePrincipal {
NS_IMETHOD QueryInterface(REFNSIID aIID, void** aInstancePtr) override;
uint32_t GetHashValue() override;
NS_IMETHOD GetURI(nsIURI** aURI) override;
NS_IMETHOD GetIsOriginPotentiallyTrustworthy(bool* aResult) override;
NS_IMETHOD GetDomain(nsIURI** aDomain) override;
NS_IMETHOD SetDomain(nsIURI* aDomain) override;
NS_IMETHOD GetBaseDomain(nsACString& aBaseDomain) override;
......
......@@ -51,6 +51,12 @@ SystemPrincipal::GetURI(nsIURI** aURI) {
return NS_OK;
}
NS_IMETHODIMP
SystemPrincipal::GetIsOriginPotentiallyTrustworthy(bool* aResult) {
*aResult = true;
return NS_OK;
}
NS_IMETHODIMP
SystemPrincipal::GetDomain(nsIURI** aDomain) {
*aDomain = nullptr;
......
......@@ -44,6 +44,7 @@ class SystemPrincipal final : public BasePrincipal {
NS_IMETHOD SetDomain(nsIURI* aDomain) override;
NS_IMETHOD GetBaseDomain(nsACString& aBaseDomain) override;
NS_IMETHOD GetAddonId(nsAString& aAddonId) override;
NS_IMETHOD GetIsOriginPotentiallyTrustworthy(bool* aResult) override;
virtual nsresult GetScriptLocation(nsACString& aStr) override;
......
......@@ -237,6 +237,18 @@ interface nsIPrincipal : nsISerializable
*/
bool IsURIInPrefList(in string pref);
/**
* Implementation of
* https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy
*
* The value returned by this method feeds into the the Secure Context
* algorithm that determins the value of Window.isSecureContext and
* WorkerGlobalScope.isSecureContext.
*
* This method returns false instead of throwing upon errors.
*/
readonly attribute bool IsOriginPotentiallyTrustworthy;
/**
* Returns the Flags of the Principals
* associated AboutModule, in case there is one.
......
......@@ -8886,18 +8886,9 @@ bool nsContentUtils::HttpsStateIsModern(Document* aDocument) {
MOZ_ASSERT(principal->GetIsContentPrincipal());
nsCOMPtr<nsIContentSecurityManager> csm =
do_GetService(NS_CONTENTSECURITYMANAGER_CONTRACTID);
NS_WARNING_ASSERTION(csm, "csm is null");
if (csm) {
bool isTrustworthyOrigin = false;
csm->IsOriginPotentiallyTrustworthy(principal, &isTrustworthyOrigin);
if (isTrustworthyOrigin) {
return true;
}
}
return false;
bool isTrustworthyOrigin = false;
principal->GetIsOriginPotentiallyTrustworthy(&isTrustworthyOrigin);
return isTrustworthyOrigin;
}
/* static */
......@@ -8927,15 +8918,9 @@ bool nsContentUtils::ComputeIsSecureContext(nsIChannel* aChannel) {
return false;
}
nsCOMPtr<nsIContentSecurityManager> csm =
do_GetService(NS_CONTENTSECURITYMANAGER_CONTRACTID);
NS_WARNING_ASSERTION(csm, "csm is null");
if (csm) {
bool isTrustworthyOrigin = false;
csm->IsOriginPotentiallyTrustworthy(principal, &isTrustworthyOrigin);
return isTrustworthyOrigin;
}
return true;
bool isTrustworthyOrigin = false;
principal->GetIsOriginPotentiallyTrustworthy(&isTrustworthyOrigin);
return isTrustworthyOrigin;
}
/* static */
......
......@@ -1699,18 +1699,9 @@ bool nsGlobalWindowOuter::ComputeIsSecureContext(Document* aDocument,
}
}
nsCOMPtr<nsIContentSecurityManager> csm =
do_GetService(NS_CONTENTSECURITYMANAGER_CONTRACTID);
NS_WARNING_ASSERTION(csm, "csm is null");
if (csm) {
bool isTrustworthyOrigin = false;
csm->IsOriginPotentiallyTrustworthy(principal, &isTrustworthyOrigin);
if (isTrustworthyOrigin) {
return true;
}
}
return false;
bool isTrustworthyOrigin = false;
principal->GetIsOriginPotentiallyTrustworthy(&isTrustworthyOrigin);
return isTrustworthyOrigin;
}
// We need certain special behavior for remote XUL whitelisted domains, but we
......
......@@ -42,15 +42,4 @@ interface nsIContentSecurityManager : nsISupports
nsIStreamListener performSecurityCheck(in nsIChannel aChannel,
in nsIStreamListener aStreamListener);
/**
* Implementation of
* https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy
*
* The value returned by this method feeds into the the Secure Context
* algorithm that determins the value of Window.isSecureContext and
* WorkerGlobalScope.isSecureContext.
*
* This method returns false instead of throwing upon errors.
*/
boolean isOriginPotentiallyTrustworthy(in nsIPrincipal aPrincipal);
};
......@@ -509,14 +509,8 @@ bool PresentationRequest::IsPrioriAuthenticatedURL(const nsAString& aUrl) {
return false;
}
nsCOMPtr<nsIContentSecurityManager> csm =
do_GetService(NS_CONTENTSECURITYMANAGER_CONTRACTID);
if (NS_WARN_IF(!csm)) {
return false;
}
bool isTrustworthyOrigin = false;
csm->IsOriginPotentiallyTrustworthy(principal, &isTrustworthyOrigin);
principal->GetIsOriginPotentiallyTrustworthy(&isTrustworthyOrigin);
return isTrustworthyOrigin;
}
......
......@@ -1059,30 +1059,3 @@ nsContentSecurityManager::PerformSecurityCheck(
inAndOutListener.forget(outStreamListener);
return NS_OK;
}
NS_IMETHODIMP
nsContentSecurityManager::IsOriginPotentiallyTrustworthy(
nsIPrincipal* aPrincipal, bool* aIsTrustWorthy) {
MOZ_ASSERT(NS_IsMainThread());
NS_ENSURE_ARG_POINTER(aPrincipal);
NS_ENSURE_ARG_POINTER(aIsTrustWorthy);
if (aPrincipal->IsSystemPrincipal()) {
*aIsTrustWorthy = true;
return NS_OK;
}
*aIsTrustWorthy = false;
if (aPrincipal->GetIsNullPrincipal()) {
return NS_OK;
}
MOZ_ASSERT(aPrincipal->GetIsContentPrincipal(),
"Nobody is expected to call us with an nsIExpandedPrincipal");
nsCOMPtr<nsIURI> uri;
nsresult rv = aPrincipal->GetURI(getter_AddRefs(uri));
NS_ENSURE_SUCCESS(rv, rv);
*aIsTrustWorthy = nsMixedContentBlocker::IsPotentiallyTrustworthyOrigin(uri);
return NS_OK;
}
......@@ -70,8 +70,7 @@ TEST(SecureContext, IsOriginPotentiallyTrustworthyWithContentPrincipal)
rv = nsScriptSecurityManager::GetScriptSecurityManager()
->CreateContentPrincipalFromOrigin(uri, getter_AddRefs(prin));
bool isPotentiallyTrustworthy = false;
rv = csManager->IsOriginPotentiallyTrustworthy(prin,
&isPotentiallyTrustworthy);
rv = prin->GetIsOriginPotentiallyTrustworthy(&isPotentiallyTrustworthy);
ASSERT_EQ(NS_OK, rv);
ASSERT_EQ(isPotentiallyTrustworthy, uris[i].expectedResult);
}
......@@ -82,14 +81,10 @@ TEST(SecureContext, IsOriginPotentiallyTrustworthyWithSystemPrincipal)
RefPtr<nsScriptSecurityManager> ssManager =
nsScriptSecurityManager::GetScriptSecurityManager();
ASSERT_TRUE(!!ssManager);
nsCOMPtr<nsIContentSecurityManager> csManager =
do_GetService(NS_CONTENTSECURITYMANAGER_CONTRACTID);
ASSERT_TRUE(!!csManager);
nsCOMPtr<nsIPrincipal> sysPrin = nsContentUtils::GetSystemPrincipal();
bool isPotentiallyTrustworthy;
nsresult rv = csManager->IsOriginPotentiallyTrustworthy(
sysPrin, &isPotentiallyTrustworthy);
nsresult rv =
sysPrin->GetIsOriginPotentiallyTrustworthy(&isPotentiallyTrustworthy);
ASSERT_EQ(rv, NS_OK);
ASSERT_TRUE(isPotentiallyTrustworthy);
}
......@@ -99,15 +94,12 @@ TEST(SecureContext, IsOriginPotentiallyTrustworthyWithNullPrincipal)
RefPtr<nsScriptSecurityManager> ssManager =
nsScriptSecurityManager::GetScriptSecurityManager();
ASSERT_TRUE(!!ssManager);
nsCOMPtr<nsIContentSecurityManager> csManager =
do_GetService(NS_CONTENTSECURITYMANAGER_CONTRACTID);
ASSERT_TRUE(!!csManager);
RefPtr<NullPrincipal> nullPrin =
NullPrincipal::CreateWithoutOriginAttributes();
bool isPotentiallyTrustworthy;
nsresult rv = csManager->IsOriginPotentiallyTrustworthy(
nullPrin, &isPotentiallyTrustworthy);
nsresult rv =
nullPrin->GetIsOriginPotentiallyTrustworthy(&isPotentiallyTrustworthy);
ASSERT_EQ(rv, NS_OK);
ASSERT_TRUE(!isPotentiallyTrustworthy);
}
......@@ -49,18 +49,12 @@ add_task(async function test_isOriginPotentiallyTrustworthy() {
]) {
let uri = NetUtil.newURI(uriSpec);
let principal = gScriptSecurityManager.createContentPrincipal(uri, {});
Assert.equal(
gContentSecurityManager.isOriginPotentiallyTrustworthy(principal),
expectedResult
);
Assert.equal(principal.IsOriginPotentiallyTrustworthy, expectedResult);
}
// And now let's test whether .onion sites are properly treated when
// whitelisted, see bug 1382359.
Services.prefs.setBoolPref("dom.securecontext.whitelist_onions", true);
let uri = NetUtil.newURI("http://1234567890abcdef.onion/");
let principal = gScriptSecurityManager.createContentPrincipal(uri, {});
Assert.equal(
gContentSecurityManager.isOriginPotentiallyTrustworthy(principal),
true
);
Assert.equal(principal.IsOriginPotentiallyTrustworthy, true);
});
......@@ -162,11 +162,8 @@ void ClearSiteData::ClearDataFromChannel(nsIHttpChannel* aChannel) {
return;
}
nsCOMPtr<nsIContentSecurityManager> csm =
do_GetService(NS_CONTENTSECURITYMANAGER_CONTRACTID);
bool secure;
rv = csm->IsOriginPotentiallyTrustworthy(principal, &secure);
rv = principal->GetIsOriginPotentiallyTrustworthy(&secure);
if (NS_WARN_IF(NS_FAILED(rv)) || !secure) {
return;
}
......
......@@ -6,16 +6,13 @@
add_task(
function test_isOriginPotentiallyTrustworthnsIContentSecurityManagery() {
let contentSecManager = Cc[
"@mozilla.org/contentsecuritymanager;1"
].getService(Ci.nsIContentSecurityManager);
let uri = NetUtil.newURI("moz-extension://foobar/something.html");
let principal = Services.scriptSecurityManager.createContentPrincipal(
uri,
{}
);
Assert.equal(
contentSecManager.isOriginPotentiallyTrustworthy(principal),
principal.IsOriginPotentiallyTrustworthy,
true,
"it is potentially trustworthy"
);
......
......@@ -100,7 +100,7 @@ this.InsecurePasswordUtils = {
if (uri.schemeIs("http")) {
isFormSubmitHTTP = true;
if (
gContentSecurityManager.isOriginPotentiallyTrustworthy(principal) ||
principal.IsOriginPotentiallyTrustworthy ||
// Ignore sites with local IP addresses pointing to local forms.
(this._isPrincipalForLocalIPAddress(
aForm.rootElement.nodePrincipal
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment