allow to search for "auxiliary" objectClasses (i.e. those in ldap_entry_objclasses); allow to return all objectClasses including "auxiliary"; various cleanup

This commit is contained in:
Pierangelo Masarati 2004-08-20 12:06:03 +00:00
parent 6b8fd66364
commit d12fdece77
10 changed files with 136 additions and 135 deletions

View File

@ -101,21 +101,24 @@ backsql_bind( Operation *op, SlapReply *rs )
backsql_init_search( &bsi, &dn, LDAP_SCOPE_BASE,
-1, -1, -1, NULL, dbh, op, rs, anlist );
e = backsql_id2entry( &bsi, &user_entry, &user_id );
if ( e == NULL ) {
bsi.bsi_e = &user_entry;
rc = backsql_id2entry( &bsi, &user_id );
if ( rc != LDAP_SUCCESS ) {
Debug( LDAP_DEBUG_TRACE, "backsql_bind(): "
"error in backsql_id2entry() - auth failed\n",
0, 0, 0 );
rs->sr_err = LDAP_OTHER;
"error %d in backsql_id2entry() "
"- auth failed\n", rc, 0, 0 );
rs->sr_err = LDAP_INVALID_CREDENTIALS;
goto error_return;
}
e = &user_entry;
if ( ! access_allowed( op, e, password, NULL, ACL_AUTH, NULL ) ) {
rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
goto error_return;
}
if ( ( a = attr_find( e->e_attrs, password ) ) == NULL ) {
a = attr_find( e->e_attrs, password );
if ( a == NULL ) {
rs->sr_err = LDAP_INAPPROPRIATE_AUTH;
goto error_return;
}

View File

@ -104,20 +104,21 @@ backsql_compare( Operation *op, SlapReply *rs )
}
user_entry.e_attrs = nrs.sr_operational_attrs;
e = &user_entry;
} else {
backsql_init_search( &bsi, &dn, LDAP_SCOPE_BASE,
-1, -1, -1, NULL, dbh, op, rs, anlist );
e = backsql_id2entry( &bsi, &user_entry, &user_id );
if ( e == NULL ) {
bsi.bsi_e = &user_entry;
rc = backsql_id2entry( &bsi, &user_id );
if ( rc != LDAP_SUCCESS ) {
Debug( LDAP_DEBUG_TRACE, "backsql_compare(): "
"error in backsql_id2entry() "
"- compare failed\n", 0, 0, 0 );
rs->sr_err = LDAP_OTHER;
"error %d in backsql_id2entry() "
"- compare failed\n", rc, 0, 0 );
rs->sr_err = rc;
goto return_results;
}
}
e = &user_entry;
if ( ! access_allowed( op, e, op->oq_compare.rs_ava->aa_desc,
&op->oq_compare.rs_ava->aa_value,
@ -152,17 +153,7 @@ return_results:;
}
if ( e != NULL ) {
if ( e->e_name.bv_val != NULL ) {
free( e->e_name.bv_val );
}
if ( e->e_nname.bv_val != NULL ) {
free( e->e_nname.bv_val );
}
if ( e->e_attrs != NULL ) {
attrs_free( e->e_attrs );
}
entry_clean( e );
}
Debug(LDAP_DEBUG_TRACE,"<==backsql_compare()\n",0,0,0);

View File

@ -396,8 +396,8 @@ backsql_get_attr_vals( void *v_at, void *v_bsi )
return 1;
}
Entry *
backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid )
int
backsql_id2entry( backsql_srch_info *bsi, backsql_entryID *eid )
{
int i;
int rc;
@ -405,35 +405,44 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid )
Debug( LDAP_DEBUG_TRACE, "==>backsql_id2entry()\n", 0, 0, 0 );
rc = dnPrettyNormal( NULL, &eid->eid_dn, &e->e_name, &e->e_nname,
assert( bsi->bsi_e );
memset( bsi->bsi_e, 0, sizeof( Entry ) );
rc = dnPrettyNormal( NULL, &eid->eid_dn,
&bsi->bsi_e->e_name, &bsi->bsi_e->e_nname,
bsi->bsi_op->o_tmpmemctx );
if ( rc != LDAP_SUCCESS ) {
return NULL;
return rc;
}
bsi->bsi_e->e_attrs = NULL;
bsi->bsi_e->e_private = NULL;
bsi->bsi_oc = backsql_id2oc( bsi->bsi_op->o_bd->be_private,
eid->eid_oc_id );
bsi->bsi_e = e;
bsi->bsi_c_eid = eid;
e->e_attrs = NULL;
e->e_private = NULL;
#ifndef BACKSQL_ARBITRARY_KEY
e->e_id = eid->eid_id;
bsi->bsi_e->e_id = eid->eid_id;
#endif /* ! BACKSQL_ARBITRARY_KEY */
rc = attr_merge_normalize_one( bsi->bsi_e, ad_oc,
&bsi->bsi_oc->bom_oc->soc_cname,
bsi->bsi_op->o_tmpmemctx );
if ( rc != LDAP_SUCCESS ) {
entry_clean( bsi->bsi_e );
return rc;
}
if ( bsi->bsi_attrs != NULL ) {
Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): "
"custom attribute list\n", 0, 0, 0 );
for ( i = 0; bsi->bsi_attrs[ i ].an_name.bv_val; i++ ) {
backsql_at_map_rec **vat;
AttributeName *attr = &bsi->bsi_attrs[ i ];
AttributeName *an = &bsi->bsi_attrs[ i ];
int j;
if ( attr->an_desc == ad_oc ) {
continue;
}
/* if one of the attributes listed here is
* a subtype of another, it must be ignored,
* because subtypes are already dealt with
@ -446,18 +455,19 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid )
}
/* skip subtypes */
if ( is_at_subtype( attr->an_desc->ad_type, bsi->bsi_attrs[ j ].an_desc->ad_type ) )
if ( is_at_subtype( an->an_desc->ad_type,
bsi->bsi_attrs[ j ].an_desc->ad_type ) )
{
goto next;
}
}
rc = backsql_supad2at( bsi->bsi_oc, attr->an_desc, &vat );
rc = backsql_supad2at( bsi->bsi_oc, an->an_desc, &vat );
if ( rc != 0 || vat == NULL ) {
Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): "
"attribute \"%s\" is not defined "
"for objectlass \"%s\"\n",
attr->an_name.bv_val,
an->an_name.bv_val,
BACKSQL_OC_NAME( bsi->bsi_oc ), 0 );
continue;
}
@ -478,13 +488,6 @@ next:;
bsi, 0, AVL_INORDER );
}
if ( attr_merge_normalize_one( bsi->bsi_e, ad_oc,
&bsi->bsi_oc->bom_oc->soc_cname,
bsi->bsi_op->o_tmpmemctx ) ) {
entry_free( e );
return NULL;
}
if ( global_schemacheck ) {
const char *text = NULL;
char textbuf[ 1024 ];
@ -499,8 +502,12 @@ next:;
rc = structural_class( bv, &soc, NULL,
&text, textbuf, textlen );
if ( rc != LDAP_SUCCESS ) {
entry_free( e );
return NULL;
Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(%s): "
"structural_class() failed %d (%s)\n",
bsi->bsi_e->e_name.bv_val,
rc, text ? text : "" );
entry_clean( bsi->bsi_e );
return rc;
}
if ( ( bsi->bsi_flags | BSQL_SF_ALL_OPER )
@ -509,15 +516,15 @@ next:;
slap_schema.si_ad_structuralObjectClass,
&soc, bsi->bsi_op->o_tmpmemctx );
if ( rc != LDAP_SUCCESS ) {
entry_free( e );
return NULL;
entry_clean( bsi->bsi_e );
return rc;
}
}
}
Debug( LDAP_DEBUG_TRACE, "<==backsql_id2entry()\n", 0, 0, 0 );
return e;
return LDAP_SUCCESS;
}
#endif /* SLAPD_SQL */

