The branch, master has been updated
       via  237ec2f libsmbclient: Use async cli_full_connection in python 
connection setup
       via  cd2cc97 libsmbclient: Make cli_full_connection async
       via  5daf647 libsmbclient: Make cli_tree_connect async
       via  6d1dc76 libsmbclient: Make cli_raw_tcon async
       via  c38dfeb libsmbclient: Streamline cli_openx a bit
       via  906d173 libsmbclient: Use tevent_req_poll_ntstatus in cli_openx
       via  6bed164 libsmbclient: Streamline cli_tcon_andx a bit
       via  80097ac libsmbclient: Use tevent_req_poll_ntstatus in cli_tcon_andx
       via  47a1de3 libsmbclient: Make cli_start_connection async
       via  82b3069 libsmbclient: Remove unused cli_connect_sock
       via  48053b7 libsmbclient: Add async cli_connect_nb
       via  a7c02f9 libsmbclient: Avoid a talloc_strdup in cli_connect_nb
       via  3b3dacf libsmbclient: Make cli_connect_sock async
       via  9879c88 libsmbclient: Remove unused sync wrappers
       via  0e1e0a6 libsmbclient: Add async cli_session_setup
       via  dc79633 libsmbclient: Remove unused cli_session_setup_ntlmssp()
       via  26359c2 libsmbclient: Add async cli_session_setup_ntlmssp
       via  e2e0449 libsmbclient: Factor out cli_session_setup_get_account
       via  0008d9e libsmbclient: Slightly simplify cli_session_setup_spnego
       via  4627699 libsmbclient: Factor out cli_session_setup_get_principal
       via  54316ea libsmbclient: Avoid a data copy
       via  fbda782 libsmbclient: Fix a leak on talloc_tos()
      from  8956c0d Ensure we test the dirsort module in make test.

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


- Log -----------------------------------------------------------------
commit 237ec2fbac4c69f642eab481813350fb9568ebaf
Author: Volker Lendecke <[email protected]>
Date:   Tue Apr 9 12:15:02 2013 +0200

    libsmbclient: Use async cli_full_connection in python connection setup
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Fri Apr 12 03:07:10 CEST 2013 on sn-devel-104

commit cd2cc97df214a284c55fc5bf43d17aab10808d95
Author: Volker Lendecke <[email protected]>
Date:   Fri Apr 5 14:55:26 2013 +0200

    libsmbclient: Make cli_full_connection async
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 5daf6476fa431bea2815f1e7afbfea3688d39d19
Author: Volker Lendecke <[email protected]>
Date:   Sat Apr 6 10:57:41 2013 +0200

    libsmbclient: Make cli_tree_connect async
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 6d1dc76952febd2b07dda0ec344c16c9464d27a8
Author: Volker Lendecke <[email protected]>
Date:   Fri Apr 5 15:29:14 2013 +0200

    libsmbclient: Make cli_raw_tcon async
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit c38dfebe5f5ef582a17833e12af95f25614de5ee
Author: Volker Lendecke <[email protected]>
Date:   Fri Apr 5 15:09:02 2013 +0200

    libsmbclient: Streamline cli_openx a bit
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 906d173ca43a407752b2ee14fa45c28444a5a98f
Author: Volker Lendecke <[email protected]>
Date:   Fri Apr 5 15:08:22 2013 +0200

    libsmbclient: Use tevent_req_poll_ntstatus in cli_openx
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 6bed164c1553d9b031c7d1b85e642540adcafc1c
Author: Volker Lendecke <[email protected]>
Date:   Fri Apr 5 15:02:51 2013 +0200

    libsmbclient: Streamline cli_tcon_andx a bit
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 80097ac12234b3a7be077a2699d79f0f3dec53f6
Author: Volker Lendecke <[email protected]>
Date:   Fri Apr 5 14:58:02 2013 +0200

    libsmbclient: Use tevent_req_poll_ntstatus in cli_tcon_andx
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 47a1de356eb686cee60c4d1bd22d655b257fd041
Author: Volker Lendecke <[email protected]>
Date:   Fri Apr 5 12:42:01 2013 +0200

    libsmbclient: Make cli_start_connection async
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 82b3069c30f01c45e11f25001a990dab9fef82f6
Author: Volker Lendecke <[email protected]>
Date:   Thu Apr 4 16:56:43 2013 +0200

    libsmbclient: Remove unused cli_connect_sock
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 48053b77f90d9d158b67c1c67046c4b626530324
Author: Volker Lendecke <[email protected]>
Date:   Thu Apr 4 16:55:48 2013 +0200

    libsmbclient: Add async cli_connect_nb
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit a7c02f9a6ec82361b8999141224d74ed31bad630
Author: Volker Lendecke <[email protected]>
Date:   Thu Apr 4 15:01:25 2013 +0200

    libsmbclient: Avoid a talloc_strdup in cli_connect_nb
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 3b3dacf20dc0230be686fc05a65bd699c62a58ec
Author: Volker Lendecke <[email protected]>
Date:   Thu Apr 4 14:36:51 2013 +0200

    libsmbclient: Make cli_connect_sock async
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 9879c88e913ae446ba977baeeeabb298309f5948
Author: Volker Lendecke <[email protected]>
Date:   Tue Apr 2 13:39:05 2013 +0200

    libsmbclient: Remove unused sync wrappers
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 0e1e0a6e4153a585e13bebf617e264523bb13454
Author: Volker Lendecke <[email protected]>
Date:   Tue Apr 2 13:37:30 2013 +0200

    libsmbclient: Add async cli_session_setup
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit dc796331caab6dec1d4fc9883e6dfc4317105d24
Author: Volker Lendecke <[email protected]>
Date:   Tue Apr 2 12:50:43 2013 +0200

    libsmbclient: Remove unused cli_session_setup_ntlmssp()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 26359c25ef1c31b350d82588d628aa8a6b6bd911
