X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fslapi%2Fslapi_pblock.c;h=6eb6de5b3fd1d883632af57e59b659ba7937a648;hb=9b21d585dcee5a09465ab029d5d8321a8da343f0;hp=1b4e5dab5621f1df9b535b7ec607195d104ba132;hpb=3647cba1315060683be59035759d5ccc1f2f6d2d;p=openldap diff --git a/servers/slapd/slapi/slapi_pblock.c b/servers/slapd/slapi/slapi_pblock.c index 1b4e5dab56..6eb6de5b3f 100644 --- a/servers/slapd/slapi/slapi_pblock.c +++ b/servers/slapd/slapi/slapi_pblock.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2002-2005 The OpenLDAP Foundation. + * Copyright 2002-2012 The OpenLDAP Foundation. * Portions Copyright 1997,2002-2003 IBM Corporation. * All rights reserved. * @@ -64,13 +64,14 @@ pblock_get_param_class( int param ) case SLAPI_DB2LDIF_PRINTKEY: case SLAPI_LDIF2DB_REMOVEDUPVALS: case SLAPI_MANAGEDSAIT: - case SLAPI_X_MANAGEDIT: + case SLAPI_X_RELAX: case SLAPI_X_OPERATION_NO_SCHEMA_CHECK: case SLAPI_IS_REPLICATED_OPERATION: case SLAPI_X_CONN_IS_UDP: case SLAPI_X_CONN_SSF: case SLAPI_RESULT_CODE: case SLAPI_LOG_OPERATION: + case SLAPI_IS_INTERNAL_OPERATION: return PBLOCK_CLASS_INTEGER; break; @@ -79,6 +80,7 @@ pblock_get_param_class( int param ) case SLAPI_OPINITIATED_TIME: case SLAPI_ABANDON_MSGID: case SLAPI_X_OPERATION_DELETE_GLUE_PARENT: + case SLAPI_OPERATION_MSGID: return PBLOCK_CLASS_LONG_INTEGER; break; @@ -166,6 +168,16 @@ pblock_get_param_class( int param ) case SLAPI_X_PLUGIN_PRE_GROUP_FN: case SLAPI_X_PLUGIN_POST_GROUP_FN: case SLAPI_PLUGIN_AUDIT_FN: + case SLAPI_PLUGIN_INTERNAL_PRE_BIND_FN: + case SLAPI_PLUGIN_INTERNAL_PRE_UNBIND_FN: + case SLAPI_PLUGIN_INTERNAL_PRE_SEARCH_FN: + case SLAPI_PLUGIN_INTERNAL_PRE_COMPARE_FN: + case SLAPI_PLUGIN_INTERNAL_PRE_ABANDON_FN: + case SLAPI_PLUGIN_INTERNAL_POST_BIND_FN: + case SLAPI_PLUGIN_INTERNAL_POST_UNBIND_FN: + case SLAPI_PLUGIN_INTERNAL_POST_SEARCH_FN: + case SLAPI_PLUGIN_INTERNAL_POST_COMPARE_FN: + case SLAPI_PLUGIN_INTERNAL_POST_ABANDON_FN: return PBLOCK_CLASS_FUNCTION_POINTER; break; @@ -277,6 +289,7 @@ pblock_get_param_class( int param ) case SLAPI_X_GROUP_ATTRIBUTE: case SLAPI_X_GROUP_OPERATION_DN: case SLAPI_X_GROUP_TARGET_ENTRY: + case SLAPI_X_ADD_STRUCTURAL_CLASS: case SLAPI_PLUGIN_AUDIT_DATA: case SLAPI_IBM_PBLOCK: case SLAPI_PLUGIN_VERSION: @@ -292,13 +305,13 @@ pblock_get_param_class( int param ) static void pblock_lock( Slapi_PBlock *pb ) { - ldap_pvt_thread_mutex_lock(&pb->pb_mutex); + ldap_pvt_thread_mutex_lock( &pb->pb_mutex ); } static void pblock_unlock( Slapi_PBlock *pb ) { - ldap_pvt_thread_mutex_unlock(&pb->pb_mutex); + ldap_pvt_thread_mutex_unlock( &pb->pb_mutex ); } static int @@ -383,7 +396,7 @@ static int pblock_set_default( Slapi_PBlock *pb, int param, void *value ) { slapi_pblock_class_t pbClass; - size_t i; + int i; pbClass = pblock_get_param_class( param ); if ( pbClass == PBLOCK_CLASS_INVALID ) { @@ -434,7 +447,7 @@ pblock_be_call( Slapi_PBlock *pb, int (*bep)(Operation *) ) op = pb->pb_op; be_orig = op->o_bd; - op->o_bd = select_backend( &op->o_req_ndn, 0, 0 ); + op->o_bd = select_backend( &op->o_req_ndn, 0 ); rc = (*bep)( op ); op->o_bd = be_orig; @@ -464,14 +477,37 @@ pblock_get( Slapi_PBlock *pb, int param, void **value ) PBLOCK_ASSERT_OP( pb, 0 ); *((ber_tag_t *)value) = pb->pb_op->o_tag; break; + case SLAPI_OPERATION_MSGID: + PBLOCK_ASSERT_OP( pb, 0 ); + *((long *)value) = pb->pb_op->o_msgid; + break; case SLAPI_X_OPERATION_DELETE_GLUE_PARENT: PBLOCK_ASSERT_OP( pb, 0 ); - *((ber_tag_t *)value) = pb->pb_op->o_delete_glue_parent; + *((int *)value) = pb->pb_op->o_delete_glue_parent; break; case SLAPI_X_OPERATION_NO_SCHEMA_CHECK: PBLOCK_ASSERT_OP( pb, 0 ); *((int *)value) = get_no_schema_check( pb->pb_op ); break; + case SLAPI_X_ADD_STRUCTURAL_CLASS: + PBLOCK_ASSERT_OP( pb, 0 ); + + if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) { + struct berval tmpval = BER_BVNULL; + + rc = mods_structural_class( pb->pb_op->ora_modlist, + &tmpval, &pb->pb_rs->sr_text, + pb->pb_textbuf, sizeof( pb->pb_textbuf ), + pb->pb_op->o_tmpmemctx ); + *((char **)value) = tmpval.bv_val; + } else { + rc = PBLOCK_ERROR; + } + break; + case SLAPI_X_OPERATION_NO_SUBORDINATE_GLUE: + PBLOCK_ASSERT_OP( pb, 0 ); + *((int *)value) = pb->pb_op->o_no_subordinate_glue; + break; case SLAPI_REQCONTROLS: PBLOCK_ASSERT_OP( pb, 0 ); *((LDAPControl ***)value) = pb->pb_op->o_ctrls; @@ -484,13 +520,13 @@ pblock_get( Slapi_PBlock *pb, int param, void **value ) PBLOCK_ASSERT_OP( pb, 0 ); *((int *)value) = get_manageDSAit( pb->pb_op ); break; - case SLAPI_X_MANAGEDIT: + case SLAPI_X_RELAX: PBLOCK_ASSERT_OP( pb, 0 ); - *((int *)value) = get_manageDIT( pb->pb_op ); + *((int *)value) = get_relax( pb->pb_op ); break; case SLAPI_BACKEND: PBLOCK_ASSERT_OP( pb, 0 ); - *((BackendDB **)value) = select_backend( &pb->pb_op->o_req_ndn, 0, 0 ); + *((BackendDB **)value) = select_backend( &pb->pb_op->o_req_ndn, 0 ); break; case SLAPI_BE_TYPE: PBLOCK_ASSERT_OP( pb, 0 ); @@ -534,6 +570,9 @@ pblock_get( Slapi_PBlock *pb, int param, void **value ) #endif ); break; + case SLAPI_IS_INTERNAL_OPERATION: + *((int *)value) = pb->pb_intop; + break; case SLAPI_X_CONN_IS_UDP: PBLOCK_ASSERT_CONN( pb ); #ifdef LDAP_CONNECTIONLESS @@ -548,6 +587,12 @@ pblock_get( Slapi_PBlock *pb, int param, void **value ) break; case SLAPI_CONN_DN: PBLOCK_ASSERT_CONN( pb ); +#if 0 + /* This would be necessary to keep plugin compat after the fix in ITS#4158 */ + if ( pb->pb_op->o_tag == LDAP_REQ_BIND && pb->pb_rs->sr_err == LDAP_SUCCESS ) + *((char **)value) = pb->pb_op->orb_edn.bv_val; + else +#endif *((char **)value) = pb->pb_conn->c_dn.bv_val; break; case SLAPI_CONN_CLIENTIP: @@ -566,14 +611,14 @@ pblock_get( Slapi_PBlock *pb, int param, void **value ) break; case SLAPI_CONN_SERVERIP: PBLOCK_ASSERT_CONN( pb ); - if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "IP=", 3 ) == 0 ) + if ( strncmp( pb->pb_conn->c_sock_name.bv_val, "IP=", 3 ) == 0 ) *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[3]; else *value = NULL; break; case SLAPI_X_CONN_SERVERPATH: PBLOCK_ASSERT_CONN( pb ); - if ( strncmp( pb->pb_conn->c_peer_name.bv_val, "PATH=", 3 ) == 0 ) + if ( strncmp( pb->pb_conn->c_sock_name.bv_val, "PATH=", 3 ) == 0 ) *((char **)value) = &pb->pb_conn->c_sock_name.bv_val[5]; else *value = NULL; @@ -600,15 +645,25 @@ pblock_get( Slapi_PBlock *pb, int param, void **value ) break; case SLAPI_MODIFY_MODS: { LDAPMod **mods = NULL; + Modifications *ml = NULL; pblock_get_default( pb, param, (void **)&mods ); if ( mods == NULL && pb->pb_intop == 0 ) { - if ( pb->pb_op->o_tag != LDAP_REQ_MODIFY ) { + switch ( pb->pb_op->o_tag ) { + case LDAP_REQ_MODIFY: + ml = pb->pb_op->orm_modlist; + break; + case LDAP_REQ_MODRDN: + ml = pb->pb_op->orr_modlist; + break; + default: rc = PBLOCK_ERROR; break; } - mods = slapi_int_modifications2ldapmods( pb->pb_op->orm_modlist ); - pblock_set_default( pb, param, (void *)mods ); + if ( rc != PBLOCK_ERROR ) { + mods = slapi_int_modifications2ldapmods( ml ); + pblock_set_default( pb, param, (void *)mods ); + } } *((LDAPMod ***)value) = mods; break; @@ -827,6 +882,10 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) PBLOCK_ASSERT_OP( pb, 0 ); pb->pb_op->o_tag = *((ber_tag_t *)value); break; + case SLAPI_OPERATION_MSGID: + PBLOCK_ASSERT_OP( pb, 0 ); + pb->pb_op->o_msgid = *((long *)value); + break; case SLAPI_X_OPERATION_DELETE_GLUE_PARENT: PBLOCK_ASSERT_OP( pb, 0 ); pb->pb_op->o_delete_glue_parent = *((int *)value); @@ -835,6 +894,10 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) PBLOCK_ASSERT_OP( pb, 0 ); pb->pb_op->o_no_schema_check = *((int *)value); break; + case SLAPI_X_OPERATION_NO_SUBORDINATE_GLUE: + PBLOCK_ASSERT_OP( pb, 0 ); + pb->pb_op->o_no_subordinate_glue = *((int *)value); + break; case SLAPI_REQCONTROLS: PBLOCK_ASSERT_OP( pb, 0 ); pb->pb_op->o_ctrls = (LDAPControl **)value; @@ -862,9 +925,9 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) PBLOCK_ASSERT_OP( pb, 0 ); pb->pb_op->o_managedsait = *((int *)value); break; - case SLAPI_X_MANAGEDIT: + case SLAPI_X_RELAX: PBLOCK_ASSERT_OP( pb, 0 ); - pb->pb_op->o_managedit = *((int *)value); + pb->pb_op->o_relax = *((int *)value); break; case SLAPI_BACKEND: PBLOCK_ASSERT_OP( pb, 0 ); @@ -876,7 +939,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) case SLAPI_X_CONN_SSF: PBLOCK_ASSERT_CONN( pb ); PBLOCK_LOCK_CONN( pb ); - pb->pb_conn->c_ssf = (slap_ssf_t)value; + pb->pb_conn->c_ssf = (slap_ssf_t)(long)value; PBLOCK_UNLOCK_CONN( pb ); break; case SLAPI_X_CONN_SASL_CONTEXT: @@ -936,11 +999,13 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) mlp = &pb->pb_op->orm_modlist; } else if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) { mlp = &pb->pb_op->ora_modlist; + } else if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) { + mlp = &pb->pb_op->orr_modlist; } else { break; } - newmods = slapi_int_ldapmods2modifications( (LDAPMod **)value ); + newmods = slapi_int_ldapmods2modifications( pb->pb_op, (LDAPMod **)value ); if ( newmods != NULL ) { slap_mods_free( *mlp, 1 ); *mlp = newmods; @@ -1007,9 +1072,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) case LDAP_SCOPE_BASE: case LDAP_SCOPE_ONELEVEL: case LDAP_SCOPE_SUBTREE: -#ifdef LDAP_SCOPE_SUBORDINATE case LDAP_SCOPE_SUBORDINATE: -#endif pb->pb_op->ors_scope = scope; break; default: @@ -1060,7 +1123,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) break; case SLAPI_SEARCH_ATTRS: { AttributeName *an = NULL; - size_t i = 0; + size_t i = 0, j = 0; char **attrs = (char **)value; PBLOCK_ASSERT_OP( pb, 0 ); @@ -1084,18 +1147,20 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) ; } if ( i ) { - an = (AttributeName *)pb->pb_op->o_tmpalloc( (i + 1) * + an = (AttributeName *)pb->pb_op->o_tmpcalloc( i + 1, sizeof(AttributeName), pb->pb_op->o_tmpmemctx ); for ( i = 0; attrs[i] != NULL; i++ ) { - an[i].an_desc = NULL; - an[i].an_oc = NULL; - an[i].an_oc_exclude = 0; - an[i].an_name.bv_val = attrs[i]; - an[i].an_name.bv_len = strlen( attrs[i] ); - slap_bv2ad( &an[i].an_name, &an[i].an_desc, &pb->pb_rs->sr_text ); + an[j].an_desc = NULL; + an[j].an_oc = NULL; + an[j].an_flags = 0; + an[j].an_name.bv_val = attrs[i]; + an[j].an_name.bv_len = strlen( attrs[i] ); + if ( slap_bv2ad( &an[j].an_name, &an[j].an_desc, &pb->pb_rs->sr_text ) == LDAP_SUCCESS ) { + j++; + } } - an[i].an_name.bv_val = NULL; - an[i].an_name.bv_len = 0; + an[j].an_name.bv_val = NULL; + an[j].an_name.bv_len = 0; } pb->pb_op->ors_attrs = an; break; @@ -1111,7 +1176,9 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) break; case SLAPI_SEARCH_RESULT_ENTRY: PBLOCK_ASSERT_OP( pb, 0 ); - pb->pb_rs->sr_entry = (Slapi_Entry *)value; + rs_replace_entry( pb->pb_op, pb->pb_rs, NULL, (Slapi_Entry *)value ); + /* TODO: Should REP_ENTRY_MODIFIABLE be set? */ + pb->pb_rs->sr_flags |= REP_ENTRY_MUSTBEFREED; break; case SLAPI_BIND_RET_SASLCREDS: PBLOCK_ASSERT_OP( pb, 0 ); @@ -1198,11 +1265,13 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) case SLAPI_IS_REPLICATED_OPERATION: case SLAPI_CONN_AUTHTYPE: case SLAPI_CONN_AUTHMETHOD: + case SLAPI_IS_INTERNAL_OPERATION: case SLAPI_X_CONN_IS_UDP: case SLAPI_CONN_CLIENTIP: case SLAPI_X_CONN_CLIENTPATH: case SLAPI_CONN_SERVERIP: case SLAPI_X_CONN_SERVERPATH: + case SLAPI_X_ADD_STRUCTURAL_CLASS: /* These parameters cannot be set */ rc = PBLOCK_ERROR; break; @@ -1355,4 +1424,3 @@ slapi_int_pblock_get_next( Slapi_PBlock **pb ) } #endif /* LDAP_SLAPI */ -