From 99ffef3de297395a62bab3279519f2fab990b42b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 30 Dec 2016 01:53:27 +0100 Subject: [PATCH] auth/gensec: convert external.c to provide update_send/recv Signed-off-by: Stefan Metzmacher --- auth/gensec/external.c | 54 ++++++++++++++++++++++++++++++++++----- auth/gensec/wscript_build | 2 +- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/auth/gensec/external.c b/auth/gensec/external.c index a26e4353192..9c17888a31e 100644 --- a/auth/gensec/external.c +++ b/auth/gensec/external.c @@ -20,6 +20,8 @@ */ #include "includes.h" +#include +#include "lib/util/tevent_ntstatus.h" #include "auth/credentials/credentials.h" #include "auth/gensec/gensec.h" #include "auth/gensec/gensec_internal.h" @@ -42,12 +44,51 @@ static NTSTATUS gensec_external_start(struct gensec_security *gensec_security) return NT_STATUS_OK; } -static NTSTATUS gensec_external_update(struct gensec_security *gensec_security, - TALLOC_CTX *out_mem_ctx, - struct tevent_context *ev, - const DATA_BLOB in, DATA_BLOB *out) +struct gensec_external_update_state { + DATA_BLOB out; +}; + +static struct tevent_req *gensec_external_update_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct gensec_security *gensec_security, + const DATA_BLOB in) +{ + struct tevent_req *req; + struct gensec_external_update_state *state = NULL; + + req = tevent_req_create(mem_ctx, &state, + struct gensec_external_update_state); + if (req == NULL) { + return NULL; + } + + state->out = data_blob_talloc(state, "", 0); + if (tevent_req_nomem(state->out.data, req)) { + return tevent_req_post(req, ev); + } + + tevent_req_done(req); + return tevent_req_post(req, ev); +} + +static NTSTATUS gensec_external_update_recv(struct tevent_req *req, + TALLOC_CTX *out_mem_ctx, + DATA_BLOB *out) { - *out = data_blob_talloc(out_mem_ctx, "", 0); + struct gensec_external_update_state *state = + tevent_req_data(req, + struct gensec_external_update_state); + NTSTATUS status; + + *out = data_blob_null; + + if (tevent_req_is_nterror(req, &status)) { + tevent_req_received(req); + return status; + } + + *out = state->out; + tevent_req_received(req); return NT_STATUS_OK; } @@ -62,7 +103,8 @@ static const struct gensec_security_ops gensec_external_ops = { .name = "sasl-EXTERNAL", .sasl_name = "EXTERNAL", .client_start = gensec_external_start, - .update = gensec_external_update, + .update_send = gensec_external_update_send, + .update_recv = gensec_external_update_recv, .have_feature = gensec_external_have_feature, .enabled = true, .priority = GENSEC_EXTERNAL diff --git a/auth/gensec/wscript_build b/auth/gensec/wscript_build index 0187db6e85e..8f6dedc1909 100644 --- a/auth/gensec/wscript_build +++ b/auth/gensec/wscript_build @@ -32,6 +32,6 @@ bld.SAMBA_MODULE('gensec_ncalrpc', bld.SAMBA_MODULE('gensec_external', source='external.c', subsystem='gensec', - deps='samba-debug talloc', + deps='samba-debug talloc tevent tevent-util', init_function='gensec_external_init' ) -- 2.47.2