Author: Volker Lendecke <[email protected]>
Date:   Sat Mar 9 13:07:57 2013 +0100

    libsmbclient: Add async cli_session_setup_ntlmssp
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit e2e0449a587ed98b67bfc7382fa1f46347987ce7
Author: Volker Lendecke <[email protected]>
Date:   Sat Mar 9 09:53:42 2013 +0100

    libsmbclient: Factor out cli_session_setup_get_account
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 0008d9e1c5151fe841b11651e7bb62c1feb93769
Author: Volker Lendecke <[email protected]>
Date:   Fri Mar 8 19:41:07 2013 +0100

    libsmbclient: Slightly simplify cli_session_setup_spnego
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 4627699e4f03f771e15657be90944a082fb8d740
Author: Volker Lendecke <[email protected]>
Date:   Fri Mar 8 17:21:13 2013 +0100

    libsmbclient: Factor out cli_session_setup_get_principal
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit 54316ea3394f39f54add55ec554cce795ef1463f
Author: Volker Lendecke <[email protected]>
Date:   Fri Mar 8 15:55:51 2013 +0100

    libsmbclient: Avoid a data copy
    
    spnego_parse_negTokenInit does a asn_load of that blob, which does a data 
copy
    itself. So we don't have to had it a copy as well.
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

commit fbda7826b88cf34f445dea73916e2ac958a94cdb
Author: Volker Lendecke <[email protected]>
Date:   Fri Mar 8 17:40:54 2013 +0100

    libsmbclient: Fix a leak on talloc_tos()
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Jeremy Allison <[email protected]>

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

Summary of changes:
 source3/libsmb/cliconnect.c | 1536 ++++++++++++++++++++++++++++++-------------
 source3/libsmb/clifile.c    |    7 +-
 source3/libsmb/proto.h      |   17 +
 source3/libsmb/pylibsmb.c   |   11 +-
 4 files changed, 1091 insertions(+), 480 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c
index ec5c273..3242d8c 100644
--- a/source3/libsmb/cliconnect.c
+++ b/source3/libsmb/cliconnect.c
@@ -293,40 +293,6 @@ static NTSTATUS cli_session_setup_lanman2_recv(struct 
tevent_req *req)
        return tevent_req_simple_recv_ntstatus(req);
 }
 
-static NTSTATUS cli_session_setup_lanman2(struct cli_state *cli, const char 
*user,
-                                         const char *pass, size_t passlen,
-                                         const char *workgroup)
-{
-       TALLOC_CTX *frame = talloc_stackframe();
-       struct tevent_context *ev;
-       struct tevent_req *req;
-       NTSTATUS status = NT_STATUS_NO_MEMORY;
-
-       if (smbXcli_conn_has_async_calls(cli->conn)) {
-               /*
-                * Can't use sync call while an async call is in flight
-                */
-               status = NT_STATUS_INVALID_PARAMETER;
-               goto fail;
-       }
-       ev = samba_tevent_context_init(frame);
-       if (ev == NULL) {
-               goto fail;
-       }
-       req = cli_session_setup_lanman2_send(frame, ev, cli, user, pass, 
passlen,
-                                            workgroup);
-       if (req == NULL) {
-               goto fail;
-       }
-       if (!tevent_req_poll_ntstatus(req, ev, &status)) {
-               goto fail;
-       }
-       status = cli_session_setup_lanman2_recv(req);
- fail:
-       TALLOC_FREE(frame);
-       return status;
-}
-
 /****************************************************************************
  Work out suitable capabilities to offer the server.
 ****************************************************************************/
