| Index: webrtc/base/firewallsocketserver.cc
|
| diff --git a/webrtc/base/firewallsocketserver.cc b/webrtc/base/firewallsocketserver.cc
|
| deleted file mode 100644
|
| index 4a2a4048f37684bc4c2e0cc7838e984cf0269ee9..0000000000000000000000000000000000000000
|
| --- a/webrtc/base/firewallsocketserver.cc
|
| +++ /dev/null
|
| @@ -1,271 +0,0 @@
|
| -/*
|
| - * 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.
|
| - */
|
| -
|
| -#include "webrtc/base/firewallsocketserver.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "webrtc/base/asyncsocket.h"
|
| -#include "webrtc/base/checks.h"
|
| -#include "webrtc/base/logging.h"
|
| -
|
| -namespace rtc {
|
| -
|
| -class FirewallSocket : public AsyncSocketAdapter {
|
| - public:
|
| - FirewallSocket(FirewallSocketServer* server, AsyncSocket* socket, int type)
|
| - : AsyncSocketAdapter(socket), server_(server), type_(type) {
|
| - }
|
| -
|
| - int Bind(const SocketAddress& addr) override {
|
| - if (!server_->IsBindableIp(addr.ipaddr())) {
|
| - SetError(EINVAL);
|
| - return SOCKET_ERROR;
|
| - }
|
| - return AsyncSocketAdapter::Bind(addr);
|
| - }
|
| -
|
| - int Connect(const SocketAddress& addr) override {
|
| - if (type_ == SOCK_STREAM) {
|
| - if (!server_->Check(FP_TCP, GetLocalAddress(), addr)) {
|
| - LOG(LS_VERBOSE) << "FirewallSocket outbound TCP connection from "
|
| - << GetLocalAddress().ToSensitiveString() << " to "
|
| - << addr.ToSensitiveString() << " denied";
|
| - // TODO: Handle this asynchronously.
|
| - SetError(EHOSTUNREACH);
|
| - return SOCKET_ERROR;
|
| - }
|
| - }
|
| - return AsyncSocketAdapter::Connect(addr);
|
| - }
|
| - int Send(const void* pv, size_t cb) override {
|
| - return SendTo(pv, cb, GetRemoteAddress());
|
| - }
|
| - int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override {
|
| - RTC_DCHECK(type_ == SOCK_DGRAM || type_ == SOCK_STREAM);
|
| - FirewallProtocol protocol = (type_ == SOCK_DGRAM) ? FP_UDP : FP_TCP;
|
| - if (!server_->Check(protocol, GetLocalAddress(), addr)) {
|
| - LOG(LS_VERBOSE) << "FirewallSocket outbound packet with type " << type_
|
| - << " from " << GetLocalAddress().ToSensitiveString()
|
| - << " to " << addr.ToSensitiveString() << " dropped";
|
| - return static_cast<int>(cb);
|
| - }
|
| - return AsyncSocketAdapter::SendTo(pv, cb, addr);
|
| - }
|
| - int Recv(void* pv, size_t cb, int64_t* timestamp) override {
|
| - SocketAddress addr;
|
| - return RecvFrom(pv, cb, &addr, timestamp);
|
| - }
|
| - int RecvFrom(void* pv,
|
| - size_t cb,
|
| - SocketAddress* paddr,
|
| - int64_t* timestamp) override {
|
| - if (type_ == SOCK_DGRAM) {
|
| - while (true) {
|
| - int res = AsyncSocketAdapter::RecvFrom(pv, cb, paddr, timestamp);
|
| - if (res <= 0)
|
| - return res;
|
| - if (server_->Check(FP_UDP, *paddr, GetLocalAddress()))
|
| - return res;
|
| - LOG(LS_VERBOSE) << "FirewallSocket inbound UDP packet from "
|
| - << paddr->ToSensitiveString() << " to "
|
| - << GetLocalAddress().ToSensitiveString() << " dropped";
|
| - }
|
| - }
|
| - return AsyncSocketAdapter::RecvFrom(pv, cb, paddr, timestamp);
|
| - }
|
| -
|
| - int Listen(int backlog) override {
|
| - if (!server_->tcp_listen_enabled()) {
|
| - LOG(LS_VERBOSE) << "FirewallSocket listen attempt denied";
|
| - return -1;
|
| - }
|
| -
|
| - return AsyncSocketAdapter::Listen(backlog);
|
| - }
|
| - AsyncSocket* Accept(SocketAddress* paddr) override {
|
| - SocketAddress addr;
|
| - while (AsyncSocket* sock = AsyncSocketAdapter::Accept(&addr)) {
|
| - if (server_->Check(FP_TCP, addr, GetLocalAddress())) {
|
| - if (paddr)
|
| - *paddr = addr;
|
| - return sock;
|
| - }
|
| - sock->Close();
|
| - delete sock;
|
| - LOG(LS_VERBOSE) << "FirewallSocket inbound TCP connection from "
|
| - << addr.ToSensitiveString() << " to "
|
| - << GetLocalAddress().ToSensitiveString() << " denied";
|
| - }
|
| - return 0;
|
| - }
|
| -
|
| - private:
|
| - FirewallSocketServer* server_;
|
| - int type_;
|
| -};
|
| -
|
| -FirewallSocketServer::FirewallSocketServer(SocketServer* server,
|
| - FirewallManager* manager,
|
| - bool should_delete_server)
|
| - : server_(server), manager_(manager),
|
| - should_delete_server_(should_delete_server),
|
| - udp_sockets_enabled_(true), tcp_sockets_enabled_(true),
|
| - tcp_listen_enabled_(true) {
|
| - if (manager_)
|
| - manager_->AddServer(this);
|
| -}
|
| -
|
| -FirewallSocketServer::~FirewallSocketServer() {
|
| - if (manager_)
|
| - manager_->RemoveServer(this);
|
| -
|
| - if (server_ && should_delete_server_) {
|
| - delete server_;
|
| - server_ = nullptr;
|
| - }
|
| -}
|
| -
|
| -void FirewallSocketServer::AddRule(bool allow, FirewallProtocol p,
|
| - FirewallDirection d,
|
| - const SocketAddress& addr) {
|
| - SocketAddress any;
|
| - if (d == FD_IN || d == FD_ANY) {
|
| - AddRule(allow, p, any, addr);
|
| - }
|
| - if (d == FD_OUT || d == FD_ANY) {
|
| - AddRule(allow, p, addr, any);
|
| - }
|
| -}
|
| -
|
| -
|
| -void FirewallSocketServer::AddRule(bool allow, FirewallProtocol p,
|
| - const SocketAddress& src,
|
| - const SocketAddress& dst) {
|
| - Rule r;
|
| - r.allow = allow;
|
| - r.p = p;
|
| - r.src = src;
|
| - r.dst = dst;
|
| - CritScope scope(&crit_);
|
| - rules_.push_back(r);
|
| -}
|
| -
|
| -void FirewallSocketServer::ClearRules() {
|
| - CritScope scope(&crit_);
|
| - rules_.clear();
|
| -}
|
| -
|
| -bool FirewallSocketServer::Check(FirewallProtocol p,
|
| - const SocketAddress& src,
|
| - const SocketAddress& dst) {
|
| - CritScope scope(&crit_);
|
| - for (size_t i = 0; i < rules_.size(); ++i) {
|
| - const Rule& r = rules_[i];
|
| - if ((r.p != p) && (r.p != FP_ANY))
|
| - continue;
|
| - if ((r.src.ipaddr() != src.ipaddr()) && !r.src.IsNil())
|
| - continue;
|
| - if ((r.src.port() != src.port()) && (r.src.port() != 0))
|
| - continue;
|
| - if ((r.dst.ipaddr() != dst.ipaddr()) && !r.dst.IsNil())
|
| - continue;
|
| - if ((r.dst.port() != dst.port()) && (r.dst.port() != 0))
|
| - continue;
|
| - return r.allow;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void FirewallSocketServer::SetUnbindableIps(
|
| - const std::vector<rtc::IPAddress>& unbindable_ips) {
|
| - unbindable_ips_ = unbindable_ips;
|
| -}
|
| -
|
| -bool FirewallSocketServer::IsBindableIp(const rtc::IPAddress& ip) {
|
| - return std::find(unbindable_ips_.begin(), unbindable_ips_.end(), ip) ==
|
| - unbindable_ips_.end();
|
| -}
|
| -
|
| -Socket* FirewallSocketServer::CreateSocket(int type) {
|
| - return CreateSocket(AF_INET, type);
|
| -}
|
| -
|
| -Socket* FirewallSocketServer::CreateSocket(int family, int type) {
|
| - return WrapSocket(server_->CreateAsyncSocket(family, type), type);
|
| -}
|
| -
|
| -AsyncSocket* FirewallSocketServer::CreateAsyncSocket(int type) {
|
| - return CreateAsyncSocket(AF_INET, type);
|
| -}
|
| -
|
| -AsyncSocket* FirewallSocketServer::CreateAsyncSocket(int family, int type) {
|
| - return WrapSocket(server_->CreateAsyncSocket(family, type), type);
|
| -}
|
| -
|
| -void FirewallSocketServer::SetMessageQueue(MessageQueue* queue) {
|
| - server_->SetMessageQueue(queue);
|
| -}
|
| -
|
| -bool FirewallSocketServer::Wait(int cms, bool process_io) {
|
| - return server_->Wait(cms, process_io);
|
| -}
|
| -
|
| -void FirewallSocketServer::WakeUp() {
|
| - return server_->WakeUp();
|
| -}
|
| -
|
| -AsyncSocket* FirewallSocketServer::WrapSocket(AsyncSocket* sock, int type) {
|
| - if (!sock ||
|
| - (type == SOCK_STREAM && !tcp_sockets_enabled_) ||
|
| - (type == SOCK_DGRAM && !udp_sockets_enabled_)) {
|
| - LOG(LS_VERBOSE) << "FirewallSocketServer socket creation denied";
|
| - delete sock;
|
| - return nullptr;
|
| - }
|
| - return new FirewallSocket(this, sock, type);
|
| -}
|
| -
|
| -FirewallManager::FirewallManager() {
|
| -}
|
| -
|
| -FirewallManager::~FirewallManager() {
|
| - RTC_DCHECK(servers_.empty());
|
| -}
|
| -
|
| -void FirewallManager::AddServer(FirewallSocketServer* server) {
|
| - CritScope scope(&crit_);
|
| - servers_.push_back(server);
|
| -}
|
| -
|
| -void FirewallManager::RemoveServer(FirewallSocketServer* server) {
|
| - CritScope scope(&crit_);
|
| - servers_.erase(std::remove(servers_.begin(), servers_.end(), server),
|
| - servers_.end());
|
| -}
|
| -
|
| -void FirewallManager::AddRule(bool allow, FirewallProtocol p,
|
| - FirewallDirection d, const SocketAddress& addr) {
|
| - CritScope scope(&crit_);
|
| - for (std::vector<FirewallSocketServer*>::const_iterator it =
|
| - servers_.begin(); it != servers_.end(); ++it) {
|
| - (*it)->AddRule(allow, p, d, addr);
|
| - }
|
| -}
|
| -
|
| -void FirewallManager::ClearRules() {
|
| - CritScope scope(&crit_);
|
| - for (std::vector<FirewallSocketServer*>::const_iterator it =
|
| - servers_.begin(); it != servers_.end(); ++it) {
|
| - (*it)->ClearRules();
|
| - }
|
| -}
|
| -
|
| -} // namespace rtc
|
|
|