[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Sat Aug 10 03:12:02 MDT 2013


The branch, master has been updated
       via  9177a0d libcli/auth: add more const to spnego_negTokenInit->mechTypes
       via  f1e6014 libcli/auth: avoid possible mem leak in read_negTokenInit()
       via  966faef auth/gensec: treat struct gensec_security_ops as const if possible.
       via  c81b6f7 auth/gensec: use 'const char * const *' for function parameters
       via  e81550c auth/gensec: make it possible to implement async backends
       via  6a7a44d auth/gensec: avoid talloc_reference in gensec_security_mechs()
       via  3e3534f auth/gensec: avoid talloc_reference in gensec_use_kerberos_mechs()
       via  71c63e8 auth/gensec: introduce gensec_internal.h
       via  57bcbb9 libcli/auth/schannel: remove unused schannel_position
       via  4c978b6 libcli/auth/schannel: make struct schannel_state private
       via  e90e1b5 s4:gensec/schannel: only require librpc/gen_ndr/dcerpc.h
       via  9b9ab1a s4:gensec/schannel: there's no point in having schannel_session_key()
       via  a07049a s4:gensec/schannel: GENSEC_FEATURE_ASYNC_REPLIES is not supported
       via  b510476 s4:gensec/schannel: use the correct computer_name from netlogon_creds_CredentialState
       via  49f347e s4:gensec/schannel: simplify the code by using netsec_create_state()
       via  4cad5dc s4:gensec/schannel: remove unused dcerpc_schannel_creds()
       via  2ea3a24 s4:torture: avoid usage of dcerpc_schannel_creds()
       via  c014427 s4:libnet: avoid usage of dcerpc_schannel_creds()
       via  a36ccdc s3:dcerpc_helpers: remove unused DEBUG message of schannel_state->seq_num.
       via  a964309 s3:rpc_server: make use of netsec_create_state()
       via  af4dc30 s3:cli_pipe.c: return NO_USER_SESSION_KEY in cli_get_session_key() for schannel
       via  838cb53 s3:cli_pipe: pass down creds->computer_name to NL_AUTH_MESSAGE
       via  e96142f s3:cli_pipe: make use of netsec_create_state()
       via  3321539 libcli/auth: add netsec_create_state()
       via  9f2e81a libcli/auth: maintain the sequence number for the NETLOGON SSP as 64bit
       via  59b0956 auth/gensec: add gensec_security_by_auth_type()
       via  45c74c8 auth/gensec: first check GENSEC_FEATURE_SESSION_KEY before returning NOT_IMPLEMENTED
       via  04938cb s3:rpc_client: remove unused cli_rpc_pipe_open_ntlmssp_auth_schannel()
       via  3302356 s3:rpc_client: remove netr_LogonGetCapabilities check from rpc_pipe_bind*
       via  eecb5ba s3:rpc_client: add netr_LogonGetCapabilities to cli_rpc_pipe_open_schannel_with_key()
       via  e9c8e3f s3:rpc_client: use netlogon_creds_copy before rpc_pipe_bind
       via  90e28c1 s3:rpc_client: fix/add AES downgrade detection to rpc_pipe_bind_step_two_done()
       via  e77a64f s3:rpcclient: try to use NETLOGON_NEG_SUPPORTS_AES
       via  0460063 s3:rpc_client: try to use NETLOGON_NEG_SUPPORTS_AES
       via  beba326 s3:libnet_join: try to use NETLOGON_NEG_SUPPORTS_AES
       via  d82ab705 s3:auth_domain: try to use NETLOGON_NEG_SUPPORTS_AES
       via  11e0be0 s3:libsmb: remove unused cli_state->is_guestlogin
      from  d944841 torture: add smb2 FSCTL_[GET/SET]_COMPRESSION test

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


- Log -----------------------------------------------------------------
commit 9177a0d1c1c92c45ef92fbda55fc6dd8aeb76b6c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 10:46:47 2013 +0200

    libcli/auth: add more const to spnego_negTokenInit->mechTypes
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Sat Aug 10 11:11:54 CEST 2013 on sn-devel-104

commit f1e60142e12deb560e3c62441fd9ff2acd086b60
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 10:43:38 2013 +0200

    libcli/auth: avoid possible mem leak in read_negTokenInit()
    
    Also add error checks.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 966faef9c61d2ec02d75fc3ccc82a61524fb77e4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 11:20:21 2013 +0200

    auth/gensec: treat struct gensec_security_ops as const if possible.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c81b6f7448d7f945635784de645bea4f7f2e230f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 11:10:55 2013 +0200

    auth/gensec: use 'const char * const *' for function parameters
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e81550c8117166d0fbf69ba1d3957cb950c42961
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 16:12:13 2013 +0200

    auth/gensec: make it possible to implement async backends
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 6a7a44db5999af7262478eb1c186d784d6075beb
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 10:39:16 2013 +0200

    auth/gensec: avoid talloc_reference in gensec_security_mechs()
    
    We now always copy.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 3e3534f882651880093381f5a7846c0938df6501
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 10:37:26 2013 +0200

    auth/gensec: avoid talloc_reference in gensec_use_kerberos_mechs()
    
    We now always copy.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 71c63e85e7a09acb57f6b75284358f2b3b29eeed
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 07:12:01 2013 +0200

    auth/gensec: introduce gensec_internal.h
    
    We should treat most gensec related structures private.
    
    It's a long way, but this is a start.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 57bcbb9c50f0a0252110a1e04a2883b511cd9165
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 15:42:21 2013 +0200

    libcli/auth/schannel: remove unused schannel_position
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4c978b68d9a87001f625c10421e7d4cc140b4554
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 13:37:54 2013 +0200

    libcli/auth/schannel: make struct schannel_state private
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e90e1b5c76db4cf589adf8856eb32e5f0d955734
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Aug 3 11:32:31 2013 +0200

    s4:gensec/schannel: only require librpc/gen_ndr/dcerpc.h
    
    We just need DCERPC_AUTH_TYPE_SCHANNEL
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9b9ab1ae6963b3819dc2b095cbe9e1432f3459b7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Aug 3 11:27:55 2013 +0200

    s4:gensec/schannel: there's no point in having schannel_session_key()
    
    gensec_session_key() will return NT_STATUS_NO_USER_SESSION_KEY
    before calling schannel_session_key(), as we don't provide
    GENSEC_FEATURE_SESSION_KEY.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a07049a839729e29ca888bae353cd37fd6238486
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Aug 3 11:21:32 2013 +0200

    s4:gensec/schannel: GENSEC_FEATURE_ASYNC_REPLIES is not supported
    
    There's a sequence number attached to the connection,
    which needs to be incremented with each message...
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit b5104768225ae0308aa3f22f8d9bca389ef3cb3a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 13:25:20 2013 +0200

    s4:gensec/schannel: use the correct computer_name from netlogon_creds_CredentialState
    
    We need to use the same computer_name we used in the netr_Authenticate3
    request.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 49f347eb11bd12a3f25b0fcb8ba36d4a36594868
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 13:04:07 2013 +0200

    s4:gensec/schannel: simplify the code by using netsec_create_state()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 4cad5dcb6d5e49cc9bb1aa4ca454f369e00e8c6f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 12:31:41 2013 +0200

    s4:gensec/schannel: remove unused dcerpc_schannel_creds()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 2ea3a24dced0814100e352bbbca124011be73602
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 10:08:54 2013 +0200

    s4:torture: avoid usage of dcerpc_schannel_creds()
    
    We use cli_credentials_get_netlogon_creds() which returns the same value.
    
    dcerpc_schannel_creds() is a layer violation.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit c0144273af8f0956a05d102113c40cec77069f7a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 10:08:54 2013 +0200

    s4:libnet: avoid usage of dcerpc_schannel_creds()
    
    We use cli_credentials_get_netlogon_creds() which returns the same value.
    
    dcerpc_schannel_creds() is a layer violation.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a36ccdc83edb7437dd00601c459421286fd79db4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 13:36:30 2013 +0200

    s3:dcerpc_helpers: remove unused DEBUG message of schannel_state->seq_num.
    
    This is a layer violation and not needed anymore as we know
    how the seqnum handling works now.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit a964309bf7631f4f6953e0d6556f8ed8e5300dcc
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 13:33:37 2013 +0200

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

commit af4dc306846a30a5a1201306cc2cbf4d494e16e7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Aug 3 08:50:54 2013 +0200

    s3:cli_pipe.c: return NO_USER_SESSION_KEY in cli_get_session_key() for schannel
    
    SCHANNEL connections don't have a user session key,
    they're like anonymous connections.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 838cb539621ef19cac6badb4b10678dcc3a6f68a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 13:28:59 2013 +0200

    s3:cli_pipe: pass down creds->computer_name to NL_AUTH_MESSAGE
    
    We need to use the same computer_name value as in the netr_Authenticate3()
    request.
    
    We abuse cli->auth->user_name to pass the value down.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e96142fc439efb7c90719f9c387778c4218ae637
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 13:28:11 2013 +0200

    s3:cli_pipe: make use of netsec_create_state()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 33215398f32c76f4b8ada7b547c6d0741cb2ac16
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Aug 2 12:53:42 2013 +0200

    libcli/auth: add netsec_create_state()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 9f2e81ae02549369db49c05edf7071612a03a8b8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Apr 24 12:33:28 2013 +0200

    libcli/auth: maintain the sequence number for the NETLOGON SSP as 64bit
    
    See [MS-NPRC] 3.3.4.2 The Netlogon Signature Token.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 59b09564a7edac8dc241269587146342244ce58b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Aug 3 11:43:58 2013 +0200

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

commit 45c74c8084d2db14fef6a79cd98068be2ab73f30
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Aug 3 11:26:13 2013 +0200

    auth/gensec: first check GENSEC_FEATURE_SESSION_KEY before returning NOT_IMPLEMENTED
    
    Preferr NT_STATUS_NO_USER_SESSION_KEY as return value of gensec_session_key().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 04938cbeecc777f7b799a11f1ca0461b351d968a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Apr 25 19:33:28 2013 +0200

    s3:rpc_client: remove unused cli_rpc_pipe_open_ntlmssp_auth_schannel()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 3302356226cca474f0afab9a129220241c16663f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Apr 25 18:30:36 2013 +0200

    s3:rpc_client: remove netr_LogonGetCapabilities check from rpc_pipe_bind*
    
    It's done in the caller now.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit eecb5bafba5b362d4fdf33d6a2a32e4ee56f30a4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Apr 25 19:34:13 2013 +0200

    s3:rpc_client: add netr_LogonGetCapabilities to cli_rpc_pipe_open_schannel_with_key()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e9c8e3fb92143525f846523e446e2213e5b55d9d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Apr 25 19:45:52 2013 +0200

    s3:rpc_client: use netlogon_creds_copy before rpc_pipe_bind
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 90e28c1825b2c48714d7b34fdb57d3878116d07e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Apr 25 19:57:09 2013 +0200

    s3:rpc_client: fix/add AES downgrade detection to rpc_pipe_bind_step_two_done()
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit e77a64f505fc43628e487e832033d0cd8ec4de8e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jun 15 09:41:52 2013 +0200

    s3:rpcclient: try to use NETLOGON_NEG_SUPPORTS_AES
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 04600634b3e761d7c56f699fd4ba80b4cd2926a1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jun 15 09:41:52 2013 +0200

    s3:rpc_client: try to use NETLOGON_NEG_SUPPORTS_AES
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit beba32619a91977543f882432fd08acc9de78fd3
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jun 15 09:41:52 2013 +0200

    s3:libnet_join: try to use NETLOGON_NEG_SUPPORTS_AES
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit d82ab70579ff2bcb69f997068482b198f321d1ef
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Jun 15 09:41:52 2013 +0200

    s3:auth_domain: try to use NETLOGON_NEG_SUPPORTS_AES
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 11e0be0e72cfc4bc65ba2b0ffd10cbae3ad69b2d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 5 20:26:54 2013 +0200

    s3:libsmb: remove unused cli_state->is_guestlogin
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

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

Summary of changes:
 auth/gensec/gensec.c                   |  210 +++++++++++++++++------
 auth/gensec/gensec.h                   |  119 ++-----------
 auth/gensec/gensec_internal.h          |  134 ++++++++++++++
 auth/gensec/gensec_start.c             |  142 +++++++++------
 auth/gensec/gensec_util.c              |    1 +
 auth/gensec/spnego.c                   |   11 +-
 auth/ntlmssp/gensec_ntlmssp.c          |    1 +
 auth/ntlmssp/gensec_ntlmssp_server.c   |    1 +
 auth/ntlmssp/ntlmssp.c                 |    1 +
 auth/ntlmssp/ntlmssp_client.c          |    1 +
 auth/ntlmssp/ntlmssp_server.c          |    1 +
 libcli/auth/schannel.h                 |   13 --
 libcli/auth/schannel_proto.h           |    3 +
 libcli/auth/schannel_sign.c            |   45 +++++-
 libcli/auth/spnego.h                   |    2 +-
 libcli/auth/spnego_parse.c             |   36 +++-
 libcli/auth/spnego_proto.h             |    2 +-
 source3/auth/auth_domain.c             |    3 +-
 source3/auth/auth_generic.c            |   15 +-
 source3/include/client.h               |    1 -
 source3/libads/authdata.c              |   12 +-
 source3/libnet/libnet_join.c           |    3 +-
 source3/librpc/crypto/gse.c            |    1 +
 source3/librpc/rpc/dcerpc_helpers.c    |    3 -
 source3/libsmb/auth_generic.c          |   15 +-
 source3/libsmb/cliconnect.c            |    5 -
 source3/libsmb/ntlmssp_wrap.c          |    1 +
 source3/rpc_client/cli_netlogon.c      |    3 +-
 source3/rpc_client/cli_pipe.c          |  301 ++++++++++++-------------------
 source3/rpc_client/cli_pipe.h          |    9 -
 source3/rpc_client/cli_pipe_schannel.c |   82 +---------
 source3/rpc_server/srv_pipe.c          |   12 +-
 source3/rpcclient/cmd_netlogon.c       |    3 +-
 source3/rpcclient/rpcclient.c          |    3 +-
 source3/utils/ntlm_auth.c              |   25 ++--
 source4/auth/gensec/cyrus_sasl.c       |    1 +
 source4/auth/gensec/gensec_gssapi.c    |    1 +
 source4/auth/gensec/gensec_krb5.c      |    1 +
 source4/auth/gensec/pygensec.c         |    1 +
 source4/auth/gensec/schannel.c         |  141 ++++-----------
 source4/auth/gensec/schannel.h         |   26 ---
 source4/ldap_server/ldap_backend.c     |    5 +-
 source4/libcli/ldap/ldap_bind.c        |    1 +
 source4/libnet/libnet_samsync.c        |    7 +-
 source4/torture/auth/ntlmssp.c         |    1 +
 source4/torture/rpc/samlogon.c         |    5 +-
 source4/torture/rpc/samr.c             |    6 +-
 source4/torture/rpc/samsync.c          |   11 +-
 source4/torture/rpc/schannel.c         |    6 +-
 source4/utils/ntlm_auth.c              |    1 +
 50 files changed, 705 insertions(+), 729 deletions(-)
 create mode 100644 auth/gensec/gensec_internal.h
 delete mode 100644 source4/auth/gensec/schannel.h


Changeset truncated at 500 lines:

diff --git a/auth/gensec/gensec.c b/auth/gensec/gensec.c
index ea62861..abcbcb9 100644
--- a/auth/gensec/gensec.c
+++ b/auth/gensec/gensec.c
@@ -26,6 +26,7 @@
 #include "lib/tsocket/tsocket.h"
 #include "lib/util/tevent_ntstatus.h"
 #include "auth/gensec/gensec.h"
+#include "auth/gensec/gensec_internal.h"
 #include "librpc/rpc/dcerpc.h"
 
 /*
@@ -155,13 +156,14 @@ _PUBLIC_ NTSTATUS gensec_session_key(struct gensec_security *gensec_security,
 				     TALLOC_CTX *mem_ctx,
 				     DATA_BLOB *session_key)
 {
-	if (!gensec_security->ops->session_key) {
-		return NT_STATUS_NOT_IMPLEMENTED;
-	}
 	if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SESSION_KEY)) {
 		return NT_STATUS_NO_USER_SESSION_KEY;
 	}
 
+	if (!gensec_security->ops->session_key) {
+		return NT_STATUS_NOT_IMPLEMENTED;
+	}
+
 	return gensec_security->ops->session_key(gensec_security, mem_ctx, session_key);
 }
 
@@ -216,61 +218,92 @@ _PUBLIC_ NTSTATUS gensec_update(struct gensec_security *gensec_security, TALLOC_
 				const DATA_BLOB in, DATA_BLOB *out)
 {
 	NTSTATUS status;
+	const struct gensec_security_ops *ops = gensec_security->ops;
+	TALLOC_CTX *frame = NULL;
+	struct tevent_req *subreq = NULL;
+	bool ok;
 
-	status = gensec_security->ops->update(gensec_security, out_mem_ctx,
-					      ev, in, out);
-	if (!NT_STATUS_IS_OK(status)) {
-		return status;
-	}
+	if (ops->update_send == NULL) {
 
-	/*
-	 * 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
-	 */
-	switch (gensec_security->dcerpc_auth_level) {
-	case DCERPC_AUTH_LEVEL_INTEGRITY:
-		if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
-			DEBUG(0,("Did not manage to negotiate mandetory feature "
-				 "SIGN for dcerpc auth_level %u\n",
-				 gensec_security->dcerpc_auth_level));
-			return NT_STATUS_ACCESS_DENIED;
-		}
-		break;
-	case DCERPC_AUTH_LEVEL_PRIVACY:
-		if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
-			DEBUG(0,("Did not manage to negotiate mandetory feature "
-				 "SIGN for dcerpc auth_level %u\n",
-				 gensec_security->dcerpc_auth_level));
-			return NT_STATUS_ACCESS_DENIED;
+		status = ops->update(gensec_security, out_mem_ctx,
+				     ev, in, out);
+		if (!NT_STATUS_IS_OK(status)) {
+			return status;
 		}
-		if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SEAL)) {
-			DEBUG(0,("Did not manage to negotiate mandetory feature "
-				 "SEAL for dcerpc auth_level %u\n",
-				 gensec_security->dcerpc_auth_level));
-			return NT_STATUS_ACCESS_DENIED;
+
+		/*
+		 * 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
+		 */
+		switch (gensec_security->dcerpc_auth_level) {
+		case DCERPC_AUTH_LEVEL_INTEGRITY:
+			if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
+				DEBUG(0,("Did not manage to negotiate mandetory feature "
+					 "SIGN for dcerpc auth_level %u\n",
+					 gensec_security->dcerpc_auth_level));
+				return NT_STATUS_ACCESS_DENIED;
+			}
+			break;
+		case DCERPC_AUTH_LEVEL_PRIVACY:
+			if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SIGN)) {
+				DEBUG(0,("Did not manage to negotiate mandetory feature "
+					 "SIGN for dcerpc auth_level %u\n",
+					 gensec_security->dcerpc_auth_level));
+				return NT_STATUS_ACCESS_DENIED;
+			}
+			if (!gensec_have_feature(gensec_security, GENSEC_FEATURE_SEAL)) {
+				DEBUG(0,("Did not manage to negotiate mandetory feature "
+					 "SEAL for dcerpc auth_level %u\n",
+					 gensec_security->dcerpc_auth_level));
+				return NT_STATUS_ACCESS_DENIED;
+			}
+			break;
+		default:
+			break;
 		}