@@ -536,44 +502,6 @@ NTSTATUS cli_session_setup_guest_recv(struct tevent_req 
*req)
        return tevent_req_simple_recv_ntstatus(req);
 }
 
-static NTSTATUS cli_session_setup_guest(struct cli_state *cli)
-{
-       TALLOC_CTX *frame = talloc_stackframe();
-       struct tevent_context *ev;
-       struct tevent_req *req;
-       NTSTATUS status = NT_STATUS_OK;
-
-       if (smbXcli_conn_has_async_calls(cli->conn)) {
-               /*
-                * Can't use sync call while an async call is in flight
-                */
-               status = NT_STATUS_INVALID_PARAMETER;
-               goto fail;
-       }
-
-       ev = samba_tevent_context_init(frame);
-       if (ev == NULL) {
-               status = NT_STATUS_NO_MEMORY;
-               goto fail;
-       }
-
-       req = cli_session_setup_guest_send(frame, ev, cli);
-       if (req == NULL) {
-               status = NT_STATUS_NO_MEMORY;
-               goto fail;
-       }
-
-       if (!tevent_req_poll(req, ev)) {
-               status = map_nt_error_from_unix(errno);
-               goto fail;
-       }
-
-       status = cli_session_setup_guest_recv(req);
- fail:
-       TALLOC_FREE(frame);
-       return status;
-}
-
 /****************************************************************************
  Do a NT1 plaintext session setup.
 ****************************************************************************/
@@ -739,40 +667,6 @@ static NTSTATUS cli_session_setup_plain_recv(struct 
tevent_req *req)
        return tevent_req_simple_recv_ntstatus(req);
 }
 
