111 lines
3.5 KiB
C++
111 lines
3.5 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;
|
|
bool offlineBypass;
|
|
} 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"});
|
|
if(not file.good())
|
|
return std::nullopt;
|
|
|
|
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); };
|
|
};
|
|
|
|
auto saveBypass = [](auto member) {
|
|
return [member](Params * params, std::string_view value) { params->*member = (value == "bypas"); };
|
|
};
|
|
|
|
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"},
|
|
{"failMode", saveBypass(&Params::bypass), "bypas"}/*,
|
|
{"offlineBypass", saveBool(&Params::bypass), "true"}*/};
|
|
|
|
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
|