xref: /aosp_15_r20/external/webrtc/rtc_base/firewall_socket_server.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_FIREWALL_SOCKET_SERVER_H_
12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_FIREWALL_SOCKET_SERVER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <vector>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ip_address.h"
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_address.h"
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_server.h"
20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h"
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker namespace rtc {
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker class FirewallManager;
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker // This SocketServer shim simulates a rule-based firewall server.
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker enum FirewallProtocol { FP_UDP, FP_TCP, FP_ANY };
29*d9f75844SAndroid Build Coastguard Worker enum FirewallDirection { FD_IN, FD_OUT, FD_ANY };
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker class FirewallSocketServer : public SocketServer {
32*d9f75844SAndroid Build Coastguard Worker  public:
33*d9f75844SAndroid Build Coastguard Worker   FirewallSocketServer(SocketServer* server,
34*d9f75844SAndroid Build Coastguard Worker                        FirewallManager* manager = nullptr,
35*d9f75844SAndroid Build Coastguard Worker                        bool should_delete_server = false);
36*d9f75844SAndroid Build Coastguard Worker   ~FirewallSocketServer() override;
37*d9f75844SAndroid Build Coastguard Worker 
socketserver()38*d9f75844SAndroid Build Coastguard Worker   SocketServer* socketserver() const { return server_; }
set_socketserver(SocketServer * server)39*d9f75844SAndroid Build Coastguard Worker   void set_socketserver(SocketServer* server) {
40*d9f75844SAndroid Build Coastguard Worker     if (server_ && should_delete_server_) {
41*d9f75844SAndroid Build Coastguard Worker       delete server_;
42*d9f75844SAndroid Build Coastguard Worker       server_ = nullptr;
43*d9f75844SAndroid Build Coastguard Worker       should_delete_server_ = false;
44*d9f75844SAndroid Build Coastguard Worker     }
45*d9f75844SAndroid Build Coastguard Worker     server_ = server;
46*d9f75844SAndroid Build Coastguard Worker   }
47*d9f75844SAndroid Build Coastguard Worker 
48*d9f75844SAndroid Build Coastguard Worker   // Settings to control whether CreateSocket or Socket::Listen succeed.
set_udp_sockets_enabled(bool enabled)49*d9f75844SAndroid Build Coastguard Worker   void set_udp_sockets_enabled(bool enabled) { udp_sockets_enabled_ = enabled; }
set_tcp_sockets_enabled(bool enabled)50*d9f75844SAndroid Build Coastguard Worker   void set_tcp_sockets_enabled(bool enabled) { tcp_sockets_enabled_ = enabled; }
tcp_listen_enabled()51*d9f75844SAndroid Build Coastguard Worker   bool tcp_listen_enabled() const { return tcp_listen_enabled_; }
set_tcp_listen_enabled(bool enabled)52*d9f75844SAndroid Build Coastguard Worker   void set_tcp_listen_enabled(bool enabled) { tcp_listen_enabled_ = enabled; }
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker   // Rules govern the behavior of Connect/Accept/Send/Recv attempts.
55*d9f75844SAndroid Build Coastguard Worker   void AddRule(bool allow,
56*d9f75844SAndroid Build Coastguard Worker                FirewallProtocol p = FP_ANY,
57*d9f75844SAndroid Build Coastguard Worker                FirewallDirection d = FD_ANY,
58*d9f75844SAndroid Build Coastguard Worker                const SocketAddress& addr = SocketAddress());
59*d9f75844SAndroid Build Coastguard Worker   void AddRule(bool allow,
60*d9f75844SAndroid Build Coastguard Worker                FirewallProtocol p,
61*d9f75844SAndroid Build Coastguard Worker                const SocketAddress& src,
62*d9f75844SAndroid Build Coastguard Worker                const SocketAddress& dst);
63*d9f75844SAndroid Build Coastguard Worker   void ClearRules();
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker   bool Check(FirewallProtocol p,
66*d9f75844SAndroid Build Coastguard Worker              const SocketAddress& src,
67*d9f75844SAndroid Build Coastguard Worker              const SocketAddress& dst);
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker   // Set the IP addresses for which Bind will fail. By default this list is
70*d9f75844SAndroid Build Coastguard Worker   // empty. This can be used to simulate a real OS that refuses to bind to
71*d9f75844SAndroid Build Coastguard Worker   // addresses under various circumstances.
72*d9f75844SAndroid Build Coastguard Worker   //
73*d9f75844SAndroid Build Coastguard Worker   // No matter how many addresses are added (including INADDR_ANY), the server
74*d9f75844SAndroid Build Coastguard Worker   // will still allow creating outgoing TCP connections, since they don't
75*d9f75844SAndroid Build Coastguard Worker   // require explicitly binding a socket.
76*d9f75844SAndroid Build Coastguard Worker   void SetUnbindableIps(const std::vector<rtc::IPAddress>& unbindable_ips);
77*d9f75844SAndroid Build Coastguard Worker   bool IsBindableIp(const rtc::IPAddress& ip);
78*d9f75844SAndroid Build Coastguard Worker 
79*d9f75844SAndroid Build Coastguard Worker   Socket* CreateSocket(int family, int type) override;
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker   void SetMessageQueue(Thread* queue) override;
82*d9f75844SAndroid Build Coastguard Worker   bool Wait(webrtc::TimeDelta max_wait_duration, bool process_io) override;
83*d9f75844SAndroid Build Coastguard Worker   void WakeUp() override;
84*d9f75844SAndroid Build Coastguard Worker 
85*d9f75844SAndroid Build Coastguard Worker   Socket* WrapSocket(Socket* sock, int type);
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker  private:
88*d9f75844SAndroid Build Coastguard Worker   SocketServer* server_;
89*d9f75844SAndroid Build Coastguard Worker   FirewallManager* manager_;
90*d9f75844SAndroid Build Coastguard Worker   webrtc::Mutex mutex_;
91*d9f75844SAndroid Build Coastguard Worker   struct Rule {
92*d9f75844SAndroid Build Coastguard Worker     bool allow;
93*d9f75844SAndroid Build Coastguard Worker     FirewallProtocol p;
94*d9f75844SAndroid Build Coastguard Worker     FirewallDirection d;
95*d9f75844SAndroid Build Coastguard Worker     SocketAddress src;
96*d9f75844SAndroid Build Coastguard Worker     SocketAddress dst;
97*d9f75844SAndroid Build Coastguard Worker   };
98*d9f75844SAndroid Build Coastguard Worker   std::vector<Rule> rules_;
99*d9f75844SAndroid Build Coastguard Worker   std::vector<rtc::IPAddress> unbindable_ips_;
100*d9f75844SAndroid Build Coastguard Worker   bool should_delete_server_;
101*d9f75844SAndroid Build Coastguard Worker   bool udp_sockets_enabled_;
102*d9f75844SAndroid Build Coastguard Worker   bool tcp_sockets_enabled_;
103*d9f75844SAndroid Build Coastguard Worker   bool tcp_listen_enabled_;
104*d9f75844SAndroid Build Coastguard Worker };
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker // FirewallManager allows you to manage firewalls in multiple threads together
107*d9f75844SAndroid Build Coastguard Worker 
108*d9f75844SAndroid Build Coastguard Worker class FirewallManager {
109*d9f75844SAndroid Build Coastguard Worker  public:
110*d9f75844SAndroid Build Coastguard Worker   FirewallManager();
111*d9f75844SAndroid Build Coastguard Worker   ~FirewallManager();
112*d9f75844SAndroid Build Coastguard Worker 
113*d9f75844SAndroid Build Coastguard Worker   void AddServer(FirewallSocketServer* server);
114*d9f75844SAndroid Build Coastguard Worker   void RemoveServer(FirewallSocketServer* server);
115*d9f75844SAndroid Build Coastguard Worker 
116*d9f75844SAndroid Build Coastguard Worker   void AddRule(bool allow,
117*d9f75844SAndroid Build Coastguard Worker                FirewallProtocol p = FP_ANY,
118*d9f75844SAndroid Build Coastguard Worker                FirewallDirection d = FD_ANY,
119*d9f75844SAndroid Build Coastguard Worker                const SocketAddress& addr = SocketAddress());
120*d9f75844SAndroid Build Coastguard Worker   void ClearRules();
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker  private:
123*d9f75844SAndroid Build Coastguard Worker   webrtc::Mutex mutex_;
124*d9f75844SAndroid Build Coastguard Worker   std::vector<FirewallSocketServer*> servers_;
125*d9f75844SAndroid Build Coastguard Worker };
126*d9f75844SAndroid Build Coastguard Worker 
127*d9f75844SAndroid Build Coastguard Worker }  // namespace rtc
128*d9f75844SAndroid Build Coastguard Worker 
129*d9f75844SAndroid Build Coastguard Worker #endif  // RTC_BASE_FIREWALL_SOCKET_SERVER_H_
130