📄 config.c
字号:
/* config.c - ldap backend configuration file routine *//* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/config.c,v 1.73.2.24 2007/01/27 23:56:43 ando Exp $ *//* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * Copyright 2003-2007 The OpenLDAP Foundation. * Portions Copyright 1999-2003 Howard Chu. * Portions Copyright 2000-2003 Pierangelo Masarati. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted only as authorized by the OpenLDAP * Public License. * * A copy of this license is available in the file LICENSE in the * top-level directory of the distribution or, alternatively, at * <http://www.OpenLDAP.org/license.html>. *//* ACKNOWLEDGEMENTS: * This work was initially developed by the Howard Chu for inclusion * in OpenLDAP Software and subsequently enhanced by Pierangelo * Masarati. */#include "portable.h"#include <stdio.h>#include <ac/string.h>#include <ac/ctype.h>#include <ac/socket.h>#include "slap.h"#include "config.h"#include "back-ldap.h"#include "lutil.h"#include "ldif.h"#undef ldap_debug/* for advanced URL parsing */#include "../../../libraries/libldap/ldap-int.h"static SLAP_EXTOP_MAIN_FN ldap_back_exop_whoami;static ConfigDriver ldap_back_cf_gen;enum { LDAP_BACK_CFG_URI = 1, LDAP_BACK_CFG_TLS, LDAP_BACK_CFG_ACL_AUTHCDN, LDAP_BACK_CFG_ACL_PASSWD, LDAP_BACK_CFG_ACL_METHOD, LDAP_BACK_CFG_ACL_BIND, LDAP_BACK_CFG_IDASSERT_MODE, LDAP_BACK_CFG_IDASSERT_AUTHCDN, LDAP_BACK_CFG_IDASSERT_PASSWD, LDAP_BACK_CFG_IDASSERT_AUTHZFROM, LDAP_BACK_CFG_IDASSERT_METHOD, LDAP_BACK_CFG_IDASSERT_BIND, LDAP_BACK_CFG_REBIND, LDAP_BACK_CFG_CHASE, LDAP_BACK_CFG_T_F, LDAP_BACK_CFG_WHOAMI, LDAP_BACK_CFG_TIMEOUT, LDAP_BACK_CFG_IDLE_TIMEOUT, LDAP_BACK_CFG_CONN_TTL, LDAP_BACK_CFG_NETWORK_TIMEOUT, LDAP_BACK_CFG_VERSION, LDAP_BACK_CFG_SINGLECONN, LDAP_BACK_CFG_USETEMP, LDAP_BACK_CFG_CONNPOOLMAX, LDAP_BACK_CFG_CANCEL, LDAP_BACK_CFG_QUARANTINE, LDAP_BACK_CFG_REWRITE, LDAP_BACK_CFG_LAST};static ConfigTable ldapcfg[] = { { "uri", "uri", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_URI, ldap_back_cf_gen, "( OLcfgDbAt:0.14 " "NAME 'olcDbURI' " "DESC 'URI (list) for remote DSA' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "tls", "what", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_TLS, ldap_back_cf_gen, "( OLcfgDbAt:3.1 " "NAME 'olcDbStartTLS' " "DESC 'StartTLS' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "acl-authcDN", "DN", 2, 2, 0, ARG_DN|ARG_MAGIC|LDAP_BACK_CFG_ACL_AUTHCDN, ldap_back_cf_gen, "( OLcfgDbAt:3.2 " "NAME 'olcDbACLAuthcDn' " "DESC 'Remote ACL administrative identity' " "OBSOLETE " "SYNTAX OMsDN " "SINGLE-VALUE )", NULL, NULL }, /* deprecated, will be removed; aliases "acl-authcDN" */ { "binddn", "DN", 2, 2, 0, ARG_DN|ARG_MAGIC|LDAP_BACK_CFG_ACL_AUTHCDN, ldap_back_cf_gen, NULL, NULL, NULL }, { "acl-passwd", "cred", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_ACL_PASSWD, ldap_back_cf_gen, "( OLcfgDbAt:3.3 " "NAME 'olcDbACLPasswd' " "DESC 'Remote ACL administrative identity credentials' " "OBSOLETE " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, /* deprecated, will be removed; aliases "acl-passwd" */ { "bindpw", "cred", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_ACL_PASSWD, ldap_back_cf_gen, NULL, NULL, NULL }, /* deprecated, will be removed; aliases "acl-bind" */ { "acl-method", "args", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_ACL_METHOD, ldap_back_cf_gen, NULL, NULL, NULL }, { "acl-bind", "args", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_ACL_BIND, ldap_back_cf_gen, "( OLcfgDbAt:3.4 " "NAME 'olcDbACLBind' " "DESC 'Remote ACL administrative identity auth bind configuration' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "idassert-authcDN", "DN", 2, 2, 0, ARG_DN|ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_AUTHCDN, ldap_back_cf_gen, "( OLcfgDbAt:3.5 " "NAME 'olcDbIDAssertAuthcDn' " "DESC 'Remote Identity Assertion administrative identity' " "OBSOLETE " "SYNTAX OMsDN " "SINGLE-VALUE )", NULL, NULL }, /* deprecated, will be removed; partially aliases "idassert-authcDN" */ { "proxyauthzdn", "DN", 2, 2, 0, ARG_DN|ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_AUTHCDN, ldap_back_cf_gen, NULL, NULL, NULL }, { "idassert-passwd", "cred", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_PASSWD, ldap_back_cf_gen, "( OLcfgDbAt:3.6 " "NAME 'olcDbIDAssertPasswd' " "DESC 'Remote Identity Assertion administrative identity credentials' " "OBSOLETE " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, /* deprecated, will be removed; partially aliases "idassert-passwd" */ { "proxyauthzpw", "cred", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_PASSWD, ldap_back_cf_gen, NULL, NULL, NULL }, { "idassert-bind", "args", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_BIND, ldap_back_cf_gen, "( OLcfgDbAt:3.7 " "NAME 'olcDbIDAssertBind' " "DESC 'Remote Identity Assertion administrative identity auth bind configuration' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "idassert-method", "args", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_METHOD, ldap_back_cf_gen, NULL, NULL, NULL }, { "idassert-mode", "mode>|u:<user>|[dn:]<DN", 2, 0, 0, ARG_STRING|ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_MODE, ldap_back_cf_gen, "( OLcfgDbAt:3.8 " "NAME 'olcDbIDAssertMode' " "DESC 'Remote Identity Assertion mode' " "OBSOLETE " "SYNTAX OMsDirectoryString " "SINGLE-VALUE)", NULL, NULL }, { "idassert-authzFrom", "authzRule", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_IDASSERT_AUTHZFROM, ldap_back_cf_gen, "( OLcfgDbAt:3.9 " "NAME 'olcDbIDAssertAuthzFrom' " "DESC 'Remote Identity Assertion authz rules' " "SYNTAX OMsDirectoryString " "X-ORDERED 'VALUES' )", NULL, NULL }, { "rebind-as-user", "NO|yes", 1, 2, 0, ARG_MAGIC|ARG_ON_OFF|LDAP_BACK_CFG_REBIND, ldap_back_cf_gen, "( OLcfgDbAt:3.10 " "NAME 'olcDbRebindAsUser' " "DESC 'Rebind as user' " "SYNTAX OMsBoolean " "SINGLE-VALUE )", NULL, NULL }, { "chase-referrals", "YES|no", 2, 2, 0, ARG_MAGIC|ARG_ON_OFF|LDAP_BACK_CFG_CHASE, ldap_back_cf_gen, "( OLcfgDbAt:3.11 " "NAME 'olcDbChaseReferrals' " "DESC 'Chase referrals' " "SYNTAX OMsBoolean " "SINGLE-VALUE )", NULL, NULL }, { "t-f-support", "NO|yes|discover", 2, 2, 0, ARG_MAGIC|LDAP_BACK_CFG_T_F, ldap_back_cf_gen, "( OLcfgDbAt:3.12 " "NAME 'olcDbTFSupport' " "DESC 'Absolute filters support' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "proxy-whoami", "NO|yes", 1, 2, 0, ARG_MAGIC|ARG_ON_OFF|LDAP_BACK_CFG_WHOAMI, ldap_back_cf_gen, "( OLcfgDbAt:3.13 " "NAME 'olcDbProxyWhoAmI' " "DESC 'Proxy whoAmI exop' " "SYNTAX OMsBoolean " "SINGLE-VALUE )", NULL, NULL }, { "timeout", "timeout(list)", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_TIMEOUT, ldap_back_cf_gen, "( OLcfgDbAt:3.14 " "NAME 'olcDbTimeout' " "DESC 'Per-operation timeouts' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "idle-timeout", "timeout", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_IDLE_TIMEOUT, ldap_back_cf_gen, "( OLcfgDbAt:3.15 " "NAME 'olcDbIdleTimeout' " "DESC 'connection idle timeout' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "conn-ttl", "ttl", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_CONN_TTL, ldap_back_cf_gen, "( OLcfgDbAt:3.16 " "NAME 'olcDbConnTtl' " "DESC 'connection ttl' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "network-timeout", "timeout", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_NETWORK_TIMEOUT, ldap_back_cf_gen, "( OLcfgDbAt:3.17 " "NAME 'olcDbNetworkTimeout' " "DESC 'connection network timeout' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "protocol-version", "version", 2, 0, 0, ARG_MAGIC|ARG_INT|LDAP_BACK_CFG_VERSION, ldap_back_cf_gen, "( OLcfgDbAt:3.18 " "NAME 'olcDbProtocolVersion' " "DESC 'protocol version' " "SYNTAX OMsInteger " "SINGLE-VALUE )", NULL, NULL }, { "single-conn", "TRUE/FALSE", 2, 0, 0, ARG_MAGIC|ARG_ON_OFF|LDAP_BACK_CFG_SINGLECONN, ldap_back_cf_gen, "( OLcfgDbAt:3.19 " "NAME 'olcDbSingleConn' " "DESC 'cache a single connection per identity' " "SYNTAX OMsBoolean " "SINGLE-VALUE )", NULL, NULL }, { "cancel", "ABANDON|ignore|exop", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_CANCEL, ldap_back_cf_gen, "( OLcfgDbAt:3.20 " "NAME 'olcDbCancel' " "DESC 'abandon/ignore/exop operations when appropriate' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "quarantine", "retrylist", 2, 0, 0, ARG_MAGIC|LDAP_BACK_CFG_QUARANTINE, ldap_back_cf_gen, "( OLcfgDbAt:3.21 " "NAME 'olcDbQuarantine' " "DESC 'Quarantine database if connection fails and retry according to rule' " "SYNTAX OMsDirectoryString " "SINGLE-VALUE )", NULL, NULL }, { "use-temporary-conn", "TRUE/FALSE", 2, 0, 0, ARG_MAGIC|ARG_ON_OFF|LDAP_BACK_CFG_USETEMP, ldap_back_cf_gen, "( OLcfgDbAt:3.22 " "NAME 'olcDbUseTemporaryConn' " "DESC 'Use temporary connections if the cached one is busy' " "SYNTAX OMsBoolean " "SINGLE-VALUE )", NULL, NULL }, { "conn-pool-max", "<n>", 2, 0, 0, ARG_MAGIC|ARG_INT|LDAP_BACK_CFG_CONNPOOLMAX, ldap_back_cf_gen, "( OLcfgDbAt:3.23 " "NAME 'olcDbConnectionPoolMax' " "DESC 'Max size of privileged connections pool' " "SYNTAX OMsInteger " "SINGLE-VALUE )", NULL, NULL }, { "suffixmassage", "[virtual]> <real", 2, 3, 0, ARG_STRING|ARG_MAGIC|LDAP_BACK_CFG_REWRITE, ldap_back_cf_gen, NULL, NULL, NULL }, { "map", "attribute|objectClass> [*|<local>] *|<remote", 3, 4, 0, ARG_STRING|ARG_MAGIC|LDAP_BACK_CFG_REWRITE, ldap_back_cf_gen, NULL, NULL, NULL }, { "rewrite", "<arglist>", 2, 4, STRLENOF( "rewrite" ), ARG_STRING|ARG_MAGIC|LDAP_BACK_CFG_REWRITE, ldap_back_cf_gen, NULL, NULL, NULL }, { NULL, NULL, 0, 0, 0, ARG_IGNORED, NULL, NULL, NULL, NULL }};static ConfigOCs ldapocs[] = { { "( OLcfgDbOc:3.1 " "NAME 'olcLDAPConfig' " "DESC 'LDAP backend configuration' " "SUP olcDatabaseConfig " "MAY ( olcDbURI " "$ olcDbStartTLS " "$ olcDbACLAuthcDn " "$ olcDbACLPasswd " "$ olcDbACLBind " "$ olcDbIDAssertAuthcDn " "$ olcDbIDAssertPasswd " "$ olcDbIDAssertBind " "$ olcDbIDAssertMode " "$ olcDbIDAssertAuthzFrom " "$ olcDbRebindAsUser " "$ olcDbChaseReferrals " "$ olcDbTFSupport " "$ olcDbProxyWhoAmI " "$ olcDbTimeout " "$ olcDbIdleTimeout " "$ olcDbSingleConn " "$ olcDbCancel " "$ olcDbQuarantine " "$ olcDbUseTemporaryConn " "$ olcDbConnectionPoolMax " ") )", Cft_Database, ldapcfg}, { NULL, 0, NULL }};static slap_verbmasks idassert_mode[] = { { BER_BVC("self"), LDAP_BACK_IDASSERT_SELF }, { BER_BVC("anonymous"), LDAP_BACK_IDASSERT_ANONYMOUS }, { BER_BVC("none"), LDAP_BACK_IDASSERT_NOASSERT }, { BER_BVC("legacy"), LDAP_BACK_IDASSERT_LEGACY }, { BER_BVNULL, 0 }};static slap_verbmasks tls_mode[] = { { BER_BVC( "propagate" ), LDAP_BACK_F_TLS_PROPAGATE_MASK }, { BER_BVC( "try-propagate" ), LDAP_BACK_F_PROPAGATE_TLS }, { BER_BVC( "start" ), LDAP_BACK_F_TLS_USE_MASK }, { BER_BVC( "try-start" ), LDAP_BACK_F_USE_TLS }, { BER_BVC( "none" ), LDAP_BACK_F_NONE }, { BER_BVNULL, 0 }};static slap_verbmasks t_f_mode[] = { { BER_BVC( "yes" ), LDAP_BACK_F_T_F }, { BER_BVC( "discover" ), LDAP_BACK_F_T_F_DISCOVER }, { BER_BVC( "no" ), LDAP_BACK_F_NONE }, { BER_BVNULL, 0 }};static slap_verbmasks cancel_mode[] = {#if 0 /* needs ldap_int_discard(), 2.4 */ { BER_BVC( "ignore" ), LDAP_BACK_F_CANCEL_IGNORE },#endif { BER_BVC( "exop" ), LDAP_BACK_F_CANCEL_EXOP }, { BER_BVC( "exop-discover" ), LDAP_BACK_F_CANCEL_EXOP_DISCOVER }, { BER_BVC( "abandon" ), LDAP_BACK_F_CANCEL_ABANDON }, { BER_BVNULL, 0 }};/* see enum in slap.h */static slap_cf_aux_table timeout_table[] = { { BER_BVC("bind="), SLAP_OP_BIND * sizeof( time_t ), 'u', 0, NULL }, /* unbind makes no sense */ { BER_BVC("add="), SLAP_OP_ADD * sizeof( time_t ), 'u', 0, NULL }, { BER_BVC("delete="), SLAP_OP_DELETE * sizeof( time_t ), 'u', 0, NULL }, { BER_BVC("modrdn="), SLAP_OP_MODRDN * sizeof( time_t ), 'u', 0, NULL }, { BER_BVC("modify="), SLAP_OP_MODIFY * sizeof( time_t ), 'u', 0, NULL }, { BER_BVC("compare="), SLAP_OP_COMPARE * sizeof( time_t ), 'u', 0, NULL }, { BER_BVC("search="), SLAP_OP_SEARCH * sizeof( time_t ), 'u', 0, NULL }, /* abandon makes little sense */#if 0 /* not implemented yet */ { BER_BVC("extended="), SLAP_OP_EXTENDED * sizeof( time_t ), 'u', 0, NULL },#endif { BER_BVNULL, 0, 0, 0, NULL }};intslap_retry_info_parse( char *in, slap_retry_info_t *ri, char *buf, ber_len_t buflen ){ char **retrylist = NULL; int rc = 0; int i; slap_str2clist( &retrylist, in, " ;" ); if ( retrylist == NULL ) { return 1; } for ( i = 0; retrylist[ i ] != NULL; i++ ) /* count */ ; ri->ri_interval = ch_calloc( sizeof( time_t ), i + 1 ); ri->ri_num = ch_calloc( sizeof( int ), i + 1 ); for ( i = 0; retrylist[ i ] != NULL; i++ ) { unsigned long t; char *sep = strchr( retrylist[ i ], ',' ); if ( sep == NULL ) { snprintf( buf, buflen, "missing comma in retry pattern #%d \"%s\"", i, retrylist[ i ] ); rc = 1; goto done; } *sep++ = '\0'; if ( lutil_parse_time( retrylist[ i ], &t ) ) { snprintf( buf, buflen, "unable to parse interval #%d \"%s\"", i, retrylist[ i ] ); rc = 1; goto done; } ri->ri_interval[ i ] = (time_t)t; if ( strcmp( sep, "+" ) == 0 ) { if ( retrylist[ i + 1 ] != NULL ) { snprintf( buf, buflen, "extra cruft after retry pattern " "#%d \"%s,+\" with \"forever\" mark", i, retrylist[ i ] ); rc = 1; goto done; } ri->ri_num[ i ] = SLAP_RETRYNUM_FOREVER; } else if ( lutil_atoi( &ri->ri_num[ i ], sep ) ) { snprintf( buf, buflen, "unable to parse retry num #%d \"%s\"", i, sep ); rc = 1; goto done; } } ri->ri_num[ i ] = SLAP_RETRYNUM_TAIL; ri->ri_idx = 0; ri->ri_count = 0; ri->ri_last = (time_t)(-1);done:; ldap_charray_free( retrylist ); if ( rc ) { slap_retry_info_destroy( ri ); } return rc;}intslap_retry_info_unparse( slap_retry_info_t *ri, struct berval *bvout ){ int i; char buf[ BUFSIZ * 2 ], *ptr = buf; struct berval bv = BER_BVNULL; assert( ri != NULL ); assert( bvout != NULL ); BER_BVZERO( bvout );#define WHATSLEFT ( sizeof( buf ) - ( ptr - buf ) ) for ( i = 0; ri->ri_num[ i ] != SLAP_RETRYNUM_TAIL; i++ ) { if ( i > 0 ) { if ( WHATSLEFT <= 1 ) { return 1; } *ptr++ = ';'; } if ( lutil_unparse_time( ptr, WHATSLEFT, (long)ri->ri_interval[i] ) ) { return 1; } ptr += strlen( ptr );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -