1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "services/network/socket_factory.h"
6 
7 #include <string>
8 #include <utility>
9 
10 #include "base/optional.h"
11 #include "mojo/public/cpp/bindings/type_converter.h"
12 #include "net/base/completion_once_callback.h"
13 #include "net/base/net_errors.h"
14 #include "net/cert/cert_verifier.h"
15 #include "net/cert/ct_policy_enforcer.h"
16 #include "net/cert/multi_log_ct_verifier.h"
17 #include "net/log/net_log.h"
18 #include "net/socket/client_socket_factory.h"
19 #include "net/socket/client_socket_handle.h"
20 #include "net/ssl/ssl_config.h"
21 #include "net/ssl/ssl_config_service.h"
22 #include "net/url_request/url_request_context.h"
23 #include "services/network/tls_client_socket.h"
24 #include "services/network/udp_socket.h"
25 
26 namespace network {
27 
SocketFactory(net::NetLog * net_log,net::URLRequestContext * url_request_context)28 SocketFactory::SocketFactory(net::NetLog* net_log,
29                              net::URLRequestContext* url_request_context)
30     : net_log_(net_log),
31       client_socket_factory_(nullptr),
32       tls_socket_factory_(url_request_context, nullptr /*http_context*/) {
33   if (url_request_context->GetNetworkSessionContext()) {
34     client_socket_factory_ =
35         url_request_context->GetNetworkSessionContext()->client_socket_factory;
36   }
37   if (!client_socket_factory_)
38     client_socket_factory_ = net::ClientSocketFactory::GetDefaultFactory();
39 }
40 
~SocketFactory()41 SocketFactory::~SocketFactory() {}
42 
CreateUDPSocket(mojo::PendingReceiver<mojom::UDPSocket> receiver,mojo::PendingRemote<mojom::UDPSocketListener> listener)43 void SocketFactory::CreateUDPSocket(
44     mojo::PendingReceiver<mojom::UDPSocket> receiver,
45     mojo::PendingRemote<mojom::UDPSocketListener> listener) {
46   udp_socket_receivers_.Add(
47       std::make_unique<UDPSocket>(std::move(listener), net_log_),
48       std::move(receiver));
49 }
50 
CreateTCPServerSocket(const net::IPEndPoint & local_addr,int backlog,const net::NetworkTrafficAnnotationTag & traffic_annotation,mojo::PendingReceiver<mojom::TCPServerSocket> receiver,mojom::NetworkContext::CreateTCPServerSocketCallback callback)51 void SocketFactory::CreateTCPServerSocket(
52     const net::IPEndPoint& local_addr,
53     int backlog,
54     const net::NetworkTrafficAnnotationTag& traffic_annotation,
55     mojo::PendingReceiver<mojom::TCPServerSocket> receiver,
56     mojom::NetworkContext::CreateTCPServerSocketCallback callback) {
57   auto socket =
58       std::make_unique<TCPServerSocket>(this, net_log_, traffic_annotation);
59   net::IPEndPoint local_addr_out;
60   int result = socket->Listen(local_addr, backlog, &local_addr_out);
61   if (result != net::OK) {
62     std::move(callback).Run(result, base::nullopt);
63     return;
64   }
65   tcp_server_socket_receivers_.Add(std::move(socket), std::move(receiver));
66   std::move(callback).Run(result, local_addr_out);
67 }
68 
CreateTCPConnectedSocket(const base::Optional<net::IPEndPoint> & local_addr,const net::AddressList & remote_addr_list,mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,const net::NetworkTrafficAnnotationTag & traffic_annotation,mojo::PendingReceiver<mojom::TCPConnectedSocket> receiver,mojo::PendingRemote<mojom::SocketObserver> observer,mojom::NetworkContext::CreateTCPConnectedSocketCallback callback)69 void SocketFactory::CreateTCPConnectedSocket(
70     const base::Optional<net::IPEndPoint>& local_addr,
71     const net::AddressList& remote_addr_list,
72     mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options,
73     const net::NetworkTrafficAnnotationTag& traffic_annotation,
74     mojo::PendingReceiver<mojom::TCPConnectedSocket> receiver,
75     mojo::PendingRemote<mojom::SocketObserver> observer,
76     mojom::NetworkContext::CreateTCPConnectedSocketCallback callback) {
77   auto socket = std::make_unique<TCPConnectedSocket>(
78       std::move(observer), net_log_, &tls_socket_factory_,
79       client_socket_factory_, traffic_annotation);
80   TCPConnectedSocket* socket_raw = socket.get();
81   tcp_connected_socket_receiver_.Add(std::move(socket), std::move(receiver));
82   socket_raw->Connect(local_addr, remote_addr_list,
83                       std::move(tcp_connected_socket_options),
84                       std::move(callback));
85 }
86 
CreateTCPBoundSocket(const net::IPEndPoint & local_addr,const net::NetworkTrafficAnnotationTag & traffic_annotation,mojo::PendingReceiver<mojom::TCPBoundSocket> receiver,mojom::NetworkContext::CreateTCPBoundSocketCallback callback)87 void SocketFactory::CreateTCPBoundSocket(
88     const net::IPEndPoint& local_addr,
89     const net::NetworkTrafficAnnotationTag& traffic_annotation,
90     mojo::PendingReceiver<mojom::TCPBoundSocket> receiver,
91     mojom::NetworkContext::CreateTCPBoundSocketCallback callback) {
92   auto socket =
93       std::make_unique<TCPBoundSocket>(this, net_log_, traffic_annotation);
94   net::IPEndPoint local_addr_out;
95   int result = socket->Bind(local_addr, &local_addr_out);
96   if (result != net::OK) {
97     std::move(callback).Run(result, base::nullopt);
98     return;
99   }
100   socket->set_id(
101       tcp_bound_socket_receivers_.Add(std::move(socket), std::move(receiver)));
102   std::move(callback).Run(result, local_addr_out);
103 }
104 
DestroyBoundSocket(mojo::ReceiverId bound_socket_id)105 void SocketFactory::DestroyBoundSocket(mojo::ReceiverId bound_socket_id) {
106   tcp_bound_socket_receivers_.Remove(bound_socket_id);
107 }
108 
OnBoundSocketListening(mojo::ReceiverId bound_socket_id,std::unique_ptr<TCPServerSocket> server_socket,mojo::PendingReceiver<mojom::TCPServerSocket> server_socket_receiver)109 void SocketFactory::OnBoundSocketListening(
110     mojo::ReceiverId bound_socket_id,
111     std::unique_ptr<TCPServerSocket> server_socket,
112     mojo::PendingReceiver<mojom::TCPServerSocket> server_socket_receiver) {
113   tcp_server_socket_receivers_.Add(std::move(server_socket),
114                                    std::move(server_socket_receiver));
115   tcp_bound_socket_receivers_.Remove(bound_socket_id);
116 }
117 
OnBoundSocketConnected(mojo::ReceiverId bound_socket_id,std::unique_ptr<TCPConnectedSocket> connected_socket,mojo::PendingReceiver<mojom::TCPConnectedSocket> connected_socket_receiver)118 void SocketFactory::OnBoundSocketConnected(
119     mojo::ReceiverId bound_socket_id,
120     std::unique_ptr<TCPConnectedSocket> connected_socket,
121     mojo::PendingReceiver<mojom::TCPConnectedSocket>
122         connected_socket_receiver) {
123   tcp_connected_socket_receiver_.Add(std::move(connected_socket),
124                                      std::move(connected_socket_receiver));
125   tcp_bound_socket_receivers_.Remove(bound_socket_id);
126 }
127 
OnAccept(std::unique_ptr<TCPConnectedSocket> socket,mojo::PendingReceiver<mojom::TCPConnectedSocket> receiver)128 void SocketFactory::OnAccept(
129     std::unique_ptr<TCPConnectedSocket> socket,
130     mojo::PendingReceiver<mojom::TCPConnectedSocket> receiver) {
131   tcp_connected_socket_receiver_.Add(std::move(socket), std::move(receiver));
132 }
133 
134 }  // namespace network
135