[SCM] Samba Shared Repository - branch v3-3-test updated -
release-3-2-0pre2-3310-g3228088
Günther Deschner
gd at samba.org
Fri Jul 18 14:53:53 GMT 2008
The branch, v3-3-test has been updated
via 3228088a0954ac25584d06a681f4e0615dee425c (commit)
via 538ac493b71b4c880bb6fb0fc5fc2f15e1a19f95 (commit)
via 3c63ebfc00cda0334802bff1883ebbc3138a70f1 (commit)
via 05cad0d8b4205c052c607b1d36c121bb4c226ab1 (commit)
via b042787ec61bb5cb98f882ac7be8df1691a78921 (commit)
via 45fff2d37ae21c76d100f66d9154f6add446f380 (commit)
from c0fea9c4d0d3d297972c052c17b9be6d0530e098 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-3-test
- Log -----------------------------------------------------------------
commit 3228088a0954ac25584d06a681f4e0615dee425c
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 17 19:06:02 2008 +0200
netapi: add libnetapi_samr_free().
Guenther
commit 538ac493b71b4c880bb6fb0fc5fc2f15e1a19f95
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 17 20:16:10 2008 +0200
netapi: use private samr structure in libnetapi_samr_open_builtin().
Guenther
commit 3c63ebfc00cda0334802bff1883ebbc3138a70f1
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 17 19:43:34 2008 +0200
netapi: use private samr structure in libnetapi_samr_open_domain().
Guenther
commit 05cad0d8b4205c052c607b1d36c121bb4c226ab1
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 17 19:56:25 2008 +0200
netapi: add libnetapi_samr_close_builtin_handle().
Guenther
commit b042787ec61bb5cb98f882ac7be8df1691a78921
Author: Günther Deschner <gd at samba.org>
Date: Thu Jul 17 19:47:59 2008 +0200
netapi: add libnetapi_samr_close_domain/connect_handle.
Guenther
commit 45fff2d37ae21c76d100f66d9154f6add446f380
Author: Günther Deschner <gd at samba.org>
Date: Tue Jul 1 20:14:36 2008 +0200
netapi: add libnetapi_private_ctx and init function.
Guenther
-----------------------------------------------------------------------
Summary of changes:
source/lib/netapi/netapi.c | 30 ++++++
source/lib/netapi/netapi.h | 2 +
source/lib/netapi/netapi_private.h | 29 ++++++-
source/lib/netapi/samr.c | 178 +++++++++++++++++++++++++++++++++++-
4 files changed, 235 insertions(+), 4 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source/lib/netapi/netapi.c b/source/lib/netapi/netapi.c
index cf1be00..7d78aa8 100644
--- a/source/lib/netapi/netapi.c
+++ b/source/lib/netapi/netapi.c
@@ -30,8 +30,30 @@ static bool libnetapi_initialized = false;
/****************************************************************
****************************************************************/
+static NET_API_STATUS libnetapi_init_private_context(struct libnetapi_ctx *ctx)
+{
+ struct libnetapi_private_ctx *priv;
+
+ if (!ctx) {
+ return W_ERROR_V(WERR_INVALID_PARAM);
+ }
+
+ priv = TALLOC_ZERO_P(ctx, struct libnetapi_private_ctx);
+ if (!priv) {
+ return W_ERROR_V(WERR_NOMEM);
+ }
+
+ ctx->private_data = priv;
+
+ return NET_API_STATUS_SUCCESS;
+}
+
+/****************************************************************
+****************************************************************/
+
NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
{
+ NET_API_STATUS status;
struct libnetapi_ctx *ctx = NULL;
char *krb5_cc_env = NULL;
@@ -96,6 +118,12 @@ NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
return W_ERROR_V(WERR_NOMEM);
}
+ status = libnetapi_init_private_context(ctx);
+ if (status != 0) {
+ TALLOC_FREE(frame);
+ return status;
+ }
+
libnetapi_initialized = true;
*context = stat_ctx = ctx;
@@ -125,6 +153,8 @@ NET_API_STATUS libnetapi_free(struct libnetapi_ctx *ctx)
return NET_API_STATUS_SUCCESS;
}
+ libnetapi_samr_free(ctx);
+
libnetapi_shutdown_cm(ctx);
if (ctx->krb5_cc_env) {
diff --git a/source/lib/netapi/netapi.h b/source/lib/netapi/netapi.h
index f6345af..3612fa8 100644
--- a/source/lib/netapi/netapi.h
+++ b/source/lib/netapi/netapi.h
@@ -191,6 +191,8 @@ struct libnetapi_ctx {
char *password;
char *krb5_cc_env;
int use_kerberos;
+
+ void *private_data;
};
/****************************************************************
diff --git a/source/lib/netapi/netapi_private.h b/source/lib/netapi/netapi_private.h
index 3ce078c..915d606 100644
--- a/source/lib/netapi/netapi_private.h
+++ b/source/lib/netapi/netapi_private.h
@@ -20,6 +20,24 @@
#ifndef __LIB_NETAPI_PRIVATE_H__
#define __LIB_NETAPI_PRIVATE_H__
+struct libnetapi_private_ctx {
+ struct {
+ const char *domain_name;
+ struct dom_sid *domain_sid;
+ struct rpc_pipe_client *cli;
+
+ uint32_t connect_mask;
+ struct policy_handle connect_handle;
+
+ uint32_t domain_mask;
+ struct policy_handle domain_handle;
+
+ uint32_t builtin_mask;
+ struct policy_handle builtin_handle;
+ } samr;
+
+};
+
NET_API_STATUS libnetapi_get_password(struct libnetapi_ctx *ctx, char **password);
NET_API_STATUS libnetapi_get_username(struct libnetapi_ctx *ctx, char **username);
NET_API_STATUS libnetapi_set_error_string(struct libnetapi_ctx *ctx, const char *format, ...);
@@ -33,18 +51,25 @@ WERROR libnetapi_open_pipe(struct libnetapi_ctx *ctx,
struct cli_state *cli,
int pipe_idx,
struct rpc_pipe_client **pipe_cli);
-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,
struct policy_handle *connect_handle,
struct policy_handle *domain_handle,
struct dom_sid2 **domain_sid);
-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,
struct policy_handle *connect_handle,
struct policy_handle *builtin_handle);
+void libnetapi_samr_close_domain_handle(struct libnetapi_ctx *ctx,
+ struct policy_handle *handle);
+void libnetapi_samr_close_builtin_handle(struct libnetapi_ctx *ctx,
+ struct policy_handle *handle);
+void libnetapi_samr_close_connect_handle(struct libnetapi_ctx *ctx,
+ struct policy_handle *handle);
+void libnetapi_samr_free(struct libnetapi_ctx *ctx);
#endif
diff --git a/source/lib/netapi/samr.c b/source/lib/netapi/samr.c
index 2346f7f..dbcef38 100644
--- a/source/lib/netapi/samr.c
+++ b/source/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:
@@ -108,7 +154,7 @@ WERROR libnetapi_samr_open_domain(TALLOC_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,
@@ -117,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,
@@ -138,8 +213,107 @@ 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:
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_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)
+{
+ 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);
+}
+
+/****************************************************************
+****************************************************************/
+
+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);
+}
--
Samba Shared Repository
More information about the samba-cvs
mailing list