⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 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 + -