Bug 782542 - Secure necko IPDL usage. r=ted,jduell

This commit is contained in:
Josh Matthews 2012-12-07 17:12:02 -05:00
parent c875399adc
commit 5c429bd02b
35 changed files with 411 additions and 167 deletions

View File

@ -8,22 +8,12 @@
#include "nsIScriptSecurityManager.h"
#include "nsServiceManagerUtils.h"
#include "nsContentUtils.h"
#include "mozIApplication.h"
namespace mozilla {
NS_IMPL_ISUPPORTS1(LoadContext, nsILoadContext);
LoadContext::LoadContext(const IPC::SerializedLoadContext& aToCopy,
nsIDOMElement* aTopFrameElemenet)
: mIsNotNull(aToCopy.mIsNotNull)
, mIsContent(aToCopy.mIsContent)
, mUsePrivateBrowsing(aToCopy.mUsePrivateBrowsing)
, mIsInBrowserElement(aToCopy.mIsInBrowserElement)
, mAppId(aToCopy.mAppId)
, mTopFrameElement(do_GetWeakReference(aTopFrameElemenet))
{}
//-----------------------------------------------------------------------------
// LoadContext::nsILoadContext
//-----------------------------------------------------------------------------

View File

@ -10,6 +10,9 @@
#include "SerializedLoadContext.h"
#include "mozilla/Attributes.h"
#include "nsWeakReference.h"
#include "nsIDOMElement.h"
class mozIApplication;
namespace mozilla {
@ -29,17 +32,19 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSILOADCONTEXT
LoadContext(const IPC::SerializedLoadContext& aToCopy)
// AppId/inBrowser arguments override those in SerializedLoadContext provided
// by child process.
LoadContext(const IPC::SerializedLoadContext& aToCopy,
nsIDOMElement* aTopFrameElement,
uint32_t aAppId, bool aInBrowser)
: mIsNotNull(aToCopy.mIsNotNull)
, mIsContent(aToCopy.mIsContent)
, mUsePrivateBrowsing(aToCopy.mUsePrivateBrowsing)
, mIsInBrowserElement(aToCopy.mIsInBrowserElement)
, mAppId(aToCopy.mAppId)
, mIsInBrowserElement(aInBrowser)
, mAppId(aAppId)
, mTopFrameElement(do_GetWeakReference(aTopFrameElement))
{}
LoadContext(const IPC::SerializedLoadContext& aToCopy,
nsIDOMElement* aTopFrameElemenet);
private:
bool mIsNotNull;
bool mIsContent;

View File

@ -214,8 +214,6 @@ parent:
* URI of the manifest to fetch, the application cache group ID
* @param documentURI
* URI of the document that referred the manifest
* @param clientID
* The group cache version identifier to use
* @param stickDocument
* True if the update was initiated by a document load that referred
* a manifest.
@ -233,7 +231,6 @@ parent:
* has already been cached (stickDocument=false).
*/
POfflineCacheUpdate(URIParams manifestURI, URIParams documentURI,
bool isInBrowserElement, uint32_t appId,
bool stickDocument);
sync PIndexedDB(nsCString asciiOrigin)

View File

@ -1570,8 +1570,6 @@ TabChild::RecvActivateFrameEvent(const nsString& aType, const bool& capture)
POfflineCacheUpdateChild*
TabChild::AllocPOfflineCacheUpdate(const URIParams& manifestURI,
const URIParams& documentURI,
const bool& isInBrowserElement,
const uint32_t& appId,
const bool& stickDocument)
{
NS_RUNTIMEABORT("unused");

View File

@ -277,8 +277,6 @@ public:
virtual POfflineCacheUpdateChild* AllocPOfflineCacheUpdate(
const URIParams& manifestURI,
const URIParams& documentURI,
const bool& isInBrowserElement,
const uint32_t& appId,
const bool& stickDocument);
virtual bool DeallocPOfflineCacheUpdate(POfflineCacheUpdateChild* offlineCacheUpdate);

View File

@ -1128,15 +1128,13 @@ TabParent::DeallocPRenderFrame(PRenderFrameParent* aFrame)
mozilla::docshell::POfflineCacheUpdateParent*
TabParent::AllocPOfflineCacheUpdate(const URIParams& aManifestURI,
const URIParams& aDocumentURI,
const bool& isInBrowserElement,
const uint32_t& appId,
const bool& stickDocument)
{
nsRefPtr<mozilla::docshell::OfflineCacheUpdateParent> update =
new mozilla::docshell::OfflineCacheUpdateParent();
new mozilla::docshell::OfflineCacheUpdateParent(OwnOrContainingAppId(),
IsBrowserElement());
nsresult rv = update->Schedule(aManifestURI, aDocumentURI,
isInBrowserElement, appId, stickDocument);
nsresult rv = update->Schedule(aManifestURI, aDocumentURI, stickDocument);
if (NS_FAILED(rv))
return nullptr;

View File

@ -191,8 +191,6 @@ public:
virtual POfflineCacheUpdateParent* AllocPOfflineCacheUpdate(
const URIParams& aManifestURI,
const URIParams& aDocumentURI,
const bool& isInBrowserElement,
const uint32_t& appId,
const bool& stickDocument);
virtual bool DeallocPOfflineCacheUpdate(POfflineCacheUpdateParent* actor);

View File

@ -770,6 +770,9 @@ pref("security.fileuri.strict_origin_policy", true);
// the results
pref("network.allow-experiments", true);
// Turn off interprocess security checks. Needed to run xpcshell tests.
pref("network.disable.ipc.security", false);
// Default action for unlisted external protocol handlers
pref("network.protocol-handler.external-default", true); // OK to load
pref("network.protocol-handler.warn-external-default", true); // warn before load

View File

@ -4,12 +4,14 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/net/CookieServiceChild.h"
#include "mozilla/dom/TabChild.h"
#include "mozilla/ipc/URIUtils.h"
#include "mozilla/net/NeckoChild.h"
#include "nsIURI.h"
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsITabChild.h"
#include "nsNetUtil.h"
using namespace mozilla::ipc;
@ -115,10 +117,19 @@ CookieServiceChild::GetCookieStringInternal(nsIURI *aHostURI,
URIParams uriParams;
SerializeURI(aHostURI, uriParams);
nsCOMPtr<nsITabChild> iTabChild;
mozilla::dom::TabChild* tabChild = nullptr;
if (aChannel) {
NS_QueryNotificationCallbacks(aChannel, iTabChild);
if (iTabChild) {
tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get());
}
}
// Synchronously call the parent.
nsAutoCString result;
SendGetCookieString(uriParams, !!isForeign, aFromHttp,
IPC::SerializedLoadContext(aChannel), &result);
IPC::SerializedLoadContext(aChannel), tabChild, &result);
if (!result.IsEmpty())
*aCookieString = ToNewCString(result);
@ -148,9 +159,18 @@ CookieServiceChild::SetCookieStringInternal(nsIURI *aHostURI,
URIParams uriParams;
SerializeURI(aHostURI, uriParams);
nsCOMPtr<nsITabChild> iTabChild;
mozilla::dom::TabChild* tabChild = nullptr;
if (aChannel) {
NS_QueryNotificationCallbacks(aChannel, iTabChild);
if (iTabChild) {
tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get());
}
}
// Synchronously call the parent.
SendSetCookieString(uriParams, !!isForeign, cookieString, serverTime,
aFromHttp, IPC::SerializedLoadContext(aChannel));
aFromHttp, IPC::SerializedLoadContext(aChannel), tabChild);
return NS_OK;
}

View File

@ -4,32 +4,44 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/net/CookieServiceParent.h"
#include "mozilla/dom/PBrowserParent.h"
#include "mozilla/net/NeckoParent.h"
#include "mozilla/ipc/URIUtils.h"
#include "nsCookieService.h"
#include "nsNetUtil.h"
#include "nsPrintfCString.h"
using namespace mozilla::ipc;
using mozilla::dom::PBrowserParent;
using mozilla::net::NeckoParent;
static void
GetAppInfoFromLoadContext(const IPC::SerializedLoadContext &aLoadContext,
uint32_t& aAppId,
bool& aIsInBrowserElement,
bool& aIsPrivate)
MOZ_WARN_UNUSED_RESULT
static bool
GetAppInfoFromParams(const IPC::SerializedLoadContext &aLoadContext,
PBrowserParent* aBrowser,
uint32_t& aAppId,
bool& aIsInBrowserElement,
bool& aIsPrivate)
{
// TODO: bug 782542: what to do when we get null loadContext? For now assume
// NECKO_NO_APP_ID.
aAppId = NECKO_NO_APP_ID;
aIsInBrowserElement = false;
aIsPrivate = false;
if (aLoadContext.IsNotNull()) {
aAppId = aLoadContext.mAppId;
aIsInBrowserElement = aLoadContext.mIsInBrowserElement;
const char* error = NeckoParent::GetValidatedAppInfo(aLoadContext, aBrowser,
&aAppId,
&aIsInBrowserElement);
if (error) {
NS_WARNING(nsPrintfCString("CookieServiceParent: GetAppInfoFromParams: "
"FATAL error: %s: KILLING CHILD PROCESS\n",
error).get());
return false;
}
if (aLoadContext.IsPrivateBitValid())
aIsPrivate = aLoadContext.mUsePrivateBrowsing;
return true;
}
namespace mozilla {
@ -57,6 +69,7 @@ CookieServiceParent::RecvGetCookieString(const URIParams& aHost,
const bool& aFromHttp,
const IPC::SerializedLoadContext&
aLoadContext,
PBrowserParent* aBrowser,
nsCString* aResult)
{
if (!mCookieService)
@ -70,10 +83,15 @@ CookieServiceParent::RecvGetCookieString(const URIParams& aHost,
uint32_t appId;
bool isInBrowserElement, isPrivate;
GetAppInfoFromLoadContext(aLoadContext, appId, isInBrowserElement, isPrivate);
bool valid = GetAppInfoFromParams(aLoadContext, aBrowser, appId,
isInBrowserElement, isPrivate);
if (!valid) {
return false;
}
mCookieService->GetCookieStringInternal(hostURI, aIsForeign, aFromHttp, appId,
isInBrowserElement, isPrivate, *aResult);
isInBrowserElement, isPrivate,
*aResult);
return true;
}
@ -84,7 +102,8 @@ CookieServiceParent::RecvSetCookieString(const URIParams& aHost,
const nsCString& aServerTime,
const bool& aFromHttp,
const IPC::SerializedLoadContext&
aLoadContext)
aLoadContext,
PBrowserParent* aBrowser)
{
if (!mCookieService)
return true;
@ -97,7 +116,11 @@ CookieServiceParent::RecvSetCookieString(const URIParams& aHost,
uint32_t appId;
bool isInBrowserElement, isPrivate;
GetAppInfoFromLoadContext(aLoadContext, appId, isInBrowserElement, isPrivate);
bool valid = GetAppInfoFromParams(aLoadContext, aBrowser, appId,
isInBrowserElement, isPrivate);
if (!valid) {
return false;
}
nsDependentCString cookieString(aCookieString, 0);
//TODO: bug 812475, pass a real channel object

View File

@ -13,6 +13,9 @@ class nsCookieService;
class nsIIOService;
namespace mozilla {
namespace dom {
class PBrowserParent;
}
namespace net {
class CookieServiceParent : public PCookieServiceParent
@ -27,6 +30,7 @@ protected:
const bool& aFromHttp,
const IPC::SerializedLoadContext&
loadContext,
mozilla::dom::PBrowserParent* aBrowser,
nsCString* aResult);
virtual bool RecvSetCookieString(const URIParams& aHost,
@ -35,7 +39,8 @@ protected:
const nsCString& aServerTime,
const bool& aFromHttp,
const IPC::SerializedLoadContext&
loadContext);
loadContext,
mozilla::dom::PBrowserParent* aBrowser);
nsRefPtr<nsCookieService> mCookieService;
};

View File

@ -6,6 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
include protocol PNecko;
include protocol PBrowser;
include URIParams;
include "SerializedLoadContext.h";
@ -64,7 +65,8 @@ parent:
sync GetCookieString(URIParams host,
bool isForeign,
bool fromHttp,
SerializedLoadContext loadContext)
SerializedLoadContext loadContext,
nullable PBrowser browser)
returns (nsCString result);
/*
@ -101,7 +103,8 @@ parent:
nsCString cookieString,
nsCString serverTime,
bool fromHttp,
SerializedLoadContext loadContext);
SerializedLoadContext loadContext,
nullable PBrowser browser);
__delete__();
};

View File

@ -14,17 +14,22 @@
#include "mozilla/net/FTPChannelChild.h"
#include "mozilla/net/WebSocketChannelChild.h"
#include "mozilla/dom/network/TCPSocketChild.h"
#include "mozilla/Preferences.h"
using mozilla::dom::TCPSocketChild;
namespace mozilla {
namespace net {
static bool gDisableIPCSecurity = false;
static const char kPrefDisableIPCSecurity[] = "network.disable.ipc.security";
PNeckoChild *gNeckoChild = nullptr;
// C++ file contents
NeckoChild::NeckoChild()
{
Preferences::AddBoolVarCache(&gDisableIPCSecurity, kPrefDisableIPCSecurity);
}
NeckoChild::~NeckoChild()
@ -80,7 +85,8 @@ NeckoChild::DeallocPHttpChannel(PHttpChannelChild* channel)
}
PFTPChannelChild*
NeckoChild::AllocPFTPChannel()
NeckoChild::AllocPFTPChannel(PBrowserChild* aBrowser,
const SerializedLoadContext& aSerialized)
{
// We don't allocate here: see FTPChannelChild::AsyncOpen()
NS_RUNTIMEABORT("AllocPFTPChannel should not be called");
@ -134,7 +140,8 @@ NeckoChild::DeallocPWyciwygChannel(PWyciwygChannelChild* channel)
}
PWebSocketChild*
NeckoChild::AllocPWebSocket(PBrowserChild* browser)
NeckoChild::AllocPWebSocket(PBrowserChild* browser,
const SerializedLoadContext& aSerialized)
{
NS_NOTREACHED("AllocPWebSocket should not be called");
return nullptr;

View File

@ -33,9 +33,10 @@ protected:
virtual bool DeallocPCookieService(PCookieServiceChild*);
virtual PWyciwygChannelChild* AllocPWyciwygChannel();
virtual bool DeallocPWyciwygChannel(PWyciwygChannelChild*);
virtual PFTPChannelChild* AllocPFTPChannel();
virtual PFTPChannelChild* AllocPFTPChannel(PBrowserChild* aBrowser,
const SerializedLoadContext& aSerialized);
virtual bool DeallocPFTPChannel(PFTPChannelChild*);
virtual PWebSocketChild* AllocPWebSocket(PBrowserChild*);
virtual PWebSocketChild* AllocPWebSocket(PBrowserChild*, const SerializedLoadContext&);
virtual bool DeallocPWebSocket(PWebSocketChild*);
virtual PTCPSocketChild* AllocPTCPSocket(const nsString& aHost,
const uint16_t& aPort,

View File

@ -14,30 +14,142 @@
#include "mozilla/net/WebSocketChannelParent.h"
#include "mozilla/dom/TabParent.h"
#include "mozilla/dom/network/TCPSocketParent.h"
#include "mozilla/Preferences.h"
#include "mozilla/LoadContext.h"
#include "nsPrintfCString.h"
#include "nsHTMLDNSPrefetch.h"
using mozilla::dom::TabParent;
using mozilla::net::PTCPSocketParent;
using mozilla::dom::TCPSocketParent;
using IPC::SerializedLoadContext;
namespace mozilla {
namespace net {
static bool gDisableIPCSecurity = false;
static const char kPrefDisableIPCSecurity[] = "network.disable.ipc.security";
// C++ file contents
NeckoParent::NeckoParent()
{
Preferences::AddBoolVarCache(&gDisableIPCSecurity, kPrefDisableIPCSecurity);
}
NeckoParent::~NeckoParent()
{
}
PHttpChannelParent*
NeckoParent::AllocPHttpChannel(PBrowserParent* browser,
const SerializedLoadContext& loadContext)
static PBOverrideStatus
PBOverrideStatusFromLoadContext(const SerializedLoadContext& aSerialized)
{
HttpChannelParent *p = new HttpChannelParent(browser, loadContext);
if (!aSerialized.IsNotNull() && aSerialized.IsPrivateBitValid()) {
return aSerialized.mUsePrivateBrowsing ?
kPBOverride_Private :
kPBOverride_NotPrivate;
}
return kPBOverride_Unset;
}
const char*
NeckoParent::GetValidatedAppInfo(const SerializedLoadContext& aSerialized,
PBrowserParent* aBrowser,
uint32_t* aAppId,
bool* aInBrowserElement)
{
if (!gDisableIPCSecurity) {
if (!aBrowser) {
return "missing required PBrowser argument";
}
if (!aSerialized.IsNotNull()) {
return "SerializedLoadContext from child is null";
}
}
*aAppId = NECKO_UNKNOWN_APP_ID;
*aInBrowserElement = false;
if (aBrowser) {
nsRefPtr<TabParent> tabParent = static_cast<TabParent*>(aBrowser);
*aAppId = tabParent->OwnOrContainingAppId();
*aInBrowserElement = tabParent->IsBrowserElement();
if (*aAppId == NECKO_UNKNOWN_APP_ID) {
return "TabParent reports appId=NECKO_UNKNOWN_APP_ID!";
}
// We may get appID=NO_APP if child frame is neither a browser nor an app
if (*aAppId == NECKO_NO_APP_ID) {
if (tabParent->HasOwnApp()) {
return "TabParent reports NECKO_NO_APP_ID but also is an app";
}
if (tabParent->IsBrowserElement()) {
// <iframe mozbrowser> which doesn't have an <iframe mozapp> above it.
// This is not supported now, and we'll need to do a code audit to make
// sure we can handle it (i.e don't short-circuit using separate
// namespace if just appID==0)
return "TabParent reports appId=NECKO_NO_APP_ID but is a mozbrowser";
}
}
} else {
// Only trust appId/inBrowser from child-side loadcontext if we're in
// testing mode: allows xpcshell tests to masquerade as apps
MOZ_ASSERT(gDisableIPCSecurity);
if (!gDisableIPCSecurity) {
return "internal error";
}
if (aSerialized.IsNotNull()) {
*aAppId = aSerialized.mAppId;
*aInBrowserElement = aSerialized.mIsInBrowserElement;
} else {
*aAppId = NECKO_NO_APP_ID;
}
}
return nullptr;
}
const char *
NeckoParent::CreateChannelLoadContext(PBrowserParent* aBrowser,
const SerializedLoadContext& aSerialized,
nsCOMPtr<nsILoadContext> &aResult)
{
uint32_t appId = NECKO_UNKNOWN_APP_ID;
bool inBrowser = false;
nsIDOMElement* topFrameElement = nullptr;
const char* error = GetValidatedAppInfo(aSerialized, aBrowser, &appId, &inBrowser);
if (error) {
return error;
}
if (aBrowser) {
nsRefPtr<TabParent> tabParent = static_cast<TabParent*>(aBrowser);
topFrameElement = tabParent->GetOwnerElement();
}
// if gDisableIPCSecurity, we may not have a LoadContext to set. This is
// the common case for most xpcshell tests.
if (aSerialized.IsNotNull()) {
aResult = new LoadContext(aSerialized, topFrameElement, appId, inBrowser);
}
return nullptr;
}
PHttpChannelParent*
NeckoParent::AllocPHttpChannel(PBrowserParent* aBrowser,
const SerializedLoadContext& aSerialized)
{
nsCOMPtr<nsILoadContext> loadContext;
const char *error = CreateChannelLoadContext(aBrowser, aSerialized,
loadContext);
if (error) {
NS_WARNING(nsPrintfCString("NeckoParent::AllocPHttpChannel: "
"FATAL error: %s: KILLING CHILD PROCESS\n",
error).get());
return nullptr;
}
PBOverrideStatus overrideStatus = PBOverrideStatusFromLoadContext(aSerialized);
HttpChannelParent *p = new HttpChannelParent(aBrowser, loadContext, overrideStatus);
p->AddRef();
return p;
}
@ -51,9 +163,20 @@ NeckoParent::DeallocPHttpChannel(PHttpChannelParent* channel)
}
PFTPChannelParent*
NeckoParent::AllocPFTPChannel()
NeckoParent::AllocPFTPChannel(PBrowserParent* aBrowser,
const SerializedLoadContext& aSerialized)
{
FTPChannelParent *p = new FTPChannelParent();
nsCOMPtr<nsILoadContext> loadContext;
const char *error = CreateChannelLoadContext(aBrowser, aSerialized,
loadContext);
if (error) {
NS_WARNING(nsPrintfCString("NeckoParent::AllocPFTPChannel: "
"FATAL error: %s: KILLING CHILD PROCESS\n",
error).get());
return nullptr;
}
PBOverrideStatus overrideStatus = PBOverrideStatusFromLoadContext(aSerialized);
FTPChannelParent *p = new FTPChannelParent(loadContext, overrideStatus);
p->AddRef();
return p;
}
@ -96,10 +219,23 @@ NeckoParent::DeallocPWyciwygChannel(PWyciwygChannelParent* channel)
}
PWebSocketParent*
NeckoParent::AllocPWebSocket(PBrowserParent* browser)
NeckoParent::AllocPWebSocket(PBrowserParent* browser,
const SerializedLoadContext& serialized)
{
nsCOMPtr<nsILoadContext> loadContext;
const char *error = CreateChannelLoadContext(browser, serialized,
loadContext);
if (error) {
NS_WARNING(nsPrintfCString("NeckoParent::AllocPWebSocket: "
"FATAL error: %s: KILLING CHILD PROCESS\n",
error).get());
return nullptr;
}
TabParent* tabParent = static_cast<TabParent*>(browser);
WebSocketChannelParent* p = new WebSocketChannelParent(tabParent);
PBOverrideStatus overrideStatus = PBOverrideStatusFromLoadContext(serialized);
WebSocketChannelParent* p = new WebSocketChannelParent(tabParent, loadContext,
overrideStatus);
p->AddRef();
return p;
}

View File

@ -14,6 +14,13 @@
namespace mozilla {
namespace net {
// Used to override channel Private Browsing status if needed.
enum PBOverrideStatus {
kPBOverride_Unset = 0,
kPBOverride_Private,
kPBOverride_NotPrivate
};
// Header file contents
class NeckoParent :
public PNeckoParent
@ -22,6 +29,27 @@ public:
NeckoParent();
virtual ~NeckoParent();
MOZ_WARN_UNUSED_RESULT
static const char *
GetValidatedAppInfo(const SerializedLoadContext& aSerialized,
PBrowserParent* aBrowser,
uint32_t* aAppId,
bool* aInBrowserElement);
/*
* Creates LoadContext for parent-side of an e10s channel.
*
* Values from PBrowserParent are more secure, and override those set in
* SerializedLoadContext.
*
* Returns null if successful, or an error string if failed.
*/
MOZ_WARN_UNUSED_RESULT
static const char*
CreateChannelLoadContext(PBrowserParent* aBrowser,
const SerializedLoadContext& aSerialized,
nsCOMPtr<nsILoadContext> &aResult);
protected:
virtual PHttpChannelParent* AllocPHttpChannel(PBrowserParent*,
const SerializedLoadContext&);
@ -30,9 +58,11 @@ protected:
virtual bool DeallocPCookieService(PCookieServiceParent*);
virtual PWyciwygChannelParent* AllocPWyciwygChannel();
virtual bool DeallocPWyciwygChannel(PWyciwygChannelParent*);
virtual PFTPChannelParent* AllocPFTPChannel();
virtual PFTPChannelParent* AllocPFTPChannel(PBrowserParent* aBrowser,
const SerializedLoadContext& aSerialized);
virtual bool DeallocPFTPChannel(PFTPChannelParent*);
virtual PWebSocketParent* AllocPWebSocket(PBrowserParent* browser);
virtual PWebSocketParent* AllocPWebSocket(PBrowserParent* browser,
const SerializedLoadContext& aSerialized);
virtual bool DeallocPWebSocket(PWebSocketParent*);
virtual PTCPSocketParent* AllocPTCPSocket(const nsString& aHost,
const uint16_t& aPort,
@ -51,7 +81,6 @@ protected:
virtual bool RecvCancelHTMLDNSPrefetch(const nsString& hostname,
const uint16_t& flags,
const nsresult& reason);
};
} // namespace net

View File

@ -40,8 +40,8 @@ parent:
PHttpChannel(nullable PBrowser browser,
SerializedLoadContext loadContext);
PWyciwygChannel();
PFTPChannel();
PWebSocket(PBrowser browser);
PFTPChannel(PBrowser browser, SerializedLoadContext loadContext);
PWebSocket(PBrowser browser, SerializedLoadContext loadContext);
PTCPSocket(nsString host, uint16_t port, bool useSSL, nsString binaryType,
nullable PBrowser browser);

View File

@ -7,8 +7,9 @@
#include "mozilla/net/NeckoChild.h"
#include "mozilla/net/FTPChannelChild.h"
#include "mozilla/dom/TabChild.h"
#include "nsFtpProtocolHandler.h"
#include "nsITabChild.h"
#include "nsStringStream.h"
#include "nsMimeTypes.h"
#include "nsNetUtil.h"
@ -155,8 +156,18 @@ FTPChannelChild::AsyncOpen(::nsIStreamListener* listener, nsISupports* aContext)
if (NS_FAILED(rv))
return rv;
mozilla::dom::TabChild* tabChild = nullptr;
nsCOMPtr<nsITabChild> iTabChild;
NS_QueryNotificationCallbacks(mCallbacks, mLoadGroup,
NS_GET_IID(nsITabChild),
getter_AddRefs(iTabChild));
GetCallback(iTabChild);
if (iTabChild) {
tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get());
}
// FIXME: like bug 558623, merge constructor+SendAsyncOpen into 1 IPC msg
gNeckoChild->SendPFTPChannelConstructor(this);
gNeckoChild->SendPFTPChannelConstructor(this, tabChild, IPC::SerializedLoadContext(this));
mListener = listener;
mListenerContext = aContext;
@ -170,8 +181,7 @@ FTPChannelChild::AsyncOpen(::nsIStreamListener* listener, nsISupports* aContext)
OptionalInputStreamParams uploadStream;
SerializeInputStream(mUploadStream, uploadStream);
SendAsyncOpen(uri, mStartPos, mEntityID, uploadStream,
IPC::SerializedLoadContext(this));
SendAsyncOpen(uri, mStartPos, mEntityID, uploadStream);
// The socket transport layer in the chrome process now has a logical ref to
// us until OnStopRequest is called.
@ -509,11 +519,22 @@ FTPChannelChild::Resume()
NS_IMETHODIMP
FTPChannelChild::ConnectParent(uint32_t id)
{
mozilla::dom::TabChild* tabChild = nullptr;
nsCOMPtr<nsITabChild> iTabChild;
NS_QueryNotificationCallbacks(mCallbacks, mLoadGroup,
NS_GET_IID(nsITabChild),
getter_AddRefs(iTabChild));
GetCallback(iTabChild);
if (iTabChild) {
tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get());
}
// The socket transport in the chrome process now holds a logical ref to us
// until OnStopRequest, or we do a redirect, or we hit an IPDL error.
AddIPDLReference();
if (!gNeckoChild->SendPFTPChannelConstructor(this))
if (!gNeckoChild->SendPFTPChannelConstructor(this, tabChild,
IPC::SerializedLoadContext(this)))
return NS_ERROR_FAILURE;
if (!SendConnectChannel(id))

