1 /* config.c - ldap backend configuration file routine */
2 /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/config.c,v 1.115.2.9 2008/07/10 00:28:39 quanah Exp $ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 * Copyright 2003-2008 The OpenLDAP Foundation.
6 * Portions Copyright 1999-2003 Howard Chu.
7 * Portions Copyright 2000-2003 Pierangelo Masarati.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted only as authorized by the OpenLDAP
14 * A copy of this license is available in the file LICENSE in the
15 * top-level directory of the distribution or, alternatively, at
16 * <http://www.OpenLDAP.org/license.html>.
19 * This work was initially developed by the Howard Chu for inclusion
20 * in OpenLDAP Software and subsequently enhanced by Pierangelo
28 #include <ac/string.h>
30 #include <ac/socket.h>
34 #include "back-ldap.h"
38 /* for advanced URL parsing */
39 #include "../../../libraries/libldap/ldap-int.h"
41 static SLAP_EXTOP_MAIN_FN ldap_back_exop_whoami
;
43 static ConfigDriver ldap_back_cf_gen
;
46 LDAP_BACK_CFG_URI
= 1,
48 LDAP_BACK_CFG_ACL_AUTHCDN
,
49 LDAP_BACK_CFG_ACL_PASSWD
,
50 LDAP_BACK_CFG_ACL_METHOD
,
51 LDAP_BACK_CFG_ACL_BIND
,
52 LDAP_BACK_CFG_IDASSERT_MODE
,
53 LDAP_BACK_CFG_IDASSERT_AUTHCDN
,
54 LDAP_BACK_CFG_IDASSERT_PASSWD
,
55 LDAP_BACK_CFG_IDASSERT_AUTHZFROM
,
56 LDAP_BACK_CFG_IDASSERT_METHOD
,
57 LDAP_BACK_CFG_IDASSERT_BIND
,
62 LDAP_BACK_CFG_TIMEOUT
,
63 LDAP_BACK_CFG_IDLE_TIMEOUT
,
64 LDAP_BACK_CFG_CONN_TTL
,
65 LDAP_BACK_CFG_NETWORK_TIMEOUT
,
66 LDAP_BACK_CFG_VERSION
,
67 LDAP_BACK_CFG_SINGLECONN
,
68 LDAP_BACK_CFG_USETEMP
,
69 LDAP_BACK_CFG_CONNPOOLMAX
,
71 LDAP_BACK_CFG_QUARANTINE
,
72 LDAP_BACK_CFG_ST_REQUEST
,
75 LDAP_BACK_CFG_REWRITE
,
80 static ConfigTable ldapcfg
[] = {
81 { "uri", "uri", 2, 2, 0,
82 ARG_MAGIC
|LDAP_BACK_CFG_URI
,
83 ldap_back_cf_gen
, "( OLcfgDbAt:0.14 "
85 "DESC 'URI (list) for remote DSA' "
86 "SYNTAX OMsDirectoryString "
89 { "tls", "what", 2, 0, 0,
90 ARG_MAGIC
|LDAP_BACK_CFG_TLS
,
91 ldap_back_cf_gen
, "( OLcfgDbAt:3.1 "
92 "NAME 'olcDbStartTLS' "
94 "SYNTAX OMsDirectoryString "
97 { "acl-authcDN", "DN", 2, 2, 0,
98 ARG_DN
|ARG_MAGIC
|LDAP_BACK_CFG_ACL_AUTHCDN
,
99 ldap_back_cf_gen
, "( OLcfgDbAt:3.2 "
100 "NAME 'olcDbACLAuthcDn' "
101 "DESC 'Remote ACL administrative identity' "
106 /* deprecated, will be removed; aliases "acl-authcDN" */
107 { "binddn", "DN", 2, 2, 0,
108 ARG_DN
|ARG_MAGIC
|LDAP_BACK_CFG_ACL_AUTHCDN
,
109 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
110 { "acl-passwd", "cred", 2, 2, 0,
111 ARG_MAGIC
|LDAP_BACK_CFG_ACL_PASSWD
,
112 ldap_back_cf_gen
, "( OLcfgDbAt:3.3 "
113 "NAME 'olcDbACLPasswd' "
114 "DESC 'Remote ACL administrative identity credentials' "
116 "SYNTAX OMsDirectoryString "
119 /* deprecated, will be removed; aliases "acl-passwd" */
120 { "bindpw", "cred", 2, 2, 0,
121 ARG_MAGIC
|LDAP_BACK_CFG_ACL_PASSWD
,
122 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
123 /* deprecated, will be removed; aliases "acl-bind" */
124 { "acl-method", "args", 2, 0, 0,
125 ARG_MAGIC
|LDAP_BACK_CFG_ACL_METHOD
,
126 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
127 { "acl-bind", "args", 2, 0, 0,
128 ARG_MAGIC
|LDAP_BACK_CFG_ACL_BIND
,
129 ldap_back_cf_gen
, "( OLcfgDbAt:3.4 "
130 "NAME 'olcDbACLBind' "
131 "DESC 'Remote ACL administrative identity auth bind configuration' "
132 "SYNTAX OMsDirectoryString "
135 { "idassert-authcDN", "DN", 2, 2, 0,
136 ARG_DN
|ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_AUTHCDN
,
137 ldap_back_cf_gen
, "( OLcfgDbAt:3.5 "
138 "NAME 'olcDbIDAssertAuthcDn' "
139 "DESC 'Remote Identity Assertion administrative identity' "
144 /* deprecated, will be removed; partially aliases "idassert-authcDN" */
145 { "proxyauthzdn", "DN", 2, 2, 0,
146 ARG_DN
|ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_AUTHCDN
,
147 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
148 { "idassert-passwd", "cred", 2, 2, 0,
149 ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_PASSWD
,
150 ldap_back_cf_gen
, "( OLcfgDbAt:3.6 "
151 "NAME 'olcDbIDAssertPasswd' "
152 "DESC 'Remote Identity Assertion administrative identity credentials' "
154 "SYNTAX OMsDirectoryString "
157 /* deprecated, will be removed; partially aliases "idassert-passwd" */
158 { "proxyauthzpw", "cred", 2, 2, 0,
159 ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_PASSWD
,
160 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
161 { "idassert-bind", "args", 2, 0, 0,
162 ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_BIND
,
163 ldap_back_cf_gen
, "( OLcfgDbAt:3.7 "
164 "NAME 'olcDbIDAssertBind' "
165 "DESC 'Remote Identity Assertion administrative identity auth bind configuration' "
166 "SYNTAX OMsDirectoryString "
169 { "idassert-method", "args", 2, 0, 0,
170 ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_METHOD
,
171 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
172 { "idassert-mode", "mode>|u:<user>|[dn:]<DN", 2, 0, 0,
173 ARG_STRING
|ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_MODE
,
174 ldap_back_cf_gen
, "( OLcfgDbAt:3.8 "
175 "NAME 'olcDbIDAssertMode' "
176 "DESC 'Remote Identity Assertion mode' "
178 "SYNTAX OMsDirectoryString "
181 { "idassert-authzFrom", "authzRule", 2, 2, 0,
182 ARG_MAGIC
|LDAP_BACK_CFG_IDASSERT_AUTHZFROM
,
183 ldap_back_cf_gen
, "( OLcfgDbAt:3.9 "
184 "NAME 'olcDbIDAssertAuthzFrom' "
185 "DESC 'Remote Identity Assertion authz rules' "
186 "SYNTAX OMsDirectoryString "
187 "X-ORDERED 'VALUES' )",
189 { "rebind-as-user", "true|FALSE", 1, 2, 0,
190 ARG_MAGIC
|ARG_ON_OFF
|LDAP_BACK_CFG_REBIND
,
191 ldap_back_cf_gen
, "( OLcfgDbAt:3.10 "
192 "NAME 'olcDbRebindAsUser' "
193 "DESC 'Rebind as user' "
197 { "chase-referrals", "true|FALSE", 2, 2, 0,
198 ARG_MAGIC
|ARG_ON_OFF
|LDAP_BACK_CFG_CHASE
,
199 ldap_back_cf_gen
, "( OLcfgDbAt:3.11 "
200 "NAME 'olcDbChaseReferrals' "
201 "DESC 'Chase referrals' "
205 { "t-f-support", "true|FALSE|discover", 2, 2, 0,
206 ARG_MAGIC
|LDAP_BACK_CFG_T_F
,
207 ldap_back_cf_gen
, "( OLcfgDbAt:3.12 "
208 "NAME 'olcDbTFSupport' "
209 "DESC 'Absolute filters support' "
210 "SYNTAX OMsDirectoryString "
213 { "proxy-whoami", "true|FALSE", 1, 2, 0,
214 ARG_MAGIC
|ARG_ON_OFF
|LDAP_BACK_CFG_WHOAMI
,
215 ldap_back_cf_gen
, "( OLcfgDbAt:3.13 "
216 "NAME 'olcDbProxyWhoAmI' "
217 "DESC 'Proxy whoAmI exop' "
221 { "timeout", "timeout(list)", 2, 0, 0,
222 ARG_MAGIC
|LDAP_BACK_CFG_TIMEOUT
,
223 ldap_back_cf_gen
, "( OLcfgDbAt:3.14 "
224 "NAME 'olcDbTimeout' "
225 "DESC 'Per-operation timeouts' "
226 "SYNTAX OMsDirectoryString "
229 { "idle-timeout", "timeout", 2, 2, 0,
230 ARG_MAGIC
|LDAP_BACK_CFG_IDLE_TIMEOUT
,
231 ldap_back_cf_gen
, "( OLcfgDbAt:3.15 "
232 "NAME 'olcDbIdleTimeout' "
233 "DESC 'connection idle timeout' "
234 "SYNTAX OMsDirectoryString "
237 { "conn-ttl", "ttl", 2, 2, 0,
238 ARG_MAGIC
|LDAP_BACK_CFG_CONN_TTL
,
239 ldap_back_cf_gen
, "( OLcfgDbAt:3.16 "
240 "NAME 'olcDbConnTtl' "
241 "DESC 'connection ttl' "
242 "SYNTAX OMsDirectoryString "
245 { "network-timeout", "timeout", 2, 2, 0,
246 ARG_MAGIC
|LDAP_BACK_CFG_NETWORK_TIMEOUT
,
247 ldap_back_cf_gen
, "( OLcfgDbAt:3.17 "
248 "NAME 'olcDbNetworkTimeout' "
249 "DESC 'connection network timeout' "
250 "SYNTAX OMsDirectoryString "
253 { "protocol-version", "version", 2, 2, 0,
254 ARG_MAGIC
|ARG_INT
|LDAP_BACK_CFG_VERSION
,
255 ldap_back_cf_gen
, "( OLcfgDbAt:3.18 "
256 "NAME 'olcDbProtocolVersion' "
257 "DESC 'protocol version' "
261 { "single-conn", "true|FALSE", 2, 2, 0,
262 ARG_MAGIC
|ARG_ON_OFF
|LDAP_BACK_CFG_SINGLECONN
,
263 ldap_back_cf_gen
, "( OLcfgDbAt:3.19 "
264 "NAME 'olcDbSingleConn' "
265 "DESC 'cache a single connection per identity' "
269 { "cancel", "ABANDON|ignore|exop", 2, 2, 0,
270 ARG_MAGIC
|LDAP_BACK_CFG_CANCEL
,
271 ldap_back_cf_gen
, "( OLcfgDbAt:3.20 "
272 "NAME 'olcDbCancel' "
273 "DESC 'abandon/ignore/exop operations when appropriate' "
274 "SYNTAX OMsDirectoryString "
277 { "quarantine", "retrylist", 2, 2, 0,
278 ARG_MAGIC
|LDAP_BACK_CFG_QUARANTINE
,
279 ldap_back_cf_gen
, "( OLcfgDbAt:3.21 "
280 "NAME 'olcDbQuarantine' "
281 "DESC 'Quarantine database if connection fails and retry according to rule' "
282 "SYNTAX OMsDirectoryString "
285 { "use-temporary-conn", "true|FALSE", 2, 2, 0,
286 ARG_MAGIC
|ARG_ON_OFF
|LDAP_BACK_CFG_USETEMP
,
287 ldap_back_cf_gen
, "( OLcfgDbAt:3.22 "
288 "NAME 'olcDbUseTemporaryConn' "
289 "DESC 'Use temporary connections if the cached one is busy' "
293 { "conn-pool-max", "<n>", 2, 2, 0,
294 ARG_MAGIC
|ARG_INT
|LDAP_BACK_CFG_CONNPOOLMAX
,
295 ldap_back_cf_gen
, "( OLcfgDbAt:3.23 "
296 "NAME 'olcDbConnectionPoolMax' "
297 "DESC 'Max size of privileged connections pool' "
301 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
302 { "session-tracking-request", "true|FALSE", 2, 2, 0,
303 ARG_MAGIC
|ARG_ON_OFF
|LDAP_BACK_CFG_ST_REQUEST
,
304 ldap_back_cf_gen
, "( OLcfgDbAt:3.24 "
305 "NAME 'olcDbSessionTrackingRequest' "
306 "DESC 'Add session tracking control to proxied requests' "
310 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
311 { "norefs", "true|FALSE", 2, 2, 0,
312 ARG_MAGIC
|ARG_ON_OFF
|LDAP_BACK_CFG_NOREFS
,
313 ldap_back_cf_gen
, "( OLcfgDbAt:3.25 "
314 "NAME 'olcDbNorefs' "
315 "DESC 'Do not return search reference responses' "
319 { "suffixmassage", "[virtual]> <real", 2, 3, 0,
320 ARG_STRING
|ARG_MAGIC
|LDAP_BACK_CFG_REWRITE
,
321 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
322 { "map", "attribute|objectClass> [*|<local>] *|<remote", 3, 4, 0,
323 ARG_STRING
|ARG_MAGIC
|LDAP_BACK_CFG_REWRITE
,
324 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
325 { "rewrite", "<arglist>", 2, 4, STRLENOF( "rewrite" ),
326 ARG_STRING
|ARG_MAGIC
|LDAP_BACK_CFG_REWRITE
,
327 ldap_back_cf_gen
, NULL
, NULL
, NULL
},
328 { NULL
, NULL
, 0, 0, 0, ARG_IGNORED
,
329 NULL
, NULL
, NULL
, NULL
}
332 static ConfigOCs ldapocs
[] = {
334 "NAME 'olcLDAPConfig' "
335 "DESC 'LDAP backend configuration' "
336 "SUP olcDatabaseConfig "
342 "$ olcDbIDAssertAuthcDn "
343 "$ olcDbIDAssertPasswd "
344 "$ olcDbIDAssertBind "
345 "$ olcDbIDAssertMode "
346 "$ olcDbIDAssertAuthzFrom "
347 "$ olcDbRebindAsUser "
348 "$ olcDbChaseReferrals "
350 "$ olcDbProxyWhoAmI "
352 "$ olcDbIdleTimeout "
356 "$ olcDbUseTemporaryConn "
357 "$ olcDbConnectionPoolMax "
358 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
359 "$ olcDbSessionTrackingRequest "
360 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
363 Cft_Database
, ldapcfg
},
367 static slap_verbmasks idassert_mode
[] = {
368 { BER_BVC("self"), LDAP_BACK_IDASSERT_SELF
},
369 { BER_BVC("anonymous"), LDAP_BACK_IDASSERT_ANONYMOUS
},
370 { BER_BVC("none"), LDAP_BACK_IDASSERT_NOASSERT
},
371 { BER_BVC("legacy"), LDAP_BACK_IDASSERT_LEGACY
},
375 static slap_verbmasks tls_mode
[] = {
376 { BER_BVC( "propagate" ), LDAP_BACK_F_TLS_PROPAGATE_MASK
},
377 { BER_BVC( "try-propagate" ), LDAP_BACK_F_PROPAGATE_TLS
},
378 { BER_BVC( "start" ), LDAP_BACK_F_TLS_USE_MASK
},
379 { BER_BVC( "try-start" ), LDAP_BACK_F_USE_TLS
},
380 { BER_BVC( "ldaps" ), LDAP_BACK_F_TLS_LDAPS
},
381 { BER_BVC( "none" ), LDAP_BACK_F_NONE
},
385 static slap_verbmasks t_f_mode
[] = {
386 { BER_BVC( "yes" ), LDAP_BACK_F_T_F
},
387 { BER_BVC( "discover" ), LDAP_BACK_F_T_F_DISCOVER
},
388 { BER_BVC( "no" ), LDAP_BACK_F_NONE
},
392 static slap_verbmasks cancel_mode
[] = {
393 { BER_BVC( "ignore" ), LDAP_BACK_F_CANCEL_IGNORE
},
394 { BER_BVC( "exop" ), LDAP_BACK_F_CANCEL_EXOP
},
395 { BER_BVC( "exop-discover" ), LDAP_BACK_F_CANCEL_EXOP_DISCOVER
},
396 { BER_BVC( "abandon" ), LDAP_BACK_F_CANCEL_ABANDON
},
400 /* see enum in slap.h */
401 static slap_cf_aux_table timeout_table
[] = {
402 { BER_BVC("bind="), SLAP_OP_BIND
* sizeof( time_t ), 'u', 0, NULL
},
403 /* unbind makes no sense */
404 { BER_BVC("add="), SLAP_OP_ADD
* sizeof( time_t ), 'u', 0, NULL
},
405 { BER_BVC("delete="), SLAP_OP_DELETE
* sizeof( time_t ), 'u', 0, NULL
},
406 { BER_BVC("modrdn="), SLAP_OP_MODRDN
* sizeof( time_t ), 'u', 0, NULL
},
407 { BER_BVC("modify="), SLAP_OP_MODIFY
* sizeof( time_t ), 'u', 0, NULL
},
408 { BER_BVC("compare="), SLAP_OP_COMPARE
* sizeof( time_t ), 'u', 0, NULL
},
409 { BER_BVC("search="), SLAP_OP_SEARCH
* sizeof( time_t ), 'u', 0, NULL
},
410 /* abandon makes little sense */
411 #if 0 /* not implemented yet */
412 { BER_BVC("extended="), SLAP_OP_EXTENDED
* sizeof( time_t ), 'u', 0, NULL
},
414 { BER_BVNULL
, 0, 0, 0, NULL
}
418 slap_retry_info_parse(
420 slap_retry_info_t
*ri
,
424 char **retrylist
= NULL
;
428 slap_str2clist( &retrylist
, in
, " ;" );
429 if ( retrylist
== NULL
) {
433 for ( i
= 0; retrylist
[ i
] != NULL
; i
++ )
436 ri
->ri_interval
= ch_calloc( sizeof( time_t ), i
+ 1 );
437 ri
->ri_num
= ch_calloc( sizeof( int ), i
+ 1 );
439 for ( i
= 0; retrylist
[ i
] != NULL
; i
++ ) {
441 char *sep
= strchr( retrylist
[ i
], ',' );
444 snprintf( buf
, buflen
,
445 "missing comma in retry pattern #%d \"%s\"",
453 if ( lutil_parse_time( retrylist
[ i
], &t
) ) {
454 snprintf( buf
, buflen
,
455 "unable to parse interval #%d \"%s\"",
460 ri
->ri_interval
[ i
] = (time_t)t
;
462 if ( strcmp( sep
, "+" ) == 0 ) {
463 if ( retrylist
[ i
+ 1 ] != NULL
) {
464 snprintf( buf
, buflen
,
465 "extra cruft after retry pattern "
466 "#%d \"%s,+\" with \"forever\" mark",
471 ri
->ri_num
[ i
] = SLAP_RETRYNUM_FOREVER
;
473 } else if ( lutil_atoi( &ri
->ri_num
[ i
], sep
) ) {
474 snprintf( buf
, buflen
,
475 "unable to parse retry num #%d \"%s\"",
482 ri
->ri_num
[ i
] = SLAP_RETRYNUM_TAIL
;
486 ri
->ri_last
= (time_t)(-1);
489 ldap_charray_free( retrylist
);
492 slap_retry_info_destroy( ri
);
499 slap_retry_info_unparse(
500 slap_retry_info_t
*ri
,
501 struct berval
*bvout
)
504 char buf
[ BUFSIZ
* 2 ],
506 struct berval bv
= BER_BVNULL
;
508 assert( ri
!= NULL
);
509 assert( bvout
!= NULL
);
513 #define WHATSLEFT ( sizeof( buf ) - ( ptr - buf ) )
515 for ( i
= 0; ri
->ri_num
[ i
] != SLAP_RETRYNUM_TAIL
; i
++ ) {
517 if ( WHATSLEFT
<= 1 ) {
523 if ( lutil_unparse_time( ptr
, WHATSLEFT
, (long)ri
->ri_interval
[i
] ) ) {
526 ptr
+= strlen( ptr
);
528 if ( WHATSLEFT
<= 1 ) {
533 if ( ri
->ri_num
[i
] == SLAP_RETRYNUM_FOREVER
) {
534 if ( WHATSLEFT
<= 1 ) {
540 ptr
+= snprintf( ptr
, WHATSLEFT
, "%d", ri
->ri_num
[i
] );
541 if ( WHATSLEFT
<= 0 ) {
548 bv
.bv_len
= ptr
- buf
;
550 ber_dupbv( bvout
, &bv
);
556 slap_retry_info_destroy(
557 slap_retry_info_t
*ri
)
559 assert( ri
!= NULL
);
561 assert( ri
->ri_interval
!= NULL
);
562 ch_free( ri
->ri_interval
);
563 ri
->ri_interval
= NULL
;
565 assert( ri
->ri_num
!= NULL
);
566 ch_free( ri
->ri_num
);
571 slap_idassert_authzfrom_parse( ConfigArgs
*c
, slap_idassert_t
*si
)
577 if ( strcmp( c
->argv
[ 1 ], "*" ) == 0
578 || strcmp( c
->argv
[ 1 ], "dn:*" ) == 0
579 || strcasecmp( c
->argv
[ 1 ], "dn.regex:.*" ) == 0 )
581 if ( si
->si_authz
!= NULL
) {
582 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
583 "\"idassert-authzFrom <authz>\": "
584 "\"%s\" conflicts with existing authz rules",
586 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
590 si
->si_flags
|= LDAP_BACK_AUTH_AUTHZ_ALL
;
594 } else if ( ( si
->si_flags
& LDAP_BACK_AUTH_AUTHZ_ALL
) ) {
595 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
596 "\"idassert-authzFrom <authz>\": "
597 "\"<authz>\" conflicts with \"*\"" );
598 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
602 ber_str2bv( c
->argv
[ 1 ], 0, 0, &in
);
603 rc
= authzNormalize( 0, NULL
, NULL
, &in
, &bv
, NULL
);
604 if ( rc
!= LDAP_SUCCESS
) {
605 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
606 "\"idassert-authzFrom <authz>\": "
608 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
612 ber_bvarray_add( &si
->si_authz
, &bv
);
618 slap_idassert_parse( ConfigArgs
*c
, slap_idassert_t
*si
)
622 for ( i
= 1; i
< c
->argc
; i
++ ) {
623 if ( strncasecmp( c
->argv
[ i
], "mode=", STRLENOF( "mode=" ) ) == 0 ) {
624 char *argvi
= c
->argv
[ i
] + STRLENOF( "mode=" );
627 j
= verb_to_mask( argvi
, idassert_mode
);
628 if ( BER_BVISNULL( &idassert_mode
[ j
].word
) ) {
629 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
630 "\"idassert-bind <args>\": "
631 "unknown mode \"%s\"",
633 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
637 si
->si_mode
= idassert_mode
[ j
].mask
;
639 } else if ( strncasecmp( c
->argv
[ i
], "authz=", STRLENOF( "authz=" ) ) == 0 ) {
640 char *argvi
= c
->argv
[ i
] + STRLENOF( "authz=" );
642 if ( strcasecmp( argvi
, "native" ) == 0 ) {
643 if ( si
->si_bc
.sb_method
!= LDAP_AUTH_SASL
) {
644 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
645 "\"idassert-bind <args>\": "
646 "authz=\"native\" incompatible "
647 "with auth method" );
648 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
651 si
->si_flags
|= LDAP_BACK_AUTH_NATIVE_AUTHZ
;
653 } else if ( strcasecmp( argvi
, "proxyAuthz" ) == 0 ) {
654 si
->si_flags
&= ~LDAP_BACK_AUTH_NATIVE_AUTHZ
;
657 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
658 "\"idassert-bind <args>\": "
659 "unknown authz \"%s\"",
661 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
665 } else if ( strncasecmp( c
->argv
[ i
], "flags=", STRLENOF( "flags=" ) ) == 0 ) {
666 char *argvi
= c
->argv
[ i
] + STRLENOF( "flags=" );
667 char **flags
= ldap_str2charray( argvi
, "," );
670 if ( flags
== NULL
) {
671 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
672 "\"idassert-bind <args>\": "
673 "unable to parse flags \"%s\"",
675 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
679 for ( j
= 0; flags
[ j
] != NULL
; j
++ ) {
681 if ( strcasecmp( flags
[ j
], "override" ) == 0 ) {
682 si
->si_flags
|= LDAP_BACK_AUTH_OVERRIDE
;
684 } else if ( strcasecmp( flags
[ j
], "prescriptive" ) == 0 ) {
685 si
->si_flags
|= LDAP_BACK_AUTH_PRESCRIPTIVE
;
687 } else if ( strcasecmp( flags
[ j
], "non-prescriptive" ) == 0 ) {
688 si
->si_flags
&= ( ~LDAP_BACK_AUTH_PRESCRIPTIVE
);
690 } else if ( strcasecmp( flags
[ j
], "obsolete-proxy-authz" ) == 0 ) {
691 if ( si
->si_flags
& LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND
) {
692 Debug( LDAP_DEBUG_ANY
,
693 "%s: \"obsolete-proxy-authz\" flag "
694 "in \"idassert-mode <args>\" "
695 "incompatible with previously issued \"obsolete-encoding-workaround\" flag.\n",
701 si
->si_flags
|= LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ
;
704 } else if ( strcasecmp( flags
[ j
], "obsolete-encoding-workaround" ) == 0 ) {
705 if ( si
->si_flags
& LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ
) {
706 Debug( LDAP_DEBUG_ANY
,
707 "%s: \"obsolete-encoding-workaround\" flag "
708 "in \"idassert-mode <args>\" "
709 "incompatible with previously issued \"obsolete-proxy-authz\" flag.\n",
715 si
->si_flags
|= LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND
;
719 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
720 "\"idassert-bind <args>\": "
721 "unknown flag \"%s\"",
723 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
729 ldap_charray_free( flags
);
734 } else if ( bindconf_parse( c
->argv
[ i
], &si
->si_bc
) ) {
738 bindconf_tls_defaults( &si
->si_bc
);
743 /* NOTE: temporary, until back-meta is ported to back-config */
745 slap_idassert_authzfrom_parse_cf( const char *fname
, int lineno
, const char *arg
, slap_idassert_t
*si
)
747 ConfigArgs c
= { 0 };
750 snprintf( c
.log
, sizeof( c
.log
), "%s: line %d", fname
, lineno
);
753 argv
[ 0 ] = "idassert-authzFrom";
754 argv
[ 1 ] = (char *)arg
;
757 return slap_idassert_authzfrom_parse( &c
, si
);
761 slap_idassert_parse_cf( const char *fname
, int lineno
, int argc
, char *argv
[], slap_idassert_t
*si
)
763 ConfigArgs c
= { 0 };
765 snprintf( c
.log
, sizeof( c
.log
), "%s: line %d", fname
, lineno
);
769 return slap_idassert_parse( &c
, si
);
773 ldap_back_cf_gen( ConfigArgs
*c
)
775 ldapinfo_t
*li
= ( ldapinfo_t
* )c
->be
->be_private
;
779 if ( c
->op
== SLAP_CONFIG_EMIT
) {
780 struct berval bv
= BER_BVNULL
;
787 case LDAP_BACK_CFG_URI
:
788 if ( li
->li_uri
!= NULL
) {
789 struct berval bv
, bv2
;
791 ber_str2bv( li
->li_uri
, 0, 0, &bv
);
792 bv2
.bv_len
= bv
.bv_len
+ STRLENOF( "\"\"" );
793 bv2
.bv_val
= ch_malloc( bv2
.bv_len
+ 1 );
794 snprintf( bv2
.bv_val
, bv2
.bv_len
+ 1,
795 "\"%s\"", bv
.bv_val
);
796 ber_bvarray_add( &c
->rvalue_vals
, &bv2
);
803 case LDAP_BACK_CFG_TLS
: {
804 struct berval bc
= BER_BVNULL
, bv2
;
805 enum_to_verb( tls_mode
, ( li
->li_flags
& LDAP_BACK_F_TLS_MASK
), &bv
);
806 assert( !BER_BVISNULL( &bv
) );
807 bindconf_tls_unparse( &li
->li_tls
, &bc
);
809 if ( !BER_BVISEMPTY( &bc
)) {
810 bv2
.bv_len
= bv
.bv_len
+ bc
.bv_len
+ 1;
811 bv2
.bv_val
= ch_malloc( bv2
.bv_len
+ 1 );
812 strcpy( bv2
.bv_val
, bv
.bv_val
);
813 bv2
.bv_val
[bv
.bv_len
] = ' ';
814 strcpy( &bv2
.bv_val
[bv
.bv_len
+ 1], bc
.bv_val
);
815 ber_bvarray_add( &c
->rvalue_vals
, &bv2
);
818 value_add_one( &c
->rvalue_vals
, &bv
);
820 ber_memfree( bc
.bv_val
);
824 case LDAP_BACK_CFG_ACL_AUTHCDN
:
825 case LDAP_BACK_CFG_ACL_PASSWD
:
826 case LDAP_BACK_CFG_ACL_METHOD
:
827 /* handled by LDAP_BACK_CFG_ACL_BIND */
831 case LDAP_BACK_CFG_ACL_BIND
: {
834 if ( li
->li_acl_authmethod
== LDAP_AUTH_NONE
) {
838 bindconf_unparse( &li
->li_acl
, &bv
);
840 for ( i
= 0; isspace( (unsigned char) bv
.bv_val
[ i
] ); i
++ )
845 AC_MEMCPY( bv
.bv_val
, &bv
.bv_val
[ i
],
849 ber_bvarray_add( &c
->rvalue_vals
, &bv
);
853 case LDAP_BACK_CFG_IDASSERT_MODE
:
854 case LDAP_BACK_CFG_IDASSERT_AUTHCDN
:
855 case LDAP_BACK_CFG_IDASSERT_PASSWD
:
856 case LDAP_BACK_CFG_IDASSERT_METHOD
:
857 /* handled by LDAP_BACK_CFG_IDASSERT_BIND */
861 case LDAP_BACK_CFG_IDASSERT_AUTHZFROM
: {
864 if ( li
->li_idassert_authz
== NULL
) {
865 if ( ( li
->li_idassert_flags
& LDAP_BACK_AUTH_AUTHZ_ALL
) ) {
866 BER_BVSTR( &bv
, "*" );
867 value_add_one( &c
->rvalue_vals
, &bv
);
875 for ( i
= 0; !BER_BVISNULL( &li
->li_idassert_authz
[ i
] ); i
++ )
877 value_add_one( &c
->rvalue_vals
, &li
->li_idassert_authz
[ i
] );
882 case LDAP_BACK_CFG_IDASSERT_BIND
: {
884 struct berval bc
= BER_BVNULL
;
887 if ( li
->li_idassert_authmethod
== LDAP_AUTH_NONE
) {
891 if ( li
->li_idassert_authmethod
!= LDAP_AUTH_NONE
) {
894 switch ( li
->li_idassert_mode
) {
895 case LDAP_BACK_IDASSERT_OTHERID
:
896 case LDAP_BACK_IDASSERT_OTHERDN
:
900 struct berval mode
= BER_BVNULL
;
902 enum_to_verb( idassert_mode
, li
->li_idassert_mode
, &mode
);
903 if ( BER_BVISNULL( &mode
) ) {
904 /* there's something wrong... */
909 bv
.bv_len
= STRLENOF( "mode=" ) + mode
.bv_len
;
910 bv
.bv_val
= ch_malloc( bv
.bv_len
+ 1 );
912 ptr
= lutil_strcopy( bv
.bv_val
, "mode=" );
913 ptr
= lutil_strcopy( ptr
, mode
.bv_val
);
919 if ( li
->li_idassert_flags
& LDAP_BACK_AUTH_NATIVE_AUTHZ
) {
920 len
= bv
.bv_len
+ STRLENOF( "authz=native" );
922 if ( !BER_BVISEMPTY( &bv
) ) {
923 len
+= STRLENOF( " " );
926 bv
.bv_val
= ch_realloc( bv
.bv_val
, len
+ 1 );
928 ptr
= &bv
.bv_val
[ bv
.bv_len
];
930 if ( !BER_BVISEMPTY( &bv
) ) {
931 ptr
= lutil_strcopy( ptr
, " " );
934 (void)lutil_strcopy( ptr
, "authz=native" );
937 len
= bv
.bv_len
+ STRLENOF( "flags=non-prescriptive,override,obsolete-encoding-workaround" );
939 if ( !BER_BVISEMPTY( &bv
) ) {
940 len
+= STRLENOF( " " );
943 bv
.bv_val
= ch_realloc( bv
.bv_val
, len
+ 1 );
945 ptr
= &bv
.bv_val
[ bv
.bv_len
];
947 if ( !BER_BVISEMPTY( &bv
) ) {
948 ptr
= lutil_strcopy( ptr
, " " );
951 ptr
= lutil_strcopy( ptr
, "flags=" );
953 if ( li
->li_idassert_flags
& LDAP_BACK_AUTH_PRESCRIPTIVE
) {
954 ptr
= lutil_strcopy( ptr
, "prescriptive" );
956 ptr
= lutil_strcopy( ptr
, "non-prescriptive" );
959 if ( li
->li_idassert_flags
& LDAP_BACK_AUTH_OVERRIDE
) {
960 ptr
= lutil_strcopy( ptr
, ",override" );
963 if ( li
->li_idassert_flags
& LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ
) {
964 ptr
= lutil_strcopy( ptr
, ",obsolete-proxy-authz" );
966 } else if ( li
->li_idassert_flags
& LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND
) {
967 ptr
= lutil_strcopy( ptr
, ",obsolete-encoding-workaround" );
970 bv
.bv_len
= ( ptr
- bv
.bv_val
);
974 bindconf_unparse( &li
->li_idassert
.si_bc
, &bc
);
976 if ( !BER_BVISNULL( &bv
) ) {
977 ber_len_t len
= bv
.bv_len
+ bc
.bv_len
;
979 bv
.bv_val
= ch_realloc( bv
.bv_val
, len
+ 1 );
981 assert( bc
.bv_val
[ 0 ] == ' ' );
983 ptr
= lutil_strcopy( &bv
.bv_val
[ bv
.bv_len
], bc
.bv_val
);
985 bv
.bv_len
= ptr
- bv
.bv_val
;
988 for ( i
= 0; isspace( (unsigned char) bc
.bv_val
[ i
] ); i
++ )
993 AC_MEMCPY( bc
.bv_val
, &bc
.bv_val
[ i
], bc
.bv_len
+ 1 );
999 ber_bvarray_add( &c
->rvalue_vals
, &bv
);
1004 case LDAP_BACK_CFG_REBIND
:
1005 c
->value_int
= LDAP_BACK_SAVECRED( li
);
1008 case LDAP_BACK_CFG_CHASE
:
1009 c
->value_int
= LDAP_BACK_CHASE_REFERRALS( li
);
1012 case LDAP_BACK_CFG_T_F
:
1013 enum_to_verb( t_f_mode
, (li
->li_flags
& LDAP_BACK_F_T_F_MASK2
), &bv
);
1014 if ( BER_BVISNULL( &bv
) ) {
1015 /* there's something wrong... */
1020 value_add_one( &c
->rvalue_vals
, &bv
);
1024 case LDAP_BACK_CFG_WHOAMI
:
1025 c
->value_int
= LDAP_BACK_PROXY_WHOAMI( li
);
1028 case LDAP_BACK_CFG_TIMEOUT
:
1031 for ( i
= 0; i
< SLAP_OP_LAST
; i
++ ) {
1032 if ( li
->li_timeout
[ i
] != 0 ) {
1037 if ( i
== SLAP_OP_LAST
) {
1041 slap_cf_aux_table_unparse( li
->li_timeout
, &bv
, timeout_table
);
1043 if ( BER_BVISNULL( &bv
) ) {
1047 for ( i
= 0; isspace( (unsigned char) bv
.bv_val
[ i
] ); i
++ )
1048 /* count spaces */ ;
1052 AC_MEMCPY( bv
.bv_val
, &bv
.bv_val
[ i
],
1056 ber_bvarray_add( &c
->rvalue_vals
, &bv
);
1059 case LDAP_BACK_CFG_IDLE_TIMEOUT
: {
1060 char buf
[ SLAP_TEXT_BUFLEN
];
1062 if ( li
->li_idle_timeout
== 0 ) {
1066 lutil_unparse_time( buf
, sizeof( buf
), li
->li_idle_timeout
);
1067 ber_str2bv( buf
, 0, 0, &bv
);
1068 value_add_one( &c
->rvalue_vals
, &bv
);
1071 case LDAP_BACK_CFG_CONN_TTL
: {
1072 char buf
[ SLAP_TEXT_BUFLEN
];
1074 if ( li
->li_conn_ttl
== 0 ) {
1078 lutil_unparse_time( buf
, sizeof( buf
), li
->li_conn_ttl
);
1079 ber_str2bv( buf
, 0, 0, &bv
);
1080 value_add_one( &c
->rvalue_vals
, &bv
);
1083 case LDAP_BACK_CFG_NETWORK_TIMEOUT
: {
1084 char buf
[ SLAP_TEXT_BUFLEN
];
1086 if ( li
->li_network_timeout
== 0 ) {
1090 snprintf( buf
, sizeof( buf
), "%ld",
1091 (long)li
->li_network_timeout
);
1092 ber_str2bv( buf
, 0, 0, &bv
);
1093 value_add_one( &c
->rvalue_vals
, &bv
);
1096 case LDAP_BACK_CFG_VERSION
:
1097 if ( li
->li_version
== 0 ) {
1101 c
->value_int
= li
->li_version
;
1104 case LDAP_BACK_CFG_SINGLECONN
:
1105 c
->value_int
= LDAP_BACK_SINGLECONN( li
);
1108 case LDAP_BACK_CFG_USETEMP
:
1109 c
->value_int
= LDAP_BACK_USE_TEMPORARIES( li
);
1112 case LDAP_BACK_CFG_CONNPOOLMAX
:
1113 c
->value_int
= li
->li_conn_priv_max
;
1116 case LDAP_BACK_CFG_CANCEL
: {
1117 slap_mask_t mask
= LDAP_BACK_F_CANCEL_MASK2
;
1119 if ( LDAP_BACK_CANCEL_DISCOVER( li
) ) {
1120 mask
&= ~LDAP_BACK_F_CANCEL_EXOP
;
1122 enum_to_verb( cancel_mode
, (li
->li_flags
& mask
), &bv
);
1123 if ( BER_BVISNULL( &bv
) ) {
1124 /* there's something wrong... */
1129 value_add_one( &c
->rvalue_vals
, &bv
);
1133 case LDAP_BACK_CFG_QUARANTINE
:
1134 if ( !LDAP_BACK_QUARANTINE( li
) ) {
1139 rc
= slap_retry_info_unparse( &li
->li_quarantine
, &bv
);
1141 ber_bvarray_add( &c
->rvalue_vals
, &bv
);
1145 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
1146 case LDAP_BACK_CFG_ST_REQUEST
:
1147 c
->value_int
= LDAP_BACK_ST_REQUEST( li
);
1149 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
1151 case LDAP_BACK_CFG_NOREFS
:
1152 c
->value_int
= LDAP_BACK_NOREFS( li
);
1156 /* FIXME: we need to handle all... */
1162 } else if ( c
->op
== LDAP_MOD_DELETE
) {
1164 case LDAP_BACK_CFG_URI
:
1165 if ( li
->li_uri
!= NULL
) {
1166 ch_free( li
->li_uri
);
1169 assert( li
->li_bvuri
!= NULL
);
1170 ber_bvarray_free( li
->li_bvuri
);
1171 li
->li_bvuri
= NULL
;
1174 /* better cleanup the cached connections... */
1175 /* NOTE: don't worry about locking: if we got here,
1176 * other threads are suspended. */
1177 if ( li
->li_conninfo
.lai_tree
!= NULL
) {
1178 avl_free( li
->li_conninfo
.lai_tree
, ldap_back_conn_free
);
1179 li
->li_conninfo
.lai_tree
= NULL
;
1184 case LDAP_BACK_CFG_TLS
:
1188 case LDAP_BACK_CFG_ACL_AUTHCDN
:
1189 case LDAP_BACK_CFG_ACL_PASSWD
:
1190 case LDAP_BACK_CFG_ACL_METHOD
:
1191 /* handled by LDAP_BACK_CFG_ACL_BIND */
1195 case LDAP_BACK_CFG_ACL_BIND
:
1196 bindconf_free( &li
->li_acl
);
1199 case LDAP_BACK_CFG_IDASSERT_MODE
:
1200 case LDAP_BACK_CFG_IDASSERT_AUTHCDN
:
1201 case LDAP_BACK_CFG_IDASSERT_PASSWD
:
1202 case LDAP_BACK_CFG_IDASSERT_METHOD
:
1203 /* handled by LDAP_BACK_CFG_IDASSERT_BIND */
1207 case LDAP_BACK_CFG_IDASSERT_AUTHZFROM
:
1208 if ( li
->li_idassert_authz
!= NULL
) {
1209 ber_bvarray_free( li
->li_idassert_authz
);
1210 li
->li_idassert_authz
= NULL
;
1214 case LDAP_BACK_CFG_IDASSERT_BIND
:
1215 bindconf_free( &li
->li_idassert
.si_bc
);
1218 case LDAP_BACK_CFG_REBIND
:
1219 case LDAP_BACK_CFG_CHASE
:
1220 case LDAP_BACK_CFG_T_F
:
1221 case LDAP_BACK_CFG_WHOAMI
:
1222 case LDAP_BACK_CFG_CANCEL
:
1226 case LDAP_BACK_CFG_TIMEOUT
:
1227 for ( i
= 0; i
< SLAP_OP_LAST
; i
++ ) {
1228 li
->li_timeout
[ i
] = 0;
1232 case LDAP_BACK_CFG_IDLE_TIMEOUT
:
1233 li
->li_idle_timeout
= 0;
1236 case LDAP_BACK_CFG_CONN_TTL
:
1237 li
->li_conn_ttl
= 0;
1240 case LDAP_BACK_CFG_NETWORK_TIMEOUT
:
1241 li
->li_network_timeout
= 0;
1244 case LDAP_BACK_CFG_VERSION
:
1248 case LDAP_BACK_CFG_SINGLECONN
:
1249 li
->li_flags
&= ~LDAP_BACK_F_SINGLECONN
;
1252 case LDAP_BACK_CFG_USETEMP
:
1253 li
->li_flags
&= ~LDAP_BACK_F_USE_TEMPORARIES
;
1256 case LDAP_BACK_CFG_CONNPOOLMAX
:
1257 li
->li_conn_priv_max
= LDAP_BACK_CONN_PRIV_MIN
;
1260 case LDAP_BACK_CFG_QUARANTINE
:
1261 if ( !LDAP_BACK_QUARANTINE( li
) ) {
1265 slap_retry_info_destroy( &li
->li_quarantine
);
1266 ldap_pvt_thread_mutex_destroy( &li
->li_quarantine_mutex
);
1267 li
->li_isquarantined
= 0;
1268 li
->li_flags
&= ~LDAP_BACK_F_QUARANTINE
;
1271 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
1272 case LDAP_BACK_CFG_ST_REQUEST
:
1273 li
->li_flags
&= ~LDAP_BACK_F_ST_REQUEST
;
1275 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
1277 case LDAP_BACK_CFG_NOREFS
:
1278 li
->li_flags
&= ~LDAP_BACK_F_NOREFS
;
1282 /* FIXME: we need to handle all... */
1291 case LDAP_BACK_CFG_URI
: {
1292 LDAPURLDesc
*tmpludp
, *lud
;
1293 char **urllist
= NULL
;
1294 int urlrc
= LDAP_URL_SUCCESS
, i
;
1296 if ( li
->li_uri
!= NULL
) {
1297 ch_free( li
->li_uri
);
1300 assert( li
->li_bvuri
!= NULL
);
1301 ber_bvarray_free( li
->li_bvuri
);
1302 li
->li_bvuri
= NULL
;
1305 /* PARANOID: DN and more are not required nor allowed */
1306 urlrc
= ldap_url_parselist_ext( &lud
, c
->argv
[ 1 ], ", \t", LDAP_PVT_URL_PARSE_NONE
);
1307 if ( urlrc
!= LDAP_URL_SUCCESS
) {
1311 case LDAP_URL_ERR_MEM
:
1314 case LDAP_URL_ERR_PARAM
:
1315 why
= "parameter is bad";
1317 case LDAP_URL_ERR_BADSCHEME
:
1318 why
= "URL doesn't begin with \"[c]ldap[si]://\"";
1320 case LDAP_URL_ERR_BADENCLOSURE
:
1321 why
= "URL is missing trailing \">\"";
1323 case LDAP_URL_ERR_BADURL
:
1326 case LDAP_URL_ERR_BADHOST
:
1327 why
= "host/port is bad";
1329 case LDAP_URL_ERR_BADATTRS
:
1330 why
= "bad (or missing) attributes";
1332 case LDAP_URL_ERR_BADSCOPE
:
1333 why
= "scope string is invalid (or missing)";
1335 case LDAP_URL_ERR_BADFILTER
:
1336 why
= "bad or missing filter";
1338 case LDAP_URL_ERR_BADEXTS
:
1339 why
= "bad or missing extensions";
1342 why
= "unknown reason";
1345 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1346 "unable to parse uri \"%s\" "
1347 "in \"uri <uri>\" line: %s",
1348 c
->value_string
, why
);
1349 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1354 for ( i
= 0, tmpludp
= lud
;
1356 i
++, tmpludp
= tmpludp
->lud_next
)
1358 if ( ( tmpludp
->lud_dn
!= NULL
1359 && tmpludp
->lud_dn
[0] != '\0' )
1360 || tmpludp
->lud_attrs
!= NULL
1361 /* || tmpludp->lud_scope != LDAP_SCOPE_DEFAULT */
1362 || tmpludp
->lud_filter
!= NULL
1363 || tmpludp
->lud_exts
!= NULL
)
1365 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1366 "warning, only protocol, "
1367 "host and port allowed "
1368 "in \"uri <uri>\" statement "
1369 "for uri #%d of \"%s\"",
1371 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1375 for ( i
= 0, tmpludp
= lud
;
1377 i
++, tmpludp
= tmpludp
->lud_next
)
1380 urllist
= ch_calloc( sizeof( char * ), i
+ 1 );
1382 for ( i
= 0, tmpludp
= lud
;
1384 i
++, tmpludp
= tmpludp
->lud_next
)
1390 tmplud
.lud_attrs
= NULL
;
1391 tmplud
.lud_filter
= NULL
;
1392 if ( !ldap_is_ldapi_url( tmplud
.lud_scheme
) ) {
1393 tmplud
.lud_exts
= NULL
;
1394 tmplud
.lud_crit_exts
= 0;
1397 urllist
[ i
] = ldap_url_desc2str( &tmplud
);
1399 if ( urllist
[ i
] == NULL
) {
1400 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1401 "unable to rebuild uri "
1402 "in \"uri <uri>\" statement "
1405 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1411 li
->li_uri
= ldap_charray2str( urllist
, " " );
1412 for ( i
= 0; urllist
[ i
] != NULL
; i
++ ) {
1415 ber_str2bv( urllist
[ i
], 0, 0, &bv
);
1416 ber_bvarray_add( &li
->li_bvuri
, &bv
);
1417 urllist
[ i
] = NULL
;
1419 ldap_memfree( urllist
);
1424 ldap_charray_free( urllist
);
1427 ldap_free_urllist( lud
);
1429 if ( urlrc
!= LDAP_URL_SUCCESS
) {
1435 case LDAP_BACK_CFG_TLS
:
1436 i
= verb_to_mask( c
->argv
[1], tls_mode
);
1437 if ( BER_BVISNULL( &tls_mode
[i
].word
) ) {
1440 li
->li_flags
&= ~LDAP_BACK_F_TLS_MASK
;
1441 li
->li_flags
|= tls_mode
[i
].mask
;
1442 if ( c
->argc
> 2 ) {
1443 for ( i
=2; i
<c
->argc
; i
++ ) {
1444 if ( bindconf_tls_parse( c
->argv
[i
], &li
->li_tls
))
1447 bindconf_tls_defaults( &li
->li_tls
);
1451 case LDAP_BACK_CFG_ACL_AUTHCDN
:
1452 switch ( li
->li_acl_authmethod
) {
1453 case LDAP_AUTH_NONE
:
1454 li
->li_acl_authmethod
= LDAP_AUTH_SIMPLE
;
1457 case LDAP_AUTH_SIMPLE
:
1461 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1462 "\"acl-authcDN <DN>\" incompatible "
1463 "with auth method %d",
1464 li
->li_acl_authmethod
);
1465 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1468 if ( !BER_BVISNULL( &li
->li_acl_authcDN
) ) {
1469 free( li
->li_acl_authcDN
.bv_val
);
1471 ber_memfree_x( c
->value_dn
.bv_val
, NULL
);
1472 li
->li_acl_authcDN
= c
->value_ndn
;
1473 BER_BVZERO( &c
->value_dn
);
1474 BER_BVZERO( &c
->value_ndn
);
1477 case LDAP_BACK_CFG_ACL_PASSWD
:
1478 switch ( li
->li_acl_authmethod
) {
1479 case LDAP_AUTH_NONE
:
1480 li
->li_acl_authmethod
= LDAP_AUTH_SIMPLE
;
1483 case LDAP_AUTH_SIMPLE
:
1487 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1488 "\"acl-passwd <cred>\" incompatible "
1489 "with auth method %d",
1490 li
->li_acl_authmethod
);
1491 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1494 if ( !BER_BVISNULL( &li
->li_acl_passwd
) ) {
1495 free( li
->li_acl_passwd
.bv_val
);
1497 ber_str2bv( c
->argv
[ 1 ], 0, 1, &li
->li_acl_passwd
);
1500 case LDAP_BACK_CFG_ACL_METHOD
:
1501 case LDAP_BACK_CFG_ACL_BIND
:
1502 for ( i
= 1; i
< c
->argc
; i
++ ) {
1503 if ( bindconf_parse( c
->argv
[ i
], &li
->li_acl
) ) {
1507 bindconf_tls_defaults( &li
->li_acl
);
1510 case LDAP_BACK_CFG_IDASSERT_MODE
:
1511 i
= verb_to_mask( c
->argv
[1], idassert_mode
);
1512 if ( BER_BVISNULL( &idassert_mode
[i
].word
) ) {
1513 if ( strncasecmp( c
->argv
[1], "u:", STRLENOF( "u:" ) ) == 0 ) {
1514 li
->li_idassert_mode
= LDAP_BACK_IDASSERT_OTHERID
;
1515 ber_str2bv( c
->argv
[1], 0, 1, &li
->li_idassert_authzID
);
1516 li
->li_idassert_authzID
.bv_val
[ 0 ] = 'u';
1519 struct berval id
, ndn
;
1521 ber_str2bv( c
->argv
[1], 0, 0, &id
);
1523 if ( strncasecmp( c
->argv
[1], "dn:", STRLENOF( "dn:" ) ) == 0 ) {
1524 id
.bv_val
+= STRLENOF( "dn:" );
1525 id
.bv_len
-= STRLENOF( "dn:" );
1528 rc
= dnNormalize( 0, NULL
, NULL
, &id
, &ndn
, NULL
);
1529 if ( rc
!= LDAP_SUCCESS
) {
1530 Debug( LDAP_DEBUG_ANY
,
1531 "%s: line %d: idassert ID \"%s\" is not a valid DN\n",
1532 c
->fname
, c
->lineno
, c
->argv
[1] );
1536 li
->li_idassert_authzID
.bv_len
= STRLENOF( "dn:" ) + ndn
.bv_len
;
1537 li
->li_idassert_authzID
.bv_val
= ch_malloc( li
->li_idassert_authzID
.bv_len
+ 1 );
1538 AC_MEMCPY( li
->li_idassert_authzID
.bv_val
, "dn:", STRLENOF( "dn:" ) );
1539 AC_MEMCPY( &li
->li_idassert_authzID
.bv_val
[ STRLENOF( "dn:" ) ], ndn
.bv_val
, ndn
.bv_len
+ 1 );
1540 ch_free( ndn
.bv_val
);
1542 li
->li_idassert_mode
= LDAP_BACK_IDASSERT_OTHERDN
;
1546 li
->li_idassert_mode
= idassert_mode
[i
].mask
;
1549 if ( c
->argc
> 2 ) {
1552 for ( i
= 2; i
< c
->argc
; i
++ ) {
1553 if ( strcasecmp( c
->argv
[ i
], "override" ) == 0 ) {
1554 li
->li_idassert_flags
|= LDAP_BACK_AUTH_OVERRIDE
;
1556 } else if ( strcasecmp( c
->argv
[ i
], "prescriptive" ) == 0 ) {
1557 li
->li_idassert_flags
|= LDAP_BACK_AUTH_PRESCRIPTIVE
;
1559 } else if ( strcasecmp( c
->argv
[ i
], "non-prescriptive" ) == 0 ) {
1560 li
->li_idassert_flags
&= ( ~LDAP_BACK_AUTH_PRESCRIPTIVE
);
1562 } else if ( strcasecmp( c
->argv
[ i
], "obsolete-proxy-authz" ) == 0 ) {
1563 if ( li
->li_idassert_flags
& LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND
) {
1564 Debug( LDAP_DEBUG_ANY
,
1565 "%s: line %d: \"obsolete-proxy-authz\" flag "
1566 "in \"idassert-mode <args>\" "
1567 "incompatible with previously issued \"obsolete-encoding-workaround\" flag.\n",
1568 c
->fname
, c
->lineno
, 0 );
1571 li
->li_idassert_flags
|= LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ
;
1573 } else if ( strcasecmp( c
->argv
[ i
], "obsolete-encoding-workaround" ) == 0 ) {
1574 if ( li
->li_idassert_flags
& LDAP_BACK_AUTH_OBSOLETE_PROXY_AUTHZ
) {
1575 Debug( LDAP_DEBUG_ANY
,
1576 "%s: line %d: \"obsolete-encoding-workaround\" flag "
1577 "in \"idassert-mode <args>\" "
1578 "incompatible with previously issued \"obsolete-proxy-authz\" flag.\n",
1579 c
->fname
, c
->lineno
, 0 );
1582 li
->li_idassert_flags
|= LDAP_BACK_AUTH_OBSOLETE_ENCODING_WORKAROUND
;
1585 Debug( LDAP_DEBUG_ANY
,
1586 "%s: line %d: unknown flag #%d "
1587 "in \"idassert-mode <args> "
1588 "[<flags>]\" line.\n",
1589 c
->fname
, c
->lineno
, i
- 2 );
1596 case LDAP_BACK_CFG_IDASSERT_AUTHCDN
:
1597 switch ( li
->li_idassert_authmethod
) {
1598 case LDAP_AUTH_NONE
:
1599 li
->li_idassert_authmethod
= LDAP_AUTH_SIMPLE
;
1602 case LDAP_AUTH_SIMPLE
:
1606 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1607 "\"idassert-authcDN <DN>\" incompatible "
1608 "with auth method %d",
1609 li
->li_idassert_authmethod
);
1610 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1613 if ( !BER_BVISNULL( &li
->li_idassert_authcDN
) ) {
1614 free( li
->li_idassert_authcDN
.bv_val
);
1616 ber_memfree_x( c
->value_dn
.bv_val
, NULL
);
1617 li
->li_idassert_authcDN
= c
->value_ndn
;
1618 BER_BVZERO( &c
->value_dn
);
1619 BER_BVZERO( &c
->value_ndn
);
1622 case LDAP_BACK_CFG_IDASSERT_PASSWD
:
1623 switch ( li
->li_idassert_authmethod
) {
1624 case LDAP_AUTH_NONE
:
1625 li
->li_idassert_authmethod
= LDAP_AUTH_SIMPLE
;
1628 case LDAP_AUTH_SIMPLE
:
1632 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1633 "\"idassert-passwd <cred>\" incompatible "
1634 "with auth method %d",
1635 li
->li_idassert_authmethod
);
1636 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1639 if ( !BER_BVISNULL( &li
->li_idassert_passwd
) ) {
1640 free( li
->li_idassert_passwd
.bv_val
);
1642 ber_str2bv( c
->argv
[ 1 ], 0, 1, &li
->li_idassert_passwd
);
1645 case LDAP_BACK_CFG_IDASSERT_AUTHZFROM
:
1646 rc
= slap_idassert_authzfrom_parse( c
, &li
->li_idassert
);
1649 case LDAP_BACK_CFG_IDASSERT_METHOD
:
1650 /* no longer supported */
1651 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1652 "\"idassert-method <args>\": "
1653 "no longer supported; use \"idassert-bind\"" );
1654 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1657 case LDAP_BACK_CFG_IDASSERT_BIND
:
1658 rc
= slap_idassert_parse( c
, &li
->li_idassert
);
1661 case LDAP_BACK_CFG_REBIND
:
1662 if ( c
->argc
== 1 || c
->value_int
) {
1663 li
->li_flags
|= LDAP_BACK_F_SAVECRED
;
1666 li
->li_flags
&= ~LDAP_BACK_F_SAVECRED
;
1670 case LDAP_BACK_CFG_CHASE
:
1671 if ( c
->argc
== 1 || c
->value_int
) {
1672 li
->li_flags
|= LDAP_BACK_F_CHASE_REFERRALS
;
1675 li
->li_flags
&= ~LDAP_BACK_F_CHASE_REFERRALS
;
1679 case LDAP_BACK_CFG_T_F
: {
1682 i
= verb_to_mask( c
->argv
[1], t_f_mode
);
1683 if ( BER_BVISNULL( &t_f_mode
[i
].word
) ) {
1687 mask
= t_f_mode
[i
].mask
;
1689 if ( LDAP_BACK_ISOPEN( li
)
1690 && mask
== LDAP_BACK_F_T_F_DISCOVER
1691 && !LDAP_BACK_T_F( li
) )
1693 slap_bindconf sb
= { BER_BVNULL
};
1696 if ( li
->li_uri
== NULL
) {
1697 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1698 "need URI to discover absolute filters support "
1699 "in \"t-f-support discover\"" );
1700 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1704 ber_str2bv( li
->li_uri
, 0, 0, &sb
.sb_uri
);
1705 sb
.sb_version
= li
->li_version
;
1706 sb
.sb_method
= LDAP_AUTH_SIMPLE
;
1707 BER_BVSTR( &sb
.sb_binddn
, "" );
1709 rc
= slap_discover_feature( &sb
,
1710 slap_schema
.si_ad_supportedFeatures
->ad_cname
.bv_val
,
1711 LDAP_FEATURE_ABSOLUTE_FILTERS
);
1712 if ( rc
== LDAP_COMPARE_TRUE
) {
1713 mask
|= LDAP_BACK_F_T_F
;
1717 li
->li_flags
&= ~LDAP_BACK_F_T_F_MASK2
;
1718 li
->li_flags
|= mask
;
1721 case LDAP_BACK_CFG_WHOAMI
:
1722 if ( c
->argc
== 1 || c
->value_int
) {
1723 li
->li_flags
|= LDAP_BACK_F_PROXY_WHOAMI
;
1724 load_extop( (struct berval
*)&slap_EXOP_WHOAMI
,
1725 0, ldap_back_exop_whoami
);
1728 li
->li_flags
&= ~LDAP_BACK_F_PROXY_WHOAMI
;
1732 case LDAP_BACK_CFG_TIMEOUT
:
1733 for ( i
= 1; i
< c
->argc
; i
++ ) {
1734 if ( isdigit( (unsigned char) c
->argv
[ i
][ 0 ] ) ) {
1738 if ( lutil_atoux( &u
, c
->argv
[ i
], 0 ) != 0 ) {
1739 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1740 "unable to parse timeout \"%s\"",
1742 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1746 for ( j
= 0; j
< SLAP_OP_LAST
; j
++ ) {
1747 li
->li_timeout
[ j
] = u
;
1753 if ( slap_cf_aux_table_parse( c
->argv
[ i
], li
->li_timeout
, timeout_table
, "slapd-ldap timeout" ) ) {
1754 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1755 "unable to parse timeout \"%s\"",
1757 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1763 case LDAP_BACK_CFG_IDLE_TIMEOUT
: {
1766 if ( lutil_parse_time( c
->argv
[ 1 ], &t
) != 0 ) {
1767 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1768 "unable to parse idle timeout \"%s\"",
1770 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1773 li
->li_idle_timeout
= (time_t)t
;
1776 case LDAP_BACK_CFG_CONN_TTL
: {
1779 if ( lutil_parse_time( c
->argv
[ 1 ], &t
) != 0 ) {
1780 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1781 "unable to parse conn ttl\"%s\"",
1783 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1786 li
->li_conn_ttl
= (time_t)t
;
1789 case LDAP_BACK_CFG_NETWORK_TIMEOUT
: {
1792 if ( lutil_parse_time( c
->argv
[ 1 ], &t
) != 0 ) {
1793 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1794 "unable to parse network timeout \"%s\"",
1796 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1799 li
->li_network_timeout
= (time_t)t
;
1802 case LDAP_BACK_CFG_VERSION
:
1803 if ( c
->value_int
!= 0 && ( c
->value_int
< LDAP_VERSION_MIN
|| c
->value_int
> LDAP_VERSION_MAX
) ) {
1804 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1805 "unsupported version \"%s\" "
1806 "in \"protocol-version <version>\"",
1808 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1812 li
->li_version
= c
->value_int
;
1815 case LDAP_BACK_CFG_SINGLECONN
:
1816 if ( c
->value_int
) {
1817 li
->li_flags
|= LDAP_BACK_F_SINGLECONN
;
1820 li
->li_flags
&= ~LDAP_BACK_F_SINGLECONN
;
1824 case LDAP_BACK_CFG_USETEMP
:
1825 if ( c
->value_int
) {
1826 li
->li_flags
|= LDAP_BACK_F_USE_TEMPORARIES
;
1829 li
->li_flags
&= ~LDAP_BACK_F_USE_TEMPORARIES
;
1833 case LDAP_BACK_CFG_CONNPOOLMAX
:
1834 if ( c
->value_int
< LDAP_BACK_CONN_PRIV_MIN
1835 || c
->value_int
> LDAP_BACK_CONN_PRIV_MAX
)
1837 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1838 "invalid max size " "of privileged "
1839 "connections pool \"%s\" "
1840 "in \"conn-pool-max <n> "
1841 "(must be between %d and %d)\"",
1843 LDAP_BACK_CONN_PRIV_MIN
,
1844 LDAP_BACK_CONN_PRIV_MAX
);
1845 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1848 li
->li_conn_priv_max
= c
->value_int
;
1851 case LDAP_BACK_CFG_CANCEL
: {
1854 i
= verb_to_mask( c
->argv
[1], cancel_mode
);
1855 if ( BER_BVISNULL( &cancel_mode
[i
].word
) ) {
1859 mask
= cancel_mode
[i
].mask
;
1861 if ( LDAP_BACK_ISOPEN( li
)
1862 && mask
== LDAP_BACK_F_CANCEL_EXOP_DISCOVER
1863 && !LDAP_BACK_CANCEL( li
) )
1865 slap_bindconf sb
= { BER_BVNULL
};
1868 if ( li
->li_uri
== NULL
) {
1869 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1870 "need URI to discover \"cancel\" support "
1871 "in \"cancel exop-discover\"" );
1872 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1876 ber_str2bv( li
->li_uri
, 0, 0, &sb
.sb_uri
);
1877 sb
.sb_version
= li
->li_version
;
1878 sb
.sb_method
= LDAP_AUTH_SIMPLE
;
1879 BER_BVSTR( &sb
.sb_binddn
, "" );
1881 rc
= slap_discover_feature( &sb
,
1882 slap_schema
.si_ad_supportedExtension
->ad_cname
.bv_val
,
1884 if ( rc
== LDAP_COMPARE_TRUE
) {
1885 mask
|= LDAP_BACK_F_CANCEL_EXOP
;
1889 li
->li_flags
&= ~LDAP_BACK_F_CANCEL_MASK2
;
1890 li
->li_flags
|= mask
;
1893 case LDAP_BACK_CFG_QUARANTINE
:
1894 if ( LDAP_BACK_QUARANTINE( li
) ) {
1895 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1896 "quarantine already defined" );
1897 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1900 rc
= slap_retry_info_parse( c
->argv
[1], &li
->li_quarantine
,
1901 c
->cr_msg
, sizeof( c
->cr_msg
) );
1903 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1906 ldap_pvt_thread_mutex_init( &li
->li_quarantine_mutex
);
1907 /* give it a chance to retry if the pattern gets reset
1908 * via back-config */
1909 li
->li_isquarantined
= 0;
1910 li
->li_flags
|= LDAP_BACK_F_QUARANTINE
;
1914 #ifdef SLAP_CONTROL_X_SESSION_TRACKING
1915 case LDAP_BACK_CFG_ST_REQUEST
:
1916 if ( c
->value_int
) {
1917 li
->li_flags
|= LDAP_BACK_F_ST_REQUEST
;
1920 li
->li_flags
&= ~LDAP_BACK_F_ST_REQUEST
;
1923 #endif /* SLAP_CONTROL_X_SESSION_TRACKING */
1925 case LDAP_BACK_CFG_NOREFS
:
1926 if ( c
->value_int
) {
1927 li
->li_flags
|= LDAP_BACK_F_NOREFS
;
1930 li
->li_flags
&= ~LDAP_BACK_F_NOREFS
;
1934 case LDAP_BACK_CFG_REWRITE
:
1935 snprintf( c
->cr_msg
, sizeof( c
->cr_msg
),
1936 "rewrite/remap capabilities have been moved "
1937 "to the \"rwm\" overlay; see slapo-rwm(5) "
1938 "for details (hint: add \"overlay rwm\" "
1939 "and prefix all directives with \"rwm-\")" );
1940 Debug( LDAP_DEBUG_ANY
, "%s: %s.\n", c
->log
, c
->cr_msg
, 0 );
1944 /* FIXME: try to catch inconsistencies */
1953 ldap_back_init_cf( BackendInfo
*bi
)
1956 AttributeDescription
*ad
= NULL
;
1959 /* Make sure we don't exceed the bits reserved for userland */
1960 config_check_userland( LDAP_BACK_CFG_LAST
);
1962 bi
->bi_cf_ocs
= ldapocs
;
1964 rc
= config_register_schema( ldapcfg
, ldapocs
);
1969 /* setup olcDbAclPasswd and olcDbIDAssertPasswd
1970 * to be base64-encoded when written in LDIF form;
1971 * basically, we don't care if it fails */
1972 rc
= slap_str2ad( "olcDbACLPasswd", &ad
, &text
);
1974 Debug( LDAP_DEBUG_ANY
, "config_back_initialize: "
1975 "warning, unable to get \"olcDbACLPasswd\" "
1976 "attribute description: %d: %s\n",
1979 (void)ldif_must_b64_encode_register( ad
->ad_cname
.bv_val
,
1980 ad
->ad_type
->sat_oid
);
1984 rc
= slap_str2ad( "olcDbIDAssertPasswd", &ad
, &text
);
1986 Debug( LDAP_DEBUG_ANY
, "config_back_initialize: "
1987 "warning, unable to get \"olcDbIDAssertPasswd\" "
1988 "attribute description: %d: %s\n",
1991 (void)ldif_must_b64_encode_register( ad
->ad_cname
.bv_val
,
1992 ad
->ad_type
->sat_oid
);
2000 ldap_back_exop_whoami(
2004 struct berval
*bv
= NULL
;
2006 if ( op
->oq_extended
.rs_reqdata
!= NULL
) {
2007 /* no request data should be provided */
2008 rs
->sr_text
= "no request data expected";
2009 return rs
->sr_err
= LDAP_PROTOCOL_ERROR
;
2012 Statslog( LDAP_DEBUG_STATS
, "%s WHOAMI\n",
2013 op
->o_log_prefix
, 0, 0, 0, 0 );
2015 rs
->sr_err
= backend_check_restrictions( op
, rs
,
2016 (struct berval
*)&slap_EXOP_WHOAMI
);
2017 if( rs
->sr_err
!= LDAP_SUCCESS
) return rs
->sr_err
;
2019 /* if auth'd by back-ldap and request is proxied, forward it */
2020 if ( op
->o_conn
->c_authz_backend
2021 && !strcmp( op
->o_conn
->c_authz_backend
->be_type
, "ldap" )
2022 && !dn_match( &op
->o_ndn
, &op
->o_conn
->c_ndn
) )
2024 ldapconn_t
*lc
= NULL
;
2025 LDAPControl c
, *ctrls
[2] = {NULL
, NULL
};
2027 Operation op2
= *op
;
2033 op2
.o_ndn
= op
->o_conn
->c_ndn
;
2034 if ( !ldap_back_dobind( &lc
, &op2
, rs
, LDAP_BACK_SENDERR
) ) {
2037 c
.ldctl_oid
= LDAP_CONTROL_PROXY_AUTHZ
;
2038 c
.ldctl_iscritical
= 1;
2039 c
.ldctl_value
.bv_val
= op
->o_tmpalloc(
2040 op
->o_ndn
.bv_len
+ STRLENOF( "dn:" ) + 1,
2042 c
.ldctl_value
.bv_len
= op
->o_ndn
.bv_len
+ 3;
2043 ptr
= c
.ldctl_value
.bv_val
;
2044 ptr
= lutil_strcopy( ptr
, "dn:" );
2045 ptr
= lutil_strncopy( ptr
, op
->o_ndn
.bv_val
, op
->o_ndn
.bv_len
);
2049 rs
->sr_err
= ldap_whoami( lc
->lc_ld
, ctrls
, NULL
, &msgid
);
2050 if ( rs
->sr_err
== LDAP_SUCCESS
) {
2051 if ( ldap_result( lc
->lc_ld
, msgid
, LDAP_MSG_ALL
, NULL
, &res
) == -1 ) {
2052 ldap_get_option( lc
->lc_ld
, LDAP_OPT_ERROR_NUMBER
,
2054 if ( rs
->sr_err
== LDAP_SERVER_DOWN
&& doretry
) {
2056 if ( ldap_back_retry( &lc
, op
, rs
, LDAP_BACK_SENDERR
) ) {
2062 /* NOTE: are we sure "bv" will be malloc'ed
2063 * with the appropriate memory? */
2064 rs
->sr_err
= ldap_parse_whoami( lc
->lc_ld
, res
, &bv
);
2068 op
->o_tmpfree( c
.ldctl_value
.bv_val
, op
->o_tmpmemctx
);
2069 if ( rs
->sr_err
!= LDAP_SUCCESS
) {
2070 rs
->sr_err
= slap_map_api2result( rs
);
2074 ldap_back_release_conn( (ldapinfo_t
*)op2
.o_bd
->be_private
, lc
);
2078 /* else just do the same as before */
2079 bv
= (struct berval
*) ch_malloc( sizeof( struct berval
) );
2080 if ( !BER_BVISEMPTY( &op
->o_dn
) ) {
2081 bv
->bv_len
= op
->o_dn
.bv_len
+ STRLENOF( "dn:" );
2082 bv
->bv_val
= ch_malloc( bv
->bv_len
+ 1 );
2083 AC_MEMCPY( bv
->bv_val
, "dn:", STRLENOF( "dn:" ) );
2084 AC_MEMCPY( &bv
->bv_val
[ STRLENOF( "dn:" ) ], op
->o_dn
.bv_val
,
2086 bv
->bv_val
[ bv
->bv_len
] = '\0';
2094 rs
->sr_rspdata
= bv
;