forked from mirrors/gecko-dev
Bug 1478441 - Introduce nsIURIWithSpecialOrigin needed for Thunderbird. r=baku
This commit is contained in:
parent
76afa8409f
commit
ba1be252a0
6 changed files with 97 additions and 4 deletions
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "ExpandedPrincipal.h"
|
#include "ExpandedPrincipal.h"
|
||||||
#include "nsNetUtil.h"
|
#include "nsNetUtil.h"
|
||||||
|
#include "nsIURIWithSpecialOrigin.h"
|
||||||
#include "nsScriptSecurityManager.h"
|
#include "nsScriptSecurityManager.h"
|
||||||
#include "nsServiceManagerUtils.h"
|
#include "nsServiceManagerUtils.h"
|
||||||
|
|
||||||
|
|
@ -411,6 +412,21 @@ BasePrincipal::CreateCodebasePrincipal(nsIURI* aURI,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check whether the URI knows what its principal is supposed to be.
|
// Check whether the URI knows what its principal is supposed to be.
|
||||||
|
#if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE)
|
||||||
|
nsCOMPtr<nsIURIWithSpecialOrigin> uriWithSpecialOrigin = do_QueryInterface(aURI);
|
||||||
|
if (uriWithSpecialOrigin) {
|
||||||
|
nsCOMPtr<nsIURI> origin;
|
||||||
|
rv = uriWithSpecialOrigin->GetOrigin(getter_AddRefs(origin));
|
||||||
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
MOZ_ASSERT(origin);
|
||||||
|
OriginAttributes attrs;
|
||||||
|
RefPtr<BasePrincipal> principal = CreateCodebasePrincipal(origin, attrs);
|
||||||
|
return principal.forget();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
nsCOMPtr<nsIPrincipal> blobPrincipal;
|
nsCOMPtr<nsIPrincipal> blobPrincipal;
|
||||||
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(aURI,
|
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(aURI,
|
||||||
getter_AddRefs(blobPrincipal))) {
|
getter_AddRefs(blobPrincipal))) {
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
#include "nsIURL.h"
|
#include "nsIURL.h"
|
||||||
#include "nsIStandardURL.h"
|
#include "nsIStandardURL.h"
|
||||||
|
#include "nsIURIWithSpecialOrigin.h"
|
||||||
#include "nsJSPrincipals.h"
|
#include "nsJSPrincipals.h"
|
||||||
#include "nsIEffectiveTLDService.h"
|
#include "nsIEffectiveTLDService.h"
|
||||||
#include "nsIClassInfoImpl.h"
|
#include "nsIClassInfoImpl.h"
|
||||||
|
|
@ -270,6 +271,21 @@ ContentPrincipal::MayLoadInternal(nsIURI* aURI)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aURI);
|
MOZ_ASSERT(aURI);
|
||||||
|
|
||||||
|
#if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE)
|
||||||
|
nsCOMPtr<nsIURIWithSpecialOrigin> uriWithSpecialOrigin = do_QueryInterface(aURI);
|
||||||
|
if (uriWithSpecialOrigin) {
|
||||||
|
nsCOMPtr<nsIURI> origin;
|
||||||
|
nsresult rv = uriWithSpecialOrigin->GetOrigin(getter_AddRefs(origin));
|
||||||
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MOZ_ASSERT(origin);
|
||||||
|
OriginAttributes attrs;
|
||||||
|
RefPtr<BasePrincipal> principal = BasePrincipal::CreateCodebasePrincipal(origin, attrs);
|
||||||
|
return nsIPrincipal::Subsumes(principal);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
nsCOMPtr<nsIPrincipal> blobPrincipal;
|
nsCOMPtr<nsIPrincipal> blobPrincipal;
|
||||||
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(aURI,
|
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(aURI,
|
||||||
getter_AddRefs(blobPrincipal))) {
|
getter_AddRefs(blobPrincipal))) {
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,7 @@
|
||||||
#include "nsIStreamConverterService.h"
|
#include "nsIStreamConverterService.h"
|
||||||
#include "nsIStringBundle.h"
|
#include "nsIStringBundle.h"
|
||||||
#include "nsIURI.h"
|
#include "nsIURI.h"
|
||||||
|
#include "nsIURIWithSpecialOrigin.h"
|
||||||
#include "nsIURL.h"
|
#include "nsIURL.h"
|
||||||
#include "nsIWebNavigation.h"
|
#include "nsIWebNavigation.h"
|
||||||
#include "nsIWindowMediator.h"
|
#include "nsIWindowMediator.h"
|
||||||
|
|
@ -6344,9 +6345,22 @@ nsresult
|
||||||
nsContentUtils::GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin)
|
nsContentUtils::GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aURI, "missing uri");
|
MOZ_ASSERT(aURI, "missing uri");
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
#if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE)
|
||||||
|
// Check if either URI has a special origin.
|
||||||
|
nsCOMPtr<nsIURIWithSpecialOrigin> uriWithSpecialOrigin = do_QueryInterface(aURI);
|
||||||
|
if (uriWithSpecialOrigin) {
|
||||||
|
nsCOMPtr<nsIURI> origin;
|
||||||
|
rv = uriWithSpecialOrigin->GetOrigin(getter_AddRefs(origin));
|
||||||
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
|
return GetUTFOrigin(origin, aOrigin);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool isBlobURL = false;
|
bool isBlobURL = false;
|
||||||
nsresult rv = aURI->SchemeIs(BLOBURI_SCHEME, &isBlobURL);
|
rv = aURI->SchemeIs(BLOBURI_SCHEME, &isBlobURL);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
// For Blob URI, the path is the URL of the owning page.
|
// For Blob URI, the path is the URL of the owning page.
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,7 @@ XPIDL_SOURCES += [
|
||||||
'nsIURI.idl',
|
'nsIURI.idl',
|
||||||
'nsIURIClassifier.idl',
|
'nsIURIClassifier.idl',
|
||||||
'nsIURIMutator.idl',
|
'nsIURIMutator.idl',
|
||||||
|
'nsIURIWithSpecialOrigin.idl',
|
||||||
'nsIURL.idl',
|
'nsIURL.idl',
|
||||||
'nsIURLParser.idl',
|
'nsIURLParser.idl',
|
||||||
'nsPILoadGroupInternal.idl',
|
'nsPILoadGroupInternal.idl',
|
||||||
|
|
|
||||||
20
netwerk/base/nsIURIWithSpecialOrigin.idl
Normal file
20
netwerk/base/nsIURIWithSpecialOrigin.idl
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
/* 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 "nsISupports.idl"
|
||||||
|
|
||||||
|
interface nsIURI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nsIURIWithSpecialOrigin is implemented by URIs need to supply an origin that
|
||||||
|
* does not match the spec. This is exclusively used in comm-central's Mailnews module.
|
||||||
|
*/
|
||||||
|
[scriptable, builtinclass, uuid(4f65569b-d6fc-4580-94d9-21e775658a2a)]
|
||||||
|
interface nsIURIWithSpecialOrigin : nsISupports
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Special origin.
|
||||||
|
*/
|
||||||
|
readonly attribute nsIURI origin;
|
||||||
|
};
|
||||||
|
|
@ -61,6 +61,7 @@
|
||||||
#include "nsStringStream.h"
|
#include "nsStringStream.h"
|
||||||
#include "nsISyncStreamListener.h"
|
#include "nsISyncStreamListener.h"
|
||||||
#include "nsITransport.h"
|
#include "nsITransport.h"
|
||||||
|
#include "nsIURIWithSpecialOrigin.h"
|
||||||
#include "nsIURLParser.h"
|
#include "nsIURLParser.h"
|
||||||
#include "nsIUUIDGenerator.h"
|
#include "nsIUUIDGenerator.h"
|
||||||
#include "nsIViewSourceChannel.h"
|
#include "nsIViewSourceChannel.h"
|
||||||
|
|
@ -2463,6 +2464,8 @@ NS_SecurityCompareURIs(nsIURI *aSourceURI,
|
||||||
nsIURI *aTargetURI,
|
nsIURI *aTargetURI,
|
||||||
bool aStrictFileOriginPolicy)
|
bool aStrictFileOriginPolicy)
|
||||||
{
|
{
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
// Note that this is not an Equals() test on purpose -- for URIs that don't
|
// Note that this is not an Equals() test on purpose -- for URIs that don't
|
||||||
// support host/port, we want equality to basically be object identity, for
|
// support host/port, we want equality to basically be object identity, for
|
||||||
// security purposes. Otherwise, for example, two javascript: URIs that
|
// security purposes. Otherwise, for example, two javascript: URIs that
|
||||||
|
|
@ -2482,11 +2485,34 @@ NS_SecurityCompareURIs(nsIURI *aSourceURI,
|
||||||
nsCOMPtr<nsIURI> sourceBaseURI = NS_GetInnermostURI(aSourceURI);
|
nsCOMPtr<nsIURI> sourceBaseURI = NS_GetInnermostURI(aSourceURI);
|
||||||
nsCOMPtr<nsIURI> targetBaseURI = NS_GetInnermostURI(aTargetURI);
|
nsCOMPtr<nsIURI> targetBaseURI = NS_GetInnermostURI(aTargetURI);
|
||||||
|
|
||||||
|
#if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE)
|
||||||
|
// Check if either URI has a special origin.
|
||||||
|
nsCOMPtr<nsIURI> origin;
|
||||||
|
nsCOMPtr<nsIURIWithSpecialOrigin> uriWithSpecialOrigin = do_QueryInterface(sourceBaseURI);
|
||||||
|
if (uriWithSpecialOrigin) {
|
||||||
|
rv = uriWithSpecialOrigin->GetOrigin(getter_AddRefs(origin));
|
||||||
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MOZ_ASSERT(origin);
|
||||||
|
sourceBaseURI = origin;
|
||||||
|
}
|
||||||
|
uriWithSpecialOrigin = do_QueryInterface(targetBaseURI);
|
||||||
|
if (uriWithSpecialOrigin) {
|
||||||
|
rv = uriWithSpecialOrigin->GetOrigin(getter_AddRefs(origin));
|
||||||
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
MOZ_ASSERT(origin);
|
||||||
|
targetBaseURI = origin;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
nsCOMPtr<nsIPrincipal> sourceBlobPrincipal;
|
nsCOMPtr<nsIPrincipal> sourceBlobPrincipal;
|
||||||
if (BlobURLProtocolHandler::GetBlobURLPrincipal(sourceBaseURI,
|
if (BlobURLProtocolHandler::GetBlobURLPrincipal(sourceBaseURI,
|
||||||
getter_AddRefs(sourceBlobPrincipal))) {
|
getter_AddRefs(sourceBlobPrincipal))) {
|
||||||
nsCOMPtr<nsIURI> sourceBlobOwnerURI;
|
nsCOMPtr<nsIURI> sourceBlobOwnerURI;
|
||||||
nsresult rv = sourceBlobPrincipal->GetURI(getter_AddRefs(sourceBlobOwnerURI));
|
rv = sourceBlobPrincipal->GetURI(getter_AddRefs(sourceBlobOwnerURI));
|
||||||
if (NS_SUCCEEDED(rv)) {
|
if (NS_SUCCEEDED(rv)) {
|
||||||
sourceBaseURI = sourceBlobOwnerURI;
|
sourceBaseURI = sourceBlobOwnerURI;
|
||||||
}
|
}
|
||||||
|
|
@ -2496,7 +2522,7 @@ NS_SecurityCompareURIs(nsIURI *aSourceURI,
|
||||||
if (BlobURLProtocolHandler::GetBlobURLPrincipal(targetBaseURI,
|
if (BlobURLProtocolHandler::GetBlobURLPrincipal(targetBaseURI,
|
||||||
getter_AddRefs(targetBlobPrincipal))) {
|
getter_AddRefs(targetBlobPrincipal))) {
|
||||||
nsCOMPtr<nsIURI> targetBlobOwnerURI;
|
nsCOMPtr<nsIURI> targetBlobOwnerURI;
|
||||||
nsresult rv = targetBlobPrincipal->GetURI(getter_AddRefs(targetBlobOwnerURI));
|
rv = targetBlobPrincipal->GetURI(getter_AddRefs(targetBlobOwnerURI));
|
||||||
if (NS_SUCCEEDED(rv)) {
|
if (NS_SUCCEEDED(rv)) {
|
||||||
targetBaseURI = targetBlobOwnerURI;
|
targetBaseURI = targetBlobOwnerURI;
|
||||||
}
|
}
|
||||||
|
|
@ -2540,7 +2566,7 @@ NS_SecurityCompareURIs(nsIURI *aSourceURI,
|
||||||
|
|
||||||
// Otherwise they had better match
|
// Otherwise they had better match
|
||||||
bool filesAreEqual = false;
|
bool filesAreEqual = false;
|
||||||
nsresult rv = sourceFile->Equals(targetFile, &filesAreEqual);
|
rv = sourceFile->Equals(targetFile, &filesAreEqual);
|
||||||
return NS_SUCCEEDED(rv) && filesAreEqual;
|
return NS_SUCCEEDED(rv) && filesAreEqual;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue