]> git.sur5r.net Git - openldap/blob - servers/slapd/backend.c
debug messages incorrectly said "add" instead of "remove".
[openldap] / servers / slapd / backend.c
1 /* backend.c - routines for dealing with back-end databases */
2
3
4 #include "portable.h"
5
6 #include <stdio.h>
7
8 #include <ac/string.h>
9 #include <ac/socket.h>
10
11 #include <sys/stat.h>
12
13 #include "slap.h"
14
15
16 #define BACKEND_GRAB_SIZE       10
17
18 int             nbackends;
19 Backend         *backends;
20 static int      maxbackends;
21
22 Backend *
23 new_backend(
24     char        *type
25 )
26 {
27         Backend *be;
28         int     foundit;
29
30         if ( nbackends == maxbackends ) {
31                 maxbackends += BACKEND_GRAB_SIZE;
32                 backends = (Backend *) ch_realloc( (char *) backends,
33                     maxbackends * sizeof(Backend) );
34                 memset( &backends[nbackends], '\0', BACKEND_GRAB_SIZE *
35                     sizeof(Backend) );
36         }
37
38         be = &backends[nbackends++];
39         be->be_sizelimit = defsize;
40         be->be_timelimit = deftime;
41         foundit = 0;
42
43 #ifdef SLAPD_LDBM
44         if ( strcasecmp( type, "ldbm" ) == 0 ) {
45                 be->be_bind = ldbm_back_bind;
46                 be->be_unbind = ldbm_back_unbind;
47                 be->be_search = ldbm_back_search;
48                 be->be_compare = ldbm_back_compare;
49                 be->be_modify = ldbm_back_modify;
50                 be->be_modrdn = ldbm_back_modrdn;
51                 be->be_add = ldbm_back_add;
52                 be->be_delete = ldbm_back_delete;
53                 be->be_abandon = ldbm_back_abandon;
54                 be->be_config = ldbm_back_config;
55                 be->be_init = ldbm_back_init;
56                 be->be_close = ldbm_back_close;
57 #ifdef SLAPD_ACLGROUPS
58                 be->be_group = ldbm_back_group;
59 #endif
60                 be->be_type = "ldbm";
61                 foundit = 1;
62         }
63 #endif
64
65 #ifdef SLAPD_PASSWD
66         if ( strcasecmp( type, "passwd" ) == 0 ) {
67                 be->be_bind = NULL;
68                 be->be_unbind = NULL;
69                 be->be_search = passwd_back_search;
70                 be->be_compare = NULL;
71                 be->be_modify = NULL;
72                 be->be_modrdn = NULL;
73                 be->be_add = NULL;
74                 be->be_delete = NULL;
75                 be->be_abandon = NULL;
76                 be->be_config = passwd_back_config;
77                 be->be_init = NULL;
78                 be->be_close = NULL;
79 #ifdef SLAPD_ACLGROUPS
80                 be->be_group = NULL;
81 #endif
82                 be->be_type = "passwd";
83                 foundit = 1;
84         }
85 #endif
86
87 #ifdef SLAPD_SHELL
88         if ( strcasecmp( type, "shell" ) == 0 ) {
89                 be->be_bind = shell_back_bind;
90                 be->be_unbind = shell_back_unbind;
91                 be->be_search = shell_back_search;
92                 be->be_compare = shell_back_compare;
93                 be->be_modify = shell_back_modify;
94                 be->be_modrdn = shell_back_modrdn;
95                 be->be_add = shell_back_add;
96                 be->be_delete = shell_back_delete;
97                 be->be_abandon = shell_back_abandon;
98                 be->be_config = shell_back_config;
99                 be->be_init = shell_back_init;
100                 be->be_close = NULL;
101 #ifdef SLAPD_ACLGROUPS
102                 be->be_group = NULL;
103 #endif
104                 be->be_type = "shell";
105                 foundit = 1;
106         }
107 #endif
108
109         if ( be->be_init != NULL ) {
110                 (*be->be_init)( be );
111         }
112
113         if ( foundit == 0 ) {
114                 fprintf( stderr, "Unrecognized database type (%s)\n", type );
115                 exit( 1 );
116         }
117
118         return( be );
119 }
120
121 Backend *
122 select_backend( char * dn )
123 {
124         int     i, j, len, dnlen;
125
126         dnlen = strlen( dn );
127         for ( i = 0; i < nbackends; i++ ) {
128                 for ( j = 0; backends[i].be_suffix != NULL &&
129                     backends[i].be_suffix[j] != NULL; j++ )
130                 {
131 #ifdef LDAP_ALLOW_NULL_SEARCH_BASE
132                         /* Add greg@greg.rim.or.jp
133                          * It's quick hack for cheap client
134                          * Some browser offer a NULL base at ldap_search
135                          */
136                         if(dnlen == 0) {
137                                 Debug( LDAP_DEBUG_TRACE,
138                                         "select_backend: use default backend\n", 0, 0, 0 );
139                                 return (&backends[i]);
140                         }
141 #endif /* LDAP_ALLOW_NULL_SEARCH_BASE */
142
143                         len = strlen( backends[i].be_suffix[j] );
144
145                         if ( len > dnlen ) {
146                                 continue;
147                         }
148
149                         if ( strcasecmp( backends[i].be_suffix[j],
150                             dn + (dnlen - len) ) == 0 ) {
151                                 return( &backends[i] );
152                         }
153                 }
154         }
155
156         /* if no proper suffix could be found then check for aliases */
157         for ( i = 0; i < nbackends; i++ ) {
158                 for ( j = 0; 
159                       backends[i].be_suffixAlias != NULL && 
160                       backends[i].be_suffixAlias[j] != NULL; 
161                       j += 2 )
162                 {
163                         len = strlen( backends[i].be_suffixAlias[j] );
164
165                         if ( len > dnlen ) {
166                                 continue;
167                         }
168
169                         if ( strcasecmp( backends[i].be_suffixAlias[j],
170                             dn + (dnlen - len) ) == 0 ) {
171                                 return( &backends[i] );
172                         }
173                 }
174         }
175
176
177         return( NULL );
178 }
179
180 int
181 be_issuffix(
182     Backend     *be,
183     char        *suffix
184 )
185 {
186         int     i;
187
188         for ( i = 0; be->be_suffix != NULL && be->be_suffix[i] != NULL; i++ ) {
189                 if ( strcasecmp( be->be_suffix[i], suffix ) == 0 ) {
190                         return( 1 );
191                 }
192         }
193
194         return( 0 );
195 }
196
197 int
198 be_isroot( Backend *be, char *dn )
199 {
200         if ( dn == NULL ) {
201                 return( 0 );
202         }
203
204         return( be->be_rootdn ? strcasecmp( be->be_rootdn, dn ) == 0
205             : 0 );
206 }
207
208 int
209 be_isroot_pw( Backend *be, char *dn, struct berval *cred )
210 {
211         if ( ! be_isroot( be, dn ) || be->be_rootpw == NULL ) {
212                 return( 0 );
213         }
214
215         return( strcmp( be->be_rootpw, cred->bv_val ) == 0 );
216 }
217
218 void
219 be_close( void )
220 {
221         int     i;
222
223         for ( i = 0; i < nbackends; i++ ) {
224                 if ( backends[i].be_close != NULL ) {
225                         (*backends[i].be_close)( &backends[i] );
226                 }
227         }
228 }
229
230
231 void
232 be_unbind(
233         Connection   *conn,
234         Operation    *op
235 )
236 {
237         int     i;
238
239         for ( i = 0; i < nbackends; i++ ) {
240                 if ( backends[i].be_unbind != NULL ) {
241                         (*backends[i].be_unbind)( &backends[i], conn, op );
242                 }
243         }
244 }
245
246 #ifdef SLAPD_ACLGROUPS
247 int 
248 be_group(
249         Backend *be,
250         char    *bdn,
251         char    *edn,
252         char    *objectclassValue,
253         char    *groupattrName
254 )
255 {
256         if (be->be_group)
257                 return(be->be_group(be, bdn, edn, objectclassValue, groupattrName));
258         else
259                 return(1);
260 }
261 #endif