summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/libnet/libnet_user.c51
-rw-r--r--source4/libnet/libnet_user.h18
-rwxr-xr-xsource4/script/tests/test_ejs.sh6
-rw-r--r--source4/script/tests/tests_all.sh2
-rw-r--r--source4/scripting/ejs/ejsnet.c219
-rw-r--r--source4/scripting/ejs/ejsnet.h2
-rw-r--r--source4/scripting/ejs/smbcalls_creds.c22
-rw-r--r--source4/scripting/libjs/provision.js26
-rw-r--r--source4/utils/net/net_user.c42
-rw-r--r--swat/install/vampire.esp91
-rw-r--r--swat/menu.js3
-rwxr-xr-xtestprogs/ejs/ejsnet.js33
12 files changed, 458 insertions, 57 deletions
diff --git a/source4/libnet/libnet_user.c b/source4/libnet/libnet_user.c
index 50cb14d290..ba9fd0cc83 100644
--- a/source4/libnet/libnet_user.c
+++ b/source4/libnet/libnet_user.c
@@ -75,3 +75,54 @@ NTSTATUS libnet_CreateUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
return status;
}
+
+NTSTATUS libnet_DeleteUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_DeleteUser *r)
+{
+ NTSTATUS status;
+ struct libnet_RpcConnect cn;
+ struct libnet_rpc_domain_open dom_io;
+ struct libnet_rpc_userdel user_io;
+
+ /* connect rpc service of remote DC */
+ cn.level = LIBNET_RPC_CONNECT_PDC;
+ cn.in.name = talloc_strdup(mem_ctx, r->in.domain_name);
+ cn.in.dcerpc_iface = &dcerpc_table_samr;
+
+ status = libnet_RpcConnect(ctx, mem_ctx, &cn);
+ if (!NT_STATUS_IS_OK(status)) {
+ r->out.error_string = talloc_asprintf(mem_ctx,
+ "Connection to SAMR pipe domain '%s' PDC failed: %s\n",
+ r->in.domain_name, nt_errstr(status));
+ return status;
+ }
+
+ ctx->pipe = cn.out.dcerpc_pipe;
+
+ /* open connected domain */
+ dom_io.in.domain_name = r->in.domain_name;
+ dom_io.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+
+ status = libnet_rpc_domain_open(ctx->pipe, mem_ctx, &dom_io);
+ if (!NT_STATUS_IS_OK(status)) {
+ r->out.error_string = talloc_asprintf(mem_ctx,
+ "Opening domain to delete user account failed: %s\n",
+ nt_errstr(status));
+ return status;
+ }
+
+ ctx->domain_handle = dom_io.out.domain_handle;
+
+ /* create user */
+ user_io.in.username = r->in.user_name;
+ user_io.in.domain_handle = dom_io.out.domain_handle;
+
+ status = libnet_rpc_userdel(ctx->pipe, mem_ctx, &user_io);
+ if (!NT_STATUS_IS_OK(status)) {
+ r->out.error_string = talloc_asprintf(mem_ctx,
+ "Deleting user account failed: %s\n",
+ nt_errstr(status));
+ return status;
+ }
+
+ return status;
+}
diff --git a/source4/libnet/libnet_user.h b/source4/libnet/libnet_user.h
index 358f0d0b0f..2182ccb4e4 100644
--- a/source4/libnet/libnet_user.h
+++ b/source4/libnet/libnet_user.h
@@ -36,3 +36,21 @@ struct libnet_CreateUser {
const char *error_string;
} out;
};
+
+enum libnet_DeleteUser_level {
+ LIBNET_DELETE_USER_GENERIC,
+ LIBNET_DELETE_USER_SAMR,
+};
+
+
+struct libnet_DeleteUser {
+ enum libnet_DeleteUser_level level;
+
+ struct {
+ const char *user_name;
+ const char *domain_name;
+ } in;
+ struct {
+ const char *error_string;
+ } out;
+};
diff --git a/source4/script/tests/test_ejs.sh b/source4/script/tests/test_ejs.sh
index 2f1a2abcad..6df202122a 100755
--- a/source4/script/tests/test_ejs.sh
+++ b/source4/script/tests/test_ejs.sh
@@ -3,12 +3,12 @@
if [ $# -lt 3 ]; then
cat <<EOF
-Usage: test_ejs.sh SERVER USERNAME PASSWORD
+Usage: test_ejs.sh DOMAIN USERNAME PASSWORD
EOF
exit 1;
fi
-SERVER="$1"
+DOMAIN="$1"
USERNAME="$2"
PASSWORD="$3"
@@ -24,6 +24,8 @@ for f in samr.js echo.js ldb.js; do
testit "$f" $SCRIPTDIR/$f $CONFIGURATION ncalrpc: -U$USERNAME%$PASSWORD || failed=`expr $failed + 1`
done
+testit "ejsnet.js" $SCRIPTDIR/ejsnet.js $CONFIGURATION -U$USERNAME%$PASSWORD $DOMAIN ejstestuser || failed=`expr $failed + 1`
+
testit "winreg" scripting/bin/winreg $CONFIGURATION ncalrpc: 'HKLM' -U$USERNAME%$PASSWORD || failed=`expr $failed + 1`
testok $0 $failed
diff --git a/source4/script/tests/tests_all.sh b/source4/script/tests/tests_all.sh
index 8abebf0dce..70e72e7240 100644
--- a/source4/script/tests/tests_all.sh
+++ b/source4/script/tests/tests_all.sh
@@ -1,4 +1,4 @@
- $SRCDIR/script/tests/test_ejs.sh $SERVER $USERNAME $PASSWORD || failed=`expr $failed + $?`
+ $SRCDIR/script/tests/test_ejs.sh $DOMAIN $USERNAME $PASSWORD || failed=`expr $failed + $?`
$SRCDIR/script/tests/test_ldap.sh $SERVER $USERNAME $PASSWORD || failed=`expr $failed + $?`
$SRCDIR/script/tests/test_nbt.sh $SERVER || failed=`expr $failed + $?`
$SRCDIR/script/tests/test_quick.sh //$SERVER/cifs $USERNAME $PASSWORD "" || failed=`expr $failed + $?`
diff --git a/source4/scripting/ejs/ejsnet.c b/source4/scripting/ejs/ejsnet.c
index 5768fb4442..e129ba6867 100644
--- a/source4/scripting/ejs/ejsnet.c
+++ b/source4/scripting/ejs/ejsnet.c
@@ -27,70 +27,160 @@
#include "libnet/libnet.h"
+static int ejs_net_userman(MprVarHandle, int, struct MprVar**);
+static int ejs_net_createuser(MprVarHandle, int, char**);
+static int ejs_net_deleteuser(MprVarHandle eid, int argc, char **argv);
+static int ejs_net_join_domain(MprVarHandle eid, int argc, struct MprVar **argv);
+static int ejs_net_samsync_ldb(MprVarHandle eid, int argc, struct MprVar **argv);
+
+/* Usage:
+ net = NetContext(credentials);
+*/
+
static int ejs_net_context(MprVarHandle eid, int argc, struct MprVar **argv)
{
struct cli_credentials *creds;
struct libnet_context *ctx;
- struct MprVar *obj;
+ struct MprVar obj;
+ /* TODO: Need to get the right event context in here */
ctx = libnet_context_init(NULL);
- creds = talloc(ctx, struct cli_credentials);
- ctx->cred = creds;
-
- ctx->name_res_methods = str_list_copy(ctx, lp_name_resolve_order());
if (argc == 0) {
+ creds = cli_credentials_init(ctx);
+ if (creds == NULL) {
+ ejsSetErrorMsg(eid, "cli_credential_init() failed");
+ talloc_free(ctx);
+ return -1;
+ }
+ cli_credentials_set_conf(creds);
cli_credentials_set_anonymous(creds);
+ } else if (argc == 1 && argv[0]->type == MPR_TYPE_OBJECT) {
+ /* get credential values from credentials object */
+ creds = mprGetPtr(argv[0], "creds");
+ if (creds == NULL) {
+ ejsSetErrorMsg(eid, "userAuth requires a 'creds' first parameter");
+ talloc_free(ctx);
+ return -1;
+ }
+ } else {
+ ejsSetErrorMsg(eid, "NetContext invalid arguments, this function requires an object.");
+ talloc_free(ctx);
+ return -1;
+ }
+ ctx->cred = creds;
- } else if (argc == 2 || argc == 4 ) {
-
- cli_credentials_set_workstation(creds, lp_netbios_name(), CRED_SPECIFIED);
+ obj = mprObject("NetCtx");
+ mprSetPtrChild(&obj, "ctx", ctx);
+
+ mprSetCFunction(&obj, "UserMgr", ejs_net_userman);
+ mprSetCFunction(&obj, "JoinDomain", ejs_net_join_domain);
+ mprSetCFunction(&obj, "SamSyncLdb", ejs_net_samsync_ldb);
+ mpr_Return(eid, obj);
- if (!mprVarIsString(argv[0]->type)) {
- ejsSetErrorMsg(eid, "argument 1 must be a string");
- goto done;
- }
- cli_credentials_set_username(creds, argv[0]->string, CRED_SPECIFIED);
+ return 0;
+}
- if (!mprVarIsString(argv[1]->type)) {
- ejsSetErrorMsg(eid, "argument 2 must be a string");
- goto done;
+static int ejs_net_join_domain(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+ TALLOC_CTX *mem_ctx;
+ struct libnet_context *ctx;
+ struct libnet_Join *join;
+ NTSTATUS status;
+ ctx = mprGetThisPtr(eid, "ctx");
+ mem_ctx = talloc_new(mprMemCtx());
+
+ join = talloc(mem_ctx, struct libnet_Join);
+ if (!join) {
+ talloc_free(mem_ctx);
+ return -1;
+ }
+
+ /* prepare parameters for the join */
+ join->in.netbios_name = NULL;
+ join->in.join_type = SEC_CHAN_WKSTA;
+ join->in.domain_name = cli_credentials_get_domain(ctx->cred);
+ join->in.level = LIBNET_JOINDOMAIN_AUTOMATIC;
+ join->out.error_string = NULL;
+
+ if (argc == 1 && argv[0]->type == MPR_TYPE_OBJECT) {
+ MprVar *netbios_name = mprGetProperty(argv[0], "netbios_name", NULL);
+ MprVar *domain_name = mprGetProperty(argv[0], "domain_name", NULL);
+ MprVar *join_type = mprGetProperty(argv[0], "join_type", NULL);
+ if (netbios_name) {
+ join->in.netbios_name = mprToString(netbios_name);
+ }
+ if (domain_name) {
+ join->in.domain_name = mprToString(domain_name);
+ }
+ if (join_type) {
+ join->in.join_type = mprToInt(join_type);
}
- cli_credentials_set_password(creds, argv[1]->string, CRED_SPECIFIED);
+ }
- } else {
- ejsSetErrorMsg(eid, "invalid number of arguments");
- goto done;
+ if (!join->in.domain_name) {
+ ejsSetErrorMsg(eid, "a domain must be specified for to join");
+ talloc_free(mem_ctx);
+ return -1;
}
+ /* do the domain join */
+ status = libnet_Join(ctx, join, join);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ MprVar error_string = mprString(join->out.error_string);
- if (argc == 4) {
+ mprSetPropertyValue(argv[0], "error_string", error_string);
+ mpr_Return(eid, mprCreateBoolVar(False));
+ } else {
+ mpr_Return(eid, mprCreateBoolVar(True));
+ }
+ talloc_free(mem_ctx);
+ return 0;
+}
- if (!mprVarIsString(argv[2]->type)) {
- ejsSetErrorMsg(eid, "argument 3 must be a string");
- goto done;
- }
- cli_credentials_set_domain(creds, argv[2]->string, CRED_SPECIFIED);
-
- if (!mprVarIsString(argv[3]->type)) {
- ejsSetErrorMsg(eid, "argument 4 must be a string");
- goto done;
- }
- cli_credentials_set_realm(creds, argv[3]->string, CRED_SPECIFIED);
+static int ejs_net_samsync_ldb(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+ TALLOC_CTX *mem_ctx;
+ struct libnet_context *ctx;
+ struct libnet_samsync_ldb *samsync;
+ NTSTATUS status;
+ ctx = mprGetThisPtr(eid, "ctx");
+ mem_ctx = talloc_new(mprMemCtx());
+
+ samsync = talloc(mem_ctx, struct libnet_samsync_ldb);
+ if (!samsync) {
+ talloc_free(mem_ctx);
+ return -1;
}
- obj = mprInitObject(eid, "NetCtx", argc, argv);
- mprSetPtrChild(obj, "ctx", ctx);
+ /* prepare parameters for the samsync */
+ samsync->in.machine_account = NULL;
+ samsync->in.binding_string = NULL;
+ samsync->out.error_string = NULL;
- mprSetCFunction(obj, "UserMgr", ejs_net_userman);
+ if (argc == 1 && argv[0]->type == MPR_TYPE_OBJECT) {
+ MprVar *credentials = mprGetProperty(argv[0], "machine_account", NULL);
+ if (credentials) {
+ samsync->in.machine_account = talloc_get_type(mprGetPtr(credentials, "creds"), struct cli_credentials);
+ }
+ }
+ /* do the domain samsync */
+ status = libnet_samsync_ldb(ctx, samsync, samsync);
+
+ if (!NT_STATUS_IS_OK(status)) {
+ MprVar error_string = mprString(samsync->out.error_string);
+
+ mprSetPropertyValue(argv[0], "error_string", error_string);
+ mpr_Return(eid, mprCreateBoolVar(False));
+ } else {
+ mpr_Return(eid, mprCreateBoolVar(True));
+ }
+ talloc_free(mem_ctx);
return 0;
-done:
- talloc_free(ctx);
- return -1;
}
-
static int ejs_net_userman(MprVarHandle eid, int argc, struct MprVar **argv)
{
TALLOC_CTX *mem_ctx;
@@ -99,7 +189,7 @@ static int ejs_net_userman(MprVarHandle eid, int argc, struct MprVar **argv)
struct MprVar *obj = NULL;
ctx = mprGetThisPtr(eid, "ctx");
- mem_ctx = talloc_init(NULL);
+ mem_ctx = talloc_new(mprMemCtx());
if (argc == 0) {
userman_domain = cli_credentials_get_domain(ctx->cred);
@@ -122,6 +212,7 @@ static int ejs_net_userman(MprVarHandle eid, int argc, struct MprVar **argv)
mprSetPtrChild(obj, "domain", userman_domain);
mprSetStringCFunction(obj, "Create", ejs_net_createuser);
+ mprSetStringCFunction(obj, "Delete", ejs_net_deleteuser);
return 0;
done:
@@ -140,22 +231,22 @@ static int ejs_net_createuser(MprVarHandle eid, int argc, char **argv)
if (argc != 1) {
ejsSetErrorMsg(eid, "argument 1 must be a string");
- goto done;
+ return -1;
}
ctx = mprGetThisPtr(eid, "ctx");
if (!ctx) {
ejsSetErrorMsg(eid, "ctx property returns null pointer");
- goto done;
+ return -1;
}
userman_domain = mprGetThisPtr(eid, "domain");
if (!userman_domain) {
ejsSetErrorMsg(eid, "domain property returns null pointer");
- goto done;
+ return -1;
}
- mem_ctx = talloc_init(NULL);
+ mem_ctx = talloc_new(mprMemCtx());
req.in.domain_name = userman_domain;
req.in.user_name = argv[0];
@@ -168,10 +259,46 @@ static int ejs_net_createuser(MprVarHandle eid, int argc, char **argv)
talloc_free(mem_ctx);
mpr_Return(eid, mprNTSTATUS(status));
return 0;
+}
+
+static int ejs_net_deleteuser(MprVarHandle eid, int argc, char **argv)
+{
+ NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
+ TALLOC_CTX *mem_ctx;
+ struct libnet_context *ctx;
+ const char *userman_domain = NULL;
+ struct libnet_DeleteUser req;
+
+ if (argc != 1) {
+ ejsSetErrorMsg(eid, "argument 1 must be a string");
+ return -1;
+ }
+
+ ctx = mprGetThisPtr(eid, "ctx");
+ if (!ctx) {
+ ejsSetErrorMsg(eid, "ctx property returns null pointer");
+ return -1;
+ }
+
+ userman_domain = mprGetThisPtr(eid, "domain");
+ if (!userman_domain) {
+ ejsSetErrorMsg(eid, "domain property returns null pointer");
+ return -1;
+ }
+
+ mem_ctx = talloc_new(mprMemCtx());
+
+ req.in.domain_name = userman_domain;
+ req.in.user_name = argv[0];
+
+ status = libnet_DeleteUser(ctx, mem_ctx, &req);
+ if (!NT_STATUS_IS_OK(status)) {
+ ejsSetErrorMsg(eid, "error when creating user: %s", nt_errstr(status));
+ }
-done:
talloc_free(mem_ctx);
- return -1;
+ mpr_Return(eid, mprNTSTATUS(status));
+ return 0;
}
diff --git a/source4/scripting/ejs/ejsnet.h b/source4/scripting/ejs/ejsnet.h
index 50978c648d..7d4bc32753 100644
--- a/source4/scripting/ejs/ejsnet.h
+++ b/source4/scripting/ejs/ejsnet.h
@@ -24,5 +24,3 @@
void ejsnet_setup(void);
-static int ejs_net_userman(MprVarHandle, int, struct MprVar**);
-static int ejs_net_createuser(MprVarHandle, int, char**);
diff --git a/source4/scripting/ejs/smbcalls_creds.c b/source4/scripting/ejs/smbcalls_creds.c
index bec70bc6f2..4b0312bf83 100644
--- a/source4/scripting/ejs/smbcalls_creds.c
+++ b/source4/scripting/ejs/smbcalls_creds.c
@@ -181,6 +181,25 @@ static int ejs_creds_get_workstation(MprVarHandle eid, int argc, struct MprVar *
return 0;
}
+/*
+ set machine account
+*/
+static int ejs_creds_set_machine_account(MprVarHandle eid, int argc, char **argv)
+{
+ struct cli_credentials *creds = ejs_creds_get_credentials(eid);
+ if (argc != 0) {
+ ejsSetErrorMsg(eid, "bad arguments to set_machine_account");
+ return -1;
+ }
+
+ if (NT_STATUS_IS_OK(cli_credentials_set_machine_account(creds))) {
+ mpr_Return(eid, mprCreateBoolVar(True));
+ } else {
+ mpr_Return(eid, mprCreateBoolVar(False));
+ }
+ return 0;
+}
+
/*
initialise credentials ejs object
@@ -200,6 +219,7 @@ static int ejs_credentials_obj(struct MprVar *obj, struct cli_credentials *creds
mprSetStringCFunction(obj, "set_realm", ejs_creds_set_realm);
mprSetCFunction(obj, "get_workstation", ejs_creds_get_workstation);
mprSetStringCFunction(obj, "set_workstation", ejs_creds_set_workstation);
+ mprSetCFunction(obj, "set_machine_account", ejs_creds_set_machine_account);
return 0;
}
@@ -228,6 +248,8 @@ static int ejs_credentials_init(MprVarHandle eid, int argc, struct MprVar **argv
return -1;
}
+ cli_credentials_set_conf(creds);
+
return ejs_credentials_obj(obj, creds);
}
diff --git a/source4/scripting/libjs/provision.js b/source4/scripting/libjs/provision.js
index 8b1d93c056..60f267f8d5 100644
--- a/source4/scripting/libjs/provision.js
+++ b/source4/scripting/libjs/provision.js
@@ -327,6 +327,7 @@ function provision(subobj, message, blank, paths, session_info, credentials)
message("Setting up sam.ldb users and groups\n");
setup_ldb("provision_users.ldif", info, paths.samdb, data, false);
}
+ return true;
}
/*
@@ -516,5 +517,30 @@ function provision_validate(subobj, message)
return true;
}
+function join_domain(domain, netbios_name, join_type, creds, writefln)
+{
+ ctx = NetContext(creds);
+ join = new Object();
+ join.domain = domain;
+ join.join_type = join_type;
+ join.netbios_name = netbios_name;
+ if (!ctx.JoinDomain(join)) {
+ writefln("Domain Join failed: " + join.error_string);
+ return false;
+ }
+ return true;
+}
+
+function vampire(machine_creds, writefln)
+{
+ var ctx = NetContext();
+ vampire = new Object();
+ vampire.machine_creds = machine_creds;
+ if (!ctx.SamSyncLdb(vampire)) {
+ writefln("Migration of remote domain to Samba failed: " + vampire.error_string);
+ return false;
+ }
+ return true;
+}
return 0;
diff --git a/source4/utils/net/net_user.c b/source4/utils/net/net_user.c
index 82ee208534..ecc1834fcf 100644
--- a/source4/utils/net/net_user.c
+++ b/source4/utils/net/net_user.c
@@ -64,9 +64,51 @@ static int net_user_add(struct net_context *ctx, int argc, const char **argv)
return 0;
}
+static int net_user_delete(struct net_context *ctx, int argc, const char **argv)
+{
+ NTSTATUS status;
+ struct libnet_context *lnet_ctx;
+ struct libnet_DeleteUser r;
+ char *user_name;
+
+ /* command line argument preparation */
+ switch (argc) {
+ case 0:
+ return net_user_usage(ctx, argc, argv);
+ break;
+ case 1:
+ user_name = talloc_strdup(ctx->mem_ctx, argv[0]);
+ break;
+ default:
+ return net_user_usage(ctx, argc, argv);
+ }
+
+ /* libnet context init and its params */
+ lnet_ctx = libnet_context_init(NULL);
+ if (!lnet_ctx) return -1;
+
+ lnet_ctx->cred = ctx->credentials;
+
+ /* calling DeleteUser function */
+ r.level = LIBNET_DELETE_USER_GENERIC;
+ r.in.user_name = user_name;
+ r.in.domain_name = cli_credentials_get_domain(lnet_ctx->cred);
+
+ status = libnet_DeleteUser(lnet_ctx, ctx->mem_ctx, &r);
+ if (!NT_STATUS_IS_OK(status)) {
+ DEBUG(0, ("Failed to delete user account: %s\n",
+ r.out.error_string));
+ return -1;
+ }
+
+ talloc_free(lnet_ctx);
+ return 0;
+}
+
static const struct net_functable net_user_functable[] = {
{ "add", "create new user account\n", net_user_add, net_user_usage },
+ { "delete", "delete an existing user account\n", net_user_delete, net_user_usage },
{ NULL, NULL }
};
diff --git a/swat/install/vampire.esp b/swat/install/vampire.esp
new file mode 100644
index 0000000000..bd96f91962
--- /dev/null
+++ b/swat/install/vampire.esp
@@ -0,0 +1,91 @@
+<% page_header("columns", "Windows to Samba Migration", "install");
+
+ include("/scripting/forms.js");
+ libinclude("base.js");
+ libinclude("provision.js");
+
+ var misc = misc_init();
+%>
+
+<h1>Windows to Samba4 domain migration</h1>
+
+<%
+var f = FormObj("Provisioning", 0, 2);
+var i;
+var lp = loadparm_init();
+
+if (lp.get("realm") == "") {
+ lp.set("realm", lp.get("workgroup") + ".example.com");
+}
+
+
+var subobj = provision_guess();
+/* Don't supply default password for web interface */
+subobj.ADMINPASS = "";
+
+f.add("REALM", "Realm");
+f.add("DOMAIN", "Domain Name");
+f.add("ADMIN", "Administrator Username");
+f.add("ADMINPASS", "Administrator Password", "password");
+f.add("HOSTNAME", "My Hostname");
+f.add("HOSTGUID", "Host GUID");
+f.add("HOSTIP", "Host IP");
+f.add("DEFAULTSITE", "Default Site");
+f.submit[0] = "Migrate";
+f.submit[1] = "Cancel";
+
+if (form['submit'] == "Cancel") {
+ redirect("/");
+}
+
+if (form['submit'] == "Migrate") {
+ for (r in form) {
+ subobj[r] = form[r];
+ }
+}
+
+for (i=0;i<f.element.length;i++) {
+ f.element[i].value = subobj[f.element[i].name];
+}
+
+if (form['submit'] == "Migrate") {
+ lp.set("realm", subobj.REALM);
+ if (subobj.ADMINPASS == "") {
+ write("<h3>We need the administrator password for the " + subobj.DOMAIN + " domain to proceed. Please try again.</h3>");
+ f.display();
+ } else if (!provision_validate(subobj, writefln)) {
+ f.display();
+ } else {
+ var creds = credentials_init();
+ creds.set_username(form.ADMIN);
+ creds.set_password(form.ADMINPASS);
+ creds.set_domain(form.DOMAIN);
+ creds.set_realm(form.REALM);
+
+ /* Setup a basic database structure, but don't setup any users */
+ if (!provision(subobj, writefln, true, provision_default_paths(subobj),
+ session.authinfo.session_info, session.authinfo.credentials)) {
+ writefln("Provision failed!");
+
+ /* Join domain */
+ } else if (!join_domain(form.DOMAIN, form.HOSTNAME, misc.SEC_CHAN_BDC, creds, writefln)) {
+ writefln("Domain Join failed!");
+
+ } else {
+ /* Vampire */
+ var machine_creds = credentials_init();
+ machine_creds.set_domain(form.DOMAIN);
+ if (!machine_creds.set_machine_account()) {
+ writefln("Failed to access newly setup domain join!");
+ } else if (!vampire(machine_creds, writefln)) {
+ writefln("Failed to syncronsise remote domain into local database!");
+ }
+ }
+ }
+} else {
+ f.display();
+}
+%>
+
+
+<% page_footer(); %>
diff --git a/swat/menu.js b/swat/menu.js
index e28160e16f..07acd300cb 100644
--- a/swat/menu.js
+++ b/swat/menu.js
@@ -40,7 +40,8 @@ swat_menus.install = simple_menu(
"Installation",
"Provisioning", session_uri("/install/provision.esp"),
"New User", session_uri("/install/newuser.esp"),
- "Import from Samba3", session_uri("/install/samba3.esp"));
+ "Import from Samba3", session_uri("/install/samba3.esp"),
+ "Import from Windows", session_uri("/install/vampire.esp"));
swat_menus.nbt_server = simple_menu(
diff --git a/testprogs/ejs/ejsnet.js b/testprogs/ejs/ejsnet.js
index 537312766a..f1d84ffde0 100755
--- a/testprogs/ejs/ejsnet.js
+++ b/testprogs/ejs/ejsnet.js
@@ -1,15 +1,38 @@
#!/usr/bin/env smbscript
-var ctx = NetContext("Administrator", "admin");
-var usr_ctx = ctx.UserMgr("BUILTIN");
+var options = GetOptions(ARGV,
+ "POPT_AUTOHELP",
+ "POPT_COMMON_SAMBA",
+ "POPT_COMMON_CREDENTIALS");
+if (options == undefined) {
+ println("Failed to parse options");
+ return -1;
+}
+
+if (options.ARGV.length != 2) {
+ println("Usage: ejsnet.js <DOMAIN> <NEW USER NAME>");
+ return -1;
+}
+
+/* use command line creds if available */
+var creds = options.get_credentials();
+
+var ctx = NetContext(creds);
+var usr_ctx = ctx.UserMgr(options.ARGV[0]);
if (usr_ctx == undefined) {
- print("Couln't get user management context.\n");
+ println("Couln't get user management context.");
+ return -1;
+}
+
+var status = usr_ctx.Create(options.ARGV[1]);
+if (status.is_ok != true) {
+ println("Failed to create user account " + options.ARGV[1] + ": " + status.errstr);
return -1;
}
-var status = usr_ctx.Create("noname");
+var status = usr_ctx.Delete(options.ARGV[1]);
if (status.is_ok != true) {
- print("Failed to create user account: " + status.errstr + "\n");
+ println("Failed to delete user account " + options.ARGV[1] + ": " + status.errstr);
return -1;
}