diff options
Diffstat (limited to 'source4/torture')
-rw-r--r-- | source4/torture/config.mk | 39 | ||||
-rw-r--r-- | source4/torture/gentest.c | 173 | ||||
-rw-r--r-- | source4/torture/libnet/libnet_BecomeDC.c | 333 | ||||
-rw-r--r-- | source4/torture/local/torture.c | 35 | ||||
-rw-r--r-- | source4/torture/locktest.c | 181 | ||||
-rw-r--r-- | source4/torture/masktest.c | 157 | ||||
-rw-r--r-- | source4/torture/rpc/eventlog.c | 10 | ||||
-rw-r--r-- | source4/torture/rpc/initshutdown.c | 13 | ||||
-rw-r--r-- | source4/torture/rpc/samba3rpc.c | 73 | ||||
-rw-r--r-- | source4/torture/rpc/samsync.c | 13 | ||||
-rw-r--r-- | source4/torture/rpc/spoolss.c | 22 | ||||
-rw-r--r-- | source4/torture/rpc/winreg.c | 15 | ||||
-rw-r--r-- | source4/torture/smb2/connect.c | 10 | ||||
-rw-r--r-- | source4/torture/smb2/getinfo.c | 10 | ||||
-rw-r--r-- | source4/torture/smb2/lock.c | 8 | ||||
-rw-r--r-- | source4/torture/smb2/scan.c | 15 | ||||
-rw-r--r-- | source4/torture/smb2/util.c | 43 | ||||
-rw-r--r-- | source4/torture/smbtorture.c | 2 | ||||
-rw-r--r-- | source4/torture/util.c | 73 | ||||
-rw-r--r-- | source4/torture/util.h | 120 | ||||
-rw-r--r-- | source4/torture/util_provision.c | 355 | ||||
-rw-r--r-- | source4/torture/util_smb.c | 39 |
22 files changed, 955 insertions, 784 deletions
diff --git a/source4/torture/config.mk b/source4/torture/config.mk index 0ee7873628..626349a45d 100644 --- a/source4/torture/config.mk +++ b/source4/torture/config.mk @@ -11,12 +11,12 @@ OBJ_FILES = \ PUBLIC_DEPENDENCIES = \ LIBSAMBA-CONFIG \ LIBSAMBA-UTIL \ - LIBTALLOC + LIBTALLOC \ + LIBPOPT [SUBSYSTEM::TORTURE_UTIL] -OBJ_FILES = util.o util_smb.o -PRIVATE_DEPENDENCIES = LIBCLI_RAW -PUBLIC_PROTO_HEADER = util.h +OBJ_FILES = util_smb.o util_provision.o +PRIVATE_DEPENDENCIES = LIBCLI_RAW LIBPYTHON smbcalls PUBLIC_DEPENDENCIES = POPT_CREDENTIALS ################################# @@ -96,8 +96,8 @@ PRIVATE_DEPENDENCIES = \ # End SUBSYSTEM TORTURE_RAW ################################# -include smb2/config.mk -include winbind/config.mk +mkinclude smb2/config.mk +mkinclude winbind/config.mk [SUBSYSTEM::TORTURE_NDR] PRIVATE_PROTO_HEADER = ndr/proto.h @@ -114,7 +114,7 @@ OBJ_FILES = ndr/ndr.o \ [MODULE::torture_rpc] # TORTURE_NET and TORTURE_NBT use functions from torture_rpc... -#OUTPUT_TYPE = INTEGRATED +#OUTPUT_TYPE = MERGED_OBJ SUBSYSTEM = torture INIT_FUNCTION = torture_rpc_init PRIVATE_PROTO_HEADER = \ @@ -196,12 +196,12 @@ OBJ_FILES = \ auth/ntlmssp.o \ auth/pac.o PRIVATE_DEPENDENCIES = \ - LIBCLI_SMB gensec auth LIBSAMBA3 KERBEROS \ - POPT_CREDENTIALS + LIBCLI_SMB gensec auth KERBEROS \ + POPT_CREDENTIALS SMBPASSWD # End SUBSYSTEM TORTURE_AUTH ################################# -include local/config.mk +mkinclude local/config.mk ################################# # Start MODULE TORTURE_NBENCH @@ -295,7 +295,6 @@ OBJ_FILES = \ libnet/libnet_BecomeDC.o PRIVATE_DEPENDENCIES = \ LIBSAMBA-NET \ - smbcalls \ POPT_CREDENTIALS \ torture_rpc # End SUBSYSTEM TORTURE_NET @@ -361,6 +360,9 @@ INSTALLDIR = BINDIR OBJ_FILES = \ locktest.o PRIVATE_DEPENDENCIES = \ + LIBPOPT \ + POPT_SAMBA \ + POPT_CREDENTIALS \ LIBSAMBA-UTIL \ LIBCLI_SMB \ LIBSAMBA-CONFIG @@ -368,21 +370,14 @@ MANPAGE = man/locktest.1 # End BINARY locktest ################################# -GCOV_CFLAGS = -ftest-coverage -fprofile-arcs -GCOV_LDFLAGS = $(GCOV_CFLAGS) -lgcov - COV_TARGET = test COV_VARS = \ - CFLAGS="$(CFLAGS) $(GCOV_CFLAGS)" \ - BNLD_FLAGS="$(BNLD_FLAGS) $(GCOV_LDFLAGS)" \ - SHLD_FLAGS="$(SHLD_FLAGS) $(GCOV_LDFLAGS)" \ - MDLD_FLAGS="$(MDLD_FLAGS) $(GCOV_LDFLAGS)" \ - HOSTCC_FLAGS="$(HOSTCC_FLAGS) $(GCOV_CFLAGS)" \ - HOSTLD_FLAGS="$(HOSTLD_FLAGS) $(GCOV_LDFLAGS)" + CFLAGS="$(CFLAGS) --coverage" \ + LDFLAGS="$(LDFLAGS) --coverage" test_cov: - @$(MAKE) $(COV_TARGET) $(COV_VARS) + -$(MAKE) $(COV_TARGET) $(COV_VARS) gcov: test_cov for I in $(sort $(dir $(ALL_OBJS))); \ @@ -394,10 +389,12 @@ lcov-split: @$(MAKE) $(COV_TARGET) $(COV_VARS) \ TEST_OPTIONS="--analyse-cmd=\"lcov --base-directory `pwd` --directory . --capture --output-file samba.info -t\"" -rm heimdal/lib/*/{lex,parse}.{gcda,gcno} + -rm lib/policy/*/{lex,parse}.{gcda,gcno} genhtml -o coverage samba.info lcov: test_cov -rm heimdal/lib/*/{lex,parse}.{gcda,gcno} + -rm lib/policy/*/{lex,parse}.{gcda,gcno} lcov --base-directory `pwd` --directory . --capture --output-file samba.info genhtml -o coverage samba.info diff --git a/source4/torture/gentest.c b/source4/torture/gentest.c index d50393baf0..d5fc855f17 100644 --- a/source4/torture/gentest.c +++ b/source4/torture/gentest.c @@ -18,6 +18,7 @@ */ #include "includes.h" +#include "lib/cmdline/popt_common.h" #include "system/time.h" #include "system/filesys.h" #include "libcli/raw/request.h" @@ -1755,6 +1756,7 @@ static void gen_setfileinfo(int instance, union smb_setfileinfo *info) info->end_of_file_info.in.size = gen_offset(); break; case RAW_SFILEINFO_RENAME_INFORMATION: + case RAW_SFILEINFO_RENAME_INFORMATION_SMB2: info->rename_information.in.overwrite = gen_bool(); info->rename_information.in.root_fid = gen_root_fid(instance); info->rename_information.in.new_name = gen_fname_open(instance); @@ -2129,25 +2131,13 @@ static bool start_gentest(struct loadparm_context *lp_ctx) } -static void usage(void) +static void usage(poptContext pc) { printf( "Usage:\n\ - gentest2 //server1/share1 //server2/share2 [options..]\n\ - options:\n\ - -U user%%pass (can be specified twice)\n\ - -s seed\n\ - -o numops\n\ - -a (show all ops)\n\ - -A backtrack to find minimal ops\n\ - -i FILE add a list of wildcard exclusions\n\ - -O enable oplocks\n\ - -S FILE set preset seeds file\n\ - -L use preset seeds\n\ - -F fast reconnect (just close files)\n\ - -C continuous analysis mode\n\ - -X analyse even when test OK\n\ + gentest //server1/share1 //server2/share2 [options..]\n\ "); + poptPrintUsage(pc, stdout, 0); } /** @@ -2180,105 +2170,106 @@ static bool split_unc_name(const char *unc, char **server, char **share) int opt; int i, username_count=0; bool ret; + char *ignore_file=NULL; struct loadparm_context *lp_ctx; + poptContext pc; + int argc_new; + char **argv_new; + enum {OPT_UNCLIST=1000}; + struct poptOption long_options[] = { + POPT_AUTOHELP + {"seed", 0, POPT_ARG_INT, &options.seed, 0, "Seed to use for randomizer", NULL}, + {"num-ops", 0, POPT_ARG_INT, &options.numops, 0, "num ops", NULL}, + {"oplocks", 0, POPT_ARG_NONE, &options.use_oplocks,0, "use oplocks", NULL}, + {"showall", 0, POPT_ARG_NONE, &options.showall, 0, "display all operations", NULL}, + {"analyse", 0, POPT_ARG_NONE, &options.analyze, 0, "do backtrack analysis", NULL}, + {"analysealways", 0, POPT_ARG_NONE, &options.analyze_always, 0, "analysis always", NULL}, + {"analysecontinuous", 0, POPT_ARG_NONE, &options.analyze_continuous, 0, "analysis continuous", NULL}, + {"ignore", 0, POPT_ARG_STRING, &ignore_file, 0, "ignore from file", NULL}, + {"preset", 0, POPT_ARG_NONE, &options.use_preset_seeds, 0, "use preset seeds", NULL}, + {"fast", 0, POPT_ARG_NONE, &options.fast_reconnect, 0, "use fast reconnect", NULL}, + {"unclist", 0, POPT_ARG_STRING, NULL, OPT_UNCLIST, "unclist", NULL}, + {"seedsfile", 0, POPT_ARG_STRING, &options.seeds_file, 0, "seed file", NULL}, + { "user", 'U', POPT_ARG_STRING, NULL, 'U', "Set the network username", "[DOMAIN/]USERNAME[%PASSWORD]" }, + POPT_COMMON_SAMBA + POPT_COMMON_CONNECTION + POPT_COMMON_CREDENTIALS + POPT_COMMON_VERSION + { NULL } + }; setlinebuf(stdout); + options.seed = time(NULL); + options.numops = 1000; + options.max_open_handles = 20; + options.seeds_file = "gentest_seeds.dat"; - setup_logging("gentest", DEBUG_STDOUT); - - if (argc < 3 || argv[1][0] == '-') { - usage(); - exit(1); - } - - setup_logging(argv[0], DEBUG_STDOUT); - - for (i=0;i<NSERVERS;i++) { - const char *share = argv[1+i]; - servers[i].credentials = cli_credentials_init(NULL); - if (!split_unc_name(share, &servers[i].server_name, &servers[i].share_name)) { - printf("Invalid share name '%s'\n", share); - return -1; - } - } - - argc -= NSERVERS; - argv += NSERVERS; + pc = poptGetContext("gentest", argc, (const char **) argv, long_options, + POPT_CONTEXT_KEEP_FIRST); - lp_ctx = loadparm_init(talloc_autofree_context()); - lp_load(lp_ctx, dyn_CONFIGFILE); + poptSetOtherOptionHelp(pc, "<unc1> <unc2>"); + lp_ctx = cmdline_lp_ctx; servers[0].credentials = cli_credentials_init(talloc_autofree_context()); servers[1].credentials = cli_credentials_init(talloc_autofree_context()); cli_credentials_guess(servers[0].credentials, lp_ctx); cli_credentials_guess(servers[1].credentials, lp_ctx); - options.seed = time(NULL); - options.numops = 1000; - options.max_open_handles = 20; - options.seeds_file = "gentest_seeds.dat"; - - while ((opt = getopt(argc, argv, "U:s:o:ad:i:AOhS:LFXC")) != EOF) { + while((opt = poptGetNextOpt(pc)) != -1) { switch (opt) { + case OPT_UNCLIST: + lp_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc)); + break; case 'U': if (username_count == 2) { - usage(); + usage(pc); exit(1); } - cli_credentials_parse_string(servers[username_count].credentials, - optarg, CRED_SPECIFIED); + cli_credentials_parse_string(servers[username_count].credentials, poptGetOptArg(pc), CRED_SPECIFIED); username_count++; break; - case 'd': - DEBUGLEVEL = atoi(optarg); - setup_logging(NULL, DEBUG_STDOUT); - break; - case 's': - options.seed = atoi(optarg); - break; - case 'S': - options.seeds_file = optarg; - break; - case 'L': - options.use_preset_seeds = true; - break; - case 'F': - options.fast_reconnect = true; - break; - case 'o': - options.numops = atoi(optarg); - break; - case 'O': - options.use_oplocks = true; - break; - case 'a': - options.showall = true; - break; - case 'A': - options.analyze = true; - break; - case 'X': - options.analyze_always = true; - break; - case 'C': - options.analyze_continuous = true; - break; - case 'i': - options.ignore_patterns = file_lines_load(optarg, NULL, NULL); + } + } + + if (ignore_file) { + options.ignore_patterns = file_lines_load(ignore_file, NULL, NULL); + } + + argv_new = discard_const_p(char *, poptGetArgs(pc)); + argc_new = argc; + for (i=0; i<argc; i++) { + if (argv_new[i] == NULL) { + argc_new = i; break; - case 'h': - usage(); - exit(1); - default: - printf("Unknown option %c (%d)\n", (char)opt, opt); - exit(1); } } - gensec_init(lp_ctx); + if (!(argc_new >= 3)) { + usage(pc); + exit(1); + } + + setlinebuf(stdout); + + setup_logging("gentest", DEBUG_STDOUT); + + if (argc < 3 || argv[1][0] == '-') { + usage(pc); + exit(1); + } + + setup_logging(argv[0], DEBUG_STDOUT); + + for (i=0;i<NSERVERS;i++) { + const char *share = argv[1+i]; + if (!split_unc_name(share, &servers[i].server_name, &servers[i].share_name)) { + printf("Invalid share name '%s'\n", share); + return -1; + } + } if (username_count == 0) { - usage(); + usage(pc); return -1; } if (username_count == 1) { @@ -2287,6 +2278,8 @@ static bool split_unc_name(const char *unc, char **server, char **share) printf("seed=%u\n", options.seed); + gensec_init(lp_ctx); + ret = start_gentest(lp_ctx); if (ret) { diff --git a/source4/torture/libnet/libnet_BecomeDC.c b/source4/torture/libnet/libnet_BecomeDC.c index 0ef6a03a6a..9566f5ee29 100644 --- a/source4/torture/libnet/libnet_BecomeDC.c +++ b/source4/torture/libnet/libnet_BecomeDC.c @@ -34,8 +34,10 @@ #include "librpc/gen_ndr/ndr_drsblobs.h" #include "librpc/gen_ndr/ndr_misc.h" #include "system/time.h" -#include "auth/auth.h" #include "lib/ldb_wrap.h" +#include "auth/auth.h" +#include "param/param.h" +#include "torture/util.h" struct test_become_dc_state { struct libnet_context *ctx; @@ -66,6 +68,35 @@ struct test_become_dc_state { } path; }; +static NTSTATUS test_become_dc_prepare_db(void *private_data, + const struct libnet_BecomeDC_PrepareDB *p) +{ + struct test_become_dc_state *s = talloc_get_type(private_data, struct test_become_dc_state); + struct provision_settings settings; + + settings.dns_name = p->dest_dsa->dns_name; + settings.site_name = p->dest_dsa->site_name; + settings.root_dn_str = p->forest->root_dn_str; + settings.domain_dn_str = p->domain->dn_str; + settings.config_dn_str = p->forest->config_dn_str; + settings.schema_dn_str = p->forest->schema_dn_str; + settings.invocation_id = &p->dest_dsa->invocation_id; + settings.netbios_name = p->dest_dsa->netbios_name; + settings.realm = torture_join_dom_dns_name(s->tj); + settings.domain = torture_join_dom_netbios_name(s->tj); + settings.ntds_guid = &p->dest_dsa->ntds_guid; + settings.ntds_dn_str = p->dest_dsa->ntds_dn_str; + settings.machine_password = cli_credentials_get_password(s->machine_account); + settings.samdb_ldb = s->path.samdb_ldb; + settings.secrets_ldb = s->path.secrets_ldb; + settings.secrets_keytab = s->path.secrets_keytab; + settings.schemadn_ldb = s->path.schemadn_ldb; + settings.configdn_ldb = s->path.configdn_ldb; + settings.domaindn_ldb = s->path.domaindn_ldb; + + return provision_bare(s, s->tctx->lp_ctx, &settings); +} + static NTSTATUS test_become_dc_check_options(void *private_data, const struct libnet_BecomeDC_CheckOptions *o) { @@ -90,299 +121,6 @@ static NTSTATUS test_become_dc_check_options(void *private_data, return NT_STATUS_OK; } -#include "lib/appweb/ejs/ejs.h" -#include "lib/appweb/ejs/ejsInternal.h" -#include "scripting/ejs/smbcalls.h" - -static EjsId eid; -static int ejs_error; - -static void test_ejs_exception(const char *reason) -{ - Ejs *ep = ejsPtr(eid); - ejsSetErrorMsg(eid, "%s", reason); - fprintf(stderr, "%s", ep->error); - ejs_error = 127; -} - -static int test_run_ejs(char *script) -{ - EjsHandle handle = 0; - MprVar result; - char *emsg; - TALLOC_CTX *mem_ctx = talloc_new(NULL); - struct MprVar *return_var; - - mprSetCtx(mem_ctx); - - if (ejsOpen(NULL, NULL, NULL) != 0) { - d_printf("ejsOpen(): unable to initialise EJS subsystem\n"); - ejs_error = 127; - goto failed; - } - - smb_setup_ejs_functions(test_ejs_exception); - - if ((eid = ejsOpenEngine(handle, 0)) == (EjsId)-1) { - d_printf("smbscript: ejsOpenEngine(): unable to initialise an EJS engine\n"); - ejs_error = 127; - goto failed; - } - - mprSetVar(ejsGetGlobalObject(eid), "ARGV", mprList("ARGV", NULL)); - - /* run the script */ - if (ejsEvalScript(eid, script, &result, &emsg) == -1) { - d_printf("smbscript: ejsEvalScript(): %s\n", emsg); - if (ejs_error == 0) ejs_error = 127; - goto failed; - } - - return_var = ejsGetReturnValue(eid); - ejs_error = mprVarToNumber(return_var); - -failed: - ejsClose(); - talloc_free(mem_ctx); - return ejs_error; -} - -static NTSTATUS test_become_dc_prepare_db_ejs(void *private_data, - const struct libnet_BecomeDC_PrepareDB *p) -{ - struct test_become_dc_state *s = talloc_get_type(private_data, struct test_become_dc_state); - char *ejs; - int ret; - bool ok; - - DEBUG(0,("Provision for Become-DC test using EJS\n")); - - DEBUG(0,("New Server[%s] in Site[%s]\n", - p->dest_dsa->dns_name, p->dest_dsa->site_name)); - - DEBUG(0,("DSA Instance [%s]\n" - "\tobjectGUID[%s]\n" - "\tinvocationId[%s]\n", - p->dest_dsa->ntds_dn_str, - GUID_string(s, &p->dest_dsa->ntds_guid), - GUID_string(s, &p->dest_dsa->invocation_id))); - - DEBUG(0,("Pathes under PRIVATEDIR[%s]\n" - "SAMDB[%s] SECRETS[%s] KEYTAB[%s]\n", - lp_private_dir(s->tctx->lp_ctx), - s->path.samdb_ldb, - s->path.secrets_ldb, - s->path.secrets_keytab)); - - DEBUG(0,("Schema Partition[%s => %s]\n", - p->forest->schema_dn_str, s->path.schemadn_ldb)); - - DEBUG(0,("Config Partition[%s => %s]\n", - p->forest->config_dn_str, s->path.configdn_ldb)); - - DEBUG(0,("Domain Partition[%s => %s]\n", - p->domain->dn_str, s->path.domaindn_ldb)); - - ejs = talloc_asprintf(s, - "libinclude(\"base.js\");\n" - "libinclude(\"provision.js\");\n" - "\n" - "function message() { print(vsprintf(arguments)); }\n" - "\n" - "var subobj = provision_guess();\n" - "subobj.ROOTDN = \"%s\";\n" - "subobj.DOMAINDN = \"%s\";\n" - "subobj.DOMAINDN_LDB = \"%s\";\n" - "subobj.CONFIGDN = \"%s\";\n" - "subobj.CONFIGDN_LDB = \"%s\";\n" - "subobj.SCHEMADN = \"%s\";\n" - "subobj.SCHEMADN_LDB = \"%s\";\n" - "subobj.HOSTNAME = \"%s\";\n" - "subobj.REALM = \"%s\";\n" - "subobj.DOMAIN = \"%s\";\n" - "subobj.DEFAULTSITE = \"%s\";\n" - "\n" - "subobj.KRBTGTPASS = \"_NOT_USED_\";\n" - "subobj.MACHINEPASS = \"%s\";\n" - "subobj.ADMINPASS = \"_NOT_USED_\";\n" - "\n" - "var paths = provision_default_paths(subobj);\n" - "paths.samdb = \"%s\";\n" - "paths.secrets = \"%s\";\n" - "paths.templates = \"%s\";\n" - "paths.keytab = \"%s\";\n" - "paths.dns_keytab = \"%s\";\n" - "\n" - "var system_session = system_session();\n" - "\n" - "var ok = provision_become_dc(subobj, message, true, paths, system_session);\n" - "assert(ok);\n" - "\n" - "return 0;\n", - p->forest->root_dn_str, /* subobj.ROOTDN */ - p->domain->dn_str, /* subobj.DOMAINDN */ - s->path.domaindn_ldb, /* subobj.DOMAINDN_LDB */ - p->forest->config_dn_str, /* subobj.CONFIGDN */ - s->path.configdn_ldb, /* subobj.CONFIGDN_LDB */ - p->forest->schema_dn_str, /* subobj.SCHEMADN */ - s->path.schemadn_ldb, /* subobj.SCHEMADN_LDB */ - p->dest_dsa->netbios_name, /* subobj.HOSTNAME */ - torture_join_dom_dns_name(s->tj),/* subobj.REALM */ - torture_join_dom_netbios_name(s->tj),/* subobj.DOMAIN */ - p->dest_dsa->site_name, /* subobj.DEFAULTSITE */ - cli_credentials_get_password(s->machine_account),/* subobj.MACHINEPASS */ - s->path.samdb_ldb, /* paths.samdb */ - s->path.templates_ldb, /* paths.templates */ - s->path.secrets_ldb, /* paths.secrets */ - s->path.secrets_keytab, /* paths.keytab */ - s->path.dns_keytab); /* paths.dns_keytab */ - NT_STATUS_HAVE_NO_MEMORY(ejs); - - ret = test_run_ejs(ejs); - if (ret != 0) { - DEBUG(0,("Failed to run ejs script: %d:\n%s", - ret, ejs)); - talloc_free(ejs); - return NT_STATUS_FOOBAR; - } - talloc_free(ejs); - - talloc_free(s->ldb); - - DEBUG(0,("Open the SAM LDB with system credentials: %s\n", - s->path.samdb_ldb)); - - s->ldb = ldb_wrap_connect(s, s->tctx->lp_ctx, s->path.samdb_ldb, - system_session(s, s->tctx->lp_ctx), - NULL, 0, NULL); - if (!s->ldb) { - DEBUG(0,("Failed to open '%s'\n", - s->path.samdb_ldb)); - return NT_STATUS_INTERNAL_DB_ERROR; - } - - ok = samdb_set_ntds_invocation_id(s->ldb, &p->dest_dsa->invocation_id); - if (!ok) { - DEBUG(0,("Failed to set cached ntds invocationId\n")); - return NT_STATUS_FOOBAR; - } - ok = samdb_set_ntds_objectGUID(s->ldb, &p->dest_dsa->ntds_guid); - if (!ok) { - DEBUG(0,("Failed to set cached ntds objectGUID\n")); - return NT_STATUS_FOOBAR; - } - - return NT_STATUS_OK; -} - -#ifdef HAVE_WORKING_PYTHON -#include "param/param.h" -#include <Python.h> -#include "scripting/python/modules.h" - -static NTSTATUS test_become_dc_prepare_db_py(void *private_data, - const struct libnet_BecomeDC_PrepareDB *p) -{ - struct test_become_dc_state *s = talloc_get_type(private_data, struct test_become_dc_state); - bool ok; - PyObject *provision_fn, *result, *parameters; - - DEBUG(0,("Provision for Become-DC test using PYTHON\n")); - - py_load_samba_modules(); - Py_Initialize(); - - py_update_path("bin"); /* FIXME: Can't assume this always runs in source/... */ - - provision_fn = PyImport_Import(PyString_FromString("samba.provision.provision")); - - if (provision_fn == NULL) { - DEBUG(0, ("Unable to import provision Python module.\n")); - return NT_STATUS_UNSUCCESSFUL; - } - - DEBUG(0,("New Server[%s] in Site[%s]\n", - p->dest_dsa->dns_name, p->dest_dsa->site_name)); - - DEBUG(0,("DSA Instance [%s]\n" - "\tobjectGUID[%s]\n" - "\tinvocationId[%s]\n", - p->dest_dsa->ntds_dn_str, - GUID_string(s, &p->dest_dsa->ntds_guid), - GUID_string(s, &p->dest_dsa->invocation_id))); - - DEBUG(0,("Pathes under PRIVATEDIR[%s]\n" - "SAMDB[%s] SECRETS[%s] KEYTAB[%s]\n", - lp_private_dir(s->tctx->lp_ctx), - s->path.samdb_ldb, - s->path.secrets_ldb, - s->path.secrets_keytab)); - - DEBUG(0,("Schema Partition[%s => %s]\n", - p->forest->schema_dn_str, s->path.schemadn_ldb)); - - DEBUG(0,("Config Partition[%s => %s]\n", - p->forest->config_dn_str, s->path.configdn_ldb)); - - DEBUG(0,("Domain Partition[%s => %s]\n", - p->domain->dn_str, s->path.domaindn_ldb)); - - parameters = PyDict_New(); - - PyDict_SetItemString(parameters, "rootdn", PyString_FromString(p->forest->root_dn_str)); - PyDict_SetItemString(parameters, "domaindn", PyString_FromString(p->domain->dn_str)); - PyDict_SetItemString(parameters, "domaindn_ldb", PyString_FromString(s->path.domaindn_ldb)); - PyDict_SetItemString(parameters, "configdn", PyString_FromString(p->forest->config_dn_str)); - PyDict_SetItemString(parameters, "configdn_ldb", PyString_FromString(s->path.configdn_ldb)); - PyDict_SetItemString(parameters, "schema_dn_str", PyString_FromString(p->forest->schema_dn_str)); - PyDict_SetItemString(parameters, "schemadn_ldb", PyString_FromString(s->path.schemadn_ldb)); - PyDict_SetItemString(parameters, "netbios_name", PyString_FromString(p->dest_dsa->netbios_name)); - PyDict_SetItemString(parameters, "dnsname", PyString_FromString(p->dest_dsa->dns_name)); - PyDict_SetItemString(parameters, "defaultsite", PyString_FromString(p->dest_dsa->site_name)); - PyDict_SetItemString(parameters, "machinepass", PyString_FromString(cli_credentials_get_password(s->machine_account))); - PyDict_SetItemString(parameters, "samdb", PyString_FromString(s->path.samdb_ldb)); - PyDict_SetItemString(parameters, "secrets_ldb", PyString_FromString(s->path.secrets_ldb)); - PyDict_SetItemString(parameters, "secrets_keytab", PyString_FromString(s->path.secrets_keytab)); - - result = PyEval_CallObjectWithKeywords(provision_fn, NULL, parameters); - - Py_DECREF(parameters); - - if (result == NULL) { - PyErr_Print(); - PyErr_Clear(); - return NT_STATUS_UNSUCCESSFUL; - } - - talloc_free(s->ldb); - - DEBUG(0,("Open the SAM LDB with system credentials: %s\n", - s->path.samdb_ldb)); - - s->ldb = ldb_wrap_connect(s, s->tctx->lp_ctx, s->path.samdb_ldb, - system_session(s, s->tctx->lp_ctx), - NULL, 0, NULL); - if (!s->ldb) { - DEBUG(0,("Failed to open '%s'\n", - s->path.samdb_ldb)); - return NT_STATUS_INTERNAL_DB_ERROR; - } - - ok = samdb_set_ntds_invocation_id(s->ldb, &p->dest_dsa->invocation_id); - if (!ok) { - DEBUG(0,("Failed to set cached ntds invocationId\n")); - return NT_STATUS_FOOBAR; - } - ok = samdb_set_ntds_objectGUID(s->ldb, &p->dest_dsa->ntds_guid); - if (!ok) { - DEBUG(0,("Failed to set cached ntds objectGUID\n")); - return NT_STATUS_FOOBAR; - } - - return NT_STATUS_OK; -} -#endif /* HAVE_WORKING_PYTHON */ - static NTSTATUS test_apply_schema(struct test_become_dc_state *s, const struct libnet_BecomeDC_StoreChunk *c) { @@ -878,12 +616,7 @@ bool torture_net_become_dc(struct torture_context *torture) b.in.callbacks.private_data = s; b.in.callbacks.check_options = test_become_dc_check_options; - b.in.callbacks.prepare_db = test_become_dc_prepare_db_ejs; -#ifdef HAVE_WORKING_PYTHON - if (getenv("PROVISION_PYTHON")) { - b.in.callbacks.prepare_db = test_become_dc_prepare_db_py; - } -#endif + b.in.callbacks.prepare_db = test_become_dc_prepare_db; b.in.callbacks.schema_chunk = test_become_dc_schema_chunk; b.in.callbacks.config_chunk = test_become_dc_store_chunk; b.in.callbacks.domain_chunk = test_become_dc_store_chunk; diff --git a/source4/torture/local/torture.c b/source4/torture/local/torture.c index b57361bc8d..3273015347 100644 --- a/source4/torture/local/torture.c +++ b/source4/torture/local/torture.c @@ -39,12 +39,47 @@ static bool test_tempdir(struct torture_context *tctx) return true; } +static bool test_provision(struct torture_context *tctx) +{ + NTSTATUS status; + struct provision_settings settings; + + settings.dns_name = "example.com"; + settings.site_name = "SOME-SITE-NAME"; + settings.root_dn_str = "DC=EXAMPLE,DC=COM"; + settings.domain_dn_str = "DC=EXAMPLE,DC=COM"; + settings.config_dn_str = NULL; + settings.schema_dn_str = NULL; + settings.invocation_id = NULL; + settings.netbios_name = "FOO"; + settings.realm = "EXAMPLE.COM"; + settings.domain = "EXAMPLE"; + settings.ntds_guid = NULL; + settings.ntds_dn_str = NULL; + settings.machine_password = "geheim"; + settings.samdb_ldb = NULL; + settings.secrets_ldb = NULL; + settings.secrets_keytab = NULL; + settings.schemadn_ldb = NULL; + settings.configdn_ldb = NULL; + settings.domaindn_ldb = NULL; + settings.templates_ldb = NULL; + settings.dns_keytab = NULL; + + status = provision_bare(tctx, tctx->lp_ctx, &settings); + + torture_assert_ntstatus_ok(tctx, status, "provision"); + + return true; +} + struct torture_suite *torture_local_torture(TALLOC_CTX *mem_ctx) { struct torture_suite *suite = torture_suite_create(mem_ctx, "TORTURE"); torture_suite_add_simple_test(suite, "tempdir", test_tempdir); + torture_suite_add_simple_test(suite, "provision", test_provision); return suite; } diff --git a/source4/torture/locktest.c b/source4/torture/locktest.c index 90e2eec2be..618568acf9 100644 --- a/source4/torture/locktest.c +++ b/source4/torture/locktest.c @@ -18,6 +18,7 @@ */ #include "includes.h" +#include "lib/cmdline/popt_common.h" #include "system/filesys.h" #include "system/time.h" #include "pstring.h" @@ -29,15 +30,15 @@ #include "libcli/resolve/resolve.h" static int numops = 1000; -static bool showall; -static bool analyze; -static bool hide_unlock_fails; -static bool use_oplocks; +static int showall; +static int analyze; +static int hide_unlock_fails; +static int use_oplocks; static uint_t lock_range = 100; static uint_t lock_base = 0; static uint_t min_length = 0; -static bool exact_error_codes; -static bool zero_zero; +static int exact_error_codes; +static int zero_zero; #define FILENAME "\\locktest.dat" @@ -395,7 +396,7 @@ static int retest(struct smbcli_state *cli[NSERVERS][NCONNECTIONS], we then do random locking ops in tamdem on the 4 fnums from each server and ensure that the results match */ -static void test_locks(struct loadparm_context *lp_ctx, char *share[NSERVERS]) +static int test_locks(struct loadparm_context *lp_ctx, char *share[NSERVERS]) { struct smbcli_state *cli[NSERVERS][NCONNECTIONS]; int fnum[NSERVERS][NCONNECTIONS][NFILES]; @@ -450,7 +451,12 @@ static void test_locks(struct loadparm_context *lp_ctx, char *share[NSERVERS]) open_files(cli, fnum); n = retest(cli, fnum, numops); - if (n == numops || !analyze) return; + if (n == numops || !analyze) { + if (n != numops) { + return 1; + } + return 0; + } n++; skip = n/2; @@ -516,30 +522,16 @@ static void test_locks(struct loadparm_context *lp_ctx, char *share[NSERVERS]) (double)recorded[i].len, recorded[i].needed); } + + return 1; } -static void usage(void) +static void usage(poptContext pc) { - printf( -"Usage:\n\ - locktest //server1/share1 //server2/share2 [options..]\n\ - options:\n\ - -U user%%pass (may be specified twice)\n\ - -s seed\n\ - -o numops\n\ - -u hide unlock fails\n\ - -a (show all ops)\n\ - -A analyse for minimal ops\n\ - -O use oplocks\n\ - -E enable exact error code checking\n\ - -Z enable the zero/zero lock\n\ - -R range set lock range\n\ - -B base set lock base\n\ - -M min set min lock length\n\ - -l filename unclist file\n\ -"); + printf("Usage:\n\tlocktest //server1/share1 //server2/share2 [options..]\n"); + poptPrintUsage(pc, stdout, 0); } /**************************************************************************** @@ -552,97 +544,87 @@ static void usage(void) int seed, server; int username_count=0; struct loadparm_context *lp_ctx; + poptContext pc; + int argc_new, i; + char **argv_new; + enum {OPT_UNCLIST=1000}; + struct poptOption long_options[] = { + POPT_AUTOHELP + {"seed", 0, POPT_ARG_INT, &seed, 0, "Seed to use for randomizer", NULL}, + {"num-ops", 0, POPT_ARG_INT, &numops, 0, "num ops", NULL}, + {"lockrange", 0, POPT_ARG_INT, &lock_range,0, "locking range", NULL}, + {"lockbase", 0, POPT_ARG_INT, &lock_base, 0, "locking base", NULL}, + {"minlength", 0, POPT_ARG_INT, &min_length,0, "min lock length", NULL}, + {"hidefails", 0, POPT_ARG_NONE, &hide_unlock_fails,0,"hide unlock fails", NULL}, + {"oplocks", 0, POPT_ARG_NONE, &use_oplocks,0, "use oplocks", NULL}, + {"showall", 0, POPT_ARG_NONE, &showall, 0, "display all operations", NULL}, + {"analyse", 0, POPT_ARG_NONE, &analyze, 0, "do backtrack analysis", NULL}, + {"zerozero", 0, POPT_ARG_NONE, &zero_zero, 0, "do zero/zero lock", NULL}, + {"exacterrors", 0, POPT_ARG_NONE, &exact_error_codes,0,"use exact error codes", NULL}, + {"unclist", 0, POPT_ARG_STRING, NULL, OPT_UNCLIST, "unclist", NULL}, + { "user", 'U', POPT_ARG_STRING, NULL, 'U', "Set the network username", "[DOMAIN/]USERNAME[%PASSWORD]" }, + POPT_COMMON_SAMBA + POPT_COMMON_CONNECTION + POPT_COMMON_CREDENTIALS + POPT_COMMON_VERSION + { NULL } + }; setlinebuf(stdout); + seed = time(NULL); - setup_logging("locktest", DEBUG_STDOUT); - - if (argc < 3 || argv[1][0] == '-') { - usage(); - exit(1); - } - - setup_logging(argv[0], DEBUG_STDOUT); - - for (server=0;server<NSERVERS;server++) { - share[server] = argv[1+server]; - all_string_sub(share[server],"/","\\",0); - } - - argc -= NSERVERS; - argv += NSERVERS; + pc = poptGetContext("locktest", argc, (const char **) argv, long_options, + POPT_CONTEXT_KEEP_FIRST); - lp_ctx = loadparm_init(talloc_autofree_context()); - lp_load(lp_ctx, dyn_CONFIGFILE); + poptSetOtherOptionHelp(pc, "<unc1> <unc2>"); + lp_ctx = cmdline_lp_ctx; servers[0] = cli_credentials_init(talloc_autofree_context()); servers[1] = cli_credentials_init(talloc_autofree_context()); cli_credentials_guess(servers[0], lp_ctx); cli_credentials_guess(servers[1], lp_ctx); - seed = time(NULL); - - while ((opt = getopt(argc, argv, "U:s:ho:aAW:OR:B:M:EZW:l:")) != EOF) { + while((opt = poptGetNextOpt(pc)) != -1) { switch (opt) { + case OPT_UNCLIST: + lp_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc)); + break; case 'U': if (username_count == 2) { - usage(); + usage(pc); exit(1); } - cli_credentials_parse_string(servers[username_count], - optarg, CRED_SPECIFIED); + cli_credentials_parse_string(servers[username_count], poptGetOptArg(pc), CRED_SPECIFIED); username_count++; break; - case 'R': - lock_range = strtol(optarg, NULL, 0); - break; - case 'B': - lock_base = strtol(optarg, NULL, 0); - break; - case 'M': - min_length = strtol(optarg, NULL, 0); - break; - case 's': - seed = atoi(optarg); - break; - case 'u': - hide_unlock_fails = true; - break; - case 'o': - numops = atoi(optarg); - break; - case 'O': - use_oplocks = true; - break; - case 'a': - showall = true; - break; - case 'A': - analyze = true; - break; - case 'Z': - zero_zero = true; - break; - case 'E': - exact_error_codes = true; - break; - case 'l': - lp_set_cmdline(lp_ctx, "torture:unclist", optarg); - break; - case 'W': - lp_set_cmdline(lp_ctx, "workgroup", optarg); + } + } + + argv_new = discard_const_p(char *, poptGetArgs(pc)); + argc_new = argc; + for (i=0; i<argc; i++) { + if (argv_new[i] == NULL) { + argc_new = i; break; - case 'h': - usage(); - exit(1); - default: - printf("Unknown option %c (%d)\n", (char)opt, opt); - exit(1); } } + if (!(argc_new >= 3)) { + usage(pc); + exit(1); + } + + setup_logging("locktest", DEBUG_STDOUT); + + for (server=0;server<NSERVERS;server++) { + share[server] = argv_new[1+server]; + all_string_sub(share[server],"/","\\",0); + } + + lp_ctx = cmdline_lp_ctx; + if (username_count == 0) { - usage(); + usage(pc); return -1; } if (username_count == 1) { @@ -651,15 +633,10 @@ static void usage(void) gensec_init(lp_ctx); - argc -= optind; - argv += optind; - DEBUG(0,("seed=%u base=%d range=%d min_length=%d\n", seed, lock_base, lock_range, min_length)); srandom(seed); - test_locks(lp_ctx, share); - - return(0); + return test_locks(lp_ctx, share); } diff --git a/source4/torture/masktest.c b/source4/torture/masktest.c index d1b853de72..ac7029aa50 100644 --- a/source4/torture/masktest.c +++ b/source4/torture/masktest.c @@ -18,6 +18,7 @@ */ #include "includes.h" +#include "lib/cmdline/popt_common.h" #include "system/filesys.h" #include "system/dir.h" #include "libcli/libcli.h" @@ -30,12 +31,10 @@ #include "dynconfig.h" #include "libcli/resolve/resolve.h" -static struct cli_credentials *credentials; static bool showall = false; static bool old_list = false; static const char *maskchars = "<>\"?*abc."; static const char *filechars = "abcdefghijklm."; -static int verbose; static int die_on_error; static int NumLoops = 0; static int max_length = 20; @@ -87,13 +86,13 @@ static struct smbcli_state *connect_one(struct resolve_context *resolve_ctx, *share = 0; share++; - cli_credentials_set_workstation(credentials, "masktest", CRED_SPECIFIED); + cli_credentials_set_workstation(cmdline_credentials, "masktest", CRED_SPECIFIED); status = smbcli_full_connection(NULL, &c, server, ports, share, NULL, - credentials, resolve_ctx, NULL, + cmdline_credentials, resolve_ctx, NULL, options); if (!NT_STATUS_IS_OK(status)) { @@ -112,7 +111,7 @@ static bool f_info_hit; static void listfn(struct clilist_file_info *f, const char *s, void *state) { - struct masktest_state *m = talloc_get_type(state,struct masktest_state); + struct masktest_state *m = (struct masktest_state *)state; if (ISDOT(f->name)) { resultp[0] = '+'; @@ -128,7 +127,7 @@ static void listfn(struct clilist_file_info *f, const char *s, void *state) } static void get_real_name(TALLOC_CTX *mem_ctx, struct smbcli_state *cli, - char *long_name, fstring short_name) + char **long_name, fstring short_name) { const char *mask; struct masktest_state state; @@ -151,12 +150,12 @@ static void get_real_name(TALLOC_CTX *mem_ctx, struct smbcli_state *cli, if (f_info_hit) { fstrcpy(short_name, last_hit.short_name); strlower(short_name); - long_name = talloc_strdup(mem_ctx, last_hit.long_name); - strlower(long_name); + *long_name = talloc_strdup(mem_ctx, last_hit.long_name); + strlower(*long_name); } if (*short_name == '\0') { - fstrcpy(short_name, long_name); + fstrcpy(short_name, *long_name); } } @@ -168,7 +167,7 @@ static void testpair(TALLOC_CTX *mem_ctx, struct smbcli_state *cli, char *mask, char *res2; static int count; fstring short_name; - char *long_name; + char *long_name = NULL; struct masktest_state state; count++; @@ -186,7 +185,7 @@ static void testpair(TALLOC_CTX *mem_ctx, struct smbcli_state *cli, char *mask, resultp = res1; fstrcpy(short_name, ""); - get_real_name(mem_ctx, cli, long_name, short_name); + get_real_name(mem_ctx, cli, &long_name, short_name); fstrcpy(res1, "---"); smbcli_list_new(cli->tree, mask, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY, @@ -241,6 +240,8 @@ static void test_mask(int argc, char *argv[], l2 = 1 + random() % max_length; mask = talloc_strdup(mem_ctx, "\\masktest\\"); file = talloc_strdup(mem_ctx, "\\masktest\\"); + mask = talloc_realloc_size(mem_ctx, mask, strlen(mask)+l1+1); + file = talloc_realloc_size(mem_ctx, file, strlen(file)+l2+1); l = strlen(mask); for (i=0;i<l1;i++) { mask[i+l] = maskchars[random() % mc_len]; @@ -269,30 +270,16 @@ static void test_mask(int argc, char *argv[], } -static void usage(void) +static void usage(poptContext pc) { printf( "Usage:\n\ masktest //server/share [options..]\n\ - options:\n\ - -d debuglevel\n\ - -n numloops\n\ - -W workgroup\n\ - -U user%%pass\n\ - -s seed\n\ - -l max test length\n\ - -M max protocol\n\ - -f filechars (default %s)\n\ - -m maskchars (default %s)\n\ - -v verbose mode\n\ - -E die on error\n\ - -a show all tests\n\ \n\ This program tests wildcard matching between two servers. It generates\n\ random pairs of filenames/masks and tests that they match in the same\n\ - way on the servers and internally\n\ -", - filechars, maskchars); + way on the servers and internally\n"); + poptPrintUsage(pc, stdout, 0); } /**************************************************************************** @@ -306,85 +293,67 @@ static void usage(void) int seed; struct loadparm_context *lp_ctx; struct smbcli_options options; + poptContext pc; + int argc_new, i; + char **argv_new; + enum {OPT_UNCLIST=1000}; + struct poptOption long_options[] = { + POPT_AUTOHELP + {"seed", 0, POPT_ARG_INT, &seed, 0, "Seed to use for randomizer", NULL}, + {"num-ops", 0, POPT_ARG_INT, &NumLoops, 0, "num ops", NULL}, + {"maxlength", 0, POPT_ARG_INT, &max_length,0, "maximum length", NULL}, + {"dieonerror", 0, POPT_ARG_NONE, &die_on_error, 0, "die on errors", NULL}, + {"showall", 0, POPT_ARG_NONE, &showall, 0, "display all operations", NULL}, + {"oldlist", 0, POPT_ARG_NONE, &old_list, 0, "use old list call", NULL}, + {"maskchars", 0, POPT_ARG_STRING, &maskchars, 0,"mask characters", NULL}, + {"filechars", 0, POPT_ARG_STRING, &filechars, 0,"file characters", NULL}, + POPT_COMMON_SAMBA + POPT_COMMON_CONNECTION + POPT_COMMON_CREDENTIALS + POPT_COMMON_VERSION + { NULL } + }; setlinebuf(stdout); + seed = time(NULL); - setup_logging("masktest", DEBUG_STDOUT); + pc = poptGetContext("locktest", argc, (const char **) argv, long_options, + POPT_CONTEXT_KEEP_FIRST); - if (argc < 2 || argv[1][0] == '-') { - usage(); - exit(1); - } + poptSetOtherOptionHelp(pc, "<unc>"); - share = argv[1]; - - all_string_sub(share,"/","\\",0); + while((opt = poptGetNextOpt(pc)) != -1) { + switch (opt) { + case OPT_UNCLIST: + lp_set_cmdline(cmdline_lp_ctx, "torture:unclist", poptGetOptArg(pc)); + break; + } + } - setup_logging(argv[0], DEBUG_STDOUT); + argv_new = discard_const_p(char *, poptGetArgs(pc)); + argc_new = argc; + for (i=0; i<argc; i++) { + if (argv_new[i] == NULL) { + argc_new = i; + break; + } + } - argc -= 1; - argv += 1; + if (!(argc_new >= 2)) { + usage(pc); + exit(1); + } - lp_ctx = loadparm_init(talloc_autofree_context()); - lp_load(lp_ctx, dyn_CONFIGFILE); + setup_logging("masktest", DEBUG_STDOUT); - credentials = cli_credentials_init(talloc_autofree_context()); - cli_credentials_guess(credentials, lp_ctx); + share = argv_new[1]; - seed = time(NULL); + all_string_sub(share,"/","\\",0); - while ((opt = getopt(argc, argv, "n:d:U:s:hm:f:aoW:M:vEl:")) != EOF) { - switch (opt) { - case 'n': - NumLoops = atoi(optarg); - break; - case 'd': - DEBUGLEVEL = atoi(optarg); - break; - case 'E': - die_on_error = 1; - break; - case 'v': - verbose++; - break; - case 'M': - lp_set_cmdline(lp_ctx, "max protocol", optarg); - break; - case 'U': - cli_credentials_parse_string(credentials, optarg, CRED_SPECIFIED); - break; - case 's': - seed = atoi(optarg); - break; - case 'h': - usage(); - exit(1); - case 'm': - maskchars = optarg; - break; - case 'l': - max_length = atoi(optarg); - break; - case 'f': - filechars = optarg; - break; - case 'a': - showall = 1; - break; - case 'o': - old_list = true; - break; - default: - printf("Unknown option %c (%d)\n", (char)opt, opt); - exit(1); - } - } + lp_ctx = cmdline_lp_ctx; gensec_init(lp_ctx); - argc -= optind; - argv += optind; - lp_smbcli_options(lp_ctx, &options); cli = connect_one(lp_resolve_context(lp_ctx), share, @@ -398,7 +367,7 @@ static void usage(void) DEBUG(0,("seed=%d format --- --- (server, correct)\n", seed)); srandom(seed); - test_mask(argc, argv, cli); + test_mask(argc_new-1, argv_new+1, cli); return(0); } diff --git a/source4/torture/rpc/eventlog.c b/source4/torture/rpc/eventlog.c index 047146edaf..feeeb9330b 100644 --- a/source4/torture/rpc/eventlog.c +++ b/source4/torture/rpc/eventlog.c @@ -67,11 +67,14 @@ static bool test_GetNumRecords(struct torture_context *tctx, struct dcerpc_pipe struct eventlog_GetNumRecords r; struct eventlog_CloseEventLog cr; struct policy_handle handle; + uint32_t number = 0; if (!get_policy_handle(tctx, p, &handle)) return false; + ZERO_STRUCT(r); r.in.handle = &handle; + r.out.number = &number; torture_assert_ntstatus_ok(tctx, dcerpc_eventlog_GetNumRecords(p, tctx, &r), @@ -98,6 +101,7 @@ static bool test_ReadEventLog(struct torture_context *tctx, if (!get_policy_handle(tctx, p, &handle)) return false; + ZERO_STRUCT(r); r.in.offset = 0; r.in.handle = &handle; r.in.flags = EVENTLOG_BACKWARDS_READ|EVENTLOG_SEQUENTIAL_READ; @@ -107,11 +111,15 @@ static bool test_ReadEventLog(struct torture_context *tctx, struct eventlog_Record rec; struct ndr_pull *ndr; enum ndr_err_code ndr_err; + uint32_t sent_size = 0; + uint32_t real_size = 0; /* Read first for number of bytes in record */ r.in.number_of_bytes = 0; r.out.data = NULL; + r.out.sent_size = &sent_size; + r.out.real_size = &real_size; status = dcerpc_eventlog_ReadEventLogW(p, tctx, &r); @@ -119,8 +127,6 @@ static bool test_ReadEventLog(struct torture_context *tctx, break; } - torture_assert_ntstatus_ok(tctx, status, "ReadEventLog failed"); - torture_assert_ntstatus_equal(tctx, r.out.result, NT_STATUS_BUFFER_TOO_SMALL, "ReadEventLog failed"); diff --git a/source4/torture/rpc/initshutdown.c b/source4/torture/rpc/initshutdown.c index 9f6f1735ee..92fec5be0c 100644 --- a/source4/torture/rpc/initshutdown.c +++ b/source4/torture/rpc/initshutdown.c @@ -24,10 +24,9 @@ #include "librpc/gen_ndr/ndr_initshutdown_c.h" #include "torture/rpc/rpc.h" -static void init_initshutdown_String(TALLOC_CTX *mem_ctx, struct initshutdown_String *name, const char *s) +static void init_lsa_StringLarge(struct lsa_StringLarge *name, const char *s) { - name->name = talloc(mem_ctx, struct initshutdown_String_sub); - name->name->name = s; + name->string = s; } @@ -58,8 +57,8 @@ static bool test_Init(struct torture_context *tctx, uint16_t hostname = 0x0; r.in.hostname = &hostname; - r.in.message = talloc(tctx, struct initshutdown_String); - init_initshutdown_String(tctx, r.in.message, "spottyfood"); + r.in.message = talloc(tctx, struct lsa_StringLarge); + init_lsa_StringLarge(r.in.message, "spottyfood"); r.in.force_apps = 1; r.in.timeout = 30; r.in.reboot = 1; @@ -80,8 +79,8 @@ static bool test_InitEx(struct torture_context *tctx, uint16_t hostname = 0x0; r.in.hostname = &hostname; - r.in.message = talloc(tctx, struct initshutdown_String); - init_initshutdown_String(tctx, r.in.message, "spottyfood"); + r.in.message = talloc(tctx, struct lsa_StringLarge); + init_lsa_StringLarge(r.in.message, "spottyfood"); r.in.force_apps = 1; r.in.timeout = 30; r.in.reboot = 1; diff --git a/source4/torture/rpc/samba3rpc.c b/source4/torture/rpc/samba3rpc.c index b08cd05bdb..779a28e126 100644 --- a/source4/torture/rpc/samba3rpc.c +++ b/source4/torture/rpc/samba3rpc.c @@ -806,6 +806,7 @@ static bool join3(struct smbcli_state *cli, */ static bool auth2(struct smbcli_state *cli, + struct loadparm_context *lp_ctx, struct cli_credentials *wks_cred) { TALLOC_CTX *mem_ctx; @@ -829,7 +830,7 @@ static bool auth2(struct smbcli_state *cli, net_pipe = dcerpc_pipe_init(mem_ctx, cli->transport->socket->event.ctx, - lp_iconv_convenience(global_loadparm)); + lp_iconv_convenience(lp_ctx)); if (net_pipe == NULL) { d_printf("dcerpc_pipe_init failed\n"); goto done; @@ -1204,7 +1205,7 @@ bool torture_netlogon_samba3(struct torture_context *torture) int j; - if (!auth2(cli, wks_creds)) { + if (!auth2(cli, torture->lp_ctx, wks_creds)) { d_printf("auth2 failed\n"); goto done; } @@ -1283,7 +1284,7 @@ static bool test_join3(struct torture_context *tctx, cmdline_credentials, cli_credentials_get_domain(wks_creds), CRED_SPECIFIED); - if (!auth2(cli, wks_creds)) { + if (!auth2(cli, tctx->lp_ctx, wks_creds)) { d_printf("auth2 failed\n"); goto done; } @@ -1381,6 +1382,7 @@ bool torture_samba3_sessionkey(struct torture_context *torture) */ static NTSTATUS pipe_bind_smb(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, struct smbcli_tree *tree, const char *pipe_name, const struct ndr_interface_table *iface, @@ -1391,7 +1393,7 @@ static NTSTATUS pipe_bind_smb(TALLOC_CTX *mem_ctx, if (!(result = dcerpc_pipe_init( mem_ctx, tree->session->transport->socket->event.ctx, - lp_iconv_convenience(global_loadparm)))) { + lp_iconv_convenience(lp_ctx)))) { return NT_STATUS_NO_MEMORY; } @@ -1507,7 +1509,9 @@ static struct dom_sid *name2sid(TALLOC_CTX *mem_ctx, * Find out the user SID on this connection */ -static struct dom_sid *whoami(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree) +static struct dom_sid *whoami(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, + struct smbcli_tree *tree) { struct dcerpc_pipe *lsa; struct lsa_GetUserName r; @@ -1515,7 +1519,7 @@ static struct dom_sid *whoami(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree) struct lsa_StringPointer authority_name_p; struct dom_sid *result; - status = pipe_bind_smb(mem_ctx, tree, "\\pipe\\lsarpc", + status = pipe_bind_smb(mem_ctx, lp_ctx, tree, "\\pipe\\lsarpc", &ndr_table_lsarpc, &lsa); if (!NT_STATUS_IS_OK(status)) { d_printf("(%s) Could not bind to LSA: %s\n", @@ -1631,7 +1635,7 @@ bool torture_samba3_rpc_getusername(struct torture_context *torture) goto done; } - if (!(user_sid = whoami(mem_ctx, cli->tree))) { + if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, cli->tree))) { d_printf("(%s) whoami on auth'ed connection failed\n", __location__); ret = false; @@ -1658,7 +1662,7 @@ bool torture_samba3_rpc_getusername(struct torture_context *torture) goto done; } - if (!(user_sid = whoami(mem_ctx, cli->tree))) { + if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, cli->tree))) { d_printf("(%s) whoami on anon connection failed\n", __location__); ret = false; @@ -1732,7 +1736,7 @@ bool torture_samba3_rpc_getusername(struct torture_context *torture) goto done; } - if (!(user_sid = whoami(mem_ctx, tree))) { + if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, tree))) { d_printf("(%s) whoami on user connection failed\n", __location__); ret = false; @@ -1870,8 +1874,8 @@ bool torture_samba3_rpc_srvsvc(struct torture_context *torture) return false; } - status = pipe_bind_smb(mem_ctx, cli->tree, "\\pipe\\srvsvc", - &ndr_table_srvsvc, &p); + status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, + "\\pipe\\srvsvc", &ndr_table_srvsvc, &p); if (!NT_STATUS_IS_OK(status)) { d_printf("(%s) could not bind to srvsvc pipe: %s\n", __location__, nt_errstr(status)); @@ -2007,6 +2011,7 @@ bool torture_samba3_rpc_randomauth2(struct torture_context *torture) } static struct security_descriptor *get_sharesec(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, struct smbcli_session *sess, const char *sharename) { @@ -2028,7 +2033,7 @@ static struct security_descriptor *get_sharesec(TALLOC_CTX *mem_ctx, return NULL; } - status = pipe_bind_smb(mem_ctx, tree, "\\pipe\\srvsvc", + status = pipe_bind_smb(mem_ctx, lp_ctx, tree, "\\pipe\\srvsvc", &ndr_table_srvsvc, &p); if (!NT_STATUS_IS_OK(status)) { d_printf("(%s) could not bind to srvsvc pipe: %s\n", @@ -2060,6 +2065,7 @@ static struct security_descriptor *get_sharesec(TALLOC_CTX *mem_ctx, } static NTSTATUS set_sharesec(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, struct smbcli_session *sess, const char *sharename, struct security_descriptor *sd) @@ -2083,7 +2089,7 @@ static NTSTATUS set_sharesec(TALLOC_CTX *mem_ctx, return NT_STATUS_UNSUCCESSFUL; } - status = pipe_bind_smb(mem_ctx, tree, "\\pipe\\srvsvc", + status = pipe_bind_smb(mem_ctx, lp_ctx, tree, "\\pipe\\srvsvc", &ndr_table_srvsvc, &p); if (!NT_STATUS_IS_OK(status)) { d_printf("(%s) could not bind to srvsvc pipe: %s\n", @@ -2115,6 +2121,7 @@ static NTSTATUS set_sharesec(TALLOC_CTX *mem_ctx, } bool try_tcon(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, struct security_descriptor *orig_sd, struct smbcli_session *session, const char *sharename, const struct dom_sid *user_sid, @@ -2162,7 +2169,7 @@ bool try_tcon(TALLOC_CTX *mem_ctx, return false; } - status = set_sharesec(mem_ctx, session, sharename, sd); + status = set_sharesec(mem_ctx, lp_ctx, session, sharename, sd); if (!NT_STATUS_IS_OK(status)) { d_printf("custom set_sharesec failed: %s\n", nt_errstr(status)); @@ -2193,7 +2200,7 @@ bool try_tcon(TALLOC_CTX *mem_ctx, done: smbcli_rmdir(rmdir_tree, "sharesec_testdir"); - status = set_sharesec(mem_ctx, session, sharename, orig_sd); + status = set_sharesec(mem_ctx, lp_ctx, session, sharename, orig_sd); if (!NT_STATUS_IS_OK(status)) { d_printf("custom set_sharesec failed: %s\n", nt_errstr(status)); @@ -2225,25 +2232,25 @@ bool torture_samba3_rpc_sharesec(struct torture_context *torture) return false; } - if (!(user_sid = whoami(mem_ctx, cli->tree))) { + if (!(user_sid = whoami(mem_ctx, torture->lp_ctx, cli->tree))) { d_printf("whoami failed\n"); talloc_free(mem_ctx); return false; } - sd = get_sharesec(mem_ctx, cli->session, torture_setting_string(torture, - "share", NULL)); + sd = get_sharesec(mem_ctx, torture->lp_ctx, cli->session, + torture_setting_string(torture, "share", NULL)); - ret &= try_tcon(mem_ctx, sd, cli->session, + ret &= try_tcon(mem_ctx, torture->lp_ctx, sd, cli->session, torture_setting_string(torture, "share", NULL), user_sid, 0, NT_STATUS_ACCESS_DENIED, NT_STATUS_OK); - ret &= try_tcon(mem_ctx, sd, cli->session, + ret &= try_tcon(mem_ctx, torture->lp_ctx, sd, cli->session, torture_setting_string(torture, "share", NULL), user_sid, SEC_FILE_READ_DATA, NT_STATUS_OK, NT_STATUS_MEDIA_WRITE_PROTECTED); - ret &= try_tcon(mem_ctx, sd, cli->session, + ret &= try_tcon(mem_ctx, torture->lp_ctx, sd, cli->session, torture_setting_string(torture, "share", NULL), user_sid, SEC_FILE_ALL, NT_STATUS_OK, NT_STATUS_OK); @@ -2273,7 +2280,7 @@ bool torture_samba3_rpc_lsa(struct torture_context *torture) return false; } - status = pipe_bind_smb(mem_ctx, cli->tree, "\\lsarpc", + status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, "\\lsarpc", &ndr_table_lsarpc, &p); if (!NT_STATUS_IS_OK(status)) { d_printf("(%s) pipe_bind_smb failed: %s\n", __location__, @@ -2356,7 +2363,8 @@ static NTSTATUS get_servername(TALLOC_CTX *mem_ctx, struct smbcli_tree *tree, } -static NTSTATUS find_printers(TALLOC_CTX *ctx, struct smbcli_tree *tree, +static NTSTATUS find_printers(TALLOC_CTX *ctx, struct loadparm_context *lp_ctx, + struct smbcli_tree *tree, const char ***printers, int *num_printers) { TALLOC_CTX *mem_ctx; @@ -2372,7 +2380,8 @@ static NTSTATUS find_printers(TALLOC_CTX *ctx, struct smbcli_tree *tree, return NT_STATUS_NO_MEMORY; } - status = pipe_bind_smb(mem_ctx, tree, "\\srvsvc", &ndr_table_srvsvc, + status = pipe_bind_smb(mem_ctx, lp_ctx, + tree, "\\srvsvc", &ndr_table_srvsvc, &p); if (!NT_STATUS_IS_OK(status)) { d_printf("could not bind to srvsvc pipe\n"); @@ -2560,7 +2569,7 @@ bool torture_samba3_rpc_spoolss(struct torture_context *torture) return false; } - if (!NT_STATUS_IS_OK(find_printers(mem_ctx, cli->tree, + if (!NT_STATUS_IS_OK(find_printers(mem_ctx, torture->lp_ctx, cli->tree, &printers, &num_printers))) { talloc_free(mem_ctx); return false; @@ -2572,7 +2581,7 @@ bool torture_samba3_rpc_spoolss(struct torture_context *torture) return true; } - status = pipe_bind_smb(mem_ctx, cli->tree, "\\spoolss", + status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, "\\spoolss", &ndr_table_spoolss, &p); if (!NT_STATUS_IS_OK(status)) { d_printf("(%s) pipe_bind_smb failed: %s\n", __location__, @@ -2746,7 +2755,7 @@ bool torture_samba3_rpc_wkssvc(struct torture_context *torture) return false; } - status = pipe_bind_smb(mem_ctx, cli->tree, "\\wkssvc", + status = pipe_bind_smb(mem_ctx, torture->lp_ctx, cli->tree, "\\wkssvc", &ndr_table_wkssvc, &p); if (!NT_STATUS_IS_OK(status)) { d_printf("(%s) pipe_bind_smb failed: %s\n", __location__, @@ -2995,6 +3004,7 @@ bool torture_samba3_rpc_winreg(struct torture_context *torture) } static NTSTATUS get_shareinfo(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, struct smbcli_state *cli, const char *share, struct srvsvc_NetShareInfo502 **info) @@ -3006,7 +3016,7 @@ static NTSTATUS get_shareinfo(TALLOC_CTX *mem_ctx, if (!(p = dcerpc_pipe_init(cli, cli->transport->socket->event.ctx, - lp_iconv_convenience(global_loadparm)))) { + lp_iconv_convenience(lp_ctx)))) { status = NT_STATUS_NO_MEMORY; goto fail; } @@ -3176,7 +3186,8 @@ static NTSTATUS torture_samba3_createshare(struct smbcli_state *cli, return status; } -static NTSTATUS torture_samba3_deleteshare(struct smbcli_state *cli, +static NTSTATUS torture_samba3_deleteshare(struct torture_context *torture, + struct smbcli_state *cli, const char *sharename) { struct dcerpc_pipe *p; @@ -3301,7 +3312,7 @@ bool torture_samba3_regconfig(struct torture_context *torture) goto done; } - status = get_shareinfo(torture, cli, "blubber", &i); + status = get_shareinfo(torture, torture->lp_ctx, cli, "blubber", &i); if (!NT_STATUS_IS_OK(status)) { torture_warning(torture, "get_shareinfo failed: " "%s\n", nt_errstr(status)); @@ -3314,7 +3325,7 @@ bool torture_samba3_regconfig(struct torture_context *torture) goto done; } - status = torture_samba3_deleteshare(cli, "blubber"); + status = torture_samba3_deleteshare(torture, cli, "blubber"); if (!NT_STATUS_IS_OK(status)) { torture_warning(torture, "torture_samba3_deleteshare failed: " "%s\n", nt_errstr(status)); diff --git a/source4/torture/rpc/samsync.c b/source4/torture/rpc/samsync.c index 1f7f9f463e..865ebf9fd2 100644 --- a/source4/torture/rpc/samsync.c +++ b/source4/torture/rpc/samsync.c @@ -398,7 +398,7 @@ static bool samsync_handle_policy(TALLOC_CTX *mem_ctx, struct samsync_state *sam return true; } -static bool samsync_handle_user(TALLOC_CTX *mem_ctx, struct samsync_state *samsync_state, +static bool samsync_handle_user(struct torture_context *tctx, TALLOC_CTX *mem_ctx, struct samsync_state *samsync_state, int database_id, struct netr_DELTA_ENUM *delta) { uint32_t rid = delta->delta_id_union.rid; @@ -548,7 +548,7 @@ static bool samsync_handle_user(TALLOC_CTX *mem_ctx, struct samsync_state *samsy data.data = user->user_private_info.SensitiveData; data.length = user->user_private_info.DataLength; creds_arcfour_crypt(samsync_state->creds, data.data, data.length); - ndr_err = ndr_pull_struct_blob(&data, mem_ctx, lp_iconv_convenience(global_loadparm), &keys, (ndr_pull_flags_fn_t)ndr_pull_netr_USER_KEYS); + ndr_err = ndr_pull_struct_blob(&data, mem_ctx, lp_iconv_convenience(tctx->lp_ctx), &keys, (ndr_pull_flags_fn_t)ndr_pull_netr_USER_KEYS); if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { if (keys.keys.keys2.lmpassword.length == 16) { sam_rid_crypt(rid, keys.keys.keys2.lmpassword.pwd.hash, lm_hash.hash, 0); @@ -1101,8 +1101,9 @@ static bool samsync_handle_account(TALLOC_CTX *mem_ctx, struct samsync_state *sa /* try a netlogon DatabaseSync */ -static bool test_DatabaseSync(struct samsync_state *samsync_state, - TALLOC_CTX *mem_ctx) +static bool test_DatabaseSync(struct torture_context *tctx, + struct samsync_state *samsync_state, + TALLOC_CTX *mem_ctx) { NTSTATUS status; TALLOC_CTX *loop_ctx, *delta_ctx, *trustdom_ctx; @@ -1162,7 +1163,7 @@ static bool test_DatabaseSync(struct samsync_state *samsync_state, } break; case NETR_DELTA_USER: - if (!samsync_handle_user(delta_ctx, samsync_state, + if (!samsync_handle_user(tctx, delta_ctx, samsync_state, r.in.database_id, &r.out.delta_enum_array->delta_enum[d])) { printf("Failed to handle DELTA_USER\n"); ret = false; @@ -1611,7 +1612,7 @@ bool torture_rpc_samsync(struct torture_context *torture) ret = false; } - if (!test_DatabaseSync(samsync_state, mem_ctx)) { + if (!test_DatabaseSync(torture, samsync_state, mem_ctx)) { printf("DatabaseSync failed\n"); ret = false; } diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c index 23b4aad30b..4a6ff480c4 100644 --- a/source4/torture/rpc/spoolss.c +++ b/source4/torture/rpc/spoolss.c @@ -1178,16 +1178,23 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip NTSTATUS status; struct spoolss_EnumPrinterData r; + ZERO_STRUCT(r); r.in.handle = handle; r.in.enum_index = 0; do { - uint32_t data_size; - - r.in.value_offered = 0; - data_size = 0; - r.in.data_size = &data_size; - r.out.data_size = &data_size; + uint32_t value_size = 0; + uint32_t data_size = 0; + uint32_t printerdata_type = 0; + DATA_BLOB data = data_blob(NULL,0); + + r.in.value_offered = value_size; + r.out.value_needed = &value_size; + r.in.data_offered = data_size; + r.out.data_needed = &data_size; + + r.out.printerdata_type = &printerdata_type; + r.out.buffer = &data; torture_comment(tctx, "Testing EnumPrinterData\n"); @@ -1195,7 +1202,8 @@ static bool test_EnumPrinterData(struct torture_context *tctx, struct dcerpc_pip torture_assert_ntstatus_ok(tctx, status, "EnumPrinterData failed"); - r.in.value_offered = r.out.value_needed; + r.in.value_offered = value_size; + r.in.data_offered = data_size; status = dcerpc_spoolss_EnumPrinterData(p, tctx, &r); diff --git a/source4/torture/rpc/winreg.c b/source4/torture/rpc/winreg.c index d77295605f..4695733671 100644 --- a/source4/torture/rpc/winreg.c +++ b/source4/torture/rpc/winreg.c @@ -38,12 +38,9 @@ #define TEST_SID "S-1-5-21-1234567890-1234567890-1234567890-500" -static void init_initshutdown_String(TALLOC_CTX *mem_ctx, - struct initshutdown_String *name, - const char *s) +static void init_lsa_StringLarge(struct lsa_StringLarge *name, const char *s) { - name->name = talloc(mem_ctx, struct initshutdown_String_sub); - name->name->name = s; + name->string = s; } static void init_winreg_String(struct winreg_String *name, const char *s) @@ -1636,8 +1633,8 @@ static bool test_InitiateSystemShutdown(struct torture_context *tctx, uint16_t hostname = 0x0; r.in.hostname = &hostname; - r.in.message = talloc(tctx, struct initshutdown_String); - init_initshutdown_String(tctx, r.in.message, "spottyfood"); + r.in.message = talloc(tctx, struct lsa_StringLarge); + init_lsa_StringLarge(r.in.message, "spottyfood"); r.in.force_apps = 1; r.in.timeout = 30; r.in.reboot = 1; @@ -1660,8 +1657,8 @@ static bool test_InitiateSystemShutdownEx(struct torture_context *tctx, uint16_t hostname = 0x0; r.in.hostname = &hostname; - r.in.message = talloc(tctx, struct initshutdown_String); - init_initshutdown_String(tctx, r.in.message, "spottyfood"); + r.in.message = talloc(tctx, struct lsa_StringLarge); + init_lsa_StringLarge(r.in.message, "spottyfood"); r.in.force_apps = 1; r.in.timeout = 30; r.in.reboot = 1; diff --git a/source4/torture/smb2/connect.c b/source4/torture/smb2/connect.c index f1bc63dbbb..0004ea958e 100644 --- a/source4/torture/smb2/connect.c +++ b/source4/torture/smb2/connect.c @@ -147,10 +147,10 @@ static struct smb2_handle torture_smb2_create(struct smb2_tree *tree, TALLOC_CTX *tmp_ctx = talloc_new(tree); ZERO_STRUCT(io); - io.in.oplock_flags = 0; - io.in.access_mask = SEC_RIGHTS_FILE_ALL; - io.in.file_attr = FILE_ATTRIBUTE_NORMAL; - io.in.open_disposition = NTCREATEX_DISP_OPEN_IF; + io.in.oplock_level = 0; + io.in.desired_access = SEC_RIGHTS_FILE_ALL; + io.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + io.in.create_disposition = NTCREATEX_DISP_OPEN_IF; io.in.share_access = NTCREATEX_SHARE_ACCESS_DELETE| NTCREATEX_SHARE_ACCESS_READ| @@ -166,7 +166,7 @@ static struct smb2_handle torture_smb2_create(struct smb2_tree *tree, if (DEBUGLVL(1)) { printf("Open gave:\n"); - printf("oplock_flags = 0x%x\n", io.out.oplock_flags); + printf("oplock_flags = 0x%x\n", io.out.oplock_level); printf("create_action = 0x%x\n", io.out.create_action); printf("create_time = %s\n", nt_time_string(tmp_ctx, io.out.create_time)); printf("access_time = %s\n", nt_time_string(tmp_ctx, io.out.access_time)); diff --git a/source4/torture/smb2/getinfo.c b/source4/torture/smb2/getinfo.c index f561b62d47..c47a26277c 100644 --- a/source4/torture/smb2/getinfo.c +++ b/source4/torture/smb2/getinfo.c @@ -51,7 +51,9 @@ static struct { { LEVEL(RAW_FILEINFO_COMPRESSION_INFORMATION) }, { LEVEL(RAW_FILEINFO_NETWORK_OPEN_INFORMATION) }, { LEVEL(RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION) }, - { LEVEL(RAW_FILEINFO_SMB2_ALL_EAS) }, +/* +disabled until we know how the alignment now works +{ LEVEL(RAW_FILEINFO_SMB2_ALL_EAS) }, */ { LEVEL(RAW_FILEINFO_SMB2_ALL_INFORMATION) }, { LEVEL(RAW_FILEINFO_SEC_DESC) } }; @@ -85,13 +87,13 @@ static bool torture_smb2_fileinfo(struct torture_context *tctx, struct smb2_tree status = torture_smb2_testfile(tree, FNAME, &hfile); if (!NT_STATUS_IS_OK(status)) { - printf("Unable to create test file '%s' - %s\n", FNAME, nt_errstr(status)); + printf(__location__ " Unable to create test file '%s' - %s\n", FNAME, nt_errstr(status)); goto failed; } status = torture_smb2_testdir(tree, DNAME, &hdir); if (!NT_STATUS_IS_OK(status)) { - printf("Unable to create test directory '%s' - %s\n", DNAME, nt_errstr(status)); + printf(__location__ " Unable to create test directory '%s' - %s\n", DNAME, nt_errstr(status)); goto failed; } @@ -150,7 +152,7 @@ static bool torture_smb2_fsinfo(struct smb2_tree *tree) printf("Testing fsinfo levels\n"); status = smb2_util_roothandle(tree, &handle); if (!NT_STATUS_IS_OK(status)) { - printf("Unable to create test directory '%s' - %s\n", DNAME, nt_errstr(status)); + printf(__location__ " Unable to create root handle - %s\n", nt_errstr(status)); return false; } diff --git a/source4/torture/smb2/lock.c b/source4/torture/smb2/lock.c index 98e412817b..3cf2e93ee0 100644 --- a/source4/torture/smb2/lock.c +++ b/source4/torture/smb2/lock.c @@ -238,10 +238,10 @@ static bool test_lock_read_write(struct torture_context *torture, CHECK_VALUE(lck.out.unknown1, 0); ZERO_STRUCT(cr); - cr.in.oplock_flags = 0; - cr.in.access_mask = SEC_RIGHTS_FILE_ALL; - cr.in.file_attr = FILE_ATTRIBUTE_NORMAL; - cr.in.open_disposition = NTCREATEX_DISP_OPEN_IF; + cr.in.oplock_level = 0; + cr.in.desired_access = SEC_RIGHTS_FILE_ALL; + cr.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + cr.in.create_disposition = NTCREATEX_DISP_OPEN_IF; cr.in.share_access = NTCREATEX_SHARE_ACCESS_DELETE| NTCREATEX_SHARE_ACCESS_READ| diff --git a/source4/torture/smb2/scan.c b/source4/torture/smb2/scan.c index 84be11c047..0f4c9fefdf 100644 --- a/source4/torture/smb2/scan.c +++ b/source4/torture/smb2/scan.c @@ -68,19 +68,21 @@ bool torture_smb2_getinfo_scan(struct torture_context *torture) ZERO_STRUCT(io); - io.in.max_response_size = 0xFFFF; + io.in.output_buffer_length = 0xFFFF; for (c=1;c<5;c++) { for (i=0;i<0x100;i++) { - io.in.level = (i<<8) | c; + io.in.info_type = c; + io.in.info_class = i; io.in.file.handle = fhandle; status = smb2_getinfo(tree, torture, &io); if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS) && !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER) && !NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) { - printf("file level 0x%04x is %ld bytes - %s\n", - io.in.level, (long)io.out.blob.length, nt_errstr(status)); + printf("file level 0x%02x:%02x is %ld bytes - %s\n", + io.in.info_type, io.in.info_class, + (long)io.out.blob.length, nt_errstr(status)); dump_data(1, io.out.blob.data, io.out.blob.length); } @@ -89,8 +91,9 @@ bool torture_smb2_getinfo_scan(struct torture_context *torture) if (!NT_STATUS_EQUAL(status, NT_STATUS_INVALID_INFO_CLASS) && !NT_STATUS_EQUAL(status, NT_STATUS_INVALID_PARAMETER) && !NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) { - printf("dir level 0x%04x is %ld bytes - %s\n", - io.in.level, (long)io.out.blob.length, nt_errstr(status)); + printf("dir level 0x%02x:%02x is %ld bytes - %s\n", + io.in.info_type, io.in.info_class, + (long)io.out.blob.length, nt_errstr(status)); dump_data(1, io.out.blob.data, io.out.blob.length); } } diff --git a/source4/torture/smb2/util.c b/source4/torture/smb2/util.c index fe88296a32..f85b1c42ff 100644 --- a/source4/torture/smb2/util.c +++ b/source4/torture/smb2/util.c @@ -55,9 +55,9 @@ NTSTATUS smb2_util_unlink(struct smb2_tree *tree, const char *fname) NTSTATUS status; ZERO_STRUCT(io); - io.in.access_mask = SEC_RIGHTS_FILE_ALL; - io.in.file_attr = FILE_ATTRIBUTE_NORMAL; - io.in.open_disposition = NTCREATEX_DISP_OPEN; + io.in.desired_access = SEC_RIGHTS_FILE_ALL; + io.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + io.in.create_disposition = NTCREATEX_DISP_OPEN; io.in.share_access = NTCREATEX_SHARE_ACCESS_DELETE| NTCREATEX_SHARE_ACCESS_READ| @@ -107,9 +107,9 @@ static NTSTATUS smb2_create_complex(struct smb2_tree *tree, const char *fname, smb2_util_unlink(tree, fname); ZERO_STRUCT(io); - io.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; - io.in.file_attr = FILE_ATTRIBUTE_NORMAL; - io.in.open_disposition = NTCREATEX_DISP_OVERWRITE_IF; + io.in.desired_access = SEC_FLAG_MAXIMUM_ALLOWED; + io.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + io.in.create_disposition = NTCREATEX_DISP_OVERWRITE_IF; io.in.share_access = NTCREATEX_SHARE_ACCESS_DELETE| NTCREATEX_SHARE_ACCESS_READ| @@ -119,10 +119,11 @@ static NTSTATUS smb2_create_complex(struct smb2_tree *tree, const char *fname, if (dir) { io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY; io.in.share_access &= ~NTCREATEX_SHARE_ACCESS_DELETE; - io.in.file_attr = FILE_ATTRIBUTE_DIRECTORY; - io.in.open_disposition = NTCREATEX_DISP_CREATE; + io.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY; + io.in.create_disposition = NTCREATEX_DISP_CREATE; } + /* it seems vista is now fussier about alignment? */ if (strchr(fname, ':') == NULL) { /* setup some EAs */ io.in.eas.num_eas = 2; @@ -334,10 +335,10 @@ NTSTATUS torture_smb2_testfile(struct smb2_tree *tree, const char *fname, NTSTATUS status; ZERO_STRUCT(io); - io.in.oplock_flags = 0; - io.in.access_mask = SEC_RIGHTS_FILE_ALL; - io.in.file_attr = FILE_ATTRIBUTE_NORMAL; - io.in.open_disposition = NTCREATEX_DISP_OPEN_IF; + io.in.oplock_level = 0; + io.in.desired_access = SEC_RIGHTS_FILE_ALL; + io.in.file_attributes = FILE_ATTRIBUTE_NORMAL; + io.in.create_disposition = NTCREATEX_DISP_OPEN_IF; io.in.share_access = NTCREATEX_SHARE_ACCESS_DELETE| NTCREATEX_SHARE_ACCESS_READ| @@ -370,10 +371,10 @@ NTSTATUS torture_smb2_testdir(struct smb2_tree *tree, const char *fname, NTSTATUS status; ZERO_STRUCT(io); - io.in.oplock_flags = 0; - io.in.access_mask = SEC_RIGHTS_DIR_ALL; - io.in.file_attr = FILE_ATTRIBUTE_DIRECTORY; - io.in.open_disposition = NTCREATEX_DISP_OPEN_IF; + io.in.oplock_level = 0; + io.in.desired_access = SEC_RIGHTS_DIR_ALL; + io.in.file_attributes = FILE_ATTRIBUTE_DIRECTORY; + io.in.create_disposition = NTCREATEX_DISP_OPEN_IF; io.in.share_access = NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_WRITE|NTCREATEX_SHARE_ACCESS_DELETE; io.in.create_options = NTCREATEX_OPTIONS_DIRECTORY; io.in.fname = fname; @@ -422,13 +423,13 @@ NTSTATUS smb2_util_roothandle(struct smb2_tree *tree, struct smb2_handle *handle NTSTATUS status; ZERO_STRUCT(io); - io.in.oplock_flags = 0; - io.in.access_mask = SEC_STD_SYNCHRONIZE | SEC_DIR_READ_ATTRIBUTE | SEC_DIR_LIST; - io.in.file_attr = 0; - io.in.open_disposition = NTCREATEX_DISP_OPEN; + io.in.oplock_level = 0; + io.in.desired_access = SEC_STD_SYNCHRONIZE | SEC_DIR_READ_ATTRIBUTE | SEC_DIR_LIST; + io.in.file_attributes = 0; + io.in.create_disposition = NTCREATEX_DISP_OPEN; io.in.share_access = NTCREATEX_SHARE_ACCESS_READ|NTCREATEX_SHARE_ACCESS_DELETE; io.in.create_options = NTCREATEX_OPTIONS_ASYNC_ALERT; - io.in.fname = ""; + io.in.fname = NULL; status = smb2_create(tree, tree, &io); NT_STATUS_NOT_OK_RETURN(status); diff --git a/source4/torture/smbtorture.c b/source4/torture/smbtorture.c index 371ddc7297..4eeea73003 100644 --- a/source4/torture/smbtorture.c +++ b/source4/torture/smbtorture.c @@ -615,8 +615,6 @@ int main(int argc,char *argv[]) alarm(max_runtime); } - ldb_global_init(); - if (extra_module != NULL) { init_module_fn fn = load_module(talloc_autofree_context(), poptGetOptArg(pc)); diff --git a/source4/torture/util.c b/source4/torture/util.c deleted file mode 100644 index 0e9dda42fa..0000000000 --- a/source4/torture/util.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - Unix SMB/CIFS implementation. - SMB torture tester utility functions - Copyright (C) Jelmer Vernooij 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 3 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, see <http://www.gnu.org/licenses/>. -*/ - -#include "includes.h" -#include "system/filesys.h" -#include "system/wait.h" -#include "torture/torture.h" -#include "libcli/raw/interfaces.h" -#include "libcli/raw/libcliraw.h" - -/** - check if 2 NTTIMEs are equal. -*/ -bool nt_time_equal(NTTIME *t1, NTTIME *t2) -{ - return *t1 == *t2; -} - -NTSTATUS torture_second_tcon(TALLOC_CTX *mem_ctx, - struct smbcli_session *session, - const char *sharename, - struct smbcli_tree **res) -{ - union smb_tcon tcon; - struct smbcli_tree *result; - TALLOC_CTX *tmp_ctx; - NTSTATUS status; - - if ((tmp_ctx = talloc_new(mem_ctx)) == NULL) { - return NT_STATUS_NO_MEMORY; - } - - result = smbcli_tree_init(session, tmp_ctx, false); - if (result == NULL) { - talloc_free(tmp_ctx); - return NT_STATUS_NO_MEMORY; - } - - tcon.generic.level = RAW_TCON_TCONX; - tcon.tconx.in.flags = 0; - - /* Ignore share mode security here */ - tcon.tconx.in.password = data_blob(NULL, 0); - tcon.tconx.in.path = sharename; - tcon.tconx.in.device = "?????"; - - status = smb_raw_tcon(result, tmp_ctx, &tcon); - if (!NT_STATUS_IS_OK(status)) { - talloc_free(tmp_ctx); - return status; - } - - result->tid = tcon.tconx.out.tid; - *res = talloc_steal(mem_ctx, result); - talloc_free(tmp_ctx); - return NT_STATUS_OK; -} diff --git a/source4/torture/util.h b/source4/torture/util.h new file mode 100644 index 0000000000..c5219a5aaa --- /dev/null +++ b/source4/torture/util.h @@ -0,0 +1,120 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 + + 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 3 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, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _TORTURE_PROVISION_H_ +#define _TORTURE_PROVISION_H_ + +struct provision_settings { + const char *dns_name; + const char *site_name; + const char *root_dn_str; + const char *domain_dn_str; + const char *config_dn_str; + const char *schema_dn_str; + const struct GUID *invocation_id; + const char *netbios_name; + const char *realm; + const char *domain; + const struct GUID *ntds_guid; + const char *ntds_dn_str; + const char *machine_password; + const char *samdb_ldb; + const char *secrets_ldb; + const char *secrets_keytab; + const char *schemadn_ldb; + const char *configdn_ldb; + const char *domaindn_ldb; + const char *templates_ldb; + const char *dns_keytab; +}; + +NTSTATUS provision_bare(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx, + struct provision_settings *settings); + + +/** + setup a directory ready for a test +*/ +_PUBLIC_ bool torture_setup_dir(struct smbcli_state *cli, const char *dname); +NTSTATUS create_directory_handle(struct smbcli_tree *tree, const char *dname, int *fnum); + +/** + sometimes we need a fairly complex file to work with, so we can test + all possible attributes. +*/ +_PUBLIC_ int create_complex_file(struct smbcli_state *cli, TALLOC_CTX *mem_ctx, const char *fname); +int create_complex_dir(struct smbcli_state *cli, TALLOC_CTX *mem_ctx, const char *dname); +void *shm_setup(int size); + +/** + check that a wire string matches the flags specified + not 100% accurate, but close enough for testing +*/ +bool wire_bad_flags(struct smb_wire_string *str, int flags, + struct smbcli_transport *transport); +void dump_all_info(TALLOC_CTX *mem_ctx, union smb_fileinfo *finfo); +void torture_all_info(struct smbcli_tree *tree, const char *fname); +bool torture_set_file_attribute(struct smbcli_tree *tree, const char *fname, uint16_t attrib); +NTSTATUS torture_set_sparse(struct smbcli_tree *tree, int fnum); +NTSTATUS torture_check_ea(struct smbcli_state *cli, + const char *fname, const char *eaname, const char *value); +_PUBLIC_ bool torture_open_connection_share(TALLOC_CTX *mem_ctx, + struct smbcli_state **c, + struct torture_context *tctx, + const char *hostname, + const char *sharename, + struct event_context *ev); +_PUBLIC_ bool torture_get_conn_index(int conn_index, + TALLOC_CTX *mem_ctx, + struct torture_context *tctx, + char **host, char **share); +_PUBLIC_ bool torture_open_connection_ev(struct smbcli_state **c, + int conn_index, + struct torture_context *tctx, + struct event_context *ev); +_PUBLIC_ bool torture_open_connection(struct smbcli_state **c, struct torture_context *tctx, int conn_index); +_PUBLIC_ bool torture_close_connection(struct smbcli_state *c); +_PUBLIC_ bool check_error(const char *location, struct smbcli_state *c, + uint8_t eclass, uint32_t ecode, NTSTATUS nterr); +double torture_create_procs(struct torture_context *tctx, + bool (*fn)(struct torture_context *, struct smbcli_state *, int), bool *result); +_PUBLIC_ struct torture_test *torture_suite_add_smb_multi_test( + struct torture_suite *suite, + const char *name, + bool (*run) (struct torture_context *, + struct smbcli_state *, + int i)); +_PUBLIC_ struct torture_test *torture_suite_add_2smb_test( + struct torture_suite *suite, + const char *name, + bool (*run) (struct torture_context *, + struct smbcli_state *, + struct smbcli_state *)); +_PUBLIC_ struct torture_test *torture_suite_add_1smb_test( + struct torture_suite *suite, + const char *name, + bool (*run) (struct torture_context *, struct smbcli_state *)); +NTSTATUS torture_second_tcon(TALLOC_CTX *mem_ctx, + struct smbcli_session *session, + const char *sharename, + struct smbcli_tree **res); + + + +#endif /* _TORTURE_PROVISION_H_ */ diff --git a/source4/torture/util_provision.c b/source4/torture/util_provision.c new file mode 100644 index 0000000000..2a1e9256f5 --- /dev/null +++ b/source4/torture/util_provision.c @@ -0,0 +1,355 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2008 + + 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 3 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, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "dsdb/samdb/samdb.h" +#include "lib/appweb/ejs/ejs.h" +#include "lib/appweb/ejs/ejsInternal.h" +#include "scripting/ejs/smbcalls.h" +#include "auth/auth.h" +#include "lib/ldb_wrap.h" +#include "torture/util.h" + +static EjsId eid; +static int ejs_error; + +static void test_ejs_exception(const char *reason) +{ + Ejs *ep = ejsPtr(eid); + ejsSetErrorMsg(eid, "%s", reason); + fprintf(stderr, "%s", ep->error); + ejs_error = 127; +} + +static int test_run_ejs(char *script) +{ + EjsHandle handle = 0; + MprVar result; + char *emsg; + TALLOC_CTX *mem_ctx = talloc_new(NULL); + struct MprVar *return_var; + + mprSetCtx(mem_ctx); + + if (ejsOpen(NULL, NULL, NULL) != 0) { + d_printf("ejsOpen(): unable to initialise EJS subsystem\n"); + ejs_error = 127; + goto failed; + } + + smb_setup_ejs_functions(test_ejs_exception); + + if ((eid = ejsOpenEngine(handle, 0)) == (EjsId)-1) { + d_printf("smbscript: ejsOpenEngine(): unable to initialise an EJS engine\n"); + ejs_error = 127; + goto failed; + } + + mprSetVar(ejsGetGlobalObject(eid), "ARGV", mprList("ARGV", NULL)); + + /* run the script */ + if (ejsEvalScript(eid, script, &result, &emsg) == -1) { + d_printf("smbscript: ejsEvalScript(): %s\n", emsg); + if (ejs_error == 0) ejs_error = 127; + goto failed; + } + + return_var = ejsGetReturnValue(eid); + ejs_error = mprVarToNumber(return_var); + +failed: + ejsClose(); + talloc_free(mem_ctx); + return ejs_error; +} + +static NTSTATUS provision_bare_ejs(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, + struct provision_settings *settings) +{ + char *ejs; + int ret; + bool ok; + struct ldb_context *ldb; + + DEBUG(0,("Provision for Become-DC test using EJS\n")); + + DEBUG(0,("New Server[%s] in Site[%s]\n", settings->dns_name, + settings->site_name)); + + DEBUG(0,("DSA Instance [%s]\n" + "\tobjectGUID[%s]\n" + "\tinvocationId[%s]\n", + settings->ntds_dn_str, + GUID_string(mem_ctx, settings->ntds_guid), + GUID_string(mem_ctx, settings->invocation_id))); + + DEBUG(0,("Pathes under PRIVATEDIR[%s]\n" + "SAMDB[%s] SECRETS[%s] KEYTAB[%s]\n", + lp_private_dir(lp_ctx), + settings->samdb_ldb, + settings->secrets_ldb, + settings->secrets_keytab)); + + DEBUG(0,("Schema Partition[%s => %s]\n", + settings->schema_dn_str, settings->schemadn_ldb)); + + DEBUG(0,("Config Partition[%s => %s]\n", + settings->config_dn_str, settings->configdn_ldb)); + + DEBUG(0,("Domain Partition[%s => %s]\n", + settings->domain_dn_str, settings->domaindn_ldb)); + + ejs = talloc_asprintf(mem_ctx, + "libinclude(\"base.js\");\n" + "libinclude(\"provision.js\");\n" + "\n" + "function message() { print(vsprintf(arguments)); }\n" + "\n" + "var subobj = provision_guess();\n" + "subobj.ROOTDN = \"%s\";\n" + "subobj.DOMAINDN = \"%s\";\n" + "subobj.DOMAINDN_LDB = \"%s\";\n" + "subobj.CONFIGDN = \"%s\";\n" + "subobj.CONFIGDN_LDB = \"%s\";\n" + "subobj.SCHEMADN = \"%s\";\n" + "subobj.SCHEMADN_LDB = \"%s\";\n" + "subobj.HOSTNAME = \"%s\";\n" + "subobj.REALM = \"%s\";\n" + "subobj.DOMAIN = \"%s\";\n" + "subobj.DEFAULTSITE = \"%s\";\n" + "\n" + "subobj.KRBTGTPASS = \"_NOT_USED_\";\n" + "subobj.MACHINEPASS = \"%s\";\n" + "subobj.ADMINPASS = \"_NOT_USED_\";\n" + "\n" + "var paths = provision_default_paths(subobj);\n" + "paths.samdb = \"%s\";\n" + "paths.secrets = \"%s\";\n" + "paths.templates = \"%s\";\n" + "paths.keytab = \"%s\";\n" + "paths.dns_keytab = \"%s\";\n" + "\n" + "var system_session = system_session();\n" + "\n" + "var ok = provision_become_dc(subobj, message, true, paths, system_session);\n" + "assert(ok);\n" + "\n" + "return 0;\n", + settings->root_dn_str, /* subobj.ROOTDN */ + settings->domain_dn_str, /* subobj.DOMAINDN */ + settings->domaindn_ldb, /* subobj.DOMAINDN_LDB */ + settings->config_dn_str, /* subobj.CONFIGDN */ + settings->configdn_ldb, /* subobj.CONFIGDN_LDB */ + settings->schema_dn_str, /* subobj.SCHEMADN */ + settings->schemadn_ldb, /* subobj.SCHEMADN_LDB */ + settings->netbios_name, /* subobj.HOSTNAME */ + settings->realm,/* subobj.REALM */ + settings->domain,/* subobj.DOMAIN */ + settings->site_name, /* subobj.DEFAULTSITE */ + settings->machine_password,/* subobj.MACHINEPASS */ + settings->samdb_ldb, /* paths.samdb */ + settings->templates_ldb, /* paths.templates */ + settings->secrets_ldb, /* paths.secrets */ + settings->secrets_keytab, /* paths.keytab */ + settings->dns_keytab); /* paths.dns_keytab */ + NT_STATUS_HAVE_NO_MEMORY(ejs); + + ret = test_run_ejs(ejs); + if (ret != 0) { + DEBUG(0,("Failed to run ejs script: %d:\n%s", + ret, ejs)); + talloc_free(ejs); + return NT_STATUS_FOOBAR; + } + talloc_free(ejs); + + DEBUG(0,("Open the SAM LDB with system credentials: %s\n", + settings->samdb_ldb)); + + ldb = ldb_wrap_connect(mem_ctx, lp_ctx, settings->samdb_ldb, + system_session(mem_ctx, lp_ctx), + NULL, 0, NULL); + if (!ldb) { + DEBUG(0,("Failed to open '%s'\n", + settings->samdb_ldb)); + return NT_STATUS_INTERNAL_DB_ERROR; + } + + ok = samdb_set_ntds_invocation_id(ldb, settings->invocation_id); + if (!ok) { + DEBUG(0,("Failed to set cached ntds invocationId\n")); + return NT_STATUS_FOOBAR; + } + ok = samdb_set_ntds_objectGUID(ldb, settings->ntds_guid); + if (!ok) { + DEBUG(0,("Failed to set cached ntds objectGUID\n")); + return NT_STATUS_FOOBAR; + } + + return NT_STATUS_OK; +} + +#include "param/param.h" +#include <Python.h> +#include "scripting/python/modules.h" + +static NTSTATUS provision_bare_py(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, + struct provision_settings *settings) +{ + bool ok; + PyObject *provision_mod, *provision_dict, *provision_fn, *result, *parameters; + struct ldb_context *ldb; + + DEBUG(0,("Provision for Become-DC test using python\n")); + + py_load_samba_modules(); + Py_Initialize(); + py_update_path("bin"); /* FIXME: Can't assume this is always the case */ + + provision_mod = PyImport_Import(PyString_FromString("samba.provision")); + + if (provision_mod == NULL) { + PyErr_Print(); + DEBUG(0, ("Unable to import provision Python module.\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + provision_dict = PyModule_GetDict(provision_mod); + + if (provision_dict == NULL) { + DEBUG(0, ("Unable to get dictionary for provision module\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + provision_fn = PyDict_GetItemString(provision_dict, "provision"); + if (provision_fn == NULL) { + PyErr_Print(); + DEBUG(0, ("Unable to get provision function\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + DEBUG(0,("New Server[%s] in Site[%s]\n", settings->dns_name, + settings->site_name)); + + DEBUG(0,("DSA Instance [%s]\n" + "\tobjectGUID[%s]\n" + "\tinvocationId[%s]\n", + settings->ntds_dn_str, + settings->ntds_guid == NULL?"None":GUID_string(mem_ctx, settings->ntds_guid), + settings->invocation_id == NULL?"None":GUID_string(mem_ctx, settings->invocation_id))); + + DEBUG(0,("Pathes under PRIVATEDIR[%s]\n" + "SAMDB[%s] SECRETS[%s] KEYTAB[%s]\n", + lp_private_dir(lp_ctx), + settings->samdb_ldb, + settings->secrets_ldb, + settings->secrets_keytab)); + + DEBUG(0,("Schema Partition[%s => %s]\n", + settings->schema_dn_str, settings->schemadn_ldb)); + + DEBUG(0,("Config Partition[%s => %s]\n", + settings->config_dn_str, settings->configdn_ldb)); + + DEBUG(0,("Domain Partition[%s => %s]\n", + settings->domain_dn_str, settings->domaindn_ldb)); + + parameters = PyDict_New(); + + PyDict_SetItemString(parameters, "rootdn", + PyString_FromString(settings->root_dn_str)); + if (settings->domaindn_ldb != NULL) + PyDict_SetItemString(parameters, "domaindn_ldb", + PyString_FromString(settings->domaindn_ldb)); + if (settings->config_dn_str != NULL) + PyDict_SetItemString(parameters, "configdn", + PyString_FromString(settings->config_dn_str)); + if (settings->configdn_ldb != NULL) + PyDict_SetItemString(parameters, "configdn_ldb", + PyString_FromString(settings->configdn_ldb)); + if (settings->schema_dn_str != NULL) + PyDict_SetItemString(parameters, "schema_dn_str", + PyString_FromString(settings->schema_dn_str)); + if (settings->schemadn_ldb != NULL) + PyDict_SetItemString(parameters, "schemadn_ldb", + PyString_FromString(settings->schemadn_ldb)); + PyDict_SetItemString(parameters, "hostname", + PyString_FromString(settings->netbios_name)); + PyDict_SetItemString(parameters, "sitename", + PyString_FromString(settings->site_name)); + PyDict_SetItemString(parameters, "machinepass", + PyString_FromString(settings->machine_password)); + if (settings->samdb_ldb != NULL) + PyDict_SetItemString(parameters, "samdb", + PyString_FromString(settings->samdb_ldb)); + if (settings->secrets_ldb != NULL) + PyDict_SetItemString(parameters, "secrets_ldb", + PyString_FromString(settings->secrets_ldb)); + if (settings->secrets_keytab != NULL) + PyDict_SetItemString(parameters, "secrets_keytab", + PyString_FromString(settings->secrets_keytab)); + + result = PyEval_CallObjectWithKeywords(provision_fn, NULL, parameters); + + Py_DECREF(parameters); + + if (result == NULL) { + PyErr_Print(); + PyErr_Clear(); + return NT_STATUS_UNSUCCESSFUL; + } + + DEBUG(0,("Open the SAM LDB with system credentials: %s\n", + settings->samdb_ldb)); + + ldb = ldb_wrap_connect(mem_ctx, lp_ctx, settings->samdb_ldb, + system_session(mem_ctx, lp_ctx), + NULL, 0, NULL); + if (!ldb) { + DEBUG(0,("Failed to open '%s'\n", settings->samdb_ldb)); + return NT_STATUS_INTERNAL_DB_ERROR; + } + + ok = samdb_set_ntds_invocation_id(ldb, settings->invocation_id); + if (!ok) { + DEBUG(0,("Failed to set cached ntds invocationId\n")); + return NT_STATUS_FOOBAR; + } + ok = samdb_set_ntds_objectGUID(ldb, settings->ntds_guid); + if (!ok) { + DEBUG(0,("Failed to set cached ntds objectGUID\n")); + return NT_STATUS_FOOBAR; + } + + return NT_STATUS_OK; +} + +NTSTATUS provision_bare(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx, + struct provision_settings *settings) +{ + if (getenv("PROVISION_EJS")) { + return provision_bare_ejs(mem_ctx, lp_ctx, settings); + } else { + return provision_bare_py(mem_ctx, lp_ctx, settings); + } +} + + diff --git a/source4/torture/util_smb.c b/source4/torture/util_smb.c index de7303bac8..ddf7b85c63 100644 --- a/source4/torture/util_smb.c +++ b/source4/torture/util_smb.c @@ -863,3 +863,42 @@ _PUBLIC_ struct torture_test *torture_suite_add_1smb_test( } +NTSTATUS torture_second_tcon(TALLOC_CTX *mem_ctx, + struct smbcli_session *session, + const char *sharename, + struct smbcli_tree **res) +{ + union smb_tcon tcon; + struct smbcli_tree *result; + TALLOC_CTX *tmp_ctx; + NTSTATUS status; + + if ((tmp_ctx = talloc_new(mem_ctx)) == NULL) { + return NT_STATUS_NO_MEMORY; + } + + result = smbcli_tree_init(session, tmp_ctx, false); + if (result == NULL) { + talloc_free(tmp_ctx); + return NT_STATUS_NO_MEMORY; + } + + tcon.generic.level = RAW_TCON_TCONX; + tcon.tconx.in.flags = 0; + + /* Ignore share mode security here */ + tcon.tconx.in.password = data_blob(NULL, 0); + tcon.tconx.in.path = sharename; + tcon.tconx.in.device = "?????"; + + status = smb_raw_tcon(result, tmp_ctx, &tcon); + if (!NT_STATUS_IS_OK(status)) { + talloc_free(tmp_ctx); + return status; + } + + result->tid = tcon.tconx.out.tid; + *res = talloc_steal(mem_ctx, result); + talloc_free(tmp_ctx); + return NT_STATUS_OK; +} |