1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "SocketProcessParent.h"
7 #include "SocketProcessLogging.h"
9 #include "AltServiceParent.h"
10 #include "CachePushChecker.h"
11 #include "HttpTransactionParent.h"
12 #include "SocketProcessHost.h"
13 #include "TLSClientAuthCertSelection.h"
14 #include "mozilla/Components.h"
15 #include "mozilla/dom/MemoryReportRequest.h"
16 #include "mozilla/FOGIPC.h"
17 #include "mozilla/net/DNSRequestParent.h"
18 #include "mozilla/net/ProxyConfigLookupParent.h"
19 #include "mozilla/net/SocketProcessBackgroundParent.h"
20 #include "mozilla/RemoteLazyInputStreamParent.h"
21 #include "mozilla/Telemetry.h"
22 #include "mozilla/TelemetryIPC.h"
23 #include "nsIConsoleService.h"
24 #include "nsIHttpActivityObserver.h"
25 #include "nsIObserverService.h"
26 #include "nsNSSCertificate.h"
27 #include "nsNSSComponent.h"
28 #include "nsIOService.h"
29 #include "nsHttpHandler.h"
30 #include "nsHttpConnectionInfo.h"
33 # include "mozilla/dom/ContentProcessManager.h"
34 # include "mozilla/dom/BrowserParent.h"
35 # include "mozilla/net/WebrtcTCPSocketParent.h"
37 #if defined(MOZ_WIDGET_ANDROID)
38 # include "mozilla/java/GeckoProcessManagerWrappers.h"
39 # include "mozilla/java/GeckoProcessTypeWrappers.h"
40 #endif // defined(MOZ_WIDGET_ANDROID)
42 # include "mozilla/WinDllServices.h"
48 static SocketProcessParent
* sSocketProcessParent
;
50 SocketProcessParent::SocketProcessParent(SocketProcessHost
* aHost
)
52 MOZ_ASSERT(NS_IsMainThread());
55 MOZ_COUNT_CTOR(SocketProcessParent
);
56 sSocketProcessParent
= this;
59 SocketProcessParent::~SocketProcessParent() {
60 MOZ_ASSERT(NS_IsMainThread());
62 MOZ_COUNT_DTOR(SocketProcessParent
);
63 sSocketProcessParent
= nullptr;
67 SocketProcessParent
* SocketProcessParent::GetSingleton() {
68 MOZ_ASSERT(NS_IsMainThread());
70 return sSocketProcessParent
;
73 void SocketProcessParent::ActorDestroy(ActorDestroyReason aWhy
) {
74 #if defined(MOZ_WIDGET_ANDROID)
75 nsCOMPtr
<nsIEventTarget
> launcherThread(ipc::GetIPCLauncher());
76 MOZ_ASSERT(launcherThread
);
78 auto procType
= java::GeckoProcessType::SOCKET();
80 java::GeckoProcessManager::Selector::New(procType
, OtherPid());
82 launcherThread
->Dispatch(NS_NewRunnableFunction(
83 "SocketProcessParent::ActorDestroy",
84 [selector
= java::GeckoProcessManager::Selector::GlobalRef(selector
)]() {
85 java::GeckoProcessManager::ShutdownProcess(selector
);
87 #endif // defined(MOZ_WIDGET_ANDROID)
89 if (aWhy
== AbnormalShutdown
) {
90 GenerateCrashReport(OtherPid());
91 MaybeTerminateProcess();
95 mHost
->OnChannelClosed();
99 bool SocketProcessParent::SendRequestMemoryReport(
100 const uint32_t& aGeneration
, const bool& aAnonymize
,
101 const bool& aMinimizeMemoryUsage
,
102 const Maybe
<ipc::FileDescriptor
>& aDMDFile
) {
103 mMemoryReportRequest
= MakeUnique
<dom::MemoryReportRequestHost
>(aGeneration
);
105 PSocketProcessParent::SendRequestMemoryReport(
106 aGeneration
, aAnonymize
, aMinimizeMemoryUsage
, aDMDFile
,
107 [&](const uint32_t& aGeneration2
) {
108 MOZ_ASSERT(gIOService
);
109 if (!gIOService
->SocketProcess()) {
112 SocketProcessParent
* actor
= gIOService
->SocketProcess()->GetActor();
116 if (actor
->mMemoryReportRequest
) {
117 actor
->mMemoryReportRequest
->Finish(aGeneration2
);
118 actor
->mMemoryReportRequest
= nullptr;
121 [&](mozilla::ipc::ResponseRejectReason
) {
122 MOZ_ASSERT(gIOService
);
123 if (!gIOService
->SocketProcess()) {
126 SocketProcessParent
* actor
= gIOService
->SocketProcess()->GetActor();
130 actor
->mMemoryReportRequest
= nullptr;
136 mozilla::ipc::IPCResult
SocketProcessParent::RecvAddMemoryReport(
137 const MemoryReport
& aReport
) {
138 if (mMemoryReportRequest
) {
139 mMemoryReportRequest
->RecvReport(aReport
);
144 mozilla::ipc::IPCResult
SocketProcessParent::RecvAccumulateChildHistograms(
145 nsTArray
<HistogramAccumulation
>&& aAccumulations
) {
146 TelemetryIPC::AccumulateChildHistograms(Telemetry::ProcessID::Socket
,
151 mozilla::ipc::IPCResult
SocketProcessParent::RecvAccumulateChildKeyedHistograms(
152 nsTArray
<KeyedHistogramAccumulation
>&& aAccumulations
) {
153 TelemetryIPC::AccumulateChildKeyedHistograms(Telemetry::ProcessID::Socket
,
158 mozilla::ipc::IPCResult
SocketProcessParent::RecvUpdateChildScalars(
159 nsTArray
<ScalarAction
>&& aScalarActions
) {
160 TelemetryIPC::UpdateChildScalars(Telemetry::ProcessID::Socket
,
165 mozilla::ipc::IPCResult
SocketProcessParent::RecvUpdateChildKeyedScalars(
166 nsTArray
<KeyedScalarAction
>&& aScalarActions
) {
167 TelemetryIPC::UpdateChildKeyedScalars(Telemetry::ProcessID::Socket
,
172 mozilla::ipc::IPCResult
SocketProcessParent::RecvRecordChildEvents(
173 nsTArray
<mozilla::Telemetry::ChildEventData
>&& aEvents
) {
174 TelemetryIPC::RecordChildEvents(Telemetry::ProcessID::Socket
, aEvents
);
178 mozilla::ipc::IPCResult
SocketProcessParent::RecvRecordDiscardedData(
179 const mozilla::Telemetry::DiscardedData
& aDiscardedData
) {
180 TelemetryIPC::RecordDiscardedData(Telemetry::ProcessID::Socket
,
185 PWebrtcTCPSocketParent
* SocketProcessParent::AllocPWebrtcTCPSocketParent(
186 const Maybe
<TabId
>& aTabId
) {
188 WebrtcTCPSocketParent
* parent
= new WebrtcTCPSocketParent(aTabId
);
196 bool SocketProcessParent::DeallocPWebrtcTCPSocketParent(
197 PWebrtcTCPSocketParent
* aActor
) {
199 WebrtcTCPSocketParent
* parent
= static_cast<WebrtcTCPSocketParent
*>(aActor
);
205 already_AddRefed
<PDNSRequestParent
> SocketProcessParent::AllocPDNSRequestParent(
206 const nsACString
& aHost
, const nsACString
& aTrrServer
, const int32_t& port
,
207 const uint16_t& aType
, const OriginAttributes
& aOriginAttributes
,
208 const nsIDNSService::DNSFlags
& aFlags
) {
209 RefPtr
<DNSRequestHandler
> handler
= new DNSRequestHandler();
210 RefPtr
<DNSRequestParent
> actor
= new DNSRequestParent(handler
);
211 return actor
.forget();
214 mozilla::ipc::IPCResult
SocketProcessParent::RecvPDNSRequestConstructor(
215 PDNSRequestParent
* aActor
, const nsACString
& aHost
,
216 const nsACString
& aTrrServer
, const int32_t& port
, const uint16_t& aType
,
217 const OriginAttributes
& aOriginAttributes
,
218 const nsIDNSService::DNSFlags
& aFlags
) {
219 RefPtr
<DNSRequestParent
> actor
= static_cast<DNSRequestParent
*>(aActor
);
220 RefPtr
<DNSRequestHandler
> handler
=
221 actor
->GetDNSRequest()->AsDNSRequestHandler();
222 handler
->DoAsyncResolve(aHost
, aTrrServer
, port
, aType
, aOriginAttributes
,
227 mozilla::ipc::IPCResult
SocketProcessParent::RecvObserveHttpActivity(
228 const HttpActivityArgs
& aArgs
, const uint32_t& aActivityType
,
229 const uint32_t& aActivitySubtype
, const PRTime
& aTimestamp
,
230 const uint64_t& aExtraSizeData
, const nsACString
& aExtraStringData
) {
231 nsCOMPtr
<nsIHttpActivityDistributor
> activityDistributor
=
232 components::HttpActivityDistributor::Service();
233 MOZ_ASSERT(activityDistributor
);
235 Unused
<< activityDistributor
->ObserveActivityWithArgs(
236 aArgs
, aActivityType
, aActivitySubtype
, aTimestamp
, aExtraSizeData
,
241 mozilla::ipc::IPCResult
SocketProcessParent::RecvInitSocketBackground(
242 Endpoint
<PSocketProcessBackgroundParent
>&& aEndpoint
) {
243 if (!aEndpoint
.IsValid()) {
244 return IPC_FAIL(this, "Invalid endpoint");
247 nsCOMPtr
<nsISerialEventTarget
> transportQueue
;
248 if (NS_FAILED(NS_CreateBackgroundTaskQueue("SocketBackgroundParentQueue",
249 getter_AddRefs(transportQueue
)))) {
250 return IPC_FAIL(this, "NS_CreateBackgroundTaskQueue failed");
253 transportQueue
->Dispatch(
254 NS_NewRunnableFunction("BindSocketBackgroundParent",
255 [endpoint
= std::move(aEndpoint
)]() mutable {
256 RefPtr
<SocketProcessBackgroundParent
> parent
=
257 new SocketProcessBackgroundParent();
258 endpoint
.Bind(parent
);
263 already_AddRefed
<PAltServiceParent
>
264 SocketProcessParent::AllocPAltServiceParent() {
265 RefPtr
<AltServiceParent
> actor
= new AltServiceParent();
266 return actor
.forget();
269 already_AddRefed
<PProxyConfigLookupParent
>
270 SocketProcessParent::AllocPProxyConfigLookupParent(
271 nsIURI
* aURI
, const uint32_t& aProxyResolveFlags
) {
272 RefPtr
<ProxyConfigLookupParent
> actor
=
273 new ProxyConfigLookupParent(aURI
, aProxyResolveFlags
);
274 return actor
.forget();
277 mozilla::ipc::IPCResult
SocketProcessParent::RecvPProxyConfigLookupConstructor(
278 PProxyConfigLookupParent
* aActor
, nsIURI
* aURI
,
279 const uint32_t& aProxyResolveFlags
) {
280 static_cast<ProxyConfigLookupParent
*>(aActor
)->DoProxyLookup();
284 mozilla::ipc::IPCResult
SocketProcessParent::RecvCachePushCheck(
285 nsIURI
* aPushedURL
, OriginAttributes
&& aOriginAttributes
,
286 nsCString
&& aRequestString
, CachePushCheckResolver
&& aResolver
) {
287 RefPtr
<CachePushChecker
> checker
= new CachePushChecker(
288 aPushedURL
, aOriginAttributes
, aRequestString
, aResolver
);
289 if (NS_FAILED(checker
->DoCheck())) {
295 // To ensure that IPDL is finished before SocketParent gets deleted.
296 class DeferredDeleteSocketProcessParent
: public Runnable
{
298 explicit DeferredDeleteSocketProcessParent(
299 RefPtr
<SocketProcessParent
>&& aParent
)
300 : Runnable("net::DeferredDeleteSocketProcessParent"),
301 mParent(std::move(aParent
)) {}
303 NS_IMETHODIMP
Run() override
{ return NS_OK
; }
306 RefPtr
<SocketProcessParent
> mParent
;
310 void SocketProcessParent::Destroy(RefPtr
<SocketProcessParent
>&& aParent
) {
311 NS_DispatchToMainThread(
312 new DeferredDeleteSocketProcessParent(std::move(aParent
)));
315 mozilla::ipc::IPCResult
SocketProcessParent::RecvExcludeHttp2OrHttp3(
316 const HttpConnectionInfoCloneArgs
& aArgs
) {
317 RefPtr
<nsHttpConnectionInfo
> cinfo
=
318 nsHttpConnectionInfo::DeserializeHttpConnectionInfoCloneArgs(aArgs
);
320 MOZ_ASSERT(false, "failed to deserizlize http connection info");
324 if (cinfo
->IsHttp3()) {
325 gHttpHandler
->ExcludeHttp3(cinfo
);
327 gHttpHandler
->ExcludeHttp2(cinfo
);
332 mozilla::ipc::IPCResult
SocketProcessParent::RecvOnConsoleMessage(
333 const nsString
& aMessage
) {
334 nsCOMPtr
<nsIConsoleService
> consoleService
=
335 do_GetService(NS_CONSOLESERVICE_CONTRACTID
);
336 if (consoleService
) {
337 consoleService
->LogStringMessage(aMessage
.get());
342 mozilla::ipc::IPCResult
SocketProcessParent::RecvFOGData(ByteBuf
&& aBuf
) {
343 glean::FOGData(std::move(aBuf
));
348 mozilla::ipc::IPCResult
SocketProcessParent::RecvGetModulesTrust(
349 ModulePaths
&& aModPaths
, bool aRunAtNormalPriority
,
350 GetModulesTrustResolver
&& aResolver
) {
351 RefPtr
<DllServices
> dllSvc(DllServices::Get());
352 dllSvc
->GetModulesTrust(std::move(aModPaths
), aRunAtNormalPriority
)
354 GetMainThreadSerialEventTarget(), __func__
,
355 [aResolver
](ModulesMapResult
&& aResult
) {
356 aResolver(Some(ModulesMapResult(std::move(aResult
))));
358 [aResolver
](nsresult aRv
) { aResolver(Nothing()); });
361 #endif // defined(XP_WIN)
364 } // namespace mozilla