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 "nsNetUtil.h"
|
||||
#include "nsIURIWithSpecialOrigin.h"
|
||||
#include "nsScriptSecurityManager.h"
|
||||
#include "nsServiceManagerUtils.h"
|
||||
|
||||
|
|
@ -411,6 +412,21 @@ BasePrincipal::CreateCodebasePrincipal(nsIURI* aURI,
|
|||
}
|
||||
|
||||
// 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;
|
||||
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(aURI,
|
||||
getter_AddRefs(blobPrincipal))) {
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#include "nsIURI.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsIStandardURL.h"
|
||||
#include "nsIURIWithSpecialOrigin.h"
|
||||
#include "nsJSPrincipals.h"
|
||||
#include "nsIEffectiveTLDService.h"
|
||||
#include "nsIClassInfoImpl.h"
|
||||
|
|
@ -270,6 +271,21 @@ ContentPrincipal::MayLoadInternal(nsIURI* 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;
|
||||
if (dom::BlobURLProtocolHandler::GetBlobURLPrincipal(aURI,
|
||||
getter_AddRefs(blobPrincipal))) {
|
||||
|
|
|
|||
|
|
@ -179,6 +179,7 @@
|
|||
#include "nsIStreamConverterService.h"
|
||||
#include "nsIStringBundle.h"
|
||||
#include "nsIURI.h"
|
||||
#include "nsIURIWithSpecialOrigin.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsIWebNavigation.h"
|
||||
#include "nsIWindowMediator.h"
|
||||
|
|
@ -6344,9 +6345,22 @@ nsresult
|
|||
nsContentUtils::GetUTFOrigin(nsIURI* aURI, nsAString& aOrigin)
|
||||
{
|
||||
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;
|
||||
nsresult rv = aURI->SchemeIs(BLOBURI_SCHEME, &isBlobURL);
|
||||
rv = aURI->SchemeIs(BLOBURI_SCHEME, &isBlobURL);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// For Blob URI, the path is the URL of the owning page.
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@ XPIDL_SOURCES += [
|
|||
'nsIURI.idl',
|
||||
'nsIURIClassifier.idl',
|
||||
'nsIURIMutator.idl',
|
||||
'nsIURIWithSpecialOrigin.idl',
|
||||
'nsIURL.idl',
|
||||
'nsIURLParser.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 "nsISyncStreamListener.h"
|
||||
#include "nsITransport.h"
|
||||
#include "nsIURIWithSpecialOrigin.h"
|
||||
#include "nsIURLParser.h"
|
||||
#include "nsIUUIDGenerator.h"
|
||||
#include "nsIViewSourceChannel.h"
|
||||
|
|
@ -2463,6 +2464,8 @@ NS_SecurityCompareURIs(nsIURI *aSourceURI,
|
|||
nsIURI *aTargetURI,
|
||||
bool aStrictFileOriginPolicy)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
// 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
|
||||
// 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> 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;
|
||||
if (BlobURLProtocolHandler::GetBlobURLPrincipal(sourceBaseURI,
|
||||
getter_AddRefs(sourceBlobPrincipal))) {
|
||||
nsCOMPtr<nsIURI> sourceBlobOwnerURI;
|
||||
nsresult rv = sourceBlobPrincipal->GetURI(getter_AddRefs(sourceBlobOwnerURI));
|
||||
rv = sourceBlobPrincipal->GetURI(getter_AddRefs(sourceBlobOwnerURI));
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
sourceBaseURI = sourceBlobOwnerURI;
|
||||
}
|
||||
|
|
@ -2496,7 +2522,7 @@ NS_SecurityCompareURIs(nsIURI *aSourceURI,
|
|||
if (BlobURLProtocolHandler::GetBlobURLPrincipal(targetBaseURI,
|
||||
getter_AddRefs(targetBlobPrincipal))) {
|
||||
nsCOMPtr<nsIURI> targetBlobOwnerURI;
|
||||
nsresult rv = targetBlobPrincipal->GetURI(getter_AddRefs(targetBlobOwnerURI));
|
||||
rv = targetBlobPrincipal->GetURI(getter_AddRefs(targetBlobOwnerURI));
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
targetBaseURI = targetBlobOwnerURI;
|
||||
}
|
||||
|
|
@ -2540,7 +2566,7 @@ NS_SecurityCompareURIs(nsIURI *aSourceURI,
|
|||
|
||||
// Otherwise they had better match
|
||||
bool filesAreEqual = false;
|
||||
nsresult rv = sourceFile->Equals(targetFile, &filesAreEqual);
|
||||
rv = sourceFile->Equals(targetFile, &filesAreEqual);
|
||||
return NS_SUCCEEDED(rv) && filesAreEqual;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue