]> git.sur5r.net Git - openldap/blob - servers/slapd/slapi/slapi_pblock.c
33d1babe4b2e2aca2690b5fe131a650dad9ecafa
[openldap] / servers / slapd / slapi / slapi_pblock.c
1 /*
2  * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5 /*
6  * Portions Copyright IBM Corp. 1997,2002-2003
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted only as authorized by the OpenLDAP
9  * Public License, version 2.7 or later.
10  */
11
12 #include "portable.h"
13 #include <slap.h>
14 #include <slapi.h>
15
16 static int 
17 isOkNetscapeParam( int param ) 
18 {
19         switch ( param ) {
20         case SLAPI_BACKEND:
21         case SLAPI_CONNECTION:
22         case SLAPI_OPERATION:
23         case SLAPI_OPERATION_PARAMETERS:
24         case SLAPI_OPERATION_TYPE:
25         case SLAPI_OPERATION_ID:
26         case SLAPI_OPERATION_AUTHTYPE:
27         case SLAPI_REQUESTOR_ISROOT:
28         case SLAPI_BE_MONITORDN:
29         case SLAPI_BE_TYPE:
30         case SLAPI_BE_READONLY:
31         case SLAPI_BE_LASTMOD:
32         case SLAPI_CONN_ID:
33         case SLAPI_OPINITIATED_TIME:
34         case SLAPI_REQUESTOR_DN:
35         case SLAPI_REQUESTOR_ISUPDATEDN:
36         case SLAPI_CONN_DN:
37         case SLAPI_CONN_CLIENTIP:
38         case SLAPI_CONN_SERVERIP:
39         case SLAPI_CONN_AUTHTYPE:
40         case SLAPI_CONN_AUTHMETHOD:
41         case SLAPI_CONN_CERT:
42         case SLAPI_X_CONN_IS_UDP:
43         case SLAPI_X_CONN_CLIENTPATH:
44         case SLAPI_X_CONN_SERVERPATH:
45         case SLAPI_X_CONN_SSF:
46         case SLAPI_X_CONN_SASL_CONTEXT:
47         case SLAPI_IBM_CONN_DN_ALT:
48         case SLAPI_IBM_CONN_DN_ORIG:
49         case SLAPI_IBM_GSSAPI_CONTEXT:
50         case SLAPI_PLUGIN:
51         case SLAPI_PLUGIN_PRIVATE:
52         case SLAPI_PLUGIN_TYPE:
53         case SLAPI_PLUGIN_ARGV:
54         case SLAPI_PLUGIN_ARGC:
55         case SLAPI_PLUGIN_VERSION:
56         case SLAPI_PLUGIN_OPRETURN:
57         case SLAPI_PLUGIN_OBJECT:
58         case SLAPI_PLUGIN_DESTROY_FN:
59         case SLAPI_PLUGIN_DESCRIPTION:
60         case SLAPI_PLUGIN_INTOP_RESULT:
61         case SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES:
62         case SLAPI_PLUGIN_INTOP_SEARCH_REFERRALS:
63         case SLAPI_PLUGIN_DB_BIND_FN:
64         case SLAPI_PLUGIN_DB_UNBIND_FN:
65         case SLAPI_PLUGIN_DB_SEARCH_FN:
66         case SLAPI_PLUGIN_DB_COMPARE_FN:
67         case SLAPI_PLUGIN_DB_MODIFY_FN:
68         case SLAPI_PLUGIN_DB_MODRDN_FN:
69         case SLAPI_PLUGIN_DB_ADD_FN:
70         case SLAPI_PLUGIN_DB_DELETE_FN:
71         case SLAPI_PLUGIN_DB_ABANDON_FN:
72         case SLAPI_PLUGIN_DB_CONFIG_FN:
73         case SLAPI_PLUGIN_CLOSE_FN:
74         case SLAPI_PLUGIN_DB_FLUSH_FN:
75         case SLAPI_PLUGIN_START_FN:
76         case SLAPI_PLUGIN_DB_SEQ_FN:
77         case SLAPI_PLUGIN_DB_ENTRY_FN:
78         case SLAPI_PLUGIN_DB_REFERRAL_FN:
79         case SLAPI_PLUGIN_DB_RESULT_FN:
80         case SLAPI_PLUGIN_DB_LDIF2DB_FN:
81         case SLAPI_PLUGIN_DB_DB2LDIF_FN:
82         case SLAPI_PLUGIN_DB_BEGIN_FN:
83         case SLAPI_PLUGIN_DB_COMMIT_FN:
84         case SLAPI_PLUGIN_DB_ABORT_FN:
85         case SLAPI_PLUGIN_DB_ARCHIVE2DB_FN:
86         case SLAPI_PLUGIN_DB_DB2ARCHIVE_FN:
87         case SLAPI_PLUGIN_DB_NEXT_SEARCH_ENTRY_FN:
88         case SLAPI_PLUGIN_DB_FREE_RESULT_SET_FN:
89         case SLAPI_PLUGIN_DB_SIZE_FN:
90         case SLAPI_PLUGIN_DB_TEST_FN:
91         case SLAPI_PLUGIN_DB_NO_ACL:
92         case SLAPI_PLUGIN_EXT_OP_FN:
93         case SLAPI_PLUGIN_EXT_OP_OIDLIST:
94         case SLAPI_PLUGIN_PRE_BIND_FN:
95         case SLAPI_PLUGIN_PRE_UNBIND_FN:
96         case SLAPI_PLUGIN_PRE_SEARCH_FN:
97         case SLAPI_PLUGIN_PRE_COMPARE_FN:
98         case SLAPI_PLUGIN_PRE_MODIFY_FN:
99         case SLAPI_PLUGIN_PRE_MODRDN_FN:
100         case SLAPI_PLUGIN_PRE_ADD_FN:
101         case SLAPI_PLUGIN_PRE_DELETE_FN:
102         case SLAPI_PLUGIN_PRE_ABANDON_FN:
103         case SLAPI_PLUGIN_PRE_ENTRY_FN:
104         case SLAPI_PLUGIN_PRE_REFERRAL_FN:
105         case SLAPI_PLUGIN_PRE_RESULT_FN:
106         case SLAPI_PLUGIN_POST_BIND_FN:
107         case SLAPI_PLUGIN_POST_UNBIND_FN:
108         case SLAPI_PLUGIN_POST_SEARCH_FN:
109         case SLAPI_PLUGIN_POST_COMPARE_FN:
110         case SLAPI_PLUGIN_POST_MODIFY_FN:
111         case SLAPI_PLUGIN_POST_MODRDN_FN:
112         case SLAPI_PLUGIN_POST_ADD_FN:
113         case SLAPI_PLUGIN_POST_DELETE_FN:
114         case SLAPI_PLUGIN_POST_ABANDON_FN:
115         case SLAPI_PLUGIN_POST_ENTRY_FN:
116         case SLAPI_PLUGIN_POST_REFERRAL_FN:
117         case SLAPI_PLUGIN_POST_RESULT_FN:
118         case SLAPI_PLUGIN_MR_FILTER_CREATE_FN:
119         case SLAPI_PLUGIN_MR_INDEXER_CREATE_FN:
120         case SLAPI_PLUGIN_MR_FILTER_MATCH_FN:
121         case SLAPI_PLUGIN_MR_FILTER_INDEX_FN:
122         case SLAPI_PLUGIN_MR_FILTER_RESET_FN:
123         case SLAPI_PLUGIN_MR_INDEX_FN:
124         case SLAPI_PLUGIN_MR_OID:
125         case SLAPI_PLUGIN_MR_TYPE:
126         case SLAPI_PLUGIN_MR_VALUE:
127         case SLAPI_PLUGIN_MR_VALUES:
128         case SLAPI_PLUGIN_MR_KEYS:
129         case SLAPI_PLUGIN_MR_FILTER_REUSABLE:
130         case SLAPI_PLUGIN_MR_QUERY_OPERATOR:
131         case SLAPI_PLUGIN_MR_USAGE:
132         case SLAPI_OP_LESS:
133         case SLAPI_OP_LESS_OR_EQUAL:
134         case SLAPI_PLUGIN_MR_USAGE_INDEX:
135         case SLAPI_PLUGIN_SYNTAX_FILTER_AVA:
136         case SLAPI_PLUGIN_SYNTAX_FILTER_SUB:
137         case SLAPI_PLUGIN_SYNTAX_VALUES2KEYS:
138         case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_AVA:
139         case SLAPI_PLUGIN_SYNTAX_ASSERTION2KEYS_SUB:
140         case SLAPI_PLUGIN_SYNTAX_NAMES:
141         case SLAPI_PLUGIN_SYNTAX_OID:
142         case SLAPI_PLUGIN_SYNTAX_FLAGS:
143         case SLAPI_PLUGIN_SYNTAX_COMPARE:
144         case SLAPI_MANAGEDSAIT:
145         case SLAPI_CONFIG_FILENAME:
146         case SLAPI_CONFIG_LINENO:
147         case SLAPI_CONFIG_ARGC:
148         case SLAPI_CONFIG_ARGV:
149         case SLAPI_TARGET_DN:
150         case SLAPI_REQCONTROLS:
151         case SLAPI_ENTRY_PRE_OP:
152         case SLAPI_ENTRY_POST_OP:
153         case SLAPI_RESCONTROLS:
154         case SLAPI_ADD_RESCONTROL:
155         case SLAPI_ADD_ENTRY:
156         case SLAPI_BIND_METHOD:
157         case SLAPI_BIND_CREDENTIALS:
158         case SLAPI_BIND_SASLMECHANISM:
159         case SLAPI_BIND_RET_SASLCREDS:
160         case SLAPI_COMPARE_TYPE:
161         case SLAPI_COMPARE_VALUE:
162         case SLAPI_MODIFY_MODS:
163         case SLAPI_MODRDN_NEWRDN:
164         case SLAPI_MODRDN_DELOLDRDN:
165         case SLAPI_MODRDN_NEWSUPERIOR:
166         case SLAPI_SEARCH_SCOPE:
167         case SLAPI_SEARCH_DEREF:
168         case SLAPI_SEARCH_SIZELIMIT:
169         case SLAPI_SEARCH_TIMELIMIT:
170         case SLAPI_SEARCH_FILTER:
171         case SLAPI_SEARCH_STRFILTER:
172         case SLAPI_SEARCH_ATTRS:
173         case SLAPI_SEARCH_ATTRSONLY:
174         case SLAPI_ABANDON_MSGID:
175         case SLAPI_SEQ_TYPE:
176         case SLAPI_SEQ_ATTRNAME:
177         case SLAPI_SEQ_VAL:
178         case SLAPI_EXT_OP_REQ_OID:
179         case SLAPI_EXT_OP_REQ_VALUE:
180         case SLAPI_EXT_OP_RET_OID:
181         case SLAPI_EXT_OP_RET_VALUE:
182         case SLAPI_MR_FILTER_ENTRY:
183         case SLAPI_MR_FILTER_TYPE:
184         case SLAPI_MR_FILTER_VALUE:
185         case SLAPI_MR_FILTER_OID:
186         case SLAPI_MR_FILTER_DNATTRS:
187         case SLAPI_LDIF2DB_FILE:
188         case SLAPI_LDIF2DB_REMOVEDUPVALS:
189         case SLAPI_DB2LDIF_PRINTKEY:
190         case SLAPI_PARENT_TXN:
191         case SLAPI_TXN:
192         case SLAPI_SEARCH_RESULT_SET:
193         case SLAPI_SEARCH_RESULT_ENTRY:
194         case SLAPI_NENTRIES:
195         case SLAPI_SEARCH_REFERRALS:
196         case SLAPI_CHANGENUMBER:
197         case SLAPI_LOG_OPERATION:
198         case SLAPI_DBSIZE:
199         case SLAPI_RESULT_CODE:
200         case SLAPI_RESULT_TEXT:
201         case SLAPI_RESULT_MATCHED:
202         case SLAPI_PLUGIN_COMPUTE_EVALUATOR_FN:
203         case SLAPI_PLUGIN_COMPUTE_SEARCH_REWRITER_FN:
204         case SLAPI_PLUGIN_ACL_ALLOW_ACCESS:
205                 return LDAP_SUCCESS;
206         default:
207                 return INVALID_PARAM;
208         }
209 }
210
211 static int
212 isValidParam( Slapi_PBlock *pb, int param ) 
213 {
214         if ( pb->ckParams == TRUE ) {
215                 if ( IBM_RESERVED( param ) ) return LDAP_SUCCESS;
216                 if (param == SLAPI_PLUGIN_AUDIT_FN ||
217                                 param == SLAPI_PLUGIN_AUDIT_DATA )
218                         return LDAP_SUCCESS;
219                 if ( param < LAST_IBM_PARAM ) {
220                         return INVALID_PARAM;
221                 } else if ( NETSCAPE_RESERVED( param ) ) {
222                         return INVALID_PARAM;
223                 } else {
224                         return isOkNetscapeParam(param);
225                 }
226         } else {
227                 return LDAP_SUCCESS;
228         }
229 }
230
231 static void
232 Lock( Slapi_PBlock *pb )
233 {
234         ldap_pvt_thread_mutex_lock(&pb->pblockMutex);
235 }
236
237 static void
238 unLock( Slapi_PBlock *pb )
239 {
240         ldap_pvt_thread_mutex_unlock(&pb->pblockMutex);
241 }
242
243 static int 
244 get( Slapi_PBlock *pb, int param, void **val ) 
245 {       
246         int i;
247
248         if ( isValidParam( pb, param ) == INVALID_PARAM ) {
249                 return PBLOCK_ERROR;
250         }
251         
252         Lock( pb );
253         
254         *val = NULL;
255         for ( i = 0; i < pb->numParams; i++ ) {
256                 if ( pb->curParams[i] == param ) {
257                         *val = pb->curVals[i];
258                         break;
259                 }
260         }
261         unLock( pb );   
262         return LDAP_SUCCESS;
263 }
264
265 static int 
266 set( Slapi_PBlock *pb, int param, void *val ) 
267 {
268 #if defined(LDAP_SLAPI)
269         int i, freeit;
270
271         if ( isValidParam( pb, param ) == INVALID_PARAM ) {
272                 return PBLOCK_ERROR;
273         }
274
275         Lock( pb );     
276
277         if ( pb->numParams == PBLOCK_MAX_PARAMS ) {
278                 unLock( pb );
279                 return PBLOCK_ERROR; 
280         }
281
282         switch ( param ) {
283         case SLAPI_CONN_DN:
284         case SLAPI_CONN_AUTHMETHOD:
285         case SLAPI_IBM_CONN_DN_ALT:
286         case SLAPI_IBM_CONN_DN_ORIG:
287         case SLAPI_RESULT_TEXT:
288         case SLAPI_RESULT_MATCHED:
289                 freeit = 1; break;
290         default:
291                 freeit = 0; break;
292         }
293         for( i = 0; i < pb->numParams; i++ ) { 
294                 if ( pb->curParams[i] == param ) {
295                         break;
296                 }
297         }
298
299         if ( i >= pb->numParams ) {
300                 pb->curParams[i] = param;
301                 pb->numParams++;
302         }
303         if ( freeit ) ch_free( pb->curVals[i] );
304         pb->curVals[i] = val;
305
306         unLock( pb );   
307         return LDAP_SUCCESS;
308 #endif /* LDAP_SLAPI */
309         return PBLOCK_ERROR;
310 }
311
312 static void
313 clearPB( Slapi_PBlock *pb ) 
314 {
315         pb->numParams = 1;
316 }
317
318 static void
319 checkParams( Slapi_PBlock *pb, int flag ) 
320 {
321         pb->ckParams = flag;
322 }
323
324 static int
325 deleteParam( Slapi_PBlock *p, int param ) 
326 {
327         int i;
328
329         Lock(p);
330         for ( i = 0; i < p->numParams; i++ ) { 
331                 if ( p->curParams[i] == param ) {
332                         break;
333                 }
334         }
335     
336         if (i >= p->numParams ) {
337                 unLock( p );
338                 return PBLOCK_ERROR;
339         }
340         if ( p->numParams > 1 ) {
341                 p->curParams[i] = p->curParams[p->numParams];
342                 p->curVals[i] = p->curVals[p->numParams];
343         }
344         p->numParams--;
345         unLock( p );    
346         return LDAP_SUCCESS;
347 }
348
349 Slapi_PBlock *
350 slapi_pblock_new() 
351 {
352 #if defined(LDAP_SLAPI)
353         Slapi_PBlock *pb;
354
355         pb = (Slapi_PBlock *) ch_malloc(sizeof(Slapi_PBlock));
356         if ( pb != NULL ) {
357                 pb->ckParams = TRUE;
358                 ldap_pvt_thread_mutex_init( &pb->pblockMutex );
359                 memset( pb->curParams, 0, sizeof(pb->curParams) );
360                 memset( pb->curVals, 0, sizeof(pb->curVals) );
361                 pb->curParams[0] = SLAPI_IBM_PBLOCK;
362                 pb->curVals[0] = NULL;
363                 pb->numParams = 1;
364         }
365         return pb;
366 #endif /* LDAP_SLAPI */
367         return NULL;
368 }
369
370 void 
371 slapi_pblock_destroy( Slapi_PBlock* pb ) 
372 {
373 #if defined(LDAP_SLAPI)
374         char *str = NULL;
375
376         get( pb, SLAPI_CONN_DN,(void **)&str );
377         if ( str != NULL ) {
378                 ch_free( str );
379                 str = NULL;
380         }
381
382         get( pb, SLAPI_CONN_AUTHMETHOD, (void **)&str );
383         if ( str != NULL ) {
384                 ch_free( str );
385                 str = NULL;
386         }
387
388         get( pb, SLAPI_IBM_CONN_DN_ALT, (void **)&str );
389         if ( str != NULL ) {
390                 ch_free( str );
391                 str = NULL;
392         }
393
394         get( pb, SLAPI_IBM_CONN_DN_ORIG, (void **)&str );
395         if ( str != NULL ) {
396                 ch_free( str );
397         }
398
399         get( pb, SLAPI_RESULT_TEXT, (void **)&str );
400         if ( str != NULL ) {
401                 ch_free( str );
402                 str = NULL;
403         }
404
405         get( pb, SLAPI_RESULT_MATCHED, (void **)&str );
406         if ( str != NULL ) {
407                 ch_free( str );
408                 str = NULL;
409         }
410
411         ldap_pvt_thread_mutex_destroy( &pb->pblockMutex );
412
413         ch_free( pb ); 
414 #endif /* LDAP_SLAPI */
415 }
416
417 int 
418 slapi_pblock_get( Slapi_PBlock *pb, int arg, void *value ) 
419 {
420 #if defined(LDAP_SLAPI)
421         return get( pb, arg, (void **)value );
422 #endif /* LDAP_SLAPI */
423         return PBLOCK_ERROR;
424 }
425
426 int 
427 slapi_pblock_set( Slapi_PBlock *pb, int arg, void *value ) 
428 {
429 #if defined(LDAP_SLAPI)
430         void *pTmp = NULL;
431
432         switch ( arg ) {
433         case SLAPI_CONN_DN:
434         case SLAPI_CONN_AUTHMETHOD:
435         case SLAPI_IBM_CONN_DN_ALT:
436         case SLAPI_IBM_CONN_DN_ORIG:
437         case SLAPI_RESULT_TEXT:
438         case SLAPI_RESULT_MATCHED:
439                 if ( value != NULL ) {
440                         pTmp = (void *)slapi_ch_strdup((char *)value);
441                         if ( pTmp == NULL ) {
442                                 return LDAP_NO_MEMORY;
443                         }
444                 }
445                 break;
446         default:
447                 pTmp = value;
448                 break;
449         }
450         return set( pb, arg, pTmp );
451 #endif /* LDAP_SLAPI */
452         return LDAP_NO_MEMORY;
453 }
454
455 void
456 slapi_pblock_clear( Slapi_PBlock *pb ) 
457 {
458 #if defined(LDAP_SLAPI)
459    clearPB( pb );
460 #endif /* LDAP_SLAPI */
461 }
462
463 int 
464 slapi_pblock_delete_param( Slapi_PBlock *p, int param ) 
465 {
466 #if defined(LDAP_SLAPI)
467         return deleteParam( p, param );
468 #endif /* LDAP_SLAPI */
469         return PBLOCK_ERROR;
470 }
471
472 void
473 slapi_pblock_check_params( Slapi_PBlock *pb, int flag ) 
474 {
475 #if defined(LDAP_SLAPI)
476         checkParams( pb, flag );
477 #endif /* LDAP_SLAPI */
478 }
479
480 /*
481  * OpenLDAP extension
482  */
483 int
484 slapi_x_pblock_get_first( Backend *be, Slapi_PBlock **pb )
485 {
486 #if defined(LDAP_SLAPI)
487         assert( pb );
488         *pb = (Slapi_PBlock *)be->be_pb;
489         return (*pb == NULL ? LDAP_OTHER : LDAP_SUCCESS);
490 #else /* LDAP_SLAPI */
491         return LDAP_OTHER;
492 #endif /* LDAP_SLAPI */
493 }
494
495 /*
496  * OpenLDAP extension
497  */
498 int
499 slapi_x_pblock_get_next( Slapi_PBlock **pb )
500 {
501 #if defined(LDAP_SLAPI)
502         assert( pb );
503         return slapi_pblock_get( *pb, SLAPI_IBM_PBLOCK, pb );
504 #else /* LDAP_SLAPI */
505         return LDAP_OTHER;
506 #endif /* LDAP_SLAPI */
507 }
508