r19583: a few prerequisite functions called from within libnet functions
authorRafal Szczesniak <mimir@samba.org>
Mon, 6 Nov 2006 21:16:27 +0000 (21:16 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:24:56 +0000 (14:24 -0500)
(in this case domain related) to ensure certain conditions before
doing what libnet function is expected to do.

rafal
(This used to be commit e3159ceeede2865b0252ee24497498ec9ffa432f)

source4/libnet/prereq_domain.c [new file with mode: 0644]

diff --git a/source4/libnet/prereq_domain.c b/source4/libnet/prereq_domain.c
new file mode 100644 (file)
index 0000000..e02d7d4
--- /dev/null
@@ -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;
+}