]> WPIA git - cassiopeia.git/blob - src/config.cpp
ad3c1375963a16602d07611b62bc7ff502e31606
[cassiopeia.git] / src / config.cpp
1 #include <iostream>
2 #include <vector>
3 #include <fstream>
4 #include <dirent.h>
5 #include <unordered_map>
6
7 #include "crypto/sslUtil.h"
8
9 std::string keyDir;
10 std::unordered_map<std::string, Profile> profiles;
11 std::unordered_map<std::string, std::shared_ptr<CAConfig>> CAs;
12 std::string sqlHost, sqlUser, sqlPass, sqlDB;
13 std::string serialPath;
14
15 std::shared_ptr<std::unordered_map<std::string, std::string>> parseConf( std::string path ) {
16     std::shared_ptr<std::unordered_map<std::string, std::string>> map( new std::unordered_map<std::string, std::string>() );
17     std::ifstream config;
18     config.open( path );
19
20     if( !config.is_open() ) {
21         std::cout << "Where is " << path << "?" << std::endl;
22         throw "Config missing";
23     }
24
25     std::string line1;
26
27     while( std::getline( config, line1 ) ) {
28         if( line1[0] == '#' || line1.size() == 0 ) {
29             continue;
30         }
31
32         int splitter = line1.find( "=" );
33
34         if( splitter == -1 ) {
35             std::cerr << "Ignoring malformed config line: " << line1 << std::endl;
36             continue;
37         }
38
39         std::string key = line1.substr( 0, splitter );
40         std::string value = line1.substr( splitter + 1 );
41         map->emplace( key, value );
42     }
43
44     config.close();
45
46     return map;
47 }
48
49 int parseProfiles() {
50     CAs = std::unordered_map<std::string, std::shared_ptr<CAConfig>>();
51
52     DIR* dp;
53     struct dirent* ep;
54     dp = opendir( "profiles" );
55
56     if( dp == NULL ) {
57         std::cerr << "Profiles not found " << std::endl;
58         return -1;
59     }
60
61     while( ( ep = readdir( dp ) ) ) {
62         if( ep->d_name[0] == '.' ) {
63             continue;
64         }
65
66         std::string profileName( ep->d_name );
67
68         int splitter = profileName.find( "-" );
69
70         if( splitter == -1 ) {
71             std::cerr << "Ignoring malformed profile: " << profileName << std::endl;
72             continue;
73         }
74
75         std::string id = profileName.substr( 0, splitter );
76
77         if( profileName.substr( profileName.size() - 4 ) != ".cfg" ) {
78             std::cerr << "Ignoring malformed profile: " << profileName << std::endl;
79             continue;
80         }
81
82         auto map = parseConf( std::string( "profiles/" ) + profileName );
83
84         profileName = profileName.substr( 0, profileName.size() - 4 );
85
86         Profile prof;
87         prof.id = std::stoi( id );
88         prof.eku = map->at( "eku" );
89         prof.ku = map->at( "ku" );
90         prof.maxValidity = std::stoi( map->at( "days" ) ) * /* DAYS */24 * 60 * 60;
91
92         std::string cas = map->at( "ca" );
93
94         DIR *dir;
95         struct dirent *ent;
96         if ((dir = opendir ("ca")) != NULL) {
97             while ((ent = readdir (dir)) != NULL) {
98                 std::string caName = std::string(ent->d_name);
99                 if( caName.find( cas ) != 0 ){
100                     continue;
101                 }
102
103                 if( CAs.find( caName ) == CAs.end() ) {
104                     std::shared_ptr<CAConfig> ca( new CAConfig( caName ) );
105                     CAs.emplace( caName, ca );
106                 }
107
108                 prof.ca.push_back( CAs.at( caName ) );
109                 std::cout << "Adding CA: " << caName << std::endl;
110             }
111             closedir (dir);
112         } else {
113             throw "Directory with CAConfigs not found";
114         }
115
116         profiles.emplace( profileName, prof );
117         std::cout << "Profile: " << profileName << " up and running." << std::endl;
118     }
119
120     ( void ) closedir( dp );
121
122
123     std::cout << profiles.size() << " profiles loaded." << std::endl;
124
125     return 0;
126 }
127
128 int parseConfig( std::string path ) {
129
130     auto masterConf = parseConf( path );
131
132     keyDir = masterConf->at( "key.directory" );
133     sqlHost = masterConf->at( "sql.host" );
134     sqlUser = masterConf->at( "sql.user" );
135     sqlPass = masterConf->at( "sql.password" );
136     sqlDB = masterConf->at( "sql.database" );
137     serialPath = masterConf->at( "serialPath" );
138
139     if( keyDir == "" ) {
140         std::cerr << "Missing config property key.directory" << std::endl;
141         return -1;
142     }
143
144     if( parseProfiles() != 0 ) {
145         return -1;
146     }
147
148     return 0;
149 }