From 31c185011fc70038f1f7fad3049f782bdba49688 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 2 Jun 2008 17:29:55 +0200 Subject: netapi: add libnetapi_samr_open_domain(). Guenther (This used to be commit a99906f661faa104da4b40707597ceb4542548f8) --- source3/lib/netapi/samr.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 source3/lib/netapi/samr.c (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c new file mode 100644 index 0000000000..8e1c409ed9 --- /dev/null +++ b/source3/lib/netapi/samr.c @@ -0,0 +1,104 @@ +/* + * Unix SMB/CIFS implementation. + * NetApi Samr Support + * Copyright (C) Guenther Deschner 2008 + * + * 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 . + */ + +#include "includes.h" + +#include "librpc/gen_ndr/libnetapi.h" +#include "lib/netapi/netapi.h" +#include "lib/netapi/netapi_private.h" +#include "lib/netapi/libnetapi.h" + +/**************************************************************** +****************************************************************/ + +NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, + struct rpc_pipe_client *pipe_cli, + uint32_t connect_mask, + uint32_t domain_mask, + struct policy_handle *connect_handle, + struct policy_handle *domain_handle, + struct dom_sid2 **domain_sid) +{ + NTSTATUS status; + uint32_t resume_handle = 0; + uint32_t num_entries = 0; + struct samr_SamArray *sam = NULL; + const char *domain_name = NULL; + struct lsa_String lsa_domain_name; + bool domain_found = true; + int i; + + if (!is_valid_policy_hnd(connect_handle)) { + status = rpccli_try_samr_connects(pipe_cli, mem_ctx, + connect_mask, + connect_handle); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + } + + status = rpccli_samr_EnumDomains(pipe_cli, mem_ctx, + connect_handle, + &resume_handle, + &sam, + 0xffffffff, + &num_entries); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + + for (i=0; ientries[i].name.string; + + if (strequal(domain_name, builtin_domain_name())) { + continue; + } + + domain_found = true; + break; + } + + if (!domain_found) { + status = NT_STATUS_NO_SUCH_DOMAIN; + goto done; + } + + init_lsa_String(&lsa_domain_name, domain_name); + + status = rpccli_samr_LookupDomain(pipe_cli, mem_ctx, + connect_handle, + &lsa_domain_name, + domain_sid); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + + status = rpccli_samr_OpenDomain(pipe_cli, mem_ctx, + connect_handle, + domain_mask, + *domain_sid, + domain_handle); + if (!NT_STATUS_IS_OK(status)) { + goto done; + } + + done: + return status; +} -- cgit From b652e5b4753afd8916d347d5c8ef6f54ca140097 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 2 Jun 2008 23:55:45 +0200 Subject: netapi: let libnetapi_samr_open_domain return WERROR. Guenther (This used to be commit 3d037a07e015a3af75dde054cef4c0bb7795fbb5) --- source3/lib/netapi/samr.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index 8e1c409ed9..a41de91de3 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -27,15 +27,16 @@ /**************************************************************** ****************************************************************/ -NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, - struct rpc_pipe_client *pipe_cli, - uint32_t connect_mask, - uint32_t domain_mask, - struct policy_handle *connect_handle, - struct policy_handle *domain_handle, - struct dom_sid2 **domain_sid) +WERROR libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, + struct rpc_pipe_client *pipe_cli, + uint32_t connect_mask, + uint32_t domain_mask, + struct policy_handle *connect_handle, + struct policy_handle *domain_handle, + struct dom_sid2 **domain_sid) { NTSTATUS status; + WERROR werr; uint32_t resume_handle = 0; uint32_t num_entries = 0; struct samr_SamArray *sam = NULL; @@ -49,6 +50,7 @@ NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, connect_mask, connect_handle); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); goto done; } } @@ -60,6 +62,7 @@ NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, 0xffffffff, &num_entries); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); goto done; } @@ -76,7 +79,7 @@ NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, } if (!domain_found) { - status = NT_STATUS_NO_SUCH_DOMAIN; + werr = WERR_NO_SUCH_DOMAIN; goto done; } @@ -87,6 +90,7 @@ NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, &lsa_domain_name, domain_sid); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); goto done; } @@ -96,9 +100,12 @@ NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, *domain_sid, domain_handle); if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); goto done; } + werr = WERR_OK; + done: - return status; + return werr; } -- cgit From 56bdfad87f69963d65ceb8f7c780a1bd887c1fea Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 3 Jun 2008 00:13:39 +0200 Subject: netapi: add libnetapi_samr_open_builtin_domain(). Guenther (This used to be commit f15a7f9ab1da88369185beda267f3e67a3b36191) --- source3/lib/netapi/samr.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index a41de91de3..8289890237 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -109,3 +109,42 @@ WERROR libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, done: return werr; } + +/**************************************************************** +****************************************************************/ + +WERROR libnetapi_samr_open_builtin_domain(TALLOC_CTX *mem_ctx, + struct rpc_pipe_client *pipe_cli, + uint32_t connect_mask, + uint32_t builtin_mask, + struct policy_handle *connect_handle, + struct policy_handle *builtin_handle) +{ + NTSTATUS status; + WERROR werr; + + if (!is_valid_policy_hnd(connect_handle)) { + status = rpccli_try_samr_connects(pipe_cli, mem_ctx, + connect_mask, + connect_handle); + if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + } + + status = rpccli_samr_OpenDomain(pipe_cli, mem_ctx, + connect_handle, + builtin_mask, + CONST_DISCARD(DOM_SID *, &global_sid_Builtin), + builtin_handle); + if (!NT_STATUS_IS_OK(status)) { + werr = ntstatus_to_werror(status); + goto done; + } + + werr = WERR_OK; + + done: + return werr; +} -- cgit From 12281d02ae0f6b5abf17edcaa973ec27a0340320 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Tue, 3 Jun 2008 20:42:58 +0200 Subject: netapi: remove unrequired headers. Guenther (This used to be commit f8fec49ce10cbd663cb30ac94a543b4a76a8dc57) --- source3/lib/netapi/samr.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index 8289890237..2346f7f956 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -19,11 +19,6 @@ #include "includes.h" -#include "librpc/gen_ndr/libnetapi.h" -#include "lib/netapi/netapi.h" -#include "lib/netapi/netapi_private.h" -#include "lib/netapi/libnetapi.h" - /**************************************************************** ****************************************************************/ -- cgit From 3b667f90aaefe3c5d064b18542ae3c5b3d4771cd Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 17 Jul 2008 19:47:59 +0200 Subject: netapi: add libnetapi_samr_close_domain/connect_handle. Guenther (This used to be commit b042787ec61bb5cb98f882ac7be8df1691a78921) --- source3/lib/netapi/samr.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index 2346f7f956..5df50fe85b 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -143,3 +143,51 @@ WERROR libnetapi_samr_open_builtin_domain(TALLOC_CTX *mem_ctx, done: return werr; } + +/**************************************************************** +****************************************************************/ + +void libnetapi_samr_close_domain_handle(struct libnetapi_ctx *ctx, + struct policy_handle *handle) +{ + struct libnetapi_private_ctx *priv; + + if (!is_valid_policy_hnd(handle)) { + return; + } + + priv = talloc_get_type_abort(ctx->private_data, + struct libnetapi_private_ctx); + + if (!policy_hnd_equal(handle, &priv->samr.domain_handle)) { + return; + } + + rpccli_samr_Close(priv->samr.cli, ctx, handle); + + ZERO_STRUCT(priv->samr.domain_handle); +} + +/**************************************************************** +****************************************************************/ + +void libnetapi_samr_close_connect_handle(struct libnetapi_ctx *ctx, + struct policy_handle *handle) +{ + struct libnetapi_private_ctx *priv; + + if (!is_valid_policy_hnd(handle)) { + return; + } + + priv = talloc_get_type_abort(ctx->private_data, + struct libnetapi_private_ctx); + + if (!policy_hnd_equal(handle, &priv->samr.connect_handle)) { + return; + } + + rpccli_samr_Close(priv->samr.cli, ctx, handle); + + ZERO_STRUCT(priv->samr.connect_handle); +} -- cgit From 4704864338b62a57afb86986ed2d4a0ce0a97020 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 17 Jul 2008 19:56:25 +0200 Subject: netapi: add libnetapi_samr_close_builtin_handle(). Guenther (This used to be commit 05cad0d8b4205c052c607b1d36c121bb4c226ab1) --- source3/lib/netapi/samr.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index 5df50fe85b..bd90067a6d 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -171,6 +171,30 @@ void libnetapi_samr_close_domain_handle(struct libnetapi_ctx *ctx, /**************************************************************** ****************************************************************/ +void libnetapi_samr_close_builtin_handle(struct libnetapi_ctx *ctx, + struct policy_handle *handle) +{ + struct libnetapi_private_ctx *priv; + + if (!is_valid_policy_hnd(handle)) { + return; + } + + priv = talloc_get_type_abort(ctx->private_data, + struct libnetapi_private_ctx); + + if (!policy_hnd_equal(handle, &priv->samr.builtin_handle)) { + return; + } + + rpccli_samr_Close(priv->samr.cli, ctx, handle); + + ZERO_STRUCT(priv->samr.builtin_handle); +} + +/**************************************************************** +****************************************************************/ + void libnetapi_samr_close_connect_handle(struct libnetapi_ctx *ctx, struct policy_handle *handle) { -- cgit From 6fa58fdc07743e5db71d9f27b67d14d8103aa2e9 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 17 Jul 2008 19:43:34 +0200 Subject: netapi: use private samr structure in libnetapi_samr_open_domain(). Guenther (This used to be commit 3c63ebfc00cda0334802bff1883ebbc3138a70f1) --- source3/lib/netapi/samr.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index bd90067a6d..e83b8eba9c 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -18,11 +18,13 @@ */ #include "includes.h" +#include "lib/netapi/netapi.h" +#include "lib/netapi/netapi_private.h" /**************************************************************** ****************************************************************/ -WERROR libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, +WERROR libnetapi_samr_open_domain(struct libnetapi_ctx *mem_ctx, struct rpc_pipe_client *pipe_cli, uint32_t connect_mask, uint32_t domain_mask, @@ -32,6 +34,7 @@ WERROR libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, { NTSTATUS status; WERROR werr; + struct libnetapi_private_ctx *priv; uint32_t resume_handle = 0; uint32_t num_entries = 0; struct samr_SamArray *sam = NULL; @@ -40,6 +43,38 @@ WERROR libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, bool domain_found = true; int i; + priv = talloc_get_type_abort(mem_ctx->private_data, + struct libnetapi_private_ctx); + + if (is_valid_policy_hnd(&priv->samr.connect_handle)) { + if ((priv->samr.connect_mask & connect_mask) == connect_mask) { + *connect_handle = priv->samr.connect_handle; + } else { + libnetapi_samr_close_connect_handle(mem_ctx, + &priv->samr.connect_handle); + } + } + + if (is_valid_policy_hnd(&priv->samr.domain_handle)) { + if ((priv->samr.domain_mask & domain_mask) == domain_mask) { + *domain_handle = priv->samr.domain_handle; + } else { + libnetapi_samr_close_domain_handle(mem_ctx, + &priv->samr.domain_handle); + } + } + + if (priv->samr.domain_sid) { + *domain_sid = priv->samr.domain_sid; + } + + if (is_valid_policy_hnd(&priv->samr.connect_handle) && + ((priv->samr.connect_mask & connect_mask) == connect_mask) && + is_valid_policy_hnd(&priv->samr.domain_handle) && + (priv->samr.domain_mask & domain_mask) == domain_mask) { + return WERR_OK; + } + if (!is_valid_policy_hnd(connect_handle)) { status = rpccli_try_samr_connects(pipe_cli, mem_ctx, connect_mask, @@ -99,6 +134,17 @@ WERROR libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx, goto done; } + priv->samr.cli = pipe_cli; + + priv->samr.domain_name = domain_name; + priv->samr.domain_sid = *domain_sid; + + priv->samr.connect_mask = connect_mask; + priv->samr.connect_handle = *connect_handle; + + priv->samr.domain_mask = domain_mask; + priv->samr.domain_handle = *domain_handle; + werr = WERR_OK; done: -- cgit From bbdf38d1d73e0424c3b4a6ee27c11b6751af2582 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 17 Jul 2008 20:16:10 +0200 Subject: netapi: use private samr structure in libnetapi_samr_open_builtin(). Guenther (This used to be commit 538ac493b71b4c880bb6fb0fc5fc2f15e1a19f95) --- source3/lib/netapi/samr.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index e83b8eba9c..19cf6cb338 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -154,7 +154,7 @@ WERROR libnetapi_samr_open_domain(struct libnetapi_ctx *mem_ctx, /**************************************************************** ****************************************************************/ -WERROR libnetapi_samr_open_builtin_domain(TALLOC_CTX *mem_ctx, +WERROR libnetapi_samr_open_builtin_domain(struct libnetapi_ctx *mem_ctx, struct rpc_pipe_client *pipe_cli, uint32_t connect_mask, uint32_t builtin_mask, @@ -163,6 +163,35 @@ WERROR libnetapi_samr_open_builtin_domain(TALLOC_CTX *mem_ctx, { NTSTATUS status; WERROR werr; + struct libnetapi_private_ctx *priv; + + priv = talloc_get_type_abort(mem_ctx->private_data, + struct libnetapi_private_ctx); + + if (is_valid_policy_hnd(&priv->samr.connect_handle)) { + if ((priv->samr.connect_mask & connect_mask) == connect_mask) { + *connect_handle = priv->samr.connect_handle; + } else { + libnetapi_samr_close_connect_handle(mem_ctx, + &priv->samr.connect_handle); + } + } + + if (is_valid_policy_hnd(&priv->samr.builtin_handle)) { + if ((priv->samr.builtin_mask & builtin_mask) == builtin_mask) { + *builtin_handle = priv->samr.builtin_handle; + } else { + libnetapi_samr_close_builtin_handle(mem_ctx, + &priv->samr.builtin_handle); + } + } + + if (is_valid_policy_hnd(&priv->samr.connect_handle) && + ((priv->samr.connect_mask & connect_mask) == connect_mask) && + is_valid_policy_hnd(&priv->samr.builtin_handle) && + (priv->samr.builtin_mask & builtin_mask) == builtin_mask) { + return WERR_OK; + } if (!is_valid_policy_hnd(connect_handle)) { status = rpccli_try_samr_connects(pipe_cli, mem_ctx, @@ -184,6 +213,14 @@ WERROR libnetapi_samr_open_builtin_domain(TALLOC_CTX *mem_ctx, goto done; } + priv->samr.cli = pipe_cli; + + priv->samr.connect_mask = connect_mask; + priv->samr.connect_handle = *connect_handle; + + priv->samr.builtin_mask = builtin_mask; + priv->samr.builtin_handle = *builtin_handle; + werr = WERR_OK; done: -- cgit From 352d40c0664919530f394c83fbbb7eb53adb1f31 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Thu, 17 Jul 2008 19:06:02 +0200 Subject: netapi: add libnetapi_samr_free(). Guenther (This used to be commit 3228088a0954ac25584d06a681f4e0615dee425c) --- source3/lib/netapi/samr.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'source3/lib/netapi/samr.c') diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c index 19cf6cb338..dbcef38dc7 100644 --- a/source3/lib/netapi/samr.c +++ b/source3/lib/netapi/samr.c @@ -298,3 +298,22 @@ void libnetapi_samr_close_connect_handle(struct libnetapi_ctx *ctx, ZERO_STRUCT(priv->samr.connect_handle); } + +/**************************************************************** +****************************************************************/ + +void libnetapi_samr_free(struct libnetapi_ctx *ctx) +{ + struct libnetapi_private_ctx *priv; + + if (!ctx->private_data) { + return; + } + + priv = talloc_get_type_abort(ctx->private_data, + struct libnetapi_private_ctx); + + libnetapi_samr_close_domain_handle(ctx, &priv->samr.domain_handle); + libnetapi_samr_close_builtin_handle(ctx, &priv->samr.builtin_handle); + libnetapi_samr_close_connect_handle(ctx, &priv->samr.connect_handle); +} -- cgit