-static NTSTATUS cli_session_setup_plain(struct cli_state *cli,
-                                       const char *user, const char *pass,
-                                       const char *workgroup)
-{
-       TALLOC_CTX *frame = talloc_stackframe();
-       struct tevent_context *ev;
-       struct tevent_req *req;
-       NTSTATUS status = NT_STATUS_NO_MEMORY;
-
-       if (smbXcli_conn_has_async_calls(cli->conn)) {
-               /*
-                * Can't use sync call while an async call is in flight
-                */
-               status = NT_STATUS_INVALID_PARAMETER;
-               goto fail;
-       }
-       ev = samba_tevent_context_init(frame);
-       if (ev == NULL) {
-               goto fail;
-       }
-       req = cli_session_setup_plain_send(frame, ev, cli, user, pass,
-                                          workgroup);
-       if (req == NULL) {
-               goto fail;
-       }
-       if (!tevent_req_poll_ntstatus(req, ev, &status)) {
-               goto fail;
-       }
-       status = cli_session_setup_plain_recv(req);
- fail:
-       TALLOC_FREE(frame);
-       return status;
-}
-
 /****************************************************************************
    do a NT1 NTLM/LM encrypted session setup - for when extended security
    is not negotiated.
@@ -1100,41 +994,6 @@ static NTSTATUS cli_session_setup_nt1_recv(struct 
tevent_req *req)
        return tevent_req_simple_recv_ntstatus(req);
 }
 
-static NTSTATUS cli_session_setup_nt1(struct cli_state *cli, const char *user,
-                                     const char *pass, size_t passlen,
-                                     const char *ntpass, size_t ntpasslen,
-                                     const char *workgroup)
-{
-       TALLOC_CTX *frame = talloc_stackframe();
-       struct tevent_context *ev;
-       struct tevent_req *req;
-       NTSTATUS status = NT_STATUS_NO_MEMORY;
-
-       if (smbXcli_conn_has_async_calls(cli->conn)) {
-               /*
-                * Can't use sync call while an async call is in flight
-                */
-               status = NT_STATUS_INVALID_PARAMETER;
-               goto fail;
-       }
-       ev = samba_tevent_context_init(frame);
-       if (ev == NULL) {
-               goto fail;
-       }
-       req = cli_session_setup_nt1_send(frame, ev, cli, user, pass, passlen,
-                                        ntpass, ntpasslen, workgroup);
-       if (req == NULL) {
-               goto fail;
-       }
-       if (!tevent_req_poll_ntstatus(req, ev, &status)) {
-               goto fail;
-       }
-       status = cli_session_setup_nt1_recv(req);
- fail:
-       TALLOC_FREE(frame);
-       return status;
-}
-
 /* The following is calculated from :
  * (smb_size-4) = 35
  * (smb_wcnt * 2) = 24 (smb_wcnt == 12 in cli_session_setup_blob_send() )
@@ -1554,33 +1413,6 @@ static ADS_STATUS cli_session_setup_kerberos_recv(struct 
tevent_req *req)
        return state->ads_status;
 }
 
-static ADS_STATUS cli_session_setup_kerberos(struct cli_state *cli,
-                                            const char *principal)
-{
-       struct tevent_context *ev;
-       struct tevent_req *req;
-       ADS_STATUS status = ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
-
-       if (smbXcli_conn_has_async_calls(cli->conn)) {
-               return ADS_ERROR_NT(NT_STATUS_INVALID_PARAMETER);
-       }
-       ev = samba_tevent_context_init(talloc_tos());
-       if (ev == NULL) {
-               goto fail;
-       }
-       req = cli_session_setup_kerberos_send(ev, ev, cli, principal);
-       if (req == NULL) {
-               goto fail;
-       }
-       if (!tevent_req_poll(req, ev)) {
-               status = ADS_ERROR_SYSTEM(errno);
-               goto fail;
-       }
-       status = cli_session_setup_kerberos_recv(req);
-fail:
-       TALLOC_FREE(ev);
-       return status;
-}
 #endif /* HAVE_KRB5 */
 
 /****************************************************************************
@@ -1829,33 +1661,64 @@ static NTSTATUS cli_session_setup_ntlmssp_recv(struct 
tevent_req *req)
        return NT_STATUS_OK;
 }
 
-static NTSTATUS cli_session_setup_ntlmssp(struct cli_state *cli,
-                                         const char *user,
-                                         const char *pass,
-                                         const char *domain)
+#ifdef HAVE_KRB5
+
+static char *cli_session_setup_get_principal(
+       TALLOC_CTX *mem_ctx, const char *spnego_principal,
+       const char *remote_name, const char *dest_realm)
 {
-       struct tevent_context *ev;
-       struct tevent_req *req;
-       NTSTATUS status = NT_STATUS_NO_MEMORY;
+       char *principal = NULL;
 
-       if (smbXcli_conn_has_async_calls(cli->conn)) {
-               return NT_STATUS_INVALID_PARAMETER;
+       if (!lp_client_use_spnego_principal() ||
+           strequal(principal, ADS_IGNORE_PRINCIPAL)) {
+               spnego_principal = NULL;
        }
-       ev = samba_tevent_context_init(talloc_tos());
-       if (ev == NULL) {
-               goto fail;
+       if (spnego_principal != NULL) {
+               DEBUG(3, ("cli_session_setup_spnego: using spnego provided "
+                         "principal %s\n", spnego_principal));
+               return talloc_strdup(mem_ctx, spnego_principal);
        }
-       req = cli_session_setup_ntlmssp_send(ev, ev, cli, user, pass, domain);
-       if (req == NULL) {
-               goto fail;
+       if (is_ipaddress(remote_name) ||
+           strequal(remote_name, STAR_SMBSERVER)) {
+               return NULL;
        }
-       if (!tevent_req_poll_ntstatus(req, ev, &status)) {
-               goto fail;
+
+       DEBUG(3, ("cli_session_setup_spnego: using target "
+                 "hostname not SPNEGO principal\n"));
+
+       if (dest_realm) {
+               char *realm = strupper_talloc(talloc_tos(), dest_realm);
+               if (realm == NULL) {
+                       return NULL;
+               }
+               principal = talloc_asprintf(talloc_tos(), "cifs/%s@%s",
+                                           remote_name, realm);
+               TALLOC_FREE(realm);
+       } else {
+               principal = kerberos_get_principal_from_service_hostname(
+                       talloc_tos(), "cifs", remote_name, lp_realm());
        }
-       status = cli_session_setup_ntlmssp_recv(req);
-fail:
-       TALLOC_FREE(ev);
-       return status;
+       DEBUG(3, ("cli_session_setup_spnego: guessed server principal=%s\n",
+                 principal ? principal : "<null>"));
+
+       return principal;
+}
+#endif
+
+static char *cli_session_setup_get_account(TALLOC_CTX *mem_ctx,
+                                          const char *principal)
+{
+       char *account, *p;
+
+       account = talloc_strdup(mem_ctx, principal);
+       if (account == NULL) {
+               return NULL;
+       }
+       p = strchr_m(account, '@');
+       if (p != NULL) {
+               *p = '\0';
+       }
+       return account;
 }
 
 /****************************************************************************
@@ -1865,30 +1728,60 @@ fail:
  dest_realm: The realm we're connecting to, if NULL we use our default realm.
 ****************************************************************************/
 
