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

📄 rwmmap.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* rwmmap.c - rewrite/mapping routines *//* $OpenLDAP: pkg/ldap/servers/slapd/overlays/rwmmap.c,v 1.14.2.13 2007/01/05 09:47:11 ando Exp $ *//* This work is part of OpenLDAP Software <http://www.openldap.org/>. * * Copyright 1999-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"#ifdef SLAPD_OVER_RWM#include <stdio.h>#include <ac/string.h>#include <ac/socket.h>#include "slap.h"#include "rwm.h"#undef ldap_debug	/* silence a warning in ldap-int.h */#include "../../../libraries/libldap/ldap-int.h"intrwm_mapping_cmp( const void *c1, const void *c2 ){	struct ldapmapping *map1 = (struct ldapmapping *)c1;	struct ldapmapping *map2 = (struct ldapmapping *)c2;	int rc = map1->m_src.bv_len - map2->m_src.bv_len;		if ( rc ) {		return rc;	}	return strcasecmp( map1->m_src.bv_val, map2->m_src.bv_val );}intrwm_mapping_dup( void *c1, void *c2 ){	struct ldapmapping *map1 = (struct ldapmapping *)c1;	struct ldapmapping *map2 = (struct ldapmapping *)c2;	int rc = map1->m_src.bv_len - map2->m_src.bv_len;	if ( rc ) {		return 0;	}	return ( ( strcasecmp( map1->m_src.bv_val, map2->m_src.bv_val ) == 0 ) ? -1 : 0 );}intrwm_map_init( struct ldapmap *lm, struct ldapmapping **m ){	struct ldapmapping	*mapping;	const char		*text;	int			rc;	assert( m != NULL );	*m = NULL;		mapping = (struct ldapmapping *)ch_calloc( 2, 			sizeof( struct ldapmapping ) );	if ( mapping == NULL ) {		return LDAP_NO_MEMORY;	}	/* FIXME: I don't think this is needed any more... */	rc = slap_str2ad( "objectClass", &mapping[0].m_src_ad, &text );	if ( rc != LDAP_SUCCESS ) {		ch_free( mapping );		return rc;	}	mapping[0].m_dst_ad = mapping[0].m_src_ad;	ber_dupbv( &mapping[0].m_src, &mapping[0].m_src_ad->ad_cname );	ber_dupbv( &mapping[0].m_dst, &mapping[0].m_src );	mapping[1].m_src = mapping[0].m_src;	mapping[1].m_dst = mapping[0].m_dst;	mapping[1].m_src_ad = mapping[0].m_src_ad;	mapping[1].m_dst_ad = mapping[1].m_src_ad;	avl_insert( &lm->map, (caddr_t)&mapping[0], 			rwm_mapping_cmp, rwm_mapping_dup );	avl_insert( &lm->remap, (caddr_t)&mapping[1], 			rwm_mapping_cmp, rwm_mapping_dup );	*m = mapping;	return rc;}intrwm_mapping( struct ldapmap *map, struct berval *s, struct ldapmapping **m, int remap ){	Avlnode *tree;	struct ldapmapping fmapping;	if ( map == NULL ) {		return 0;	}	assert( m != NULL );	if ( remap == RWM_REMAP ) {		tree = map->remap;	} else {		tree = map->map;	}	fmapping.m_src = *s;	*m = (struct ldapmapping *)avl_find( tree, (caddr_t)&fmapping,			rwm_mapping_cmp );	if ( *m == NULL ) {		return map->drop_missing;	}	return 0;}voidrwm_map( struct ldapmap *map, struct berval *s, struct berval *bv, int remap ){	struct ldapmapping *mapping;	/* map->map may be NULL when mapping is configured,	 * but map->remap can't */	if ( map->remap == NULL ) {		*bv = *s;		return;	}	BER_BVZERO( bv );	( void )rwm_mapping( map, s, &mapping, remap );	if ( mapping != NULL ) {		if ( !BER_BVISNULL( &mapping->m_dst ) ) {			*bv = mapping->m_dst;		}		return;	}	if ( !map->drop_missing ) {		*bv = *s;	}}/* * Map attribute names in place */intrwm_map_attrnames(		struct ldapmap *at_map,		struct ldapmap *oc_map,		AttributeName *an,		AttributeName **anp,		int remap){	int		i, j;	assert( anp != NULL );	*anp = NULL;	if ( an == NULL ) {		return LDAP_SUCCESS;	}	for ( i = 0; !BER_BVISNULL( &an[i].an_name ); i++ )		/* just count */ ;	*anp = ch_malloc( ( i + 1 )* sizeof( AttributeName ) );	if ( *anp == NULL ) {		return LDAP_NO_MEMORY;	}	for ( i = 0, j = 0; !BER_BVISNULL( &an[i].an_name ); i++ ) {		struct ldapmapping	*m;		int			at_drop_missing = 0,					oc_drop_missing = 0;		if ( an[i].an_desc ) {			if ( !at_map ) {				/* FIXME: better leave as is? */				continue;			}							at_drop_missing = rwm_mapping( at_map, &an[i].an_name, &m, remap );			if ( at_drop_missing || ( m && BER_BVISNULL( &m->m_dst ) ) ) {				continue;			}			if ( !m ) {				(*anp)[j] = an[i];				j++;				continue;			}			(*anp)[j] = an[i];			if ( remap == RWM_MAP ) {				(*anp)[j].an_name = m->m_dst;				(*anp)[j].an_desc = m->m_dst_ad;			} else {				(*anp)[j].an_name = m->m_src;				(*anp)[j].an_desc = m->m_src_ad;			}			j++;			continue;		} else if ( an[i].an_oc ) {			if ( !oc_map ) {				/* FIXME: better leave as is? */				continue;			}			oc_drop_missing = rwm_mapping( oc_map, &an[i].an_name, &m, remap );			if ( oc_drop_missing || ( m && BER_BVISNULL( &m->m_dst ) ) ) {				continue;			}			if ( !m ) {				(*anp)[j] = an[i];				j++;				continue;			}			(*anp)[j] = an[i];			if ( remap == RWM_MAP ) {				(*anp)[j].an_name = m->m_dst;				(*anp)[j].an_oc = m->m_dst_oc;			} else {				(*anp)[j].an_name = m->m_src;				(*anp)[j].an_oc = m->m_src_oc;			}		} else {			at_drop_missing = rwm_mapping( at_map, &an[i].an_name, &m, remap );					if ( at_drop_missing || !m ) {				oc_drop_missing = rwm_mapping( oc_map, &an[i].an_name, &m, remap );				/* if both at_map and oc_map required to drop missing,				 * then do it */				if ( oc_drop_missing && at_drop_missing ) {					continue;				}				/* if no oc_map mapping was found and at_map required				 * to drop missing, then do it; otherwise, at_map wins				 * and an is considered an attr and is left unchanged */				if ( !m ) {					if ( at_drop_missing ) {						continue;					}					(*anp)[j] = an[i];					j++;					continue;				}					if ( BER_BVISNULL( &m->m_dst ) ) {					continue;				}				(*anp)[j] = an[i];				if ( remap == RWM_MAP ) {					(*anp)[j].an_name = m->m_dst;					(*anp)[j].an_oc = m->m_dst_oc;				} else {					(*anp)[j].an_name = m->m_src;					(*anp)[j].an_oc = m->m_src_oc;				}				j++;				continue;			}			if ( !BER_BVISNULL( &m->m_dst ) ) {				(*anp)[j] = an[i];				if ( remap == RWM_MAP ) {					(*anp)[j].an_name = m->m_dst;					(*anp)[j].an_desc = m->m_dst_ad;				} else {					(*anp)[j].an_name = m->m_src;					(*anp)[j].an_desc = m->m_src_ad;				}				j++;				continue;			}		}	}	if ( j == 0 && i != 0 ) {		memset( &(*anp)[0], 0, sizeof( AttributeName ) );		BER_BVSTR( &(*anp)[0].an_name, LDAP_NO_ATTRS );	}	memset( &(*anp)[j], 0, sizeof( AttributeName ) );	return LDAP_SUCCESS;}intrwm_map_attrs(		struct ldapmap *at_map,		AttributeName *an,		int remap,		char ***mapped_attrs){	int i, j;	char **na;	if ( an == NULL ) {		*mapped_attrs = NULL;		return LDAP_SUCCESS;	}	for ( i = 0; !BER_BVISNULL( &an[ i ].an_name ); i++ ) {		/*  */	}	na = (char **)ch_calloc( i + 1, sizeof( char * ) );	if ( na == NULL ) {		*mapped_attrs = NULL;		return LDAP_NO_MEMORY;	}	for ( i = j = 0; !BER_BVISNULL( &an[i].an_name ); i++ ) {		struct ldapmapping	*mapping;				if ( rwm_mapping( at_map, &an[i].an_name, &mapping, remap ) ) {			continue;		}		if ( !mapping ) {			na[ j++ ] = an[ i ].an_name.bv_val;					} else if ( !BER_BVISNULL( &mapping->m_dst ) ) {			na[ j++ ] = mapping->m_dst.bv_val;		}	}	if ( j == 0 && i != 0 ) {		na[ j++ ] = LDAP_NO_ATTRS;	}	na[ j ] = NULL;	*mapped_attrs = na;	return LDAP_SUCCESS;}static intmap_attr_value(		dncookie		*dc,		AttributeDescription 	**adp,		struct berval		*mapped_attr,		struct berval		*value,		struct berval		*mapped_value,		int			remap ){	struct berval		vtmp = BER_BVNULL;	int			freeval = 0;	AttributeDescription	*ad = *adp;	struct ldapmapping	*mapping = NULL;	rwm_mapping( &dc->rwmap->rwm_at, &ad->ad_cname, &mapping, remap );	if ( mapping == NULL ) {		if ( dc->rwmap->rwm_at.drop_missing ) {			return -1;		}		*mapped_attr = ad->ad_cname;	} else {		*mapped_attr = mapping->m_dst;	}	if ( value != NULL ) {		assert( mapped_value != NULL );		if ( ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName				|| ( mapping != NULL && mapping->m_dst_ad->ad_type->sat_syntax == slap_schema.si_syn_distinguishedName ) )		{			dncookie 	fdc = *dc;			int		rc;#ifdef ENABLE_REWRITE			fdc.ctx = "searchFilterAttrDN";#endif /* ENABLE_REWRITE */			vtmp = *value;			rc = rwm_dn_massage_normalize( &fdc, value, &vtmp );			switch ( rc ) {			case LDAP_SUCCESS:				if ( vtmp.bv_val != value->bv_val ) {					freeval = 1;				}				break;					case LDAP_UNWILLING_TO_PERFORM:			case LDAP_OTHER:			default:				return -1;			}		} else if ( ad == slap_schema.si_ad_objectClass				|| ad == slap_schema.si_ad_structuralObjectClass )		{			rwm_map( &dc->rwmap->rwm_oc, value, &vtmp, remap );			if ( BER_BVISNULL( &vtmp ) || BER_BVISEMPTY( &vtmp ) ) {				vtmp = *value;			}				} else {			vtmp = *value;		}		filter_escape_value( &vtmp, mapped_value );		if ( freeval ) {			ch_free( vtmp.bv_val );		}	}		if ( mapping != NULL ) {		assert( mapping->m_dst_ad != NULL );		*adp = mapping->m_dst_ad;	}	return 0;}static intrwm_int_filter_map_rewrite(		Operation		*op,		dncookie		*dc,		Filter			*f,		struct berval		*fstr ){	int		i;	Filter		*p;	AttributeDescription *ad;	struct berval	atmp,			vtmp,			*tmp;	static struct berval			/* better than nothing... */			ber_bvfalse = BER_BVC( "(!(objectClass=*))" ),			ber_bvtf_false = BER_BVC( "(|)" ),			/* better than nothing... */			ber_bvtrue = BER_BVC( "(objectClass=*)" ),			ber_bvtf_true = BER_BVC( "(&)" ),#if 0			/* no longer needed; preserved for completeness */			ber_bvundefined = BER_BVC( "(?=undefined)" ),#endif			ber_bverror = BER_BVC( "(?=error)" ),			ber_bvunknown = BER_BVC( "(?=unknown)" ),			ber_bvnone = BER_BVC( "(?=none)" );	ber_len_t	len;	if ( f == NULL ) {		ber_dupbv( fstr, &ber_bvnone );		return LDAP_OTHER;	}	switch ( f->f_choice ) {	case LDAP_FILTER_EQUALITY:		ad = f->f_av_desc;		if ( map_attr_value( dc, &ad, &atmp,					&f->f_av_value, &vtmp, RWM_MAP ) )		{			goto computed;		}		fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(=)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 1 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=%s)",			atmp.bv_val, vtmp.bv_val );		ch_free( vtmp.bv_val );		break;	case LDAP_FILTER_GE:		ad = f->f_av_desc;		if ( map_attr_value( dc, &ad, &atmp,					&f->f_av_value, &vtmp, RWM_MAP ) )		{			goto computed;		}		fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(>=)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 1 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s>=%s)",			atmp.bv_val, vtmp.bv_val );		ch_free( vtmp.bv_val );		break;	case LDAP_FILTER_LE:		ad = f->f_av_desc;		if ( map_attr_value( dc, &ad, &atmp,					&f->f_av_value, &vtmp, RWM_MAP ) )		{			goto computed;		}		fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(<=)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 1 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s<=%s)",			atmp.bv_val, vtmp.bv_val );		ch_free( vtmp.bv_val );		break;	case LDAP_FILTER_APPROX:		ad = f->f_av_desc;		if ( map_attr_value( dc, &ad, &atmp,					&f->f_av_value, &vtmp, RWM_MAP ) )		{			goto computed;		}		fstr->bv_len = atmp.bv_len + vtmp.bv_len + STRLENOF( "(~=)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 1 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s~=%s)",			atmp.bv_val, vtmp.bv_val );		ch_free( vtmp.bv_val );		break;	case LDAP_FILTER_SUBSTRINGS:		ad = f->f_sub_desc;		if ( map_attr_value( dc, &ad, &atmp,					NULL, NULL, RWM_MAP ) )		{			goto computed;		}		/* cannot be a DN ... */		fstr->bv_len = atmp.bv_len + STRLENOF( "(=*)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 128 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=*)",			atmp.bv_val );		if ( !BER_BVISNULL( &f->f_sub_initial ) ) {			len = fstr->bv_len;			filter_escape_value( &f->f_sub_initial, &vtmp );			fstr->bv_len += vtmp.bv_len;			fstr->bv_val = ch_realloc( fstr->bv_val, fstr->bv_len + 1 );			snprintf( &fstr->bv_val[len - 2], vtmp.bv_len + 3,				/* "(attr=" */ "%s*)",				vtmp.bv_val );			ch_free( vtmp.bv_val );		}		if ( f->f_sub_any != NULL ) {			for ( i = 0; !BER_BVISNULL( &f->f_sub_any[i] ); i++ ) {				len = fstr->bv_len;				filter_escape_value( &f->f_sub_any[i], &vtmp );				fstr->bv_len += vtmp.bv_len + 1;				fstr->bv_val = ch_realloc( fstr->bv_val, fstr->bv_len + 1 );				snprintf( &fstr->bv_val[len - 1], vtmp.bv_len + 3,					/* "(attr=[init]*[any*]" */ "%s*)",					vtmp.bv_val );				ch_free( vtmp.bv_val );			}		}		if ( !BER_BVISNULL( &f->f_sub_final ) ) {			len = fstr->bv_len;			filter_escape_value( &f->f_sub_final, &vtmp );			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 + 3,				/* "(attr=[init*][any*]" */ "%s)",				vtmp.bv_val );			ch_free( vtmp.bv_val );		}		break;	case LDAP_FILTER_PRESENT:		ad = f->f_desc;		if ( map_attr_value( dc, &ad, &atmp,					NULL, NULL, RWM_MAP ) )		{			goto computed;		}		fstr->bv_len = atmp.bv_len + STRLENOF( "(=*)" );		fstr->bv_val = ch_malloc( fstr->bv_len + 1 );		snprintf( fstr->bv_val, fstr->bv_len + 1, "(%s=*)",			atmp.bv_val );		break;	case LDAP_FILTER_AND:	case LDAP_FILTER_OR:	case LDAP_FILTER_NOT:

⌨️ 快捷键说明

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