X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-meta%2Fmap.c;h=87ca4b903175cdae6c7750b8098848d40bea291b;hb=52165180f7713b5fdebef933a9dca8842daa2e2a;hp=a607369b7edbd2c5db1ad829f2dcb95fb3285e91;hpb=521100db56d3cb4c44f1cbd24df91eabc5b2e8b3;p=openldap diff --git a/servers/slapd/back-meta/map.c b/servers/slapd/back-meta/map.c index a607369b7e..87ca4b9031 100644 --- a/servers/slapd/back-meta/map.c +++ b/servers/slapd/back-meta/map.c @@ -109,12 +109,14 @@ ldap_back_map_init ( struct ldapmap *lm, struct ldapmapping **m ) *m = mapping; } -void -ldap_back_map ( struct ldapmap *map, struct berval *s, struct berval *bv, +int +ldap_back_mapping ( struct ldapmap *map, struct berval *s, struct ldapmapping **m, int remap ) { Avlnode *tree; - struct ldapmapping *mapping, fmapping; + struct ldapmapping fmapping; + + assert( m ); if ( remap == BACKLDAP_REMAP ) { tree = map->remap; @@ -122,9 +124,23 @@ ldap_back_map ( struct ldapmap *map, struct berval *s, struct berval *bv, tree = map->map; } - BER_BVZERO( bv ); fmapping.src = *s; - mapping = (struct ldapmapping *)avl_find( tree, (caddr_t)&fmapping, mapping_cmp ); + *m = (struct ldapmapping *)avl_find( tree, (caddr_t)&fmapping, mapping_cmp ); + if ( *m == NULL ) { + return map->drop_missing; + } + + return 0; +} + +void +ldap_back_map ( struct ldapmap *map, struct berval *s, struct berval *bv, + int remap ) +{ + struct ldapmapping *mapping; + + BER_BVZERO( bv ); + ( void )ldap_back_mapping( map, s, &mapping, remap ); if ( mapping != NULL ) { if ( !BER_BVISNULL( &mapping->dst ) ) { *bv = mapping->dst; @@ -135,8 +151,6 @@ ldap_back_map ( struct ldapmap *map, struct berval *s, struct berval *bv, if ( !map->drop_missing ) { *bv = *s; } - - return; } int @@ -192,12 +206,12 @@ map_attr_value( struct berval vtmp; int freeval = 0; - ldap_back_map( &dc->rwmap->rwm_at, &ad->ad_cname, mapped_attr, remap ); + ldap_back_map( &dc->target->mt_rwmap.rwm_at, &ad->ad_cname, mapped_attr, remap ); if ( BER_BVISNULL( mapped_attr ) || BER_BVISEMPTY( mapped_attr ) ) { /* * FIXME: are we sure we need to search oc_map if at_map fails? */ - ldap_back_map( &dc->rwmap->rwm_oc, &ad->ad_cname, mapped_attr, remap ); + ldap_back_map( &dc->target->mt_rwmap.rwm_oc, &ad->ad_cname, mapped_attr, remap ); if ( BER_BVISNULL( mapped_attr ) || BER_BVISEMPTY( mapped_attr ) ) { *mapped_attr = ad->ad_cname; } @@ -230,7 +244,7 @@ map_attr_value( } } else if ( ad == slap_schema.si_ad_objectClass || ad == slap_schema.si_ad_structuralObjectClass ) { - ldap_back_map( &dc->rwmap->rwm_oc, value, &vtmp, remap ); + ldap_back_map( &dc->target->mt_rwmap.rwm_oc, value, &vtmp, remap ); if ( BER_BVISNULL( &vtmp ) || BER_BVISEMPTY( &vtmp ) ) { vtmp = *value; } @@ -262,7 +276,7 @@ ldap_back_int_filter_map_rewrite( ber_len_t len; if ( f == NULL ) { - ber_str2bv( "No filter!", sizeof("No filter!")-1, 1, fstr ); + ber_str2bv( "No filter!", STRLENOF( "No filter!" ), 1, fstr ); return -1; } @@ -440,7 +454,7 @@ ldap_back_int_filter_map_rewrite( break; - case LDAP_FILTER_EXT: { + case LDAP_FILTER_EXT: if ( f->f_mr_desc ) { if ( map_attr_value( dc, f->f_mr_desc, &atmp, &f->f_mr_value, &vtmp, remap ) ) @@ -467,24 +481,42 @@ ldap_back_int_filter_map_rewrite( !BER_BVISEMPTY( &f->f_mr_rule_text ) ? f->f_mr_rule_text.bv_val : "", vtmp.bv_val ); ber_memfree( vtmp.bv_val ); - } break; + break; + + case SLAPD_FILTER_COMPUTED: { + struct berval bv; - case SLAPD_FILTER_COMPUTED: switch ( f->f_result ) { case LDAP_COMPARE_FALSE: - ber_str2bv( "(?=false)", STRLENOF( "(?=false)" ), 1, fstr ); + if ( dc->target->mt_flags & LDAP_BACK_F_SUPPORT_T_F ) { + BER_BVSTR( &bv, "(|)" ); + break; + } + /* fallthru */ + + /* FIXME: treat UNDEFINED as FALSE */ + case SLAPD_COMPARE_UNDEFINED: + /* better than nothing... */ + BER_BVSTR( &bv, "(!(objectClass=*))" ); break; + case LDAP_COMPARE_TRUE: - ber_str2bv( "(?=true)", STRLENOF( "(?=true)" ), 1, fstr ); - break; - case SLAPD_COMPARE_UNDEFINED: - ber_str2bv( "(?=undefined)", STRLENOF( "(?=undefined)" ), 1, fstr ); + if ( dc->target->mt_flags & LDAP_BACK_F_SUPPORT_T_F ) { + BER_BVSTR( &bv, "(&)" ); + break; + } + + /* better than nothing... */ + BER_BVSTR( &bv, "(objectClass=*)" ); break; + default: - ber_str2bv( "(?=error)", STRLENOF( "(?=error)" ), 1, fstr ); + BER_BVSTR( &bv, "(?=error)" ); break; } - break; + + ber_dupbv( fstr, &bv ); + } break; default: ber_str2bv( "(?=unknown)", STRLENOF( "(?=unknown)" ), 1, fstr ); @@ -504,6 +536,7 @@ ldap_back_filter_map_rewrite( int rc; dncookie fdc; struct berval ftmp; + static char *dmy = ""; rc = ldap_back_int_filter_map_rewrite( dc, f, fstr, remap ); @@ -517,8 +550,8 @@ ldap_back_filter_map_rewrite( fdc.ctx = "searchFilter"; - switch ( rewrite_session( fdc.rwmap->rwm_rw, fdc.ctx, - ( !BER_BVISEMPTY( &ftmp ) ? ftmp.bv_val : "" ), + switch ( rewrite_session( fdc.target->mt_rwmap.rwm_rw, fdc.ctx, + ( !BER_BVISEMPTY( &ftmp ) ? ftmp.bv_val : dmy ), fdc.conn, &fstr->bv_val ) ) { case REWRITE_REGEXEC_OK: @@ -530,7 +563,8 @@ ldap_back_filter_map_rewrite( } Debug( LDAP_DEBUG_ARGS, "[rw] %s: \"%s\" -> \"%s\"\n", - fdc.ctx, ftmp.bv_val, fstr->bv_val ); + fdc.ctx, BER_BVISNULL( &ftmp ) ? "" : ftmp.bv_val, + BER_BVISNULL( fstr ) ? "" : fstr->bv_val ); rc = LDAP_SUCCESS; break; @@ -550,6 +584,10 @@ ldap_back_filter_map_rewrite( rc = LDAP_OTHER; break; } + + if ( fstr->bv_val == dmy ) { + BER_BVZERO( fstr ); + } #endif /* ENABLE_REWRITE */ return rc; @@ -571,7 +609,8 @@ ldap_back_referral_result_rewrite( last--; for ( i = 0; !BER_BVISNULL( &a_vals[ i ] ); i++ ) { - struct berval dn, olddn; + struct berval dn, + olddn = BER_BVNULL; int rc; LDAPURLDesc *ludp;