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