blob: a10e78922721072fc3ecc5b5644d6bc8d1f91118 [file] [log] [blame]
// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <base/macros.h>
#include <base/message_loop/message_loop.h>
#include <base/sequenced_task_runner.h>
#include "firewalld/dbus-proxies.h"
namespace permission_broker {
class PortTracker {
typedef std::pair<uint16_t, std::string> Hole;
explicit PortTracker(org::chromium::FirewalldProxyInterface* firewalld);
virtual ~PortTracker();
bool ProcessTcpPort(uint16_t port, const std::string& iface, int dbus_fd);
bool ProcessUdpPort(uint16_t port, const std::string& iface, int dbus_fd);
bool ReleaseTcpPort(uint16_t port, const std::string& iface);
bool ReleaseUdpPort(uint16_t port, const std::string& iface);
bool ProcessVpnSetup(const std::vector<std::string> &usernames,
const std::string &interface,
int dbus_fd);
bool RemoveVpnSetup();
PortTracker(scoped_refptr<base::SequencedTaskRunner> task_runner,
org::chromium::FirewalldProxyInterface* firewalld);
FRIEND_TEST(PortTrackerTest, RequestVpnSetupSuccess);
FRIEND_TEST(PortTrackerTest, RequestVpnSetupFailure);
// Helper functions for process lifetime tracking.
virtual int AddLifelineFd(int dbus_fd);
virtual bool DeleteLifelineFd(int fd);
virtual void CheckLifelineFds(bool reschedule_check);
virtual void ScheduleLifelineCheck();
bool PlugFirewallHole(int fd);
bool DeleteVpnRules();
// epoll(7) helper functions.
virtual bool InitializeEpollOnce();
scoped_refptr<base::SequencedTaskRunner> task_runner_;
int epfd_;
// For each fd (process), keep track of which hole (port, interface)
// it requested.
std::map<int, Hole> tcp_holes_;
std::map<int, Hole> udp_holes_;
// For each hole (port, interface), keep track of which fd requested it.
// We need this for Release{Tcp|Udp}Port(), to avoid traversing
// |{tcp|udp}_holes_| each time.
std::map<Hole, int> tcp_fds_;
std::map<Hole, int> udp_fds_;
// Keep track of which fd corresponds to VPN rules.
int vpn_lifeline_;
std::vector<std::string> vpn_usernames_;
std::string vpn_interface_;
// |firewalld_| is owned by the PermissionBroker object owning this instance
// of PortTracker.
org::chromium::FirewalldProxyInterface* firewalld_;
} // namespace permission_broker