11 void writeFile( const std::string& name, const std::string& content ) {
12 std::ofstream file( name );
15 //! \FIXME: Error checking
18 std::string readFile( const std::string& name ) {
19 std::ifstream t( name );
20 std::string res = std::string( std::istreambuf_iterator<char>( t ), std::istreambuf_iterator<char>() );
25 std::string writeBackFile( const std::string& serial, const std::string& cert, const std::string& keydir ) {
28 std::string filename = keydir;
30 if( 0 != mkdir( filename.c_str(), 0755 ) ) {
31 if( EEXIST != errno ) {
32 throw std::runtime_error( "Storage location could not be determined" );
35 //! \FIXME: Check this is a directory
40 if( 0 != mkdir( filename.c_str(), 0755 ) ) {
41 if( EEXIST != errno ) {
45 //! \FIXME: Check this is a directory
50 if( serial.length() < 3 ) {
53 first = serial.substr( 0, serial.length() - 3 );
56 filename += "/" + first;
58 if( 0 != mkdir( filename.c_str(), 0755 ) ) {
59 if( EEXIST != errno ) {
63 //! \FIXME: Check this is a directory
66 filename += "/" + serial + ".crt";
67 writeFile( filename, cert );
72 bool isDigit( char c ) {
73 return ( c >= '0' ) && ( c <= '9' );
76 std::pair<bool, time_t> parseDate( const std::string& date ) {
77 if( date.size() != 10 || date[4] != '-' || date[7] != '-' ) {
78 return std::pair<bool, time_t>( false, 0 );
81 if( !isDigit( date[0] )
82 || !isDigit( date[1] )
83 || !isDigit( date[2] )
84 || !isDigit( date[3] )
85 || !isDigit( date[5] )
86 || !isDigit( date[6] )
87 || !isDigit( date[8] )
88 || !isDigit( date[9] ) ) {
89 return std::pair<bool, time_t>( false, 0 );
96 t.tm_mday = std::stoi( date.substr( 8, 2 ) );
97 t.tm_mon = std::stoi( date.substr( 5, 2 ) ) - 1;
98 t.tm_year = std::stoi( date.substr( 0, 4 ) ) - 1900;
100 setenv( "TZ", "UTC", 1 );
102 std::time_t res = mktime( &t );
104 std::size_t siz = strftime( check, 11, "%Y-%m-%d", &t );
107 return std::pair<bool, time_t>( false, 0 ); // NO-COVERAGE (by contract of strftime)
110 std::string checkS( check, siz );
112 if( checkS != date ) {
116 return std::pair<bool, time_t>( true, res );
119 std::pair<bool, time_t> addMonths( std::time_t t, int32_t count ) {
120 std::tm *parsed = gmtime( &t );
122 if( !parsed || count <= 0 || count > 24 ) { // FIXED MAX-Validity-Length
123 return std::pair<bool, time_t>( false, 0 );
126 parsed->tm_mon += count;
127 int oldday = parsed->tm_mday;
128 setenv( "TZ", "UTC", 1 );
130 std::time_t res = mktime( parsed );
132 if( parsed->tm_mday != oldday ) {
134 res = mktime( parsed );
137 return std::pair<bool, time_t>( true, res );
140 std::pair<bool, time_t> parseMonthInterval( std::time_t t, const std::string& date ) {
141 if( date[date.size() - 1] != 'm' ) {
142 return std::pair<bool, time_t>( false, 0 );
147 int num = std::stoi( date.substr( 0, date.size() - 1 ), &end );
149 if( end != date.size() - 1 ) {
150 return std::pair<bool, time_t>( false, 0 );
153 return addMonths( t, num );
154 } catch( const std::invalid_argument& a ) {
155 return std::pair<bool, time_t>( false, 0 );
156 } catch( const std::out_of_range& a ) {
157 return std::pair<bool, time_t>( false, 0 );
161 std::pair<bool, time_t> parseYearInterval( std::time_t t, const std::string& date ) {
162 if( date[date.size() - 1] != 'y' ) {
163 return std::pair<bool, time_t>( false, 0 );
168 int num = std::stoi( date.substr( 0, date.size() - 1 ), &end );
170 if( end != date.size() - 1 ) {
171 return std::pair<bool, time_t>( false, 0 );
174 return addMonths( t, num * 12 );
175 } catch( std::invalid_argument& a ) {
176 return std::pair<bool, time_t>( false, 0 );
177 } catch( std::out_of_range& a ) {
178 return std::pair<bool, time_t>( false, 0 );
182 std::unique_ptr<std::ofstream> openLogfile( const std::string& name ) {
184 std::string tname = name;
187 while( stat( tname.c_str(), &buffer ) == 0 ) {
188 tname = name + "_" + std::to_string( ctr++ );
191 auto res = std::make_unique<std::ofstream>( tname );
193 if( ! res->good() ) {
194 throw std::runtime_error( std::string( "Failed to open file for logging: " ) + name );
200 std::string timestamp() {
203 if( time( &c_time ) == -1 ) {
204 throw std::runtime_error( "Error while fetching time?" );
207 return std::to_string( c_time );