blob: 65484489b6bd1824cb92a0ca225c3b5ee7702a8a [file] [log] [blame]
Andreea Costinas942284d2020-01-28 16:28:40 +01001// Copyright 2020 The Chromium OS 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#ifndef SYSTEM_PROXY_SYSTEM_PROXY_ADAPTOR_H_
5#define SYSTEM_PROXY_SYSTEM_PROXY_ADAPTOR_H_
6
7#include <memory>
Andreea Costinasc7d5ad02020-03-09 09:41:51 +01008#include <string>
Andreea Costinas942284d2020-01-28 16:28:40 +01009#include <vector>
10
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010011#include <base/memory/weak_ptr.h>
Andreea Costinas942284d2020-01-28 16:28:40 +010012#include <brillo/dbus/async_event_sequencer.h>
Andreea Costinas5862b102020-03-19 14:45:36 +010013#include <brillo/http/http_proxy.h>
Andreea Costinas41e06442020-03-09 09:41:51 +010014#include <gtest/gtest_prod.h> // for FRIEND_TEST
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010015#include <patchpanel/proto_bindings/patchpanel_service.pb.h>
Andreea Costinas942284d2020-01-28 16:28:40 +010016
Andreea Costinasdb2cbee2020-06-15 11:43:44 +020017#include "bindings/worker_common.pb.h"
Andreea Costinas942284d2020-01-28 16:28:40 +010018#include "system_proxy/org.chromium.SystemProxy.h"
Andreea Costinasfc3dc7d2020-07-20 18:54:38 +020019#include "system_proxy/proto_bindings/system_proxy_service.pb.h"
Andreea Costinas942284d2020-01-28 16:28:40 +010020
21namespace brillo {
22namespace dbus_utils {
23class DBusObject;
24}
25
26} // namespace brillo
27
28namespace system_proxy {
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010029
Andreea Costinas922fbaf2020-05-28 11:55:22 +020030class KerberosClient;
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010031class SandboxedWorker;
32
Andreea Costinas942284d2020-01-28 16:28:40 +010033// Implementation of the SystemProxy D-Bus interface.
34class SystemProxyAdaptor : public org::chromium::SystemProxyAdaptor,
35 public org::chromium::SystemProxyInterface {
36 public:
37 explicit SystemProxyAdaptor(
38 std::unique_ptr<brillo::dbus_utils::DBusObject> dbus_object);
39 SystemProxyAdaptor(const SystemProxyAdaptor&) = delete;
40 SystemProxyAdaptor& operator=(const SystemProxyAdaptor&) = delete;
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010041 virtual ~SystemProxyAdaptor();
Andreea Costinas942284d2020-01-28 16:28:40 +010042
43 // Registers the D-Bus object and interfaces.
44 void RegisterAsync(
45 const brillo::dbus_utils::AsyncEventSequencer::CompletionAction&
46 completion_callback);
47
48 // org::chromium::SystemProxyInterface: (see org.chromium.SystemProxy.xml).
Andreea Costinas77b180e2020-05-12 15:17:32 +020049 std::vector<uint8_t> SetAuthenticationDetails(
50 const std::vector<uint8_t>& request_blob) override;
Andreea Costinas942284d2020-01-28 16:28:40 +010051 std::vector<uint8_t> ShutDown() override;
Andreea Costinase9c73592020-07-17 15:27:54 +020052 std::vector<uint8_t> ClearUserCredentials(
53 const std::vector<uint8_t>& request_blob) override;
Andreea Costinasfc3dc7d2020-07-20 18:54:38 +020054 std::vector<uint8_t> ShutDownProcess(
55 const std::vector<uint8_t>& request_blob) override;
Andreea Costinas942284d2020-01-28 16:28:40 +010056
Andreea Costinas5862b102020-03-19 14:45:36 +010057 void GetChromeProxyServersAsync(
58 const std::string& target_url,
59 const brillo::http::GetChromeProxyServersCallback& callback);
60
Andreea Costinasdb2cbee2020-06-15 11:43:44 +020061 void RequestAuthenticationCredentials(
Andreea Costinased9e6122020-08-12 12:06:19 +020062 const worker::ProtectionSpace& protection_space,
63 bool bad_cached_credentials);
Andreea Costinas350e4aa2020-07-20 20:29:46 +020064 // Returns true if |proxy| points to one of the local proxy workers. The
65 // method only matches against host and port, but not scheme.
66 // TODO(acostinas, crbug.com/1109207) Add an option to the proxy resolution
67 // service in Chrome that allows fetching only the addresses of "real"
68 // proxies.
69 bool IsLocalProxy(const std::string& proxy);
Andreea Costinasdb2cbee2020-06-15 11:43:44 +020070
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010071 protected:
72 virtual std::unique_ptr<SandboxedWorker> CreateWorker();
Andreea Costinas350e4aa2020-07-20 20:29:46 +020073 virtual void ConnectNamespace(bool user_traffic);
Andreea Costinasa89309d2020-05-08 15:51:12 +020074 // Triggers the |WorkerActive| signal.
75 void OnNamespaceConnected(SandboxedWorker* worker, bool user_traffic);
Andreea Costinas350e4aa2020-07-20 20:29:46 +020076 // Returns a pointer to the worker process associated with |user_traffic|. Can
77 // return nullptr.
78 SandboxedWorker* GetWorker(bool user_traffic);
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010079
Andreea Costinas942284d2020-01-28 16:28:40 +010080 private:
Andreea Costinas41e06442020-03-09 09:41:51 +010081 friend class SystemProxyAdaptorTest;
Andreea Costinas77b180e2020-05-12 15:17:32 +020082 FRIEND_TEST(SystemProxyAdaptorTest, SetAuthenticationDetails);
Andreea Costinas350e4aa2020-07-20 20:29:46 +020083 FRIEND_TEST(SystemProxyAdaptorTest,
84 SetAuthenticationDetailsOnlySystemTraffic);
Andreea Costinas922fbaf2020-05-28 11:55:22 +020085 FRIEND_TEST(SystemProxyAdaptorTest, KerberosEnabled);
Andreea Costinas41e06442020-03-09 09:41:51 +010086 FRIEND_TEST(SystemProxyAdaptorTest, ShutDown);
Andreea Costinas350e4aa2020-07-20 20:29:46 +020087 FRIEND_TEST(SystemProxyAdaptorTest, ShutDownArc);
Andreea Costinasa89309d2020-05-08 15:51:12 +020088 FRIEND_TEST(SystemProxyAdaptorTest, ConnectNamespace);
89 FRIEND_TEST(SystemProxyAdaptorTest, ProxyResolutionFilter);
Andreea Costinasdb2cbee2020-06-15 11:43:44 +020090 FRIEND_TEST(SystemProxyAdaptorTest, ProtectionSpaceAuthenticationRequired);
91 FRIEND_TEST(SystemProxyAdaptorTest, ProtectionSpaceNoCredentials);
Andreea Costinase9c73592020-07-17 15:27:54 +020092 FRIEND_TEST(SystemProxyAdaptorTest, ClearUserCredentials);
93 FRIEND_TEST(SystemProxyAdaptorTest, ClearUserCredentialsRestartService);
Andreea Costinas41e06442020-03-09 09:41:51 +010094
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010095 void SetCredentialsTask(SandboxedWorker* worker,
Andreea Costinasdb2cbee2020-06-15 11:43:44 +020096 const worker::Credentials& credentials);
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010097
Andreea Costinas922fbaf2020-05-28 11:55:22 +020098 void SetKerberosEnabledTask(SandboxedWorker* worker,
99 bool kerberos_enabled,
100 const std::string& principal_name);
101
Andreea Costinasc7d5ad02020-03-09 09:41:51 +0100102 void ShutDownTask();
103
Andreea Costinas91f75352020-07-08 14:47:47 +0200104 void ConnectNamespaceTask(SandboxedWorker* worker, bool user_traffic);
105
Andreea Costinase9c73592020-07-17 15:27:54 +0200106 // Terminates the worker process for traffic indicated by |user_traffic| and
107 // frees the SandboxedWorker associated with it.
108 bool ResetWorker(bool user_traffic);
109
Andreea Costinas350e4aa2020-07-20 20:29:46 +0200110 void SetWorker(bool user_traffic, std::unique_ptr<SandboxedWorker> worker);
Andreea Costinase9c73592020-07-17 15:27:54 +0200111
Andreea Costinasfc3dc7d2020-07-20 18:54:38 +0200112 // Return true if |traffic_origin| represents the traffic originating from
113 // system services or if it includes all traffic.
114 bool IncludesSystemTraffic(TrafficOrigin traffic_origin);
115 // Return true if |traffic_origin| represents the traffic originating from ARC
116 // or if it includes all traffic.
117 bool IncludesUserTraffic(TrafficOrigin traffic_origin);
118
Andreea Costinas77b180e2020-05-12 15:17:32 +0200119 // Checks if a worker process exists and if not creates one and sends a
120 // request to patchpanel to setup the network namespace for it. Returns true
121 // if the worker exists or was created successfully, false otherwise.
Andreea Costinas350e4aa2020-07-20 20:29:46 +0200122 SandboxedWorker* CreateWorkerIfNeeded(bool user_traffic);
123
124 // If setting the authentication details to |worker| fails, it updates
125 // |error_message| with an appropriate error message.
126 void SetAuthenticationDetails(SetAuthenticationDetailsRequest auth_details,
127 bool user_traffic,
128 std::string* error_message);
Andreea Costinas77b180e2020-05-12 15:17:32 +0200129
Andreea Costinase9c73592020-07-17 15:27:54 +0200130 // Sends a request to the worker process associated with |user_traffic| to
131 // clear the cached user credentials. If sending the request fails, the worker
132 // will be restarted.
133 void ClearUserCredentials(bool user_traffic, std::string* error_message);
134
Andreea Costinasa89309d2020-05-08 15:51:12 +0200135 // Called when the patchpanel D-Bus service becomes available.
Andreea Costinas350e4aa2020-07-20 20:29:46 +0200136 void OnPatchpanelServiceAvailable(bool user_traffic, bool is_available);
Andreea Costinasc7d5ad02020-03-09 09:41:51 +0100137
Andreea Costinas5862b102020-03-19 14:45:36 +0100138 // The callback of |GetChromeProxyServersAsync|.
139 void OnGetProxyServers(bool success, const std::vector<std::string>& servers);
140
Andreea Costinas91f75352020-07-08 14:47:47 +0200141 // The number of tries left for setting up the network namespace of the
142 // System-proxy worker for system traffic. TODO(acostinas, b/160736881) Remove
143 // when patchpaneld creates the veth pair directly across the host and worker
144 // network namespaces.
145 int netns_reconnect_attempts_available_;
146
Andreea Costinasc7d5ad02020-03-09 09:41:51 +0100147 // Worker that authenticates and forwards to a remote web proxy traffic
148 // coming form Chrome OS system services.
149 std::unique_ptr<SandboxedWorker> system_services_worker_;
150 // Worker that authenticates and forwards to a remote web proxy traffic
151 // coming form ARC++ apps.
152 std::unique_ptr<SandboxedWorker> arc_worker_;
Andreea Costinas922fbaf2020-05-28 11:55:22 +0200153 std::unique_ptr<KerberosClient> kerberos_client_;
154
Andreea Costinas942284d2020-01-28 16:28:40 +0100155 std::unique_ptr<brillo::dbus_utils::DBusObject> dbus_object_;
Andreea Costinasc7d5ad02020-03-09 09:41:51 +0100156 base::WeakPtrFactory<SystemProxyAdaptor> weak_ptr_factory_;
Andreea Costinas942284d2020-01-28 16:28:40 +0100157};
158
159} // namespace system_proxy
160#endif // SYSTEM_PROXY_SYSTEM_PROXY_ADAPTOR_H_