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

📄 config.c

📁 OpenLdap是LDAP的开源项目
💻 C
📖 第 1 页 / 共 3 页
字号:
		{			Debug( LDAP_DEBUG_ANY,				"%s: line %d: quarantine already defined.\n",				fname, lineno, 0 );			return 1;		}		switch ( argc ) {		case 2:			break;		case 1:			Debug( LDAP_DEBUG_ANY,				"%s: line %d: missing arg in \"quarantine <pattern list>\".\n",				fname, lineno, 0 );			return 1;		default:			Debug( LDAP_DEBUG_ANY,				"%s: line %d: extra cruft after \"quarantine <pattern list>\".\n",				fname, lineno, 0 );			return 1;		}		if ( ri != &mi->mi_quarantine ) {			ri->ri_interval = NULL;			ri->ri_num = NULL;		}		if ( mi->mi_ntargets > 0 && !META_BACK_QUARANTINE( mi ) ) {			ldap_pvt_thread_mutex_init( &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_quarantine_mutex );		}		if ( slap_retry_info_parse( argv[ 1 ], ri, buf, sizeof( buf ) ) ) {			Debug( LDAP_DEBUG_ANY,				"%s line %d: %s.\n",				fname, lineno, buf );			return 1;		}		if ( mi->mi_ntargets ) {			mi->mi_flags |= LDAP_BACK_F_QUARANTINE;		} else {			mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_flags |= LDAP_BACK_F_QUARANTINE;		}		/* dn massaging */	} else if ( strcasecmp( argv[ 0 ], "suffixmassage" ) == 0 ) {		BackendDB 	*tmp_bd;		int 		i = mi->mi_ntargets - 1, c, rc;		struct berval	dn, nvnc, pvnc, nrnc, prnc;		if ( i < 0 ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: need \"uri\" directive first\n",				fname, lineno, 0 );			return 1;		}				/*		 * syntax:		 * 		 * 	suffixmassage <suffix> <massaged suffix>		 *		 * the <suffix> field must be defined as a valid suffix		 * (or suffixAlias?) for the current database;		 * the <massaged suffix> shouldn't have already been		 * defined as a valid suffix or suffixAlias for the 		 * current server		 */		if ( argc != 3 ) { 			Debug( LDAP_DEBUG_ANY,	"%s: line %d: syntax is \"suffixMassage <suffix> <massaged suffix>\"\n",				fname, lineno, 0 );			return 1;		}		ber_str2bv( argv[ 1 ], 0, 0, &dn );		if ( dnPrettyNormal( NULL, &dn, &pvnc, &nvnc, NULL ) != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"suffix \"%s\" is invalid\n",					fname, lineno, argv[ 1 ] );			return 1;		}		for ( c = 0; !BER_BVISNULL( &be->be_nsuffix[ c ] ); c++ ) {			if ( dnIsSuffix( &nvnc, &be->be_nsuffix[ 0 ] ) ) {				break;			}		}		if ( BER_BVISNULL( &be->be_nsuffix[ c ] ) ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "	"%s: line %d: <suffix> \"%s\" must be within the database naming context, in "	"\"suffixMassage <suffix> <massaged suffix>\"\n",				fname, lineno, pvnc.bv_val );			free( pvnc.bv_val );			free( nvnc.bv_val );			return 1;								}		ber_str2bv( argv[ 2 ], 0, 0, &dn );		if ( dnPrettyNormal( NULL, &dn, &prnc, &nrnc, NULL ) != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"massaged suffix \"%s\" is invalid\n",				fname, lineno, argv[ 2 ] );			free( pvnc.bv_val );			free( nvnc.bv_val );			return 1;		}			tmp_bd = select_backend( &nrnc, 0, 0 );		if ( tmp_bd != NULL && tmp_bd->be_private == be->be_private ) {			Debug( LDAP_DEBUG_ANY, 	"%s: line %d: warning: <massaged suffix> \"%s\" resolves to this database, in "	"\"suffixMassage <suffix> <massaged suffix>\"\n",				fname, lineno, prnc.bv_val );		}		/*		 * The suffix massaging is emulated by means of the		 * rewrite capabilities		 */	 	rc = suffix_massage_config( mi->mi_targets[ i ]->mt_rwmap.rwm_rw,				&pvnc, &nvnc, &prnc, &nrnc );		free( pvnc.bv_val );		free( nvnc.bv_val );		free( prnc.bv_val );		free( nrnc.bv_val );		return rc;			/* rewrite stuff ... */ 	} else if ( strncasecmp( argv[ 0 ], "rewrite", 7 ) == 0 ) {		int 		i = mi->mi_ntargets - 1;		if ( i < 0 ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: \"rewrite\" "				"statement outside target definition.\n",				fname, lineno, 0 );			return 1;		}		 		return rewrite_parse( mi->mi_targets[ i ]->mt_rwmap.rwm_rw,				fname, lineno, argc, argv );	/* objectclass/attribute mapping */	} else if ( strcasecmp( argv[ 0 ], "map" ) == 0 ) {		int 		i = mi->mi_ntargets - 1;		if ( i < 0 ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: need \"uri\" directive first\n",				fname, lineno, 0 );			return 1;		}		return ldap_back_map_config( &mi->mi_targets[ i ]->mt_rwmap.rwm_oc, 				&mi->mi_targets[ i ]->mt_rwmap.rwm_at,				fname, lineno, argc, argv );	} else if ( strcasecmp( argv[ 0 ], "nretries" ) == 0 ) {		int 		i = mi->mi_ntargets - 1;		int		nretries = META_RETRY_UNDEFINED;		if ( argc != 2 ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: need value in \"nretries <value>\"\n",				fname, lineno, 0 );			return 1;		}		if ( strcasecmp( argv[ 1 ], "forever" ) == 0 ) {			nretries = META_RETRY_FOREVER;		} else if ( strcasecmp( argv[ 1 ], "never" ) == 0 ) {			nretries = META_RETRY_NEVER;		} else {			if ( lutil_atoi( &nretries, argv[ 1 ] ) != 0 ) {				Debug( LDAP_DEBUG_ANY,	"%s: line %d: unable to parse value \"%s\" in \"nretries <value>\"\n",					fname, lineno, argv[ 1 ] );				return 1;			}		}		if ( i < 0 ) {			mi->mi_nretries = nretries;		} else {			mi->mi_targets[ i ]->mt_nretries = nretries;		}	} else if ( strcasecmp( argv[ 0 ], "protocol-version" ) == 0 ) {		int	*version = mi->mi_ntargets ?				&mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_version				: &mi->mi_version;		if ( argc != 2 ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: need value in \"protocol-version <version>\"\n",				fname, lineno, 0 );			return 1;		}		if ( lutil_atoi( version, argv[ 1 ] ) != 0 ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: unable to parse version \"%s\" in \"protocol-version <version>\"\n",				fname, lineno, argv[ 1 ] );			return 1;		}		if ( *version != 0 && ( *version < LDAP_VERSION_MIN || *version > LDAP_VERSION_MAX ) ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: unsupported version \"%s\" in \"protocol-version <version>\"\n",				fname, lineno, argv[ 1 ] );			return 1;		}	/* anything else */	} else {		return SLAP_CONF_UNKNOWN;	}	return 0;}intldap_back_map_config(		struct ldapmap	*oc_map,		struct ldapmap	*at_map,		const char	*fname,		int		lineno,		int		argc,		char		**argv ){	struct ldapmap		*map;	struct ldapmapping	*mapping;	char			*src, *dst;	int			is_oc = 0;	if ( argc < 3 || argc > 4 ) {		Debug( LDAP_DEBUG_ANY,	"%s: line %d: syntax is \"map {objectclass | attribute} [<local> | *] {<foreign> | *}\"\n",			fname, lineno, 0 );		return 1;	}	if ( strcasecmp( argv[ 1 ], "objectclass" ) == 0 ) {		map = oc_map;		is_oc = 1;	} else if ( strcasecmp( argv[ 1 ], "attribute" ) == 0 ) {		map = at_map;	} else {		Debug( LDAP_DEBUG_ANY, "%s: line %d: syntax is "			"\"map {objectclass | attribute} [<local> | *] "			"{<foreign> | *}\"\n",			fname, lineno, 0 );		return 1;	}	if ( strcmp( argv[ 2 ], "*" ) == 0 ) {		if ( argc < 4 || strcmp( argv[ 3 ], "*" ) == 0 ) {			map->drop_missing = ( argc < 4 );			goto success_return;		}		src = dst = argv[ 3 ];	} else if ( argc < 4 ) {		src = "";		dst = argv[ 2 ];	} else {		src = argv[ 2 ];		dst = ( strcmp( argv[ 3 ], "*" ) == 0 ? src : argv[ 3 ] );	}	if ( ( map == at_map )		&& ( strcasecmp( src, "objectclass" ) == 0			|| strcasecmp( dst, "objectclass" ) == 0 ) )	{		Debug( LDAP_DEBUG_ANY,			"%s: line %d: objectclass attribute cannot be mapped\n",			fname, lineno, 0 );	}	mapping = (struct ldapmapping *)ch_calloc( 2,		sizeof(struct ldapmapping) );	if ( mapping == NULL ) {		Debug( LDAP_DEBUG_ANY,			"%s: line %d: out of memory\n",			fname, lineno, 0 );		return 1;	}	ber_str2bv( src, 0, 1, &mapping[ 0 ].src );	ber_str2bv( dst, 0, 1, &mapping[ 0 ].dst );	mapping[ 1 ].src = mapping[ 0 ].dst;	mapping[ 1 ].dst = mapping[ 0 ].src;	/*	 * schema check	 */	if ( is_oc ) {		if ( src[ 0 ] != '\0' ) {			if ( oc_bvfind( &mapping[ 0 ].src ) == NULL ) {				Debug( LDAP_DEBUG_ANY,	"%s: line %d: warning, source objectClass '%s' "	"should be defined in schema\n",					fname, lineno, src );				/*				 * FIXME: this should become an err				 */				goto error_return;			}		}		if ( oc_bvfind( &mapping[ 0 ].dst ) == NULL ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: warning, destination objectClass '%s' "	"is not defined in schema\n",				fname, lineno, dst );		}	} else {		int			rc;		const char		*text = NULL;		AttributeDescription	*ad = NULL;		if ( src[ 0 ] != '\0' ) {			rc = slap_bv2ad( &mapping[ 0 ].src, &ad, &text );			if ( rc != LDAP_SUCCESS ) {				Debug( LDAP_DEBUG_ANY,	"%s: line %d: warning, source attributeType '%s' "	"should be defined in schema\n",					fname, lineno, src );				/*				 * FIXME: this should become an err				 */				/*				 * we create a fake "proxied" ad 				 * and add it here.				 */				rc = slap_bv2undef_ad( &mapping[ 0 ].src,						&ad, &text, SLAP_AD_PROXIED );				if ( rc != LDAP_SUCCESS ) {					char	buf[ SLAP_TEXT_BUFLEN ];					snprintf( buf, sizeof( buf ),						"source attributeType \"%s\": %d (%s)",						src, rc, text ? text : "" );					Debug( LDAP_DEBUG_ANY,						"%s: line %d: %s\n",						fname, lineno, buf );					goto error_return;				}			}			ad = NULL;		}		rc = slap_bv2ad( &mapping[ 0 ].dst, &ad, &text );		if ( rc != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_ANY,	"%s: line %d: warning, destination attributeType '%s' "	"is not defined in schema\n",				fname, lineno, dst );			/*			 * we create a fake "proxied" ad 			 * and add it here.			 */			rc = slap_bv2undef_ad( &mapping[ 0 ].dst,					&ad, &text, SLAP_AD_PROXIED );			if ( rc != LDAP_SUCCESS ) {				char	buf[ SLAP_TEXT_BUFLEN ];				snprintf( buf, sizeof( buf ),					"source attributeType \"%s\": %d (%s)\n",					dst, rc, text ? text : "" );				Debug( LDAP_DEBUG_ANY,					"%s: line %d: %s\n",					fname, lineno, buf );				return 1;			}		}	}	if ( (src[ 0 ] != '\0' && avl_find( map->map, (caddr_t)&mapping[ 0 ], mapping_cmp ) != NULL)			|| avl_find( map->remap, (caddr_t)&mapping[ 1 ], mapping_cmp ) != NULL)	{		Debug( LDAP_DEBUG_ANY,			"%s: line %d: duplicate mapping found.\n",			fname, lineno, 0 );		goto error_return;	}	if ( src[ 0 ] != '\0' ) {		avl_insert( &map->map, (caddr_t)&mapping[ 0 ],					mapping_cmp, mapping_dup );	}	avl_insert( &map->remap, (caddr_t)&mapping[ 1 ],				mapping_cmp, mapping_dup );success_return:;	if ( !is_oc && map->map == NULL ) {		/* only init if required */		ldap_back_map_init( map, &mapping );	}	return 0;error_return:;	if ( mapping ) {		ch_free( mapping[ 0 ].src.bv_val );		ch_free( mapping[ 0 ].dst.bv_val );		ch_free( mapping );	}	return 1;}#ifdef ENABLE_REWRITEstatic char *suffix_massage_regexize( const char *s ){	char *res, *ptr;	const char *p, *r;	int i;	if ( s[ 0 ] == '\0' ) {		return ch_strdup( "^(.+)$" );	}	for ( i = 0, p = s; 			( r = strchr( p, ',' ) ) != NULL; 			p = r + 1, i++ )		;	res = ch_calloc( sizeof( char ),			strlen( s )			+ STRLENOF( "((.+),)?" )			+ STRLENOF( "[ ]?" ) * i			+ STRLENOF( "$" ) + 1 );	ptr = lutil_strcopy( res, "((.+),)?" );	for ( i = 0, p = s;			( r = strchr( p, ',' ) ) != NULL;			p = r + 1 , i++ ) {		ptr = lutil_strncopy( ptr, p, r - p + 1 );		ptr = lutil_strcopy( ptr, "[ ]?" );		if ( r[ 1 ] == ' ' ) {			r++;		}	}	ptr = lutil_strcopy( ptr, p );	ptr[ 0 ] = '$';	ptr++;	ptr[ 0 ] = '\0';	return res;}static char *suffix_massage_patternize( const char *s, const char *p ){	ber_len_t	len;	char		*res, *ptr;	len = strlen( p );	if ( s[ 0 ] == '\0' ) {		len++;	}	res = ch_calloc( sizeof( char ), len + STRLENOF( "%1" ) + 1 );	if ( res == NULL ) {		return NULL;	}	ptr = lutil_strcopy( res, ( p[ 0 ] == '\0' ? "%2" : "%1" ) );	if ( s[ 0 ] == '\0' ) {		ptr[ 0 ] = ',';		ptr++;	}	lutil_strcopy( ptr, p );	return res;}intsuffix_massage_config( 		struct rewrite_info *info,		struct berval *pvnc,		struct berval *nvnc,		struct berval *prnc,		struct berval *nrnc){	char *rargv[ 5 ];	int line = 0;	rargv[ 0 ] = "rewriteEngine";	rargv[ 1 ] = "on";	rargv[ 2 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );	rargv[ 0 ] = "rewriteContext";	rargv[ 1 ] = "default";	rargv[ 2 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );	rargv[ 0 ] = "rewriteRule";	rargv[ 1 ] = suffix_massage_regexize( pvnc->bv_val );	rargv[ 2 ] = suffix_massage_patternize( pvnc->bv_val, prnc->bv_val );	rargv[ 3 ] = ":";	rargv[ 4 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );	ch_free( rargv[ 1 ] );	ch_free( rargv[ 2 ] );	if ( BER_BVISEMPTY( pvnc ) ) {		rargv[ 0 ] = "rewriteRule";		rargv[ 1 ] = "^$";		rargv[ 2 ] = prnc->bv_val;		rargv[ 3 ] = ":";		rargv[ 4 ] = NULL;		rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );	}		rargv[ 0 ] = "rewriteContext";	rargv[ 1 ] = "searchEntryDN";	rargv[ 2 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );	rargv[ 0 ] = "rewriteRule";	rargv[ 1 ] = suffix_massage_regexize( prnc->bv_val );	rargv[ 2 ] = suffix_massage_patternize( prnc->bv_val, pvnc->bv_val );	rargv[ 3 ] = ":";	rargv[ 4 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );	ch_free( rargv[ 1 ] );	ch_free( rargv[ 2 ] );	if ( BER_BVISEMPTY( prnc ) ) {		rargv[ 0 ] = "rewriteRule";		rargv[ 1 ] = "^$";		rargv[ 2 ] = pvnc->bv_val;		rargv[ 3 ] = ":";		rargv[ 4 ] = NULL;		rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );	}		/* backward compatibility */	rargv[ 0 ] = "rewriteContext";	rargv[ 1 ] = "searchResult";	rargv[ 2 ] = "alias";	rargv[ 3 ] = "searchEntryDN";	rargv[ 4 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );		rargv[ 0 ] = "rewriteContext";	rargv[ 1 ] = "matchedDN";	rargv[ 2 ] = "alias";	rargv[ 3 ] = "searchEntryDN";	rargv[ 4 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );	rargv[ 0 ] = "rewriteContext";	rargv[ 1 ] = "searchAttrDN";	rargv[ 2 ] = "alias";	rargv[ 3 ] = "searchEntryDN";	rargv[ 4 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );	/* NOTE: this corresponds to #undef'ining RWM_REFERRAL_REWRITE;	 * see servers/slapd/overlays/rwm.h for details */        rargv[ 0 ] = "rewriteContext";	rargv[ 1 ] = "referralAttrDN";	rargv[ 2 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );	rargv[ 0 ] = "rewriteContext";	rargv[ 1 ] = "referralDN";	rargv[ 2 ] = NULL;	rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );		return 0;}#endif /* ENABLE_REWRITE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -