mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 23:59:46 +00:00
50d80fcfc7
- Bug 1237091. Remove WAP telemetry probe. r=mcmanus (8538288c45) - bug 718797 - allow heuristic cache of query string resources r=hurley (df7c0d050c) - Bug 1238290 - fix bad necko deps on unified_sources r=valentin.gosu (fee60661f9) - Bug 1237371: Asynchronously shutdown the predictor IO thread. r=hurley (2b971d9714) - Bug 407537 - Dont normalize a nonexistant file r=biesi (e9d4b81b0f) - Bug 1247733 part 1: Create a helper function for nsStandardURL's code to add/remove/replace a port in the URL string. r=valentin (81db1064a1) - Bug 1247733 part 2: Give nsIStandardURL an API to set its default port, and use it when upgrading HTTP connections to HTTPS. r=valentin (de4ee7a9c3) - Bug 1247733 part 3: Add mochitest to ensure that SVG <use> is rendered correctly in documents that have been upgraded using HSTS. r=valentin (a929b68f0c) - Bug 1247733 part 4: Add xpcshell test for nsIStandardURL setDefaultPot() API. r=valentin (4599dc1a46) - Bug 524232 - cache about: protocol handlers r=mayhemer (7ac918c396) - Bug 1238010 - Turn off ClosingService. r=mcmanus (e46aa99310) - Bug 1238017 - Remove ClosingService. r=mcmanus (c5d027507b) - Bug 1238910 - Rework shutdown necko. r=mcmanus (c95508d202) - Bug 1240269 - Do not open UDP socket during shutdown. r=mcmanus (e62a2008b5) - Bug 1240481 - Limit PR_Close calls during shutdown. r=mcmanus (aa3d4bd35c) - Bug 1242755 - Move nsHttpConnectionMgr->Shutdown back to nsHttpHandler. r=mcmanus (a630e3baf7) - add webapps (1b90fe85a8) - bug 1069556 - sync to Breakpad c53ed143108948eb7e2d7ee77dc8c0d92050ce7c. r=glandium, benwa (e0608cc38b) - more work to add pdfjs (ef88fb0b25) - var-let (df1123752d) - Bug 1242254 - Enable initial set of eslint rules for PSM. r=dkeeler (f68806c68d)
194 lines
6.3 KiB
C++
194 lines
6.3 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/* 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 "nsContentSecurityManager.h"
|
|
#include "nsSecCheckWrapChannel.h"
|
|
#include "nsIForcePendingChannel.h"
|
|
#include "nsIStreamListener.h"
|
|
#include "mozilla/Logging.h"
|
|
#include "nsCOMPtr.h"
|
|
|
|
static mozilla::LazyLogModule gChannelWrapperLog("ChannelWrapper");
|
|
#define CHANNELWRAPPERLOG(args) MOZ_LOG(gChannelWrapperLog, mozilla::LogLevel::Debug, args)
|
|
|
|
NS_IMPL_ADDREF(nsSecCheckWrapChannelBase)
|
|
NS_IMPL_RELEASE(nsSecCheckWrapChannelBase)
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsSecCheckWrapChannelBase)
|
|
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIHttpChannel, mHttpChannel)
|
|
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIHttpChannelInternal, mHttpChannelInternal)
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIHttpChannel)
|
|
NS_INTERFACE_MAP_ENTRY(nsIRequest)
|
|
NS_INTERFACE_MAP_ENTRY(nsIChannel)
|
|
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIUploadChannel, mUploadChannel)
|
|
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIUploadChannel2, mUploadChannel2)
|
|
NS_INTERFACE_MAP_ENTRY(nsISecCheckWrapChannel)
|
|
NS_INTERFACE_MAP_END
|
|
|
|
//---------------------------------------------------------
|
|
// nsSecCheckWrapChannelBase implementation
|
|
//---------------------------------------------------------
|
|
|
|
nsSecCheckWrapChannelBase::nsSecCheckWrapChannelBase(nsIChannel* aChannel)
|
|
: mChannel(aChannel)
|
|
, mHttpChannel(do_QueryInterface(aChannel))
|
|
, mHttpChannelInternal(do_QueryInterface(aChannel))
|
|
, mRequest(do_QueryInterface(aChannel))
|
|
, mUploadChannel(do_QueryInterface(aChannel))
|
|
, mUploadChannel2(do_QueryInterface(aChannel))
|
|
{
|
|
MOZ_ASSERT(mChannel, "can not create a channel wrapper without a channel");
|
|
}
|
|
|
|
nsSecCheckWrapChannelBase::~nsSecCheckWrapChannelBase()
|
|
{
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// nsISecCheckWrapChannel implementation
|
|
//---------------------------------------------------------
|
|
|
|
NS_IMETHODIMP
|
|
nsSecCheckWrapChannelBase::GetInnerChannel(nsIChannel **aInnerChannel)
|
|
{
|
|
NS_IF_ADDREF(*aInnerChannel = mChannel);
|
|
return NS_OK;
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// nsSecCheckWrapChannel implementation
|
|
//---------------------------------------------------------
|
|
|
|
nsSecCheckWrapChannel::nsSecCheckWrapChannel(nsIChannel* aChannel,
|
|
nsILoadInfo* aLoadInfo)
|
|
: nsSecCheckWrapChannelBase(aChannel)
|
|
, mLoadInfo(aLoadInfo)
|
|
{
|
|
{
|
|
nsCOMPtr<nsIURI> uri;
|
|
mChannel->GetURI(getter_AddRefs(uri));
|
|
nsAutoCString spec;
|
|
if (uri) {
|
|
uri->GetSpec(spec);
|
|
}
|
|
CHANNELWRAPPERLOG(("nsSecCheckWrapChannel::nsSecCheckWrapChannel [%p] (%s)",this, spec.get()));
|
|
}
|
|
}
|
|
|
|
// static
|
|
already_AddRefed<nsIChannel>
|
|
nsSecCheckWrapChannel::MaybeWrap(nsIChannel* aChannel, nsILoadInfo* aLoadInfo)
|
|
{
|
|
// Maybe a custom protocol handler actually returns a gecko
|
|
// http/ftpChannel - To check this we will check whether the channel
|
|
// implements a gecko non-scriptable interface e.g. nsIForcePendingChannel.
|
|
nsCOMPtr<nsIForcePendingChannel> isGeckoChannel = do_QueryInterface(aChannel);
|
|
|
|
nsCOMPtr<nsIChannel> channel;
|
|
if (isGeckoChannel) {
|
|
// If it is a gecko channel (ftp or http) we do not need to wrap it.
|
|
channel = aChannel;
|
|
channel->SetLoadInfo(aLoadInfo);
|
|
} else {
|
|
channel = new nsSecCheckWrapChannel(aChannel, aLoadInfo);
|
|
}
|
|
return channel.forget();
|
|
}
|
|
|
|
nsSecCheckWrapChannel::~nsSecCheckWrapChannel()
|
|
{
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// SecWrapChannelStreamListener helper
|
|
//---------------------------------------------------------
|
|
|
|
class SecWrapChannelStreamListener final : public nsIStreamListener
|
|
{
|
|
public:
|
|
SecWrapChannelStreamListener(nsIRequest *aRequest,
|
|
nsIStreamListener *aStreamListener)
|
|
: mRequest(aRequest)
|
|
, mListener(aStreamListener) {}
|
|
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSISTREAMLISTENER
|
|
NS_DECL_NSIREQUESTOBSERVER
|
|
|
|
private:
|
|
~SecWrapChannelStreamListener() {}
|
|
|
|
nsCOMPtr<nsIRequest> mRequest;
|
|
nsCOMPtr<nsIStreamListener> mListener;
|
|
};
|
|
|
|
NS_IMPL_ISUPPORTS(SecWrapChannelStreamListener,
|
|
nsIStreamListener,
|
|
nsIRequestObserver)
|
|
|
|
NS_IMETHODIMP
|
|
SecWrapChannelStreamListener::OnStartRequest(nsIRequest *aRequest,
|
|
nsISupports *aContext)
|
|
{
|
|
return mListener->OnStartRequest(mRequest, aContext);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
SecWrapChannelStreamListener::OnStopRequest(nsIRequest *aRequest,
|
|
nsISupports *aContext,
|
|
nsresult aStatus)
|
|
{
|
|
return mListener->OnStopRequest(mRequest, aContext, aStatus);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
SecWrapChannelStreamListener::OnDataAvailable(nsIRequest *aRequest,
|
|
nsISupports *aContext,
|
|
nsIInputStream *aInStream,
|
|
uint64_t aOffset,
|
|
uint32_t aCount)
|
|
{
|
|
return mListener->OnDataAvailable(mRequest, aContext, aInStream, aOffset, aCount);
|
|
}
|
|
|
|
//---------------------------------------------------------
|
|
// nsIChannel implementation
|
|
//---------------------------------------------------------
|
|
|
|
NS_IMETHODIMP
|
|
nsSecCheckWrapChannel::GetLoadInfo(nsILoadInfo** aLoadInfo)
|
|
{
|
|
CHANNELWRAPPERLOG(("nsSecCheckWrapChannel::GetLoadInfo() [%p]",this));
|
|
NS_IF_ADDREF(*aLoadInfo = mLoadInfo);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsSecCheckWrapChannel::SetLoadInfo(nsILoadInfo* aLoadInfo)
|
|
{
|
|
CHANNELWRAPPERLOG(("nsSecCheckWrapChannel::SetLoadInfo() [%p]", this));
|
|
mLoadInfo = aLoadInfo;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsSecCheckWrapChannel::AsyncOpen2(nsIStreamListener *aListener)
|
|
{
|
|
nsCOMPtr<nsIStreamListener> secWrapChannelListener =
|
|
new SecWrapChannelStreamListener(this, aListener);
|
|
nsresult rv = nsContentSecurityManager::doContentSecurityCheck(this, secWrapChannelListener);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
return AsyncOpen(secWrapChannelListener, nullptr);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
nsSecCheckWrapChannel::Open2(nsIInputStream** aStream)
|
|
{
|
|
nsCOMPtr<nsIStreamListener> listener;
|
|
nsresult rv = nsContentSecurityManager::doContentSecurityCheck(this, listener);
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
return Open(aStream);
|
|
}
|