-		break;
-	default:
-		break;
+
+		return NT_STATUS_OK;
 	}
 
-	return NT_STATUS_OK;
+	frame = talloc_stackframe();
+
+	subreq = ops->update_send(frame, ev, gensec_security, in);
+	if (subreq == NULL) {
+		goto fail;
+	}
+	ok = tevent_req_poll_ntstatus(subreq, ev, &status);
+	if (!ok) {
+		goto fail;
+	}
+	status = ops->update_recv(subreq, out_mem_ctx, out);
+ fail:
+	TALLOC_FREE(frame);
+	return status;
 }
 
 struct gensec_update_state {
-	struct tevent_immediate *im;
+	const struct gensec_security_ops *ops;
+	struct tevent_req *subreq;
 	struct gensec_security *gensec_security;
-	DATA_BLOB in;
 	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);
+
 /**
  * Next state function for the GENSEC state machine async version
  *
@@ -296,17 +329,31 @@ _PUBLIC_ struct tevent_req *gensec_update_send(TALLOC_CTX *mem_ctx,
 		return NULL;
 	}
 
-	state->gensec_security		= gensec_security;
-	state->in			= in;
-	state->out			= data_blob(NULL, 0);
-	state->im			= tevent_create_immediate(state);
-	if (tevent_req_nomem(state->im, req)) {
+	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;
+	}
+
+	state->subreq = state->ops->update_send(state, ev, gensec_security, in);
+	if (tevent_req_nomem(state->subreq, req)) {
 		return tevent_req_post(req, ev);
 	}
 
-	tevent_schedule_immediate(state->im, ev,
-				  gensec_update_async_trigger,
-				  req);
+	tevent_req_set_callback(state->subreq,
+				gensec_update_subreq_done,
+				req);
 
 	return req;
 }
@@ -321,12 +368,71 @@ static void gensec_update_async_trigger(struct tevent_context *ctx,
 		tevent_req_data(req, struct gensec_update_state);
 	NTSTATUS status;
 
-	status = gensec_update(state->gensec_security, state, ctx,
-			       state->in, &state->out);
+	status = state->ops->update(state->gensec_security, state, ctx,
+				    state->in, &state->out);
+	if (tevent_req_nterror(req, status)) {
+		return;
+	}
+
+	tevent_req_done(req);
+}
+
+static void gensec_update_subreq_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req =
+		tevent_req_callback_data(subreq,
+		struct tevent_req);
+	struct gensec_update_state *state =
+		tevent_req_data(req,
+		struct gensec_update_state);
+	NTSTATUS status;
+
+	state->subreq = NULL;
+
+	status = state->ops->update_recv(subreq, state, &state->out);
+	TALLOC_FREE(subreq);
 	if (tevent_req_nterror(req, status)) {
 		return;
 	}
 
+	/*
+	 * Because callers using the
+	 * gensec_start_mech_by_authtype() 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
+	 */
+	switch (state->gensec_security->dcerpc_auth_level) {
+	case DCERPC_AUTH_LEVEL_INTEGRITY:
+		if (!gensec_have_feature(state->gensec_security, GENSEC_FEATURE_SIGN)) {
+			DEBUG(0,("Did not manage to negotiate mandetory feature "
+				 "SIGN for dcerpc auth_level %u\n",
+				 state->gensec_security->dcerpc_auth_level));
+			tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+			return;
+		}
+		break;
+	case DCERPC_AUTH_LEVEL_PRIVACY:
+		if (!gensec_have_feature(state->gensec_security, GENSEC_FEATURE_SIGN)) {
+			DEBUG(0,("Did not manage to negotiate mandetory feature "
+				 "SIGN for dcerpc auth_level %u\n",
+				 state->gensec_security->dcerpc_auth_level));
+			tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+			return;
+		}
+		if (!gensec_have_feature(state->gensec_security, GENSEC_FEATURE_SEAL)) {
+			DEBUG(0,("Did not manage to negotiate mandetory feature "
+				 "SEAL for dcerpc auth_level %u\n",
+				 state->gensec_security->dcerpc_auth_level));
+			tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
+			return;
+		}
+		break;
+	default:
+		break;
+	}
+
 	tevent_req_done(req);
 }
 
