svn commit: samba r19583 - in branches/SAMBA_4_0/source/libnet: .

mimir at samba.org mimir at samba.org
Mon Nov 6 21:16:27 GMT 2006


Author: mimir
Date: 2006-11-06 21:16:27 +0000 (Mon, 06 Nov 2006)
New Revision: 19583

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=19583

Log:
a few prerequisite functions called from within libnet functions
(in this case domain related) to ensure certain conditions before
doing what libnet function is expected to do.


rafal


Added:
   branches/SAMBA_4_0/source/libnet/prereq_domain.c


Changeset:
Added: branches/SAMBA_4_0/source/libnet/prereq_domain.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/prereq_domain.c	2006-11-06 20:17:25 UTC (rev 19582)
+++ branches/SAMBA_4_0/source/libnet/prereq_domain.c	2006-11-06 21:16:27 UTC (rev 19583)
@@ -0,0 +1,138 @@
+/* 
+   Unix SMB/CIFS implementation.
+   
+   Copyright (C) Rafal Szczesniak  2006
+   
+   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 "libnet/libnet.h"
+#include "libcli/composite/composite.h"
+#include "auth/credentials/credentials.h"
+#include "librpc/ndr/libndr.h"
+#include "librpc/gen_ndr/samr.h"
+#include "librpc/gen_ndr/ndr_samr.h"
+#include "librpc/gen_ndr/lsa.h"
+#include "librpc/gen_ndr/ndr_lsa.h"
+
+
+struct composite_context* samr_domain_opened(struct libnet_context *ctx,
+					     const char *domain_name,
+					     struct composite_context *parent_ctx,
+					     struct libnet_DomainOpen *domain_open,
+					     void (*continue_fn)(struct composite_context*),
+					     void (*monitor)(struct monitor_msg*))
+{
+	struct composite_context *domopen_req;
+
+	if (domain_name == NULL) {
+		/*
+		 * Try to guess the domain name from credentials,
+		 * if it's not been explicitly specified.
+		 */
+
+		if (policy_handle_empty(&ctx->samr.handle)) {
+			domain_open->in.type        = DOMAIN_SAMR;
+			domain_open->in.domain_name = cli_credentials_get_domain(ctx->cred);
+			domain_open->in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+
+		} else {
+			composite_error(parent_ctx, NT_STATUS_INVALID_PARAMETER);
+			return parent_ctx;
+		}
+
+	} else {
+		/*
+		 * The domain name has been specified, so check whether the same
+		 * domain is already opened. If it is - just return NULL. Start
+		 * opening a new domain otherwise.
+		 */
+
+		if (policy_handle_empty(&ctx->samr.handle) ||
+		    !strequal(domain_name, ctx->samr.name)) {
+			domain_open->in.type        = DOMAIN_SAMR;
+			domain_open->in.domain_name = domain_name;
+			domain_open->in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+
+		} else {
+			/* domain has already been opened and it's the same domain
+			   as requested */
+			return NULL;
+		}
+	}
+
+	/* send request to open the domain */
+	domopen_req = libnet_DomainOpen_send(ctx, domain_open, monitor);
+	if (composite_nomem(domopen_req, parent_ctx)) return parent_ctx;
+	
+	composite_continue(parent_ctx, domopen_req, continue_fn, parent_ctx);
+	return parent_ctx;
+}
+
+
+struct composite_context* lsa_domain_opened(struct libnet_context *ctx,
+					    const char *domain_name,
+					    struct composite_context *parent_ctx,
+					    struct libnet_DomainOpen *domain_open,
+					    void (*continue_fn)(struct composite_context*),
+					    void (*monitor)(struct monitor_msg*))
+{
+	struct composite_context *domopen_req;
+
+	if (domain_name == NULL) {
+		/*
+		 * Try to guess the domain name from credentials,
+		 * if it's not been explicitly specified.
+		 */
+
+		if (policy_handle_empty(&ctx->lsa.handle)) {
+			domain_open->in.type        = DOMAIN_LSA;
+			domain_open->in.domain_name = cli_credentials_get_domain(ctx->cred);
+			domain_open->in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+
+		} else {
+			composite_error(parent_ctx, NT_STATUS_INVALID_PARAMETER);
+			return parent_ctx;
+		}
+
+	} else {
+		/*
+		 * The domain name has been specified, so check whether the same
+		 * domain is already opened. If it is - just return NULL. Start
+		 * opening a new domain otherwise.
+		 */
+
+		if (policy_handle_empty(&ctx->lsa.handle) ||
+		    !strequal(domain_name, ctx->lsa.name)) {
+			domain_open->in.type        = DOMAIN_LSA;
+			domain_open->in.domain_name = domain_name;
+			domain_open->in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+
+		} else {
+			/* domain has already been opened and it's the same domain
+			   as requested */
+			return NULL;
+		}
+	}
+
+	/* send request to open the domain */
+	domopen_req = libnet_DomainOpen_send(ctx, domain_open, monitor);
+	if (composite_nomem(domopen_req, parent_ctx)) return parent_ctx;
+	
+	composite_continue(parent_ctx, domopen_req, continue_fn, parent_ctx);
+	return parent_ctx;
+}



More information about the samba-cvs mailing list