Test dynamic IPv4 + Subnet masks
This commit is contained in:
@@ -118,7 +118,7 @@ namespace ColumnLynx::Utils {
|
||||
return out;
|
||||
}
|
||||
|
||||
std::unordered_map<std::string, std::string> getConfigMap(std::string path) {
|
||||
std::unordered_map<std::string, std::string> getConfigMap(std::string path, std::vector<std::string> requiredKeys) {
|
||||
// TODO: Currently re-reads every time.
|
||||
std::vector<std::string> readLines;
|
||||
|
||||
@@ -129,6 +129,16 @@ namespace ColumnLynx::Utils {
|
||||
readLines.push_back(line);
|
||||
}
|
||||
|
||||
if (!requiredKeys.empty()) {
|
||||
// Check if they exist using unordered_set magic
|
||||
std::unordered_set<std::string> setA(readLines.begin(), readLines.end());
|
||||
for (std::string x : requiredKeys) {
|
||||
if (!setA.count(x)) {
|
||||
throw std::runtime_error("Config doesn't contain all required keys! (Missing: '" + x + "')");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Parse them into the struct
|
||||
std::unordered_map<std::string, std::string> config;
|
||||
char delimiter = '=';
|
||||
|
||||
@@ -202,7 +202,18 @@ namespace ColumnLynx::Net::TCP {
|
||||
// Encrypt the Session ID with the established AES key (using symmetric encryption, nonce can be all zeros for this purpose)
|
||||
Nonce symNonce{}; // All zeros
|
||||
|
||||
uint32_t clientIP = SessionRegistry::getInstance().getFirstAvailableIP();
|
||||
std::string networkString = mRawServerConfig->find("NETWORK")->second; // The load check guarantees that this value exists
|
||||
uint8_t configMask = std::stoi(mRawServerConfig->find("SUBNET_MASK")->second); // Same deal here
|
||||
|
||||
uint32_t baseIP = Net::VirtualInterface::stringToIpv4(networkString);
|
||||
|
||||
if (baseIP == 0) {
|
||||
Utils::warn("Your NETWORK value in the server configuration is malformed! I will not be able to accept connections! (Connection " + reqAddr + " was killed)");
|
||||
disconnect();
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t clientIP = SessionRegistry::getInstance().getFirstAvailableIP(baseIP, configMask);
|
||||
|
||||
if (clientIP == 0) {
|
||||
Utils::warn("Out of available IPs! Disconnecting client " + reqAddr);
|
||||
@@ -214,8 +225,8 @@ namespace ColumnLynx::Net::TCP {
|
||||
tunConfig.version = Utils::protocolVersion();
|
||||
tunConfig.prefixLength = 24;
|
||||
tunConfig.mtu = 1420;
|
||||
tunConfig.serverIP = htonl(0x0A0A0001); // 10.10.0.1
|
||||
tunConfig.clientIP = htonl(clientIP); // 10.10.0.X
|
||||
tunConfig.serverIP = htonl(baseIP + 1); // e.g. 10.10.0.1
|
||||
tunConfig.clientIP = htonl(clientIP); // e.g. 10.10.0.X
|
||||
tunConfig.dns1 = htonl(0x08080808); // 8.8.8.8
|
||||
tunConfig.dns2 = 0;
|
||||
|
||||
|
||||
@@ -31,10 +31,11 @@ namespace ColumnLynx::Net::TCP {
|
||||
mStartAccept();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
auto client = TCPConnection::create(
|
||||
std::move(socket),
|
||||
mSodiumWrapper,
|
||||
&mRawServerConfig,
|
||||
[this](std::shared_ptr<TCPConnection> c) {
|
||||
mClients.erase(c);
|
||||
Utils::log("Client removed.");
|
||||
|
||||
Reference in New Issue
Block a user