diff --git a/auth/gensec/gensec.h b/auth/gensec/gensec.h
index 396a16d..ac1fadf 100644
--- a/auth/gensec/gensec.h
+++ b/auth/gensec/gensec.h
@@ -76,6 +76,7 @@ struct gensec_settings;
 struct tevent_context;
 struct tevent_req;
 struct smb_krb5_context;
+struct tsocket_address;
 
 struct gensec_settings {
 	struct loadparm_context *lp_ctx;
@@ -84,7 +85,7 @@ struct gensec_settings {
 	/* this allows callers to specify a specific set of ops that
 	 * should be used, rather than those loaded by the plugin
 	 * mechanism */
-	struct gensec_security_ops **backends;
+	const struct gensec_security_ops * const *backends;
 
 	/* To fill in our own name in the NTLMSSP server */
 	const char *server_dns_domain;
@@ -93,106 +94,13 @@ struct gensec_settings {
 	const char *server_netbios_name;
 };
 
-struct gensec_security_ops {
-	const char *name;
-	const char *sasl_name;
-	uint8_t auth_type;  /* 0 if not offered on DCE-RPC */
-	const char **oid;  /* NULL if not offered by SPNEGO */
-	NTSTATUS (*client_start)(struct gensec_security *gensec_security);
-	NTSTATUS (*server_start)(struct gensec_security *gensec_security);
-	/**
-	   Determine if a packet has the right 'magic' for this mechanism
-	*/
-	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);
-	NTSTATUS (*seal_packet)(struct gensec_security *gensec_security, TALLOC_CTX *sig_mem_ctx,
-				uint8_t *data, size_t length,
-				const uint8_t *whole_pdu, size_t pdu_length,
-				DATA_BLOB *sig);
-	NTSTATUS (*sign_packet)(struct gensec_security *gensec_security, TALLOC_CTX *sig_mem_ctx,
-				const uint8_t *data, size_t length,
-				const uint8_t *whole_pdu, size_t pdu_length,
-				DATA_BLOB *sig);
-	size_t   (*sig_size)(struct gensec_security *gensec_security, size_t data_size);
-	size_t   (*max_input_size)(struct gensec_security *gensec_security);
-	size_t   (*max_wrapped_size)(struct gensec_security *gensec_security);
-	NTSTATUS (*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 (*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 (*wrap)(struct gensec_security *gensec_security,
-				  TALLOC_CTX *mem_ctx,
-				  const DATA_BLOB *in,
-				  DATA_BLOB *out);
-	NTSTATUS (*unwrap)(struct gensec_security *gensec_security,
-			   TALLOC_CTX *mem_ctx,
-			   const DATA_BLOB *in,
-			   DATA_BLOB *out);
-	NTSTATUS (*wrap_packets)(struct gensec_security *gensec_security,
-				 TALLOC_CTX *mem_ctx,
-				 const DATA_BLOB *in,
-				 DATA_BLOB *out,
-				 size_t *len_processed);
-	NTSTATUS (*unwrap_packets)(struct gensec_security *gensec_security,
-				   TALLOC_CTX *mem_ctx,
-				   const DATA_BLOB *in,
-				   DATA_BLOB *out,
-				   size_t *len_processed);
-	NTSTATUS (*packet_full_request)(struct gensec_security *gensec_security,
-					DATA_BLOB blob, size_t *size);
-	NTSTATUS (*session_key)(struct gensec_security *gensec_security, TALLOC_CTX *mem_ctx,
-				DATA_BLOB *session_key);
-	NTSTATUS (*session_info)(struct gensec_security *gensec_security, TALLOC_CTX *mem_ctx,
-				 struct auth_session_info **session_info);
-	void (*want_feature)(struct gensec_security *gensec_security,
-				    uint32_t feature);
-	bool (*have_feature)(struct gensec_security *gensec_security,
-				    uint32_t feature);
-	NTTIME (*expire_time)(struct gensec_security *gensec_security);
-	bool enabled;
-	bool kerberos;
-	enum gensec_priority priority;
-};
-
-struct gensec_security_ops_wrapper {
-	const struct gensec_security_ops *op;
-	const char *oid;
-};
+struct gensec_security_ops;
+struct gensec_security_ops_wrapper;
 
 #define GENSEC_INTERFACE_VERSION 0
 
-struct gensec_security {
-	const struct gensec_security_ops *ops;
-	void *private_data;
-	struct cli_credentials *credentials;
-	struct gensec_target target;
-	enum gensec_role gensec_role;
-	bool subcontext;
-	uint32_t want_features;
-	uint32_t max_update_size;
-	uint8_t dcerpc_auth_level;
-	struct tsocket_address *local_addr, *remote_addr;
-	struct gensec_settings *settings;
-
-	/* When we are a server, this may be filled in to provide an
-	 * NTLM authentication backend, and user lookup (such as if no
-	 * PAC is found) */
-	struct auth4_context *auth_context;
-};
-
 /* this structure is used by backends to determine the size of some critical types */
-struct gensec_critical_sizes {
-	int interface_version;
-	int sizeof_gensec_security_ops;
-	int sizeof_gensec_security;
-};
+struct gensec_critical_sizes;
 const struct gensec_critical_sizes *gensec_interface_version(void);
 
 /* Socket wrapper */
@@ -268,12 +176,15 @@ const struct gensec_security_ops *gensec_security_by_oid(struct gensec_security
 							 const char *oid_string);
 const struct gensec_security_ops *gensec_security_by_sasl_name(struct gensec_security *gensec_security,
 							       const char *sasl_name);
-struct gensec_security_ops **gensec_security_mechs(struct gensec_security *gensec_security,
+const struct gensec_security_ops *gensec_security_by_auth_type(
+				struct gensec_security *gensec_security,
+				uint32_t auth_type);
+const struct gensec_security_ops **gensec_security_mechs(struct gensec_security *gensec_security,
 						   TALLOC_CTX *mem_ctx);
 const struct gensec_security_ops_wrapper *gensec_security_by_oid_list(
 					struct gensec_security *gensec_security,
 					TALLOC_CTX *mem_ctx,
-					const char **oid_strings,
+					const char * const *oid_strings,
 					const char *skip);
 const char **gensec_security_oids(struct gensec_security *gensec_security,
 				  TALLOC_CTX *mem_ctx,
@@ -332,11 +243,11 @@ NTSTATUS gensec_wrap(struct gensec_security *gensec_security,
 		     const DATA_BLOB *in,
 		     DATA_BLOB *out);
 
-struct gensec_security_ops **gensec_security_all(void);
-bool gensec_security_ops_enabled(struct gensec_security_ops *ops, struct gensec_security *security);
-struct gensec_security_ops **gensec_use_kerberos_mechs(TALLOC_CTX *mem_ctx,
-						       struct gensec_security_ops **old_gensec_list,
-						       struct cli_credentials *creds);
+const struct gensec_security_ops * const *gensec_security_all(void);
+bool gensec_security_ops_enabled(const struct gensec_security_ops *ops, struct gensec_security *security);
+const struct gensec_security_ops **gensec_use_kerberos_mechs(TALLOC_CTX *mem_ctx,
+			const struct gensec_security_ops * const *old_gensec_list,
+			struct cli_credentials *creds);
 
 NTSTATUS gensec_start_mech_by_sasl_name(struct gensec_security *gensec_security,
 					const char *sasl_name);
diff --git a/auth/gensec/gensec_internal.h b/auth/gensec/gensec_internal.h
new file mode 100644
index 0000000..c04164a
--- /dev/null
+++ b/auth/gensec/gensec_internal.h
@@ -0,0 +1,134 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Generic Authentication Interface
+
+   Copyright (C) Andrew Tridgell 2003
+   Copyright (C) Andrew Bartlett <abartlet at samba.org> 2004-2005
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef __GENSEC_INTERNAL_H__
+#define __GENSEC_INTERNAL_H__
+
+struct gensec_security;
+
+struct gensec_security_ops {
+	const char *name;
+	const char *sasl_name;
+	uint8_t auth_type;  /* 0 if not offered on DCE-RPC */
+	const char **oid;  /* NULL if not offered by SPNEGO */
+	NTSTATUS (*client_start)(struct gensec_security *gensec_security);
+	NTSTATUS (*server_start)(struct gensec_security *gensec_security);
+	/**
+	   Determine if a packet has the right 'magic' for this mechanism
+	*/
+	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,
+					  const DATA_BLOB in);
+	NTSTATUS (*update_recv)(struct tevent_req *req,
+				TALLOC_CTX *out_mem_ctx,
+				DATA_BLOB *out);
+	NTSTATUS (*seal_packet)(struct gensec_security *gensec_security, TALLOC_CTX *sig_mem_ctx,
+				uint8_t *data, size_t length,
+				const uint8_t *whole_pdu, size_t pdu_length,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list