]> arthur.barton.de Git - netatalk.git/blob - libatalk/acl/ldap_config.c
Fix SIGHUP config reloading
[netatalk.git] / libatalk / acl / ldap_config.c
1 /*
2   Copyright (c) 2009 Frank Lahm <franklahm@gmail.com>
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2 of the License, or
7   (at your option) any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13 */
14
15 #ifdef HAVE_CONFIG_H
16 #include "config.h"
17 #endif /* HAVE_CONFIG_H */
18
19 #ifdef HAVE_LDAP
20
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <errno.h>
24 #include <string.h>
25 #include <ctype.h>
26 #include <ldap.h>
27
28 #include <atalk/globals.h>
29 #include <atalk/ldapconfig.h>
30 #include <atalk/logger.h>
31 #include <atalk/iniparser.h>
32
33 void acl_ldap_freeconfig(void)
34 {
35     for (int i = 0; ldap_prefs[i].name != NULL; i++) {
36         if (ldap_prefs[i].intfromarray == 0 && ldap_prefs[i].strorint == 0) {
37             free(*((char **)(ldap_prefs[i].pref)));
38             *((char **)(ldap_prefs[i].pref)) = NULL;
39         }
40         ldap_prefs[i].valid = ldap_prefs[i].valid_save;
41     }
42 }
43
44 int acl_ldap_readconfig(dictionary *iniconfig)
45 {
46     int i, j;
47     const char *val;
48
49     i = 0;
50     /* now see if its a correct pref */
51     for (i = 0; ldap_prefs[i].name != NULL; i++) {
52         if ((val = iniparser_getstring(iniconfig, INISEC_GLOBAL, ldap_prefs[i].name, NULL))) {
53             /* check if we have pre-defined values */
54             if (ldap_prefs[i].intfromarray == 0) {
55                 /* no, its just a string */
56                 ldap_prefs[i].valid = 0;
57                 if (ldap_prefs[i].strorint)
58                     /* store as int */
59                     *((int *)(ldap_prefs[i].pref)) = atoi(val);
60                 else
61                     /* store string as string */
62                     *((const char **)(ldap_prefs[i].pref)) = strdup(val);
63             } else {
64                 /* ok, we have string to int mapping for this pref
65                    eg. "none", "simple", "sasl" map to 0, 128, 129 */
66                 for (j = 0; prefs_array[j].pref != NULL; j++) {
67                     if ((strcmp(prefs_array[j].pref, ldap_prefs[i].name) == 0)
68                         && (strcmp(prefs_array[j].valuestring, val) == 0)) {
69                         ldap_prefs[i].valid = 0;
70                         *((int *)(ldap_prefs[i].pref)) = prefs_array[j].value;
71                         break;
72                     }
73                 }
74             }
75         }
76     }
77
78     /* check if the config is sane and complete */
79     i = 0;
80     ldap_config_valid = 1;
81
82     while(ldap_prefs[i].pref != NULL) {
83         if ( ldap_prefs[i].valid != 0) {
84             LOG(log_debug, logtype_afpd,"LDAP: Missing option: \"%s\"", ldap_prefs[i].name);
85             ldap_config_valid = 0;
86             break;
87         }
88         i++;
89     }
90
91     if (ldap_config_valid) {
92         if (ldap_auth_method == LDAP_AUTH_NONE)
93             LOG(log_debug, logtype_afpd,"LDAP: Using anonymous bind.");
94         else if (ldap_auth_method == LDAP_AUTH_SIMPLE)
95             LOG(log_debug, logtype_afpd,"LDAP: Using simple bind.");
96         else {
97             ldap_config_valid = 0;
98             LOG(log_error, logtype_afpd,"LDAP: SASL not yet supported.");
99         }
100     } else
101         LOG(log_info, logtype_afpd,"LDAP: not used");
102     return 0;
103 }
104 #endif /* HAVE_LDAP */