-static ADS_STATUS cli_session_setup_spnego(struct cli_state *cli,
-                             const char *user,
-                             const char *pass,
-                             const char *user_domain,
-                             const char * dest_realm)
+struct cli_session_setup_spnego_state {
+       struct tevent_context *ev;
+       struct cli_state *cli;
+       const char *user;
+       const char *account;
+       const char *pass;
+       const char *user_domain;
+       const char *dest_realm;
+       ADS_STATUS result;
+};
+
+#ifdef HAVE_KRB5
+static void cli_session_setup_spnego_done_krb(struct tevent_req *subreq);
+#endif
+
+static void cli_session_setup_spnego_done_ntlmssp(struct tevent_req *subreq);
+
+static struct tevent_req *cli_session_setup_spnego_send(
+       TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct cli_state *cli,
+       const char *user, const char *pass, const char *user_domain,
+       const char *dest_realm)
 {
+       struct tevent_req *req, *subreq;
+       struct cli_session_setup_spnego_state *state;
        char *principal = NULL;
        char *OIDs[ASN1_MAX_OIDS];
        int i;
        const DATA_BLOB *server_blob;
-       DATA_BLOB blob = data_blob_null;
-       const char *p = NULL;
-       char *account = NULL;
        NTSTATUS status;
 
-       server_blob = smbXcli_conn_server_gss_blob(cli->conn);
-       if (server_blob) {
-               blob = data_blob(server_blob->data, server_blob->length);
+       req = tevent_req_create(mem_ctx, &state,
+                               struct cli_session_setup_spnego_state);
+       if (req == NULL) {
+               return NULL;
        }
+       state->ev = ev;
+       state->cli = cli;
+       state->user = user;
+       state->pass = pass;
+       state->user_domain = user_domain;
+       state->dest_realm = dest_realm;
 
-       DEBUG(3,("Doing spnego session setup (blob length=%lu)\n", (unsigned 
long)blob.length));
+       state->account = cli_session_setup_get_account(state, user);
+       if (tevent_req_nomem(state->account, req)) {
+               return tevent_req_post(req, ev);
+       }
+
+       server_blob = smbXcli_conn_server_gss_blob(cli->conn);
+
+       DEBUG(3,("Doing spnego session setup (blob length=%lu)\n",
+                (unsigned long)server_blob->length));
 
        /* the server might not even do spnego */
-       if (blob.length == 0) {
+       if (server_blob->length == 0) {
                DEBUG(3,("server didn't supply a full spnego negprot\n"));
                goto ntlmssp;
        }
@@ -1901,12 +1794,13 @@ static ADS_STATUS cli_session_setup_spnego(struct 
cli_state *cli,
         * negprot reply. It is WRONG to depend on the principal sent in the
         * negprot reply, but right now we do it. If we don't receive one,
         * we try to best guess, then fall back to NTLM.  */
-       if (!spnego_parse_negTokenInit(talloc_tos(), blob, OIDs, &principal, 
NULL) ||
+       if (!spnego_parse_negTokenInit(state, *server_blob, OIDs,
+                                      &principal, NULL) ||
                        OIDs[0] == NULL) {
-               data_blob_free(&blob);
-               return ADS_ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+               state->result = ADS_ERROR_NT(NT_STATUS_INVALID_PARAMETER);
+               tevent_req_done(req);
+               return tevent_req_post(req, ev);
        }
-       data_blob_free(&blob);
 
        /* make sure the server understands kerberos */
        for (i=0;OIDs[i];i++) {
@@ -1925,8 +1819,9 @@ static ADS_STATUS cli_session_setup_spnego(struct 
cli_state *cli,
 
        status = cli_set_username(cli, user);
        if (!NT_STATUS_IS_OK(status)) {
-               TALLOC_FREE(principal);
-               return ADS_ERROR_NT(status);
+               state->result = ADS_ERROR_NT(status);
+               tevent_req_done(req);
+               return tevent_req_post(req, ev);
        }
 
 #ifdef HAVE_KRB5
@@ -1934,8 +1829,8 @@ static ADS_STATUS cli_session_setup_spnego(struct 
cli_state *cli,
         * and do not store results */
 
        if (user && *user && cli->got_kerberos_mechanism && cli->use_kerberos) {
-               ADS_STATUS rc;
                const char *remote_name = smbXcli_conn_remote_name(cli->conn);
+               char *tmp;
 
                if (pass && *pass) {
                        int ret;
@@ -1948,99 +1843,136 @@ static ADS_STATUS cli_session_setup_spnego(struct 
cli_state *cli,
                                DEBUG(0, ("Kinit failed: %s\n", 
error_message(ret)));
                                if (cli->fallback_after_kerberos)
                                        goto ntlmssp;
-                               return ADS_ERROR_KRB5(ret);
+                               state->result = ADS_ERROR_KRB5(ret);
+                               tevent_req_done(req);
+                               return tevent_req_post(req, ev);
                        }
                }
 
-               /* We may not be allowed to use the server-supplied SPNEGO 
principal, or it may not have been supplied to us
-                */
-               if (!lp_client_use_spnego_principal() || strequal(principal, 
ADS_IGNORE_PRINCIPAL)) {
-                       TALLOC_FREE(principal);
-               }
-
-               if (principal == NULL &&
-                       !is_ipaddress(remote_name) &&
-                       !strequal(STAR_SMBSERVER,
-                                 remote_name)) {
-                       DEBUG(3,("cli_session_setup_spnego: using target "
-                                "hostname not SPNEGO principal\n"));
-
-                       if (dest_realm) {
-                               char *realm = strupper_talloc(talloc_tos(), 
dest_realm);
-                               if (realm) {
-                                       principal = 
talloc_asprintf(talloc_tos(),
-                                                                   
"cifs/%s@%s",
-                                                                   remote_name,
-                                                                   realm);
-                                       TALLOC_FREE(realm);
-                               }
-                       } else {
-                               principal = 
kerberos_get_principal_from_service_hostname(talloc_tos(),
-                                                                               
         "cifs",
-                                                                               
         remote_name,
-                                                                               
         lp_realm());
-                       }
-
-                       if (!principal) {
-                               return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
-                       }
-                       DEBUG(3,("cli_session_setup_spnego: guessed "
-                               "server principal=%s\n",
-                               principal ? principal : "<null>"));
-               }
+               tmp = cli_session_setup_get_principal(
+                       talloc_tos(), principal, remote_name, dest_realm);
+               TALLOC_FREE(principal);
+               principal = tmp;
 
                if (principal) {
-                       rc = cli_session_setup_kerberos(cli, principal);
-                       if (ADS_ERR_OK(rc) || !cli->fallback_after_kerberos) {
-                               TALLOC_FREE(principal);
-                               return rc;
+                       subreq = cli_session_setup_kerberos_send(
+                               state, ev, cli, principal);
+                       if (tevent_req_nomem(subreq, req)) {
+                               return tevent_req_post(req, ev);
                        }
+                       tevent_req_set_callback(
+                               subreq, cli_session_setup_spnego_done_krb,
+                               req);
+                       return req;
                }
        }
 #endif
 
-       TALLOC_FREE(principal);
-
 ntlmssp:
-
-       account = talloc_strdup(talloc_tos(), user);
-       if (!account) {
-               return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
+       subreq = cli_session_setup_ntlmssp_send(
+               state, ev, cli, state->account, pass, user_domain);
+       if (tevent_req_nomem(subreq, req)) {
+               return tevent_req_post(req, ev);
        }
+       tevent_req_set_callback(
+               subreq, cli_session_setup_spnego_done_ntlmssp, req);
+       return req;
+}
+
+#ifdef HAVE_KRB5
+static void cli_session_setup_spnego_done_krb(struct tevent_req *subreq)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+       struct cli_session_setup_spnego_state *state = tevent_req_data(


-- 
Samba Shared Repository

Reply via email to