| /* | 
 |  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef WEBRTC_BASE_FIREWALLSOCKETSERVER_H_ | 
 | #define WEBRTC_BASE_FIREWALLSOCKETSERVER_H_ | 
 |  | 
 | #include <vector> | 
 | #include "webrtc/base/socketserver.h" | 
 | #include "webrtc/base/criticalsection.h" | 
 |  | 
 | namespace rtc { | 
 |  | 
 | class FirewallManager; | 
 |  | 
 | // This SocketServer shim simulates a rule-based firewall server. | 
 |  | 
 | enum FirewallProtocol { FP_UDP, FP_TCP, FP_ANY }; | 
 | enum FirewallDirection { FD_IN, FD_OUT, FD_ANY }; | 
 |  | 
 | class FirewallSocketServer : public SocketServer { | 
 |  public: | 
 |   FirewallSocketServer(SocketServer * server, | 
 |                        FirewallManager * manager = NULL, | 
 |                        bool should_delete_server = false); | 
 |   ~FirewallSocketServer() override; | 
 |  | 
 |   SocketServer* socketserver() const { return server_; } | 
 |   void set_socketserver(SocketServer* server) { | 
 |     if (server_ && should_delete_server_) { | 
 |       delete server_; | 
 |       server_ = NULL; | 
 |       should_delete_server_ = false; | 
 |     } | 
 |     server_ = server; | 
 |   } | 
 |  | 
 |   // Settings to control whether CreateSocket or Socket::Listen succeed. | 
 |   void set_udp_sockets_enabled(bool enabled) { udp_sockets_enabled_ = enabled; } | 
 |   void set_tcp_sockets_enabled(bool enabled) { tcp_sockets_enabled_ = enabled; } | 
 |   bool tcp_listen_enabled() const { return tcp_listen_enabled_; } | 
 |   void set_tcp_listen_enabled(bool enabled) { tcp_listen_enabled_ = enabled; } | 
 |  | 
 |   // Rules govern the behavior of Connect/Accept/Send/Recv attempts. | 
 |   void AddRule(bool allow, FirewallProtocol p = FP_ANY, | 
 |                FirewallDirection d = FD_ANY, | 
 |                const SocketAddress& addr = SocketAddress()); | 
 |   void AddRule(bool allow, FirewallProtocol p, | 
 |                const SocketAddress& src, const SocketAddress& dst); | 
 |   void ClearRules(); | 
 |  | 
 |   bool Check(FirewallProtocol p, | 
 |              const SocketAddress& src, const SocketAddress& dst); | 
 |  | 
 |   Socket* CreateSocket(int type) override; | 
 |   Socket* CreateSocket(int family, int type) override; | 
 |  | 
 |   AsyncSocket* CreateAsyncSocket(int type) override; | 
 |   AsyncSocket* CreateAsyncSocket(int family, int type) override; | 
 |  | 
 |   void SetMessageQueue(MessageQueue* queue) override; | 
 |   bool Wait(int cms, bool process_io) override; | 
 |   void WakeUp() override; | 
 |  | 
 |   Socket * WrapSocket(Socket * sock, int type); | 
 |   AsyncSocket * WrapSocket(AsyncSocket * sock, int type); | 
 |  | 
 |  private: | 
 |   SocketServer * server_; | 
 |   FirewallManager * manager_; | 
 |   CriticalSection crit_; | 
 |   struct Rule { | 
 |     bool allow; | 
 |     FirewallProtocol p; | 
 |     FirewallDirection d; | 
 |     SocketAddress src; | 
 |     SocketAddress dst; | 
 |   }; | 
 |   std::vector<Rule> rules_; | 
 |   bool should_delete_server_; | 
 |   bool udp_sockets_enabled_; | 
 |   bool tcp_sockets_enabled_; | 
 |   bool tcp_listen_enabled_; | 
 | }; | 
 |  | 
 | // FirewallManager allows you to manage firewalls in multiple threads together | 
 |  | 
 | class FirewallManager { | 
 |  public: | 
 |   FirewallManager(); | 
 |   ~FirewallManager(); | 
 |  | 
 |   void AddServer(FirewallSocketServer * server); | 
 |   void RemoveServer(FirewallSocketServer * server); | 
 |  | 
 |   void AddRule(bool allow, FirewallProtocol p = FP_ANY, | 
 |                FirewallDirection d = FD_ANY, | 
 |                const SocketAddress& addr = SocketAddress()); | 
 |   void ClearRules(); | 
 |  | 
 |  private: | 
 |   CriticalSection crit_; | 
 |   std::vector<FirewallSocketServer *> servers_; | 
 | }; | 
 |  | 
 | }  // namespace rtc | 
 |  | 
 | #endif  // WEBRTC_BASE_FIREWALLSOCKETSERVER_H_ |