View File

@ -23,8 +23,10 @@ using namespace mozilla::ipc;
namespace mozilla {
namespace net {
FTPChannelParent::FTPChannelParent()
FTPChannelParent::FTPChannelParent(nsILoadContext* aLoadContext, PBOverrideStatus aOverrideStatus)
: mIPCClosed(false)
, mLoadContext(aLoadContext)
, mPBOverride(aOverrideStatus)
{
nsIProtocolHandler* handler;
CallGetService(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ftp", &handler);
@ -62,8 +64,7 @@ bool
FTPChannelParent::RecvAsyncOpen(const URIParams& aURI,
const uint64_t& aStartPos,
const nsCString& aEntityID,
const OptionalInputStreamParams& aUploadStream,
const IPC::SerializedLoadContext& loadContext)
const OptionalInputStreamParams& aUploadStream)
{
nsCOMPtr<nsIURI> uri = DeserializeURI(aURI);
if (!uri)
@ -87,7 +88,11 @@ FTPChannelParent::RecvAsyncOpen(const URIParams& aURI,
return SendFailedAsyncOpen(rv);
mChannel = static_cast<nsFtpChannel*>(chan.get());
if (mPBOverride != kPBOverride_Unset) {
mChannel->SetPrivate(mPBOverride == kPBOverride_Private ? true : false);
}
nsCOMPtr<nsIInputStream> upload = DeserializeInputStream(aUploadStream);
if (upload) {
// contentType and contentLength are ignored
@ -100,14 +105,6 @@ FTPChannelParent::RecvAsyncOpen(const URIParams& aURI,
if (NS_FAILED(rv))
return SendFailedAsyncOpen(rv);
if (loadContext.IsNotNull())
mLoadContext = new LoadContext(loadContext);
else if (loadContext.IsPrivateBitValid()) {
nsCOMPtr<nsIPrivateBrowsingChannel> pbChannel = do_QueryInterface(chan);
if (pbChannel)
pbChannel->SetPrivate(loadContext.mUsePrivateBrowsing);
}
rv = mChannel->AsyncOpen(this, nullptr);
if (NS_FAILED(rv))
return SendFailedAsyncOpen(rv);

View File

@ -10,6 +10,7 @@
#include "mozilla/net/PFTPChannelParent.h"
#include "mozilla/net/NeckoCommon.h"
#include "mozilla/net/NeckoParent.h"
#include "nsIParentChannel.h"
#include "nsIInterfaceRequestor.h"
#include "nsILoadContext.h"
@ -30,15 +31,14 @@ public:
NS_DECL_NSIPARENTCHANNEL
NS_DECL_NSIINTERFACEREQUESTOR
FTPChannelParent();
FTPChannelParent(nsILoadContext* aLoadContext, PBOverrideStatus aOverrideStatus);
virtual ~FTPChannelParent();
protected:
virtual bool RecvAsyncOpen(const URIParams& uri,
const uint64_t& startPos,
const nsCString& entityID,
const OptionalInputStreamParams& uploadStream,
const IPC::SerializedLoadContext& loadContext) MOZ_OVERRIDE;
const OptionalInputStreamParams& uploadStream) MOZ_OVERRIDE;
virtual bool RecvConnectChannel(const uint32_t& channelId) MOZ_OVERRIDE;
virtual bool RecvCancel(const nsresult& status) MOZ_OVERRIDE;
virtual bool RecvSuspend() MOZ_OVERRIDE;
@ -51,6 +51,8 @@ protected:
bool mIPCClosed;
nsCOMPtr<nsILoadContext> mLoadContext;
PBOverrideStatus mPBOverride;
};
} // namespace net

View File

@ -13,7 +13,6 @@ include protocol PBlob; //FIXME: bug #792908
include "SerializedLoadContext.h";
using IPC::SerializedLoadContext;
using PRTime;
namespace mozilla {
@ -29,8 +28,7 @@ parent:
AsyncOpen(URIParams uri,
uint64_t startPos,
nsCString entityID,
OptionalInputStreamParams uploadStream,
SerializedLoadContext loadContext);
OptionalInputStreamParams uploadStream);
ConnectChannel(uint32_t channelId);
Cancel(nsresult status);

View File

@ -34,7 +34,8 @@ namespace mozilla {
namespace net {
HttpChannelParent::HttpChannelParent(PBrowserParent* iframeEmbedding,
const IPC::SerializedLoadContext& loadContext)
nsILoadContext* aLoadContext,
PBOverrideStatus aOverrideStatus)
: mIPCClosed(false)
, mStoredStatus(NS_OK)
, mStoredProgress(0)
@ -42,7 +43,8 @@ HttpChannelParent::HttpChannelParent(PBrowserParent* iframeEmbedding,
, mSentRedirect1Begin(false)
, mSentRedirect1BeginFailed(false)
, mReceivedRedirect2Verify(false)
, mPBOverride(kPBOverride_Unset)
, mPBOverride(aOverrideStatus)
, mLoadContext(aLoadContext)
{
// Ensure gHttpHandler is initialized: we need the atom table up and running.
nsIHttpProtocolHandler* handler;
@ -50,18 +52,6 @@ HttpChannelParent::HttpChannelParent(PBrowserParent* iframeEmbedding,
NS_ASSERTION(handler, "no http handler");
mTabParent = static_cast<mozilla::dom::TabParent*>(iframeEmbedding);
if (loadContext.IsNotNull()) {
if (mTabParent) {
mLoadContext = new LoadContext(loadContext, mTabParent->GetOwnerElement());
} else {
mLoadContext = new LoadContext(loadContext);
}
} else if (loadContext.IsPrivateBitValid()) {
// Don't have channel yet: override PB status after we create it.
mPBOverride = loadContext.mUsePrivateBrowsing ? kPBOverride_Private
: kPBOverride_NotPrivate;
}
}
HttpChannelParent::~HttpChannelParent()

View File

@ -12,6 +12,7 @@
#include "mozilla/dom/PBrowserParent.h"
#include "mozilla/net/PHttpChannelParent.h"
#include "mozilla/net/NeckoCommon.h"
#include "mozilla/net/NeckoParent.h"
#include "nsIParentRedirectingChannel.h"
#include "nsIProgressEventSink.h"
#include "nsHttpChannel.h"
@ -44,7 +45,8 @@ public:
NS_DECL_NSIINTERFACEREQUESTOR
HttpChannelParent(mozilla::dom::PBrowserParent* iframeEmbedding,
const IPC::SerializedLoadContext& loadContext);
nsILoadContext* aLoadContext,
PBOverrideStatus aStatus);
virtual ~HttpChannelParent();
protected:
@ -108,12 +110,6 @@ private:
bool mSentRedirect1BeginFailed : 1;
bool mReceivedRedirect2Verify : 1;
// Used to override channel Private Browsing status if needed.
enum PBOverrideStatus {
kPBOverride_Unset = 0,
kPBOverride_Private,
kPBOverride_NotPrivate
};
PBOverrideStatus mPBOverride;
nsCOMPtr<nsILoadContext> mLoadContext;

View File

@ -27,8 +27,7 @@ parent:
AsyncOpen(URIParams aURI,
nsCString aOrigin,
nsCString aProtocol,
bool aSecure,
SerializedLoadContext loadContext);
bool aSecure);
Close(uint16_t code, nsCString reason);
SendMsg(nsCString aMsg);
SendBinaryMsg(nsCString aMsg);

View File

@ -338,9 +338,9 @@ WebSocketChannelChild::AsyncOpen(nsIURI *aURI,
// Corresponding release in DeallocPWebSocket
AddIPDLReference();
gNeckoChild->SendPWebSocketConstructor(this, tabChild);
if (!SendAsyncOpen(uri, nsCString(aOrigin), mProtocol, mEncrypted,
IPC::SerializedLoadContext(this)))
gNeckoChild->SendPWebSocketConstructor(this, tabChild,
IPC::SerializedLoadContext(this));
if (!SendAsyncOpen(uri, nsCString(aOrigin), mProtocol, mEncrypted))
return NS_ERROR_UNEXPECTED;
mOriginalURI = aURI;

View File

@ -7,7 +7,6 @@
#include "WebSocketLog.h"
#include "WebSocketChannelParent.h"
#include "nsIAuthPromptProvider.h"
#include "mozilla/LoadContext.h"
#include "mozilla/ipc/InputStreamUtils.h"
#include "mozilla/ipc/URIUtils.h"
@ -20,10 +19,15 @@ NS_IMPL_THREADSAFE_ISUPPORTS2(WebSocketChannelParent,
nsIWebSocketListener,
nsIInterfaceRequestor)
WebSocketChannelParent::WebSocketChannelParent(nsIAuthPromptProvider* aAuthProvider)
WebSocketChannelParent::WebSocketChannelParent(nsIAuthPromptProvider* aAuthProvider,
nsILoadContext* aLoadContext,
PBOverrideStatus aOverrideStatus)
: mAuthProvider(aAuthProvider)
, mLoadContext(aLoadContext)
, mIPCOpen(true)
{
// Websocket channels can't have a private browsing override
MOZ_ASSERT_IF(!aLoadContext, aOverrideStatus == kPBOverride_Unset);
#if defined(PR_LOGGING)
if (!webSocketLog)
webSocketLog = PR_NewLogModule("nsWebSocket");
@ -47,8 +51,7 @@ bool
WebSocketChannelParent::RecvAsyncOpen(const URIParams& aURI,
const nsCString& aOrigin,
const nsCString& aProtocol,
const bool& aSecure,
const IPC::SerializedLoadContext& loadContext)
const bool& aSecure)
{
LOG(("WebSocketChannelParent::RecvAsyncOpen() %p\n", this));
@ -65,14 +68,6 @@ WebSocketChannelParent::RecvAsyncOpen(const URIParams& aURI,
if (NS_FAILED(rv))
goto fail;
if (loadContext.IsNotNull())
mLoadContext = new LoadContext(loadContext);
#ifdef DEBUG
else
// websocket channels cannot have a private bit override
MOZ_ASSERT(!loadContext.IsPrivateBitValid());
#endif
rv = mChannel->SetNotificationCallbacks(this);
if (NS_FAILED(rv))
goto fail;

View File

@ -8,6 +8,7 @@
#define mozilla_net_WebSocketChannelParent_h
#include "mozilla/net/PWebSocketParent.h"
#include "mozilla/net/NeckoParent.h"
#include "nsIInterfaceRequestor.h"
#include "nsIWebSocketListener.h"
#include "nsIWebSocketChannel.h"
@ -29,14 +30,15 @@ class WebSocketChannelParent : public PWebSocketParent,
NS_DECL_NSIWEBSOCKETLISTENER
NS_DECL_NSIINTERFACEREQUESTOR
WebSocketChannelParent(nsIAuthPromptProvider* aAuthProvider);
WebSocketChannelParent(nsIAuthPromptProvider* aAuthProvider,
nsILoadContext* aLoadContext,
PBOverrideStatus aOverrideStatus);
private:
bool RecvAsyncOpen(const URIParams& aURI,
const nsCString& aOrigin,
const nsCString& aProtocol,
const bool& aSecure,
const IPC::SerializedLoadContext& loadContext);
const bool& aSecure);
bool RecvClose(const uint16_t & code, const nsCString & reason);
bool RecvSendMsg(const nsCString& aMsg);
bool RecvSendBinaryMsg(const nsCString& aMsg);

View File

@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
include protocol PNecko;
include protocol PBrowser;
include URIParams;
include "SerializedLoadContext.h";
@ -23,7 +24,8 @@ parent:
Init(URIParams uri);
AsyncOpen(URIParams originalURI,
uint32_t loadFlags,
SerializedLoadContext loadContext);
SerializedLoadContext loadContext,
PBrowser browser);
// methods corresponding to those of nsIWyciwygChannel
WriteToCacheEntry(nsString data);

View File

@ -6,6 +6,7 @@
#include "mozilla/net/NeckoChild.h"
#include "WyciwygChannelChild.h"
#include "mozilla/dom/TabChild.h"
#include "nsCharsetSource.h"
#include "nsStringStream.h"
@ -592,7 +593,16 @@ WyciwygChannelChild::AsyncOpen(nsIStreamListener *aListener, nsISupports *aConte
URIParams originalURI;
SerializeURI(mOriginalURI, originalURI);
SendAsyncOpen(originalURI, mLoadFlags, IPC::SerializedLoadContext(this));
mozilla::dom::TabChild* tabChild = nullptr;
nsCOMPtr<nsITabChild> iTabChild;
NS_QueryNotificationCallbacks(mCallbacks, mLoadGroup,
NS_GET_IID(nsITabChild),
getter_AddRefs(iTabChild));
if (iTabChild) {
tabChild = static_cast<mozilla::dom::TabChild*>(iTabChild.get());
}
SendAsyncOpen(originalURI, mLoadFlags, IPC::SerializedLoadContext(this), tabChild);
mState = WCC_OPENED;

View File

@ -11,8 +11,8 @@
#include "nsCharsetSource.h"
#include "nsISerializable.h"
#include "nsSerializationHelper.h"
#include "mozilla/LoadContext.h"
#include "mozilla/ipc/URIUtils.h"
#include "mozilla/net/NeckoParent.h"
using namespace mozilla::ipc;
@ -86,7 +86,8 @@ WyciwygChannelParent::RecvInit(const URIParams& aURI)
bool
WyciwygChannelParent::RecvAsyncOpen(const URIParams& aOriginal,
const uint32_t& aLoadFlags,
const IPC::SerializedLoadContext& loadContext)
const IPC::SerializedLoadContext& loadContext,
PBrowserParent* aParent)
{
nsCOMPtr<nsIURI> original = DeserializeURI(aOriginal);
if (!original)
@ -107,9 +108,15 @@ WyciwygChannelParent::RecvAsyncOpen(const URIParams& aOriginal,
if (NS_FAILED(rv))
return SendCancelEarly(rv);
if (loadContext.IsNotNull())
mLoadContext = new LoadContext(loadContext);
else if (loadContext.IsPrivateBitValid()) {
const char* error = NeckoParent::CreateChannelLoadContext(aParent, loadContext,
mLoadContext);
if (error) {
NS_WARNING(nsPrintfCString("WyciwygChannelParent::RecvAsyncOpen: error: %s\n",
error).get());
return false;
}
if (!mLoadContext && loadContext.IsPrivateBitValid()) {
nsCOMPtr<nsIPrivateBrowsingChannel> pbChannel = do_QueryInterface(mChannel);
if (pbChannel)
pbChannel->SetPrivate(loadContext.mUsePrivateBrowsing);

View File

@ -14,6 +14,10 @@
#include "nsILoadContext.h"
namespace mozilla {
namespace dom {
class PBrowserParent;
}
namespace net {
class WyciwygChannelParent : public PWyciwygChannelParent
@ -33,7 +37,8 @@ protected:
virtual bool RecvInit(const URIParams& uri);
virtual bool RecvAsyncOpen(const URIParams& original,
const uint32_t& loadFlags,
const IPC::SerializedLoadContext& loadContext);
const IPC::SerializedLoadContext& loadContext,
PBrowserParent* parent);
virtual bool RecvWriteToCacheEntry(const nsString& data);
virtual bool RecvCloseCacheEntry(const nsresult& reason);
virtual bool RecvSetCharsetAndSource(const int32_t& source,

View File

@ -35,16 +35,27 @@ let (ios = Components.classes["@mozilla.org/network/io-service;1"]
ios.offline = false;
}
// Disable IPv6 lookups for 'localhost' on windows.
// Determine if we're running on parent or child
let runningInParent = true;
try {
if ("@mozilla.org/windows-registry-key;1" in Components.classes) {
let processType = Components.classes["@mozilla.org/xre/runtime;1"].
getService(Components.interfaces.nsIXULRuntime).processType;
if (processType == Components.interfaces.nsIXULRuntime.PROCESS_TYPE_DEFAULT) {
let (prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)) {
prefs.setCharPref("network.dns.ipv4OnlyDomains", "localhost");
}
runningInParent = Components.classes["@mozilla.org/xre/runtime;1"].
getService(Components.interfaces.nsIXULRuntime).processType
== Components.interfaces.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
}
catch (e) { }
try {
if (runningInParent) {
let prefs = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
// disable necko IPC security checks for xpcshell, as they lack the
// docshells needed to pass them
prefs.setBoolPref("network.disable.ipc.security", true);
// Disable IPv6 lookups for 'localhost' on windows.
if ("@mozilla.org/windows-registry-key;1" in Components.classes) {
prefs.setCharPref("network.dns.ipv4OnlyDomains", "localhost");
}
}
}
@ -56,9 +67,7 @@ catch (e) { }
// Note that if we're in a child process, we don't want to init the
// crashreporter component.
try { // nsIXULRuntime is not available in some configurations.
let processType = Components.classes["@mozilla.org/xre/runtime;1"].
getService(Components.interfaces.nsIXULRuntime).processType;
if (processType == Components.interfaces.nsIXULRuntime.PROCESS_TYPE_DEFAULT &&
if (runningInParent &&
"@mozilla.org/toolkit/crash-reporter;1" in Components.classes) {
// Remember to update </toolkit/crashreporter/test/unit/test_crashreporter.js>
// too if you change this initial setting.
@ -788,11 +797,7 @@ function do_get_profile() {
function do_load_child_test_harness()
{
// Make sure this isn't called from child process
var runtime = Components.classes["@mozilla.org/xre/app-info;1"]
.getService(Components.interfaces.nsIXULRuntime);
if (runtime.processType !=
Components.interfaces.nsIXULRuntime.PROCESS_TYPE_DEFAULT)
{
if (!runningInParent) {
do_throw("run_test_in_child cannot be called from child!");
}

View File

@ -435,7 +435,6 @@ OfflineCacheUpdateChild::Schedule()
// a reference to us. Will be released in RecvFinish() that identifies
// the work has been done.
child->SendPOfflineCacheUpdateConstructor(this, manifestURI, documentURI,
mInBrowser, mAppID,
stickDocument);
mIPCActivated = true;

View File

@ -5,12 +5,14 @@
#include "OfflineCacheUpdateParent.h"
#include "mozilla/dom/TabParent.h"
#include "mozilla/ipc/URIUtils.h"
#include "nsOfflineCacheUpdate.h"
#include "nsIApplicationCache.h"
#include "nsNetUtil.h"
using namespace mozilla::ipc;
using mozilla::dom::TabParent;
#if defined(PR_LOGGING)
//
@ -43,8 +45,11 @@ NS_IMPL_ISUPPORTS2(OfflineCacheUpdateParent,
// OfflineCacheUpdateParent <public>
//-----------------------------------------------------------------------------
OfflineCacheUpdateParent::OfflineCacheUpdateParent()
OfflineCacheUpdateParent::OfflineCacheUpdateParent(uint32_t aAppId,
bool aIsInBrowser)
: mIPCClosed(false)
, mIsInBrowserElement(aIsInBrowser)
, mAppId(aAppId)
{
// Make sure the service has been initialized
nsOfflineCacheUpdateService* service =
@ -69,8 +74,6 @@ OfflineCacheUpdateParent::ActorDestroy(ActorDestroyReason why)
nsresult
OfflineCacheUpdateParent::Schedule(const URIParams& aManifestURI,
const URIParams& aDocumentURI,
const bool& isInBrowserElement,
const uint32_t& appId,
const bool& stickDocument)
{
LOG(("OfflineCacheUpdateParent::RecvSchedule [%p]", this));
@ -100,7 +103,7 @@ OfflineCacheUpdateParent::Schedule(const URIParams& aManifestURI,
if (!NS_SecurityCompareURIs(manifestURI, documentURI, false))
return NS_ERROR_DOM_SECURITY_ERR;
service->FindUpdate(manifestURI, appId, isInBrowserElement,
service->FindUpdate(manifestURI, mAppId, mIsInBrowserElement,
getter_AddRefs(update));
if (!update) {
update = new nsOfflineCacheUpdate();
@ -108,7 +111,7 @@ OfflineCacheUpdateParent::Schedule(const URIParams& aManifestURI,
// Leave aDocument argument null. Only glues and children keep
// document instances.
rv = update->Init(manifestURI, documentURI, nullptr, nullptr,
appId, isInBrowserElement);
mAppId, mIsInBrowserElement);
NS_ENSURE_SUCCESS(rv, rv);
rv = update->Schedule();

View File

@ -14,6 +14,10 @@
namespace mozilla {
namespace dom {
class TabParent;
}
namespace ipc {
class URIParams;
} // namespace ipc
@ -34,11 +38,9 @@ public:
nsresult
Schedule(const URIParams& manifestURI,
const URIParams& documentURI,
const bool& isInBrowserElement,
const uint32_t& appId,
const bool& stickDocument);
OfflineCacheUpdateParent();
OfflineCacheUpdateParent(uint32_t aAppId, bool aIsInBrowser);
~OfflineCacheUpdateParent();
virtual void ActorDestroy(ActorDestroyReason why);