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