summaryrefslogtreecommitdiff
path: root/source4/libcli/composite/connect.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/libcli/composite/connect.c')
-rw-r--r--source4/libcli/composite/connect.c88
1 files changed, 23 insertions, 65 deletions
diff --git a/source4/libcli/composite/connect.c b/source4/libcli/composite/connect.c
index 310084d0b1..c51c8d48fd 100644
--- a/source4/libcli/composite/connect.c
+++ b/source4/libcli/composite/connect.c
@@ -103,15 +103,16 @@ static NTSTATUS connect_session_setup(struct smbcli_composite *c,
struct smb_composite_connect *io)
{
struct connect_state *state = c->private;
- struct smbcli_request *req = c->req;
- union smb_sesssetup *io_setup = c->req_parms;
+ struct smbcli_composite *req = c->req;
+ struct smbcli_request *req2;
+ struct smb_composite_sesssetup *io_setup = c->req_parms;
union smb_tcon *io_tcon;
NTSTATUS status;
- status = smb_raw_session_setup_recv(req, c, io_setup);
+ status = smb_composite_sesssetup_recv(req);
NT_STATUS_NOT_OK_RETURN(status);
- state->session->vuid = io_setup->nt1.out.vuid;
+ state->session->vuid = io_setup->out.vuid;
/* setup for a tconx */
io->out.tree = smbcli_tree_init(state->session);
@@ -136,41 +137,19 @@ static NTSTATUS connect_session_setup(struct smbcli_composite *c,
io_tcon->tconx.in.device = io->in.service_type;
}
- req = smb_tree_connect_send(io->out.tree, io_tcon);
- NT_STATUS_HAVE_NO_MEMORY(req);
+ req2 = smb_tree_connect_send(io->out.tree, io_tcon);
+ NT_STATUS_HAVE_NO_MEMORY(req2);
- req->async.fn = request_handler;
- req->async.private = c;
+ req2->async.fn = request_handler;
+ req2->async.private = c;
c->req_parms = io_tcon;
- c->req = req;
+ c->req = req2;
c->stage = CONNECT_TCON;
return NT_STATUS_OK;
}
/*
- form an encrypted lanman password from a plaintext password
- and the server supplied challenge
-*/
-static DATA_BLOB lanman_blob(const char *pass, DATA_BLOB challenge)
-{
- DATA_BLOB blob = data_blob(NULL, 24);
- SMBencrypt(pass, challenge.data, blob.data);
- return blob;
-}
-
-/*
- form an encrypted NT password from a plaintext password
- and the server supplied challenge
-*/
-static DATA_BLOB nt_blob(const char *pass, DATA_BLOB challenge)
-{
- DATA_BLOB blob = data_blob(NULL, 24);
- SMBNTencrypt(pass, challenge.data, blob.data);
- return blob;
-}
-
-/*
a negprot request has competed
*/
static NTSTATUS connect_negprot(struct smbcli_composite *c,
@@ -178,8 +157,9 @@ static NTSTATUS connect_negprot(struct smbcli_composite *c,
{
struct connect_state *state = c->private;
struct smbcli_request *req = c->req;
+ struct smbcli_composite *req2;
NTSTATUS status;
- union smb_sesssetup *io_setup;
+ struct smb_composite_sesssetup *io_setup;
status = smb_raw_negotiate_recv(req);
NT_STATUS_NOT_OK_RETURN(status);
@@ -191,45 +171,23 @@ static NTSTATUS connect_negprot(struct smbcli_composite *c,
/* get rid of the extra reference to the transport */
talloc_free(state->transport);
- io_setup = talloc(c, union smb_sesssetup);
+ io_setup = talloc(c, struct smb_composite_sesssetup);
NT_STATUS_HAVE_NO_MEMORY(io_setup);
/* prepare a session setup to establish a security context */
- io_setup->nt1.level = RAW_SESSSETUP_NT1;
- io_setup->nt1.in.bufsize = state->session->transport->options.max_xmit;
- io_setup->nt1.in.mpx_max = state->session->transport->options.max_mux;
- io_setup->nt1.in.vc_num = 1;
- io_setup->nt1.in.sesskey = state->transport->negotiate.sesskey;
- io_setup->nt1.in.capabilities = state->transport->negotiate.capabilities;
- io_setup->nt1.in.domain = io->in.domain;
- io_setup->nt1.in.user = io->in.user;
- io_setup->nt1.in.os = "Unix";
- io_setup->nt1.in.lanman = "Samba";
-
- if (!io->in.password) {
- io_setup->nt1.in.password1 = data_blob(NULL, 0);
- io_setup->nt1.in.password2 = data_blob(NULL, 0);
- } else if (state->session->transport->negotiate.sec_mode &
- NEGOTIATE_SECURITY_CHALLENGE_RESPONSE) {
- io_setup->nt1.in.password1 = lanman_blob(io->in.password,
- state->transport->negotiate.secblob);
- io_setup->nt1.in.password2 = nt_blob(io->in.password,
- state->transport->negotiate.secblob);
- smb_session_use_nt1_session_keys(state->session, io->in.password, &io_setup->nt1.in.password2);
+ io_setup->in.sesskey = state->transport->negotiate.sesskey;
+ io_setup->in.capabilities = state->transport->negotiate.capabilities;
+ io_setup->in.domain = io->in.domain;
+ io_setup->in.user = io->in.user;
+ io_setup->in.password = io->in.password;
- } else {
- io_setup->nt1.in.password1 = data_blob(io->in.password,
- strlen(io->in.password));
- io_setup->nt1.in.password2 = data_blob(NULL, 0);
- }
+ req2 = smb_composite_sesssetup_send(state->session, io_setup);
+ NT_STATUS_HAVE_NO_MEMORY(req2);
- req = smb_raw_session_setup_send(state->session, io_setup);
- NT_STATUS_HAVE_NO_MEMORY(req);
-
- req->async.fn = request_handler;
- req->async.private = c;
+ req2->async.fn = composite_handler;
+ req2->async.private = c;
c->req_parms = io_setup;
- c->req = req;
+ c->req = req2;
c->stage = CONNECT_SESSION_SETUP;
return NT_STATUS_OK;