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 "torture/libnet/usertest.h"
#include "libnet/libnet.h"
#include "librpc/gen_ndr/ndr_samr_c.h"
+#include "param/param.h"
+#include "torture/libnet/utils.h"
-static BOOL test_opendomain(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
- struct policy_handle *handle, struct lsa_String *domname)
-{
- 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;
-
- status = dcerpc_samr_Connect(p, mem_ctx, &r1);
- if (!NT_STATUS_IS_OK(status)) {
- printf("Connect failed - %s\n", nt_errstr(status));
- return False;
- }
-
- r2.in.connect_handle = &h;
- r2.in.domain_name = domname;
-
- printf("domain lookup on %s\n", domname->string);
-
- status = dcerpc_samr_LookupDomain(p, mem_ctx, &r2);
- if (!NT_STATUS_IS_OK(status)) {
- printf("LookupDomain failed - %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;
-
- printf("opening domain\n");
-
- status = dcerpc_samr_OpenDomain(p, mem_ctx, &r3);
- if (!NT_STATUS_IS_OK(status)) {
- printf("OpenDomain failed - %s\n", nt_errstr(status));
- return False;
- } else {
- *handle = domain_handle;
- }
-
- return True;
-}
-
-static BOOL test_useradd(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+static bool test_useradd(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *domain_handle,
const char *name)
{
NTSTATUS status;
- BOOL ret = True;
+ bool ret = true;
struct libnet_rpc_useradd user;
user.in.domain_handle = *domain_handle;
status = libnet_rpc_useradd(p, 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("Failed to call libnet_rpc_useradd - %s\n", nt_errstr(status));
+ return false;
}
return ret;
}
-static void msg_handler(struct monitor_msg *m)
-{
- struct msg_rpc_create_user *msg_create;
-
- switch (m->type) {
- case rpc_create_user:
- msg_create = (struct msg_rpc_create_user*)m->data;
- printf("monitor_msg: user created (rid=%d)\n", msg_create->rid);
- break;
- }
-}
-
-
-static BOOL test_useradd_async(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+static bool test_useradd_async(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle, const char* username)
{
NTSTATUS status;
c = libnet_rpc_useradd_send(p, &user, msg_handler);
if (!c) {
printf("Failed to call async libnet_rpc_useradd\n");
- return False;
+ return false;
}
status = libnet_rpc_useradd_recv(c, mem_ctx, &user);
if (!NT_STATUS_IS_OK(status)) {
printf("Calling async libnet_rpc_useradd failed - %s\n", nt_errstr(status));
- return False;
+ return false;
}
- return True;
+ return true;
}
-
-static BOOL test_cleanup(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
- struct policy_handle *domain_handle, const char *username)
-{
- NTSTATUS status;
- struct samr_LookupNames r1;
- struct samr_OpenUser r2;
- struct samr_DeleteUser r3;
- struct lsa_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 '%s'\n", username);
-
- status = dcerpc_samr_LookupNames(p, mem_ctx, &r1);
- if (!NT_STATUS_IS_OK(status)) {
- printf("LookupNames failed - %s\n", nt_errstr(status));
- return False;
- }
-
- 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;
-
- printf("opening user account\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;
- }
-
- 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);
- if (!NT_STATUS_IS_OK(status)) {
- printf("DeleteUser failed - %s\n", nt_errstr(status));
- return False;
- }
-
- return True;
-}
-
-
-static BOOL test_createuser(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
- struct policy_handle *handle, const char* user)
-{
- NTSTATUS status;
- struct policy_handle user_handle;
- struct lsa_String username;
- struct samr_CreateUser r1;
- struct samr_Close r2;
- uint32_t user_rid;
-
- username.string = user;
-
- r1.in.domain_handle = handle;
- r1.in.account_name = &username;
- r1.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
- r1.out.user_handle = &user_handle;
- r1.out.rid = &user_rid;
-
- printf("creating user '%s'\n", username.string);
-
- status = dcerpc_samr_CreateUser(p, mem_ctx, &r1);
- 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", user);
- if (!test_cleanup(p, mem_ctx, handle, TEST_USERNAME)) {
- return False;
- }
-
- printf("creating user account\n");
-
- status = dcerpc_samr_CreateUser(p, mem_ctx, &r1);
- if (!NT_STATUS_IS_OK(status)) {
- printf("CreateUser failed - %s\n", nt_errstr(status));
- return False;
- }
- return True;
- }
- return False;
- }
-
- r2.in.handle = &user_handle;
- r2.out.handle = &user_handle;
-
- printf("closing user '%s'\n", username.string);
-
- status = dcerpc_samr_Close(p, mem_ctx, &r2);
- if (!NT_STATUS_IS_OK(status)) {
- printf("Close failed - %s\n", nt_errstr(status));
- return False;
- }
-
- return True;
-}
-
-
-static BOOL test_usermod(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+static bool test_usermod(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle, int num_changes,
struct libnet_rpc_usermod *mod, char **username)
{
const char *homedir, *homedrive, *logonscript;
const uint32_t flags[] = { (ACB_DISABLED | ACB_NORMAL),
(ACB_NORMAL | ACB_PWNOEXP),
- (ACB_NORMAL | ACB_PW_EXPIRED) };
+ (ACB_NORMAL) };
NTSTATUS status;
struct timeval now;
case acct_expiry:
continue_if_field_set(mod->in.change.acct_expiry);
now = timeval_add(&now, (random() % (31*24*60*60)), 0);
- mod->in.change.acct_expiry = talloc_memdup(mem_ctx, &now, sizeof(now));
+ mod->in.change.acct_expiry = (struct timeval *)talloc_memdup(mem_ctx, &now, sizeof(now));
mod->in.change.fields |= USERMOD_FIELD_ACCT_EXPIRY;
fldname = "acct_expiry";
break;
status = libnet_rpc_usermod(p, mem_ctx, mod);
if (!NT_STATUS_IS_OK(status)) {
printf("Failed to call sync libnet_rpc_usermod - %s\n", nt_errstr(status));
- return False;
+ return false;
}
- return True;
+ return true;
}
-static BOOL test_userdel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+static bool test_userdel(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle, const char *username)
{
NTSTATUS status;
status = libnet_rpc_userdel(p, mem_ctx, &user);
if (!NT_STATUS_IS_OK(status)) {
printf("Failed to call sync libnet_rpc_userdel - %s\n", nt_errstr(status));
- return False;
+ return false;
}
- return True;
+ return true;
}
printf("'%s' field does not match\n", #fld); \
printf("received: '%s'\n", i->fld.string); \
printf("expected: '%s'\n", mod->in.change.fld); \
- return False; \
+ return false; \
}
nttime_to_timeval(&t, i->fld); \
if (timeval_compare(&t, mod->in.change.fld)) { \
printf("'%s' field does not match\n", #fld); \
- printf("received: '%s (+%ld us)'\n", timestring(mem_ctx, t.tv_sec), t.tv_usec); \
- printf("expected: '%s (+%ld us)'\n", timestring(mem_ctx, mod->in.change.fld->tv_sec), mod->in.change.fld->tv_usec); \
- return False; \
+ printf("received: '%s (+%ld us)'\n", \
+ timestring(mem_ctx, t.tv_sec), t.tv_usec); \
+ printf("expected: '%s (+%ld us)'\n", \
+ timestring(mem_ctx, mod->in.change.fld->tv_sec), \
+ mod->in.change.fld->tv_usec); \
+ return false; \
} \
}
printf("'%s' field does not match\n", #fld); \
printf("received: '%04x'\n", i->fld); \
printf("expected: '%04x'\n", mod->in.change.fld); \
- return False; \
+ return false; \
}
-static BOOL test_compare(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
+static bool test_compare(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
struct policy_handle *handle, struct libnet_rpc_usermod *mod,
const char *username)
{
status = libnet_rpc_userinfo(p, mem_ctx, &info);
if (!NT_STATUS_IS_OK(status)) {
printf("Failed to call sync libnet_rpc_userinfo - %s\n", nt_errstr(status));
- return False;
+ return false;
}
i = &info.out.info.info21;
CMP_TIME_FLD(acct_expiry, USERMOD_FIELD_ACCT_EXPIRY);
CMP_NUM_FLD(acct_flags, USERMOD_FIELD_ACCT_FLAGS)
- return True;
+ return true;
}
-BOOL torture_useradd(struct torture_context *torture)
+bool torture_useradd(struct torture_context *torture)
{
NTSTATUS status;
- const char *binding;
struct dcerpc_pipe *p;
struct policy_handle h;
struct lsa_String domain_name;
+ struct dom_sid2 sid;
const char *name = TEST_USERNAME;
TALLOC_CTX *mem_ctx;
- BOOL ret = True;
+ bool ret = true;
mem_ctx = talloc_init("test_useradd");
- binding = torture_setting_string(torture, "binding", NULL);
- status = torture_rpc_connection(mem_ctx,
+ status = torture_rpc_connection(torture,
&p,
- &dcerpc_table_samr);
+ &ndr_table_samr);
if (!NT_STATUS_IS_OK(status)) {
- return False;
+ return false;
}
- domain_name.string = lp_workgroup();
- if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
- ret = False;
+ domain_name.string = lp_workgroup(torture->lp_ctx);
+ if (!test_opendomain(p, mem_ctx, &h, &domain_name, &sid)) {
+ ret = false;
goto done;
}
if (!test_useradd(p, mem_ctx, &h, name)) {
- ret = False;
+ ret = false;
goto done;
}
- if (!test_cleanup(p, mem_ctx, &h, name)) {
- ret = False;
+ if (!test_user_cleanup(p, mem_ctx, &h, name)) {
+ ret = false;
goto done;
}
- if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
- ret = False;
+ if (!test_opendomain(p, mem_ctx, &h, &domain_name, &sid)) {
+ ret = false;
goto done;
}
if (!test_useradd_async(p, mem_ctx, &h, name)) {
- ret = False;
+ ret = false;
goto done;
}
- if (!test_cleanup(p, mem_ctx, &h, name)) {
- ret = False;
+ if (!test_user_cleanup(p, mem_ctx, &h, name)) {
+ ret = false;
goto done;
}
}
-BOOL torture_userdel(struct torture_context *torture)
+bool torture_userdel(struct torture_context *torture)
{
NTSTATUS status;
- const char *binding;
struct dcerpc_pipe *p;
struct policy_handle h;
struct lsa_String domain_name;
+ struct dom_sid2 sid;
+ uint32_t rid;
const char *name = TEST_USERNAME;
TALLOC_CTX *mem_ctx;
- BOOL ret = True;
+ bool ret = true;
mem_ctx = talloc_init("test_userdel");
- binding = torture_setting_string(torture, "binding", NULL);
- status = torture_rpc_connection(mem_ctx,
+ status = torture_rpc_connection(torture,
&p,
- &dcerpc_table_samr);
+ &ndr_table_samr);
if (!NT_STATUS_IS_OK(status)) {
- return False;
+ return false;
}
- domain_name.string = lp_workgroup();
- if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
- ret = False;
+ domain_name.string = lp_workgroup(torture->lp_ctx);
+ if (!test_opendomain(p, mem_ctx, &h, &domain_name, &sid)) {
+ ret = false;
goto done;
}
- if (!test_createuser(p, mem_ctx, &h, name)) {
- ret = False;
+ if (!test_user_create(p, mem_ctx, &h, name, &rid)) {
+ ret = false;
goto done;
}
if (!test_userdel(p, mem_ctx, &h, name)) {
- ret = False;
+ ret = false;
goto done;
}
}
-BOOL torture_usermod(struct torture_context *torture)
+bool torture_usermod(struct torture_context *torture)
{
NTSTATUS status;
- const char *binding;
struct dcerpc_pipe *p;
struct policy_handle h;
struct lsa_String domain_name;
+ struct dom_sid2 sid;
+ uint32_t rid;
int i;
char *name;
TALLOC_CTX *mem_ctx;
- BOOL ret = True;
+ bool ret = true;
mem_ctx = talloc_init("test_userdel");
- binding = torture_setting_string(torture, "binding", NULL);
- status = torture_rpc_connection(mem_ctx,
+ status = torture_rpc_connection(torture,
&p,
- &dcerpc_table_samr);
+ &ndr_table_samr);
if (!NT_STATUS_IS_OK(status)) {
- ret = False;
+ ret = false;
goto done;
}
- domain_name.string = lp_workgroup();
+ domain_name.string = lp_workgroup(torture->lp_ctx);
name = talloc_strdup(mem_ctx, TEST_USERNAME);
- if (!test_opendomain(p, mem_ctx, &h, &domain_name)) {
- ret = False;
+ if (!test_opendomain(p, mem_ctx, &h, &domain_name, &sid)) {
+ ret = false;
goto done;
}
- if (!test_createuser(p, mem_ctx, &h, name)) {
- ret = False;
+ if (!test_user_create(p, mem_ctx, &h, name, &rid)) {
+ ret = false;
goto done;
}
struct libnet_rpc_usermod m;
if (!test_usermod(p, mem_ctx, &h, i, &m, &name)) {
- ret = False;
+ ret = false;
goto cleanup;
}
if (!test_compare(p, mem_ctx, &h, &m, name)) {
- ret = False;
+ ret = false;
goto cleanup;
}
}
cleanup:
- if (!test_cleanup(p, mem_ctx, &h, name)) {
- ret = False;
+ if (!test_user_cleanup(p, mem_ctx, &h, name)) {
+ ret = false;
goto done;
}