root/source4/winbind/wb_cmd_list_trustdom.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. wb_cmd_list_trustdoms_send
  2. cmd_list_trustdoms_recv_domain
  3. cmd_list_trustdoms_recv_lsa
  4. cmd_list_trustdoms_recv_doms
  5. wb_cmd_list_trustdoms_recv

   1 /* 
   2    Unix SMB/CIFS implementation.
   3 
   4    Command backend for wbinfo -m
   5 
   6    Copyright (C) Volker Lendecke 2005
   7    
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "libcli/composite/composite.h"
  24 #include "winbind/wb_server.h"
  25 #include "smbd/service_task.h"
  26 #include "librpc/gen_ndr/ndr_lsa_c.h"
  27 
  28 /* List trusted domains. To avoid the trouble with having to wait for other
  29  * conflicting requests waiting for the lsa pipe we're opening our own lsa
  30  * pipe here. */
  31 
  32 struct cmd_list_trustdom_state {
  33         struct composite_context *ctx;
  34         struct dcerpc_pipe *lsa_pipe;
  35         struct policy_handle *lsa_policy;
  36         int num_domains;
  37         struct wb_dom_info **domains;
  38 
  39         uint32_t resume_handle;
  40         struct lsa_DomainList domainlist;
  41         struct lsa_EnumTrustDom r;
  42 };
  43 
  44 static void cmd_list_trustdoms_recv_domain(struct composite_context *ctx);
  45 static void cmd_list_trustdoms_recv_lsa(struct composite_context *ctx);
  46 static void cmd_list_trustdoms_recv_doms(struct rpc_request *req);
  47 
  48 struct composite_context *wb_cmd_list_trustdoms_send(TALLOC_CTX *mem_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
  49                                                      struct wbsrv_service *service)
  50 {
  51         struct composite_context *result, *ctx;
  52         struct cmd_list_trustdom_state *state;
  53 
  54         result = composite_create(mem_ctx, service->task->event_ctx);
  55         if (result == NULL) goto failed;
  56 
  57         state = talloc(result, struct cmd_list_trustdom_state);
  58         if (state == NULL) goto failed;
  59         state->ctx = result;
  60         result->private_data = state;
  61 
  62         ctx = wb_sid2domain_send(state, service, service->primary_sid);
  63         if (ctx == NULL) goto failed;
  64         ctx->async.fn = cmd_list_trustdoms_recv_domain;
  65         ctx->async.private_data = state;
  66         return result;
  67 
  68  failed:
  69         talloc_free(result);
  70         return NULL;
  71 }
  72 
  73 static void cmd_list_trustdoms_recv_domain(struct composite_context *ctx)
     /* [<][>][^][v][top][bottom][index][help] */
  74 {
  75         struct cmd_list_trustdom_state *state =
  76                 talloc_get_type(ctx->async.private_data,
  77                                 struct cmd_list_trustdom_state);
  78         struct wbsrv_domain *domain;
  79         struct smbcli_tree *tree;
  80 
  81         state->ctx->status = wb_sid2domain_recv(ctx, &domain);
  82         if (!composite_is_ok(state->ctx)) return;
  83 
  84         tree = dcerpc_smb_tree(domain->libnet_ctx->lsa.pipe->conn);
  85         if (composite_nomem(tree, state->ctx)) return;
  86 
  87         ctx = wb_init_lsa_send(state, domain);
  88         composite_continue(state->ctx, ctx, cmd_list_trustdoms_recv_lsa,
  89                            state);
  90 }
  91 
  92 static void cmd_list_trustdoms_recv_lsa(struct composite_context *ctx)
     /* [<][>][^][v][top][bottom][index][help] */
  93 {
  94         struct cmd_list_trustdom_state *state =
  95                 talloc_get_type(ctx->async.private_data,
  96                                 struct cmd_list_trustdom_state);
  97         struct rpc_request *req;
  98 
  99         state->ctx->status = wb_init_lsa_recv(ctx, state,
 100                                               &state->lsa_pipe,
 101                                               &state->lsa_policy);
 102         if (!composite_is_ok(state->ctx)) return;
 103 
 104         state->num_domains = 0;
 105         state->domains = NULL;
 106 
 107         state->domainlist.count = 0;
 108         state->domainlist.domains = NULL;
 109 
 110         state->resume_handle = 0;
 111         state->r.in.handle = state->lsa_policy;
 112         state->r.in.resume_handle = &state->resume_handle;
 113         state->r.in.max_size = 1000;
 114         state->r.out.resume_handle = &state->resume_handle;
 115         state->r.out.domains = &state->domainlist;
 116 
 117         req = dcerpc_lsa_EnumTrustDom_send(state->lsa_pipe, state, &state->r);
 118         composite_continue_rpc(state->ctx, req, cmd_list_trustdoms_recv_doms,
 119                                state);
 120 }
 121 
 122 static void cmd_list_trustdoms_recv_doms(struct rpc_request *req)
     /* [<][>][^][v][top][bottom][index][help] */
 123 {
 124         struct cmd_list_trustdom_state *state =
 125                 talloc_get_type(req->async.private_data,
 126                                 struct cmd_list_trustdom_state);
 127         int i, old_num_domains;
 128 
 129         state->ctx->status = dcerpc_ndr_request_recv(req);
 130         if (!composite_is_ok(state->ctx)) return;
 131         state->ctx->status = state->r.out.result;
 132 
 133         if (!NT_STATUS_IS_OK(state->ctx->status) &&
 134             !NT_STATUS_EQUAL(state->ctx->status, NT_STATUS_NO_MORE_ENTRIES) &&
 135             !NT_STATUS_EQUAL(state->ctx->status, STATUS_MORE_ENTRIES)) {
 136                 composite_error(state->ctx, state->ctx->status);
 137                 return;
 138         }
 139 
 140         old_num_domains = state->num_domains;
 141 
 142         state->num_domains += state->r.out.domains->count;
 143         state->domains = talloc_realloc(state, state->domains,
 144                                         struct wb_dom_info *,
 145                                         state->num_domains);
 146         if (state->num_domains && 
 147             composite_nomem(state->domains, state->ctx)) return;
 148 
 149         for (i=0; i<state->r.out.domains->count; i++) {
 150                 int j = i+old_num_domains;
 151                 state->domains[j] = talloc(state->domains,
 152                                            struct wb_dom_info);
 153                 if (composite_nomem(state->domains[i], state->ctx)) return;
 154                 state->domains[j]->name = talloc_steal(
 155                         state->domains[j],
 156                         state->r.out.domains->domains[i].name.string);
 157                 state->domains[j]->sid = talloc_steal(
 158                         state->domains[j],
 159                         state->r.out.domains->domains[i].sid);
 160         }
 161 
 162         if (NT_STATUS_IS_OK(state->ctx->status) || NT_STATUS_EQUAL(state->ctx->status, NT_STATUS_NO_MORE_ENTRIES)) {
 163                 state->ctx->status = NT_STATUS_OK;
 164                 composite_done(state->ctx);
 165                 return;
 166         }
 167 
 168         state->domainlist.count = 0;
 169         state->domainlist.domains = NULL;
 170         state->r.in.handle = state->lsa_policy;
 171         state->r.in.resume_handle = &state->resume_handle;
 172         state->r.in.max_size = 1000;
 173         state->r.out.resume_handle = &state->resume_handle;
 174         state->r.out.domains = &state->domainlist;
 175         
 176         req = dcerpc_lsa_EnumTrustDom_send(state->lsa_pipe, state, &state->r);
 177         composite_continue_rpc(state->ctx, req, cmd_list_trustdoms_recv_doms,
 178                                state);
 179 }
 180 
 181 NTSTATUS wb_cmd_list_trustdoms_recv(struct composite_context *ctx,
     /* [<][>][^][v][top][bottom][index][help] */
 182                                     TALLOC_CTX *mem_ctx,
 183                                     int *num_domains,
 184                                     struct wb_dom_info ***domains)
 185 {
 186         NTSTATUS status = composite_wait(ctx);
 187         if (NT_STATUS_IS_OK(status)) {
 188                 struct cmd_list_trustdom_state *state =
 189                         talloc_get_type(ctx->private_data,
 190                                         struct cmd_list_trustdom_state);
 191                 *num_domains = state->num_domains;
 192                 *domains = talloc_steal(mem_ctx, state->domains);
 193         }
 194         talloc_free(ctx);
 195         return status;
 196 }

/* [<][>][^][v][top][bottom][index][help] */