root/source4/torture/libnet/utils.c

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

DEFINITIONS

This source file includes following definitions.
  1. test_opendomain
  2. test_user_cleanup
  3. test_user_create
  4. test_group_cleanup
  5. test_group_create
  6. msg_handler

   1 /* 
   2    Unix SMB/CIFS implementation.
   3    Test suite for libnet calls.
   4 
   5    Copyright (C) Rafal Szczesniak 2007
   6    
   7    This program is free software; you can redistribute it and/or modify
   8    it under the terms of the GNU General Public License as published by
   9    the Free Software Foundation; either version 3 of the License, or
  10    (at your option) any later version.
  11    
  12    This program is distributed in the hope that it will be useful,
  13    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15    GNU General Public License for more details.
  16    
  17    You should have received a copy of the GNU General Public License
  18    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  19 */
  20 
  21 /*
  22  * These are more general use functions shared among the tests.
  23  */
  24 
  25 #include "includes.h"
  26 #include "torture/rpc/rpc.h"
  27 #include "libnet/libnet.h"
  28 #include "librpc/gen_ndr/ndr_samr_c.h"
  29 #include "torture/libnet/utils.h"
  30 
  31 
  32 bool test_opendomain(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
  33                      struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
  34                      struct policy_handle *handle, struct lsa_String *domname,
  35                      struct dom_sid2 *sid_p)
  36 {
  37         NTSTATUS status;
  38         struct policy_handle h, domain_handle;
  39         struct samr_Connect r1;
  40         struct samr_LookupDomain r2;
  41         struct dom_sid2 *sid = NULL;
  42         struct samr_OpenDomain r3;
  43         
  44         torture_comment(tctx, "connecting\n");
  45         
  46         r1.in.system_name = 0;
  47         r1.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
  48         r1.out.connect_handle = &h;
  49         
  50         status = dcerpc_samr_Connect(p, mem_ctx, &r1);
  51         torture_assert_ntstatus_ok(tctx, status, "Connect failed");
  52         
  53         r2.in.connect_handle = &h;
  54         r2.in.domain_name = domname;
  55         r2.out.sid = &sid;
  56 
  57         torture_comment(tctx, "domain lookup on %s\n", domname->string);
  58 
  59         status = dcerpc_samr_LookupDomain(p, mem_ctx, &r2);
  60         torture_assert_ntstatus_ok(tctx, status, "LookupDomain failed");
  61 
  62         r3.in.connect_handle = &h;
  63         r3.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
  64         r3.in.sid = *r2.out.sid;
  65         r3.out.domain_handle = &domain_handle;
  66 
  67         torture_comment(tctx, "opening domain\n");
  68 
  69         status = dcerpc_samr_OpenDomain(p, mem_ctx, &r3);
  70         torture_assert_ntstatus_ok(tctx, status, "OpenDomain failed");
  71         *handle = domain_handle;
  72 
  73         *sid_p = **r2.out.sid;
  74         return true;
  75 }
  76 
  77 
  78 bool test_user_cleanup(struct torture_context *tctx, struct dcerpc_pipe *p, 
     /* [<][>][^][v][top][bottom][index][help] */
  79                        TALLOC_CTX *mem_ctx, struct policy_handle *domain_handle,
  80                        const char *name)
  81 {
  82         NTSTATUS status;
  83         struct samr_LookupNames r1;
  84         struct samr_OpenUser r2;
  85         struct samr_DeleteUser r3;
  86         struct lsa_String names[2];
  87         uint32_t rid;
  88         struct policy_handle user_handle;
  89         struct samr_Ids rids, types;
  90 
  91         names[0].string = name;
  92 
  93         r1.in.domain_handle  = domain_handle;
  94         r1.in.num_names      = 1;
  95         r1.in.names          = names;
  96         r1.out.rids          = &rids;
  97         r1.out.types         = &types;
  98         
  99         torture_comment(tctx, "user account lookup '%s'\n", name);
 100 
 101         status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
 102         torture_assert_ntstatus_ok(tctx, status, "LookupNames failed");
 103 
 104         rid = r1.out.rids->ids[0];
 105         
 106         r2.in.domain_handle  = domain_handle;
 107         r2.in.access_mask    = SEC_FLAG_MAXIMUM_ALLOWED;
 108         r2.in.rid            = rid;
 109         r2.out.user_handle   = &user_handle;
 110 
 111         torture_comment(tctx, "opening user account\n");
 112 
 113         status = dcerpc_samr_OpenUser(p, mem_ctx, &r2);
 114         torture_assert_ntstatus_ok(tctx, status, "OpenUser failed");
 115 
 116         r3.in.user_handle  = &user_handle;
 117         r3.out.user_handle = &user_handle;
 118 
 119         torture_comment(tctx, "deleting user account\n");
 120         
 121         status = dcerpc_samr_DeleteUser(p, mem_ctx, &r3);
 122         torture_assert_ntstatus_ok(tctx, status, "DeleteUser failed");
 123         
 124         return true;
 125 }
 126 
 127 
 128 bool test_user_create(struct torture_context *tctx, 
     /* [<][>][^][v][top][bottom][index][help] */
 129                       struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 130                       struct policy_handle *handle, const char *name,
 131                       uint32_t *rid)
 132 {
 133         NTSTATUS status;
 134         struct lsa_String username;
 135         struct samr_CreateUser r;
 136         struct policy_handle user_handle;
 137         
 138         username.string = name;
 139         
 140         r.in.domain_handle = handle;
 141         r.in.account_name  = &username;
 142         r.in.access_mask   = SEC_FLAG_MAXIMUM_ALLOWED;
 143         r.out.user_handle  = &user_handle;
 144         r.out.rid          = rid;
 145 
 146         torture_comment(tctx, "creating user account %s\n", name);
 147 
 148         status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
 149         if (!NT_STATUS_IS_OK(status)) {
 150                 printf("CreateUser failed - %s\n", nt_errstr(status));
 151 
 152                 if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
 153                         torture_comment(tctx, "User (%s) already exists - attempting to delete and recreate account again\n", name);
 154                         if (!test_user_cleanup(tctx, p, mem_ctx, handle, name)) {
 155                                 return false;
 156                         }
 157 
 158                         torture_comment(tctx, "creating user account\n");
 159                         
 160                         status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
 161                         torture_assert_ntstatus_ok(tctx, status, "CreateUser failed");
 162                         return true;
 163                 }
 164                 return false;
 165         }
 166 
 167         return true;
 168 }
 169 
 170 
 171 bool test_group_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
 172                         struct policy_handle *domain_handle,
 173                         const char *name)
 174 {
 175         NTSTATUS status;
 176         struct samr_LookupNames r1;
 177         struct samr_OpenGroup r2;
 178         struct samr_DeleteDomainGroup r3;
 179         struct lsa_String names[2];
 180         uint32_t rid;
 181         struct policy_handle group_handle;
 182         struct samr_Ids rids, types;
 183 
 184         names[0].string = name;
 185 
 186         r1.in.domain_handle  = domain_handle;
 187         r1.in.num_names      = 1;
 188         r1.in.names          = names;
 189         r1.out.rids          = &rids;
 190         r1.out.types         = &types;
 191         
 192         printf("group account lookup '%s'\n", name);
 193 
 194         status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
 195         if (!NT_STATUS_IS_OK(status)) {
 196                 printf("LookupNames failed - %s\n", nt_errstr(status));
 197                 return false;
 198         }
 199 
 200         rid = r1.out.rids->ids[0];
 201         
 202         r2.in.domain_handle  = domain_handle;
 203         r2.in.access_mask    = SEC_FLAG_MAXIMUM_ALLOWED;
 204         r2.in.rid            = rid;
 205         r2.out.group_handle  = &group_handle;
 206 
 207         printf("opening group account\n");
 208 
 209         status = dcerpc_samr_OpenGroup(p, mem_ctx, &r2);
 210         if (!NT_STATUS_IS_OK(status)) {
 211                 printf("OpenGroup failed - %s\n", nt_errstr(status));
 212                 return false;
 213         }
 214 
 215         r3.in.group_handle  = &group_handle;
 216         r3.out.group_handle = &group_handle;
 217 
 218         printf("deleting group account\n");
 219         
 220         status = dcerpc_samr_DeleteDomainGroup(p, mem_ctx, &r3);
 221         if (!NT_STATUS_IS_OK(status)) {
 222                 printf("DeleteGroup failed - %s\n", nt_errstr(status));
 223                 return false;
 224         }
 225         
 226         return true;
 227 }
 228 
 229 
 230 bool test_group_create(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
     /* [<][>][^][v][top][bottom][index][help] */
 231                        struct policy_handle *handle, const char *name,
 232                        uint32_t *rid)
 233 {
 234         NTSTATUS status;
 235         struct lsa_String groupname;
 236         struct samr_CreateDomainGroup r;
 237         struct policy_handle group_handle;
 238         
 239         groupname.string = name;
 240         
 241         r.in.domain_handle  = handle;
 242         r.in.name           = &groupname;
 243         r.in.access_mask    = SEC_FLAG_MAXIMUM_ALLOWED;
 244         r.out.group_handle  = &group_handle;
 245         r.out.rid           = rid;
 246 
 247         printf("creating group account %s\n", name);
 248 
 249         status = dcerpc_samr_CreateDomainGroup(p, mem_ctx, &r);
 250         if (!NT_STATUS_IS_OK(status)) {
 251                 printf("CreateGroup failed - %s\n", nt_errstr(status));
 252 
 253                 if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
 254                         printf("Group (%s) already exists - attempting to delete and recreate account again\n", name);
 255                         if (!test_group_cleanup(p, mem_ctx, handle, name)) {
 256                                 return false;
 257                         }
 258 
 259                         printf("creating group account\n");
 260                         
 261                         status = dcerpc_samr_CreateDomainGroup(p, mem_ctx, &r);
 262                         if (!NT_STATUS_IS_OK(status)) {
 263                                 printf("CreateGroup failed - %s\n", nt_errstr(status));
 264                                 return false;
 265                         }
 266                         return true;
 267                 }
 268                 return false;
 269         }
 270 
 271         return true;
 272 }
 273 
 274 
 275 void msg_handler(struct monitor_msg *m)
     /* [<][>][^][v][top][bottom][index][help] */
 276 {
 277         struct msg_rpc_open_user *msg_open;
 278         struct msg_rpc_query_user *msg_query;
 279         struct msg_rpc_close_user *msg_close;
 280         struct msg_rpc_create_user *msg_create;
 281 
 282         switch (m->type) {
 283         case mon_SamrOpenUser:
 284                 msg_open = (struct msg_rpc_open_user*)m->data;
 285                 printf("monitor_msg: user opened (rid=%d, access_mask=0x%08x)\n",
 286                        msg_open->rid, msg_open->access_mask);
 287                 break;
 288         case mon_SamrQueryUser:
 289                 msg_query = (struct msg_rpc_query_user*)m->data;
 290                 printf("monitor_msg: user queried (level=%d)\n", msg_query->level);
 291                 break;
 292         case mon_SamrCloseUser:
 293                 msg_close = (struct msg_rpc_close_user*)m->data;
 294                 printf("monitor_msg: user closed (rid=%d)\n", msg_close->rid);
 295                 break;
 296         case mon_SamrCreateUser:
 297                 msg_create = (struct msg_rpc_create_user*)m->data;
 298                 printf("monitor_msg: user created (rid=%d)\n", msg_create->rid);
 299                 break;
 300         }
 301 }

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