diff options
author | Stefan Metzmacher <metze@samba.org> | 2017-06-15 00:34:26 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2017-08-07 15:20:03 +0200 |
commit | da3baf64d5a4bdf20b70edb66750c51a7315dd06 (patch) | |
tree | 7dd588ddfa7220f6f15cf8e13e7a55010802d2cf /auth | |
parent | 79b891a74663e6e3c637f5499eb8a5c41b2384f5 (diff) | |
download | samba-da3baf64d5a4bdf20b70edb66750c51a7315dd06.tar.gz |
auth/ntlmssp: prepare update_send/recv for real async processing
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Diffstat (limited to 'auth')
-rw-r--r-- | auth/ntlmssp/ntlmssp.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/auth/ntlmssp/ntlmssp.c b/auth/ntlmssp/ntlmssp.c index f79f0e260c1..e5a243eb4f3 100644 --- a/auth/ntlmssp/ntlmssp.c +++ b/auth/ntlmssp/ntlmssp.c @@ -44,6 +44,13 @@ static const struct ntlmssp_callbacks { NTSTATUS (*sync_fn)(struct gensec_security *gensec_security, TALLOC_CTX *out_mem_ctx, DATA_BLOB in, DATA_BLOB *out); + struct tevent_req *(*send_fn)(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct gensec_security *gensec_security, + const DATA_BLOB in); + NTSTATUS (*recv_fn)(struct tevent_req *req, + TALLOC_CTX *out_mem_ctx, + DATA_BLOB *out); } ntlmssp_callbacks[] = { { .role = NTLMSSP_CLIENT, @@ -146,10 +153,13 @@ static NTSTATUS gensec_ntlmssp_update_find(struct gensec_security *gensec_securi } struct gensec_ntlmssp_update_state { + const struct ntlmssp_callbacks *cb; NTSTATUS status; DATA_BLOB out; }; +static void gensec_ntlmssp_update_done(struct tevent_req *subreq); + static struct tevent_req *gensec_ntlmssp_update_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct gensec_security *gensec_security, @@ -176,6 +186,23 @@ static struct tevent_req *gensec_ntlmssp_update_send(TALLOC_CTX *mem_ctx, return tevent_req_post(req, ev); } + if (ntlmssp_callbacks[i].send_fn != NULL) { + struct tevent_req *subreq = NULL; + + state->cb = &ntlmssp_callbacks[i]; + + subreq = state->cb->send_fn(state, ev, + gensec_security, + in); + if (tevent_req_nomem(subreq, req)) { + return tevent_req_post(req, ev); + } + tevent_req_set_callback(subreq, + gensec_ntlmssp_update_done, + req); + return req; + } + status = ntlmssp_callbacks[i].sync_fn(gensec_security, state, in, &state->out); @@ -192,6 +219,27 @@ static struct tevent_req *gensec_ntlmssp_update_send(TALLOC_CTX *mem_ctx, return tevent_req_post(req, ev); } +static void gensec_ntlmssp_update_done(struct tevent_req *subreq) +{ + struct tevent_req *req = + tevent_req_callback_data(subreq, + struct tevent_req); + struct gensec_ntlmssp_update_state *state = + tevent_req_data(req, + struct gensec_ntlmssp_update_state); + NTSTATUS status; + + status = state->cb->recv_fn(subreq, state, &state->out); + TALLOC_FREE(subreq); + if (GENSEC_UPDATE_IS_NTERROR(status)) { + tevent_req_nterror(req, status); + return; + } + + state->status = status; + tevent_req_done(req); +} + static NTSTATUS gensec_ntlmssp_update_recv(struct tevent_req *req, TALLOC_CTX *out_mem_ctx, DATA_BLOB *out) |