[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