blob: c7bdb9582cab006251b8fa982f26d77edfd5640c [file] [log] [blame]
Andreea Costinasc7d5ad02020-03-09 09:41:51 +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_SANDBOXED_WORKER_H_
5#define SYSTEM_PROXY_SANDBOXED_WORKER_H_
6
7#include <array>
Andreea Costinas5862b102020-03-19 14:45:36 +01008#include <map>
Andreea Costinasc7d5ad02020-03-09 09:41:51 +01009#include <memory>
10#include <string>
Andreea Costinas5862b102020-03-19 14:45:36 +010011#include <vector>
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010012
13#include <gtest/gtest_prod.h> // for FRIEND_TEST
14
15#include <base/files/file_descriptor_watcher_posix.h>
16#include <base/files/scoped_file.h>
Andreea Costinas5862b102020-03-19 14:45:36 +010017#include <base/memory/weak_ptr.h>
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010018#include <chromeos/scoped_minijail.h>
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010019
20namespace system_proxy {
21
Andreea Costinas5862b102020-03-19 14:45:36 +010022class SystemProxyAdaptor;
23
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010024class SandboxedWorker {
25 public:
Andreea Costinas5862b102020-03-19 14:45:36 +010026 explicit SandboxedWorker(base::WeakPtr<SystemProxyAdaptor> adaptor);
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010027 SandboxedWorker(const SandboxedWorker&) = delete;
28 SandboxedWorker& operator=(const SandboxedWorker&) = delete;
29 virtual ~SandboxedWorker() = default;
30
31 // Starts a sandboxed worker with pipes.
Andreea Costinasc9defae2020-04-22 10:28:35 +020032 virtual bool Start();
Andreea Costinas41e06442020-03-09 09:41:51 +010033 // Sends the username and password to the worker via communication pipes.
34 void SetUsernameAndPassword(const std::string& username,
35 const std::string& password);
36 // Sends the listening address and port to the worker via communication
Andreea Costinasa89309d2020-05-08 15:51:12 +020037 // pipes and sets |local_proxy_host_and_port_|.
Andreea Costinasc9defae2020-04-22 10:28:35 +020038 bool SetListeningAddress(uint32_t addr, int port);
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010039
40 // Terminates the child process by sending a SIGTERM signal.
41 virtual bool Stop();
42
43 virtual bool IsRunning();
44
Andreea Costinasedb7c8e2020-04-22 10:58:04 +020045 void SetNetNamespaceLifelineFd(base::ScopedFD net_namespace_lifeline_fd);
46
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010047 pid_t pid() { return pid_; }
48
Andreea Costinasa89309d2020-05-08 15:51:12 +020049 // Returns the address of the local proxy as host:port.
50 virtual std::string local_proxy_host_and_port() {
51 return local_proxy_host_and_port_;
52 }
53
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010054 private:
Andreea Costinas41e06442020-03-09 09:41:51 +010055 friend class SystemProxyAdaptorTest;
56 FRIEND_TEST(SystemProxyAdaptorTest, SetSystemTrafficCredentials);
Andreea Costinas77b180e2020-05-12 15:17:32 +020057 FRIEND_TEST(SystemProxyAdaptorTest, SetAuthenticationDetails);
Andreea Costinasa89309d2020-05-08 15:51:12 +020058 FRIEND_TEST(SystemProxyAdaptorTest, ProxyResolutionFilter);
Andreea Costinas41e06442020-03-09 09:41:51 +010059
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010060 void OnMessageReceived();
61 void OnErrorReceived();
Andreea Costinas5862b102020-03-19 14:45:36 +010062 // Called when a proxy resolver job is resolved. |proxy_servers| is the
63 // ordered list of proxies returned by Chrome. In case of failure it will be
64 // the direct proxy.
65 void OnProxyResolved(const std::string& target_url,
66 bool success,
67 const std::vector<std::string>& proxy_servers);
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010068
Andreea Costinasa89309d2020-05-08 15:51:12 +020069 std::string local_proxy_host_and_port_;
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010070 bool is_being_terminated_ = false;
71 ScopedMinijail jail_;
72 base::ScopedFD stdin_pipe_;
73 base::ScopedFD stdout_pipe_;
74 base::ScopedFD stderr_pipe_;
75
Andreea Costinasedb7c8e2020-04-22 10:58:04 +020076 // The fd will be released when the owning sandbox worker instance is
77 // destroyed. Closing this fd will signal to the patchpanel service to tear
78 // down the network namespace setup for the associated worker process.
79 base::ScopedFD net_namespace_lifeline_fd_;
80
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010081 std::unique_ptr<base::FileDescriptorWatcher::Controller> stdout_watcher_;
82 std::unique_ptr<base::FileDescriptorWatcher::Controller> stderr_watcher_;
83
Andreea Costinas5862b102020-03-19 14:45:36 +010084 // The adaptor that owns this worker.
85 base::WeakPtr<SystemProxyAdaptor> adaptor_;
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010086 pid_t pid_;
Andreea Costinas5862b102020-03-19 14:45:36 +010087 base::WeakPtrFactory<SandboxedWorker> weak_ptr_factory_{this};
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010088};
89
90} // namespace system_proxy
91
92#endif // SYSTEM_PROXY_SANDBOXED_WORKER_H_