View File

@ -115,8 +115,7 @@ int backsql_has_children( backsql_info *bi, SQLHDBC dbh, struct berval *dn );
backsql_entryID *backsql_free_entryID( backsql_entryID *id, int freeit );
/* turns an ID into an entry */
Entry *backsql_id2entry( backsql_srch_info *bsi, Entry *e,
backsql_entryID *id );
int backsql_id2entry( backsql_srch_info *bsi, backsql_entryID *id );
/*
* schema-map.c

View File

@ -17,6 +17,7 @@ create table ldap_attr_mappings
oc_map_id integer unsigned not null references ldap_oc_mappings(id),
name varchar(255) not null,
sel_expr varchar(255) not null,
sel_expr_u varchar(255),
from_tbls varchar(255) not null,
join_where varchar(255),
add_proc varchar(255),

View File

@ -1,4 +1,4 @@
insert into institutes (id,name) values (1,'sql');
insert into institutes (id,name) values (1,'Example');
insert into persons (id,name) values (1,'Mitya Kovalev');
insert into persons (id,name) values (2,'Torvlobnor Puzdoy');

View File

@ -53,8 +53,8 @@ insert into ldap_attr_mappings (id,oc_map_id,name,sel_expr,from_tbls,join_where,
values (7,3,'o','institutes.name','institutes',NULL,NULL,NULL,3,0);
insert into ldap_attr_mappings (id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)
values (8,1,'documentDN','ldap_entries.dn','ldap_entries,documents,authors_docs,persons',
'ldap_entries.keyval=documents.id AND ldap_entries.oc_map_id=2 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
values (8,1,'documentIdentifier','documentIdentifier.dn','ldap_entries AS documentIdentifier,documents,authors_docs,persons',
'documentIdentifier.keyval=documents.id AND documentIdentifier.oc_map_id=2 AND authors_docs.doc_id=documents.id AND authors_docs.pers_id=persons.id',
NULL,NULL,3,0);
-- entries mapping: each entry must appear in this table, with a unique DN rooted at the database naming context
@ -64,22 +64,22 @@ values (8,1,'documentDN','ldap_entries.dn','ldap_entries,documents,authors_docs,
-- parent the "ldap_entries.id" of the parent of this objectClass; 0 if it is the "suffix" of the database
-- keyval the value of the "keytbl.keycol" defined for this objectClass
insert into ldap_entries (id,dn,oc_map_id,parent,keyval)
values (1,'o=sql,c=RU',3,0,1);
values (1,'o=Example,c=RU',3,0,1);
insert into ldap_entries (id,dn,oc_map_id,parent,keyval)
values (2,'cn=Mitya Kovalev,o=sql,c=RU',1,1,1);
values (2,'cn=Mitya Kovalev,o=Example,c=RU',1,1,1);
insert into ldap_entries (id,dn,oc_map_id,parent,keyval)
values (3,'cn=Torvlobnor Puzdoy,o=sql,c=RU',1,1,2);
values (3,'cn=Torvlobnor Puzdoy,o=Example,c=RU',1,1,2);
insert into ldap_entries (id,dn,oc_map_id,parent,keyval)
values (4,'cn=Akakiy Zinberstein,o=sql,c=RU',1,1,3);
values (4,'cn=Akakiy Zinberstein,o=Example,c=RU',1,1,3);
insert into ldap_entries (id,dn,oc_map_id,parent,keyval)
values (5,'documentTitle=book1,o=sql,c=RU',2,1,1);
values (5,'documentTitle=book1,o=Example,c=RU',2,1,1);
insert into ldap_entries (id,dn,oc_map_id,parent,keyval)
values (6,'documentTitle=book2,o=sql,c=RU',2,1,2);
values (6,'documentTitle=book2,o=Example,c=RU',2,1,2);
-- objectClass mapping: entries that have multiple objectClass instances are listed here with the objectClass name (view them as auxiliary objectClass)
@ -92,4 +92,5 @@ values (4,'referral');
-- entry_id the "ldap_entries.id" of the entry that should be treated as a referral
-- url the URI of the referral
insert into ldap_referrals (entry_id,url)
values (4,'http://localhost');
values (4,'ldap://localhost/');

View File

@ -113,13 +113,14 @@ backsql_add_sysmaps( backsql_oc_map_rec *oc_map )
{
backsql_at_map_rec *at_map;
char s[] = "+9223372036854775807L";
ber_len_t slen;
struct berval sbv;
struct berbuf bb;
sbv.bv_val = s;
snprintf( s, sizeof( s ), "%ld", oc_map->bom_id );
slen = strlen( s );
sbv.bv_len = strlen( s );
/* extra objectClasses */
at_map = (backsql_at_map_rec *)ch_calloc(1,
sizeof( backsql_at_map_rec ) );
at_map->bam_ad = slap_schema.si_ad_objectClass;
@ -136,7 +137,7 @@ backsql_add_sysmaps( backsql_oc_map_rec *oc_map )
bb.bb_val.bv_val = NULL;
bb.bb_val.bv_len = 0;
bb.bb_len = 0;
backsql_strfcat( &bb, "lbcbll",
backsql_strfcat( &bb, "lbcblb",
(ber_len_t)STRLENOF( "ldap_entries.id=ldap_entry_objclasses.entry_id and ldap_entries.keyval=" ),
"ldap_entries.id=ldap_entry_objclasses.entry_id and ldap_entries.keyval=",
&oc_map->bom_keytbl,
@ -144,7 +145,7 @@ backsql_add_sysmaps( backsql_oc_map_rec *oc_map )
&oc_map->bom_keycol,
(ber_len_t)STRLENOF( " and ldap_entries.oc_map_id=" ),
" and ldap_entries.oc_map_id=",
slen, s );
&sbv );
at_map->bam_oc = oc_map->bom_oc;
at_map->bam_join_where = bb.bb_val;
@ -162,22 +163,22 @@ backsql_add_sysmaps( backsql_oc_map_rec *oc_map )
oc_map->bom_oc->soc_cname.bv_val, 0 );
}
/* referral attribute */
at_map = (backsql_at_map_rec *)ch_calloc( 1,
sizeof( backsql_at_map_rec ) );
at_map->bam_ad = slap_schema.si_ad_ref;
ber_str2bv( "ldap_referrals.url", 0, 1, &at_map->bam_sel_expr );
ber_str2bv( "ldap_referrals,ldap_entries", 0, 1, &at_map->bam_from_tbls );
bb.bb_val.bv_val = NULL;
bb.bb_val.bv_len = 0;
bb.bb_len = at_map->bam_from_tbls.bv_len + 1;
bb.bb_val = at_map->bam_from_tbls;
backsql_merge_from_clause( &bb, &oc_map->bom_keytbl );
at_map->bam_from_tbls = bb.bb_val;
bb.bb_val.bv_val = NULL;
bb.bb_val.bv_len = 0;
bb.bb_len = 0;
backsql_strfcat( &bb, "lbcbll",
backsql_strfcat( &bb, "lbcblb",
(ber_len_t)STRLENOF( "ldap_entries.id=ldap_referrals.entry_id and ldap_entries.keyval=" ),
"ldap_entries.id=ldap_referrals.entry_id and ldap_entries.keyval=",
&oc_map->bom_keytbl,
@ -185,7 +186,7 @@ backsql_add_sysmaps( backsql_oc_map_rec *oc_map )
&oc_map->bom_keycol,
(ber_len_t)STRLENOF( " and ldap_entries.oc_map_id=" ),
" and ldap_entries.oc_map_id=",
slen, s );
&sbv );
at_map->bam_oc = NULL;
at_map->bam_join_where = bb.bb_val;

