From d6d75b59ce6c70b26147f878bb8194106d2ea761 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Felix=20D=C3=B6rre?= Date: Sun, 2 Nov 2014 01:47:51 +0100 Subject: [PATCH] add: Initial configuration file implementation --- Makefile | 6 ++- src/database.h | 5 ++ src/main.cpp | 135 +++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 119 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index 748800c..cfa9b76 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,11 @@ CXX=${LT_CXX} CXX_DEP=${LT_CXX_DEP} LD=${LT_LD} -CFLAGS=-O3 -g -flto -Wall -Werror -Wextra -pedantic -std=c++11 +ifneq (,$(filter debug,$(DEB_BUILD_OPTIONS))) +ADDFLAGS=-DNO_DAEMON +endif + +CFLAGS=-O3 -g -flto -Wall -Werror -Wextra -pedantic -std=c++11 ${ADDFLAGS} CXXFLAGS=$(CFLAGS) LDFLAGS=-O3 -g -flto -lmysqlclient -lssl -lcrypto -ldl diff --git a/src/database.h b/src/database.h index e3a9516..71d44ac 100644 --- a/src/database.h +++ b/src/database.h @@ -4,6 +4,11 @@ #include #include +struct Profile { + std::string cert; + std::string key; +}; + struct Job { std::string id; std::string target; diff --git a/src/main.cpp b/src/main.cpp index 49baf97..dc3e9bb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include +#include #include #include @@ -26,6 +27,15 @@ #include "mysql.h" #include "simpleOpensslSigner.h" +#ifdef NO_DAEMON +#define DAEMON false +#else +#define DAEMON true +#endif + +std::string keyDir; +std::vector profiles; + std::string writeBackFile( uint32_t serial, std::string cert ) { std::string filename = "keys"; mkdir( filename.c_str(), 0755 ); @@ -47,41 +57,114 @@ int main( int argc, const char* argv[] ) { return 1; } - std::shared_ptr jp( new MySQLJobProvider( "localhost", "cacert", argv[1], "cacert" ) ); - std::shared_ptr sign( new SimpleOpensslSigner() ); - std::shared_ptr job = jp->fetchJob(); + std::ifstream config; + config.open( "config.txt" ); - if( !job ) { - std::cout << "Nothing to work on" << std::endl; - return 2; + if( !config.is_open() ) { + std::cerr << "config missing" << std::endl; + return 1; } - if( job->task == "sign" ) { - try { - std::shared_ptr cert = jp->fetchTBSCert( job ); + std::string line1; - if( !cert ) { - std::cout << "wasn't able to load CSR" << std::endl; - return 2; + while( config >> line1 ) { + if( line1[0] == '#' ) { + continue; + } + + int splitter = line1.find( "=" ); + + if( splitter == -1 ) { + std::cerr << "Ignoring malformed config line: " << line1 << std::endl; + continue; + } + + std::string key = line1.substr( 0, splitter ); + std::string value = line1.substr( splitter + 1 ); + + if( key == "key.directory" ) { + keyDir = value; + continue; + } + + if( key.compare( 0, 8, "profile." ) == 0 ) { + int numE = key.find( ".", 9 ); + + if( numE == 0 ) { + std::cout << "invalid line: " << line1 << std::endl; + continue; } - std::cout << "Found a CSR at '" << cert->csr << "' signing" << std::endl; - std::ifstream t( cert->csr ); - cert->csr_content = std::string( std::istreambuf_iterator( t ), std::istreambuf_iterator() ); - - std::shared_ptr res = sign->sign( cert ); - std::string fn = writeBackFile( res->serial, res->certificate ); - res->crt_name = fn; - jp->writeBack( job, res ); - } catch( const char* c ) { - std::cerr << c << std::endl; - return 2; + unsigned int i = atoi( key.substr( 8, numE - 8 ).c_str() ); + std::string rest = key.substr( numE + 1 ); + + if( i + 1 > profiles.size() ) { + profiles.resize( i + 1 ); + } + + if( rest == "key" ) { + profiles[i].cert = value; + } else if( rest == "cert" ) { + profiles[i].key = value; + } else { + std::cout << "invalid line: " << line1 << std::endl; + continue; + } } } - if( !jp->finishJob( job ) ) { - return 1; + std::cout << profiles.size() << " profiles loaded." << std::endl; + + if( keyDir == "" ) { + std::cerr << "Missing config property key.directory" << std::endl; + return -1; } - return 0; + config.close(); + + std::shared_ptr jp( new MySQLJobProvider( "localhost", "cacert", argv[1], "cacert" ) ); + std::shared_ptr sign( new SimpleOpensslSigner() ); + + while( true ) { + std::shared_ptr job = jp->fetchJob(); + + if( !job ) { + std::cout << "Nothing to work on" << std::endl; + sleep( 5 ); + continue; + } + + if( job->task == "sign" ) { + try { + std::shared_ptr cert = jp->fetchTBSCert( job ); + + if( !cert ) { + std::cout << "wasn't able to load CSR" << std::endl; + return 2; + } + + std::cout << "Found a CSR at '" << cert->csr << "' signing" << std::endl; + std::ifstream t( cert->csr ); + cert->csr_content = std::string( std::istreambuf_iterator( t ), std::istreambuf_iterator() ); + + std::shared_ptr res = sign->sign( cert ); + std::string fn = writeBackFile( res->serial, res->certificate ); + res->crt_name = fn; + jp->writeBack( job, res ); + } catch( const char* c ) { + std::cerr << c << std::endl; + return 2; + } + } else { + std::cout << "Unknown job type" << job->task << std::endl; + } + + if( DAEMON && !jp->finishJob( job ) ) { + return 1; + } + + if( !DAEMON ) { + return 0; + } + } } -- 2.39.5