Merge commit 'release-4-0-0alpha1' into v4-0-test
[kai/samba.git] / source / torture / libnet / userinfo.c
index b076783662262f20524388f2c9dfd0b8a38b5b80..46a9a6a015584987665c3084a171a1d0e13a2f40 100644 (file)
@@ -6,7 +6,7 @@
    
    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
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    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.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/ndr_samr.h"
-#include "libnet/composite.h"
+#include "torture/rpc/rpc.h"
+#include "libnet/libnet.h"
+#include "libcli/security/security.h"
+#include "librpc/gen_ndr/ndr_samr_c.h"
+#include "param/param.h"
+#include "torture/libnet/utils.h"
 
-#define TEST_USERNAME  "libnetuserinfotest"
 
+#define TEST_USERNAME  "libnetuserinfotest"
 
-static BOOL test_opendomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
-                           struct policy_handle *handle, struct samr_String *domname,
-                           struct dom_sid2 *sid)
+static bool test_userinfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+                         struct policy_handle *domain_handle,
+                         struct dom_sid2 *domain_sid, const char* user_name,
+                         uint32_t *rid)
 {
+       const uint16_t level = 5;
        NTSTATUS status;
-       struct policy_handle h, domain_handle;
-       struct samr_Connect r1;
-       struct samr_LookupDomain r2;
-       struct samr_OpenDomain r3;
-       
-       printf("connecting\n");
-       
-       r1.in.system_name = 0;
-       r1.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
-       r1.out.connect_handle = &h;
+       struct libnet_rpc_userinfo user;
+       struct dom_sid *user_sid;
        
-       status = dcerpc_samr_Connect(p, mem_ctx, &r1);
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("Connect failed - %s\n", nt_errstr(status));
-               return False;
-       }
+       user_sid = dom_sid_add_rid(mem_ctx, domain_sid, *rid);
        
-       r2.in.connect_handle = &h;
-       r2.in.domain_name = domname;
-
-       printf("domain lookup\n");
+       user.in.domain_handle = *domain_handle;
+       user.in.sid           = dom_sid_string(mem_ctx, user_sid);
+       user.in.level         = level;       /* this should be extended */
 
-       status = dcerpc_samr_LookupDomain(p, mem_ctx, &r2);
+       printf("Testing sync libnet_rpc_userinfo (SID argument)\n");
+       status = libnet_rpc_userinfo(p, mem_ctx, &user);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("LookupDomain failed - %s\n", nt_errstr(status));
-               return False;
+               printf("Failed to call sync libnet_rpc_userinfo - %s\n", nt_errstr(status));
+               return false;
        }
 
-       r3.in.connect_handle = &h;
-       r3.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
-       r3.in.sid = r2.out.sid;
-       r3.out.domain_handle = &domain_handle;
+       ZERO_STRUCT(user);
 
-       printf("opening domain\n");
+       user.in.domain_handle = *domain_handle;
+       user.in.sid           = NULL;
+       user.in.username      = TEST_USERNAME;
+       user.in.level         = level;
 
-       status = dcerpc_samr_OpenDomain(p, mem_ctx, &r3);
+       printf("Testing sync libnet_rpc_userinfo (username argument)\n");
+       status = libnet_rpc_userinfo(p, mem_ctx, &user);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("OpenDomain failed - %s\n", nt_errstr(status));
-               return False;
-       } else {
-               *handle = domain_handle;
+               printf("Failed to call sync libnet_rpc_userinfo - %s\n", nt_errstr(status));
+               return false;
        }
 
-       *sid = *r2.out.sid;
-       return True;
+       return true;
 }
 
 
