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

📄 dynlist.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		}		assert( o.ors_filterstr.bv_val != lud->lud_filter );		op->o_tmpfree( o.ors_filterstr.bv_val, op->o_tmpmemctx );		ldap_free_urldesc( lud );	}	rs->sr_entry = e;	rs->sr_flags = e_flags;	return SLAP_CB_CONTINUE;}static intdynlist_sc_save_entry( Operation *op, SlapReply *rs ){	/* save the entry in the private field of the callback,	 * so it doesn't get freed (it's temporary!) */	if ( rs->sr_entry != NULL ) {		dynlist_sc_t	*dlc = (dynlist_sc_t *)op->o_callback->sc_private;		dlc->dlc_e = rs->sr_entry;		rs->sr_entry = NULL;	}	return 0;}static intdynlist_compare( Operation *op, SlapReply *rs ){	slap_overinst	*on = (slap_overinst *)op->o_bd->bd_info;	dynlist_info_t	*dli = (dynlist_info_t *)on->on_bi.bi_private;	for ( ; dli != NULL; dli = dli->dli_next ) {		if ( op->oq_compare.rs_ava->aa_desc == dli->dli_member_ad ) {			/* This compare is for one of the attributes we're			 * interested in. We'll use slapd's existing dyngroup			 * evaluator to get the answer we want.			 */			int cache = op->o_do_not_cache;							op->o_do_not_cache = 1;			rs->sr_err = backend_group( op, NULL, &op->o_req_ndn,				&op->oq_compare.rs_ava->aa_value, dli->dli_oc, dli->dli_ad );			op->o_do_not_cache = cache;			switch ( rs->sr_err ) {			case LDAP_SUCCESS:				rs->sr_err = LDAP_COMPARE_TRUE;				break;			case LDAP_NO_SUCH_OBJECT:				/* NOTE: backend_group() returns noSuchObject				 * if op_ndn does not exist; however, since				 * dynamic list expansion means that the				 * member attribute is virtually present, the				 * non-existence of the asserted value implies				 * the assertion is FALSE rather than				 * UNDEFINED */				rs->sr_err = LDAP_COMPARE_FALSE;				break;			}			return SLAP_CB_CONTINUE;		}	}	dli = (dynlist_info_t *)on->on_bi.bi_private;	for ( ; dli != NULL && rs->sr_err != LDAP_COMPARE_TRUE; dli = dli->dli_next ) {		Attribute	*a;		slap_callback	cb;		Operation	o = *op;		SlapReply	r = { REP_SEARCH };		AttributeName	an[2];		int		rc;		dynlist_sc_t	dlc = { 0 };		Entry		*e;		int cache = op->o_do_not_cache;		struct berval	op_dn = op->o_dn,				op_ndn = op->o_ndn;		BackendDB	*op_bd = op->o_bd;		/* fetch the entry as rootdn (a hack to see if it exists		 * and if it has the right objectClass) */		op->o_do_not_cache = 1;		op->o_dn = op->o_bd->be_rootdn;		op->o_ndn = op->o_bd->be_rootndn;		op->o_bd = select_backend( &op->o_req_ndn, 0, 0 );		r.sr_err = be_entry_get_rw( op, &op->o_req_ndn,			dli->dli_oc, NULL, 0, &e );		if ( e != NULL ) {			be_entry_release_r( op, e );		}		op->o_do_not_cache = cache;		op->o_dn = op_dn;		op->o_ndn = op_ndn;		op->o_bd = op_bd;		if ( r.sr_err != LDAP_SUCCESS ) {			continue;		}		/* if the entry has the right objectClass, generate		 * the dynamic list and compare */		dlc.dlc_dli = dli;		cb.sc_private = &dlc;		cb.sc_response = dynlist_sc_save_entry;		cb.sc_cleanup = NULL;		cb.sc_next = NULL;		o.o_callback = &cb;		o.o_tag = LDAP_REQ_SEARCH;		o.ors_limit = NULL;		o.ors_tlimit = SLAP_NO_LIMIT;		o.ors_slimit = SLAP_NO_LIMIT;		o.o_bd = select_backend( &o.o_req_ndn, 0, 1 );		if ( !o.o_bd || !o.o_bd->be_search ) {			return SLAP_CB_CONTINUE;		}		BER_BVSTR( &o.ors_filterstr, "(objectClass=*)" );		o.ors_filter = str2filter_x( op, o.ors_filterstr.bv_val );		if ( o.ors_filter == NULL ) {			/* FIXME: error? */			return SLAP_CB_CONTINUE;		}		o.ors_scope = LDAP_SCOPE_BASE;		o.ors_deref = LDAP_DEREF_NEVER;		an[0].an_name = op->orc_ava->aa_desc->ad_cname;		an[0].an_desc = op->orc_ava->aa_desc;		BER_BVZERO( &an[1].an_name );		o.ors_attrs = an;		o.ors_attrsonly = 0;		rc = o.o_bd->be_search( &o, &r );		filter_free_x( &o, o.ors_filter );		if ( rc != 0 ) {			return rc;		}		if ( dlc.dlc_e != NULL ) {			r.sr_entry = dlc.dlc_e;		}		if ( r.sr_err != LDAP_SUCCESS || r.sr_entry == NULL ) {			/* error? */			return SLAP_CB_CONTINUE;		}		for ( a = attrs_find( r.sr_entry->e_attrs, op->orc_ava->aa_desc );			a != NULL;			a = attrs_find( a->a_next, op->orc_ava->aa_desc ) )		{			/* if we're here, we got a match... */			rs->sr_err = LDAP_COMPARE_FALSE;			if ( value_find_ex( op->orc_ava->aa_desc,				SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH |					SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH,				a->a_nvals, &op->orc_ava->aa_value, op->o_tmpmemctx ) == 0 )			{				rs->sr_err = LDAP_COMPARE_TRUE;				break;			}		}		if ( r.sr_flags & REP_ENTRY_MUSTBEFREED ) {			entry_free( r.sr_entry );		}	}	return SLAP_CB_CONTINUE;}static intdynlist_response( Operation *op, SlapReply *rs ){	dynlist_info_t	*dli;	switch ( op->o_tag ) {	case LDAP_REQ_SEARCH:		if ( rs->sr_type == REP_SEARCH && !get_manageDSAit( op ) )		{			dli = dynlist_is_dynlist( op, rs );			if ( dli != NULL ) {				return dynlist_send_entry( op, rs, dli );			}		}		break;	case LDAP_REQ_COMPARE:		switch ( rs->sr_err ) {		/* NOTE: we waste a few cycles running the dynamic list		 * also when the result is FALSE, which occurs if the		 * dynamic entry itself contains the AVA attribute  */		/* FIXME: this approach is less than optimal; a dedicated		 * compare op should be implemented, that fetches the		 * entry, checks if it has the appropriate objectClass		 * and, in case, runs a compare thru all the URIs,		 * stopping at the first positive occurrence; see ITS#3756 */		case LDAP_COMPARE_FALSE:		case LDAP_NO_SUCH_ATTRIBUTE:			return dynlist_compare( op, rs );		}		break;	default:		break;	}	return SLAP_CB_CONTINUE;}static intdynlist_build_def_filter( dynlist_info_t *dli ){	char	*ptr;	dli->dli_default_filter.bv_len = STRLENOF( "(!(objectClass=" "))" )		+ dli->dli_oc->soc_cname.bv_len;	dli->dli_default_filter.bv_val = ch_malloc( dli->dli_default_filter.bv_len + 1 );	if ( dli->dli_default_filter.bv_val == NULL ) {		Debug( LDAP_DEBUG_ANY, "dynlist_db_open: malloc failed.\n",			0, 0, 0 );		return -1;	}	ptr = lutil_strcopy( dli->dli_default_filter.bv_val, "(!(objectClass=" );	ptr = lutil_strcopy( ptr, dli->dli_oc->soc_cname.bv_val );	ptr = lutil_strcopy( ptr, "))" );	assert( dli->dli_default_filter.bv_len == ptr - dli->dli_default_filter.bv_val );	return 0;}#ifdef OL_2_2_COMPATstatic intdynlist_db_config(	BackendDB	*be,	const char	*fname,	int		lineno,	int		argc,	char		**argv ){	slap_overinst	*on = (slap_overinst *)be->bd_info;	int		rc = 0;	if ( strcasecmp( argv[0], "dynlist-attrset" ) == 0 ) {		dynlist_info_t		**dlip;		ObjectClass		*oc;		AttributeDescription	*ad = NULL,					*member_ad = NULL;		const char		*text;		if ( argc < 3 || argc > 4 ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "				"invalid arg number #%d.\n",				fname, lineno, argc );			return 1;		}		oc = oc_find( argv[1] );		if ( oc == NULL ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "				"unable to find ObjectClass \"%s\"\n",				fname, lineno, argv[ 1 ] );			return 1;		}		rc = slap_str2ad( argv[2], &ad, &text );		if ( rc != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "				"unable to find AttributeDescription \"%s\"\n",				fname, lineno, argv[2] );			return 1;		}		if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "				"AttributeDescription \"%s\" "				"must be a subtype of \"labeledURI\"\n",				fname, lineno, argv[2] );			return 1;		}		if ( argc == 4 ) {			rc = slap_str2ad( argv[3], &member_ad, &text );			if ( rc != LDAP_SUCCESS ) {				Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "					"unable to find AttributeDescription \"%s\"\n",					fname, lineno, argv[3] );				return 1;			}		}		for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;			*dlip; dlip = &(*dlip)->dli_next )		{			/* The check on objectClass may be relaxed */#if 0			if ( (*dlip)->dli_oc == oc ) {				Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "					"objectClass \"%s\" already mapped.\n",					fname, lineno, oc->soc_cname.bv_val );				return 1;			}#endif			if ( (*dlip)->dli_ad == ad ) {				Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "					"URL attributeDescription \"%s\" already mapped.\n",					fname, lineno, ad->ad_cname.bv_val );				return 1;			}			if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) {				Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"\"dynlist-attrset <oc> <URL-ad> [<member-ad>]\": "					"member attributeDescription \"%s\" already mapped.\n",					fname, lineno, member_ad->ad_cname.bv_val );				return 1;			}		}		*dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) );		(*dlip)->dli_oc = oc;		(*dlip)->dli_ad = ad;		(*dlip)->dli_member_ad = member_ad;		if ( dynlist_build_def_filter( *dlip ) ) {			ch_free( *dlip );			*dlip = NULL;			return 1;		}	/* allow dyngroup syntax */	} else if ( strcasecmp( argv[0], "dynlist-attrpair" ) == 0 ) {		dynlist_info_t		**dlip;		ObjectClass		*oc;		AttributeDescription	*ad = NULL,					*member_ad = NULL;		const char		*text;		if ( argc != 3 ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrpair <member-ad> <URL-ad>\": "				"invalid arg number #%d.\n",				fname, lineno, argc );			return 1;		}		oc = oc_find( "groupOfURLs" );		if ( oc == NULL ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrpair <member-ad> <URL-ad>\": "				"unable to find default ObjectClass \"groupOfURLs\"\n",				fname, lineno, 0 );			return 1;		}		rc = slap_str2ad( argv[1], &member_ad, &text );		if ( rc != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrpair <member-ad> <URL-ad>\": "				"unable to find AttributeDescription \"%s\"\n",				fname, lineno, argv[1] );			return 1;		}		rc = slap_str2ad( argv[2], &ad, &text );		if ( rc != LDAP_SUCCESS ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrpair <member-ad> <URL-ad>\": "				"unable to find AttributeDescription \"%s\"\n",				fname, lineno, argv[2] );			return 1;		}		if ( !is_at_subtype( ad->ad_type, slap_schema.si_ad_labeledURI->ad_type ) ) {			Debug( LDAP_DEBUG_ANY, "%s: line %d: "				"\"dynlist-attrpair <member-ad> <URL-ad>\": "				"AttributeDescription \"%s\" "				"must be a subtype of \"labeledURI\"\n",				fname, lineno, argv[2] );			return 1;		}		for ( dlip = (dynlist_info_t **)&on->on_bi.bi_private;			*dlip; dlip = &(*dlip)->dli_next )		{#if 0			/* The check on objectClass may be relaxed */			if ( (*dlip)->dli_oc == oc ) {				Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"\"dynlist-attrpair <member-ad> <URL-ad>\": "					"objectClass \"%s\" already mapped.\n",					fname, lineno, oc->soc_cname.bv_val );				return 1;			}#endif			if ( (*dlip)->dli_ad == ad ) {				Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"\"dynlist-attrpair <member-ad> <URL-ad>\": "					"URL attributeDescription \"%s\" already mapped.\n",					fname, lineno, ad->ad_cname.bv_val );				return 1;			}			if ( member_ad != NULL && (*dlip)->dli_member_ad == member_ad ) {				Debug( LDAP_DEBUG_ANY, "%s: line %d: "					"\"dynlist-attrpair <member-ad> <URL-ad>\": "					"member attributeDescription \"%s\" already mapped.\n",					fname, lineno, member_ad->ad_cname.bv_val );				return 1;			}		}		*dlip = (dynlist_info_t *)ch_calloc( 1, sizeof( dynlist_info_t ) );		(*dlip)->dli_oc = oc;		(*dlip)->dli_ad = ad;		(*dlip)->dli_member_ad = member_ad;		if ( dynlist_build_def_filter( *dlip ) ) {			ch_free( *dlip );			*dlip = NULL;			return 1;		}	} else {		rc = SLAP_CONF_UNKNOWN;	}	return rc;}#elseenum {	DL_ATTRSET = 1,	DL_ATTRPAIR,	DL_ATTRPAIR_COMPAT,	DL_LAST};static ConfigDriver	dl_cfgen;static ConfigTable dlcfg[] = {	{ "dynlist-attrset", "group-oc> <URL-ad> <member-ad",		3, 4, 0, ARG_MAGIC|DL_ATTRSET, dl_cfgen,		"( OLcfgOvAt:8.1 NAME 'olcDLattrSet' "			"DESC 'Dynamic list: <group objectClass>, <URL attributeDescription>, <member attributeDescription>' "			"EQUALITY caseIgnoreMatch "			"SYNTAX OMsDirectoryString "			"X-ORDERED 'VALUES' )",			NULL, NULL },	{ "dynlist-attrpair", "member-ad> <URL-ad",		3, 3, 0, ARG_MAGIC|DL_ATTRPAIR, dl_cfgen,			NULL, NULL, NULL },#ifdef TAKEOVER_DYNGROUP	{ "attrpair", "member-ad> <URL-ad",		3, 3, 0, ARG_MAGIC|DL_ATTRPAIR_COMPAT, dl_cfgen,			NULL, NULL, NULL },#endif	{ NULL, NULL, 0, 0, 0, ARG_IGNORED }};static ConfigOCs dlocs[] = {	{ "( OLcfgOvOc:8.1 "		"NAME 'olcDynamicList' "

⌨️ 快捷键说明

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