11 void writeFile( const std::string& name, const std::string& content ) {
18 //! \FIXME: Error checking
21 std::string readFile( const std::string& name ) {
22 std::ifstream t( name );
23 std::string res = std::string( std::istreambuf_iterator<char>( t ), std::istreambuf_iterator<char>() );
29 std::string writeBackFile( const std::string& serial, const std::string& cert, const std::string& keydir ) {
32 std::string filename = keydir;
34 if( 0 != mkdir( filename.c_str(), 0755 ) ) {
35 if( EEXIST != errno ) {
39 //! \FIXME: Check this is a directory
44 if( 0 != mkdir( filename.c_str(), 0755 ) ) {
45 if( EEXIST != errno ) {
49 //! \FIXME: Check this is a directory
54 if( serial.length() < 3 ) {
57 first = serial.substr( 0, serial.length() - 3 );
60 filename += "/" + first;
62 if( 0 != mkdir( filename.c_str(), 0755 ) ) {
63 if( EEXIST != errno ) {
67 //! \FIXME: Check this is a directory
70 filename += "/" + serial + ".crt";
71 writeFile( filename, cert );
76 bool isDigit( char c ) {
77 return ( c >= '0' ) && ( c <= '9' );
80 std::pair<bool, time_t> parseDate( const std::string& date ) {
81 if( date.size() != 10 || date[4] != '-' || date[7] != '-' ) {
82 return std::pair<bool, time_t>( false, 0 );
85 if( !isDigit( date[0] )
86 || !isDigit( date[1] )
87 || !isDigit( date[2] )
88 || !isDigit( date[3] )
89 || !isDigit( date[5] )
90 || !isDigit( date[6] )
91 || !isDigit( date[8] )
92 || !isDigit( date[9] ) ) {
93 return std::pair<bool, time_t>( false, 0 );
100 t.tm_year = std::stoi( date.substr( 0, 4 ) ) - 1900;
101 t.tm_mon = std::stoi( date.substr( 5, 2 ) ) - 1;
102 t.tm_mday = std::stoi( date.substr( 8, 2 ) );
103 setenv( "TZ", "UTC", 1 );
105 std::time_t res = mktime( &t );
107 std::size_t siz = strftime( check, 11, "%Y-%m-%d", &t );
110 return std::pair<bool, time_t>( false, 0 ); // NO-COVERAGE (by contract of strftime)
113 std::string checkS( check, siz );
115 if( checkS != date ) {
116 return std::pair<bool, time_t>( false, 0 );
119 return std::pair<bool, time_t>( true, res );
122 std::pair<bool, time_t> addMonths( std::time_t t, int32_t count ) {
123 std::tm* parsed = gmtime( &t );
125 if( !parsed || count <= 0 || count > 24 ) { // FIXED MAX-Validity-Length
126 return std::pair<bool, time_t>( false, 0 );
129 parsed->tm_mon += count;
130 int oldday = parsed->tm_mday;
131 setenv( "TZ", "UTC", 1 );
133 std::time_t res = mktime( parsed );
135 if( parsed->tm_mday != oldday ) {
137 res = mktime( parsed );
140 return std::pair<bool, time_t>( true, res );
144 std::pair<bool, time_t> parseMonthInterval( std::time_t t, const std::string& date ) {
145 if( date[date.size() - 1] != 'm' ) {
146 return std::pair<bool, time_t>( false, 0 );
151 int num = std::stoi( date.substr( 0, date.size() - 1 ) , &end );
153 if( end != date.size() - 1 ) {
154 return std::pair<bool, time_t>( false, 0 );
157 return addMonths( t, num );
158 } catch( const std::invalid_argument& a ) {
159 return std::pair<bool, time_t>( false, 0 );
160 } catch( const std::out_of_range& a ) {
161 return std::pair<bool, time_t>( false, 0 );
164 std::pair<bool, time_t> parseYearInterval( std::time_t t, const std::string& date ) {
165 if( date[date.size() - 1] != 'y' ) {
166 return std::pair<bool, time_t>( false, 0 );
171 int num = std::stoi( date.substr( 0, date.size() - 1 ), &end );
173 if( end != date.size() - 1 ) {
174 return std::pair<bool, time_t>( false, 0 );
177 return addMonths( t, num * 12 );
178 } catch( std::invalid_argument& a ) {
179 return std::pair<bool, time_t>( false, 0 );
180 } catch( std::out_of_range& a ) {
181 return std::pair<bool, time_t>( false, 0 );
185 std::shared_ptr<std::ofstream> openLogfile( const std::string name) {
187 std::string tname = name;
189 while(stat (tname.c_str(), &buffer) == 0) {
190 tname = name + "_" + std::to_string(ctr++);
192 auto res = std::shared_ptr<std::ofstream>(new std::ofstream( tname ),
193 [](std::ofstream *p){
198 throw std::string("Failed to open file for logging: ") + name;