X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Fmain.cpp;h=dc3e9bbd3f9833aadb0980de9195097cb3c08949;hb=d6d75b59ce6c70b26147f878bb8194106d2ea761;hp=bf4df813209d7d384769989ab0e9782a770d8419;hpb=8bf7fb7bedf899a6a1dd62ad56ad9f09f6228747;p=cassiopeia.git diff --git a/src/main.cpp b/src/main.cpp index bf4df81..dc3e9bb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,10 +16,40 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include +#include + #include +#include +#include #include "database.h" #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 ); + filename += "/crt"; + mkdir( filename.c_str(), 0755 ); + filename += "/" + std::to_string( serial / 1000 ); + mkdir( filename.c_str(), 0755 ); + filename += "/" + std::to_string( serial ) + ".crt"; + std::ofstream file; + file.open( filename.c_str() ); + file << cert.c_str(); + file.close(); + return filename; +} int main( int argc, const char* argv[] ) { if( argc < 2 ) { @@ -27,17 +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 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( !jp->finishJob( job ) ) { - return 1; + std::string line1; + + 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; + } + + 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; + } + } + } + + 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; + } + } }