rublon-ssh/PAM/ssh/include/rublon/configuration.hpp
rublon-bwi 51b14c57d2
Bwi/memory management (#2)
Improve memory management
2023-09-21 16:52:20 +02:00

102 lines
3.1 KiB
C++

#pragma once
#include <algorithm>
#include <cctype>
#include <cstring>
#include <filesystem>
#include <fstream>
#include <functional>
#include <map>
#include <memory_resource>
#include <optional>
#include <sstream>
#include <string>
#include "utils.hpp"
namespace rublon {
class ConfigurationFactory;
class Configuration {
public:
struct Parameters {
std::string systemToken;
std::string secretKey;
std::string apiServer;
int prompt;
bool enablePasswdEmail;
bool logging;
bool autopushPrompt;
bool bypass;
} parameters;
};
class ConfigurationFactory {
public:
ConfigurationFactory() = default;
std::optional< Configuration > systemConfig() {
memory::MonotonicStackResource< 8 * 1024 > stackResource;
using Params = Configuration::Parameters;
Params configValues;
std::ifstream file(std::filesystem::path{"/etc/rublon.config"});
std::pmr::string line{&stackResource};
line.reserve(100);
std::pmr::map< std::pmr::string, std::pmr::string > parameters{&stackResource};
while(std::getline(file, line)) {
std::pmr::string key{&stackResource};
std::pmr::string value{&stackResource};
if(!line.length())
continue;
if(line[0] == '#' || line[0] == ';')
continue;
auto posEqual = line.find('=');
key = line.substr(0, posEqual);
value = line.substr(posEqual + 1);
parameters[std::move(key)] = std::move(value);
}
auto saveStr = [&](auto member) { //
return [member](Params * params, std::string_view value) { params->*member = value; };
};
auto saveInt = [](auto member) { //
return [member](Params * params, std::string_view value) { params->*member = std::stoi(value.data()); };
};
auto saveBool = [](auto member) {
return [member](Params * params, std::string_view value) { params->*member = details::to_bool(value); };
};
std::tuple< const char *, std::function< void(Params *, const char *) >, const char * > checks[]{//
{"logging", saveBool(&Params::logging), "true"},
{"systemToken", saveStr(&Params::systemToken), nullptr},
{"secretKey", saveStr(&Params::secretKey), nullptr},
{"rublonApiServer", saveStr(&Params::apiServer), nullptr},
{"prompt", saveInt(&Params::prompt), "1"},
{"enablePasswdEmail", saveBool(&Params::enablePasswdEmail), "true"},
{"autopushPrompt", saveBool(&Params::autopushPrompt), "false"}};
for(const auto & [key, set_func, default_value] : checks) {
if(auto it = parameters.find(key); it != parameters.end()) {
set_func(&configValues, it->second.data());
} else {
if(default_value) {
/// TODO exit??
} else { // not required
set_func(&configValues, default_value);
}
}
}
return Configuration{std::move(configValues)};
}
};
} // namespace rublon