62 lines
1.3 KiB
C++
62 lines
1.3 KiB
C++
#pragma once
|
|
#include <cstdint>
|
|
#include <map>
|
|
#include <set>
|
|
#include <string_view>
|
|
#include <vector>
|
|
extern "C" {
|
|
#include "./wireguard.h"
|
|
}
|
|
|
|
typedef std::string_view strv;
|
|
|
|
class User {
|
|
public:
|
|
std::string_view username;
|
|
std::uint32_t ipv4;
|
|
wg_peer node;
|
|
std::set<std::string_view> acl_member;
|
|
wg_key privkey;
|
|
User(strv name, uint32_t ipv4, wg_key pubkey, wg_key privkey);
|
|
};
|
|
|
|
class Users {
|
|
public:
|
|
std::vector<User> users;
|
|
std::map<std::string_view, std::vector<User>> acl_aggr();
|
|
void sort_with_ip();
|
|
};
|
|
|
|
struct WGPeerStat {
|
|
bool active;
|
|
wg_key_b64_string pubkey;
|
|
u_int32_t ipv4;
|
|
};
|
|
|
|
class WG {
|
|
private:
|
|
wg_device wg_dev;
|
|
std::set<uint32_t> ipv4_pool;
|
|
|
|
uint32_t ipv4_alloc() {
|
|
uint32_t pick = *this->ipv4_pool.begin();
|
|
this->ipv4_pool.erase(pick);
|
|
|
|
return pick;
|
|
}
|
|
wg_key_b64_string b64_private_key, b64_public_key;
|
|
|
|
public:
|
|
Users &users;
|
|
uint32_t network_ipv4;
|
|
uint8_t cidr;
|
|
uint32_t persistent_time = 0;
|
|
WG(Users &wg_users, const char name[16], std::uint16_t port, uint32_t network,
|
|
uint8_t cidr);
|
|
WG(Users &wg_users, const char name[16], std::uint16_t port, uint32_t network,
|
|
uint8_t cidr, std::string_view srv_priv_key, std::string_view srv_pub_key);
|
|
User &add_cfg(strv name);
|
|
User &add_cfg(strv name, uint32_t ipv4);
|
|
void merge();
|
|
std::vector<WGPeerStat> *peer_state();
|
|
};
|