r20143: a bit of experiments before doing serious changes in ejsnet.
[ira/wip.git] / source / scripting / ejs / ejsnet.c
index 89620252590f4d993afa6192788d067ab6b894ce..5daf478506007fa3d394344d1f2d7d1e7327c344 100644 (file)
 #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);
@@ -81,6 +94,7 @@ static int ejs_net_context(MprVarHandle eid, int argc, struct MprVar **argv)
        return 0;
 }
 
+
 static int ejs_net_join_domain(MprVarHandle eid, int argc, struct MprVar **argv)
 {
        TALLOC_CTX *mem_ctx;
@@ -100,7 +114,7 @@ static int ejs_net_join_domain(MprVarHandle eid, int argc, struct MprVar **argv)
        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) {
@@ -139,6 +153,7 @@ static int ejs_net_join_domain(MprVarHandle eid, int argc, struct MprVar **argv)
        return 0;
 }
 
+
 static int ejs_net_samsync_ldb(MprVarHandle eid, int argc, struct MprVar **argv)
 {
        TALLOC_CTX *mem_ctx;
@@ -186,6 +201,11 @@ static int ejs_net_samsync_ldb(MprVarHandle eid, int argc, struct MprVar **argv)
        return 0;
 }
 
+
+/*
+  Usage:
+  usrCtx = net.UserMgr(domain);
+*/
 static int ejs_net_userman(MprVarHandle eid, int argc, struct MprVar **argv)
 {
        TALLOC_CTX *mem_ctx;
@@ -218,6 +238,7 @@ static int ejs_net_userman(MprVarHandle eid, int argc, struct MprVar **argv)
 
        mprSetStringCFunction(obj, "Create", ejs_net_createuser);
        mprSetStringCFunction(obj, "Delete", ejs_net_deleteuser);
+       mprSetStringCFunction(obj, "Info", ejs_net_userinfo);
 
        return 0;
 done:
@@ -258,7 +279,7 @@ static int ejs_net_createuser(MprVarHandle eid, int argc, char **argv)
 
        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);
@@ -266,6 +287,7 @@ static int ejs_net_createuser(MprVarHandle eid, int argc, char **argv)
        return 0;
 }
 
+
 static int ejs_net_deleteuser(MprVarHandle eid, int argc, char **argv)
 {
        NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
@@ -298,7 +320,7 @@ static int ejs_net_deleteuser(MprVarHandle eid, int argc, char **argv)
 
        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);
@@ -307,6 +329,88 @@ static int ejs_net_deleteuser(MprVarHandle eid, int argc, char **argv)
 }
 
 
+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);