/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1999-2003 The OpenLDAP Foundation.
+ * Copyright 1999-2004 The OpenLDAP Foundation.
* Portions Copyright 1999-2003 Howard Chu.
* Portions Copyright 2000-2003 Pierangelo Masarati.
* All rights reserved.
char **mapped_attrs = NULL;
struct berval mbase;
struct berval mfilter = { 0, NULL };
- struct slap_limits_set *limit = NULL;
- int isroot = 0;
int dontfreetext = 0;
dncookie dc;
#ifdef LDAP_BACK_PROXY_AUTHZ
return( -1 );
}
- /* if not root, get appropriate limits */
- if ( be_isroot( op->o_bd, &op->o_ndn ) ) {
- isroot = 1;
- } else {
- ( void ) get_limits( op->o_bd, &op->o_ndn, &limit );
- }
-
- /* if no time limit requested, rely on remote server limits */
- /* if requested limit higher than hard limit, abort */
- if ( !isroot && op->oq_search.rs_tlimit > limit->lms_t_hard ) {
- /* no hard limit means use soft instead */
- if ( limit->lms_t_hard == 0
- && limit->lms_t_soft > -1
- && op->oq_search.rs_tlimit > limit->lms_t_soft ) {
- op->oq_search.rs_tlimit = limit->lms_t_soft;
-
- /* positive hard limit means abort */
- } else if ( limit->lms_t_hard > 0 ) {
- rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
- rc = 0;
- goto finish;
- }
-
- /* negative hard limit means no limit */
- }
-
- /* if no size limit requested, rely on remote server limits */
- /* if requested limit higher than hard limit, abort */
- if ( !isroot && op->oq_search.rs_slimit > limit->lms_s_hard ) {
- /* no hard limit means use soft instead */
- if ( limit->lms_s_hard == 0
- && limit->lms_s_soft > -1
- && op->oq_search.rs_slimit > limit->lms_s_soft ) {
- op->oq_search.rs_slimit = limit->lms_s_soft;
-
- /* positive hard limit means abort */
- } else if ( limit->lms_s_hard > 0 ) {
- rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED;
- rc = 0;
- goto finish;
- }
-
- /* negative hard limit means no limit */
- }
-
/* should we check return values? */
- if (op->oq_search.rs_deref != -1)
- ldap_set_option( lc->ld, LDAP_OPT_DEREF, (void *)&op->oq_search.rs_deref);
- if (op->oq_search.rs_tlimit != -1) {
- tv.tv_sec = op->oq_search.rs_tlimit;
+ if (op->ors_deref != -1)
+ ldap_set_option( lc->ld, LDAP_OPT_DEREF, (void *)&op->ors_deref);
+ if (op->ors_tlimit != -1) {
+ tv.tv_sec = op->ors_tlimit;
tv.tv_usec = 0;
} else {
tv.tv_sec = 0;
dc.tofrom = 1;
dc.normalized = 0;
#endif
- if ( ldap_back_dn_massage( &dc, &op->o_req_dn, &mbase ) ) {
+ if ( ldap_back_dn_massage( &dc, &op->o_req_ndn, &mbase ) ) {
send_ldap_result( op, rs );
return -1;
}
- rc = ldap_back_filter_map_rewrite( &dc, op->oq_search.rs_filter,
+ rc = ldap_back_filter_map_rewrite( &dc, op->ors_filter,
&mfilter, BACKLDAP_MAP );
- if ( rc ) {
+ switch ( rc ) {
+ case LDAP_SUCCESS:
+ break;
+
+ case LDAP_COMPARE_FALSE:
+ rs->sr_err = LDAP_SUCCESS;
+ rs->sr_text = NULL;
+ rc = 0;
+ goto finish;
+
+ default:
rs->sr_err = LDAP_OTHER;
rs->sr_text = "Rewrite error";
dontfreetext = 1;
}
rs->sr_err = ldap_back_map_attrs( &li->rwmap.rwm_at,
- op->oq_search.rs_attrs,
+ op->ors_attrs,
BACKLDAP_MAP, &mapped_attrs );
if ( rs->sr_err ) {
rc = -1;
#endif /* LDAP_BACK_PROXY_AUTHZ */
rs->sr_err = ldap_search_ext(lc->ld, mbase.bv_val,
- op->oq_search.rs_scope, mfilter.bv_val,
- mapped_attrs, op->oq_search.rs_attrsonly,
+ op->ors_scope, mfilter.bv_val,
+ mapped_attrs, op->ors_attrsonly,
#ifdef LDAP_BACK_PROXY_AUTHZ
ctrls,
#else /* ! LDAP_BACK_PROXY_AUTHZ */
op->o_ctrls,
#endif /* ! LDAP_BACK_PROXY_AUTHZ */
NULL,
- tv.tv_sec ? &tv : NULL, op->oq_search.rs_slimit,
+ tv.tv_sec ? &tv : NULL, op->ors_slimit,
&msgid );
if ( rs->sr_err != LDAP_SUCCESS ) {
} else if (rc == LDAP_RES_SEARCH_ENTRY) {
Entry ent = {0};
struct berval bdn;
+ int abort = 0;
e = ldap_first_entry(lc->ld,res);
- if ( ldap_build_entry(op, e, &ent, &bdn,
- LDAP_BUILD_ENTRY_PRIVATE) == LDAP_SUCCESS ) {
+ if ( ( rc = ldap_build_entry(op, e, &ent, &bdn,
+ LDAP_BUILD_ENTRY_PRIVATE)) == LDAP_SUCCESS ) {
rs->sr_entry = &ent;
- rs->sr_attrs = op->oq_search.rs_attrs;
- send_search_entry( op, rs );
+ rs->sr_attrs = op->ors_attrs;
+ rs->sr_flags = 0;
+ abort = send_search_entry( op, rs );
while (ent.e_attrs) {
Attribute *a;
BerVarray v;
free( ent.e_ndn );
}
ldap_msgfree(res);
+ if ( abort ) {
+ ldap_abandon(lc->ld, msgid);
+ goto finish;
+ }
} else if ( rc == LDAP_RES_SEARCH_REFERENCE ) {
char **references = NULL;
struct berval mdn;
#ifdef ENABLE_REWRITE
- dc.ctx = "matchedDn";
+ dc.ctx = "matchedDN";
#else
dc.tofrom = 0;
dc.normalized = 0;
if ( mapped_attrs ) {
ch_free( mapped_attrs );
}
- if ( mfilter.bv_val != op->oq_search.rs_filterstr.bv_val ) {
+ if ( mfilter.bv_val != op->ors_filterstr.bv_val ) {
ch_free( mfilter.bv_val );
}
- if ( mbase.bv_val != op->o_req_dn.bv_val ) {
+ if ( mbase.bv_val != op->o_req_ndn.bv_val ) {
free( mbase.bv_val );
}