ccd8e05cde4dfefe3f8d7bd468569de9ddca24ad
[umurmur.git] / src / conf.c
1 /* Copyright (C) 2009-2012, Martin Johansson <martin@fatbob.nu>
2    Copyright (C) 2005-2012, Thorvald Natvig <thorvald@natvig.com>
3
4    All rights reserved.
5
6    Redistribution and use in source and binary forms, with or without
7    modification, are permitted provided that the following conditions
8    are met:
9
10    - Redistributions of source code must retain the above copyright notice,
11      this list of conditions and the following disclaimer.
12    - Redistributions in binary form must reproduce the above copyright notice,
13      this list of conditions and the following disclaimer in the documentation
14      and/or other materials provided with the distribution.
15    - Neither the name of the Developers nor the names of its contributors may
16      be used to endorse or promote products derived from this software without
17      specific prior written permission.
18
19    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #include <libconfig.h>
36
37 #include "types.h"
38 #include "conf.h"
39 #include "log.h"
40
41 static config_t configuration;
42
43 #define DEFAULT_WELCOME "Welcome to uMurmur!"
44 #define DEFAULT_MAX_CLIENTS 10
45 #define DEFAULT_MAX_BANDWIDTH 48000
46 #define DEFAULT_BINDPORT 64738
47 #define DEFAULT_BAN_LENGTH (60*60)
48
49 const char defaultconfig[] = DEFAULT_CONFIG;
50
51 void Conf_init(const char *conffile)
52 {
53         config_init(&configuration);
54         if (conffile == NULL)
55                 conffile = defaultconfig;
56         if (config_read_file(&configuration, conffile) != CONFIG_TRUE) {
57                 Log_fatal("Error in config file %s line %d: %s", conffile,
58                                   config_error_line(&configuration), config_error_text(&configuration));
59         }
60 }
61
62 bool_t Conf_ok(const char *conffile)
63 {
64         bool_t rc = true;
65         config_init(&configuration);
66         if (conffile == NULL)
67                 conffile = defaultconfig;
68         if (config_read_file(&configuration, conffile) != CONFIG_TRUE) {
69                 fprintf(stderr, "Error in config file %s line %d: %s\n", conffile,
70                         config_error_line(&configuration), config_error_text(&configuration));
71                 rc = false;
72         }
73         config_destroy(&configuration);
74         return rc;
75 }
76
77 void Conf_deinit()
78 {
79         config_destroy(&configuration);
80 }
81
82 const char *getStrConf(param_t param)
83 {
84         config_setting_t *setting = NULL;
85         const char *strsetting = NULL;
86         
87         switch (param) {
88         case CERTIFICATE:
89                 setting = config_lookup(&configuration, "certificate");
90                 if (!setting)
91                         return "/etc/umurmur/certificate.crt";
92                 else {
93                         if ((strsetting = config_setting_get_string(setting)) != NULL)
94                                 return strsetting;
95                         else
96                                 return "/etc/umurmur/certificate.crt";
97                 }
98                 break;
99         case KEY:
100                 setting = config_lookup(&configuration, "private_key");
101                 if (!setting)
102                         return "/etc/umurmur/private_key.key";
103                 else {
104                         if ((strsetting = config_setting_get_string(setting)) != NULL)
105                                 return strsetting;
106                         else
107                                 return "/etc/umurmur/private_key.key";
108                 }
109                 break;
110         case PASSPHRASE:
111                 setting = config_lookup(&configuration, "password");
112                 if (!setting)
113                         return "";
114                 else {
115                         if ((strsetting = config_setting_get_string(setting)) != NULL)
116                                 return strsetting;
117                         else
118                                 return "";
119                 }
120                 break;
121         case ADMIN_PASSPHRASE:
122                 setting = config_lookup(&configuration, "admin_password");
123                 if (!setting)
124                         return "";
125                 else {
126                         if ((strsetting = config_setting_get_string(setting)) != NULL)
127                                 return strsetting;
128                         else
129                                 return "";
130                 }
131                 break;
132         case BINDADDR:
133                 setting = config_lookup(&configuration, "bindaddr");
134                 if (!setting)
135                         return "";
136                 else {
137                         if ((strsetting = config_setting_get_string(setting)) != NULL)
138                                 return strsetting;
139                         else
140                                 return "";
141                 }
142                 break;
143         case WELCOMETEXT:
144                 setting = config_lookup(&configuration, "welcometext");
145                 if (!setting)
146                         return DEFAULT_WELCOME;
147                 else {
148                         if ((strsetting = config_setting_get_string(setting)) != NULL)
149                                 return strsetting;
150                         else
151                         return DEFAULT_WELCOME;
152                 }
153                 break;
154         case DEFAULT_CHANNEL:
155                 setting = config_lookup(&configuration, "default_channel");
156                 if (!setting)
157                         return "";
158                 else {
159                         if ((strsetting = config_setting_get_string(setting)) != NULL)
160                                 return strsetting;
161                         else
162                         return "";
163                 }
164                 break;
165         case USERNAME:
166                 setting = config_lookup(&configuration, "username");
167                 if (!setting)
168                         return "";
169                 else {
170                         if ((strsetting = config_setting_get_string(setting)) != NULL)
171                                 return strsetting;
172                         else
173                         return "";
174                 }
175                 break;
176         case GROUPNAME:
177                 setting = config_lookup(&configuration, "groupname");
178                 if (!setting)
179                         return "";
180                 else {
181                         if ((strsetting = config_setting_get_string(setting)) != NULL)
182                                 return strsetting;
183                         else
184                         return "";
185                 }
186                 break;
187         case LOGFILE:
188                 setting = config_lookup(&configuration, "logfile");
189                 if (!setting)
190                         return NULL;
191                 else {
192                         if ((strsetting = config_setting_get_string(setting)) != NULL)
193                                 return strsetting;
194                         else
195                         return NULL;
196                 }
197                 break;
198         case BANFILE:
199                 setting = config_lookup(&configuration, "banfile");
200                 if (!setting)
201                         return NULL;
202                 else {
203                         if ((strsetting = config_setting_get_string(setting)) != NULL)
204                                 return strsetting;
205                         else
206                         return NULL;
207                 }
208                 break;
209         default:
210                 doAssert(false);
211                 break;
212         }
213         return NULL;
214 }
215
216 int getIntConf(param_t param)
217 {
218         config_setting_t *setting = NULL;
219         
220         switch (param) {
221         case BINDPORT:
222                 setting = config_lookup(&configuration, "bindport");
223                 if (!setting)
224                         return DEFAULT_BINDPORT;
225                 else {
226                         return config_setting_get_int(setting);
227                 }
228                 break;
229         case BAN_LENGTH:
230                 setting = config_lookup(&configuration, "ban_length");
231                 if (!setting)
232                         return DEFAULT_BAN_LENGTH;
233                 else {
234                         return config_setting_get_int(setting);
235                 }
236                 break;
237         case MAX_BANDWIDTH:
238                 setting = config_lookup(&configuration, "max_bandwidth");
239                 if (!setting)
240                         return DEFAULT_MAX_BANDWIDTH;
241                 else {
242                         return config_setting_get_int(setting);
243                 }
244                 break;
245         case MAX_CLIENTS:
246                 setting = config_lookup(&configuration, "max_users");
247                 if (!setting)
248                         return DEFAULT_MAX_CLIENTS;
249                 else {
250                         return config_setting_get_int(setting);
251                 }
252                 break;
253         default:
254                 doAssert(false);
255         }
256 }
257
258 bool_t getBoolConf(param_t param)
259 {
260         config_setting_t *setting = NULL;
261         
262         switch (param) {
263         case ALLOW_TEXTMESSAGE:
264                 setting = config_lookup(&configuration, "allow_textmessage");
265                 if (!setting)
266                         return true;
267                 else
268                         return config_setting_get_bool(setting);
269                 break;
270         case ENABLE_BAN:
271                 setting = config_lookup(&configuration, "enable_ban");
272                 if (!setting)
273                         return false;
274                 else
275                         return config_setting_get_bool(setting);
276                 break;
277         case SYNC_BANFILE:
278                 setting = config_lookup(&configuration, "sync_banfile");
279                 if (!setting)
280                         return false;
281                 else
282                         return config_setting_get_bool(setting);
283                 break;
284         default:
285                 doAssert(false);
286         }
287 }
288
289 int Conf_getNextChannel(conf_channel_t *chdesc, int index)
290 {
291         config_setting_t *setting = NULL;
292         int maxconfig = 64, ret = 0;
293         char configstr[maxconfig];
294         
295         ret = snprintf(configstr, maxconfig, "channels.[%d].name", index);
296         setting = config_lookup(&configuration, configstr);
297         if (ret >= maxconfig || ret < 0 || setting == NULL)
298                 return -1; /* Required */
299         chdesc->name =  config_setting_get_string(setting);
300         
301         ret = snprintf(configstr, maxconfig, "channels.[%d].parent", index);
302         setting = config_lookup(&configuration, configstr);
303         if (ret >= maxconfig || ret < 0 || setting == NULL)
304                 return -1; /* Required */
305         chdesc->parent = config_setting_get_string(setting);
306         
307         ret = snprintf(configstr, maxconfig, "channels.[%d].description", index);
308         setting = config_lookup(&configuration, configstr);
309         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
310                 chdesc->description = NULL;
311         else
312                 chdesc->description = config_setting_get_string(setting);
313         
314         ret = snprintf(configstr, maxconfig, "channels.[%d].password", index);
315         setting = config_lookup(&configuration, configstr);
316         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
317                 chdesc->password = NULL;
318         else
319                 chdesc->password = config_setting_get_string(setting);
320         
321         ret = snprintf(configstr, maxconfig, "channels.[%d].noenter", index);
322         setting = config_lookup(&configuration, configstr);
323         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
324                 chdesc->noenter = false;
325         else
326                 chdesc->noenter = config_setting_get_bool(setting);
327
328         return 0;
329 }
330
331 int Conf_getNextChannelLink(conf_channel_link_t *chlink, int index)
332 {
333         config_setting_t *setting = NULL;
334         int maxconfig = 64, ret = 0;
335         char configstr[maxconfig];
336         
337         ret = snprintf(configstr, maxconfig, "channel_links.[%d].source", index);
338         setting = config_lookup(&configuration, configstr);
339         if (ret >= maxconfig || ret < 0 || setting == NULL)
340                 return -1;
341         chlink->source = config_setting_get_string(setting);
342
343         ret = snprintf(configstr, maxconfig, "channel_links.[%d].destination", index);
344         setting = config_lookup(&configuration, configstr);
345         if (ret >= maxconfig || ret < 0 || setting == NULL)
346                 return -1;
347         chlink->destination = config_setting_get_string(setting);
348
349         return 0;
350 }