xlat_ctx->basedn = &xlat_ctx->env_data->user_base;
- return rlm_ldap_find_user_async(xlat_ctx, xlat_ctx->inst, request, xlat_ctx->basedn, xlat_ctx->filter,
+ return rlm_ldap_find_user_async(xlat_ctx,
+ /* discard, only used by xlats */NULL,
+ xlat_ctx->inst, request,
+ xlat_ctx->basedn, xlat_ctx->filter,
xlat_ctx->ttrunk, xlat_ctx->attrs, &xlat_ctx->query);
}
* @ingroup xlat_functions
*/
static xlat_action_t ldap_group_xlat(TALLOC_CTX *ctx, fr_dcursor_t *out, xlat_ctx_t const *xctx,
- request_t *request, fr_value_box_list_t *in)
+ request_t *request, fr_value_box_list_t *in)
{
fr_value_box_t *vb = NULL, *group_vb = fr_value_box_list_pop_head(in);
rlm_ldap_t const *inst = talloc_get_type_abort_const(xctx->mctx->mi->data, rlm_ldap_t);
*
*/
static xlat_action_t ldap_profile_xlat_resume(TALLOC_CTX *ctx, fr_dcursor_t *out, xlat_ctx_t const *xctx,
- UNUSED request_t *request, UNUSED fr_value_box_list_t *in)
+ UNUSED request_t *request, UNUSED fr_value_box_list_t *in)
{
ldap_xlat_profile_ctx_t *xlat_ctx = talloc_get_type_abort(xctx->rctx, ldap_xlat_profile_ctx_t);
fr_value_box_t *vb;
int ldap_errno;
LDAP *handle = fr_ldap_handle_thread_local();
- p_result->rcode = RLM_MODULE_OK;
+ /*
+ * If a previous async call returned one of the "failure" results just return.
+ */
+ switch (p_result->rcode) {
+ case RLM_MODULE_REJECT:
+ case RLM_MODULE_FAIL:
+ case RLM_MODULE_HANDLED:
+ case RLM_MODULE_INVALID:
+ case RLM_MODULE_DISALLOW:
+ goto finish;
+
+ default:
+ p_result->rcode = RLM_MODULE_OK;
+ break;
+ }
switch (autz_ctx->status) {
case LDAP_AUTZ_FIND:
RETURN_UNLANG_FAIL;
}
- return rlm_ldap_find_user_async(autz_ctx, autz_ctx->inst, request, &autz_ctx->call_env->user_base,
+ return rlm_ldap_find_user_async(autz_ctx, p_result,
+ autz_ctx->inst, request, &autz_ctx->call_env->user_base,
&autz_ctx->call_env->user_filter, autz_ctx->ttrunk, autz_ctx->expanded.attrs,
&autz_ctx->query);
}
*/
if (!usermod_ctx->dn) {
/* Pushes a frame for user resolution */
- if (rlm_ldap_find_user_async(usermod_ctx, usermod_ctx->inst, request,
+ if (rlm_ldap_find_user_async(usermod_ctx,
+ p_result,
+ usermod_ctx->inst, request,
&usermod_ctx->call_env->user_base,
&usermod_ctx->call_env->user_filter,
usermod_ctx->ttrunk, NULL, NULL) == UNLANG_ACTION_FAIL) {
return vp->vp_strvalue;
}
-unlang_action_t rlm_ldap_find_user_async(TALLOC_CTX *ctx, rlm_ldap_t const *inst, request_t *request,
+unlang_action_t rlm_ldap_find_user_async(TALLOC_CTX *ctx,
+ unlang_result_t *p_result,
+ rlm_ldap_t const *inst, request_t *request,
fr_value_box_t *base, fr_value_box_t *filter_box,
fr_ldap_thread_trunk_t *ttrunk, char const *attrs[],
fr_ldap_query_t **query_out);
* - UNLANG_ACTION_PUSHED_CHILD on success.
* - UNLANG_ACTION_FAIL on failure.
*/
-unlang_action_t rlm_ldap_find_user_async(TALLOC_CTX *ctx, rlm_ldap_t const *inst, request_t *request,
+unlang_action_t rlm_ldap_find_user_async(TALLOC_CTX *ctx,
+ unlang_result_t *p_result,
+ rlm_ldap_t const *inst, request_t *request,
fr_value_box_t *base, fr_value_box_t *filter,
fr_ldap_thread_trunk_t *ttrunk, char const *attrs[], fr_ldap_query_t **query_out)
{
};
if (filter) user_ctx->filter = filter->vb_strvalue;
- if (unlang_function_push(NULL, request, NULL, ldap_find_user_async_result, ldap_find_user_async_cancel,
- ~FR_SIGNAL_CANCEL, UNLANG_SUB_FRAME, user_ctx) < 0) {
+ if (unlang_function_push(/* ldap_find_user_async_result sets an rcode based on the search result */ p_result,
+ request,
+ NULL,
+ ldap_find_user_async_result,
+ ldap_find_user_async_cancel, ~FR_SIGNAL_CANCEL,
+ UNLANG_SUB_FRAME, user_ctx) < 0) {
talloc_free(user_ctx);
return UNLANG_ACTION_FAIL;
}