blob: acfee2a22efde7d8278dc468572a1303bd6e8172 [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
37 // pipes.
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
49 private:
Andreea Costinas41e06442020-03-09 09:41:51 +010050 friend class SystemProxyAdaptorTest;
51 FRIEND_TEST(SystemProxyAdaptorTest, SetSystemTrafficCredentials);
52
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010053 void OnMessageReceived();
54 void OnErrorReceived();
Andreea Costinas5862b102020-03-19 14:45:36 +010055 // Called when a proxy resolver job is resolved. |proxy_servers| is the
56 // ordered list of proxies returned by Chrome. In case of failure it will be
57 // the direct proxy.
58 void OnProxyResolved(const std::string& target_url,
59 bool success,
60 const std::vector<std::string>& proxy_servers);
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010061
62 bool is_being_terminated_ = false;
63 ScopedMinijail jail_;
64 base::ScopedFD stdin_pipe_;
65 base::ScopedFD stdout_pipe_;
66 base::ScopedFD stderr_pipe_;
67
Andreea Costinasedb7c8e2020-04-22 10:58:04 +020068 // The fd will be released when the owning sandbox worker instance is
69 // destroyed. Closing this fd will signal to the patchpanel service to tear
70 // down the network namespace setup for the associated worker process.
71 base::ScopedFD net_namespace_lifeline_fd_;
72
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010073 std::unique_ptr<base::FileDescriptorWatcher::Controller> stdout_watcher_;
74 std::unique_ptr<base::FileDescriptorWatcher::Controller> stderr_watcher_;
75
Andreea Costinas5862b102020-03-19 14:45:36 +010076 // The adaptor that owns this worker.
77 base::WeakPtr<SystemProxyAdaptor> adaptor_;
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010078 pid_t pid_;
Andreea Costinas5862b102020-03-19 14:45:36 +010079 base::WeakPtrFactory<SandboxedWorker> weak_ptr_factory_{this};
Andreea Costinasc7d5ad02020-03-09 09:41:51 +010080};
81
82} // namespace system_proxy
83
84#endif // SYSTEM_PROXY_SANDBOXED_WORKER_H_