From e27ba5e4c6f684c0fc0f0db9a84164384ff3c0fd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 12 Nov 2005 02:12:51 +0000 Subject: r11693: added a full async composite function for SMB2 that does: - name resolution - socket connect - negprot - multi-stage session setup - tcon (This used to be commit c1a8e866fe6a0544b7b26da451ea093cdcacdd8f) --- source4/libcli/smb2/connect.c | 280 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 source4/libcli/smb2/connect.c (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c new file mode 100644 index 0000000000..18f28539ea --- /dev/null +++ b/source4/libcli/smb2/connect.c @@ -0,0 +1,280 @@ +/* + Unix SMB/CIFS implementation. + + SMB2 composite connection setup + + Copyright (C) Andrew Tridgell 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 2 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, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "libcli/raw/libcliraw.h" +#include "libcli/smb2/smb2.h" +#include "libcli/smb2/smb2_calls.h" +#include "libcli/composite/composite.h" + +struct smb2_connect_state { + struct smb2_request *req; + struct composite_context *creq; + struct cli_credentials *credentials; + const char *host; + const char *share; + struct smb2_negprot negprot; + struct smb2_tree_connect tcon; + struct smb2_session *session; + struct smb2_tree *tree; +}; + +/* + continue after tcon reply +*/ +static void continue_tcon(struct smb2_request *req) +{ + struct composite_context *c = talloc_get_type(req->async.private, + struct composite_context); + struct smb2_connect_state *state = talloc_get_type(c->private_data, + struct smb2_connect_state); + + c->status = smb2_tree_connect_recv(req, &state->tcon); + if (!NT_STATUS_IS_OK(c->status)) { + composite_error(c, c->status); + return; + } + + state->tree->tid = state->tcon.out.tid; + + composite_done(c); +} + +/* + continue after a session setup +*/ +static void continue_session(struct composite_context *creq) +{ + struct composite_context *c = talloc_get_type(creq->async.private_data, + struct composite_context); + struct smb2_connect_state *state = talloc_get_type(c->private_data, + struct smb2_connect_state); + + c->status = smb2_session_setup_spnego_recv(creq); + if (!NT_STATUS_IS_OK(c->status)) { + composite_error(c, c->status); + return; + } + + state->tree = smb2_tree_init(state->session, state, True); + if (state->tree == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + state->tcon.in.unknown1 = 0x09; + state->tcon.in.path = talloc_asprintf(state, "\\\\%s\\%s", + state->host, state->share); + if (state->tcon.in.path == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + state->req = smb2_tree_connect_send(state->tree, &state->tcon); + if (state->req == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + state->req->async.fn = continue_tcon; + state->req->async.private = c; +} + +/* + continue after negprot reply +*/ +static void continue_negprot(struct smb2_request *req) +{ + struct composite_context *c = talloc_get_type(req->async.private, + struct composite_context); + struct smb2_connect_state *state = talloc_get_type(c->private_data, + struct smb2_connect_state); + struct smb2_transport *transport = req->transport; + + c->status = smb2_negprot_recv(req, c, &state->negprot); + if (!NT_STATUS_IS_OK(c->status)) { + composite_error(c, c->status); + return; + } + + state->session = smb2_session_init(transport, state, True); + if (state->session == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + state->creq = smb2_session_setup_spnego_send(state->session, state->credentials); + if (state->creq == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + state->creq->async.fn = continue_session; + state->creq->async.private_data = c; +} + +/* + continue after a socket connect completes +*/ +static void continue_socket(struct composite_context *creq) +{ + struct composite_context *c = talloc_get_type(creq->async.private_data, + struct composite_context); + struct smb2_connect_state *state = talloc_get_type(c->private_data, + struct smb2_connect_state); + struct smbcli_socket *sock; + struct smb2_transport *transport; + + c->status = smbcli_sock_connect_recv(creq, state, &sock); + if (!NT_STATUS_IS_OK(c->status)) { + composite_error(c, c->status); + return; + } + + transport = smb2_transport_init(sock, state); + if (transport == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + ZERO_STRUCT(state->negprot); + state->negprot.in.unknown1 = 0x010024; + + state->req = smb2_negprot_send(transport, &state->negprot); + if (state->req == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + state->req->async.fn = continue_negprot; + state->req->async.private = c; +} + + +/* + continue after a resolve finishes +*/ +static void continue_resolve(struct composite_context *creq) +{ + struct composite_context *c = talloc_get_type(creq->async.private_data, + struct composite_context); + struct smb2_connect_state *state = talloc_get_type(c->private_data, + struct smb2_connect_state); + const char *addr; + + c->status = resolve_name_recv(creq, state, &addr); + if (!NT_STATUS_IS_OK(c->status)) { + composite_error(c, c->status); + return; + } + + state->creq = smbcli_sock_connect_send(state, addr, 445, state->host, c->event_ctx); + if (state->creq == NULL) { + composite_error(c, NT_STATUS_NO_MEMORY); + return; + } + + state->creq->async.private_data = c; + state->creq->async.fn = continue_socket; +} + +/* + a composite function that does a full negprot/sesssetup/tcon, returning + a connected smb2_tree + */ +struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, + const char *host, + const char *share, + struct cli_credentials *credentials, + struct event_context *ev) +{ + struct composite_context *c; + struct smb2_connect_state *state; + struct nbt_name name; + + c = talloc_zero(mem_ctx, struct composite_context); + if (c == NULL) return NULL; + + state = talloc(c, struct smb2_connect_state); + if (state == NULL) { + c->status = NT_STATUS_NO_MEMORY; + goto failed; + } + + c->state = COMPOSITE_STATE_IN_PROGRESS; + c->private_data = state; + c->event_ctx = ev; + + state->credentials = credentials; + state->host = talloc_strdup(c, host); + state->share = talloc_strdup(c, share); + if (state->host == NULL || state->share == NULL) { + c->status = NT_STATUS_NO_MEMORY; + goto failed; + } + + ZERO_STRUCT(name); + name.name = host; + + state->creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order()); + if (state->creq == NULL) goto failed; + + state->creq->async.private_data = c; + state->creq->async.fn = continue_resolve; + + return c; + +failed: + composite_trigger_error(c); + return c; +} + +/* + receive a connect reply +*/ +NTSTATUS smb2_connect_recv(struct composite_context *c, TALLOC_CTX *mem_ctx, + struct smb2_tree **tree) +{ + NTSTATUS status; + struct smb2_connect_state *state = talloc_get_type(c->private_data, + struct smb2_connect_state); + status = composite_wait(c); + if (NT_STATUS_IS_OK(status)) { + *tree = talloc_steal(mem_ctx, state->tree); + } + talloc_free(c); + return status; +} + +/* + sync version of smb2_connect +*/ +NTSTATUS smb2_connect(TALLOC_CTX *mem_ctx, + const char *host, const char *share, + struct cli_credentials *credentials, + struct smb2_tree **tree, + struct event_context *ev) +{ + struct composite_context *c = smb2_connect_send(mem_ctx, host, share, + credentials, ev); + return smb2_connect_recv(c, mem_ctx, tree); +} -- cgit From e9eb56068573d89f8ce45f08220ca870b3daa669 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 16 Nov 2005 11:01:15 +0000 Subject: r11741: - the buffer code (first 2 bytes in the SMB2 body) seem to be the length of the fixed body part, and +1 if there's a dynamic part - there're 3 types of dynamic blobs with uint16_t offset/uint16_t size with uint16_t offset/uint32_t size with uint32_t offset/uint32_t size /* aligned to 8 bytes */ - strings are transmitted in UTF-16 with no termination and packet into a uint16/uint16 blob metze (This used to be commit 79103c51e5c752fbdb4d25a0047b65002828df89) --- source4/libcli/smb2/connect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 18f28539ea..7b538dc2e6 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -157,8 +157,8 @@ static void continue_socket(struct composite_context *creq) } ZERO_STRUCT(state->negprot); - state->negprot.in.unknown1 = 0x010024; - + state->negprot.in.unknown1 = 0x0001; + state->req = smb2_negprot_send(transport, &state->negprot); if (state->req == NULL) { composite_error(c, NT_STATUS_NO_MEMORY); -- cgit From 552c0111a10c70d2ca24c996838d41d79494969f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 18 Nov 2005 23:15:32 +0000 Subject: r11791: simplify the SMB2 connect code following some suggestions from volker (This used to be commit 71e3e61941621f72f45708340f5d03b2b79580b4) --- source4/libcli/smb2/connect.c | 46 ++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 22 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 7b538dc2e6..38b6e1924e 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -27,8 +27,6 @@ #include "libcli/composite/composite.h" struct smb2_connect_state { - struct smb2_request *req; - struct composite_context *creq; struct cli_credentials *credentials; const char *host; const char *share; @@ -68,6 +66,7 @@ static void continue_session(struct composite_context *creq) struct composite_context); struct smb2_connect_state *state = talloc_get_type(c->private_data, struct smb2_connect_state); + struct smb2_request *req; c->status = smb2_session_setup_spnego_recv(creq); if (!NT_STATUS_IS_OK(c->status)) { @@ -89,14 +88,14 @@ static void continue_session(struct composite_context *creq) return; } - state->req = smb2_tree_connect_send(state->tree, &state->tcon); - if (state->req == NULL) { + req = smb2_tree_connect_send(state->tree, &state->tcon); + if (req == NULL) { composite_error(c, NT_STATUS_NO_MEMORY); return; } - state->req->async.fn = continue_tcon; - state->req->async.private = c; + req->async.fn = continue_tcon; + req->async.private = c; } /* @@ -109,6 +108,7 @@ static void continue_negprot(struct smb2_request *req) struct smb2_connect_state *state = talloc_get_type(c->private_data, struct smb2_connect_state); struct smb2_transport *transport = req->transport; + struct composite_context *creq; c->status = smb2_negprot_recv(req, c, &state->negprot); if (!NT_STATUS_IS_OK(c->status)) { @@ -122,14 +122,14 @@ static void continue_negprot(struct smb2_request *req) return; } - state->creq = smb2_session_setup_spnego_send(state->session, state->credentials); - if (state->creq == NULL) { + creq = smb2_session_setup_spnego_send(state->session, state->credentials); + if (creq == NULL) { composite_error(c, NT_STATUS_NO_MEMORY); return; } - state->creq->async.fn = continue_session; - state->creq->async.private_data = c; + creq->async.fn = continue_session; + creq->async.private_data = c; } /* @@ -143,6 +143,7 @@ static void continue_socket(struct composite_context *creq) struct smb2_connect_state); struct smbcli_socket *sock; struct smb2_transport *transport; + struct smb2_request *req; c->status = smbcli_sock_connect_recv(creq, state, &sock); if (!NT_STATUS_IS_OK(c->status)) { @@ -159,14 +160,14 @@ static void continue_socket(struct composite_context *creq) ZERO_STRUCT(state->negprot); state->negprot.in.unknown1 = 0x0001; - state->req = smb2_negprot_send(transport, &state->negprot); - if (state->req == NULL) { + req = smb2_negprot_send(transport, &state->negprot); + if (req == NULL) { composite_error(c, NT_STATUS_NO_MEMORY); return; } - state->req->async.fn = continue_negprot; - state->req->async.private = c; + req->async.fn = continue_negprot; + req->async.private = c; } @@ -187,14 +188,14 @@ static void continue_resolve(struct composite_context *creq) return; } - state->creq = smbcli_sock_connect_send(state, addr, 445, state->host, c->event_ctx); - if (state->creq == NULL) { + creq = smbcli_sock_connect_send(state, addr, 445, state->host, c->event_ctx); + if (creq == NULL) { composite_error(c, NT_STATUS_NO_MEMORY); return; } - state->creq->async.private_data = c; - state->creq->async.fn = continue_socket; + creq->async.private_data = c; + creq->async.fn = continue_socket; } /* @@ -210,6 +211,7 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, struct composite_context *c; struct smb2_connect_state *state; struct nbt_name name; + struct composite_context *creq; c = talloc_zero(mem_ctx, struct composite_context); if (c == NULL) return NULL; @@ -235,11 +237,11 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, ZERO_STRUCT(name); name.name = host; - state->creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order()); - if (state->creq == NULL) goto failed; + creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order()); + if (creq == NULL) goto failed; - state->creq->async.private_data = c; - state->creq->async.fn = continue_resolve; + creq->async.private_data = c; + creq->async.fn = continue_resolve; return c; -- cgit From 27bab09cdb76364b0e0562304078c79c6612c6e1 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 18 Nov 2005 23:34:47 +0000 Subject: r11795: used a couple more of volkers composite helper functions. They certainly make the code more compact. (This used to be commit 872e2a49d8a1ad1f9a6e2f2d323b3471aeb9cba6) --- source4/libcli/smb2/connect.c | 48 ++++++++----------------------------------- 1 file changed, 9 insertions(+), 39 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 38b6e1924e..cdfc162aae 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -75,24 +75,15 @@ static void continue_session(struct composite_context *creq) } state->tree = smb2_tree_init(state->session, state, True); - if (state->tree == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } + if (composite_nomem(state->tree, c)) return; state->tcon.in.unknown1 = 0x09; state->tcon.in.path = talloc_asprintf(state, "\\\\%s\\%s", state->host, state->share); - if (state->tcon.in.path == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } + if (composite_nomem(state->tcon.in.path, c)) return; req = smb2_tree_connect_send(state->tree, &state->tcon); - if (req == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } + if (composite_nomem(req, c)) return; req->async.fn = continue_tcon; req->async.private = c; @@ -117,19 +108,11 @@ static void continue_negprot(struct smb2_request *req) } state->session = smb2_session_init(transport, state, True); - if (state->session == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } + if (composite_nomem(state->session, c)) return; creq = smb2_session_setup_spnego_send(state->session, state->credentials); - if (creq == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } - creq->async.fn = continue_session; - creq->async.private_data = c; + composite_continue(c, creq, continue_session, c); } /* @@ -152,19 +135,13 @@ static void continue_socket(struct composite_context *creq) } transport = smb2_transport_init(sock, state); - if (transport == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } + if (composite_nomem(transport, c)) return; ZERO_STRUCT(state->negprot); state->negprot.in.unknown1 = 0x0001; req = smb2_negprot_send(transport, &state->negprot); - if (req == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } + if (composite_nomem(req, c)) return; req->async.fn = continue_negprot; req->async.private = c; @@ -189,13 +166,8 @@ static void continue_resolve(struct composite_context *creq) } creq = smbcli_sock_connect_send(state, addr, 445, state->host, c->event_ctx); - if (creq == NULL) { - composite_error(c, NT_STATUS_NO_MEMORY); - return; - } - creq->async.private_data = c; - creq->async.fn = continue_socket; + composite_continue(c, creq, continue_socket, c); } /* @@ -238,10 +210,8 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, name.name = host; creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order()); - if (creq == NULL) goto failed; - creq->async.private_data = c; - creq->async.fn = continue_resolve; + composite_continue(c, creq, continue_resolve, c); return c; -- cgit From 771d4fab26c8580cbc186caee067884a314ecbc7 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 18 Nov 2005 23:48:51 +0000 Subject: r11796: Two more uses of !composite_is_ok (This used to be commit 7256157d01ff47d33706dadd45851cf2fbbce3a6) --- source4/libcli/smb2/connect.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index cdfc162aae..7ed3f97bf3 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -47,10 +47,7 @@ static void continue_tcon(struct smb2_request *req) struct smb2_connect_state); c->status = smb2_tree_connect_recv(req, &state->tcon); - if (!NT_STATUS_IS_OK(c->status)) { - composite_error(c, c->status); - return; - } + if (!composite_is_ok(c)) return; state->tree->tid = state->tcon.out.tid; @@ -69,10 +66,7 @@ static void continue_session(struct composite_context *creq) struct smb2_request *req; c->status = smb2_session_setup_spnego_recv(creq); - if (!NT_STATUS_IS_OK(c->status)) { - composite_error(c, c->status); - return; - } + if (!composite_is_ok(c)) return; state->tree = smb2_tree_init(state->session, state, True); if (composite_nomem(state->tree, c)) return; @@ -102,10 +96,7 @@ static void continue_negprot(struct smb2_request *req) struct composite_context *creq; c->status = smb2_negprot_recv(req, c, &state->negprot); - if (!NT_STATUS_IS_OK(c->status)) { - composite_error(c, c->status); - return; - } + if (!composite_is_ok(c)) return; state->session = smb2_session_init(transport, state, True); if (composite_nomem(state->session, c)) return; @@ -129,10 +120,7 @@ static void continue_socket(struct composite_context *creq) struct smb2_request *req; c->status = smbcli_sock_connect_recv(creq, state, &sock); - if (!NT_STATUS_IS_OK(c->status)) { - composite_error(c, c->status); - return; - } + if (!composite_is_ok(c)) return; transport = smb2_transport_init(sock, state); if (composite_nomem(transport, c)) return; @@ -160,10 +148,7 @@ static void continue_resolve(struct composite_context *creq) const char *addr; c->status = resolve_name_recv(creq, state, &addr); - if (!NT_STATUS_IS_OK(c->status)) { - composite_error(c, c->status); - return; - } + if (!composite_is_ok(c)) return; creq = smbcli_sock_connect_send(state, addr, 445, state->host, c->event_ctx); -- cgit From 111a920fdb92ccef32f89b2f992bdd3051e5ac54 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 8 Dec 2005 01:13:45 +0000 Subject: r12116: got rid of composite_trigger_done() and composite_trigger_error(), and instead make the normal composite_done() and composite_error() functions automatically trigger a delayed callback if the caller has had no opportunity to setup a async callback this removes one of the common mistakes in writing a composite function (This used to be commit f9413ce792ded682e05134b66d433eeec293e6f1) --- source4/libcli/smb2/connect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 7ed3f97bf3..d15f370feb 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -201,7 +201,7 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, return c; failed: - composite_trigger_error(c); + composite_error(c, c->status); return c; } -- cgit From 4ac2be99588b48b0652a524bf12fb1aa9c3f5fbb Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 7 Mar 2006 11:07:23 +0000 Subject: r13924: Split more prototypes out of include/proto.h + initial work on header file dependencies (This used to be commit 122835876748a3eaf5e8d31ad1abddab9acb8781) --- source4/libcli/smb2/connect.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index d15f370feb..b185ff7a88 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -25,6 +25,7 @@ #include "libcli/smb2/smb2.h" #include "libcli/smb2/smb2_calls.h" #include "libcli/composite/composite.h" +#include "libcli/resolve/resolve.h" struct smb2_connect_state { struct cli_credentials *credentials; -- cgit From 7c50eec25edd2e70d9127f8cc35588c4bfbb53f9 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 30 Jul 2006 17:29:02 +0000 Subject: r17318: make better usage of the composite api metze (This used to be commit 683fc25f6524a3821ba70529251aabe97bad9370) --- source4/libcli/smb2/connect.c | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index b185ff7a88..0d772bccd8 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -171,38 +171,24 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, struct nbt_name name; struct composite_context *creq; - c = talloc_zero(mem_ctx, struct composite_context); + c = composite_create(mem_ctx, ev); if (c == NULL) return NULL; state = talloc(c, struct smb2_connect_state); - if (state == NULL) { - c->status = NT_STATUS_NO_MEMORY; - goto failed; - } - - c->state = COMPOSITE_STATE_IN_PROGRESS; + if (composite_nomem(state, c)) return c; c->private_data = state; - c->event_ctx = ev; state->credentials = credentials; state->host = talloc_strdup(c, host); + if (composite_nomem(state->host, c)) return c; state->share = talloc_strdup(c, share); - if (state->host == NULL || state->share == NULL) { - c->status = NT_STATUS_NO_MEMORY; - goto failed; - } + if (composite_nomem(state->share, c)) return c; ZERO_STRUCT(name); name.name = host; creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order()); - composite_continue(c, creq, continue_resolve, c); - - return c; - -failed: - composite_error(c, c->status); return c; } -- cgit From 0479a2f1cbae51fcd8dbdc3c148c808421fb4d25 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:07:03 +0000 Subject: r23792: convert Samba4 to GPLv3 There are still a few tidyups of old FSF addresses to come (in both s3 and s4). More commits soon. (This used to be commit fcf38a38ac691abd0fa51b89dc951a08e89fdafa) --- source4/libcli/smb2/connect.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 0d772bccd8..a365f25d49 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -7,7 +7,7 @@ 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 2 of the License, or + 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, @@ -16,8 +16,7 @@ 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, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with this program. If not, see . */ #include "includes.h" -- cgit From ffeee68e4b72dd94fee57366bd8d38b8c284c3d4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Sep 2007 12:42:09 +0000 Subject: r25026: Move param/param.h out of includes.h (This used to be commit abe8349f9b4387961ff3665d8c589d61cd2edf31) --- source4/libcli/smb2/connect.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index a365f25d49..0edf64c5df 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -25,6 +25,7 @@ #include "libcli/smb2/smb2_calls.h" #include "libcli/composite/composite.h" #include "libcli/resolve/resolve.h" +#include "param/param.h" struct smb2_connect_state { struct cli_credentials *credentials; -- cgit From 37d53832a4623653f706e77985a79d84bd7c6694 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 28 Sep 2007 01:17:46 +0000 Subject: r25398: Parse loadparm context to all lp_*() functions. (This used to be commit 3fcc960839c6e5ca4de2c3c042f12f369ac5f238) --- source4/libcli/smb2/connect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 0edf64c5df..6a2e9d09e9 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -187,7 +187,7 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, ZERO_STRUCT(name); name.name = host; - creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order()); + creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order(global_loadparm)); composite_continue(c, creq, continue_resolve, c); return c; } -- cgit From 2f3551ca7cee59d4d053cceb87abdf1da1b3a1ad Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 1 Oct 2007 18:52:55 +0000 Subject: r25446: Merge some changes I made on the way home from SFO: 2007-09-29 More higher-level passing around of lp_ctx. 2007-09-29 Fix warning. 2007-09-29 Pass loadparm contexts on a higher level. 2007-09-29 Avoid using global loadparm context. (This used to be commit 3468952e771ab31f90b6c374ade01c5550810f42) --- source4/libcli/smb2/connect.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 6a2e9d09e9..bb70311c56 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -187,7 +187,8 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, ZERO_STRUCT(name); name.name = host; - creq = resolve_name_send(&name, c->event_ctx, lp_name_resolve_order(global_loadparm)); + creq = resolve_name_send(&name, c->event_ctx, + lp_name_resolve_order(global_loadparm)); composite_continue(c, creq, continue_resolve, c); return c; } -- cgit From 2151cde58014ea2e822c13d2f8a369b45dc19ca8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 6 Oct 2007 22:28:14 +0000 Subject: r25554: Convert last instances of BOOL, True and False to the standard types. (This used to be commit 566aa14139510788548a874e9213d91317f83ca9) --- source4/libcli/smb2/connect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index bb70311c56..6f05d56cd4 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -69,7 +69,7 @@ static void continue_session(struct composite_context *creq) c->status = smb2_session_setup_spnego_recv(creq); if (!composite_is_ok(c)) return; - state->tree = smb2_tree_init(state->session, state, True); + state->tree = smb2_tree_init(state->session, state, true); if (composite_nomem(state->tree, c)) return; state->tcon.in.unknown1 = 0x09; @@ -99,7 +99,7 @@ static void continue_negprot(struct smb2_request *req) c->status = smb2_negprot_recv(req, c, &state->negprot); if (!composite_is_ok(c)) return; - state->session = smb2_session_init(transport, state, True); + state->session = smb2_session_init(transport, state, true); if (composite_nomem(state->session, c)) return; creq = smb2_session_setup_spnego_send(state->session, state->credentials); -- cgit From 2f8dc4f48f1802baa3405e7803563f6840e0d1b3 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 3 Dec 2007 21:25:06 +0100 Subject: r26266: Remove more global_loadparm uses. (This used to be commit 99113075c4a96679bcec4f4d6bba4acb3dee4245) --- source4/libcli/smb2/connect.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 6f05d56cd4..7cfaf59a65 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -163,6 +163,7 @@ static void continue_resolve(struct composite_context *creq) struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, const char *host, const char *share, + const char **name_resolve_order, struct cli_credentials *credentials, struct event_context *ev) { @@ -187,8 +188,7 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, ZERO_STRUCT(name); name.name = host; - creq = resolve_name_send(&name, c->event_ctx, - lp_name_resolve_order(global_loadparm)); + creq = resolve_name_send(&name, c->event_ctx, name_resolve_order); composite_continue(c, creq, continue_resolve, c); return c; } @@ -215,11 +215,13 @@ NTSTATUS smb2_connect_recv(struct composite_context *c, TALLOC_CTX *mem_ctx, */ NTSTATUS smb2_connect(TALLOC_CTX *mem_ctx, const char *host, const char *share, + const char **name_resolve_order, struct cli_credentials *credentials, struct smb2_tree **tree, struct event_context *ev) { struct composite_context *c = smb2_connect_send(mem_ctx, host, share, + name_resolve_order, credentials, ev); return smb2_connect_recv(c, mem_ctx, tree); } -- cgit From da2ae4995370affe57cfecfe371a4edf553065d0 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 7 Dec 2007 16:04:25 +0100 Subject: r26337: Move global_loadparm to a higher caller. (This used to be commit baa5bcd303c72431dfa638edde72cded4265c612) --- source4/libcli/smb2/connect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 7cfaf59a65..39bb992d11 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -99,7 +99,7 @@ static void continue_negprot(struct smb2_request *req) c->status = smb2_negprot_recv(req, c, &state->negprot); if (!composite_is_ok(c)) return; - state->session = smb2_session_init(transport, state, true); + state->session = smb2_session_init(transport, global_loadparm, state, true); if (composite_nomem(state->session, c)) return; creq = smb2_session_setup_spnego_send(state->session, state->credentials); -- cgit From 5f4842cf65ce64bfdf577cd549565da20ca818cf Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 10 Dec 2007 18:41:19 +0100 Subject: r26376: Add context for libcli_resolve. (This used to be commit 459e1466a411d6f83b7372e248566e6e71c745fc) --- source4/libcli/smb2/connect.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 39bb992d11..8b75e125b0 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -163,7 +163,7 @@ static void continue_resolve(struct composite_context *creq) struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, const char *host, const char *share, - const char **name_resolve_order, + struct resolve_context *resolve_ctx, struct cli_credentials *credentials, struct event_context *ev) { @@ -188,7 +188,7 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, ZERO_STRUCT(name); name.name = host; - creq = resolve_name_send(&name, c->event_ctx, name_resolve_order); + creq = resolve_name_send(resolve_ctx, &name, c->event_ctx); composite_continue(c, creq, continue_resolve, c); return c; } @@ -215,13 +215,13 @@ NTSTATUS smb2_connect_recv(struct composite_context *c, TALLOC_CTX *mem_ctx, */ NTSTATUS smb2_connect(TALLOC_CTX *mem_ctx, const char *host, const char *share, - const char **name_resolve_order, + struct resolve_context *resolve_ctx, struct cli_credentials *credentials, struct smb2_tree **tree, struct event_context *ev) { struct composite_context *c = smb2_connect_send(mem_ctx, host, share, - name_resolve_order, + resolve_ctx, credentials, ev); return smb2_connect_recv(c, mem_ctx, tree); } -- cgit From 4b0199a5493ea2b88558cc40871e63c1dc8dbb56 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 12 Dec 2007 02:15:29 +0100 Subject: r26409: Pass smb ports along. (This used to be commit 2833f320de1f1fd39c710ad0a61c3fa1bb1df31f) --- source4/libcli/smb2/connect.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 8b75e125b0..4d250fdded 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -147,11 +147,12 @@ static void continue_resolve(struct composite_context *creq) struct smb2_connect_state *state = talloc_get_type(c->private_data, struct smb2_connect_state); const char *addr; - + const char *ports[2] = { "445", NULL }; + c->status = resolve_name_recv(creq, state, &addr); if (!composite_is_ok(c)) return; - creq = smbcli_sock_connect_send(state, addr, 445, state->host, c->event_ctx); + creq = smbcli_sock_connect_send(state, addr, ports, state->host, c->event_ctx); composite_continue(c, creq, continue_socket, c); } -- cgit From 771b347f9b185895390445be96081c781e28a26d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 2 Jan 2008 18:39:01 -0600 Subject: r26644: Janitorial: Pass resolve_context explicitly to various SMB functions, should help fix the build for OpenChange. (This used to be commit 385ffe4f4cc9a21a760c0f00410f56e2592fd507) --- source4/libcli/smb2/connect.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 4d250fdded..4518203183 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -29,6 +29,7 @@ struct smb2_connect_state { struct cli_credentials *credentials; + struct resolve_context *resolve_ctx; const char *host; const char *share; struct smb2_negprot negprot; @@ -152,7 +153,7 @@ static void continue_resolve(struct composite_context *creq) c->status = resolve_name_recv(creq, state, &addr); if (!composite_is_ok(c)) return; - creq = smbcli_sock_connect_send(state, addr, ports, state->host, c->event_ctx); + creq = smbcli_sock_connect_send(state, addr, ports, state->host, state->resolve_ctx, c->event_ctx); composite_continue(c, creq, continue_socket, c); } @@ -185,6 +186,7 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, if (composite_nomem(state->host, c)) return c; state->share = talloc_strdup(c, share); if (composite_nomem(state->share, c)) return c; + state->resolve_ctx = talloc_reference(state, resolve_ctx); ZERO_STRUCT(name); name.name = host; -- cgit From ccc27e681cbd6283513b929d58f2ebce35e6658b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 12 Feb 2008 12:54:44 +1100 Subject: fixed up the .in side of SMB2 negprot fixed the input side of the SMB2 negprot structure and parsers according to the documentation (This used to be commit 55af8acc7b32c24e4b1187e9d8d1c8f060e914b0) --- source4/libcli/smb2/connect.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 4518203183..a2ae828fa5 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -120,6 +120,7 @@ static void continue_socket(struct composite_context *creq) struct smbcli_socket *sock; struct smb2_transport *transport; struct smb2_request *req; + uint16_t dialects[1]; c->status = smbcli_sock_connect_recv(creq, state, &sock); if (!composite_is_ok(c)) return; @@ -128,7 +129,12 @@ static void continue_socket(struct composite_context *creq) if (composite_nomem(transport, c)) return; ZERO_STRUCT(state->negprot); - state->negprot.in.unknown1 = 0x0001; + state->negprot.in.dialect_count = 1; + state->negprot.in.security_mode = 0; + state->negprot.in.capabilities = 0; + unix_to_nt_time(&state->negprot.in.start_time, time(NULL)); + dialects[0] = 0; + state->negprot.in.dialects = dialects; req = smb2_negprot_send(transport, &state->negprot); if (composite_nomem(req, c)) return; -- cgit From e94d710b0b959d8e69eb02ef0704ebcff56485fb Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 13 Feb 2008 10:13:28 +1100 Subject: updated SMB2 tcon as per WSPP docs (This used to be commit 5913e3e549e71affc66c28cacb6563331fb0c790) --- source4/libcli/smb2/connect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index a2ae828fa5..535df11d9d 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -73,7 +73,7 @@ static void continue_session(struct composite_context *creq) state->tree = smb2_tree_init(state->session, state, true); if (composite_nomem(state->tree, c)) return; - state->tcon.in.unknown1 = 0x09; + state->tcon.in.reserved = 0; state->tcon.in.path = talloc_asprintf(state, "\\\\%s\\%s", state->host, state->share); if (composite_nomem(state->tcon.in.path, c)) return; -- cgit From b640f475be9b0f83e7812a5c7756344c5891cba3 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 14 Feb 2008 17:11:36 +1100 Subject: updated SMB2 code for getinfo according to WSPP docs - Updated getinfo structures and field names - also updated the protocol revision number handling to reflect new docs (This used to be commit 3aaa2e86d94675c6c68d66d75292c3e34bfbc81b) --- source4/libcli/smb2/connect.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 535df11d9d..85ddafc031 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -133,7 +133,7 @@ static void continue_socket(struct composite_context *creq) state->negprot.in.security_mode = 0; state->negprot.in.capabilities = 0; unix_to_nt_time(&state->negprot.in.start_time, time(NULL)); - dialects[0] = 0; + dialects[0] = SMB2_DIALECT_REVISION; state->negprot.in.dialects = dialects; req = smb2_negprot_send(transport, &state->negprot); -- cgit From afe3e8172ddaa5e4aa811faceecda4f943d6e2ef Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 2 Apr 2008 04:53:27 +0200 Subject: Install public header files again and include required prototypes. (This used to be commit 47ffbbf67435904754469544390b67d34c958343) --- source4/libcli/smb2/connect.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 85ddafc031..d68b85ad54 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -21,6 +21,7 @@ #include "includes.h" #include "libcli/raw/libcliraw.h" +#include "libcli/raw/raw_proto.h" #include "libcli/smb2/smb2.h" #include "libcli/smb2/smb2_calls.h" #include "libcli/composite/composite.h" -- cgit From b0f34bc8ca072c06b89934fbef516a2f3da0e269 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 16 Apr 2008 10:05:53 +0200 Subject: libcli/smb2: also offer the SMB2 dialect that what used in longhorn beta3 With this smbtorture works against longhorn beta3 again, hopefully it still works with new versions... metze (This used to be commit 874924a85a862e38b7d1a6199276e998cf3697d8) --- source4/libcli/smb2/connect.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index d68b85ad54..59d4e6ea2d 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -121,7 +121,7 @@ static void continue_socket(struct composite_context *creq) struct smbcli_socket *sock; struct smb2_transport *transport; struct smb2_request *req; - uint16_t dialects[1]; + uint16_t dialects[2]; c->status = smbcli_sock_connect_recv(creq, state, &sock); if (!composite_is_ok(c)) return; @@ -130,11 +130,12 @@ static void continue_socket(struct composite_context *creq) if (composite_nomem(transport, c)) return; ZERO_STRUCT(state->negprot); - state->negprot.in.dialect_count = 1; + state->negprot.in.dialect_count = 2; state->negprot.in.security_mode = 0; state->negprot.in.capabilities = 0; unix_to_nt_time(&state->negprot.in.start_time, time(NULL)); - dialects[0] = SMB2_DIALECT_REVISION; + dialects[0] = 0; + dialects[1] = SMB2_DIALECT_REVISION; state->negprot.in.dialects = dialects; req = smb2_negprot_send(transport, &state->negprot); -- cgit From c7d7577fb978dfa822b4aab238440816188099c6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 16 May 2008 15:03:58 +1000 Subject: private -> private_data for struct smb2_request (This used to be commit 67290e0ad69df2f2fe651249c6550b8e32dd641b) --- source4/libcli/smb2/connect.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 59d4e6ea2d..867af14c92 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -44,7 +44,7 @@ struct smb2_connect_state { */ static void continue_tcon(struct smb2_request *req) { - struct composite_context *c = talloc_get_type(req->async.private, + struct composite_context *c = talloc_get_type(req->async.private_data, struct composite_context); struct smb2_connect_state *state = talloc_get_type(c->private_data, struct smb2_connect_state); @@ -83,7 +83,7 @@ static void continue_session(struct composite_context *creq) if (composite_nomem(req, c)) return; req->async.fn = continue_tcon; - req->async.private = c; + req->async.private_data = c; } /* @@ -91,7 +91,7 @@ static void continue_session(struct composite_context *creq) */ static void continue_negprot(struct smb2_request *req) { - struct composite_context *c = talloc_get_type(req->async.private, + struct composite_context *c = talloc_get_type(req->async.private_data, struct composite_context); struct smb2_connect_state *state = talloc_get_type(c->private_data, struct smb2_connect_state); @@ -142,7 +142,7 @@ static void continue_socket(struct composite_context *creq) if (composite_nomem(req, c)) return; req->async.fn = continue_negprot; - req->async.private = c; + req->async.private_data = c; } -- cgit From 9c6a35ad9ba9458fe9d3a73ba1f785a61305e2aa Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 20 May 2008 11:57:43 +1000 Subject: remember the server time fields on negotiate. Needed for gentest (This used to be commit 7989ca861dcc700b52be3a47ea5ae8b03fbb9330) --- source4/libcli/smb2/connect.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index 867af14c92..eabfa410ad 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -101,6 +101,9 @@ static void continue_negprot(struct smb2_request *req) c->status = smb2_negprot_recv(req, c, &state->negprot); if (!composite_is_ok(c)) return; + transport->negotiate.system_time = state->negprot.out.system_time; + transport->negotiate.server_start_time = state->negprot.out.server_start_time; + state->session = smb2_session_init(transport, global_loadparm, state, true); if (composite_nomem(state->session, c)) return; -- cgit From beaa01e403dda7557a6acdf0181d79d58a33bbbe Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 30 May 2008 17:03:54 +1000 Subject: implemented client side SMB2 signing This doessn't work against Windows yet, and I've submitted a WSPP request for clarification of the docs to try and find out why. Meanwhile this is no worse than what we had, as it only gets used when the server demands signing, and we didn't work then anyway. (This used to be commit b788096add3586d7277efcd3bf5ca7f3a604cb7a) --- source4/libcli/smb2/connect.c | 54 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index eabfa410ad..cdb5e3b5d4 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -33,6 +33,7 @@ struct smb2_connect_state { struct resolve_context *resolve_ctx; const char *host; const char *share; + struct smbcli_options options; struct smb2_negprot negprot; struct smb2_tree_connect tcon; struct smb2_session *session; @@ -103,6 +104,34 @@ static void continue_negprot(struct smb2_request *req) transport->negotiate.system_time = state->negprot.out.system_time; transport->negotiate.server_start_time = state->negprot.out.server_start_time; + transport->negotiate.security_mode = state->negprot.out.security_mode; + + switch (transport->options.signing) { + case SMB_SIGNING_OFF: + if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) { + composite_error(c, NT_STATUS_ACCESS_DENIED); + return; + } + transport->signing.doing_signing = false; + break; + case SMB_SIGNING_SUPPORTED: + case SMB_SIGNING_AUTO: + if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) { + transport->signing.doing_signing = true; + } else { + transport->signing.doing_signing = false; + } + break; + case SMB_SIGNING_REQUIRED: + if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_ENABLED) { + transport->signing.doing_signing = true; + } else { + composite_error(c, NT_STATUS_ACCESS_DENIED); + return; + } + break; + } + state->session = smb2_session_init(transport, global_loadparm, state, true); if (composite_nomem(state->session, c)) return; @@ -129,12 +158,24 @@ static void continue_socket(struct composite_context *creq) c->status = smbcli_sock_connect_recv(creq, state, &sock); if (!composite_is_ok(c)) return; - transport = smb2_transport_init(sock, state); + transport = smb2_transport_init(sock, state, &state->options); if (composite_nomem(transport, c)) return; ZERO_STRUCT(state->negprot); state->negprot.in.dialect_count = 2; - state->negprot.in.security_mode = 0; + switch (transport->options.signing) { + case SMB_SIGNING_OFF: + state->negprot.in.security_mode = 0; + break; + case SMB_SIGNING_SUPPORTED: + case SMB_SIGNING_AUTO: + state->negprot.in.security_mode = SMB2_NEGOTIATE_SIGNING_ENABLED; + break; + case SMB_SIGNING_REQUIRED: + state->negprot.in.security_mode = + SMB2_NEGOTIATE_SIGNING_ENABLED | SMB2_NEGOTIATE_SIGNING_REQUIRED; + break; + } state->negprot.in.capabilities = 0; unix_to_nt_time(&state->negprot.in.start_time, time(NULL)); dialects[0] = 0; @@ -178,7 +219,8 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, const char *share, struct resolve_context *resolve_ctx, struct cli_credentials *credentials, - struct event_context *ev) + struct event_context *ev, + struct smbcli_options *options) { struct composite_context *c; struct smb2_connect_state *state; @@ -193,6 +235,7 @@ struct composite_context *smb2_connect_send(TALLOC_CTX *mem_ctx, c->private_data = state; state->credentials = credentials; + state->options = *options; state->host = talloc_strdup(c, host); if (composite_nomem(state->host, c)) return c; state->share = talloc_strdup(c, share); @@ -232,10 +275,11 @@ NTSTATUS smb2_connect(TALLOC_CTX *mem_ctx, struct resolve_context *resolve_ctx, struct cli_credentials *credentials, struct smb2_tree **tree, - struct event_context *ev) + struct event_context *ev, + struct smbcli_options *options) { struct composite_context *c = smb2_connect_send(mem_ctx, host, share, resolve_ctx, - credentials, ev); + credentials, ev, options); return smb2_connect_recv(c, mem_ctx, tree); } -- cgit From 35bd7a6378cc25ed6b24d153c3cf1557d6126788 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 9 Jun 2008 21:57:41 +0200 Subject: libcli/smb2: fix per session signing state metze (This used to be commit 8bc12dc77a59e792830d96e84a4e8d1b2c651505) --- source4/libcli/smb2/connect.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index cdb5e3b5d4..c89c109b72 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -112,19 +112,19 @@ static void continue_negprot(struct smb2_request *req) composite_error(c, NT_STATUS_ACCESS_DENIED); return; } - transport->signing.doing_signing = false; + transport->signing_required = false; break; case SMB_SIGNING_SUPPORTED: case SMB_SIGNING_AUTO: if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) { - transport->signing.doing_signing = true; + transport->signing_required = true; } else { - transport->signing.doing_signing = false; + transport->signing_required = false; } break; case SMB_SIGNING_REQUIRED: if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_ENABLED) { - transport->signing.doing_signing = true; + transport->signing_required = true; } else { composite_error(c, NT_STATUS_ACCESS_DENIED); return; -- cgit From f086e796d6a933b95e36f5638b39ee261fb6a784 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 13 Aug 2008 15:19:01 +0200 Subject: libcli/smb2: use smb2 signing in auto mode if the server supports it metze (This used to be commit fe74faf13dc64eaa58d757de156aedcb24abed1f) --- source4/libcli/smb2/connect.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source4/libcli/smb2/connect.c') diff --git a/source4/libcli/smb2/connect.c b/source4/libcli/smb2/connect.c index c89c109b72..43151943d3 100644 --- a/source4/libcli/smb2/connect.c +++ b/source4/libcli/smb2/connect.c @@ -115,13 +115,19 @@ static void continue_negprot(struct smb2_request *req) transport->signing_required = false; break; case SMB_SIGNING_SUPPORTED: - case SMB_SIGNING_AUTO: if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) { transport->signing_required = true; } else { transport->signing_required = false; } break; + case SMB_SIGNING_AUTO: + if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_ENABLED) { + transport->signing_required = true; + } else { + transport->signing_required = false; + } + break; case SMB_SIGNING_REQUIRED: if (transport->negotiate.security_mode & SMB2_NEGOTIATE_SIGNING_ENABLED) { transport->signing_required = true; -- cgit