Commit 21cecb38 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Update referral handling to use struct berval DNs.

parent f6deebfe
......@@ -237,7 +237,7 @@ do_add( Connection *conn, Operation *op )
be = select_backend( &e->e_nname, manageDSAit, 0 );
if ( be == NULL ) {
struct berval **ref = referral_rewrite( default_referral,
NULL, e->e_dn, LDAP_SCOPE_DEFAULT );
NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
send_ldap_result( conn, op, rc = LDAP_REFERRAL,
NULL, NULL, ref ? ref : default_referral, NULL );
......@@ -329,7 +329,7 @@ do_add( Connection *conn, Operation *op )
struct berval **defref = be->be_update_refs
? be->be_update_refs : default_referral;
struct berval **ref = referral_rewrite( defref,
NULL, e->e_dn, LDAP_SCOPE_DEFAULT );
NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
ref ? ref : defref, NULL );
......
......@@ -121,15 +121,14 @@ retry: rc = txn_abort( ltid );
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op,
matched, e->e_dn, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
bdb_entry_return( be, matched );
matched = NULL;
} else {
refs = referral_rewrite( default_referral,
NULL, e->e_dn, LDAP_SCOPE_DEFAULT );
NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
}
Debug( LDAP_DEBUG_TRACE, "bdb_add: parent does not exist\n",
......@@ -167,8 +166,7 @@ retry: rc = txn_abort( ltid );
/* parent is a referral, don't allow add */
char *matched_dn = ch_strdup( p->e_dn );
struct berval **refs = is_entry_referral( p )
? get_entry_referrals( be, conn, op, p,
e->e_dn, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, p )
: NULL;
Debug( LDAP_DEBUG_TRACE, "bdb_add: parent is referral\n",
......
......@@ -64,8 +64,7 @@ bdb_bind(
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
bdb_entry_return( be, matched );
......@@ -73,7 +72,7 @@ bdb_bind(
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
/* allow noauth binds */
......@@ -125,7 +124,7 @@ bdb_bind(
if ( is_entry_referral( e ) ) {
/* entry is a referral, don't allow bind */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
Debug( LDAP_DEBUG_TRACE, "entry is referral\n", 0,
0, 0 );
......
......@@ -51,15 +51,14 @@ bdb_compare(
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
bdb_entry_return( be, matched );
matched = NULL;
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, rc = LDAP_REFERRAL,
......@@ -74,7 +73,7 @@ bdb_compare(
if (!manageDSAit && is_entry_referral( e ) ) {
/* entry is a referral, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
Debug( LDAP_DEBUG_TRACE, "entry is referral\n", 0,
0, 0 );
......
......@@ -97,15 +97,14 @@ retry: /* transaction retry */
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
bdb_entry_return( be, matched );
matched = NULL;
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, LDAP_REFERRAL,
......@@ -194,7 +193,7 @@ retry: /* transaction retry */
/* parent is a referral, don't allow add */
/* parent is an alias, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
Debug( LDAP_DEBUG_TRACE,
"bdb_delete: entry is referral\n",
......
......@@ -235,15 +235,14 @@ retry: /* transaction retry */
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
bdb_entry_return( be, matched );
matched = NULL;
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, rc = LDAP_REFERRAL,
......@@ -259,7 +258,7 @@ retry: /* transaction retry */
/* parent is a referral, don't allow add */
/* parent is an alias, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
Debug( LDAP_DEBUG_TRACE,
"bdb_modify: entry is referral\n",
......
......@@ -127,15 +127,14 @@ retry: /* transaction retry */
if( matched != NULL ) {
matched_dn = strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
bdb_entry_return( be, matched );
matched = NULL;
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, rc = LDAP_REFERRAL,
......@@ -151,7 +150,7 @@ retry: /* transaction retry */
/* parent is a referral, don't allow add */
/* parent is an alias, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
Debug( LDAP_DEBUG_TRACE, "bdb_modrdn: entry %s is referral\n",
e->e_dn, 0, 0 );
......
......@@ -65,8 +65,7 @@ bdb_referrals(
if( is_entry_referral( matched ) ) {
rc = LDAP_OTHER;
refs = get_entry_referrals( be, conn, op,
matched, dn->bv_val, LDAP_SCOPE_DEFAULT );
refs = get_entry_referrals( be, conn, op, matched );
}
bdb_entry_return( be, matched );
......@@ -74,7 +73,7 @@ bdb_referrals(
} else if ( default_referral != NULL ) {
rc = LDAP_OTHER;
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
if( refs != NULL ) {
......@@ -95,9 +94,9 @@ bdb_referrals(
if ( is_entry_referral( e ) ) {
/* entry is a referral */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
struct berval **rrefs = referral_rewrite(
refs, e->e_dn, dn->bv_val, LDAP_SCOPE_DEFAULT );
refs, &e->e_name, dn, LDAP_SCOPE_DEFAULT );
Debug( LDAP_DEBUG_TRACE,
"bdb_referrals: op=%ld target=\"%s\" matched=\"%s\"\n",
......
......@@ -92,16 +92,15 @@ bdb_search(
}
if ( e == NULL ) {
char *matched_dn = NULL;
struct berval *matched_dn = NULL;
struct berval **refs = NULL;
if ( matched != NULL ) {
struct berval **erefs;
matched_dn = ch_strdup( matched->e_dn );
matched_dn = ber_bvdup( &matched->e_name );
erefs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
base->bv_val, scope )
? get_entry_referrals( be, conn, op, matched )
: NULL;
bdb_entry_return( be, matched );
......@@ -109,29 +108,28 @@ bdb_search(
if( erefs ) {
refs = referral_rewrite( erefs, matched_dn,
base->bv_val, scope );
base, scope );
ber_bvecfree( erefs );
}
} else {
refs = referral_rewrite( default_referral,
NULL, base->bv_val, scope );
NULL, base, scope );
}
send_ldap_result( conn, op, rc=LDAP_REFERRAL ,
matched_dn, text, refs, NULL );
matched_dn->bv_val, text, refs, NULL );
ber_bvecfree( refs );
free( matched_dn );
ber_bvfree( matched_dn );
return rc;
}
if (!manageDSAit && e != &slap_entry_root && is_entry_referral( e ) ) {
/* entry is a referral, don't allow add */
char *matched_dn = ch_strdup( e->e_dn );
struct berval *matched_dn = ber_bvdup( &e->e_name );
struct berval **erefs = get_entry_referrals( be,
conn, op, e, base->bv_val, scope );
conn, op, e );
struct berval **refs = NULL;
bdb_entry_return( be, e );
......@@ -139,7 +137,7 @@ bdb_search(
if( erefs ) {
refs = referral_rewrite( erefs, matched_dn,
base->bv_val, scope );
base, scope );
ber_bvecfree( erefs );
}
......@@ -147,12 +145,12 @@ bdb_search(
0, 0, 0 );
send_ldap_result( conn, op, LDAP_REFERRAL,
matched_dn, refs ? NULL : "bad referral object",
matched_dn->bv_val,
refs ? NULL : "bad referral object",
refs, NULL );
ber_bvecfree( refs );
free( matched_dn );
ber_bvfree( matched_dn );
return 1;
}
......@@ -356,8 +354,9 @@ bdb_search(
is_entry_referral( e ) )
{
struct berval **erefs = get_entry_referrals(
be, conn, op, e, NULL, scope );
struct berval **refs = referral_rewrite( erefs, e->e_dn, NULL,
be, conn, op, e );
struct berval **refs = referral_rewrite( erefs,
&e->e_name, NULL,
scope == LDAP_SCOPE_SUBTREE
? LDAP_SCOPE_SUBTREE
: LDAP_SCOPE_BASE );
......
......@@ -97,14 +97,13 @@ ldbm_back_add(
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
e->e_dn, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
cache_return_entry_r( &li->li_cache, matched );
} else {
refs = referral_rewrite( default_referral,
NULL, e->e_dn, LDAP_SCOPE_DEFAULT );
NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
}
#ifdef NEW_LOGGING
......@@ -176,8 +175,7 @@ ldbm_back_add(
/* parent is a referral, don't allow add */
char *matched_dn = ch_strdup( p->e_dn );
struct berval **refs = is_entry_referral( p )
? get_entry_referrals( be, conn, op, p,
e->e_dn, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, p )
: NULL;
/* free parent and writer lock */
......
......@@ -62,15 +62,14 @@ ldbm_back_bind(
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
cache_return_entry_r( &li->li_cache, matched );
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
/* allow noauth binds */
......@@ -128,7 +127,7 @@ ldbm_back_bind(
if ( is_entry_referral( e ) ) {
/* entry is a referral, don't allow bind */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
#ifdef NEW_LOGGING
LDAP_LOG(( "backend", LDAP_LEVEL_INFO,
......
......@@ -41,13 +41,12 @@ ldbm_back_compare(
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
cache_return_entry_r( &li->li_cache, matched );
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, LDAP_REFERRAL,
......@@ -62,7 +61,7 @@ ldbm_back_compare(
if (!manageDSAit && is_entry_referral( e ) ) {
/* entry is a referral, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
#ifdef NEW_LOGGING
LDAP_LOG(( "backend", LDAP_LEVEL_INFO,
......
......@@ -57,14 +57,13 @@ ldbm_back_delete(
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
cache_return_entry_r( &li->li_cache, matched );
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, LDAP_REFERRAL,
......@@ -80,7 +79,7 @@ ldbm_back_delete(
/* parent is a referral, don't allow add */
/* parent is an alias, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
#ifdef NEW_LOGGING
LDAP_LOG(( "backend", LDAP_LEVEL_INFO,
......@@ -91,7 +90,6 @@ ldbm_back_delete(
0, 0 );
#endif
send_ldap_result( conn, op, LDAP_REFERRAL,
e->e_dn, NULL, refs, NULL );
......
......@@ -275,13 +275,12 @@ ldbm_back_modify(
if ( matched != NULL ) {
matched_dn = ch_strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
cache_return_entry_r( &li->li_cache, matched );
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, LDAP_REFERRAL,
......@@ -297,7 +296,7 @@ ldbm_back_modify(
/* parent is a referral, don't allow add */
/* parent is an alias, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
#ifdef NEW_LOGGING
LDAP_LOG(( "backend", LDAP_LEVEL_INFO,
......
......@@ -98,13 +98,12 @@ ldbm_back_modrdn(
if( matched != NULL ) {
matched_dn = strdup( matched->e_dn );
refs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT )
? get_entry_referrals( be, conn, op, matched )
: NULL;
cache_return_entry_r( &li->li_cache, matched );
} else {
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
send_ldap_result( conn, op, LDAP_REFERRAL,
......@@ -120,7 +119,7 @@ ldbm_back_modrdn(
/* parent is a referral, don't allow add */
/* parent is an alias, don't allow add */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
#ifdef NEW_LOGGING
LDAP_LOG(( "backend", LDAP_LEVEL_INFO,
......
......@@ -59,8 +59,7 @@ ldbm_back_referrals(
if( is_entry_referral( matched ) ) {
rc = LDAP_OTHER;
refs = get_entry_referrals( be, conn, op, matched,
dn->bv_val, LDAP_SCOPE_DEFAULT );
refs = get_entry_referrals( be, conn, op, matched );
}
cache_return_entry_r( &li->li_cache, matched );
......@@ -68,7 +67,7 @@ ldbm_back_referrals(
} else if ( default_referral != NULL ) {
rc = LDAP_OTHER;
refs = referral_rewrite( default_referral,
NULL, dn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, dn, LDAP_SCOPE_DEFAULT );
}
if( refs != NULL ) {
......@@ -90,9 +89,9 @@ ldbm_back_referrals(
if ( is_entry_referral( e ) ) {
/* entry is a referral */
struct berval **refs = get_entry_referrals( be,
conn, op, e, dn->bv_val, LDAP_SCOPE_DEFAULT );
conn, op, e );
struct berval **rrefs = referral_rewrite(
refs, e->e_dn, dn->bv_val, LDAP_SCOPE_DEFAULT );
refs, &e->e_name, dn, LDAP_SCOPE_DEFAULT );
#ifdef NEW_LOGGING
LDAP_LOG(( "backend", LDAP_LEVEL_DETAIL1,
......
......@@ -91,45 +91,44 @@ ldbm_back_search(
}
if ( e == NULL ) {
char *matched_dn = NULL;
struct berval *matched_dn = NULL;
struct berval **refs = NULL;
if ( matched != NULL ) {
struct berval **erefs;
matched_dn = ch_strdup( matched->e_dn );
matched_dn = ber_bvdup( &matched->e_name );
erefs = is_entry_referral( matched )
? get_entry_referrals( be, conn, op, matched,
base->bv_val, scope )
? get_entry_referrals( be, conn, op, matched )
: NULL;
cache_return_entry_r( &li->li_cache, matched );
if( erefs ) {
refs = referral_rewrite( erefs, matched_dn,
base->bv_val, scope );
base, scope );
ber_bvecfree( erefs );
}
} else {
refs = referral_rewrite( default_referral,
NULL, base->bv_val, scope );
NULL, base, scope );
}
send_ldap_result( conn, op, err,
matched_dn, text, refs, NULL );
matched_dn->bv_val, text, refs, NULL );
ber_bvecfree( refs );
free( matched_dn );
ber_bvfree( matched_dn );
return 1;
}
if (!manageDSAit && is_entry_referral( e ) ) {
/* entry is a referral, don't allow add */
char *matched_dn = ch_strdup( e->e_dn );
struct berval *matched_dn = ber_bvdup( &e->e_name );
struct berval **erefs = get_entry_referrals( be,
conn, op, e, base->bv_val, scope );
conn, op, e );
struct berval **refs = NULL;
cache_return_entry_r( &li->li_cache, e );
......@@ -146,22 +145,23 @@ ldbm_back_search(
if( erefs ) {
refs = referral_rewrite( erefs, matched_dn,
base->bv_val, scope );
base, scope );
ber_bvecfree( erefs );
}
if( refs ) {
send_ldap_result( conn, op, LDAP_REFERRAL,
matched_dn, NULL, refs, NULL );
matched_dn->bv_val, NULL, refs, NULL );
ber_bvecfree( refs );
} else {
send_ldap_result( conn, op, LDAP_OTHER, matched_dn,
"bad referral object", NULL, NULL );
send_ldap_result( conn, op, LDAP_OTHER,
matched_dn->bv_val,
"bad referral object", NULL, NULL );
}
free( matched_dn );
ber_bvfree( matched_dn );
return 1;
}
......@@ -396,8 +396,9 @@ searchit:
if( scopeok ) {
struct berval **erefs = get_entry_referrals(
be, conn, op, e, NULL, cscope );
struct berval **refs = referral_rewrite( erefs, e->e_dn, NULL,
be, conn, op, e );
struct berval **refs = referral_rewrite( erefs,
&e->e_name, NULL,
scope == LDAP_SCOPE_SUBTREE
? LDAP_SCOPE_SUBTREE
: LDAP_SCOPE_BASE );
......
......@@ -459,7 +459,7 @@ do_bind(
if ( (be = select_backend( ndn, 0, 0 )) == NULL ) {
if ( default_referral ) {
struct berval **ref = referral_rewrite( default_referral,
NULL, pdn->bv_val, LDAP_SCOPE_DEFAULT );
NULL, pdn, LDAP_SCOPE_DEFAULT );