X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fsearch.c;h=97ca38283c2e231f6afac5af82f240c07cc0a5bd;hb=0a465343fb6d6d8df9091699885bf352c3b1d4b3;hp=30532922b9522a66837d07b8453bf5dbd5927bb0;hpb=5c0581b1840103de15ac2a30c7b5cb9f4322e2cd;p=openldap diff --git a/servers/slapd/search.c b/servers/slapd/search.c index 30532922b9..97ca38283c 100644 --- a/servers/slapd/search.c +++ b/servers/slapd/search.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2004 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,19 +30,9 @@ #include #include -#include "ldap_pvt.h" #include "lutil.h" #include "slap.h" -#ifdef LDAP_SLAPI -#include "slapi/slapi.h" - -static void init_search_pblock( Operation *op, char **attrs, int managedsait ); -static int call_search_preop_plugins( Operation *op ); -static int call_search_rewrite_plugins( Operation *op ); -static void call_search_postop_plugins( Operation *op ); -#endif /* LDAPI_SLAPI */ - int do_search( Operation *op, /* info about the op to which we're responding */ @@ -102,9 +92,7 @@ do_search( case LDAP_SCOPE_BASE: case LDAP_SCOPE_ONELEVEL: case LDAP_SCOPE_SUBTREE: -#ifdef LDAP_SCOPE_SUBORDINATE case LDAP_SCOPE_SUBORDINATE: -#endif break; default: send_ldap_error( op, rs, LDAP_PROTOCOL_ERROR, "invalid scope" ); @@ -148,7 +136,7 @@ do_search( goto return_results; } filter2bv_x( op, op->ors_filter, &op->ors_filterstr ); - + Debug( LDAP_DEBUG_ARGS, " filter: %s\n", !BER_BVISEMPTY( &op->ors_filterstr ) ? op->ors_filterstr.bv_val : "empty", 0, 0 ); @@ -165,7 +153,13 @@ do_search( op->ors_attrs[i].an_desc = NULL; op->ors_attrs[i].an_oc = NULL; op->ors_attrs[i].an_oc_exclude = 0; - slap_bv2ad(&op->ors_attrs[i].an_name, &op->ors_attrs[i].an_desc, &dummy); + if ( slap_bv2ad( &op->ors_attrs[i].an_name, + &op->ors_attrs[i].an_desc, &dummy ) != LDAP_SUCCESS ) + { + slap_bv2undef_ad( &op->ors_attrs[i].an_name, + &op->ors_attrs[i].an_desc, &dummy, + SLAP_AD_PROXIED|SLAP_AD_NOINSERT ); + }; } if( get_ctrls( op, rs, 1 ) != LDAP_SUCCESS ) { @@ -190,9 +184,9 @@ do_search( sprintf(abuf, "scope=%d deref=%d", op->ors_scope, op->ors_deref); Statslog( LDAP_DEBUG_STATS, - "conn=%lu op=%lu SRCH base=\"%s\" %s filter=\"%s\"\n", - op->o_connid, op->o_opid, op->o_req_dn.bv_val, abuf, - op->ors_filterstr.bv_val ); + "%s SRCH base=\"%s\" %s filter=\"%s\"\n", + op->o_log_prefix, op->o_req_dn.bv_val, abuf, + op->ors_filterstr.bv_val, 0 ); for ( i = 0; iors_attrs[i].an_name.bv_len; @@ -200,8 +194,8 @@ do_search( alen = sizeof(abuf)-1; } if (len && (len + 1 + alen >= sizeof(abuf))) { - Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu SRCH attr=%s\n", - op->o_connid, op->o_opid, abuf, 0, 0 ); + Statslog( LDAP_DEBUG_STATS, "%s SRCH attr=%s\n", + op->o_log_prefix, abuf, 0, 0, 0 ); len = 0; ptr = abuf; } @@ -214,8 +208,8 @@ do_search( *ptr = '\0'; } if (len) { - Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu SRCH attr=%s\n", - op->o_connid, op->o_opid, abuf, 0, 0 ); + Statslog( LDAP_DEBUG_STATS, "%s SRCH attr=%s\n", + op->o_log_prefix, abuf, 0, 0, 0 ); } } @@ -223,12 +217,6 @@ do_search( 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 ); } @@ -253,9 +241,7 @@ fe_op_search( Operation *op, SlapReply *rs ) { int manageDSAit; int be_manageDSAit; -#ifdef LDAP_SLAPI - char **attrs = NULL; -#endif + BackendDB *bd = op->o_bd; manageDSAit = get_manageDSAit( op ); @@ -276,15 +262,6 @@ fe_op_search( Operation *op, SlapReply *rs ) goto return_results; } -#ifdef LDAP_SLAPI - if ( op->o_pb ) { - attrs = anlist2charray_x( op->ors_attrs, 0, op->o_tmpmemctx ); - init_search_pblock( op, attrs, manageDSAit ); - rs->sr_err = call_search_preop_plugins( op ); - if ( rs->sr_err ) break; - call_search_rewrite_plugins( op ); - } -#endif /* LDAP_SLAPI */ rs->sr_err = root_dse_info( op->o_conn, &entry, &rs->sr_text ); } else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) { @@ -294,32 +271,28 @@ fe_op_search( Operation *op, SlapReply *rs ) goto return_results; } -#ifdef LDAP_SLAPI - if ( op->o_pb ) { - attrs = anlist2charray_x( op->ors_attrs, 0, op->o_tmpmemctx ); - init_search_pblock( op, attrs, manageDSAit ); - rs->sr_err = call_search_preop_plugins( op ); - if ( rs->sr_err ) break; - call_search_rewrite_plugins( op ); - } -#endif /* LDAP_SLAPI */ rs->sr_err = schema_info( &entry, &rs->sr_text ); } if( rs->sr_err != LDAP_SUCCESS ) { send_ldap_result( op, rs ); -#ifdef LDAP_SLAPI - if ( op->o_pb ) call_search_postop_plugins( op ); -#endif /* LDAP_SLAPI */ goto return_results; } else if ( entry != NULL ) { rs->sr_err = test_filter( op, entry, op->ors_filter ); if( rs->sr_err == LDAP_COMPARE_TRUE ) { + /* note: we set no limits because either + * no limit is specified, or at least 1 + * is specified, and we're going to return + * at most one entry */ + op->ors_slimit = SLAP_NO_LIMIT; + op->ors_tlimit = SLAP_NO_LIMIT; + rs->sr_entry = entry; rs->sr_attrs = op->ors_attrs; rs->sr_operational_attrs = NULL; + rs->sr_flags = 0; send_search_entry( op, rs ); rs->sr_entry = NULL; rs->sr_operational_attrs = NULL; @@ -328,9 +301,6 @@ fe_op_search( Operation *op, SlapReply *rs ) rs->sr_err = LDAP_SUCCESS; send_ldap_result( op, rs ); -#ifdef LDAP_SLAPI - if ( op->o_pb ) call_search_postop_plugins( op ); -#endif /* LDAP_SLAPI */ goto return_results; } break; @@ -350,17 +320,7 @@ fe_op_search( Operation *op, SlapReply *rs ) * if we don't hold it. */ - /* Sync control overrides manageDSAit */ - - if ( manageDSAit != SLAP_NO_CONTROL ) { - if ( op->o_sync_mode & SLAP_SYNC_REFRESH ) { - be_manageDSAit = SLAP_NO_CONTROL; - } else { - be_manageDSAit = manageDSAit; - } - } else { - be_manageDSAit = manageDSAit; - } + be_manageDSAit = manageDSAit; op->o_bd = select_backend( &op->o_req_ndn, be_manageDSAit, 1 ); if ( op->o_bd == NULL ) { @@ -369,6 +329,7 @@ fe_op_search( Operation *op, SlapReply *rs ) if (!rs->sr_ref) rs->sr_ref = default_referral; rs->sr_err = LDAP_REFERRAL; + op->o_bd = bd; send_ldap_result( op, rs ); if (rs->sr_ref != default_referral) @@ -388,19 +349,6 @@ fe_op_search( Operation *op, SlapReply *rs ) goto return_results; } -#ifdef LDAP_SLAPI - if ( op->o_pb ) { - attrs = anlist2charray_x( op->ors_attrs, 0, op->o_tmpmemctx ); - init_search_pblock( op, attrs, manageDSAit ); - rs->sr_err = call_search_preop_plugins( op ); - if ( rs->sr_err != LDAP_SUCCESS ) { - goto return_results; - } - - call_search_rewrite_plugins( op ); - } -#endif /* LDAP_SLAPI */ - /* actually do the search and send the result(s) */ if ( op->o_bd->be_search ) { if ( limits_check( op, rs ) == 0 ) { @@ -413,115 +361,8 @@ fe_op_search( Operation *op, SlapReply *rs ) "operation not supported within namingContext" ); } -#ifdef LDAP_SLAPI - if ( op->o_pb ) call_search_postop_plugins( op ); -#endif /* LDAP_SLAPI */ - -#ifdef LDAP_SLAPI - if( attrs != NULL) op->o_tmpfree( attrs, op->o_tmpmemctx ); -#endif /* LDAP_SLAPI */ - return_results:; + op->o_bd = bd; return rs->sr_err; } -#ifdef LDAP_SLAPI - -static void init_search_pblock( Operation *op, - char **attrs, int managedsait ) -{ - slapi_int_pblock_set_operation( op->o_pb, op ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_TARGET, (void *)op->o_req_dn.bv_val ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_SCOPE, (void *)op->ors_scope ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_DEREF, (void *)op->ors_deref ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_SIZELIMIT, (void *)op->ors_slimit ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_TIMELIMIT, (void *)op->ors_tlimit ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_FILTER, (void *)op->ors_filter ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_STRFILTER, (void *)op->ors_filterstr.bv_val ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_ATTRS, (void *)attrs ); - slapi_pblock_set( op->o_pb, SLAPI_SEARCH_ATTRSONLY, (void *)op->ors_attrsonly ); - slapi_pblock_set( op->o_pb, SLAPI_MANAGEDSAIT, (void *)managedsait ); -} - -static int call_search_preop_plugins( Operation *op ) -{ - int rc; - - rc = slapi_int_call_plugins( op->o_bd, SLAPI_PLUGIN_PRE_SEARCH_FN, op->o_pb ); - if ( rc < 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ - Debug(LDAP_DEBUG_TRACE, "call_search_preop_plugins: search preoperation plugin " - "returned %d.\n", rc, 0, 0); - if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rc ) != 0 ) || - rc == LDAP_SUCCESS ) { - rc = LDAP_OTHER; - } - } else { - rc = LDAP_SUCCESS; - } - - return rc; -} - -static int call_search_rewrite_plugins( Operation *op ) -{ - if ( slapi_int_call_plugins( op->o_bd, SLAPI_PLUGIN_COMPUTE_SEARCH_REWRITER_FN, op->o_pb ) == 0 ) { - int rc; - - /* - * The plugin can set the SLAPI_SEARCH_FILTER. - * SLAPI_SEARCH_STRFILER is not normative. - */ - slapi_pblock_get( op->o_pb, SLAPI_SEARCH_FILTER, (void *)&op->ors_filter ); - op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx ); - filter2bv_x( op, op->ors_filter, &op->ors_filterstr ); - - /* - * Also permit other search parameters to be reset. One thing - * this doesn't (yet) deal with is plugins that change a root - * DSE search to a non-root DSE search... - */ - slapi_pblock_get( op->o_pb, SLAPI_SEARCH_TARGET, (void **)&op->o_req_dn.bv_val ); - op->o_req_dn.bv_len = strlen( op->o_req_dn.bv_val ); - - if( !BER_BVISNULL( &op->o_req_ndn ) ) { - slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx ); - } - rc = dnNormalize( 0, NULL, NULL, &op->o_req_dn, &op->o_req_ndn, - op->o_tmpmemctx ); - if ( rc != LDAP_SUCCESS ) { - return rc; - } - - slapi_pblock_get( op->o_pb, SLAPI_SEARCH_SCOPE, (void **)&op->ors_scope ); - slapi_pblock_get( op->o_pb, SLAPI_SEARCH_DEREF, (void **)&op->ors_deref ); - - Debug( LDAP_DEBUG_ARGS, " after compute_rewrite_search filter: %s\n", - !BER_BVISEMPTY( &op->ors_filterstr ) ? op->ors_filterstr.bv_val : "empty", 0, 0 ); - } - - return LDAP_SUCCESS; -} - -static void call_search_postop_plugins( Operation *op ) -{ - if ( slapi_int_call_plugins( op->o_bd, SLAPI_PLUGIN_POST_SEARCH_FN, op->o_pb ) < 0 ) { - Debug(LDAP_DEBUG_TRACE, "call_search_postop_plugins: search postoperation plugins " - "failed.\n", 0, 0, 0); - } -} - -void slapi_int_dummy(void) -{ - /* - * XXX slapi_search_internal() was no getting pulled - * in; all manner of linker flags failed to link it. - * FIXME - */ - slapi_search_internal( NULL, 0, NULL, NULL, NULL, 0 ); -} -#endif /* LDAP_SLAPI */ -