[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Sun May 21 23:13:04 UTC 2017


The branch, master has been updated
       via  2732411 s4:libcli/ldap: just use gensec_update() in ldap_bind_sasl()
       via  3c2e029 s4:libcli/smb2: make smb2_session_setup_spnego_* completely async
       via  2c3e99d s4:librpc: simplify dcerpc_connect_timeout_handler() logic
       via  2c4e21c s4:librpc: make use of gensec_update_send() in bind_auth_next_step()
       via  65655f2 s4:librpc: use gensec_update_send() in dcerpc_bind_auth_send()
       via  f31c55f s4:rpc_server: implement async AUTH3 using gensec_update_send/recv
       via  0f55829 s4:rpc_server: implement async ALTER_CONTEXT using gensec_update_send/recv
       via  2681370 s4:rpc_server: implement async BIND using gensec_update_send/recv
       via  c449313 s4:rpc_server: remove unused dcesrv_auth_{bind_ack,auth3,alter_ack}()
       via  b680e9e s4:rpc_server: make use of dcesrv_auth_prepare_auth3() in dcesrv_auth3()
       via  aa2df9e s4:rpc_server: make use of dcesrv_auth_prepare_alter_ack() in dcesrv_alter()
       via  7274dff s4:rpc_server: make use of dcesrv_auth_prepare_bind_ack() in dcesrv_bind()
       via  5a408bb s4:rpc_server: make use of dcesrv_auth_reply() in dcesrv_alter()
       via  d698c83 s4:rpc_server: split out dcesrv_auth_reply() from dcesrv_bind()
       via  6cc8d78 s4:rpc_server: remove useless TALLOC_FREE(call->context) from dcesrv_bind()
       via  bcf33f3 s4:rpc_server: split out dcesrv_auth_prepare_alter_ack()
       via  352b5ec s4:rpc_server: split out dcesrv_auth_prepare_auth3()
       via  f65625e s4:rpc_server: split out dcesrv_auth_prepare_bind_ack()
       via  9f5110b s4:rpc_server: make use of dcesrv_auth_complete() in dcesrv_auth_auth3()
       via  f3be27c s4:rpc_server: prepare dcesrv_auth_complete() for AUTH3
       via  f9a2db8 s4:rpc_server: make use of dcesrv_auth_complete() in dcesrv_auth_alter_ack()
       via  8ec1254 s4:rpc_server: split out dcesrv_auth_complete() from dcesrv_auth_bind_ack()
       via  3e94bd75 s4:rpc_server: add wait_send/recv infrastructure
       via  469e274 s4:rpc_server: introduce call->ack_pkt and avoid pkt variable for the response on the stack
       via  31c7493 s4:kdc: make use of gensec_update() in kpasswd_process()
       via  c198dee s4:dlz_bind9: assert SPNEGO/KRB5 and use gensec_update()
       via  186543a s4:dns_server: use samba_server_gensec_krb5_start() and gensec_update() in dns_query.c
       via  d4f72d0 s4:auth: add samba_server_gensec_krb5_start()
       via  93a6b9d s4:auth: split out a samba_server_gensec_start_settings() helper function
       via  4f597f1 auth/gensec: make sure there's only one pending gensec_update_send() per context
       via  8a3a111 auth/gensec: improve NT_STATUS_MORE_PROCESSING_REQUIRED logic in gensec_update_*()
       via  9e3b27d auth/gensec: avoid using a state->subreq pointer
       via  a5f37e6 auth/gensec: remove the sync update() hook from gensec_security_ops
       via  9f3d94b auth/spnego: add simple gensec_spnego_update_send/recv() wrapper functions
       via  6aba7de auth/ntlmssp: add implement gensec_ntlmssp_update_send/recv()
       via  4e3c850 auth/ntlmssp: make gensec_ntlmssp_update() static
       via  b5a0f39 auth/ntlmssp: rename 'input' to 'in' in gensec_ntlmssp_update()
       via  458495d auth/ntlmssp: remove unused variable from gensec_ntlmssp_update()
       via  458d87f auth/ntlmssp: avoid using NT_STATUS_NOT_OK_RETURN() in gensec_ntlmssp_update()
       via  33a1bba auth/ntlmssp: remove mem_ctx=NULL handling from gensec_ntlmssp_update()
       via  650a81f s4:gensec_krb5: add simple gensec_krb5_update_send/recv() wrapper functions
       via  58b629b s4:gensec_gssapi: add simple gensec_gssapi_update_send/recv() wrapper functions
       via  1e997d7 s3:gse: add simple gensec_gse_update_send/recv() wrapper functions
       via  86f1ca2 s4:gensec/http_basic: add simple gensec_http_basic_update_send/recv() wrapper functions
       via  d718e92 s4:gensec/http_ntlm: add implement gensec_http_ntlm_update_send/recv()
       via  b713da0 auth/spnego: make sure a fatal error or the final success make the state as SPNEGO_DONE
       via  06fa3ae auth/spnego: let spnego.c use the new gensec_child_* helper functions
       via  8332941 auth/gensec: add gensec_child_* helper functions
       via  2aab27f auth/gensec: reset existing context on gensec_start_mech()
       via  1d7ffba auth/gensec: make gensec_start_mech() static
       via  e9ec93e s4:rpc_server: simplify the GENSEC_FEATURE_SIGN_PKT_HEADER logic
       via  278f220 s4:librpc: ask for GENSEC_FEATURE_SIGN_PKT_HEADER after the gensec_update() dance
       via  e217c2e s3:rpc_server: move gensec_update() out of auth_generic_server_authtype_start*()
       via  15a7f96 s3:cli_pipe: ask for GENSEC_FEATURE_SIGN_PKT_HEADER after the gensec_update() dance
       via  39b0ba4 auth/gensec: add some basic doxygen comments for gensec_{want,have}_feature()
       via  8ddf316 auth/spnego: always announce GENSEC_FEATURE_SIGN_PKT_HEADER support.
       via  0ff6a1a s4:gensec_gssapi: always announce GENSEC_FEATURE_SIGN_PKT_HEADER
       via  2ce2351 s3:gse: always announce GENSEC_FEATURE_SIGN_PKT_HEADER support.
       via  688c659 selftest: let fl2003dc use "dcesrv:header signing = no"
       via  314b577 s4:smb_server: avoid using gensec_update_ev() for the negotiate blob
       via  f442457 s3:libsmb: don't rely on gensec_session_key() to work on an unfinished authentication
       via  76693c1 auth/gensec: call gensec_verify_features() also after update_recv() in gensec_update_ev()
       via  3169196 auth/spnego: fix gensec_update_ev() argument order for the SPNEGO_FALLBACK case
      from  1116ee1 selftest: Actually run python3 tests during the selftest

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 27324112b61039126799d76a33a2883747f01267
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 23:53:38 2017 +0200

    s4:libcli/ldap: just use gensec_update() in ldap_bind_sasl()
    
    We're in a blocking/sync call, we should avoid using nested event loops for
    this. As far as I can see ldap_bind_sasl() is only called from command line
    tools, which are ok to block.
    
    Resolving this requires also resolving the general case in LDB, as that is the
    API this is used from.  We would need ldb_connect_send() and ldb_connect_recv()
    at a start.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Mon May 22 01:12:23 CEST 2017 on sn-devel-144

commit 3c2e02968e687a96cae30ba13d69205644f12dac
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 23:37:22 2017 +0200

    s4:libcli/smb2: make smb2_session_setup_spnego_* completely async
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2c3e99d1697b83f7dd498596a274fe2e8e96116d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 22:49:09 2017 +0200

    s4:librpc: simplify dcerpc_connect_timeout_handler() logic
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2c4e21cd6ed3a09a1d4ddf8c5d2c12748dc9f449
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 22:46:39 2017 +0200

    s4:librpc: make use of gensec_update_send() in bind_auth_next_step()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 65655f24842b864f32136c7ffed446223d416512
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 22:36:20 2017 +0200

    s4:librpc: use gensec_update_send() in dcerpc_bind_auth_send()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f31c55fd9b7d8358255aec11cfe5e9486c6f2483
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 15:20:56 2017 +0200

    s4:rpc_server: implement async AUTH3 using gensec_update_send/recv
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0f5582994099b47daa1f988ca0f058728b6078ea
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 15:20:56 2017 +0200

    s4:rpc_server: implement async ALTER_CONTEXT using gensec_update_send/recv
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2681370ceaa592aa6891120f39d5946ffbb35fb3
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 15:20:56 2017 +0200

    s4:rpc_server: implement async BIND using gensec_update_send/recv
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c449313df777dcc31e70eab0cf6527e108c9c03c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 14:03:54 2017 +0200

    s4:rpc_server: remove unused dcesrv_auth_{bind_ack,auth3,alter_ack}()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b680e9e0eaf03e60ad00678d7500cc69706bc1ea
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 14:02:07 2017 +0200

    s4:rpc_server: make use of dcesrv_auth_prepare_auth3() in dcesrv_auth3()
    
    It means we also need to call gensec_update_ev() and dcesrv_auth_complete()
    directly in dcesrv_auth3(). Doing that will make it easier to make dcesrv_auth3()
    async in the next commits.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit aa2df9efb56d52cf5f24d72a15a781c4f397fc0e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 14:02:07 2017 +0200

    s4:rpc_server: make use of dcesrv_auth_prepare_alter_ack() in dcesrv_alter()
    
    It means we also need to call gensec_update_ev() and dcesrv_auth_complete()
    directly in dcesrv_alter(). Doing that will make it easier to make dcesrv_alter()
    async in the next commits.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 7274dffa75c63620ee02ad6cc750876ef0885ceb
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 14:02:07 2017 +0200

    s4:rpc_server: make use of dcesrv_auth_prepare_bind_ack() in dcesrv_bind()
    
    It means we also need to call gensec_update_ev() and dcesrv_auth_complete()
    directly in dcesrv_bind(). Doing that will make it easier to make dcesrv_bind()
    async in the next commits.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 5a408bbdc8c4233e80428866fde9300219c4474b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 17:37:05 2017 +0200

    s4:rpc_server: make use of dcesrv_auth_reply() in dcesrv_alter()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d698c839463f4556883e39752cf7db40bf1cae62
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 17:19:31 2017 +0200

    s4:rpc_server: split out dcesrv_auth_reply() from dcesrv_bind()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6cc8d7880d3c22d6cf680efae3cf4079daec7f0b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 17:36:17 2017 +0200

    s4:rpc_server: remove useless TALLOC_FREE(call->context) from dcesrv_bind()
    
    This is not needed if we're terminating the connection anyway.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit bcf33f3cb63f20b7f13690c8ec6f62b89f79f09b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 12:16:35 2017 +0200

    s4:rpc_server: split out dcesrv_auth_prepare_alter_ack()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 352b5ecca33aed7eca46b91a8aae0aa29967f534
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 12:16:35 2017 +0200

    s4:rpc_server: split out dcesrv_auth_prepare_auth3()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f65625e4e7f96031f6e1450f487d5910ad70c822
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 12:16:35 2017 +0200

    s4:rpc_server: split out dcesrv_auth_prepare_bind_ack()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9f5110b5b5e8f8b22522cdcf460b6cafd1c3943a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 09:13:08 2017 +0200

    s4:rpc_server: make use of dcesrv_auth_complete() in dcesrv_auth_auth3()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f3be27c79c7a164f31329835cb7023f94b53a6e0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 09:13:08 2017 +0200

    s4:rpc_server: prepare dcesrv_auth_complete() for AUTH3
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f9a2db82b919d63701e270d88cc6553cf0985a20
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 09:14:21 2017 +0200

    s4:rpc_server: make use of dcesrv_auth_complete() in dcesrv_auth_alter_ack()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8ec1254ab46cdcf1f695adb9397921ad598659a2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 09:00:45 2017 +0200

    s4:rpc_server: split out dcesrv_auth_complete() from dcesrv_auth_bind_ack()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 3e94bd75762e7a8af79d69ed8e8548ed6bc201d4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 08:11:29 2017 +0200

    s4:rpc_server: add wait_send/recv infrastructure
    
    This will be used to implement async BIND/ALTER_CONTEXT/AUTH3
    using gensec_update_send/recv.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 469e274b7d7780afb2db7b1d820a498679770819
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 14:15:41 2017 +0200

    s4:rpc_server: introduce call->ack_pkt and avoid pkt variable for the response on the stack
    
    This will be needed when we use async authentication using gensec_update_send/recv.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 31c7493094d696ae0eb7b4ad2eeac7937000e18b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 07:50:31 2017 +0200

    s4:kdc: make use of gensec_update() in kpasswd_process()
    
    This avoids using gensec_update_ev() with a nested event loop.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c198dee8ea5b631b7e19e81dc9a8070ef8144ad9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 07:45:47 2017 +0200

    s4:dlz_bind9: assert SPNEGO/KRB5 and use gensec_update()
    
    This avoids using gensec_update_ev() with a nested event loop.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 186543a727463b4a92864ab4eb8837ffc547713d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 07:30:14 2017 +0200

    s4:dns_server: use samba_server_gensec_krb5_start() and gensec_update() in dns_query.c
    
    This avoids using gensec_update_ev() with a nested event loop.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d4f72d0b861e7db438084b8b30656a14a099948f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 07:17:30 2017 +0200

    s4:auth: add samba_server_gensec_krb5_start()
    
    This will be used by the dns services to only allow
    spnego/krb5. This makes sure the accepting backend
    doesn't require any RPC or IPC communication for now.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 93a6b9da0f4cb0fb4764af4a8c488c6d06c1dff0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon May 15 07:17:00 2017 +0200

    s4:auth: split out a samba_server_gensec_start_settings() helper function
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4f597f1e5e567ef592ae65a73c536aefcbdea475
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 13:28:10 2017 +0200

    auth/gensec: make sure there's only one pending gensec_update_send() per context
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8a3a1111ed2561a40333ebf644a82314ffde7b15
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 13:23:07 2017 +0200

    auth/gensec: improve NT_STATUS_MORE_PROCESSING_REQUIRED logic in gensec_update_*()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9e3b27d35cca992d92735d0019a5524ef9b5b293
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 13:25:26 2017 +0200

    auth/gensec: avoid using a state->subreq pointer
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a5f37e6cca68358d6ae077977ee6b690981a7cd9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 12:48:41 2017 +0200

    auth/gensec: remove the sync update() hook from gensec_security_ops
    
    Some backends still do some nested event context magic,
    but that mapping between async and sync is done in these backends
    and not in the core gensec code anymore.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9f3d94b750fa9a7f1d724abcc1688f3cc02a29ad
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 09:04:02 2017 +0200

    auth/spnego: add simple gensec_spnego_update_send/recv() wrapper functions
    
    TODO: we still need to do the internals async.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6aba7de4ce97d36781808c150186f8f4c8effae8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 09:04:02 2017 +0200

    auth/ntlmssp: add implement gensec_ntlmssp_update_send/recv()
    
    Currently only backend functions are sync functions, but that needs
    to change in future.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4e3c850c47898a44d71c7fa20b382f43bc3c1b29
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 18 08:45:44 2017 +0200

    auth/ntlmssp: make gensec_ntlmssp_update() static
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b5a0f39fd163a4fec53b3f7224f5285301600e72
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 18 08:43:09 2017 +0200

    auth/ntlmssp: rename 'input' to 'in' in gensec_ntlmssp_update()
    
    This matches all other gensec modules.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 458495d604719dd323ecd6b8aa91919ccb555bd6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 17 20:21:19 2017 +0200

    auth/ntlmssp: remove unused variable from gensec_ntlmssp_update()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 458d87f1f12aa38401ca7dd03b2ffd74cc3494cc
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 17 20:21:19 2017 +0200

    auth/ntlmssp: avoid using NT_STATUS_NOT_OK_RETURN() in gensec_ntlmssp_update()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 33a1bbaf1bce15195232f7d0231cec67ae124230
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 17 20:21:19 2017 +0200

    auth/ntlmssp: remove mem_ctx=NULL handling from gensec_ntlmssp_update()
    
    The caller is expected always pass a valid context and this fallback
    was needed ages ago.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 650a81f7bb1ffcc0f31a9c7c29e1e29501170a29
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 09:04:02 2017 +0200

    s4:gensec_krb5: add simple gensec_krb5_update_send/recv() wrapper functions
    
    TODO: we still need to make the internal async.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 58b629b2b13954143693c4863719be3770a398b8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 09:04:02 2017 +0200

    s4:gensec_gssapi: add simple gensec_gssapi_update_send/recv() wrapper functions
    
    TODO: we still need to make the internal async.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 1e997d7a66c55c554df4d5910c685d7043e63aed
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 09:04:02 2017 +0200

    s3:gse: add simple gensec_gse_update_send/recv() wrapper functions
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 86f1ca2dadaa89484e0dd66f4c524ca443317ec2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 09:04:02 2017 +0200

    s4:gensec/http_basic: add simple gensec_http_basic_update_send/recv() wrapper functions
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d718e92d5e145dccd492c46febc249e462ce50c6
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 09:04:02 2017 +0200

    s4:gensec/http_ntlm: add implement gensec_http_ntlm_update_send/recv()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b713da052b69606c436ad5d8a4a095b8a3160e6d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 10 17:12:14 2017 +0200

    auth/spnego: make sure a fatal error or the final success make the state as SPNEGO_DONE
    
    This means any further gensec_update() will fail with
    NT_STATUS_INVALID_PARAMETER.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 06fa3ae313bb36da87f056cc993f201369a30c2b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Dec 30 18:05:17 2016 +0100

    auth/spnego: let spnego.c use the new gensec_child_* helper functions
    
    This means we no longer allow operations on a half finished authentication,
    it's activated by gensec_child_ready().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8332941953c9cc42308e32f6a409c2db39c2936f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Dec 30 17:54:12 2016 +0100

    auth/gensec: add gensec_child_* helper functions
    
    They will be used to simplify the spnego backend
    and maybe of some use for a future negoex backend.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2aab27fef576776520daec90fa546f3e8aff8524
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 00:05:29 2017 +0200

    auth/gensec: reset existing context on gensec_start_mech()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 1d7ffba0be626c67ff3b0f4adc19876da2fdaad2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 00:05:02 2017 +0200

    auth/gensec: make gensec_start_mech() static
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e9ec93e5f28b73736af236bbf28a23df200aa261
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 12 07:56:47 2017 +0200

    s4:rpc_server: simplify the GENSEC_FEATURE_SIGN_PKT_HEADER logic
    
    We can directly check this after gensec_start_mech_by_authtype(),
    the backend either supports it or not. There's nothing that
    can change during the authentication phase.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 278f220c7e2d4428c784105edf1c5db713e14e1b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sun May 14 00:28:50 2017 +0200

    s4:librpc: ask for GENSEC_FEATURE_SIGN_PKT_HEADER after the gensec_update() dance
    
    Most features should be added before the update() dance, while
    GENSEC_FEATURE_SIGN_PKT_HEADER needs to be after the dance on the client
    side.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e217c2e30aa6f9990f1a1b9a1c67ba79570119a5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sun May 14 01:22:32 2017 +0200

    s3:rpc_server: move gensec_update() out of auth_generic_server_authtype_start*()
    
    We let the caller use auth_generic_server_step() instead.
    This allows us to request GENSEC_FEATURE_SIGN_PKT_HEADER before
    starting the gensec_update() dance.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 15a7f961da9c314e182d774842f9d8c044704a65
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sun May 14 00:28:50 2017 +0200

    s3:cli_pipe: ask for GENSEC_FEATURE_SIGN_PKT_HEADER after the gensec_update() dance
    
    Most features should be added before the update() dance, while
    GENSEC_FEATURE_SIGN_PKT_HEADER needs to be after the dance on the client
    side.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 39b0ba4f9648fe4137e66869974ed560f633df8d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sun May 14 02:06:08 2017 +0200

    auth/gensec: add some basic doxygen comments for gensec_{want,have}_feature()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 8ddf3166d488f36c53f80080f7f17c78831080bc
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 12 11:05:15 2017 +0200

    auth/spnego: always announce GENSEC_FEATURE_SIGN_PKT_HEADER support.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 0ff6a1ae1f2b6a4a5bfa458c0a1d56405e28df44
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 12 08:05:03 2017 +0200

    s4:gensec_gssapi: always announce GENSEC_FEATURE_SIGN_PKT_HEADER
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2ce23513e8e62dd4b723dd0e06388524a4995920
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 12 08:04:33 2017 +0200

    s3:gse: always announce GENSEC_FEATURE_SIGN_PKT_HEADER support.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 688c659de2916a8bb9e3b6d25fa40ab5769be8bb
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat May 13 08:37:05 2017 +0200

    selftest: let fl2003dc use "dcesrv:header signing = no"
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 314b577861ee0e6f5498fd2d0a49a76892772849
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu May 11 15:36:31 2017 +0200

    s4:smb_server: avoid using gensec_update_ev() for the negotiate blob
    
    Getting the SPNEGO mech type blob, we don't expect to block for
    any network io, so we can also use gensec_update() which creates
    a temporary event context.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit f4424579a0b4305751b308588c40cb7c005bd9e9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed May 10 16:17:48 2017 +0200

    s3:libsmb: don't rely on gensec_session_key() to work on an unfinished authentication
    
    If smbXcli_session_is_guest() returns true, we should handle the authentication
    as anonymous and don't touch the gensec context anymore.
    
    Note that smbXcli_session_is_guest() always returns false, if signing is
    required!
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 76693c197adff1cebdd30837310a89c95f3ce4ee
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat May 13 02:25:44 2017 +0200

    auth/gensec: call gensec_verify_features() also after update_recv() in gensec_update_ev()
    
    This is no a real problem until now, because the only backends with update_send()/recv()
    are "schannel" (which only supports AUTH_LEVEL_{INTEGRITY,PRIVACY}) and
    "naclrpc_as_system" (which doesn't support any protection beside using unix
    domain sockets).
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 31691963b3d9ac460df0c56d36f81ec815db0225
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri May 12 09:10:19 2017 +0200

    auth/spnego: fix gensec_update_ev() argument order for the SPNEGO_FALLBACK case
    
    This went unnoticed so long as we don't use -Wc++-compat
    and gensec_update_ev() used the sync update() hook for all
    NTLMSSP and Kerberos.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12788
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 auth/gensec/gensec.c                     | 146 +++++-------
 auth/gensec/gensec.h                     |  44 +++-
 auth/gensec/gensec_internal.h            |  55 ++++-
 auth/gensec/gensec_start.c               |  59 ++++-
 auth/gensec/gensec_util.c                | 196 ++++++++++++++++
 auth/gensec/spnego.c                     | 330 +++++++-------------------
 auth/ntlmssp/ntlmssp.c                   |  90 ++++---
 auth/ntlmssp/ntlmssp_private.h           |   7 -
 selftest/target/Samba4.pm                |   1 +
 source3/librpc/crypto/gse.c              |  96 ++++++--
 source3/libsmb/cliconnect.c              |   5 +-
 source3/rpc_client/cli_pipe.c            |  20 +-
 source3/rpc_server/dcesrv_auth_generic.c |  14 --
 source3/rpc_server/dcesrv_auth_generic.h |   2 -
 source3/rpc_server/srv_pipe.c            |  22 +-
 source4/auth/auth.h                      |   7 +
 source4/auth/gensec/gensec_gssapi.c      | 100 +++++---
 source4/auth/gensec/gensec_krb5.c        |  86 +++++--
 source4/auth/samba_server_gensec.c       |  79 ++++++-
 source4/dns_server/dlz_bind9.c           |  42 +++-
 source4/dns_server/dns_query.c           |  37 ++-
 source4/kdc/kpasswd-service.c            |  20 +-
 source4/lib/http/gensec/basic.c          |  78 ++++++-
 source4/lib/http/gensec/ntlm.c           | 126 +++++++---
 source4/libcli/ldap/ldap_bind.c          |   3 +-
 source4/libcli/smb2/session.c            | 253 ++++++++++++--------
 source4/librpc/rpc/dcerpc.h              |   8 -
 source4/librpc/rpc/dcerpc_auth.c         |  99 +++++---
 source4/librpc/rpc/dcerpc_connect.c      |  10 +-
 source4/rpc_server/dcerpc_server.c       | 389 ++++++++++++++++++++++++++-----
 source4/rpc_server/dcerpc_server.h       |  15 ++
 source4/rpc_server/dcesrv_auth.c         | 216 ++++++++---------
 source4/smb_server/smb/negprot.c         |   3 +-
 source4/smb_server/smb2/negprot.c        |   3 +-
 34 files changed, 1796 insertions(+), 865 deletions(-)


Changeset truncated at 500 lines:

diff --git a/auth/gensec/gensec.c b/auth/gensec/gensec.c
index 6cc82e6..014516f 100644
--- a/auth/gensec/gensec.c
+++ b/auth/gensec/gensec.c
@@ -330,45 +330,8 @@ _PUBLIC_ NTSTATUS gensec_update_ev(struct gensec_security *gensec_security,
 	struct tevent_req *subreq = NULL;
 	bool ok;
 
-	if (ops->update_send == NULL) {
-
-		if (ev == NULL) {
-			frame = talloc_stackframe();
-
-			ev = samba_tevent_context_init(frame);
-			if (ev == NULL) {
-				status = NT_STATUS_NO_MEMORY;
-				goto fail;
-			}
-
-			/*
-			 * TODO: remove this hack once the backends
-			 * are fixed.
-			 */
-			tevent_loop_allow_nesting(ev);
-		}
-
-		status = ops->update(gensec_security, out_mem_ctx,
-				     ev, in, out);
-		TALLOC_FREE(frame);
-		if (!NT_STATUS_IS_OK(status)) {
-			return status;
-		}
-
-		/*
-		 * Because callers using the
-		 * gensec_start_mech_by_auth_type() never call
-		 * gensec_want_feature(), it isn't sensible for them
-		 * to have to call gensec_have_feature() manually, and
-		 * these are not points of negotiation, but are
-		 * asserted by the client
-		 */
-		status = gensec_verify_features(gensec_security);
-		if (!NT_STATUS_IS_OK(status)) {
-			return status;
-		}
-
-		return NT_STATUS_OK;
+	if (gensec_security->child_security != NULL) {
+		return NT_STATUS_INVALID_PARAMETER;
 	}
 
 	frame = talloc_stackframe();
@@ -397,6 +360,19 @@ _PUBLIC_ NTSTATUS gensec_update_ev(struct gensec_security *gensec_security,
 		goto fail;
 	}
 	status = ops->update_recv(subreq, out_mem_ctx, out);
+	if (!NT_STATUS_IS_OK(status)) {
+		goto fail;
+	}
+
+	/*
+	 * Because callers using the
+	 * gensec_start_mech_by_auth_type() never call
+	 * gensec_want_feature(), it isn't sensible for them
+	 * to have to call gensec_have_feature() manually, and
+	 * these are not points of negotiation, but are
+	 * asserted by the client
+	 */
+	status = gensec_verify_features(gensec_security);
  fail:
 	TALLOC_FREE(frame);
 	return status;
@@ -422,22 +398,14 @@ _PUBLIC_ NTSTATUS gensec_update(struct gensec_security *gensec_security,
 
 struct gensec_update_state {
 	const struct gensec_security_ops *ops;
-	struct tevent_req *subreq;
 	struct gensec_security *gensec_security;
+	NTSTATUS status;
 	DATA_BLOB out;
-
-	/*
-	 * only for sync backends, we should remove this
-	 * once all backends are async.
-	 */
-	struct tevent_immediate *im;
-	DATA_BLOB in;
 };
 
-static void gensec_update_async_trigger(struct tevent_context *ctx,
-					struct tevent_immediate *im,
-					void *private_data);
-static void gensec_update_subreq_done(struct tevent_req *subreq);
+static void gensec_update_cleanup(struct tevent_req *req,
+				  enum tevent_req_state req_state);
+static void gensec_update_done(struct tevent_req *subreq);
 
 /**
  * Next state function for the GENSEC state machine async version
@@ -455,64 +423,59 @@ _PUBLIC_ struct tevent_req *gensec_update_send(TALLOC_CTX *mem_ctx,
 					       struct gensec_security *gensec_security,
 					       const DATA_BLOB in)
 {
-	struct tevent_req *req;
+	struct tevent_req *req = NULL;
 	struct gensec_update_state *state = NULL;
+	struct tevent_req *subreq = NULL;
 
 	req = tevent_req_create(mem_ctx, &state,
 				struct gensec_update_state);
 	if (req == NULL) {
 		return NULL;
 	}
-
 	state->ops = gensec_security->ops;
 	state->gensec_security = gensec_security;
 
-	if (state->ops->update_send == NULL) {
-		state->in = in;
-		state->im = tevent_create_immediate(state);
-		if (tevent_req_nomem(state->im, req)) {
-			return tevent_req_post(req, ev);
-		}
-
-		tevent_schedule_immediate(state->im, ev,
-					  gensec_update_async_trigger,
-					  req);
-
-		return req;
+	if (gensec_security->update_busy_ptr != NULL) {
+		tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
+		return tevent_req_post(req, ev);
 	}
 
-	state->subreq = state->ops->update_send(state, ev, gensec_security, in);
-	if (tevent_req_nomem(state->subreq, req)) {
+	if (gensec_security->child_security != NULL) {
+		tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
 		return tevent_req_post(req, ev);
 	}
 
-	tevent_req_set_callback(state->subreq,
-				gensec_update_subreq_done,
-				req);
+	gensec_security->update_busy_ptr = &state->gensec_security;
+	tevent_req_set_cleanup_fn(req, gensec_update_cleanup);
+
+	subreq = state->ops->update_send(state, ev, gensec_security, in);
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+	tevent_req_set_callback(subreq, gensec_update_done, req);
 
 	return req;
 }
 
-static void gensec_update_async_trigger(struct tevent_context *ctx,
-					struct tevent_immediate *im,
-					void *private_data)
+static void gensec_update_cleanup(struct tevent_req *req,
+				  enum tevent_req_state req_state)
 {
-	struct tevent_req *req =
-		talloc_get_type_abort(private_data, struct tevent_req);
 	struct gensec_update_state *state =
-		tevent_req_data(req, struct gensec_update_state);
-	NTSTATUS status;
+		tevent_req_data(req,
+		struct gensec_update_state);
 
-	status = state->ops->update(state->gensec_security, state, ctx,
-				    state->in, &state->out);
-	if (tevent_req_nterror(req, status)) {
+	if (state->gensec_security == NULL) {
 		return;
 	}
 
-	tevent_req_done(req);
+	if (state->gensec_security->update_busy_ptr == &state->gensec_security) {
+		state->gensec_security->update_busy_ptr = NULL;
+	}
+
+	state->gensec_security = NULL;
 }
 
-static void gensec_update_subreq_done(struct tevent_req *subreq)
+static void gensec_update_done(struct tevent_req *subreq)
 {
 	struct tevent_req *req =
 		tevent_req_callback_data(subreq,
@@ -522,10 +485,13 @@ static void gensec_update_subreq_done(struct tevent_req *subreq)
 		struct gensec_update_state);
 	NTSTATUS status;
 
-	state->subreq = NULL;
-
 	status = state->ops->update_recv(subreq, state, &state->out);
 	TALLOC_FREE(subreq);
+	state->status = status;
+	if (NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+		tevent_req_done(req);
+		return;
+	}
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
@@ -563,18 +529,16 @@ _PUBLIC_ NTSTATUS gensec_update_recv(struct tevent_req *req,
 		tevent_req_data(req, struct gensec_update_state);
 	NTSTATUS status;
 
+	*out = data_blob_null;
+
 	if (tevent_req_is_nterror(req, &status)) {
-		if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-			tevent_req_received(req);
-			return status;
-		}
-	} else {
-		status = NT_STATUS_OK;
+		tevent_req_received(req);
+		return status;
 	}
 
 	*out = state->out;
 	talloc_steal(out_mem_ctx, out->data);
-
+	status = state->status;
 	tevent_req_received(req);
 	return status;
 }
diff --git a/auth/gensec/gensec.h b/auth/gensec/gensec.h
index e7b9477..da3e0fd 100644
--- a/auth/gensec/gensec.h
+++ b/auth/gensec/gensec.h
@@ -147,8 +147,51 @@ struct tevent_req *gensec_update_send(TALLOC_CTX *mem_ctx,
 				      struct gensec_security *gensec_security,
 				      const DATA_BLOB in);
 NTSTATUS gensec_update_recv(struct tevent_req *req, TALLOC_CTX *out_mem_ctx, DATA_BLOB *out);
+/**
+ * @brief Ask for features for a following authentication
+ *
+ * Typically only one specific feature bit should be passed,
+ * but it also works to ask for more features.
+ *
+ * The features must be requested before starting the
+ * gensec_update*() loop.
+ *
+ * The current expection is GENSEC_FEATURE_SIGN_PKT_HEADER,
+ * it can also be requested once the gensec_update*() loop
+ * returned NT_STATUS_OK.
+ *
+ * The features should not be changed during the gensec_update*()
+ * loop.
+ *
+ * @param[in]  gensec_security The context to be used
+ *
+ * @param[in]  feature         The requested feature[s].
+ *
+ */
 void gensec_want_feature(struct gensec_security *gensec_security,
 			 uint32_t feature);
+/**
+ * @brief Ask for one feature after the finished authentication
+ *
+ * Because the return value is bool, the caller can only
+ * ask for one feature at a time.
+ *
+ * The features must be requested after the finished
+ * gensec_update*() loop.
+ *
+ * The current expection is GENSEC_FEATURE_SIGN_PKT_HEADER,
+ * it can also be requested before the gensec_update*() loop,
+ * as the return value only indicates if the backend supports
+ * dcerpc header signing, not if header signing will be used
+ * between client and server. It will be used only if the caller
+ * also used gensec_want_feature(GENSEC_FEATURE_SIGN_PKT_HEADER).
+ *
+ * @param[in]  gensec_security The context to be used.
+ *
+ * @param[in]  feature         The requested feature.
+ *
+ * @return                     true if the feature is supported, false if not.
+ */
 bool gensec_have_feature(struct gensec_security *gensec_security,
 			 uint32_t feature);
 NTTIME gensec_expire_time(struct gensec_security *gensec_security);
@@ -225,7 +268,6 @@ NTSTATUS gensec_sign_packet(struct gensec_security *gensec_security,
 			    const uint8_t *data, size_t length,
 			    const uint8_t *whole_pdu, size_t pdu_length,
 			    DATA_BLOB *sig);
-NTSTATUS gensec_start_mech(struct gensec_security *gensec_security);
 NTSTATUS gensec_start_mech_by_authtype(struct gensec_security *gensec_security,
 				       uint8_t auth_type, uint8_t auth_level);
 const char *gensec_get_name_by_authtype(struct gensec_security *gensec_security, uint8_t authtype);
diff --git a/auth/gensec/gensec_internal.h b/auth/gensec/gensec_internal.h
index 26c9817..c73be11 100644
--- a/auth/gensec/gensec_internal.h
+++ b/auth/gensec/gensec_internal.h
@@ -37,9 +37,6 @@ struct gensec_security_ops {
 	*/
 	NTSTATUS (*magic)(struct gensec_security *gensec_security,
 			  const DATA_BLOB *first_packet);
-	NTSTATUS (*update)(struct gensec_security *gensec_security, TALLOC_CTX *out_mem_ctx,
-			   struct tevent_context *ev,
-			   const DATA_BLOB in, DATA_BLOB *out);
 	struct tevent_req *(*update_send)(TALLOC_CTX *mem_ctx,
 					  struct tevent_context *ev,
 					  struct gensec_security *gensec_security,
@@ -114,7 +111,14 @@ struct gensec_security {
 	 * PAC is found) */
 	struct auth4_context *auth_context;
 
+	struct gensec_security *parent_security;
 	struct gensec_security *child_security;
+
+	/*
+	 * This is used to mark the context as being
+	 * busy in an async gensec_update_send().
+	 */
+	struct gensec_security **update_busy_ptr;
 };
 
 /* this structure is used by backends to determine the size of some critical types */
@@ -129,4 +133,49 @@ NTSTATUS gensec_may_reset_crypto(struct gensec_security *gensec_security,
 
 const char *gensec_final_auth_type(struct gensec_security *gensec_security);
 
+NTSTATUS gensec_child_ready(struct gensec_security *parent,
+			    struct gensec_security *child);
+void gensec_child_want_feature(struct gensec_security *gensec_security,
+			       uint32_t feature);
+bool gensec_child_have_feature(struct gensec_security *gensec_security,
+			       uint32_t feature);
+NTSTATUS gensec_child_unseal_packet(struct gensec_security *gensec_security,
+				    uint8_t *data, size_t length,
+				    const uint8_t *whole_pdu, size_t pdu_length,
+				    const DATA_BLOB *sig);
+NTSTATUS gensec_child_check_packet(struct gensec_security *gensec_security,
+				   const uint8_t *data, size_t length,
+				   const uint8_t *whole_pdu, size_t pdu_length,
+				   const DATA_BLOB *sig);
+NTSTATUS gensec_child_seal_packet(struct gensec_security *gensec_security,
+				  TALLOC_CTX *mem_ctx,
+				  uint8_t *data, size_t length,
+				  const uint8_t *whole_pdu, size_t pdu_length,
+				  DATA_BLOB *sig);
+NTSTATUS gensec_child_sign_packet(struct gensec_security *gensec_security,
+				  TALLOC_CTX *mem_ctx,
+				  const uint8_t *data, size_t length,
+				  const uint8_t *whole_pdu, size_t pdu_length,
+				  DATA_BLOB *sig);
+NTSTATUS gensec_child_wrap(struct gensec_security *gensec_security,
+			   TALLOC_CTX *mem_ctx,
+			   const DATA_BLOB *in,
+			   DATA_BLOB *out);
+NTSTATUS gensec_child_unwrap(struct gensec_security *gensec_security,
+			     TALLOC_CTX *mem_ctx,
+			     const DATA_BLOB *in,
+			     DATA_BLOB *out);
+size_t gensec_child_sig_size(struct gensec_security *gensec_security,
+			     size_t data_size);
+size_t gensec_child_max_input_size(struct gensec_security *gensec_security);
+size_t gensec_child_max_wrapped_size(struct gensec_security *gensec_security);
+NTSTATUS gensec_child_session_key(struct gensec_security *gensec_security,
+				  TALLOC_CTX *mem_ctx,
+				  DATA_BLOB *session_key);
+NTSTATUS gensec_child_session_info(struct gensec_security *gensec_security,
+				   TALLOC_CTX *mem_ctx,
+				   struct auth_session_info **session_info);
+NTTIME gensec_child_expire_time(struct gensec_security *gensec_security);
+const char *gensec_child_final_auth_type(struct gensec_security *gensec_security);
+
 #endif /* __GENSEC_H__ */
diff --git a/auth/gensec/gensec_start.c b/auth/gensec/gensec_start.c
index 0f7e826..c1affd62 100644
--- a/auth/gensec/gensec_start.c
+++ b/auth/gensec/gensec_start.c
@@ -545,6 +545,25 @@ _PUBLIC_ const char **gensec_security_oids(struct gensec_security *gensec_securi
 	return gensec_security_oids_from_ops(gensec_security, mem_ctx, ops, skip);
 }
 
+static int gensec_security_destructor(struct gensec_security *gctx)
+{
+	if (gctx->parent_security != NULL) {
+		if (gctx->parent_security->child_security == gctx) {
+			gctx->parent_security->child_security = NULL;
+		}
+		gctx->parent_security = NULL;
+	}
+
+	if (gctx->child_security != NULL) {
+		if (gctx->child_security->parent_security == gctx) {
+			gctx->child_security->parent_security = NULL;
+		}
+		gctx->child_security = NULL;
+	}
+
+	return 0;
+}
+
 /**
   Start the GENSEC system, returning a context pointer.
   @param mem_ctx The parent TALLOC memory context.
@@ -571,6 +590,7 @@ static NTSTATUS gensec_start(TALLOC_CTX *mem_ctx,
 	 * from it */
 	(*gensec_security)->auth_context = talloc_reference(*gensec_security, auth_context);
 
+	talloc_set_destructor((*gensec_security), gensec_security_destructor);
 	return NT_STATUS_OK;
 }
 
@@ -586,6 +606,10 @@ _PUBLIC_ NTSTATUS gensec_subcontext_start(TALLOC_CTX *mem_ctx,
 				 struct gensec_security *parent,
 				 struct gensec_security **gensec_security)
 {
+	if (parent->child_security != NULL) {
+		return NT_STATUS_INTERNAL_ERROR;
+	}
+
 	(*gensec_security) = talloc_zero(mem_ctx, struct gensec_security);
 	NT_STATUS_HAVE_NO_MEMORY(*gensec_security);
 
@@ -601,6 +625,23 @@ _PUBLIC_ NTSTATUS gensec_subcontext_start(TALLOC_CTX *mem_ctx,
 	(*gensec_security)->settings = talloc_reference(*gensec_security, parent->settings);
 	(*gensec_security)->auth_context = talloc_reference(*gensec_security, parent->auth_context);
 
+	talloc_set_destructor((*gensec_security), gensec_security_destructor);
+	return NT_STATUS_OK;
+}
+
+_PUBLIC_ NTSTATUS gensec_child_ready(struct gensec_security *parent,
+				     struct gensec_security *child)
+{
+	if (parent->child_security != NULL) {
+		return NT_STATUS_INTERNAL_ERROR;
+	}
+
+	if (child->parent_security != NULL) {
+		return NT_STATUS_INTERNAL_ERROR;
+	}
+
+	parent->child_security = child;
+	child->parent_security = parent;
 	return NT_STATUS_OK;
 }
 
@@ -659,10 +700,26 @@ _PUBLIC_ NTSTATUS gensec_server_start(TALLOC_CTX *mem_ctx,
 	return status;
 }
 
-NTSTATUS gensec_start_mech(struct gensec_security *gensec_security)
+static NTSTATUS gensec_start_mech(struct gensec_security *gensec_security)
 {
 	NTSTATUS status;
 
+	/*
+	 * Callers sometimes just reuse a context, we should
+	 * clear the internal state before starting it again.
+	 */
+	talloc_unlink(gensec_security, gensec_security->private_data);
+	gensec_security->private_data = NULL;
+
+	if (gensec_security->child_security != NULL) {
+		/*
+		 * The talloc_unlink(.., gensec_security->private_data)
+		 * should have cleared this via
+		 * gensec_security_destructor().
+		 */
+		return NT_STATUS_INTERNAL_ERROR;
+	}
+
 	if (gensec_security->credentials) {
 		const char *forced_mech = cli_credentials_get_forced_sasl_mech(gensec_security->credentials);
 		if (forced_mech &&
diff --git a/auth/gensec/gensec_util.c b/auth/gensec/gensec_util.c
index da2e2e5..ca5e581 100644
--- a/auth/gensec/gensec_util.c
+++ b/auth/gensec/gensec_util.c
@@ -110,3 +110,199 @@ NTSTATUS gensec_magic_check_krb5_oid(struct gensec_security *unused,
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 }
+
+void gensec_child_want_feature(struct gensec_security *gensec_security,
+			       uint32_t feature)
+{
+	struct gensec_security *child_security = gensec_security->child_security;
+
+	gensec_security->want_features |= feature;
+	if (child_security == NULL) {
+		return;
+	}
+	gensec_want_feature(child_security, feature);
+}
+
+bool gensec_child_have_feature(struct gensec_security *gensec_security,
+			       uint32_t feature)
+{
+	struct gensec_security *child_security = gensec_security->child_security;
+


-- 
Samba Shared Repository



More information about the samba-cvs mailing list