mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-27 17:47:34 +09:00
Bug 1182569: Update ContentSecurityManager to handle docshell loads
This commit is contained in:
parent
e162907475
commit
846daf6d3b
2 changed files with 68 additions and 27 deletions
|
|
@ -10,6 +10,9 @@
|
||||||
#include "nsIStreamListener.h"
|
#include "nsIStreamListener.h"
|
||||||
#include "nsIDocument.h"
|
#include "nsIDocument.h"
|
||||||
#include "nsMixedContentBlocker.h"
|
#include "nsMixedContentBlocker.h"
|
||||||
|
#include "nsCDefaultURIFixup.h"
|
||||||
|
#include "nsIURIFixup.h"
|
||||||
|
#include "nsINestedURI.h"
|
||||||
|
|
||||||
#include "mozilla/dom/Element.h"
|
#include "mozilla/dom/Element.h"
|
||||||
#include "mozilla/dom/TabChild.h"
|
#include "mozilla/dom/TabChild.h"
|
||||||
|
|
@ -244,10 +247,6 @@ DoCORSChecks(nsIChannel* aChannel, nsILoadInfo* aLoadInfo,
|
||||||
static nsresult
|
static nsresult
|
||||||
DoContentSecurityChecks(nsIChannel* aChannel, nsILoadInfo* aLoadInfo)
|
DoContentSecurityChecks(nsIChannel* aChannel, nsILoadInfo* aLoadInfo)
|
||||||
{
|
{
|
||||||
nsCOMPtr<nsIURI> uri;
|
|
||||||
nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
|
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
|
|
||||||
nsContentPolicyType contentPolicyType =
|
nsContentPolicyType contentPolicyType =
|
||||||
aLoadInfo->GetExternalContentPolicyType();
|
aLoadInfo->GetExternalContentPolicyType();
|
||||||
nsContentPolicyType internalContentPolicyType =
|
nsContentPolicyType internalContentPolicyType =
|
||||||
|
|
@ -255,12 +254,24 @@ DoContentSecurityChecks(nsIChannel* aChannel, nsILoadInfo* aLoadInfo)
|
||||||
nsCString mimeTypeGuess;
|
nsCString mimeTypeGuess;
|
||||||
nsCOMPtr<nsISupports> requestingContext = nullptr;
|
nsCOMPtr<nsISupports> requestingContext = nullptr;
|
||||||
|
|
||||||
#ifdef DEBUG
|
nsCOMPtr<nsIURI> uri;
|
||||||
// Don't enforce TYPE_DOCUMENT assertions for loads
|
nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
|
||||||
// initiated by javascript tests.
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
bool skipContentTypeCheck = false;
|
|
||||||
skipContentTypeCheck = Preferences::GetBool("network.loadinfo.skip_type_assertion");
|
if (contentPolicyType == nsIContentPolicy::TYPE_DOCUMENT ||
|
||||||
#endif
|
contentPolicyType == nsIContentPolicy::TYPE_SUBDOCUMENT) {
|
||||||
|
// TYPE_DOCUMENT and TYPE_SUBDOCUMENT loads might potentially
|
||||||
|
// be wyciwyg:// channels. Let's fix up the URI so we can
|
||||||
|
// perform proper security checks.
|
||||||
|
nsCOMPtr<nsIURIFixup> urifixup(do_GetService(NS_URIFIXUP_CONTRACTID, &rv));
|
||||||
|
if (NS_SUCCEEDED(rv) && urifixup) {
|
||||||
|
nsCOMPtr<nsIURI> fixedURI;
|
||||||
|
rv = urifixup->CreateExposableURI(uri, getter_AddRefs(fixedURI));
|
||||||
|
if (NS_SUCCEEDED(rv)) {
|
||||||
|
uri = fixedURI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch(contentPolicyType) {
|
switch(contentPolicyType) {
|
||||||
case nsIContentPolicy::TYPE_OTHER: {
|
case nsIContentPolicy::TYPE_OTHER: {
|
||||||
|
|
@ -294,16 +305,14 @@ DoContentSecurityChecks(nsIChannel* aChannel, nsILoadInfo* aLoadInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
case nsIContentPolicy::TYPE_DOCUMENT: {
|
case nsIContentPolicy::TYPE_DOCUMENT: {
|
||||||
MOZ_ASSERT(skipContentTypeCheck || false, "contentPolicyType not supported yet");
|
mimeTypeGuess = EmptyCString();
|
||||||
|
requestingContext = aLoadInfo->LoadingNode();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case nsIContentPolicy::TYPE_SUBDOCUMENT: {
|
case nsIContentPolicy::TYPE_SUBDOCUMENT: {
|
||||||
mimeTypeGuess = NS_LITERAL_CSTRING("text/html");
|
mimeTypeGuess = NS_LITERAL_CSTRING("text/html");
|
||||||
requestingContext = aLoadInfo->LoadingNode();
|
requestingContext = aLoadInfo->LoadingNode();
|
||||||
MOZ_ASSERT(!requestingContext ||
|
|
||||||
requestingContext->NodeType() == nsIDOMNode::DOCUMENT_NODE,
|
|
||||||
"type_subdocument requires requestingContext of type Document");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -470,18 +479,32 @@ DoContentSecurityChecks(nsIChannel* aChannel, nsILoadInfo* aLoadInfo)
|
||||||
MOZ_ASSERT(false, "can not perform security check without a valid contentType");
|
MOZ_ASSERT(false, "can not perform security check without a valid contentType");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For document loads we use the triggeringPrincipal as the originPrincipal.
|
||||||
|
// Note the the loadingPrincipal for loads of TYPE_DOCUMENT is a nullptr.
|
||||||
|
nsCOMPtr<nsIPrincipal> principal =
|
||||||
|
(contentPolicyType == nsIContentPolicy::TYPE_DOCUMENT ||
|
||||||
|
contentPolicyType == nsIContentPolicy::TYPE_SUBDOCUMENT)
|
||||||
|
? aLoadInfo->TriggeringPrincipal()
|
||||||
|
: aLoadInfo->LoadingPrincipal();
|
||||||
|
|
||||||
int16_t shouldLoad = nsIContentPolicy::ACCEPT;
|
int16_t shouldLoad = nsIContentPolicy::ACCEPT;
|
||||||
rv = NS_CheckContentLoadPolicy(internalContentPolicyType,
|
rv = NS_CheckContentLoadPolicy(internalContentPolicyType,
|
||||||
uri,
|
uri,
|
||||||
aLoadInfo->LoadingPrincipal(),
|
principal,
|
||||||
requestingContext,
|
requestingContext,
|
||||||
mimeTypeGuess,
|
mimeTypeGuess,
|
||||||
nullptr, //extra,
|
nullptr, //extra,
|
||||||
&shouldLoad,
|
&shouldLoad,
|
||||||
nsContentUtils::GetContentPolicy(),
|
nsContentUtils::GetContentPolicy(),
|
||||||
nsContentUtils::GetSecurityManager());
|
nsContentUtils::GetSecurityManager());
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
|
||||||
if (NS_CP_REJECTED(shouldLoad)) {
|
if (NS_FAILED(rv) || NS_CP_REJECTED(shouldLoad)) {
|
||||||
|
if ((NS_SUCCEEDED(rv) && shouldLoad == nsIContentPolicy::REJECT_TYPE) &&
|
||||||
|
(contentPolicyType == nsIContentPolicy::TYPE_DOCUMENT ||
|
||||||
|
contentPolicyType == nsIContentPolicy::TYPE_SUBDOCUMENT)) {
|
||||||
|
// for docshell loads we might have to return SHOW_ALT.
|
||||||
|
return NS_ERROR_CONTENT_BLOCKED_SHOW_ALT;
|
||||||
|
}
|
||||||
return NS_ERROR_CONTENT_BLOCKED;
|
return NS_ERROR_CONTENT_BLOCKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -629,6 +652,30 @@ nsContentSecurityManager::CheckChannel(nsIChannel* aChannel)
|
||||||
nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
|
nsresult rv = NS_GetFinalChannelURI(aChannel, getter_AddRefs(uri));
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
nsContentPolicyType contentPolicyType =
|
||||||
|
loadInfo->GetExternalContentPolicyType();
|
||||||
|
|
||||||
|
if (contentPolicyType == nsIContentPolicy::TYPE_DOCUMENT ||
|
||||||
|
contentPolicyType == nsIContentPolicy::TYPE_SUBDOCUMENT) {
|
||||||
|
// query the nested URI for security checks like in the case of view-source
|
||||||
|
nsCOMPtr<nsINestedURI> nestedURI = do_QueryInterface(uri);
|
||||||
|
if (nestedURI) {
|
||||||
|
nestedURI->GetInnerURI(getter_AddRefs(uri));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TYPE_DOCUMENT and TYPE_SUBDOCUMENT loads might potentially
|
||||||
|
// be wyciwyg:// channels. Let's fix up the URI so we can
|
||||||
|
// perform proper security checks.
|
||||||
|
nsCOMPtr<nsIURIFixup> urifixup(do_GetService(NS_URIFIXUP_CONTRACTID, &rv));
|
||||||
|
if (NS_SUCCEEDED(rv) && urifixup) {
|
||||||
|
nsCOMPtr<nsIURI> fixedURI;
|
||||||
|
rv = urifixup->CreateExposableURI(uri, getter_AddRefs(fixedURI));
|
||||||
|
if (NS_SUCCEEDED(rv)) {
|
||||||
|
uri = fixedURI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Handle cookie policies
|
// Handle cookie policies
|
||||||
uint32_t cookiePolicy = loadInfo->GetCookiePolicy();
|
uint32_t cookiePolicy = loadInfo->GetCookiePolicy();
|
||||||
if (cookiePolicy == nsILoadInfo::SEC_COOKIES_SAME_ORIGIN) {
|
if (cookiePolicy == nsILoadInfo::SEC_COOKIES_SAME_ORIGIN) {
|
||||||
|
|
|
||||||
|
|
@ -1285,16 +1285,10 @@ NS_HasBeenCrossOrigin(nsIChannel* aChannel, bool aReport)
|
||||||
nsCOMPtr<nsILoadInfo> loadInfo = aChannel->GetLoadInfo();
|
nsCOMPtr<nsILoadInfo> loadInfo = aChannel->GetLoadInfo();
|
||||||
MOZ_RELEASE_ASSERT(loadInfo, "Origin tracking only works for channels created with a loadinfo");
|
MOZ_RELEASE_ASSERT(loadInfo, "Origin tracking only works for channels created with a loadinfo");
|
||||||
|
|
||||||
#ifdef DEBUG
|
// TYPE_DOCUMENT loads have a null LoadingPrincipal and can not be cross origin.
|
||||||
// Don't enforce TYPE_DOCUMENT assertions for loads
|
if (!loadInfo->LoadingPrincipal()) {
|
||||||
// initiated by javascript tests.
|
return false;
|
||||||
bool skipContentTypeCheck = false;
|
}
|
||||||
skipContentTypeCheck = Preferences::GetBool("network.loadinfo.skip_type_assertion");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MOZ_ASSERT(skipContentTypeCheck ||
|
|
||||||
loadInfo->GetExternalContentPolicyType() != nsIContentPolicy::TYPE_DOCUMENT,
|
|
||||||
"calling NS_HasBeenCrossOrigin on a top level load");
|
|
||||||
|
|
||||||
// Always treat tainted channels as cross-origin.
|
// Always treat tainted channels as cross-origin.
|
||||||
if (loadInfo->GetTainting() != LoadTainting::Basic) {
|
if (loadInfo->GetTainting() != LoadTainting::Basic) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue