diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/libwebrtc/rtc_base/firewall_socket_server.h | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/rtc_base/firewall_socket_server.h')
-rw-r--r-- | third_party/libwebrtc/rtc_base/firewall_socket_server.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_base/firewall_socket_server.h b/third_party/libwebrtc/rtc_base/firewall_socket_server.h new file mode 100644 index 0000000000..63f9e1ac6c --- /dev/null +++ b/third_party/libwebrtc/rtc_base/firewall_socket_server.h @@ -0,0 +1,129 @@ +/* + * 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 RTC_BASE_FIREWALL_SOCKET_SERVER_H_ +#define RTC_BASE_FIREWALL_SOCKET_SERVER_H_ + +#include <vector> + +#include "rtc_base/ip_address.h" +#include "rtc_base/socket.h" +#include "rtc_base/socket_address.h" +#include "rtc_base/socket_server.h" +#include "rtc_base/synchronization/mutex.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 = nullptr, + 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_ = nullptr; + 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); + + // Set the IP addresses for which Bind will fail. By default this list is + // empty. This can be used to simulate a real OS that refuses to bind to + // addresses under various circumstances. + // + // No matter how many addresses are added (including INADDR_ANY), the server + // will still allow creating outgoing TCP connections, since they don't + // require explicitly binding a socket. + void SetUnbindableIps(const std::vector<rtc::IPAddress>& unbindable_ips); + bool IsBindableIp(const rtc::IPAddress& ip); + + Socket* CreateSocket(int family, int type) override; + + void SetMessageQueue(Thread* queue) override; + bool Wait(webrtc::TimeDelta max_wait_duration, bool process_io) override; + void WakeUp() override; + + Socket* WrapSocket(Socket* sock, int type); + + private: + SocketServer* server_; + FirewallManager* manager_; + webrtc::Mutex mutex_; + struct Rule { + bool allow; + FirewallProtocol p; + FirewallDirection d; + SocketAddress src; + SocketAddress dst; + }; + std::vector<Rule> rules_; + std::vector<rtc::IPAddress> unbindable_ips_; + 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: + webrtc::Mutex mutex_; + std::vector<FirewallSocketServer*> servers_; +}; + +} // namespace rtc + +#endif // RTC_BASE_FIREWALL_SOCKET_SERVER_H_ |