-static BOOL test_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
-                        struct policy_handle *domain_handle, char *username)
+static bool test_userinfo_async(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+                               struct policy_handle *domain_handle,
+                               struct dom_sid2 *domain_sid, const char* user_name,
+                               uint32_t *rid)
 {
+       const uint16_t level = 10;
        NTSTATUS status;
-       struct samr_LookupNames r1;
-       struct samr_OpenUser r2;
-       struct samr_DeleteUser r3;
-       struct samr_String names[2];
-       uint32_t rid;
-       struct policy_handle user_handle;
-
-       names[0].string = username;
-
-       r1.in.domain_handle  = domain_handle;
-       r1.in.num_names      = 1;
-       r1.in.names          = names;
-       
-       printf("user account lookup\n");
+       struct composite_context *c;
+       struct libnet_rpc_userinfo user;
+       struct dom_sid *user_sid;
 
-       status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("LookupNames failed - %s\n", nt_errstr(status));
-               return False;
-       }
+       user_sid = dom_sid_add_rid(mem_ctx, domain_sid, *rid);
 
-       rid = r1.out.rids.ids[0];
-       
-       r2.in.domain_handle  = domain_handle;
-       r2.in.access_mask    = SEC_FLAG_MAXIMUM_ALLOWED;
-       r2.in.rid            = rid;
-       r2.out.user_handle   = &user_handle;
+       user.in.domain_handle = *domain_handle;
+       user.in.sid           = dom_sid_string(mem_ctx, user_sid);
+       user.in.level         = level;       /* this should be extended */
 
-       printf("opening user account\n");
+       printf("Testing async libnet_rpc_userinfo (SID argument)\n");
 
-       status = dcerpc_samr_OpenUser(p, mem_ctx, &r2);
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("OpenUser failed - %s\n", nt_errstr(status));
-               return False;
+       c = libnet_rpc_userinfo_send(p, &user, msg_handler);
+       if (!c) {
+               printf("Failed to call sync libnet_rpc_userinfo_send\n");
+               return false;
        }
 
-       r3.in.user_handle  = &user_handle;
-       r3.out.user_handle = &user_handle;
-
-       printf("deleting user account\n");
-       
-       status = dcerpc_samr_DeleteUser(p, mem_ctx, &r3);
+       status = libnet_rpc_userinfo_recv(c, mem_ctx, &user);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("DeleteUser failed - %s\n", nt_errstr(status));
-               return False;
+               printf("Calling async libnet_rpc_userinfo failed - %s\n", nt_errstr(status));
+               return false;
        }
-       
-       return True;
-}
 
+       ZERO_STRUCT(user);
 
-static BOOL test_create(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
-                       struct policy_handle *handle, const char *name, uint32_t *rid)
-{
-       NTSTATUS status;
-       struct samr_String username;
-       struct samr_CreateUser r;
-       struct policy_handle user_handle;
-       
-       username.string = name;
-       
-       r.in.domain_handle = handle;
-       r.in.account_name  = &username;
-       r.in.access_mask   = SEC_FLAG_MAXIMUM_ALLOWED;
-       r.out.user_handle  = &user_handle;
-       r.out.rid          = rid;
+       user.in.domain_handle = *domain_handle;
+       user.in.sid           = NULL;
+       user.in.username      = TEST_USERNAME;
+       user.in.level         = level;
 
-       printf("creating user account\n");
+       printf("Testing async libnet_rpc_userinfo (username argument)\n");
 
-       status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("CreateUser failed - %s\n", nt_errstr(status));
-
-               if (NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) {
-                       printf("User (%s) already exists - attempting to delete and recreate account again\n", name);
-                       if (!test_cleanup(p, mem_ctx, handle, TEST_USERNAME)) {
-                               return False;
-                       }
-
-                       printf("creating user account\n");
-                       
-                       status = dcerpc_samr_CreateUser(p, mem_ctx, &r);
-                       if (!NT_STATUS_IS_OK(status)) {
-                               printf("CreateUser failed - %s\n", nt_errstr(status));
-                               return False;
-                       }
-                       return True;
-               }
-               return False;
+       c = libnet_rpc_userinfo_send(p, &user, msg_handler);
+       if (!c) {
+               printf("Failed to call sync libnet_rpc_userinfo_send\n");
+               return false;
        }
 
-       return True;
-}
-
-
-static BOOL test_userinfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
-                         struct policy_handle *domain_handle,
-                         struct dom_sid2 *domain_sid, char* user_name,
-                         uint32_t *rid)
-{
-       NTSTATUS status;
-       struct rpc_composite_userinfo user;
-       struct dom_sid *user_sid;
-       char *name;
-
-       user_sid = dom_sid_add_rid(mem_ctx, domain_sid, *rid);
-
-       user.in.domain_handle = *domain_handle;
-       user.in.sid           = dom_sid_string(mem_ctx, user_sid);
-       user.in.level         = 5;       /* this should be extended */
-
-       printf("Testing sync rpc_composite_userinfo\n");
-       status = rpc_composite_userinfo(p, mem_ctx, &user);
+       status = libnet_rpc_userinfo_recv(c, mem_ctx, &user);
        if (!NT_STATUS_IS_OK(status)) {
-               printf("Failed to call sync rpc_composite_userinfo - %s\n", nt_errstr(status));
-               return False;
+               printf("Calling async libnet_rpc_userinfo failed - %s\n", nt_errstr(status));
+               return false;
        }
 
-       return True;
+       return true;
 }
 
 