View File

@ -60,7 +60,7 @@ backsql_attrlist_add( backsql_srch_info *bsi, AttributeDescription *ad )
return 1;
}
for ( ; bsi->bsi_attrs[ n_attrs ].an_name.bv_val; n_attrs++ ) {
for ( ; !BER_BVISNULL( &bsi->bsi_attrs[ n_attrs ].an_name ); n_attrs++ ) {
an = &bsi->bsi_attrs[ n_attrs ];
Debug( LDAP_DEBUG_TRACE, "==>backsql_attrlist_add(): "
@ -86,8 +86,7 @@ backsql_attrlist_add( backsql_srch_info *bsi, AttributeDescription *ad )
an[ n_attrs ].an_name = ad->ad_cname;
an[ n_attrs ].an_desc = ad;
an[ n_attrs + 1 ].an_name.bv_val = NULL;
an[ n_attrs + 1 ].an_name.bv_len = 0;
BER_BVZERO( &an[ n_attrs + 1 ].an_name );
bsi->bsi_attrs = an;
@ -129,10 +128,9 @@ backsql_init_search(
} else {
bsi->bsi_attrs = (AttributeName *)ch_calloc( 1,
sizeof( AttributeName ) );
bsi->bsi_attrs[ 0 ].an_name.bv_val = NULL;
bsi->bsi_attrs[ 0 ].an_name.bv_len = 0;
BER_BVZERO( &bsi->bsi_attrs[ 0 ].an_name );
for ( p = attrs; p->an_name.bv_val; p++ ) {
for ( p = attrs; !BER_BVISNULL( &p->an_name ); p++ ) {
/*
* ignore "1.1"; handle "+"
*/
@ -152,17 +150,13 @@ backsql_init_search(
bsi->bsi_id_list = NULL;
bsi->bsi_n_candidates = 0;
bsi->bsi_stoptime = stoptime;
bsi->bsi_sel.bb_val.bv_val = NULL;
bsi->bsi_sel.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_sel.bb_val );
bsi->bsi_sel.bb_len = 0;
bsi->bsi_from.bb_val.bv_val = NULL;
bsi->bsi_from.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_from.bb_val );
bsi->bsi_from.bb_len = 0;
bsi->bsi_join_where.bb_val.bv_val = NULL;
bsi->bsi_join_where.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_join_where.bb_val );
bsi->bsi_join_where.bb_len = 0;
bsi->bsi_flt_where.bb_val.bv_val = NULL;
bsi->bsi_flt_where.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_flt_where.bb_val );
bsi->bsi_flt_where.bb_len = 0;
bsi->bsi_filter_oc = NULL;
@ -251,7 +245,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f,
* val LIKE '%1%2%3%4%'
*/
bv.bv_len = 0;
BER_BVZERO( &bv );
if ( f->f_sub_initial.bv_val ) {
bv.bv_len += f->f_sub_initial.bv_len;
}
@ -267,7 +261,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f,
bv.bv_val = ch_malloc( bv.bv_len + 1 );
s = 0;
if ( f->f_sub_initial.bv_val ) {
if ( !BER_BVISNULL( &f->f_sub_initial ) ) {
bv.bv_val[ s ] = f->f_sub_initial.bv_val[ 0 ];
for ( i = 1; i < f->f_sub_initial.bv_len; i++ ) {
bv.bv_val[ s + 2 * i - 1 ] = '%';
@ -278,7 +272,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f,
}
if ( f->f_sub_any != NULL ) {
for ( a = 0; f->f_sub_any[ a ].bv_val != NULL; a++ ) {
for ( a = 0; !BER_BVISNULL( &f->f_sub_any[ a ] ); a++ ) {
bv.bv_val[ s ] = f->f_sub_any[ a ].bv_val[ 0 ];
for ( i = 1; i < f->f_sub_any[ a ].bv_len; i++ ) {
bv.bv_val[ s + 2 * i - 1 ] = '%';
@ -289,7 +283,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f,
}
}
if ( f->f_sub_final.bv_val ) {
if ( !BER_BVISNULL( &f->f_sub_final ) ) {
bv.bv_val[ s ] = f->f_sub_final.bv_val[ 0 ];
for ( i = 1; i < f->f_sub_final.bv_len; i++ ) {
bv.bv_val[ s + 2 * i - 1 ] = '%';
@ -338,7 +332,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f,
(ber_len_t)STRLENOF( " LIKE '" ), " LIKE '" );
}
if ( f->f_sub_initial.bv_val != NULL ) {
if ( !BER_BVISNULL( &f->f_sub_initial ) ) {
ber_len_t start;
#ifdef BACKSQL_TRACE
@ -359,7 +353,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f,
backsql_strfcat( &bsi->bsi_flt_where, "c", '%' );
if ( f->f_sub_any != NULL ) {
for ( i = 0; f->f_sub_any[ i ].bv_val != NULL; i++ ) {
for ( i = 0; !BER_BVISNULL( &f->f_sub_any[ i ] ); i++ ) {
ber_len_t start;
#ifdef BACKSQL_TRACE
@ -383,7 +377,7 @@ backsql_process_sub_filter( backsql_srch_info *bsi, Filter *f,
}
}
if ( f->f_sub_final.bv_val != NULL ) {
if ( !BER_BVISNULL( &f->f_sub_final ) ) {
ber_len_t start;
#ifdef BACKSQL_TRACE
@ -748,7 +742,7 @@ backsql_process_filter_attr( backsql_srch_info *bsi, Filter *f, backsql_at_map_r
*/
backsql_attrlist_add( bsi, at->bam_ad );
if ( at->bam_join_where.bv_val != NULL
if ( !BER_BVISNULL( &at->bam_join_where )
&& strstr( bsi->bsi_join_where.bb_val.bv_val, at->bam_join_where.bv_val ) == NULL ) {
backsql_strfcat( &bsi->bsi_join_where, "lb",
(ber_len_t)STRLENOF( " AND " ), " AND ",
@ -912,21 +906,17 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
int rc;
assert( query );
query->bv_val = NULL;
query->bv_len = 0;
BER_BVZERO( query );
Debug( LDAP_DEBUG_TRACE, "==>backsql_srch_query()\n", 0, 0, 0 );
bsi->bsi_sel.bb_val.bv_val = NULL;
bsi->bsi_sel.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_sel.bb_val );
BER_BVZERO( &bsi->bsi_sel.bb_val );
bsi->bsi_sel.bb_len = 0;
bsi->bsi_from.bb_val.bv_val = NULL;
bsi->bsi_from.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_from.bb_val );
bsi->bsi_from.bb_len = 0;
bsi->bsi_join_where.bb_val.bv_val = NULL;
bsi->bsi_join_where.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_join_where.bb_val );
bsi->bsi_join_where.bb_len = 0;
bsi->bsi_flt_where.bb_val.bv_val = NULL;
bsi->bsi_flt_where.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_flt_where.bb_val );
bsi->bsi_flt_where.bb_len = 0;
backsql_strfcat( &bsi->bsi_sel, "lbcbc",
@ -937,7 +927,7 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
&bsi->bsi_oc->bom_keycol,
',' );
if ( bi->strcast_func.bv_val ) {
if ( !BER_BVISNULL( &bi->strcast_func ) ) {
backsql_strfcat( &bsi->bsi_sel, "blbl",
&bi->strcast_func,
(ber_len_t)sizeof( "('" /* ') */ ) - 1,
@ -1038,20 +1028,20 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query )
* anything. No need to issue the query
*/
free( query->bv_val );
query->bv_val = NULL;
BER_BVZERO( query );
}
free( bsi->bsi_sel.bb_val.bv_val );
bsi->bsi_sel.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_sel.bb_val );
bsi->bsi_sel.bb_len = 0;
free( bsi->bsi_from.bb_val.bv_val );
bsi->bsi_from.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_from.bb_val );
bsi->bsi_from.bb_len = 0;
free( bsi->bsi_join_where.bb_val.bv_val );
bsi->bsi_join_where.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_join_where.bb_val );
bsi->bsi_join_where.bb_len = 0;
free( bsi->bsi_flt_where.bb_val.bv_val );
bsi->bsi_flt_where.bb_val.bv_len = 0;
BER_BVZERO( &bsi->bsi_flt_where.bb_val );
bsi->bsi_flt_where.bb_len = 0;
Debug( LDAP_DEBUG_TRACE, "<==backsql_srch_query() returns %s\n",
@ -1124,7 +1114,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
}
}
if ( query.bv_val == NULL ) {
if ( BER_BVISNULL( &query ) ) {
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
"could not construct query for objectclass \"%s\"\n",
oc->bom_oc->soc_cname.bv_val, 0, 0 );
@ -1137,6 +1127,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi )
rc = backsql_Prepare( bsi->bsi_dbh, &sth, query.bv_val, 0 );
free( query.bv_val );
BER_BVZERO( &query );
if ( rc != SQL_SUCCESS ) {
Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): "
"error preparing query\n", 0, 0, 0 );
@ -1358,7 +1349,7 @@ backsql_search( Operation *op, SlapReply *rs )
backsql_info *bi = (backsql_info *)op->o_bd->be_private;
SQLHDBC dbh;
int sres;
Entry *entry, *res;
Entry user_entry = { 0 };
int manageDSAit;
time_t stoptime = 0;
backsql_srch_info srch_info;
@ -1448,8 +1439,11 @@ backsql_search( Operation *op, SlapReply *rs )
* mentioned in attrs and filter), test it against full filter
* and then send to client
*/
for ( eid = srch_info.bsi_id_list; eid != NULL;
eid = backsql_free_entryID( eid, 1 ) ) {
for ( eid = srch_info.bsi_id_list;
eid != NULL;
eid = backsql_free_entryID( eid, 1 ) )
{
int rc;
Attribute *hasSubordinate = NULL,
*a = NULL;
@ -1482,24 +1476,25 @@ backsql_search( Operation *op, SlapReply *rs )
eid->eid_id, eid->eid_oc_id, eid->eid_keyval );
#endif /* ! BACKSQL_ARBITRARY_KEY */
entry = (Entry *)ch_calloc( sizeof( Entry ), 1 );
res = backsql_id2entry( &srch_info, entry, eid );
if ( res == NULL ) {
srch_info.bsi_e = &user_entry;
rc = backsql_id2entry( &srch_info, eid );
if ( rc != LDAP_SUCCESS ) {
Debug( LDAP_DEBUG_TRACE, "backsql_search(): "
"error in backsql_id2entry() "
"- skipping entry\n", 0, 0, 0 );
"error %d in backsql_id2entry() "
"- skipping\n", rc, 0, 0 );
continue;
}
if ( !manageDSAit &&
op->ors_scope != LDAP_SCOPE_BASE &&
op->ors_scope != BACKSQL_SCOPE_BASE_LIKE &&
is_entry_referral( entry ) ) {
is_entry_referral( &user_entry ) )
{
BerVarray refs;
struct berval matched_dn;
ber_dupbv( &matched_dn, &entry->e_name );
refs = get_entry_referrals( op, entry );
ber_dupbv( &matched_dn, &user_entry.e_name );
refs = get_entry_referrals( op, &user_entry );
if ( refs ) {
rs->sr_ref = referral_rewrite( refs,
&matched_dn, &op->o_req_dn,
@ -1529,16 +1524,14 @@ backsql_search( Operation *op, SlapReply *rs )
* filter_has_subordinates()
*/
if ( srch_info.bsi_flags & BSQL_SF_FILTER_HASSUBORDINATE ) {
int rc;
rc = backsql_has_children( bi, dbh, &user_entry.e_nname );
rc = backsql_has_children( bi, dbh, &entry->e_nname );
switch( rc ) {
switch ( rc ) {
case LDAP_COMPARE_TRUE:
case LDAP_COMPARE_FALSE:
hasSubordinate = slap_operational_hasSubordinate( rc == LDAP_COMPARE_TRUE );
if ( hasSubordinate != NULL ) {
for ( a = entry->e_attrs;
for ( a = user_entry.e_attrs;
a && a->a_next;
a = a->a_next );
@ -1561,7 +1554,7 @@ backsql_search( Operation *op, SlapReply *rs )
}
}
if ( test_filter( op, entry, op->ors_filter )
if ( test_filter( op, &user_entry, op->ors_filter )
== LDAP_COMPARE_TRUE ) {
if ( hasSubordinate && !( srch_info.bsi_flags & BSQL_SF_ALL_OPER )
&& !ad_inlist( slap_schema.si_ad_hasSubordinates, op->ors_attrs ) ) {
@ -1578,7 +1571,7 @@ backsql_search( Operation *op, SlapReply *rs )
{
rs->sr_attrs = op->ors_attrs;
rs->sr_operational_attrs = NULL;
rs->sr_entry = entry;
rs->sr_entry = &user_entry;
rs->sr_flags = REP_ENTRY_MODIFIABLE;
sres = send_search_entry( op, rs );
rs->sr_entry = NULL;
@ -1603,7 +1596,7 @@ backsql_search( Operation *op, SlapReply *rs )
break;
}
}
entry_free( entry );
entry_clean( &user_entry );
if ( op->ors_slimit != SLAP_NO_LIMIT
&& rs->sr_nentries >= op->ors_slimit )
@ -1615,11 +1608,14 @@ backsql_search( Operation *op, SlapReply *rs )
}
end_of_search:;
/* in case we got here accidentally */
entry_clean( &user_entry );
if ( rs->sr_nentries > 0 ) {
rs->sr_ref = rs->sr_v2ref;
rs->sr_err = (rs->sr_v2ref == NULL) ? LDAP_SUCCESS
: LDAP_REFERRAL;
} else {
rs->sr_err = srch_info.bsi_status;
}

View File

@ -110,7 +110,8 @@ backsql_strcat( struct berbuf *dest, ... )
#ifdef BACKSQL_TRACE
Debug( LDAP_DEBUG_TRACE, "backsql_strcat(): "
"new buflen=%d, dest=%p\n", dest->bb_len, dest, 0 );
"new buflen=%d, dest=%p\n",
dest->bb_len, dest, 0 );
#endif /* BACKSQL_TRACE */
}
AC_MEMCPY( dest->bb_val.bv_val + cdlen, cstr, cslen + 1 );
@ -120,7 +121,7 @@ backsql_strcat( struct berbuf *dest, ... )
#ifdef BACKSQL_TRACE
Debug( LDAP_DEBUG_TRACE, "<==backsql_strcat() (dest=\"%s\")\n",
dest, 0, 0 );
dest->bb_val.bv_val, 0, 0 );
#endif /* BACKSQL_TRACE */
dest->bb_val.bv_len = cdlen;
@ -231,7 +232,7 @@ backsql_strfcat( struct berbuf *dest, const char *fmt, ... )
#ifdef BACKSQL_TRACE
Debug( LDAP_DEBUG_TRACE, "<==backsql_strfcat() (dest=\"%s\")\n",
dest, 0, 0 );
dest->bb_val.bv_val, 0, 0 );
#endif /* BACKSQL_TRACE */
dest->bb_val.bv_len = cdlen;
@ -340,7 +341,8 @@ backsql_merge_from_clause(
#ifdef BACKSQL_TRACE
Debug( LDAP_DEBUG_TRACE, "==>backsql_merge_from_clause(): "
"dest_from=\"%s\",src_from=\"%s\"\n",
dest_from ? dest_from->bb_val.bv_val : "<NULL>", src_from, 0 );
dest_from ? dest_from->bb_val.bv_val : "<NULL>",
src_from->bv_val, 0 );
#endif /* BACKSQL_TRACE */
srcc = ch_strdup( src_from->bv_val );