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