Update copyright year
[umurmur.git] / src / conf.c
1 /* Copyright (C) 2009-2014, Martin Johansson <martin@fatbob.nu>
2    Copyright (C) 2005-2014, 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 #define DEFAULT_OPUS_THRESHOLD 100
49
50 const char defaultconfig[] = DEFAULT_CONFIG;
51
52 void Conf_init(const char *conffile)
53 {
54         config_init(&configuration);
55         if (conffile == NULL)
56                 conffile = defaultconfig;
57         if (config_read_file(&configuration, conffile) != CONFIG_TRUE) {
58                 Log_fatal("Error in config file %s line %d: %s", conffile,
59                                   config_error_line(&configuration), config_error_text(&configuration));
60         }
61 }
62
63 bool_t Conf_ok(const char *conffile)
64 {
65         bool_t rc = true;
66         config_init(&configuration);
67         if (conffile == NULL)
68                 conffile = defaultconfig;
69         if (config_read_file(&configuration, conffile) != CONFIG_TRUE) {
70                 fprintf(stderr, "Error in config file %s line %d: %s\n", conffile,
71                         config_error_line(&configuration), config_error_text(&configuration));
72                 rc = false;
73         }
74         config_destroy(&configuration);
75         return rc;
76 }
77
78 void Conf_deinit()
79 {
80         config_destroy(&configuration);
81 }
82
83 const char *getStrConf(param_t param)
84 {
85         config_setting_t *setting = NULL;
86         const char *strsetting = NULL;
87         
88         switch (param) {
89         case CERTIFICATE:
90                 setting = config_lookup(&configuration, "certificate");
91                 if (!setting)
92                         return "/etc/umurmur/certificate.crt";
93                 else {
94                         if ((strsetting = config_setting_get_string(setting)) != NULL)
95                                 return strsetting;
96                         else
97                                 return "/etc/umurmur/certificate.crt";
98                 }
99                 break;
100         case KEY:
101                 setting = config_lookup(&configuration, "private_key");
102                 if (!setting)
103                         return "/etc/umurmur/private_key.key";
104                 else {
105                         if ((strsetting = config_setting_get_string(setting)) != NULL)
106                                 return strsetting;
107                         else
108                                 return "/etc/umurmur/private_key.key";
109                 }
110                 break;
111         case CAPATH:
112                 setting = config_lookup(&configuration, "ca_path");
113                 if (!setting)
114                   return NULL;
115                 else {
116                         if ((strsetting = config_setting_get_string(setting)) != NULL)
117                                 return strsetting;
118                         else
119                                 return NULL;
120                 }
121                 break;
122         case PASSPHRASE:
123                 setting = config_lookup(&configuration, "password");
124                 if (!setting)
125                         return "";
126                 else {
127                         if ((strsetting = config_setting_get_string(setting)) != NULL)
128                                 return strsetting;
129                         else
130                                 return "";
131                 }
132                 break;
133         case ADMIN_PASSPHRASE:
134                 setting = config_lookup(&configuration, "admin_password");
135                 if (!setting)
136                         return "";
137                 else {
138                         if ((strsetting = config_setting_get_string(setting)) != NULL)
139                                 return strsetting;
140                         else
141                                 return "";
142                 }
143                 break;
144         case BINDADDR:
145                 setting = config_lookup(&configuration, "bindaddr");
146                 if (!setting)
147                         return "";
148                 else {
149                         if ((strsetting = config_setting_get_string(setting)) != NULL)
150                                 return strsetting;
151                         else
152                                 return "";
153                 }
154                 break;
155         case WELCOMETEXT:
156                 setting = config_lookup(&configuration, "welcometext");
157                 if (!setting)
158                         return DEFAULT_WELCOME;
159                 else {
160                         if ((strsetting = config_setting_get_string(setting)) != NULL)
161                                 return strsetting;
162                         else
163                         return DEFAULT_WELCOME;
164                 }
165                 break;
166         case DEFAULT_CHANNEL:
167                 setting = config_lookup(&configuration, "default_channel");
168                 if (!setting)
169                         return "";
170                 else {
171                         if ((strsetting = config_setting_get_string(setting)) != NULL)
172                                 return strsetting;
173                         else
174                         return "";
175                 }
176                 break;
177         case USERNAME:
178                 setting = config_lookup(&configuration, "username");
179                 if (!setting)
180                         return "";
181                 else {
182                         if ((strsetting = config_setting_get_string(setting)) != NULL)
183                                 return strsetting;
184                         else
185                         return "";
186                 }
187                 break;
188         case GROUPNAME:
189                 setting = config_lookup(&configuration, "groupname");
190                 if (!setting)
191                         return "";
192                 else {
193                         if ((strsetting = config_setting_get_string(setting)) != NULL)
194                                 return strsetting;
195                         else
196                         return "";
197                 }
198                 break;
199         case LOGFILE:
200                 setting = config_lookup(&configuration, "logfile");
201                 if (!setting)
202                         return NULL;
203                 else {
204                         if ((strsetting = config_setting_get_string(setting)) != NULL)
205                                 return strsetting;
206                         else
207                         return NULL;
208                 }
209                 break;
210         case BANFILE:
211                 setting = config_lookup(&configuration, "banfile");
212                 if (!setting)
213                         return NULL;
214                 else {
215                         if ((strsetting = config_setting_get_string(setting)) != NULL)
216                                 return strsetting;
217                         else
218                         return NULL;
219                 }
220                 break;
221         default:
222                 doAssert(false);
223                 break;
224         }
225         return NULL;
226 }
227
228 int getIntConf(param_t param)
229 {
230         config_setting_t *setting = NULL;
231         
232         switch (param) {
233         case BINDPORT:
234                 setting = config_lookup(&configuration, "bindport");
235                 if (!setting)
236                         return DEFAULT_BINDPORT;
237                 else {
238                         return config_setting_get_int(setting);
239                 }
240                 break;
241         case BAN_LENGTH:
242                 setting = config_lookup(&configuration, "ban_length");
243                 if (!setting)
244                         return DEFAULT_BAN_LENGTH;
245                 else {
246                         return config_setting_get_int(setting);
247                 }
248                 break;
249         case MAX_BANDWIDTH:
250                 setting = config_lookup(&configuration, "max_bandwidth");
251                 if (!setting)
252                         return DEFAULT_MAX_BANDWIDTH;
253                 else {
254                         return config_setting_get_int(setting);
255                 }
256                 break;
257         case MAX_CLIENTS:
258                 setting = config_lookup(&configuration, "max_users");
259                 if (!setting)
260                         return DEFAULT_MAX_CLIENTS;
261                 else {
262                         return config_setting_get_int(setting);
263                 }
264                 break;
265         case OPUS_THRESHOLD:
266                 setting = config_lookup(&configuration, "opus_threshold");
267                 if (!setting)
268                         return DEFAULT_OPUS_THRESHOLD;
269                 else {
270                         return config_setting_get_int(setting);
271                 }
272                 break;
273         default:
274                 doAssert(false);
275         }
276 }
277
278 bool_t getBoolConf(param_t param)
279 {
280         config_setting_t *setting = NULL;
281         
282         switch (param) {
283         case ALLOW_TEXTMESSAGE:
284                 setting = config_lookup(&configuration, "allow_textmessage");
285                 if (!setting)
286                         return true;
287                 else
288                         return config_setting_get_bool(setting);
289                 break;
290         case ENABLE_BAN:
291                 setting = config_lookup(&configuration, "enable_ban");
292                 if (!setting)
293                         return false;
294                 else
295                         return config_setting_get_bool(setting);
296                 break;
297         case SYNC_BANFILE:
298                 setting = config_lookup(&configuration, "sync_banfile");
299                 if (!setting)
300                         return false;
301                 else
302                         return config_setting_get_bool(setting);
303                 break;
304         default:
305                 doAssert(false);
306         }
307 }
308
309 int Conf_getNextChannel(conf_channel_t *chdesc, int index)
310 {
311         config_setting_t *setting = NULL;
312         int maxconfig = 64, ret = 0;
313         char configstr[maxconfig];
314         
315         ret = snprintf(configstr, maxconfig, "channels.[%d].name", index);
316         setting = config_lookup(&configuration, configstr);
317         if (ret >= maxconfig || ret < 0 || setting == NULL)
318                 return -1; /* Required */
319         chdesc->name =  config_setting_get_string(setting);
320         
321         ret = snprintf(configstr, maxconfig, "channels.[%d].parent", index);
322         setting = config_lookup(&configuration, configstr);
323         if (ret >= maxconfig || ret < 0 || setting == NULL)
324                 return -1; /* Required */
325         chdesc->parent = config_setting_get_string(setting);
326         
327         ret = snprintf(configstr, maxconfig, "channels.[%d].description", index);
328         setting = config_lookup(&configuration, configstr);
329         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
330                 chdesc->description = NULL;
331         else
332                 chdesc->description = config_setting_get_string(setting);
333         
334         ret = snprintf(configstr, maxconfig, "channels.[%d].password", index);
335         setting = config_lookup(&configuration, configstr);
336         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
337                 chdesc->password = NULL;
338         else
339                 chdesc->password = config_setting_get_string(setting);
340         
341         ret = snprintf(configstr, maxconfig, "channels.[%d].noenter", index);
342         setting = config_lookup(&configuration, configstr);
343         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
344                 chdesc->noenter = false;
345         else
346                 chdesc->noenter = config_setting_get_bool(setting);
347         
348         ret = snprintf(configstr, maxconfig, "channels.[%d].silent", index);
349         setting = config_lookup(&configuration, configstr);
350         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
351                 chdesc->silent = false;
352         else
353                 chdesc->silent = config_setting_get_bool(setting);
354         
355         ret = snprintf(configstr, maxconfig, "channels.[%d].position", index);
356         setting = config_lookup(&configuration, configstr);
357         if (ret >= maxconfig || ret < 0 || setting == NULL) /* Optional */
358                 chdesc->position = 0;
359         else
360                 chdesc->position = config_setting_get_int(setting);
361
362         return 0;
363 }
364
365 int Conf_getNextChannelLink(conf_channel_link_t *chlink, int index)
366 {
367         config_setting_t *setting = NULL;
368         int maxconfig = 64, ret = 0;
369         char configstr[maxconfig];
370         
371         ret = snprintf(configstr, maxconfig, "channel_links.[%d].source", index);
372         setting = config_lookup(&configuration, configstr);
373         if (ret >= maxconfig || ret < 0 || setting == NULL)
374                 return -1;
375         chlink->source = config_setting_get_string(setting);
376
377         ret = snprintf(configstr, maxconfig, "channel_links.[%d].destination", index);
378         setting = config_lookup(&configuration, configstr);
379         if (ret >= maxconfig || ret < 0 || setting == NULL)
380                 return -1;
381         chlink->destination = config_setting_get_string(setting);
382
383         return 0;
384 }