mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-28 10:39:34 -05:00
frontend stuff moved into a database structure, essentially to allow overlays to be processed before database selection; passes all tests (ITS#3080)
This commit is contained in:
parent
fa880d42e4
commit
cd9a9c628d
24 changed files with 635 additions and 348 deletions
|
|
@ -35,7 +35,7 @@ SRCS = main.c globals.c config.c daemon.c \
|
|||
oidm.c starttls.c index.c sets.c referral.c root_dse.c \
|
||||
sasl.c module.c mra.c mods.c sl_malloc.c limits.c \
|
||||
backglue.c operational.c matchedValues.c cancel.c syncrepl.c \
|
||||
backover.c ctxcsn.c ldapsync.c sessionlog.c \
|
||||
backover.c ctxcsn.c ldapsync.c sessionlog.c frontend.c \
|
||||
slapadd.c slapcat.c slapcommon.c slapdn.c slapindex.c \
|
||||
slappasswd.c slaptest.c slapauth.c slapacl.c \
|
||||
$(@PLAT@_SRCS)
|
||||
|
|
@ -52,7 +52,7 @@ OBJS = main.o globals.o config.o daemon.o \
|
|||
oidm.o starttls.o index.o sets.o referral.o root_dse.o \
|
||||
sasl.o module.o mra.o mods.o sl_malloc.o limits.o \
|
||||
backglue.o operational.o matchedValues.o cancel.o syncrepl.o \
|
||||
backover.o ctxcsn.o ldapsync.o sessionlog.o \
|
||||
backover.o ctxcsn.o ldapsync.o sessionlog.o frontend.o \
|
||||
slapadd.o slapcat.o slapcommon.o slapdn.o slapindex.o \
|
||||
slappasswd.o slaptest.o slapauth.o slapacl.o \
|
||||
$(@PLAT@_OBJS)
|
||||
|
|
|
|||
|
|
@ -112,6 +112,12 @@ do_abandon( Operation *op, SlapReply *rs )
|
|||
|
||||
done:
|
||||
op->orn_msgid = id;
|
||||
|
||||
if ( frontendDB->be_abandon ) {
|
||||
op->o_bd = frontendDB;
|
||||
frontendDB->be_abandon( op, rs );
|
||||
}
|
||||
|
||||
for ( i = 0; i < nbackends; i++ ) {
|
||||
op->o_bd = &backends[i];
|
||||
if( op->o_bd->be_abandon ) op->o_bd->be_abandon( op, rs );
|
||||
|
|
@ -129,3 +135,4 @@ done:
|
|||
#endif
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -224,7 +224,7 @@ access_allowed_mask(
|
|||
/*
|
||||
* FIXME: experimental; use first backend rules
|
||||
* iff there is no global_acl (ITS#3100) */
|
||||
if ( global_acl == NULL )
|
||||
if ( frontendDB->be_acl == NULL )
|
||||
#endif
|
||||
{
|
||||
op->o_bd = be;
|
||||
|
|
@ -312,20 +312,20 @@ access_allowed_mask(
|
|||
#ifdef notdef
|
||||
/* be is always non-NULL */
|
||||
/* use global default access if no global acls */
|
||||
} else if ( be == NULL && global_acl == NULL ) {
|
||||
} else if ( be == NULL && frontendDB->be_acl == NULL ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( ACL, DETAIL1,
|
||||
"access_allowed: global default %s access %s to \"%s\"\n",
|
||||
access2str( access ),
|
||||
global_default_access >= access ? "granted" : "denied",
|
||||
frontendDB->be_dfltaccess >= access ? "granted" : "denied",
|
||||
op->o_dn.bv_val );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ACL,
|
||||
"=> access_allowed: global default %s access %s to \"%s\"\n",
|
||||
access2str( access ),
|
||||
global_default_access >= access ? "granted" : "denied", op->o_dn.bv_val );
|
||||
frontendDB->be_dfltaccess >= access ? "granted" : "denied", op->o_dn.bv_val );
|
||||
#endif
|
||||
ret = global_default_access >= access;
|
||||
ret = frontendDB->be_dfltaccess >= access;
|
||||
|
||||
if ( maskp ) {
|
||||
int i;
|
||||
|
|
@ -496,7 +496,7 @@ acl_get(
|
|||
|
||||
if( a == NULL ) {
|
||||
if( op->o_bd == NULL ) {
|
||||
a = global_acl;
|
||||
a = frontendDB->be_acl;
|
||||
} else {
|
||||
a = op->o_bd->be_acl;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1573,7 +1573,7 @@ parse_acl(
|
|||
#endif /* LDAP_DEVEL */
|
||||
acl_append( &be->be_acl, a );
|
||||
} else {
|
||||
acl_append( &global_acl, a );
|
||||
acl_append( &frontendDB->be_acl, a );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,14 +47,13 @@ do_add( Operation *op, SlapReply *rs )
|
|||
{
|
||||
BerElement *ber = op->o_ber;
|
||||
char *last;
|
||||
struct berval dn = BER_BVNULL;
|
||||
struct berval dn = BER_BVNULL;
|
||||
ber_len_t len;
|
||||
ber_tag_t tag;
|
||||
Entry *e;
|
||||
Modifications *modlist = NULL;
|
||||
Modifications **modtail = &modlist;
|
||||
Modifications tmp;
|
||||
int manageDSAit;
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ENTRY, "do_add: conn %d enter\n", op->o_connid,0,0 );
|
||||
|
|
@ -197,12 +196,45 @@ do_add( Operation *op, SlapReply *rs )
|
|||
"root DSE already exists" );
|
||||
goto done;
|
||||
|
||||
} else if ( bvmatch( &e->e_nname, &global_schemandn ) ) {
|
||||
} else if ( bvmatch( &e->e_nname, &frontendDB->be_schemandn ) ) {
|
||||
send_ldap_error( op, rs, LDAP_ALREADY_EXISTS,
|
||||
"subschema subentry already exists" );
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* temporary; remove if not invoking backend function */
|
||||
op->ora_e = e;
|
||||
op->ora_modlist = modlist;
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_add( op, rs );
|
||||
if ( rs->sr_err == 0 ) {
|
||||
e = NULL;
|
||||
}
|
||||
|
||||
done:;
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
if( modlist != NULL ) {
|
||||
slap_mods_free( modlist );
|
||||
}
|
||||
if( e != NULL ) {
|
||||
entry_free( e );
|
||||
}
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_op_add( Operation *op, SlapReply *rs )
|
||||
{
|
||||
int manageDSAit;
|
||||
Entry *e = op->ora_e;
|
||||
Modifications *modlist = op->ora_modlist;
|
||||
Modifications **modtail = &modlist;
|
||||
|
||||
manageDSAit = get_manageDSAit( op );
|
||||
|
||||
/*
|
||||
|
|
@ -241,7 +273,7 @@ do_add( Operation *op, SlapReply *rs )
|
|||
}
|
||||
|
||||
#ifdef LDAP_SLAPI
|
||||
if ( op->o_pb ) init_add_pblock( op, &dn, e, manageDSAit );
|
||||
if ( op->o_pb ) init_add_pblock( op, &op->o_req_dn, e, manageDSAit );
|
||||
#endif /* LDAP_SLAPI */
|
||||
|
||||
/*
|
||||
|
|
@ -382,18 +414,7 @@ do_add( Operation *op, SlapReply *rs )
|
|||
if ( op->o_pb ) call_add_postop_plugins( op );
|
||||
#endif /* LDAP_SLAPI */
|
||||
|
||||
done:
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
if( modlist != NULL ) {
|
||||
slap_mods_free( modlist );
|
||||
}
|
||||
if( e != NULL ) {
|
||||
entry_free( e );
|
||||
}
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
|
||||
done:;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -126,8 +126,8 @@ monitor_subsys_database_init(
|
|||
return( -1 );
|
||||
}
|
||||
|
||||
(void)init_readOnly( mi, e_database, global_restrictops );
|
||||
(void)init_restrictedOperation( mi, e_database, global_restrictops );
|
||||
(void)init_readOnly( mi, e_database, frontendDB->be_restrictops );
|
||||
(void)init_restrictedOperation( mi, e_database, frontendDB->be_restrictops );
|
||||
|
||||
e_tmp = NULL;
|
||||
for ( i = nBackendDB; i--; ) {
|
||||
|
|
|
|||
|
|
@ -357,6 +357,23 @@ int backend_startup(Backend *be)
|
|||
return backend_startup_one( be );
|
||||
}
|
||||
|
||||
/* open frontend, if required */
|
||||
if ( frontendDB->bd_info->bi_db_open ) {
|
||||
rc = frontendDB->bd_info->bi_db_open( frontendDB );
|
||||
if ( rc != 0 ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( BACKEND, CRIT,
|
||||
"backend_startup: bi_db_open(frontend) failed! (%d)\n",
|
||||
rc, 0, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY,
|
||||
"backend_startup: bi_db_open(frontend) failed! (%d)\n",
|
||||
rc, 0, 0 );
|
||||
#endif
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
/* open each backend type */
|
||||
for( i = 0; i < nBackendInfo; i++ ) {
|
||||
if( backendInfo[i].bi_nDB == 0) {
|
||||
|
|
@ -401,7 +418,7 @@ int backend_startup(Backend *be)
|
|||
#endif
|
||||
}
|
||||
/* append global access controls */
|
||||
acl_append( &backendDB[i].be_acl, global_acl );
|
||||
acl_append( &backendDB[i].be_acl, frontendDB->be_acl );
|
||||
|
||||
rc = backend_startup_one( &backendDB[i] );
|
||||
|
||||
|
|
@ -485,11 +502,11 @@ int backend_shutdown( Backend *be )
|
|||
if(rc != 0) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( BACKEND, NOTICE,
|
||||
"backend_shutdown: bi_close %s failed!\n",
|
||||
"backend_shutdown: bi_db_close %s failed!\n",
|
||||
backendDB[i].be_type, 0, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY,
|
||||
"backend_close: bi_close %s failed!\n",
|
||||
"backend_close: bi_db_close %s failed!\n",
|
||||
backendDB[i].be_type, 0, 0 );
|
||||
#endif
|
||||
}
|
||||
|
|
@ -508,6 +525,22 @@ int backend_shutdown( Backend *be )
|
|||
}
|
||||
}
|
||||
|
||||
/* close frontend, if required */
|
||||
if ( frontendDB->bd_info->bi_db_close ) {
|
||||
rc = frontendDB->bd_info->bi_db_close ( frontendDB );
|
||||
if ( rc != 0 ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( BACKEND, CRIT,
|
||||
"backend_startup: bi_db_close(frontend) failed! (%d)\n",
|
||||
rc, 0, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY,
|
||||
"backend_startup: bi_db_close(frontend) failed! (%d)\n",
|
||||
rc, 0, 0 );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -529,7 +562,7 @@ int backend_destroy(void)
|
|||
if ( bd->be_rootndn.bv_val ) free( bd->be_rootndn.bv_val );
|
||||
if ( bd->be_rootpw.bv_val ) free( bd->be_rootpw.bv_val );
|
||||
if ( bd->be_context_csn.bv_val ) free( bd->be_context_csn.bv_val );
|
||||
acl_destroy( bd->be_acl, global_acl );
|
||||
acl_destroy( bd->be_acl, frontendDB->be_acl );
|
||||
}
|
||||
free( backendDB );
|
||||
|
||||
|
|
@ -550,6 +583,18 @@ int backend_destroy(void)
|
|||
nBackendInfo = 0;
|
||||
backendInfo = NULL;
|
||||
|
||||
/* destroy frontend database */
|
||||
bd = frontendDB;
|
||||
if ( bd->bd_info->bi_db_destroy ) {
|
||||
bd->bd_info->bi_db_destroy( bd );
|
||||
}
|
||||
ber_bvarray_free( bd->be_suffix );
|
||||
ber_bvarray_free( bd->be_nsuffix );
|
||||
if ( bd->be_rootdn.bv_val ) free( bd->be_rootdn.bv_val );
|
||||
if ( bd->be_rootndn.bv_val ) free( bd->be_rootndn.bv_val );
|
||||
if ( bd->be_rootpw.bv_val ) free( bd->be_rootpw.bv_val );
|
||||
acl_destroy( bd->be_acl, frontendDB->be_acl );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -590,12 +635,12 @@ backend_db_init(
|
|||
be = &backends[nbackends++];
|
||||
|
||||
be->bd_info = bi;
|
||||
be->be_def_limit = deflimit;
|
||||
be->be_dfltaccess = global_default_access;
|
||||
be->be_def_limit = frontendDB->be_def_limit;
|
||||
be->be_dfltaccess = frontendDB->be_dfltaccess;
|
||||
|
||||
be->be_restrictops = global_restrictops;
|
||||
be->be_requires = global_requires;
|
||||
be->be_ssf_set = global_ssf_set;
|
||||
be->be_restrictops = frontendDB->be_restrictops;
|
||||
be->be_requires = frontendDB->be_requires;
|
||||
be->be_ssf_set = frontendDB->be_ssf_set;
|
||||
|
||||
be->be_context_csn.bv_len = 0;
|
||||
be->be_context_csn.bv_val = NULL;
|
||||
|
|
@ -631,6 +676,10 @@ be_db_close( void )
|
|||
(*backends[i].bd_info->bi_db_close)( &backends[i] );
|
||||
}
|
||||
}
|
||||
|
||||
if ( frontendDB->bd_info->bi_db_close ) {
|
||||
(*frontendDB->bd_info->bi_db_close)( frontendDB );
|
||||
}
|
||||
}
|
||||
|
||||
Backend *
|
||||
|
|
@ -949,9 +998,9 @@ backend_check_restrictions(
|
|||
ssf = &op->o_bd->be_ssf_set;
|
||||
|
||||
} else {
|
||||
restrictops = global_restrictops;
|
||||
requires = global_requires;
|
||||
ssf = &global_ssf_set;
|
||||
restrictops = frontendDB->be_restrictops;
|
||||
requires = frontendDB->be_requires;
|
||||
ssf = &frontendDB->be_ssf_set;
|
||||
}
|
||||
|
||||
switch( op->o_tag ) {
|
||||
|
|
|
|||
|
|
@ -137,8 +137,7 @@ do_bind(
|
|||
tag = ber_scanf( ber, "m", &op->orb_cred );
|
||||
} else {
|
||||
tag = LDAP_TAG_LDAPCRED;
|
||||
op->orb_cred.bv_val = NULL;
|
||||
op->orb_cred.bv_len = 0;
|
||||
BER_BVZERO( &op->orb_cred );
|
||||
}
|
||||
|
||||
if ( tag != LBER_ERROR ) {
|
||||
|
|
@ -238,6 +237,38 @@ do_bind(
|
|||
op->o_conn->c_protocol = version;
|
||||
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
|
||||
|
||||
op->orb_tmp_mech = mech;
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_bind( op, rs );
|
||||
|
||||
cleanup:
|
||||
if ( rs->sr_err == LDAP_SUCCESS ) {
|
||||
if ( op->orb_method != LDAP_AUTH_SASL ) {
|
||||
ber_dupbv( &op->o_conn->c_authmech, &mech );
|
||||
}
|
||||
op->o_conn->c_authtype = op->orb_method;
|
||||
}
|
||||
|
||||
op->o_conn->c_sasl_bindop = NULL;
|
||||
|
||||
if( op->o_req_dn.bv_val != NULL ) {
|
||||
slap_sl_free( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
BER_BVZERO( &op->o_req_dn );
|
||||
}
|
||||
if( op->o_req_ndn.bv_val != NULL ) {
|
||||
slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
BER_BVZERO( &op->o_req_ndn );
|
||||
}
|
||||
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_op_bind( Operation *op, SlapReply *rs )
|
||||
{
|
||||
struct berval mech = op->orb_tmp_mech;
|
||||
|
||||
/* check for inappropriate controls */
|
||||
if( get_manageDSAit( op ) == SLAP_CRITICAL_CONTROL ) {
|
||||
send_ldap_error( op, rs,
|
||||
|
|
@ -250,14 +281,14 @@ do_bind(
|
|||
op->o_conn->c_sasl_bindop = op;
|
||||
|
||||
if ( op->orb_method == LDAP_AUTH_SASL ) {
|
||||
if ( version < LDAP_VERSION3 ) {
|
||||
if ( op->o_protocol < LDAP_VERSION3 ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, INFO,
|
||||
"do_bind: conn %d sasl with LDAPv%ld\n",
|
||||
op->o_connid, (unsigned long)version , 0 );
|
||||
op->o_connid, (unsigned long)op->o_protocol, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "do_bind: sasl with LDAPv%ld\n",
|
||||
(unsigned long) version, 0, 0 );
|
||||
(unsigned long)op->o_protocol, 0, 0 );
|
||||
#endif
|
||||
send_ldap_discon( op, rs,
|
||||
LDAP_PROTOCOL_ERROR, "SASL bind requires LDAPv3" );
|
||||
|
|
@ -350,8 +381,7 @@ do_bind(
|
|||
} else {
|
||||
if ( op->o_conn->c_sasl_bind_mech.bv_val ) {
|
||||
free( op->o_conn->c_sasl_bind_mech.bv_val );
|
||||
op->o_conn->c_sasl_bind_mech.bv_val = NULL;
|
||||
op->o_conn->c_sasl_bind_mech.bv_len = 0;
|
||||
BER_BVZERO( &op->o_conn->c_sasl_bind_mech );
|
||||
}
|
||||
op->o_conn->c_sasl_bind_in_progress = 0;
|
||||
}
|
||||
|
|
@ -367,7 +397,7 @@ do_bind(
|
|||
*/
|
||||
if ( pb ) {
|
||||
slapi_int_pblock_set_operation( pb, op );
|
||||
slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)op->o_req_dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_BIND_METHOD, (void *)op->orb_method );
|
||||
slapi_pblock_set( pb,
|
||||
SLAPI_BIND_CREDENTIALS, (void *)&op->orb_cred );
|
||||
|
|
@ -387,8 +417,7 @@ do_bind(
|
|||
|
||||
if ( op->o_conn->c_sasl_bind_mech.bv_val != NULL ) {
|
||||
free(op->o_conn->c_sasl_bind_mech.bv_val);
|
||||
op->o_conn->c_sasl_bind_mech.bv_val = NULL;
|
||||
op->o_conn->c_sasl_bind_mech.bv_len = 0;
|
||||
BER_BVZERO( &op->o_conn->c_sasl_bind_mech );
|
||||
}
|
||||
op->o_conn->c_sasl_bind_in_progress = 0;
|
||||
|
||||
|
|
@ -433,10 +462,10 @@ do_bind(
|
|||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, DETAIL1,
|
||||
"do_bind: conn %d v%d anonymous bind\n",
|
||||
op->o_connid, version , 0 );
|
||||
op->o_connid, op->o_protocol, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_TRACE, "do_bind: v%d anonymous bind\n",
|
||||
version, 0, 0 );
|
||||
op->o_protocol, 0, 0 );
|
||||
#endif
|
||||
goto cleanup;
|
||||
|
||||
|
|
@ -449,11 +478,11 @@ do_bind(
|
|||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, INFO,
|
||||
"do_bind: conn %d v%d simple bind(%s) disallowed\n",
|
||||
op->o_connid, version, op->o_req_ndn.bv_val );
|
||||
op->o_connid, op->o_protocol, op->o_req_ndn.bv_val );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_TRACE,
|
||||
"do_bind: v%d simple bind(%s) disallowed\n",
|
||||
version, op->o_req_ndn.bv_val, 0 );
|
||||
op->o_protocol, op->o_req_ndn.bv_val, 0 );
|
||||
#endif
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
@ -470,11 +499,11 @@ do_bind(
|
|||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, DETAIL1,
|
||||
"do_bind: conn %d v%d Kerberos V4 (step 1) bind refused\n",
|
||||
op->o_connid, version , 0 );
|
||||
op->o_connid, op->o_protocol, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_TRACE,
|
||||
"do_bind: v%d Kerberos V4 (step 1) bind refused\n",
|
||||
version, 0, 0 );
|
||||
op->o_protocol, 0, 0 );
|
||||
#endif
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
@ -488,11 +517,11 @@ do_bind(
|
|||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, DETAIL1,
|
||||
"do_bind: conn %d v%d Kerberos V4 (step 2) bind refused\n",
|
||||
op->o_connid, version , 0 );
|
||||
op->o_connid, op->o_protocol, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_TRACE,
|
||||
"do_bind: v%d Kerberos V4 (step 2) bind refused\n",
|
||||
version, 0, 0 );
|
||||
op->o_protocol, 0, 0 );
|
||||
#endif
|
||||
goto cleanup;
|
||||
#endif
|
||||
|
|
@ -505,11 +534,11 @@ do_bind(
|
|||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, INFO,
|
||||
"do_bind: conn %ld v%d unknown authentication method (%ld)\n",
|
||||
op->o_connid, version, op->orb_method );
|
||||
op->o_connid, op->o_protocol, op->orb_method );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_TRACE,
|
||||
"do_bind: v%d unknown authentication method (%ld)\n",
|
||||
version, op->orb_method, 0 );
|
||||
op->o_protocol, op->orb_method, 0 );
|
||||
#endif
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
@ -550,7 +579,7 @@ do_bind(
|
|||
if ( pb ) {
|
||||
int rc;
|
||||
slapi_int_pblock_set_operation( pb, op );
|
||||
slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)op->o_req_dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_BIND_METHOD, (void *)op->orb_method );
|
||||
slapi_pblock_set( pb, SLAPI_BIND_CREDENTIALS, (void *)&op->orb_cred );
|
||||
slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)(0) );
|
||||
|
|
@ -588,13 +617,12 @@ do_bind(
|
|||
rs->sr_err = LDAP_OTHER;
|
||||
}
|
||||
|
||||
op->orb_edn.bv_val = NULL;
|
||||
op->orb_edn.bv_len = 0;
|
||||
BER_BVZERO( &op->orb_edn );
|
||||
|
||||
if ( rs->sr_err == LDAP_SUCCESS ) {
|
||||
slapi_pblock_get( pb, SLAPI_CONN_DN,
|
||||
(void *)&op->orb_edn.bv_val );
|
||||
if ( op->orb_edn.bv_val == NULL ) {
|
||||
if ( BER_BVISNULL( &op->orb_edn ) ) {
|
||||
if ( rc == 1 ) {
|
||||
/* No plugins were called; continue. */
|
||||
break;
|
||||
|
|
@ -608,11 +636,9 @@ do_bind(
|
|||
ber_dupbv(&op->o_conn->c_dn, &op->o_req_dn);
|
||||
ber_dupbv(&op->o_conn->c_ndn, &op->o_req_ndn);
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_req_dn.bv_val = NULL;
|
||||
op->o_req_dn.bv_len = 0;
|
||||
BER_BVZERO( &op->o_req_dn );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
op->o_req_ndn.bv_val = NULL;
|
||||
op->o_req_ndn.bv_len = 0;
|
||||
BER_BVZERO( &op->o_req_ndn );
|
||||
if ( op->o_conn->c_dn.bv_len != 0 ) {
|
||||
ber_len_t max = sockbuf_max_incoming_auth;
|
||||
ber_sockbuf_ctrl( op->o_conn->c_sb,
|
||||
|
|
@ -667,11 +693,11 @@ do_bind(
|
|||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, DETAIL1,
|
||||
"do_bind: v%d bind: \"%s\" to \"%s\" \n",
|
||||
version, op->o_conn->c_dn.bv_val, op->o_conn->c_dn.bv_val );
|
||||
op->o_protocol, op->o_conn->c_dn.bv_val, op->o_conn->c_dn.bv_val );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_TRACE,
|
||||
"do_bind: v%d bind: \"%s\" to \"%s\"\n",
|
||||
version, dn.bv_val, op->o_conn->c_dn.bv_val );
|
||||
op->o_protocol, op->o_req_dn.bv_val, op->o_conn->c_dn.bv_val );
|
||||
#endif
|
||||
|
||||
ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
|
||||
|
|
@ -704,24 +730,7 @@ do_bind(
|
|||
}
|
||||
#endif /* LDAP_SLAPI */
|
||||
|
||||
cleanup:
|
||||
if ( rs->sr_err == LDAP_SUCCESS ) {
|
||||
if ( op->orb_method != LDAP_AUTH_SASL ) {
|
||||
ber_dupbv( &op->o_conn->c_authmech, &mech );
|
||||
}
|
||||
op->o_conn->c_authtype = op->orb_method;
|
||||
}
|
||||
|
||||
op->o_conn->c_sasl_bindop = NULL;
|
||||
|
||||
if( op->o_req_dn.bv_val != NULL ) {
|
||||
slap_sl_free( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_req_dn.bv_val = NULL;
|
||||
}
|
||||
if( op->o_req_ndn.bv_val != NULL ) {
|
||||
slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
op->o_req_ndn.bv_val = NULL;
|
||||
}
|
||||
|
||||
cleanup:;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,12 +45,10 @@ do_compare(
|
|||
Operation *op,
|
||||
SlapReply *rs )
|
||||
{
|
||||
Entry *entry = NULL;
|
||||
struct berval dn = BER_BVNULL;
|
||||
struct berval desc = BER_BVNULL;
|
||||
struct berval value = BER_BVNULL;
|
||||
AttributeAssertion ava = { NULL, BER_BVNULL };
|
||||
int manageDSAit;
|
||||
|
||||
ava.aa_desc = NULL;
|
||||
|
||||
|
|
@ -144,6 +142,28 @@ do_compare(
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
op->orc_ava = &ava;
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_compare( op, rs );
|
||||
|
||||
cleanup:;
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
if ( ava.aa_value.bv_val ) {
|
||||
op->o_tmpfree( ava.aa_value.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_op_compare( Operation *op, SlapReply *rs )
|
||||
{
|
||||
Entry *entry = NULL;
|
||||
int manageDSAit;
|
||||
AttributeAssertion ava = *op->orc_ava;
|
||||
|
||||
if( strcasecmp( op->o_req_ndn.bv_val, LDAP_ROOT_DSE ) == 0 ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ARGS,
|
||||
|
|
@ -173,7 +193,7 @@ do_compare(
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
} else if ( bvmatch( &op->o_req_ndn, &global_schemandn ) ) {
|
||||
} else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ARGS,
|
||||
"do_compare: dn (%s) attr(%s) value (%s)\n",
|
||||
|
|
@ -270,10 +290,10 @@ do_compare(
|
|||
#define pb op->o_pb
|
||||
if ( pb ) {
|
||||
slapi_int_pblock_set_operation( pb, op );
|
||||
slapi_pblock_set( pb, SLAPI_COMPARE_TARGET, (void *)dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_COMPARE_TARGET, (void *)op->o_req_dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit );
|
||||
slapi_pblock_set( pb, SLAPI_COMPARE_TYPE, (void *)desc.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_COMPARE_VALUE, (void *)&value );
|
||||
slapi_pblock_set( pb, SLAPI_COMPARE_TYPE, (void *)ava.aa_desc->ad_cname.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_COMPARE_VALUE, (void *)&ava.aa_value );
|
||||
|
||||
rs->sr_err = slapi_int_call_plugins( op->o_bd,
|
||||
SLAPI_PLUGIN_PRE_COMPARE_FN, pb );
|
||||
|
|
@ -323,12 +343,7 @@ do_compare(
|
|||
}
|
||||
#endif /* defined( LDAP_SLAPI ) */
|
||||
|
||||
cleanup:
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
if ( ava.aa_value.bv_val ) {
|
||||
op->o_tmpfree( ava.aa_value.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
cleanup:;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,25 +46,8 @@
|
|||
/*
|
||||
* defaults for various global variables
|
||||
*/
|
||||
struct slap_limits_set deflimit = {
|
||||
SLAPD_DEFAULT_TIMELIMIT, /* backward compatible limits */
|
||||
0,
|
||||
|
||||
SLAPD_DEFAULT_SIZELIMIT, /* backward compatible limits */
|
||||
0,
|
||||
-1, /* no limit on unchecked size */
|
||||
0, /* page limit */
|
||||
0, /* hide number of entries left */
|
||||
0 /* number of total entries returned by pagedResults equal to hard limit */
|
||||
};
|
||||
|
||||
AccessControl *global_acl = NULL;
|
||||
slap_access_t global_default_access = ACL_READ;
|
||||
slap_mask_t global_restrictops = 0;
|
||||
slap_mask_t global_allows = 0;
|
||||
slap_mask_t global_disallows = 0;
|
||||
slap_mask_t global_requires = 0;
|
||||
slap_ssf_set_t global_ssf_set;
|
||||
char *replogfile;
|
||||
int global_gentlehup = 0;
|
||||
int global_idletimeout = 0;
|
||||
|
|
@ -77,8 +60,6 @@ char **cargv;
|
|||
struct berval default_search_base = BER_BVNULL;
|
||||
struct berval default_search_nbase = BER_BVNULL;
|
||||
unsigned num_subordinates = 0;
|
||||
struct berval global_schemadn = BER_BVNULL;
|
||||
struct berval global_schemandn = BER_BVNULL;
|
||||
|
||||
ber_len_t sockbuf_max_incoming = SLAP_SB_MAX_INCOMING_DEFAULT;
|
||||
ber_len_t sockbuf_max_incoming_auth= SLAP_SB_MAX_INCOMING_AUTH;
|
||||
|
|
@ -747,8 +728,8 @@ read_config( const char *fname, int depth )
|
|||
rc = dnPrettyNormal( NULL, &dn, &be->be_schemadn,
|
||||
&be->be_schemandn, NULL );
|
||||
} else {
|
||||
rc = dnPrettyNormal( NULL, &dn, &global_schemadn,
|
||||
&global_schemandn, NULL );
|
||||
rc = dnPrettyNormal( NULL, &dn, &frontendDB->be_schemadn,
|
||||
&frontendDB->be_schemandn, NULL );
|
||||
}
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
#ifdef NEW_LOGGING
|
||||
|
|
@ -818,7 +799,7 @@ read_config( const char *fname, int depth )
|
|||
}
|
||||
|
||||
if ( be == NULL ) {
|
||||
lim = &deflimit;
|
||||
lim = &frontendDB->be_def_limit;
|
||||
} else {
|
||||
lim = &be->be_def_limit;
|
||||
}
|
||||
|
|
@ -896,7 +877,7 @@ read_config( const char *fname, int depth )
|
|||
}
|
||||
|
||||
if ( be == NULL ) {
|
||||
lim = &deflimit;
|
||||
lim = &frontendDB->be_def_limit;
|
||||
} else {
|
||||
lim = &be->be_def_limit;
|
||||
}
|
||||
|
|
@ -995,16 +976,20 @@ read_config( const char *fname, int depth )
|
|||
/* add an overlay to this backend */
|
||||
} else if ( strcasecmp( cargv[0], "overlay" ) == 0 ) {
|
||||
if ( be == NULL ) {
|
||||
if ( cargv[1][0] == '-' && overlay_config( frontendDB, &cargv[1][1] ) ) {
|
||||
/* log error */
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( CONFIG, INFO, "%s: line %d: "
|
||||
"overlay keyword must appear inside a database "
|
||||
"definition.\n", fname, lineno, 0 );
|
||||
LDAP_LOG( CONFIG, INFO, "%s: line %d: "
|
||||
"(optional) global overlay \"%s\" configuration "
|
||||
"failed (ignored)\n", fname, lineno, &cargv[1][1] );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "%s: line %d: overlay keyword "
|
||||
"must appear inside a database definition.\n",
|
||||
fname, lineno, 0 );
|
||||
Debug( LDAP_DEBUG_ANY, "%s: line %d: "
|
||||
"(optional) global overlay \"%s\" configuration "
|
||||
"failed (ignored)\n", fname, lineno, &cargv[1][1] );
|
||||
#endif
|
||||
return 1;
|
||||
} else if ( overlay_config( frontendDB, cargv[1] ) ) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
} else {
|
||||
if ( cargv[1][0] == '-' && overlay_config( be, &cargv[1][1] ) ) {
|
||||
|
|
@ -1326,10 +1311,11 @@ read_config( const char *fname, int depth )
|
|||
}
|
||||
if ( be == NULL ) {
|
||||
if ( strcasecmp( cargv[1], "on" ) == 0 ) {
|
||||
global_restrictops |= SLAP_RESTRICT_OP_WRITES;
|
||||
frontendDB->be_restrictops |= SLAP_RESTRICT_OP_WRITES;
|
||||
} else {
|
||||
global_restrictops &= ~SLAP_RESTRICT_OP_WRITES;
|
||||
frontendDB->be_restrictops &= ~SLAP_RESTRICT_OP_WRITES;
|
||||
}
|
||||
|
||||
} else {
|
||||
if ( strcasecmp( cargv[1], "on" ) == 0 ) {
|
||||
be->be_restrictops |= SLAP_RESTRICT_OP_WRITES;
|
||||
|
|
@ -1442,7 +1428,7 @@ restrict_unknown:;
|
|||
}
|
||||
|
||||
if ( be == NULL ) {
|
||||
global_restrictops |= restrict;
|
||||
frontendDB->be_restrictops |= restrict;
|
||||
|
||||
} else {
|
||||
be->be_restrictops |= restrict;
|
||||
|
|
@ -1637,7 +1623,7 @@ restrict_unknown:;
|
|||
}
|
||||
|
||||
if ( be == NULL ) {
|
||||
global_requires = requires;
|
||||
frontendDB->be_requires = requires;
|
||||
} else {
|
||||
be->be_requires = requires;
|
||||
}
|
||||
|
|
@ -1661,7 +1647,7 @@ restrict_unknown:;
|
|||
}
|
||||
|
||||
if ( be == NULL ) {
|
||||
set = &global_ssf_set;
|
||||
set = &frontendDB->be_ssf_set;
|
||||
} else {
|
||||
set = &be->be_ssf_set;
|
||||
}
|
||||
|
|
@ -2810,17 +2796,30 @@ restrict_unknown:;
|
|||
}
|
||||
|
||||
} else {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( CONFIG, INFO,
|
||||
"%s: line %d: unknown directive \"%s\" outside backend "
|
||||
"info and database definitions (ignored).\n",
|
||||
fname, lineno, cargv[0] );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY,
|
||||
"%s: line %d: unknown directive \"%s\" outside backend info and database definitions (ignored)\n",
|
||||
fname, lineno, cargv[0] );
|
||||
#endif
|
||||
if ( frontendDB->be_config ) {
|
||||
rc = (*frontendDB->be_config)( frontendDB, fname, lineno, cargc, cargv );
|
||||
|
||||
switch ( rc ) {
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case SLAP_CONF_UNKNOWN:
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( CONFIG, INFO,
|
||||
"%s: line %d: unknown directive \"%s\" inside "
|
||||
"global database definition (ignored).\n",
|
||||
fname, lineno, cargv[0] );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY,
|
||||
"%s: line %d: unknown directive \"%s\" inside global database definition (ignored)\n",
|
||||
fname, lineno, cargv[0] );
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
free( saveline );
|
||||
|
|
@ -2829,10 +2828,10 @@ restrict_unknown:;
|
|||
|
||||
if ( depth == 0 ) ch_free( cargv );
|
||||
|
||||
if ( !global_schemadn.bv_val ) {
|
||||
if ( BER_BVISNULL( &frontendDB->be_schemadn ) ) {
|
||||
ber_str2bv( SLAPD_SCHEMA_DN, sizeof(SLAPD_SCHEMA_DN)-1, 1,
|
||||
&global_schemadn );
|
||||
dnNormalize( 0, NULL, NULL, &global_schemadn, &global_schemandn, NULL );
|
||||
&frontendDB->be_schemadn );
|
||||
dnNormalize( 0, NULL, NULL, &frontendDB->be_schemadn, &frontendDB->be_schemandn, NULL );
|
||||
}
|
||||
|
||||
if ( load_ucdata( NULL ) < 0 ) return 1;
|
||||
|
|
@ -3059,8 +3058,8 @@ void
|
|||
config_destroy( )
|
||||
{
|
||||
ucdata_unload( UCDATA_ALL );
|
||||
free( global_schemandn.bv_val );
|
||||
free( global_schemadn.bv_val );
|
||||
free( frontendDB->be_schemandn.bv_val );
|
||||
free( frontendDB->be_schemadn.bv_val );
|
||||
free( line );
|
||||
if ( slapd_args_file )
|
||||
free ( slapd_args_file );
|
||||
|
|
@ -3068,7 +3067,7 @@ config_destroy( )
|
|||
free ( slapd_pid_file );
|
||||
if ( default_passwd_hash )
|
||||
ldap_charray_free( default_passwd_hash );
|
||||
acl_destroy( global_acl, NULL );
|
||||
acl_destroy( frontendDB->be_acl, NULL );
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
|||
|
|
@ -463,24 +463,18 @@ long connection_init(
|
|||
c->c_send_ldap_intermediate = slap_send_ldap_intermediate;
|
||||
#endif
|
||||
|
||||
c->c_authmech.bv_val = NULL;
|
||||
c->c_authmech.bv_len = 0;
|
||||
c->c_dn.bv_val = NULL;
|
||||
c->c_dn.bv_len = 0;
|
||||
c->c_ndn.bv_val = NULL;
|
||||
c->c_ndn.bv_len = 0;
|
||||
BER_BVZERO( &c->c_authmech );
|
||||
BER_BVZERO( &c->c_dn );
|
||||
BER_BVZERO( &c->c_ndn );
|
||||
|
||||
c->c_listener = NULL;
|
||||
c->c_peer_domain.bv_val = NULL;
|
||||
c->c_peer_domain.bv_len = 0;
|
||||
c->c_peer_name.bv_val = NULL;
|
||||
c->c_peer_name.bv_len = 0;
|
||||
BER_BVZERO( &c->c_peer_domain );
|
||||
BER_BVZERO( &c->c_peer_name );
|
||||
|
||||
LDAP_STAILQ_INIT(&c->c_ops);
|
||||
LDAP_STAILQ_INIT(&c->c_pending_ops);
|
||||
|
||||
c->c_sasl_bind_mech.bv_val = NULL;
|
||||
c->c_sasl_bind_mech.bv_len = 0;
|
||||
BER_BVZERO( &c->c_sasl_bind_mech );
|
||||
c->c_sasl_done = 0;
|
||||
c->c_sasl_authctx = NULL;
|
||||
c->c_sasl_sockctx = NULL;
|
||||
|
|
@ -513,15 +507,15 @@ long connection_init(
|
|||
ldap_pvt_thread_mutex_lock( &c->c_mutex );
|
||||
|
||||
assert( c->c_struct_state == SLAP_C_UNUSED );
|
||||
assert( c->c_authmech.bv_val == NULL );
|
||||
assert( c->c_dn.bv_val == NULL );
|
||||
assert( c->c_ndn.bv_val == NULL );
|
||||
assert( BER_BVISNULL( &c->c_authmech ) );
|
||||
assert( BER_BVISNULL( &c->c_dn ) );
|
||||
assert( BER_BVISNULL( &c->c_ndn ) );
|
||||
assert( c->c_listener == NULL );
|
||||
assert( c->c_peer_domain.bv_val == NULL );
|
||||
assert( c->c_peer_name.bv_val == NULL );
|
||||
assert( BER_BVISNULL( &c->c_peer_domain ) );
|
||||
assert( BER_BVISNULL( &c->c_peer_name ) );
|
||||
assert( LDAP_STAILQ_EMPTY(&c->c_ops) );
|
||||
assert( LDAP_STAILQ_EMPTY(&c->c_pending_ops) );
|
||||
assert( c->c_sasl_bind_mech.bv_val == NULL );
|
||||
assert( BER_BVISNULL( &c->c_sasl_bind_mech ) );
|
||||
assert( c->c_sasl_done == 0 );
|
||||
assert( c->c_sasl_authctx == NULL );
|
||||
assert( c->c_sasl_sockctx == NULL );
|
||||
|
|
@ -648,20 +642,17 @@ void connection2anonymous( Connection *c )
|
|||
|
||||
if(c->c_authmech.bv_val != NULL ) {
|
||||
free(c->c_authmech.bv_val);
|
||||
c->c_authmech.bv_val = NULL;
|
||||
}
|
||||
c->c_authmech.bv_len = 0;
|
||||
BER_BVZERO( &c->c_authmech );
|
||||
|
||||
if(c->c_dn.bv_val != NULL) {
|
||||
free(c->c_dn.bv_val);
|
||||
c->c_dn.bv_val = NULL;
|
||||
}
|
||||
c->c_dn.bv_len = 0;
|
||||
BER_BVZERO( &c->c_dn );
|
||||
if(c->c_ndn.bv_val != NULL) {
|
||||
free(c->c_ndn.bv_val);
|
||||
c->c_ndn.bv_val = NULL;
|
||||
}
|
||||
c->c_ndn.bv_len = 0;
|
||||
BER_BVZERO( &c->c_ndn );
|
||||
|
||||
c->c_authz_backend = NULL;
|
||||
}
|
||||
|
|
@ -695,21 +686,18 @@ connection_destroy( Connection *c )
|
|||
|
||||
if(c->c_peer_domain.bv_val != NULL) {
|
||||
free(c->c_peer_domain.bv_val);
|
||||
c->c_peer_domain.bv_val = NULL;
|
||||
}
|
||||
c->c_peer_domain.bv_len = 0;
|
||||
BER_BVZERO( &c->c_peer_domain );
|
||||
if(c->c_peer_name.bv_val != NULL) {
|
||||
free(c->c_peer_name.bv_val);
|
||||
c->c_peer_name.bv_val = NULL;
|
||||
}
|
||||
c->c_peer_name.bv_len = 0;
|
||||
BER_BVZERO( &c->c_peer_name );
|
||||
|
||||
c->c_sasl_bind_in_progress = 0;
|
||||
if(c->c_sasl_bind_mech.bv_val != NULL) {
|
||||
free(c->c_sasl_bind_mech.bv_val);
|
||||
c->c_sasl_bind_mech.bv_val = NULL;
|
||||
}
|
||||
c->c_sasl_bind_mech.bv_len = 0;
|
||||
BER_BVZERO( &c->c_sasl_bind_mech );
|
||||
|
||||
slap_sasl_close( c );
|
||||
|
||||
|
|
|
|||
|
|
@ -1305,7 +1305,7 @@ slapd_daemon_task(
|
|||
if( slapd_gentle_shutdown == 1 ) {
|
||||
Debug( LDAP_DEBUG_ANY, "slapd gentle shutdown\n", 0, 0, 0 );
|
||||
close_listeners( 1 );
|
||||
global_restrictops |= SLAP_RESTRICT_OP_WRITES;
|
||||
frontendDB->be_restrictops |= SLAP_RESTRICT_OP_WRITES;
|
||||
slapd_gentle_shutdown = 2;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,13 +45,6 @@ do_delete(
|
|||
SlapReply *rs )
|
||||
{
|
||||
struct berval dn = BER_BVNULL;
|
||||
struct berval pdn = BER_BVNULL;
|
||||
struct berval org_req_dn = BER_BVNULL;
|
||||
struct berval org_req_ndn = BER_BVNULL;
|
||||
struct berval org_dn = BER_BVNULL;
|
||||
struct berval org_ndn = BER_BVNULL;
|
||||
int org_managedsait;
|
||||
int manageDSAit;
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ENTRY,
|
||||
|
|
@ -115,7 +108,7 @@ do_delete(
|
|||
"cannot delete the root DSE" );
|
||||
goto cleanup;
|
||||
|
||||
} else if ( bvmatch( &op->o_req_ndn, &global_schemandn ) ) {
|
||||
} else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, INFO, "do_delete: conn %d: "
|
||||
"Attempt to delete subschema subentry.\n", op->o_connid, 0, 0 );
|
||||
|
|
@ -131,6 +124,23 @@ do_delete(
|
|||
Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu DEL dn=\"%s\"\n",
|
||||
op->o_connid, op->o_opid, op->o_req_dn.bv_val, 0, 0 );
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_delete( op, rs );
|
||||
|
||||
cleanup:;
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_op_delete( Operation *op, SlapReply *rs )
|
||||
{
|
||||
struct berval pdn = BER_BVNULL;
|
||||
int manageDSAit;
|
||||
|
||||
manageDSAit = get_manageDSAit( op );
|
||||
|
||||
/*
|
||||
|
|
@ -172,7 +182,7 @@ do_delete(
|
|||
#define pb op->o_pb
|
||||
if ( pb ) {
|
||||
slapi_int_pblock_set_operation( pb, op );
|
||||
slapi_pblock_set( pb, SLAPI_DELETE_TARGET, (void *)dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_DELETE_TARGET, (void *)op->o_req_dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit );
|
||||
|
||||
rs->sr_err = slapi_int_call_plugins( op->o_bd,
|
||||
|
|
@ -213,7 +223,12 @@ do_delete(
|
|||
if ( !SLAP_SHADOW(op->o_bd) || repl_user )
|
||||
#endif
|
||||
{
|
||||
slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
|
||||
struct berval org_req_dn = BER_BVNULL;
|
||||
struct berval org_req_ndn = BER_BVNULL;
|
||||
struct berval org_dn = BER_BVNULL;
|
||||
struct berval org_ndn = BER_BVNULL;
|
||||
int org_managedsait;
|
||||
slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
|
||||
|
||||
if ( !repl_user ) {
|
||||
struct berval csn = { 0 , NULL };
|
||||
|
|
@ -307,10 +322,6 @@ do_delete(
|
|||
}
|
||||
#endif /* defined( LDAP_SLAPI ) */
|
||||
|
||||
cleanup:
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
cleanup:;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -138,14 +138,6 @@ do_extended(
|
|||
struct berval reqdata = {0, NULL};
|
||||
ber_tag_t tag;
|
||||
ber_len_t len;
|
||||
struct extop_list *ext = NULL;
|
||||
|
||||
#if defined(LDAP_SLAPI)
|
||||
Slapi_PBlock *pb = op->o_pb;
|
||||
SLAPI_FUNC funcAddr = NULL;
|
||||
int extop_rc;
|
||||
int msg_sent = FALSE;
|
||||
#endif /* defined(LDAP_SLAPI) */
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ENTRY, "do_extended: conn %d\n", op->o_connid, 0, 0 );
|
||||
|
|
@ -179,26 +171,6 @@ do_extended(
|
|||
goto done;
|
||||
}
|
||||
|
||||
#ifdef LDAP_SLAPI
|
||||
slapi_int_get_extop_plugin( &op->ore_reqoid, &funcAddr ); /* NS-SLAPI extended operation */
|
||||
if( !funcAddr && !(ext = find_extop(supp_ext_list, &op->ore_reqoid )))
|
||||
#else
|
||||
if( !(ext = find_extop(supp_ext_list, &op->ore_reqoid )))
|
||||
#endif
|
||||
{
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
"do_extended: conn %d unsupported operation \"%s\"\n",
|
||||
op->o_connid, op->ore_reqoid.bv_val, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "do_extended: unsupported operation \"%s\"\n",
|
||||
op->ore_reqoid.bv_val, 0 ,0 );
|
||||
#endif
|
||||
send_ldap_error( op, rs, LDAP_PROTOCOL_ERROR,
|
||||
"unsupported extended operation" );
|
||||
goto done;
|
||||
}
|
||||
|
||||
tag = ber_peek_tag( op->o_ber, &len );
|
||||
|
||||
if( ber_peek_tag( op->o_ber, &len ) == LDAP_TAG_EXOP_REQ_VALUE ) {
|
||||
|
|
@ -234,6 +206,54 @@ do_extended(
|
|||
goto done;
|
||||
}
|
||||
|
||||
/* FIXME: temporary? */
|
||||
if ( reqdata.bv_val ) {
|
||||
op->ore_reqdata = &reqdata;
|
||||
}
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_extended( op, rs );
|
||||
done:
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_extended( Operation *op, SlapReply *rs )
|
||||
{
|
||||
struct extop_list *ext = NULL;
|
||||
struct berval reqdata = BER_BVNULL;
|
||||
|
||||
#if defined(LDAP_SLAPI)
|
||||
Slapi_PBlock *pb = op->o_pb;
|
||||
SLAPI_FUNC funcAddr = NULL;
|
||||
int extop_rc;
|
||||
int msg_sent = FALSE;
|
||||
#endif /* defined(LDAP_SLAPI) */
|
||||
|
||||
if (op->ore_reqdata) {
|
||||
reqdata = *op->ore_reqdata;
|
||||
}
|
||||
|
||||
#ifdef LDAP_SLAPI
|
||||
slapi_int_get_extop_plugin( &op->ore_reqoid, &funcAddr ); /* NS-SLAPI extended operation */
|
||||
if( !funcAddr && !(ext = find_extop(supp_ext_list, &op->ore_reqoid )))
|
||||
#else
|
||||
if( !(ext = find_extop(supp_ext_list, &op->ore_reqoid )))
|
||||
#endif
|
||||
{
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
"do_extended: conn %d unsupported operation \"%s\"\n",
|
||||
op->o_connid, op->ore_reqoid.bv_val, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "do_extended: unsupported operation \"%s\"\n",
|
||||
op->ore_reqoid.bv_val, 0 ,0 );
|
||||
#endif
|
||||
send_ldap_error( op, rs, LDAP_PROTOCOL_ERROR,
|
||||
"unsupported extended operation" );
|
||||
goto done;
|
||||
}
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, DETAIL1,
|
||||
"do_extended: conn %d oid=%s\n.", op->o_connid, op->ore_reqoid.bv_val, 0 );
|
||||
|
|
@ -303,7 +323,6 @@ done2:;
|
|||
}
|
||||
} else { /* start of OpenLDAP extended operation */
|
||||
#endif /* defined( LDAP_SLAPI ) */
|
||||
if (reqdata.bv_val) op->ore_reqdata = &reqdata;
|
||||
rs->sr_err = (ext->ext_main)( op, rs );
|
||||
|
||||
if( rs->sr_err != SLAPD_ABANDON ) {
|
||||
|
|
@ -336,7 +355,7 @@ done2:;
|
|||
} /* end of OpenLDAP extended operation */
|
||||
#endif /* LDAP_SLAPI */
|
||||
|
||||
done:
|
||||
done:;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
97
servers/slapd/frontend.c
Normal file
97
servers/slapd/frontend.c
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
/* frontend.c - routines for dealing with frontend */
|
||||
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
|
||||
*
|
||||
* Copyright 1998-2004 The OpenLDAP Foundation.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted only as authorized by the OpenLDAP
|
||||
* Public License.
|
||||
*
|
||||
* A copy of this license is available in the file LICENSE in the
|
||||
* top-level directory of the distribution or, alternatively, at
|
||||
* <http://www.OpenLDAP.org/license.html>.
|
||||
*/
|
||||
/* Portions Copyright (c) 1995 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
|
||||
|
||||
#include "portable.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <ac/string.h>
|
||||
#include <ac/socket.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "slap.h"
|
||||
#include "lutil.h"
|
||||
#include "lber_pvt.h"
|
||||
|
||||
#include "ldap_rq.h"
|
||||
|
||||
#ifdef LDAP_SLAPI
|
||||
#include "slapi/slapi.h"
|
||||
#endif
|
||||
|
||||
BackendInfo slap_frontendInfo;
|
||||
BackendDB slap_frontendDB;
|
||||
BackendDB *frontendDB;
|
||||
|
||||
int
|
||||
frontend_init( void )
|
||||
{
|
||||
/* data */
|
||||
frontendDB = &slap_frontendDB;
|
||||
|
||||
/* ACLs */
|
||||
frontendDB->be_dfltaccess = ACL_READ;
|
||||
|
||||
/* limits */
|
||||
frontendDB->be_def_limit.lms_t_soft = SLAPD_DEFAULT_TIMELIMIT; /* backward compatible limits */
|
||||
frontendDB->be_def_limit.lms_t_hard = 0;
|
||||
frontendDB->be_def_limit.lms_s_soft = SLAPD_DEFAULT_SIZELIMIT; /* backward compatible limits */
|
||||
frontendDB->be_def_limit.lms_s_hard = 0;
|
||||
frontendDB->be_def_limit.lms_s_unchecked = -1; /* no limit on unchecked size */
|
||||
frontendDB->be_def_limit.lms_s_pr = 0; /* page limit */
|
||||
frontendDB->be_def_limit.lms_s_pr_hide = 0; /* don't hide number of entries left */
|
||||
frontendDB->be_def_limit.lms_s_pr_total = 0; /* number of total entries returned by pagedResults equal to hard limit */
|
||||
|
||||
/* suffix */
|
||||
frontendDB->be_suffix = ch_calloc( 2, sizeof( struct berval ) );
|
||||
ber_str2bv( "", 0, 1, &frontendDB->be_suffix[0] );
|
||||
BER_BVZERO( &frontendDB->be_suffix[1] );
|
||||
frontendDB->be_nsuffix = ch_calloc( 2, sizeof( struct berval ) );
|
||||
ber_str2bv( "", 0, 1, &frontendDB->be_nsuffix[0] );
|
||||
BER_BVZERO( &frontendDB->be_nsuffix[1] );
|
||||
|
||||
/* info */
|
||||
frontendDB->bd_info = &slap_frontendInfo;
|
||||
|
||||
/* name */
|
||||
frontendDB->bd_info->bi_type = "frontend";
|
||||
|
||||
/* known controls */
|
||||
frontendDB->bd_info->bi_controls = slap_known_controls;
|
||||
|
||||
/* calls */
|
||||
frontendDB->bd_info->bi_op_add = fe_op_add;
|
||||
frontendDB->bd_info->bi_op_bind = fe_op_bind;
|
||||
frontendDB->bd_info->bi_op_compare = fe_op_compare;
|
||||
frontendDB->bd_info->bi_op_delete = fe_op_delete;
|
||||
frontendDB->bd_info->bi_op_modify = fe_op_modify;
|
||||
frontendDB->bd_info->bi_op_modrdn = fe_op_modrdn;
|
||||
frontendDB->bd_info->bi_op_search = fe_op_search;
|
||||
frontendDB->bd_info->bi_extended = fe_extended;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -656,6 +656,10 @@ unhandled_option:;
|
|||
}
|
||||
#endif /* LDAP_SLAPI */
|
||||
|
||||
if ( frontend_init() ) {
|
||||
goto destroy;
|
||||
}
|
||||
|
||||
if ( overlay_init() ) {
|
||||
goto destroy;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,14 +50,7 @@ do_modify(
|
|||
ber_len_t len;
|
||||
Modifications *modlist = NULL;
|
||||
Modifications **modtail = &modlist;
|
||||
#ifdef LDAP_DEBUG
|
||||
Modifications *tmp;
|
||||
#endif
|
||||
#ifdef LDAP_SLAPI
|
||||
LDAPMod **modv = NULL;
|
||||
#endif
|
||||
int manageDSAit;
|
||||
int increment = 0;
|
||||
int increment = 0;
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ENTRY, "do_modify: enter\n", 0, 0, 0 );
|
||||
|
|
@ -237,6 +230,37 @@ do_modify(
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
/* FIXME: temporary */
|
||||
op->orm_modlist = modlist;
|
||||
op->orm_increment = increment;
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_modify( op, rs );
|
||||
|
||||
cleanup:
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
if ( modlist != NULL ) slap_mods_free( modlist );
|
||||
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_op_modify( Operation *op, SlapReply *rs )
|
||||
{
|
||||
#ifdef LDAP_DEBUG
|
||||
Modifications *tmp;
|
||||
#endif
|
||||
int manageDSAit;
|
||||
Modifications *modlist = op->orm_modlist;
|
||||
Modifications **modtail = &modlist;
|
||||
#ifdef LDAP_SLAPI
|
||||
LDAPMod **modv = NULL;
|
||||
#endif
|
||||
int increment = op->orm_increment;
|
||||
|
||||
if( op->o_req_ndn.bv_len == 0 ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
|
|
@ -249,7 +273,7 @@ do_modify(
|
|||
"modify upon the root DSE not supported" );
|
||||
goto cleanup;
|
||||
|
||||
} else if ( bvmatch( &op->o_req_ndn, &global_schemandn ) ) {
|
||||
} else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
"do_modify: attempt to modify subschema subentry.\n" , 0, 0, 0 );
|
||||
|
|
@ -315,7 +339,7 @@ do_modify(
|
|||
int len = 0;
|
||||
|
||||
Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu MOD dn=\"%s\"\n",
|
||||
op->o_connid, op->o_opid, dn.bv_val, 0, 0 );
|
||||
op->o_connid, op->o_opid, op->o_req_dn.bv_val, 0, 0 );
|
||||
|
||||
for ( tmp = modlist; tmp != NULL; tmp = tmp->sml_next ) {
|
||||
if (len + 1 + tmp->sml_type.bv_len > sizeof(abuf)) {
|
||||
|
|
@ -391,7 +415,7 @@ do_modify(
|
|||
#define pb op->o_pb
|
||||
if ( pb ) {
|
||||
slapi_int_pblock_set_operation( pb, op );
|
||||
slapi_pblock_set( pb, SLAPI_MODIFY_TARGET, (void *)dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MODIFY_TARGET, (void *)op->o_req_dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit );
|
||||
modv = slapi_int_modifications2ldapmods( &modlist );
|
||||
slapi_pblock_set( pb, SLAPI_MODIFY_MODS, (void *)modv );
|
||||
|
|
@ -550,15 +574,11 @@ do_modify(
|
|||
}
|
||||
#endif /* defined( LDAP_SLAPI ) */
|
||||
|
||||
cleanup:
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
if ( modlist != NULL ) slap_mods_free( modlist );
|
||||
cleanup:;
|
||||
#if defined( LDAP_SLAPI )
|
||||
if ( modv != NULL ) slapi_int_free_ldapmods( modv );
|
||||
#endif
|
||||
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,25 +50,16 @@ do_modrdn(
|
|||
SlapReply *rs
|
||||
)
|
||||
{
|
||||
struct berval dn = BER_BVNULL;
|
||||
struct berval newrdn = BER_BVNULL;
|
||||
struct berval newSuperior = BER_BVNULL;
|
||||
struct berval dn = BER_BVNULL;
|
||||
struct berval newrdn = BER_BVNULL;
|
||||
struct berval newSuperior = BER_BVNULL;
|
||||
ber_int_t deloldrdn;
|
||||
|
||||
struct berval pnewSuperior = BER_BVNULL;
|
||||
|
||||
struct berval nnewSuperior = BER_BVNULL;
|
||||
|
||||
Backend *newSuperior_be = NULL;
|
||||
ber_len_t length;
|
||||
int manageDSAit;
|
||||
|
||||
struct berval pdn = BER_BVNULL;
|
||||
struct berval org_req_dn = BER_BVNULL;
|
||||
struct berval org_req_ndn = BER_BVNULL;
|
||||
struct berval org_dn = BER_BVNULL;
|
||||
struct berval org_ndn = BER_BVNULL;
|
||||
int org_managedsait;
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ENTRY, "do_modrdn: begin\n", 0, 0, 0 );
|
||||
|
|
@ -193,33 +184,6 @@ do_modrdn(
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
if( op->o_req_ndn.bv_len == 0 ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
"do_modrdn: attempt to modify root DSE.\n", 0, 0, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "do_modrdn: root dse!\n", 0, 0, 0 );
|
||||
#endif
|
||||
|
||||
send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
|
||||
"cannot rename the root DSE" );
|
||||
goto cleanup;
|
||||
|
||||
} else if ( bvmatch( &op->o_req_ndn, &global_schemandn ) ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
"do_modrdn: attempt to modify subschema subentry: %s (%ld)\n",
|
||||
global_schemandn.bv_val, (long) global_schemandn.bv_len, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "do_modrdn: subschema subentry: %s (%ld)\n",
|
||||
global_schemandn.bv_val, (long) global_schemandn.bv_len, 0 );
|
||||
#endif
|
||||
|
||||
send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
|
||||
"cannot rename subschema subentry" );
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* FIXME: should have/use rdnPretty / rdnNormalize routines */
|
||||
|
||||
rs->sr_err = dnPrettyNormal( NULL, &newrdn, &op->orr_newrdn, &op->orr_nnewrdn, op->o_tmpmemctx );
|
||||
|
|
@ -267,6 +231,62 @@ do_modrdn(
|
|||
}
|
||||
}
|
||||
|
||||
/* FIXME: temporary? */
|
||||
op->orr_deleteoldrdn = deloldrdn;
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_modrdn( op, rs );
|
||||
|
||||
cleanup:
|
||||
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
|
||||
op->o_tmpfree( op->orr_newrdn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->orr_nnewrdn.bv_val, op->o_tmpmemctx );
|
||||
|
||||
if ( pnewSuperior.bv_val ) op->o_tmpfree( pnewSuperior.bv_val, op->o_tmpmemctx );
|
||||
if ( nnewSuperior.bv_val ) op->o_tmpfree( nnewSuperior.bv_val, op->o_tmpmemctx );
|
||||
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_op_modrdn( Operation *op, SlapReply *rs )
|
||||
{
|
||||
Backend *newSuperior_be = NULL;
|
||||
int manageDSAit;
|
||||
struct berval pdn = BER_BVNULL;
|
||||
|
||||
if( op->o_req_ndn.bv_len == 0 ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
"do_modrdn: attempt to modify root DSE.\n", 0, 0, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "do_modrdn: root dse!\n", 0, 0, 0 );
|
||||
#endif
|
||||
|
||||
send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
|
||||
"cannot rename the root DSE" );
|
||||
goto cleanup;
|
||||
|
||||
} else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) {
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ERR,
|
||||
"do_modrdn: attempt to modify subschema subentry: %s (%ld)\n",
|
||||
frontendDB->be_schemandn.bv_val, (long)frontendDB->be_schemandn.bv_len, 0 );
|
||||
#else
|
||||
Debug( LDAP_DEBUG_ANY, "do_modrdn: subschema subentry: %s (%ld)\n",
|
||||
frontendDB->be_schemandn.bv_val, (long)frontendDB->be_schemandn.bv_len, 0 );
|
||||
#endif
|
||||
|
||||
send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
|
||||
"cannot rename subschema subentry" );
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu MODRDN dn=\"%s\"\n",
|
||||
op->o_connid, op->o_opid, op->o_req_dn.bv_val, 0, 0 );
|
||||
|
||||
|
|
@ -310,7 +330,7 @@ do_modrdn(
|
|||
* the same backend, otherwise we return an error.
|
||||
*/
|
||||
if( op->orr_newSup ) {
|
||||
newSuperior_be = select_backend( &nnewSuperior, 0, 0 );
|
||||
newSuperior_be = select_backend( op->orr_nnewSup, 0, 0 );
|
||||
|
||||
if ( newSuperior_be != op->o_bd ) {
|
||||
/* newSuperior is in different backend */
|
||||
|
|
@ -325,11 +345,11 @@ do_modrdn(
|
|||
#define pb op->o_pb
|
||||
if ( pb ) {
|
||||
slapi_int_pblock_set_operation( pb, op );
|
||||
slapi_pblock_set( pb, SLAPI_MODRDN_TARGET, (void *)dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MODRDN_TARGET, (void *)op->o_req_dn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, (void *)op->orr_newrdn.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR,
|
||||
(void *)newSuperior.bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MODRDN_DELOLDRDN, (void *)deloldrdn );
|
||||
(void *)op->orr_newSup->bv_val );
|
||||
slapi_pblock_set( pb, SLAPI_MODRDN_DELOLDRDN, (void *)op->orr_deleteoldrdn);
|
||||
slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit );
|
||||
|
||||
rs->sr_err = slapi_int_call_plugins( op->o_bd, SLAPI_PLUGIN_PRE_MODRDN_FN, pb );
|
||||
|
|
@ -368,7 +388,6 @@ do_modrdn(
|
|||
#endif
|
||||
{
|
||||
slap_callback cb = { NULL, slap_replog_cb, NULL, NULL };
|
||||
op->orr_deleteoldrdn = deloldrdn;
|
||||
#ifdef SLAPD_MULTIMASTER
|
||||
if ( !op->o_bd->be_update_ndn.bv_len || !repl_user )
|
||||
#endif
|
||||
|
|
@ -379,6 +398,12 @@ do_modrdn(
|
|||
op->o_bd->be_modrdn( op, rs );
|
||||
|
||||
if ( op->o_bd->be_delete ) {
|
||||
struct berval org_req_dn = BER_BVNULL;
|
||||
struct berval org_req_ndn = BER_BVNULL;
|
||||
struct berval org_dn = BER_BVNULL;
|
||||
struct berval org_ndn = BER_BVNULL;
|
||||
int org_managedsait;
|
||||
|
||||
org_req_dn = op->o_req_dn;
|
||||
org_req_ndn = op->o_req_ndn;
|
||||
org_dn = op->o_dn;
|
||||
|
|
@ -390,7 +415,7 @@ do_modrdn(
|
|||
|
||||
while ( rs->sr_err == LDAP_SUCCESS &&
|
||||
op->o_delete_glue_parent ) {
|
||||
op->o_delete_glue_parent = 0;
|
||||
op->o_delete_glue_parent = 0;
|
||||
if ( !be_issuffix( op->o_bd, &op->o_req_ndn )) {
|
||||
slap_callback cb = { NULL };
|
||||
cb.sc_response = slap_null_cb;
|
||||
|
|
@ -404,7 +429,7 @@ do_modrdn(
|
|||
}
|
||||
}
|
||||
op->o_managedsait = org_managedsait;
|
||||
op->o_dn = org_dn;
|
||||
op->o_dn = org_dn;
|
||||
op->o_ndn = org_ndn;
|
||||
op->o_req_dn = org_req_dn;
|
||||
op->o_req_ndn = org_req_ndn;
|
||||
|
|
@ -448,19 +473,7 @@ do_modrdn(
|
|||
}
|
||||
#endif /* defined( LDAP_SLAPI ) */
|
||||
|
||||
cleanup:
|
||||
|
||||
slap_graduate_commit_csn( op );
|
||||
|
||||
op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
|
||||
op->o_tmpfree( op->orr_newrdn.bv_val, op->o_tmpmemctx );
|
||||
op->o_tmpfree( op->orr_nnewrdn.bv_val, op->o_tmpmemctx );
|
||||
|
||||
if ( pnewSuperior.bv_val ) op->o_tmpfree( pnewSuperior.bv_val, op->o_tmpmemctx );
|
||||
if ( nnewSuperior.bv_val ) op->o_tmpfree( nnewSuperior.bv_val, op->o_tmpmemctx );
|
||||
|
||||
cleanup:;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -33,12 +33,12 @@ slap_operational_subschemaSubentry( Backend *be )
|
|||
a->a_desc = slap_schema.si_ad_subschemaSubentry;
|
||||
|
||||
a->a_vals = ch_malloc( 2 * sizeof( struct berval ) );
|
||||
ber_dupbv( a->a_vals, &global_schemadn );
|
||||
ber_dupbv( a->a_vals, &frontendDB->be_schemadn );
|
||||
a->a_vals[1].bv_len = 0;
|
||||
a->a_vals[1].bv_val = NULL;
|
||||
|
||||
a->a_nvals = ch_malloc( 2 * sizeof( struct berval ) );
|
||||
ber_dupbv( a->a_nvals, &global_schemandn );
|
||||
ber_dupbv( a->a_nvals, &frontendDB->be_schemandn );
|
||||
a->a_nvals[1].bv_len = 0;
|
||||
a->a_nvals[1].bv_val = NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -1251,18 +1251,13 @@ LDAP_SLAPD_V (ber_len_t) sockbuf_max_incoming_auth;
|
|||
LDAP_SLAPD_V (int) slap_conn_max_pending;
|
||||
LDAP_SLAPD_V (int) slap_conn_max_pending_auth;
|
||||
|
||||
LDAP_SLAPD_V (slap_mask_t) global_restrictops;
|
||||
LDAP_SLAPD_V (slap_mask_t) global_allows;
|
||||
LDAP_SLAPD_V (slap_mask_t) global_disallows;
|
||||
LDAP_SLAPD_V (slap_mask_t) global_requires;
|
||||
LDAP_SLAPD_V (slap_ssf_set_t) global_ssf_set;
|
||||
|
||||
LDAP_SLAPD_V (BerVarray) default_referral;
|
||||
LDAP_SLAPD_V (BerVarray) default_referral;
|
||||
LDAP_SLAPD_V (char *) replogfile;
|
||||
LDAP_SLAPD_V (const char) Versionstr[];
|
||||
LDAP_SLAPD_V (struct slap_limits_set) deflimit;
|
||||
|
||||
LDAP_SLAPD_V (slap_access_t) global_default_access;
|
||||
LDAP_SLAPD_V (int) global_gentlehup;
|
||||
LDAP_SLAPD_V (int) global_idletimeout;
|
||||
LDAP_SLAPD_V (int) global_schemacheck;
|
||||
|
|
@ -1274,9 +1269,6 @@ LDAP_SLAPD_V (int) ldap_syslog;
|
|||
LDAP_SLAPD_V (struct berval) default_search_base;
|
||||
LDAP_SLAPD_V (struct berval) default_search_nbase;
|
||||
|
||||
LDAP_SLAPD_V (struct berval) global_schemadn;
|
||||
LDAP_SLAPD_V (struct berval) global_schemandn;
|
||||
|
||||
LDAP_SLAPD_V (ldap_pvt_thread_mutex_t) num_sent_mutex;
|
||||
LDAP_SLAPD_V (unsigned long) num_bytes_sent;
|
||||
LDAP_SLAPD_V (unsigned long) num_pdu_sent;
|
||||
|
|
@ -1311,8 +1303,6 @@ LDAP_SLAPD_V (ldap_pvt_thread_mutex_t) passwd_mutex;
|
|||
LDAP_SLAPD_V (ldap_pvt_thread_mutex_t) gmtime_mutex;
|
||||
#endif
|
||||
|
||||
LDAP_SLAPD_V (AccessControl *) global_acl;
|
||||
|
||||
LDAP_SLAPD_V (ber_socket_t) dtblsize;
|
||||
|
||||
LDAP_SLAPD_V (int) use_reverse_lookup;
|
||||
|
|
@ -1335,6 +1325,24 @@ LDAP_SLAPD_F (int) do_search LDAP_P((Operation *op, SlapReply *rs));
|
|||
LDAP_SLAPD_F (int) do_unbind LDAP_P((Operation *op, SlapReply *rs));
|
||||
LDAP_SLAPD_F (int) do_extended LDAP_P((Operation *op, SlapReply *rs));
|
||||
|
||||
/*
|
||||
* frontend operations
|
||||
*/
|
||||
#if 0
|
||||
LDAP_SLAPD_F (int) fe_op_abandon LDAP_P((Operation *op, SlapReply *rs));
|
||||
#endif
|
||||
LDAP_SLAPD_F (int) fe_op_add LDAP_P((Operation *op, SlapReply *rs));
|
||||
LDAP_SLAPD_F (int) fe_op_bind LDAP_P((Operation *op, SlapReply *rs));
|
||||
LDAP_SLAPD_F (int) fe_op_compare LDAP_P((Operation *op, SlapReply *rs));
|
||||
LDAP_SLAPD_F (int) fe_op_delete LDAP_P((Operation *op, SlapReply *rs));
|
||||
LDAP_SLAPD_F (int) fe_op_modify LDAP_P((Operation *op, SlapReply *rs));
|
||||
LDAP_SLAPD_F (int) fe_op_modrdn LDAP_P((Operation *op, SlapReply *rs));
|
||||
LDAP_SLAPD_F (int) fe_op_search LDAP_P((Operation *op, SlapReply *rs));
|
||||
#if 0
|
||||
LDAP_SLAPD_F (int) fe_op_unbind LDAP_P((Operation *op, SlapReply *rs));
|
||||
#endif
|
||||
LDAP_SLAPD_F (int) fe_extended LDAP_P((Operation *op, SlapReply *rs));
|
||||
|
||||
LDAP_END_DECL
|
||||
|
||||
#endif /* PROTO_SLAP_H */
|
||||
|
|
|
|||
|
|
@ -61,8 +61,8 @@ schema_info( Entry **entry, const char **text )
|
|||
/* backend-specific schema info should be created by the
|
||||
* backend itself
|
||||
*/
|
||||
ber_dupbv( &e->e_name, &global_schemadn );
|
||||
ber_dupbv( &e->e_nname, &global_schemandn );
|
||||
ber_dupbv( &e->e_name, &frontendDB->be_schemadn );
|
||||
ber_dupbv( &e->e_nname, &frontendDB->be_schemandn );
|
||||
e->e_private = NULL;
|
||||
|
||||
vals[0].bv_val = "subentry";
|
||||
|
|
@ -93,7 +93,7 @@ schema_info( Entry **entry, const char **text )
|
|||
{
|
||||
int rc;
|
||||
AttributeDescription *desc = NULL;
|
||||
struct berval rdn = global_schemadn;
|
||||
struct berval rdn = frontendDB->be_schemadn;
|
||||
vals[0].bv_val = strchr( rdn.bv_val, '=' );
|
||||
|
||||
if( vals[0].bv_val == NULL ) {
|
||||
|
|
@ -113,11 +113,11 @@ schema_info( Entry **entry, const char **text )
|
|||
return LDAP_OTHER;
|
||||
}
|
||||
|
||||
nvals[0].bv_val = strchr( global_schemandn.bv_val, '=' );
|
||||
nvals[0].bv_val = strchr( frontendDB->be_schemandn.bv_val, '=' );
|
||||
assert( nvals[0].bv_val );
|
||||
nvals[0].bv_val++;
|
||||
nvals[0].bv_len = global_schemandn.bv_len -
|
||||
(nvals[0].bv_val - global_schemandn.bv_val);
|
||||
nvals[0].bv_len = frontendDB->be_schemandn.bv_len -
|
||||
(nvals[0].bv_val - frontendDB->be_schemandn.bv_val);
|
||||
|
||||
if( attr_merge_one( e, desc, vals, nvals ) ) {
|
||||
/* Out of memory, do something about it */
|
||||
|
|
|
|||
|
|
@ -51,11 +51,6 @@ do_search(
|
|||
{
|
||||
struct berval base = BER_BVNULL;
|
||||
ber_len_t siz, off, i;
|
||||
int manageDSAit;
|
||||
int be_manageDSAit;
|
||||
#ifdef LDAP_SLAPI
|
||||
char **attrs = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef NEW_LOGGING
|
||||
LDAP_LOG( OPERATION, ENTRY, "do_search: conn %d\n", op->o_connid, 0, 0 );
|
||||
|
|
@ -269,6 +264,44 @@ do_search(
|
|||
}
|
||||
}
|
||||
|
||||
op->o_bd = frontendDB;
|
||||
rs->sr_err = frontendDB->be_search( op, rs );
|
||||
|
||||
return_results:;
|
||||
if ( ( op->o_sync_mode & SLAP_SYNC_PERSIST ) ) {
|
||||
return rs->sr_err;
|
||||
}
|
||||
if ( ( op->o_sync_slog_size != -1 ) ) {
|
||||
return rs->sr_err;
|
||||
}
|
||||
if ( !BER_BVISNULL( &op->o_req_dn ) ) {
|
||||
slap_sl_free( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
if ( !BER_BVISNULL( &op->o_req_ndn ) ) {
|
||||
slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
if ( !BER_BVISNULL( &op->ors_filterstr ) ) {
|
||||
op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
if ( op->ors_filter != NULL) {
|
||||
filter_free_x( op, op->ors_filter );
|
||||
}
|
||||
if ( op->ors_attrs != NULL ) {
|
||||
op->o_tmpfree( op->ors_attrs, op->o_tmpmemctx );
|
||||
}
|
||||
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
int
|
||||
fe_op_search( Operation *op, SlapReply *rs )
|
||||
{
|
||||
int manageDSAit;
|
||||
int be_manageDSAit;
|
||||
#ifdef LDAP_SLAPI
|
||||
char **attrs = NULL;
|
||||
#endif
|
||||
|
||||
manageDSAit = get_manageDSAit( op );
|
||||
|
||||
/* fake while loop to allow breaking out */
|
||||
|
|
@ -299,7 +332,7 @@ do_search(
|
|||
#endif /* LDAP_SLAPI */
|
||||
rs->sr_err = root_dse_info( op->o_conn, &entry, &rs->sr_text );
|
||||
|
||||
} else if ( bvmatch( &op->o_req_ndn, &global_schemandn ) ) {
|
||||
} else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) {
|
||||
/* check restrictions */
|
||||
if( backend_check_restrictions( op, rs, NULL ) != LDAP_SUCCESS ) {
|
||||
send_ldap_result( op, rs );
|
||||
|
|
@ -429,29 +462,11 @@ do_search(
|
|||
if ( op->o_pb ) call_search_postop_plugins( op );
|
||||
#endif /* LDAP_SLAPI */
|
||||
|
||||
return_results:;
|
||||
if ( ( op->o_sync_mode & SLAP_SYNC_PERSIST ) ) return rs->sr_err;
|
||||
if ( ( op->o_sync_slog_size != -1 ) ) return rs->sr_err;
|
||||
|
||||
if( !BER_BVISNULL( &op->o_req_dn ) ) {
|
||||
slap_sl_free( op->o_req_dn.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
if( !BER_BVISNULL( &op->o_req_ndn ) ) {
|
||||
slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
|
||||
if( !BER_BVISNULL( &op->ors_filterstr ) ) {
|
||||
op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
|
||||
}
|
||||
if( op->ors_filter != NULL) filter_free_x( op, op->ors_filter );
|
||||
if( op->ors_attrs != NULL ) {
|
||||
op->o_tmpfree( op->ors_attrs, op->o_tmpmemctx );
|
||||
}
|
||||
|
||||
#ifdef LDAP_SLAPI
|
||||
if( attrs != NULL) op->o_tmpfree( attrs, op->o_tmpmemctx );
|
||||
#endif /* LDAP_SLAPI */
|
||||
|
||||
return_results:;
|
||||
return rs->sr_err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1280,6 +1280,7 @@ LDAP_SLAPD_V (int) nBackendInfo;
|
|||
LDAP_SLAPD_V (int) nBackendDB;
|
||||
LDAP_SLAPD_V (BackendInfo *) backendInfo;
|
||||
LDAP_SLAPD_V (BackendDB *) backendDB;
|
||||
LDAP_SLAPD_V (BackendDB *) frontendDB;
|
||||
|
||||
LDAP_SLAPD_V (int) slapMode;
|
||||
#define SLAP_UNDEFINED_MODE 0x0000
|
||||
|
|
@ -1615,6 +1616,7 @@ typedef struct req_bind_s {
|
|||
struct berval rb_cred;
|
||||
struct berval rb_edn;
|
||||
slap_ssf_t rb_ssf;
|
||||
struct berval rb_tmp_mech; /* FIXME: temporary */
|
||||
} req_bind_s;
|
||||
|
||||
typedef struct req_search_s {
|
||||
|
|
@ -1636,6 +1638,7 @@ typedef struct req_compare_s {
|
|||
|
||||
typedef struct req_modify_s {
|
||||
Modifications *rs_modlist;
|
||||
int rs_increment; /* FIXME: temporary */
|
||||
} req_modify_s;
|
||||
|
||||
typedef struct req_modrdn_s {
|
||||
|
|
@ -1648,6 +1651,7 @@ typedef struct req_modrdn_s {
|
|||
|
||||
typedef struct req_add_s {
|
||||
Entry *rs_e;
|
||||
Modifications *rs_modlist; /* FIXME: temporary */
|
||||
} req_add_s;
|
||||
|
||||
typedef struct req_abandon_s {
|
||||
|
|
@ -2051,6 +2055,7 @@ typedef struct slap_op {
|
|||
#define orb_cred oq_bind.rb_cred
|
||||
#define orb_edn oq_bind.rb_edn
|
||||
#define orb_ssf oq_bind.rb_ssf
|
||||
#define orb_tmp_mech oq_bind.rb_tmp_mech
|
||||
|
||||
#define ors_scope oq_search.rs_scope
|
||||
#define ors_deref oq_search.rs_deref
|
||||
|
|
@ -2070,8 +2075,10 @@ typedef struct slap_op {
|
|||
|
||||
#define orc_ava oq_compare.rs_ava
|
||||
#define ora_e oq_add.rs_e
|
||||
#define ora_modlist oq_add.rs_modlist
|
||||
#define orn_msgid oq_abandon.rs_msgid
|
||||
#define orm_modlist oq_modify.rs_modlist
|
||||
#define orm_increment oq_modify.rs_increment
|
||||
|
||||
#define ore_reqoid oq_extended.rs_reqoid
|
||||
#define ore_reqdata oq_extended.rs_reqdata
|
||||
|
|
|
|||
|
|
@ -351,6 +351,11 @@ slap_tool_init(
|
|||
exit( EXIT_FAILURE );
|
||||
}
|
||||
|
||||
if ( frontend_init() ) {
|
||||
fprintf( stderr, "%s: frontend_init failed!\n", progname );
|
||||
exit( EXIT_FAILURE );
|
||||
}
|
||||
|
||||
if ( overlay_init() ) {
|
||||
fprintf( stderr, "%s: overlay_init failed!\n", progname );
|
||||
exit( EXIT_FAILURE );
|
||||
|
|
|
|||
Loading…
Reference in a new issue