#include "scripting/ejs/smbcalls.h"
#include "scripting/ejs/ejsnet.h"
#include "libnet/libnet.h"
+#include "events/events.h"
+#include "auth/credentials/credentials.h"
-
-static int ejs_net_userman(MprVarHandle, int, struct MprVar**);
-static int ejs_net_createuser(MprVarHandle, int, char**);
+static int ejs_net_userman(MprVarHandle eid, int argc, struct MprVar** argv);
+static int ejs_net_createuser(MprVarHandle eid, int argc, char **argv);
static int ejs_net_deleteuser(MprVarHandle eid, int argc, char **argv);
+static int ejs_net_userinfo(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);
+/*
+ Usage:
+ net = NetContext(credentials);
*/
static int ejs_net_context(MprVarHandle eid, int argc, struct MprVar **argv)
{
+ TALLOC_CTX *event_mem_ctx = talloc_new(mprMemCtx());
struct cli_credentials *creds;
struct libnet_context *ctx;
struct MprVar obj;
+ struct event_context *ev;
- /* TODO: Need to get the right event context in here */
- ctx = libnet_context_init(NULL);
+ if (!event_mem_ctx) {
+ ejsSetErrorMsg(eid, "talloc_new() failed");
+ return -1;
+ }
+ ev = event_context_find(event_mem_ctx);
+ ctx = libnet_context_init(ev);
+ /* IF we generated a new event context, it will be under here,
+ * and we need it to last as long as the libnet context, so
+ * make it a child */
+ talloc_steal(ctx, event_mem_ctx);
if (argc == 0 || (argc == 1 && argv[0]->type == MPR_TYPE_NULL)) {
creds = cli_credentials_init(ctx);
return 0;
}
+
static int ejs_net_join_domain(MprVarHandle eid, int argc, struct MprVar **argv)
{
TALLOC_CTX *mem_ctx;
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->in.level = LIBNET_JOIN_AUTOMATIC;
join->out.error_string = NULL;
if (argc == 1 && argv[0]->type == MPR_TYPE_OBJECT) {
return 0;
}
+
static int ejs_net_samsync_ldb(MprVarHandle eid, int argc, struct MprVar **argv)
{
TALLOC_CTX *mem_ctx;
return 0;
}
+
+/*
+ Usage:
+ usrCtx = net.UserMgr(domain);
+*/
static int ejs_net_userman(MprVarHandle eid, int argc, struct MprVar **argv)
{
TALLOC_CTX *mem_ctx;
mprSetStringCFunction(obj, "Create", ejs_net_createuser);
mprSetStringCFunction(obj, "Delete", ejs_net_deleteuser);
+ mprSetStringCFunction(obj, "Info", ejs_net_userinfo);
return 0;
done:
status = libnet_CreateUser(ctx, mem_ctx, &req);
if (!NT_STATUS_IS_OK(status)) {
- ejsSetErrorMsg(eid, "error when creating user: %s", nt_errstr(status));
+ ejsSetErrorMsg(eid, "%s", req.out.error_string);
}
talloc_free(mem_ctx);
return 0;
}
+
static int ejs_net_deleteuser(MprVarHandle eid, int argc, char **argv)
{
NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
status = libnet_DeleteUser(ctx, mem_ctx, &req);
if (!NT_STATUS_IS_OK(status)) {
- ejsSetErrorMsg(eid, "error when creating user: %s", nt_errstr(status));
+ ejsSetErrorMsg(eid, "%s", req.out.error_string);
}
talloc_free(mem_ctx);
}
+static int ejs_net_userinfo(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_UserInfo req;
+ struct MprVar mprUserInfo;
+ struct MprVar mprAccountName, mprFullName, mprDescription;
+ struct MprVar mprHomeDir, mprHomeDrive, mprComment;
+ struct MprVar mprLogonScript;
+ struct MprVar mprAcctExpiry, mprAllowPassChange, mprForcePassChange;
+
+ 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_UserInfo(ctx, mem_ctx, &req);
+ if (!NT_STATUS_IS_OK(status)) {
+ ejsSetErrorMsg(eid, "%s", req.out.error_string);
+ }
+
+ /* create UserInfo object */
+ mprUserInfo = mprObject("UserInfo");
+
+ mprAccountName = mprString(req.out.account_name);
+ mprFullName = mprString(req.out.full_name);
+ mprDescription = mprString(req.out.description);
+ mprHomeDir = mprString(req.out.home_directory);
+ mprHomeDrive = mprString(req.out.home_drive);
+ mprComment = mprString(req.out.comment);
+ mprLogonScript = mprString(req.out.logon_script);
+ mprAcctExpiry = mprString(timestring(mem_ctx, req.out.acct_expiry->tv_sec));
+ mprAllowPassChange = mprString(timestring(mem_ctx, req.out.allow_password_change->tv_sec));
+ mprForcePassChange = mprString(timestring(mem_ctx, req.out.force_password_change->tv_sec));
+
+ status = mprSetVar(&mprUserInfo, "AccountName", mprAccountName);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "FullName", mprFullName);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "Description", mprDescription);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "HomeDirectory", mprHomeDir);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "HomeDrive", mprHomeDrive);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "Comment", mprComment);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "LogonScript", mprLogonScript);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "AcctExpiry", mprAcctExpiry);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "AllowPasswordChange", mprAllowPassChange);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+ status = mprSetVar(&mprUserInfo, "ForcePasswordChange", mprForcePassChange);
+ if (!NT_STATUS_IS_OK(status)) goto done;
+
+done:
+ talloc_free(mem_ctx);
+ mpr_Return(eid, mprUserInfo);
+ return 0;
+}
+
+
void ejsnet_setup(void)
{
ejsDefineCFunction(-1, "NetContext", ejs_net_context, NULL, MPR_VAR_SCRIPT_HANDLE);