s4:libcli/clilsa: make use of dcerpc_pipe_connect_b()
authorStefan Metzmacher <metze@samba.org>
Thu, 16 Jan 2014 07:59:30 +0000 (08:59 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 10:43:20 +0000 (12:43 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
source4/libcli/util/clilsa.c

index b9f220f48ab78ba225649ca090edba0da8573c47..4a8c959a0f82908f9809a24c5b44315eb5b66ad1 100644 (file)
@@ -33,6 +33,8 @@
 #include "librpc/gen_ndr/ndr_lsa_c.h"
 #include "libcli/util/clilsa.h"
 #include "libcli/smb/smbXcli_base.h"
+#include "auth/credentials/credentials.h"
+#include "lib/param/param.h"
 
 struct smblsa_state {
        struct dcerpc_binding_handle *binding_handle;
@@ -45,8 +47,13 @@ struct smblsa_state {
 */
 static NTSTATUS smblsa_connect(struct smbcli_state *cli)
 {
+       const char *host = smbXcli_conn_remote_name(cli->transport->conn);
+       struct cli_credentials *anon_creds;
+       struct loadparm_context *lp_ctx;
        struct smblsa_state *lsa;
        struct dcerpc_pipe *lsa_pipe;
+       char *binding_str;
+       struct dcerpc_binding *binding;
        NTSTATUS status;
        struct lsa_OpenPolicy r;
        uint16_t system_name = '\\';
@@ -81,26 +88,68 @@ static NTSTATUS smblsa_connect(struct smbcli_state *cli)
                return status;
        }
        lsa->ipc_tree->tid = tcon.tconx.out.tid;
+       smb1cli_tcon_set_id(lsa->ipc_tree->smbXcli, lsa->ipc_tree->tid);
 
        if (tcon.tconx.out.options & SMB_EXTENDED_SIGNATURES) {
                smb1cli_session_protect_session_key(cli->session->smbXcli);
        }
 
-       lsa_pipe = dcerpc_pipe_init(lsa, cli->transport->ev);
-       if (lsa_pipe == NULL) {
+       anon_creds = cli_credentials_init_anon(lsa);
+       if (anon_creds == NULL) {
                talloc_free(lsa);
                return NT_STATUS_NO_MEMORY;
        }
 
-       /* open the LSA pipe */
-       status = dcerpc_pipe_open_smb(lsa_pipe, lsa->ipc_tree, NDR_LSARPC_NAME);
+       lp_ctx = loadparm_init_global(true);
+       if (lp_ctx == NULL) {
+               talloc_free(lsa);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       binding_str = talloc_asprintf(lsa,
+                               "ncacn_np:%s[%s]",
+                               host, NDR_LSARPC_NAME);
+       if (binding_str == NULL) {
+               talloc_free(lsa);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       status = dcerpc_parse_binding(lsa, binding_str, &binding);
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(lsa);
+               return status;
+       }
+
+       status = dcerpc_binding_set_pointer_option(binding,
+                                                  "connection",
+                                                  struct smbXcli_conn,
+                                                  cli->transport->conn);
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(lsa);
+               return status;
+       }
+
+       status = dcerpc_binding_set_pointer_option(binding,
+                                                  "connection",
+                                                  struct smbXcli_session,
+                                                  cli->session->smbXcli);
+       if (!NT_STATUS_IS_OK(status)) {
+               talloc_free(lsa);
+               return status;
+       }
+
+       status = dcerpc_binding_set_pointer_option(binding,
+                                                  "connection",
+                                                  struct smbXcli_tcon,
+                                                  lsa->ipc_tree->smbXcli);
        if (!NT_STATUS_IS_OK(status)) {
                talloc_free(lsa);
                return status;
        }
 
-       /* bind to the LSA pipe */
-       status = dcerpc_bind_auth_none(lsa_pipe, &ndr_table_lsarpc);
+       status = dcerpc_pipe_connect_b(lsa, &lsa_pipe, binding,
+                                      &ndr_table_lsarpc, anon_creds,
+                                      cli->transport->ev, lp_ctx);
        if (!NT_STATUS_IS_OK(status)) {
                talloc_free(lsa);
                 return status;