-BOOL torture_userinfo(void)
+bool torture_userinfo(struct torture_context *torture)
 {
        NTSTATUS status;
-       const char *binding;
        struct dcerpc_pipe *p;
-       struct dcerpc_binding b;
        TALLOC_CTX *mem_ctx;
-       BOOL ret = True;
-       struct policy_handle h, user_handle;
-       struct samr_String name;
+       bool ret = true;
+       struct policy_handle h;
+       struct lsa_String name;
        struct dom_sid2 sid;
        uint32_t rid;
 
        mem_ctx = talloc_init("test_userinfo");
-       binding = lp_parm_string(-1, "torture", "binding");
 
-       status = torture_rpc_connection(&p,
-                                       DCERPC_SAMR_NAME,
-                                       DCERPC_SAMR_UUID,
-                                       DCERPC_SAMR_VERSION);
+       status = torture_rpc_connection(torture, 
+                                       &p,
+                                       &ndr_table_samr);
        
        if (!NT_STATUS_IS_OK(status)) {
-               return False;
+               return false;
        }
 
-       status = dcerpc_parse_binding(mem_ctx, binding, &b);
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("failed to parse dcerpc binding '%s'\n", binding);
-               talloc_free(mem_ctx);
-               ret = False;
+       name.string = lp_workgroup(global_loadparm);
+
+       /*
+        * Testing synchronous version
+        */
+       if (!test_opendomain(p, mem_ctx, &h, &name, &sid)) {
+               ret = false;
+               goto done;
+       }
+
+       if (!test_user_create(p, mem_ctx, &h, TEST_USERNAME, &rid)) {
+               ret = false;
+               goto done;
+       }
+
+       if (!test_userinfo(p, mem_ctx, &h, &sid, TEST_USERNAME, &rid)) {
+               ret = false;
+               goto done;
+       }
+
+       if (!test_user_cleanup(p, mem_ctx, &h, TEST_USERNAME)) {
+               ret = false;
                goto done;
        }
-       name.string = b.host;
 
+       /*
+        * Testing asynchronous version and monitor messages
+        */
        if (!test_opendomain(p, mem_ctx, &h, &name, &sid)) {
-               ret = False;
+               ret = false;
                goto done;
        }
 
-       if (!test_create(p, mem_ctx, &h, TEST_USERNAME, &rid)) {
-               ret = False;
+       if (!test_user_create(p, mem_ctx, &h, TEST_USERNAME, &rid)) {
+               ret = false;
                goto done;
        }
 
-       if (!test_userinfo(p, mem_ctx, &h, &sid, TEST_USERNAME, &rid)) {
-               ret = False;
+       if (!test_userinfo_async(p, mem_ctx, &h, &sid, TEST_USERNAME, &rid)) {
+               ret = false;
                goto done;
        }
 
-       if (!test_cleanup(p, mem_ctx, &h, TEST_USERNAME)) {
-               ret = False;
+       if (!test_user_cleanup(p, mem_ctx, &h, TEST_USERNAME)) {
+               ret = false;
                goto done;
        }
+
 done:
        talloc_free(mem_ctx);
-       torture_rpc_close(p);
 
        return ret;
 }