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

📄 rwmmap.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		fstr->bv_len = STRLENOF( "(%)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 128 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%c)",			f->f_choice == LDAP_FILTER_AND ? '&' :			f->f_choice == LDAP_FILTER_OR ? '|' : '!' );		for ( p = f->f_list; p != NULL; p = p->f_next ) {			int	rc;			len = fstr->bv_len;			rc = rwm_int_filter_map_rewrite( op, dc, p, &vtmp );			if ( rc != LDAP_SUCCESS ) {				return rc;			}						fstr->bv_len += vtmp.bv_len;			fstr->bv_val = ch_realloc( fstr->bv_val, fstr->bv_len + 1 );			snprintf( &fstr->bv_val[len-1], vtmp.bv_len + 2, 				/*"("*/ "%s)", vtmp.bv_val );			ch_free( vtmp.bv_val );		}		break;	case LDAP_FILTER_EXT: {		if ( f->f_mr_desc ) {			ad = f->f_mr_desc;			if ( map_attr_value( dc, &ad, &atmp,						&f->f_mr_value, &vtmp, RWM_MAP ) )			{				goto computed;			}		} else {			BER_BVSTR( &atmp, "" );			filter_escape_value( &f->f_mr_value, &vtmp );		}					fstr->bv_len = atmp.bv_len +			( f->f_mr_dnattrs ? STRLENOF( ":dn" ) : 0 ) +			( f->f_mr_rule_text.bv_len ? f->f_mr_rule_text.bv_len + 1 : 0 ) +			vtmp.bv_len + STRLENOF( "(:=)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 1 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s%s%s%s:=%s)",			atmp.bv_val,			f->f_mr_dnattrs ? ":dn" : "",			!BER_BVISEMPTY( &f->f_mr_rule_text ) ? ":" : "",			!BER_BVISEMPTY( &f->f_mr_rule_text ) ? f->f_mr_rule_text.bv_val : "",			vtmp.bv_val );		ch_free( vtmp.bv_val );		break;	}	case 0:computed:;		filter_free_x( op, f );		f->f_choice = SLAPD_FILTER_COMPUTED;		f->f_result = SLAPD_COMPARE_UNDEFINED;		/* fallthru */	case SLAPD_FILTER_COMPUTED:		switch ( f->f_result ) {		case LDAP_COMPARE_FALSE:		/* FIXME: treat UNDEFINED as FALSE */		case SLAPD_COMPARE_UNDEFINED:			if ( dc->rwmap->rwm_flags & RWM_F_SUPPORT_T_F ) {				tmp = &ber_bvtf_false;				break;			}			tmp = &ber_bvfalse;			break;		case LDAP_COMPARE_TRUE:			if ( dc->rwmap->rwm_flags & RWM_F_SUPPORT_T_F ) {				tmp = &ber_bvtf_true;				break;			}			tmp = &ber_bvtrue;			break;					default:			tmp = &ber_bverror;			break;		}		ber_dupbv( fstr, tmp );		break;			default:		ber_dupbv( fstr, &ber_bvunknown );		break;	}	return LDAP_SUCCESS;}intrwm_filter_map_rewrite(		Operation		*op,		dncookie		*dc,		Filter			*f,		struct berval		*fstr ){	int		rc;	dncookie 	fdc;	struct berval	ftmp;	rc = rwm_int_filter_map_rewrite( op, dc, f, fstr );#ifdef ENABLE_REWRITE	if ( rc != 0 ) {		return rc;	}	fdc = *dc;	ftmp = *fstr;	fdc.ctx = "searchFilter";	switch ( rewrite_session( fdc.rwmap->rwm_rw, fdc.ctx, 				( !BER_BVISEMPTY( &ftmp ) ? ftmp.bv_val : "" ), 				fdc.conn, &fstr->bv_val ) )	{	case REWRITE_REGEXEC_OK:		if ( !BER_BVISNULL( fstr ) ) {			fstr->bv_len = strlen( fstr->bv_val );			ch_free( ftmp.bv_val );		} else {			*fstr = ftmp;		}		Debug( LDAP_DEBUG_ARGS,			"[rw] %s: \"%s\" -> \"%s\"\n",			fdc.ctx, ftmp.bv_val, fstr->bv_val );				rc = LDAP_SUCCESS;		break; 		 	case REWRITE_REGEXEC_UNWILLING:		if ( fdc.rs ) {			fdc.rs->sr_err = LDAP_UNWILLING_TO_PERFORM;			fdc.rs->sr_text = "Operation not allowed";		}		rc = LDAP_UNWILLING_TO_PERFORM;		break;	       		case REWRITE_REGEXEC_ERR:		if ( fdc.rs ) {			fdc.rs->sr_err = LDAP_OTHER;			fdc.rs->sr_text = "Rewrite error";		}		rc = LDAP_OTHER;		break;	}#endif /* ENABLE_REWRITE */	return rc;}/* * I don't like this much, but we need two different * functions because different heap managers may be * in use in back-ldap/meta to reduce the amount of * calls to malloc routines, and some of the free() * routines may be macros with args */intrwm_referral_rewrite(	Operation		*op,	SlapReply		*rs,	void			*cookie,	BerVarray		a_vals,	BerVarray		*pa_nvals ){	slap_overinst		*on = (slap_overinst *) op->o_bd->bd_info;	struct ldaprwmap	*rwmap = 			(struct ldaprwmap *)on->on_bi.bi_private;	int			i, last;	dncookie		dc;	struct berval		dn = BER_BVNULL,				ndn = BER_BVNULL;	assert( a_vals != NULL );	/*	 * Rewrite the dn if needed	 */	dc.rwmap = rwmap;#ifdef ENABLE_REWRITE	dc.conn = op->o_conn;	dc.rs = rs;	dc.ctx = (char *)cookie;#else /* ! ENABLE_REWRITE */	dc.tofrom = ((int *)cookie)[0];	dc.normalized = 0;#endif /* ! ENABLE_REWRITE */	for ( last = 0; !BER_BVISNULL( &a_vals[last] ); last++ )		;	last--;		if ( pa_nvals != NULL ) {		if ( *pa_nvals == NULL ) {			*pa_nvals = ch_malloc( ( last + 2 ) * sizeof(struct berval) );			memset( *pa_nvals, 0, ( last + 2 ) * sizeof(struct berval) );		}	}	for ( i = 0; !BER_BVISNULL( &a_vals[i] ); i++ ) {		struct berval	olddn = BER_BVNULL,				oldval;		int		rc;		LDAPURLDesc	*ludp;		oldval = a_vals[i];		rc = ldap_url_parse( oldval.bv_val, &ludp );		if ( rc != LDAP_URL_SUCCESS ) {			/* leave attr untouched if massage failed */			if ( pa_nvals && BER_BVISNULL( &(*pa_nvals)[i] ) ) {				ber_dupbv( &(*pa_nvals)[i], &oldval );			}			continue;		}		/* FIXME: URLs like "ldap:///dc=suffix" if passed		 * thru ldap_url_parse() and ldap_url_desc2str() 		 * get rewritten as "ldap:///dc=suffix??base";		 * we don't want this to occur... */		if ( ludp->lud_scope == LDAP_SCOPE_BASE ) {			ludp->lud_scope = LDAP_SCOPE_DEFAULT;		}		ber_str2bv( ludp->lud_dn, 0, 0, &olddn );		dn = olddn;		if ( pa_nvals ) {			ndn = olddn;			rc = rwm_dn_massage_pretty_normalize( &dc, &olddn,					&dn, &ndn );		} else {			rc = rwm_dn_massage_pretty( &dc, &olddn, &dn );		}		switch ( rc ) {		case LDAP_UNWILLING_TO_PERFORM:			/*			 * FIXME: need to check if it may be considered 			 * legal to trim values when adding/modifying;			 * it should be when searching (e.g. ACLs).			 */			ch_free( a_vals[i].bv_val );			if (last > i ) {				a_vals[i] = a_vals[last];				if ( pa_nvals ) {					(*pa_nvals)[i] = (*pa_nvals)[last];				}			}			BER_BVZERO( &a_vals[last] );			if ( pa_nvals ) {				BER_BVZERO( &(*pa_nvals)[last] );			}			last--;			break;				case LDAP_SUCCESS:			if ( !BER_BVISNULL( &dn ) && dn.bv_val != olddn.bv_val ) {				char	*newurl;				ludp->lud_dn = dn.bv_val;				newurl = ldap_url_desc2str( ludp );				ludp->lud_dn = olddn.bv_val;				ch_free( dn.bv_val );				if ( newurl == NULL ) {					/* FIXME: leave attr untouched					 * even if ldap_url_desc2str failed...					 */					break;				}				ber_str2bv( newurl, 0, 1, &a_vals[i] );				LDAP_FREE( newurl );				if ( pa_nvals ) {					ludp->lud_dn = ndn.bv_val;					newurl = ldap_url_desc2str( ludp );					ludp->lud_dn = olddn.bv_val;					ch_free( ndn.bv_val );					if ( newurl == NULL ) {						/* FIXME: leave attr untouched						 * even if ldap_url_desc2str failed...						 */						ch_free( a_vals[i].bv_val );						a_vals[i] = oldval;						break;					}					if ( !BER_BVISNULL( &(*pa_nvals)[i] ) ) {						ch_free( (*pa_nvals)[i].bv_val );					}					ber_str2bv( newurl, 0, 1, &(*pa_nvals)[i] );					LDAP_FREE( newurl );				}				ch_free( oldval.bv_val );				ludp->lud_dn = olddn.bv_val;			}			break;		default:			/* leave attr untouched if massage failed */			if ( pa_nvals && BER_BVISNULL( &(*pa_nvals)[i] ) ) {				ber_dupbv( &(*pa_nvals)[i], &a_vals[i] );			}			break;		}		ldap_free_urldesc( ludp );	}		return 0;}/* * I don't like this much, but we need two different * functions because different heap managers may be * in use in back-ldap/meta to reduce the amount of * calls to malloc routines, and some of the free() * routines may be macros with args */intrwm_dnattr_rewrite(	Operation		*op,	SlapReply		*rs,	void			*cookie,	BerVarray		a_vals,	BerVarray		*pa_nvals ){	slap_overinst		*on = (slap_overinst *) op->o_bd->bd_info;	struct ldaprwmap	*rwmap = 			(struct ldaprwmap *)on->on_bi.bi_private;	int			i, last;	dncookie		dc;	struct berval		dn = BER_BVNULL,				ndn = BER_BVNULL;	BerVarray		in;	if ( a_vals ) {		in = a_vals;	} else {		if ( pa_nvals == NULL || *pa_nvals == NULL ) {			return LDAP_OTHER;		}		in = *pa_nvals;	}	/*	 * Rewrite the dn if needed	 */	dc.rwmap = rwmap;#ifdef ENABLE_REWRITE	dc.conn = op->o_conn;	dc.rs = rs;	dc.ctx = (char *)cookie;#else /* ! ENABLE_REWRITE */	dc.tofrom = ((int *)cookie)[0];	dc.normalized = 0;#endif /* ! ENABLE_REWRITE */	for ( last = 0; !BER_BVISNULL( &in[last] ); last++ );	last--;	if ( pa_nvals != NULL ) {		if ( *pa_nvals == NULL ) {			*pa_nvals = ch_malloc( ( last + 2 ) * sizeof(struct berval) );			memset( *pa_nvals, 0, ( last + 2 ) * sizeof(struct berval) );		}	}	for ( i = 0; !BER_BVISNULL( &in[i] ); i++ ) {		int		rc;		if ( a_vals ) {			dn = in[i];			if ( pa_nvals ) {				ndn = (*pa_nvals)[i];				rc = rwm_dn_massage_pretty_normalize( &dc, &in[i], &dn, &ndn );			} else {				rc = rwm_dn_massage_pretty( &dc, &in[i], &dn );			}		} else {			ndn = in[i];			rc = rwm_dn_massage_normalize( &dc, &in[i], &ndn );		}		switch ( rc ) {		case LDAP_UNWILLING_TO_PERFORM:			/*			 * FIXME: need to check if it may be considered 			 * legal to trim values when adding/modifying;			 * it should be when searching (e.g. ACLs).			 */			ch_free( in[i].bv_val );			if (last > i ) {				in[i] = in[last];				if ( a_vals && pa_nvals ) {					(*pa_nvals)[i] = (*pa_nvals)[last];				}			}			BER_BVZERO( &in[last] );			if ( a_vals && pa_nvals ) {				BER_BVZERO( &(*pa_nvals)[last] );			}			last--;			break;				case LDAP_SUCCESS:			if ( a_vals ) {				if ( !BER_BVISNULL( &dn ) && dn.bv_val != a_vals[i].bv_val ) {					ch_free( a_vals[i].bv_val );					a_vals[i] = dn;					if ( pa_nvals ) {						if ( !BER_BVISNULL( &(*pa_nvals)[i] ) ) {							ch_free( (*pa_nvals)[i].bv_val );						}						(*pa_nvals)[i] = ndn;					}				}							} else {				if ( !BER_BVISNULL( &ndn ) && ndn.bv_val != (*pa_nvals)[i].bv_val ) {					ch_free( (*pa_nvals)[i].bv_val );					(*pa_nvals)[i] = ndn;				}			}			break;		default:			/* leave attr untouched if massage failed */			if ( a_vals && pa_nvals && BER_BVISNULL( &(*pa_nvals)[i] ) ) {				dnNormalize( 0, NULL, NULL, &a_vals[i], &(*pa_nvals)[i], NULL );			}			break;		}	}		return 0;}intrwm_referral_result_rewrite(	dncookie		*dc,	BerVarray		a_vals){	int		i, last;	for ( last = 0; !BER_BVISNULL( &a_vals[last] ); last++ );	last--;	for ( i = 0; !BER_BVISNULL( &a_vals[i] ); i++ ) {		struct berval	dn,				olddn = BER_BVNULL;		int		rc;		LDAPURLDesc	*ludp;		rc = ldap_url_parse( a_vals[i].bv_val, &ludp );		if ( rc != LDAP_URL_SUCCESS ) {			/* leave attr untouched if massage failed */			continue;		}		/* FIXME: URLs like "ldap:///dc=suffix" if passed		 * thru ldap_url_parse() and ldap_url_desc2str()		 * get rewritten as "ldap:///dc=suffix??base";		 * we don't want this to occur... */		if ( ludp->lud_scope == LDAP_SCOPE_BASE ) {			ludp->lud_scope = LDAP_SCOPE_DEFAULT;		}		ber_str2bv( ludp->lud_dn, 0, 0, &olddn );		dn = olddn;		rc = rwm_dn_massage_pretty( dc, &olddn, &dn );		switch ( rc ) {		case LDAP_UNWILLING_TO_PERFORM:			/*			 * FIXME: need to check if it may be considered 			 * legal to trim values when adding/modifying;			 * it should be when searching (e.g. ACLs).			 */			ch_free( a_vals[i].bv_val );			if ( last > i ) {				a_vals[i] = a_vals[last];			}			BER_BVZERO( &a_vals[last] );			last--;			i--;			break;		default:			/* leave attr untouched if massage failed */			if ( !BER_BVISNULL( &dn ) && olddn.bv_val != dn.bv_val ) {				char	*newurl;				ludp->lud_dn = dn.bv_val;				newurl = ldap_url_desc2str( ludp );				if ( newurl == NULL ) {					/* FIXME: leave attr untouched					 * even if ldap_url_desc2str failed...					 */					break;				}				ch_free( a_vals[i].bv_val );				ber_str2bv( newurl, 0, 1, &a_vals[i] );				LDAP_FREE( newurl );				ludp->lud_dn = olddn.bv_val;			}			break;		}		ldap_free_urldesc( ludp );	}	return 0;}intrwm_dnattr_result_rewrite(	dncookie		*dc,	BerVarray		a_vals){	int		i, last;	for ( last = 0; !BER_BVISNULL( &a_vals[last] ); last++ );	last--;	for ( i = 0; !BER_BVISNULL( &a_vals[i] ); i++ ) {		struct berval	dn;		int		rc;				dn = a_vals[i];		rc = rwm_dn_massage_pretty( dc, &a_vals[i], &dn );		switch ( rc ) {		case LDAP_UNWILLING_TO_PERFORM:			/*			 * FIXME: need to check if it may be considered 			 * legal to trim values when adding/modifying;			 * it should be when searching (e.g. ACLs).			 */			ch_free( a_vals[i].bv_val );			if ( last > i ) {				a_vals[i] = a_vals[last];			}			BER_BVZERO( &a_vals[last] );			last--;			break;		default:			/* leave attr untouched if massage failed */			if ( !BER_BVISNULL( &dn ) && a_vals[i].bv_val != dn.bv_val ) {				ch_free( a_vals[i].bv_val );				a_vals[i] = dn;			}			break;		}	}	return 0;}voidrwm_mapping_dst_free( void *v_mapping ){	struct ldapmapping *mapping = v_mapping;	if ( BER_BVISEMPTY( &mapping[0].m_dst ) ) {		rwm_mapping_free( &mapping[ -1 ] );	}}voidrwm_mapping_free( void *v_mapping ){	struct ldapmapping *mapping = v_mapping;	if ( !BER_BVISNULL( &mapping[0].m_src ) ) {		ch_free( mapping[0].m_src.bv_val );	}	if ( mapping[0].m_flags & RWMMAP_F_FREE_SRC ) {		if ( mapping[0].m_flags & RWMMAP_F_IS_OC ) {			if ( mapping[0].m_src_oc ) {				ch_free( mapping[0].m_src_oc );			}		} else {			if ( mapping[0].m_src_ad ) {				ch_free( mapping[0].m_src_ad );			}		}	}	if ( !BER_BVISNULL( &mapping[0].m_dst ) ) {		ch_free( mapping[0].m_dst.bv_val );	}	if ( mapping[0].m_flags & RWMMAP_F_FREE_DST ) {		if ( mapping[0].m_flags & RWMMAP_F_IS_OC ) {			if ( mapping[0].m_dst_oc ) {				ch_free( mapping[0].m_dst_oc );			}		} else {			if ( mapping[0].m_dst_ad ) {				ch_free( mapping[0].m_dst_ad );			}		}	}	ch_free( mapping );}#endif /* SLAPD_OVER_RWM */

⌨️ 快捷键说明

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