r6705: let the gensec module decide if messages can be signed and sealed in a different
authorStefan Metzmacher <metze@samba.org>
Tue, 10 May 2005 11:04:04 +0000 (11:04 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:16:36 +0000 (13:16 -0500)
order than a strict request - reply sequence

Note: we should also fix the client code...

metze

source/auth/gensec/gensec.h
source/auth/ntlmssp/ntlmssp.c
source/rpc_server/dcerpc_server.c

index 71c00c5157c8fca290a10c076d5cfb4ae0be0234..268881e4ba1ee58c14318d230fb4f75fd5f68d1c 100644 (file)
@@ -39,6 +39,7 @@ struct gensec_target {
 #define GENSEC_FEATURE_SIGN            0x00000002
 #define GENSEC_FEATURE_SEAL            0x00000004
 #define GENSEC_FEATURE_DCE_STYLE       0x00000008
+#define GENSEC_FEATURE_ASYNC_REPLIES   0x00000010
 
 /* GENSEC mode */
 enum gensec_role
index 254736688bc51f05c1551a63d0c2e7f9b55f773e..ac007ae3abc57926ca2ae684e22943676ed85cbf 100644 (file)
@@ -183,6 +183,11 @@ static NTSTATUS gensec_ntlmssp_update(struct gensec_security *gensec_security,
                gensec_ntlmssp_state->have_features |= GENSEC_FEATURE_SESSION_KEY;
        }
 
+       /* only NTLMv2 can handle async replies */
+       if (gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_NTLM2) {
+               gensec_ntlmssp_state->have_features |= GENSEC_FEATURE_ASYNC_REPLIES;
+       }
+
        return status;
 }
 
index cb1cdc9416d9ef6ea748ab70ad9f8d854d32bd99..12e24859ec93657d99f779e9101e8f951ae27130 100644 (file)
@@ -742,6 +742,10 @@ static NTSTATUS dcesrv_request(struct dcesrv_call_state *call)
        call->state_flags       = call->conn->dce_ctx->state_flags;
        call->time              = timeval_current();
 
+       if (!gensec_have_feature(call->conn->auth_state.gensec_security, GENSEC_FEATURE_ASYNC_REPLIES)) {
+               call->state_flags &= ~DCESRV_CALL_STATE_FLAG_MAY_ASYNC;
+       }
+
        context = dcesrv_find_context(call->conn, call->pkt.u.request.context_id);
        if (context == NULL) {
                return dcesrv_fault(call, DCERPC_FAULT_UNK_IF);