X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;ds=sidebyside;f=src%2Fconfig.cpp;h=acdaafbe8faea60a58b97ccb8d6b8178edd817eb;hb=ecdc4c456ebcc3e0871b765d1f4d15e73520d2a3;hp=5556e9331a6ad35069e08424498d5b754a59de73;hpb=307d57b0cdc0a65cc8ce284b1f707c4de1cd840c;p=cassiopeia.git diff --git a/src/config.cpp b/src/config.cpp index 5556e93..acdaafb 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -1,21 +1,27 @@ #include #include #include +#include +#include -#include "sslUtil.h" +#include "crypto/sslUtil.h" + +#include "log/logger.hpp" std::string keyDir; -std::vector profiles; +std::unordered_map profiles; +std::unordered_map> CAs; std::string sqlHost, sqlUser, sqlPass, sqlDB; std::string serialPath; -int parseConfig( std::string path ) { +std::shared_ptr> parseConf( std::string path ) { + auto map = std::make_shared>(); std::ifstream config; config.open( path ); if( !config.is_open() ) { - std::cerr << "config missing" << std::endl; - return 1; + logger::notef( "Where is \"%s\"?", path ); + throw "Config missing"; } std::string line1; @@ -28,71 +34,119 @@ int parseConfig( std::string path ) { int splitter = line1.find( "=" ); if( splitter == -1 ) { - std::cerr << "Ignoring malformed config line: " << line1 << std::endl; + logger::warn( "Ignoring malformed config line: ", line1 ); continue; } std::string key = line1.substr( 0, splitter ); std::string value = line1.substr( splitter + 1 ); + map->emplace( key, value ); + } + + config.close(); + + return map; +} + +int parseProfiles() { + CAs = std::unordered_map>(); + + DIR* dp; + struct dirent* ep; + dp = opendir( "profiles" ); + + if( dp == NULL ) { + logger::error( "Profiles directory not found" ); + return -1; + } - if( key == "key.directory" ) { - keyDir = value; + while( ( ep = readdir( dp ) ) ) { + if( ep->d_name[0] == '.' ) { continue; - } else if( key == "sql.host" ) { - sqlHost = value; - } else if( key == "sql.user" ) { - sqlUser = value; - } else if( key == "sql.password" ) { - sqlPass = value; - } else if( key == "sql.database" ) { - sqlDB = value; - } else if( key == "serialPath" ) { - serialPath = value; - } else if( key.compare( 0, 8, "profile." ) == 0 ) { - int numE = key.find( ".", 9 ); - - if( numE == 0 ) { - std::cout << "invalid line: " << line1 << std::endl; - continue; - } + } - unsigned int i = atoi( key.substr( 8, numE - 8 ).c_str() ); - std::string rest = key.substr( numE + 1 ); + std::string profileName( ep->d_name ); - if( i + 1 > profiles.size() ) { - profiles.resize( i + 1 ); - } + int splitter = profileName.find( "-" ); - if( rest == "key" ) { - profiles[i].key = value; - } else if( rest == "cert" ) { - profiles[i].cert = value; - } else if( rest == "ku" ) { - profiles[i].ku = value; - } else if( rest == "eku" ) { - profiles[i].eku = value; - } else { - std::cout << "invalid line: " << line1 << std::endl; - continue; - } + if( splitter == -1 ) { + logger::warn( "Ignoring malformed profile: ", profileName ); + continue; } - } - for( auto& prof : profiles ) { - if( prof.cert != "" && prof.key != "" ) { - std::cout << "Loading profile... " << std::endl; - prof.ca = loadX509FromFile( prof.cert ); - prof.caKey = loadPkeyFromFile( prof.key ); + std::string id = profileName.substr( 0, splitter ); + + if( profileName.substr( profileName.size() - 4 ) != ".cfg" ) { + logger::warn( "Ignoring malformed profile: ", profileName ); + continue; } + + auto map = parseConf( std::string( "profiles/" ) + profileName ); + + profileName = profileName.substr( 0, profileName.size() - 4 ); + + Profile prof; + prof.id = std::stoi( id ); + prof.eku = map->at( "eku" ); + prof.ku = map->at( "ku" ); + prof.maxValidity = std::stoi( map->at( "days" ) ) * /* DAYS */24 * 60 * 60; + + std::string cas = map->at( "ca" ); + + DIR* dir; + struct dirent* ent; + + if( ( dir = opendir( "ca" ) ) != NULL ) { + while( ( ent = readdir( dir ) ) != NULL ) { + std::string caName = std::string( ent->d_name ); + + if( caName.find( cas ) != 0 ) { + continue; + } + + if( CAs.find( caName ) == CAs.end() ) { + auto ca = std::make_shared( caName ); + CAs.emplace( caName, ca ); + } + + prof.ca.push_back( CAs.at( caName ) ); + logger::note( "Adding CA: ", caName ); + } + + closedir( dir ); + } else { + throw "Directory with CAConfigs not found"; + } + + profiles.emplace( profileName, prof ); + logger::notef( "Profile: \"%s\" up and running.", profileName ); } - std::cout << profiles.size() << " profiles loaded." << std::endl; + ( void ) closedir( dp ); + + logger::notef( "%s profiles loaded.", profiles.size() ); + + return 0; +} + +int parseConfig( std::string path ) { + auto masterConf = parseConf( path ); + + keyDir = masterConf->at( "key.directory" ); + sqlHost = masterConf->at( "sql.host" ); + sqlUser = masterConf->at( "sql.user" ); + sqlPass = masterConf->at( "sql.password" ); + sqlDB = masterConf->at( "sql.database" ); + serialPath = masterConf->at( "serialPath" ); if( keyDir == "" ) { - std::cerr << "Missing config property key.directory" << std::endl; + logger::error( "Missing config property key.directory" ); + return -1; + } + + if( parseProfiles() != 0 ) { return -1; } - config.close(); return 0; }