X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-meta%2Fmap.c;h=87ca4b903175cdae6c7750b8098848d40bea291b;hb=52165180f7713b5fdebef933a9dca8842daa2e2a;hp=b18288846ffd933b0415a8b7357750dede9b06b4;hpb=642b788fb26694a3eef2bc7cc212186bd1cf3651;p=openldap diff --git a/servers/slapd/back-meta/map.c b/servers/slapd/back-meta/map.c index b18288846f..87ca4b9031 100644 --- a/servers/slapd/back-meta/map.c +++ b/servers/slapd/back-meta/map.c @@ -206,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; } @@ -244,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; } @@ -276,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; } @@ -454,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 ) ) @@ -481,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 ); @@ -518,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 ); @@ -531,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: @@ -565,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;