Merge branch 'v4-0-trivial' into v4-0-test
[kai/samba.git] / source / scripting / ejs / smbcalls.c
index 3ca6003ee4c356a78ab90153363d761fd4f23aac..63a80e17db65a85fce6a17bba418f1f66538f5ee 100644 (file)
@@ -8,7 +8,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
-#include "lib/ejs/ejs.h"
-#include "auth/auth.h"
+#include "param/param.h"
+#include "scripting/ejs/smbcalls.h"
+#include "build.h"
+#include "version.h"
 
 /*
   return the type of a variable
@@ -44,7 +45,8 @@ static int ejs_typeof(MprVarHandle eid, int argc, struct MprVar **argv)
                { MPR_TYPE_OBJECT,           "object" },
                { MPR_TYPE_FUNCTION,         "function" },
                { MPR_TYPE_STRING,           "string" },
-               { MPR_TYPE_STRING_CFUNCTION, "function" }
+               { MPR_TYPE_STRING_CFUNCTION, "function" },
+               { MPR_TYPE_PTR,              "pointer" }
        };
        int i;
        const char *type = NULL;
@@ -59,137 +61,139 @@ static int ejs_typeof(MprVarHandle eid, int argc, struct MprVar **argv)
        }
        if (type == NULL) return -1;
 
-       ejsSetReturnString(eid, type);
+       mpr_ReturnString(eid, type);
        return 0;
 }
 
 /*
-  setup a return of a string list
+  return the native type of a variable
 */
- void ejs_returnlist(MprVarHandle eid, const char *name, const char **list)
+static int ejs_typeof_native(MprVarHandle eid, int argc, struct MprVar **argv)
 {
-       ejsSetReturnValue(eid, mprList(name, list));
-}
-
-static int ejs_systemAuth(TALLOC_CTX *tmp_ctx, struct MprVar *auth, const char *username, const char *password, const char *domain, const char *remote_host)
-{
-       struct auth_usersupplied_info *user_info = NULL;
-       struct auth_serversupplied_info *server_info = NULL;
-       struct auth_context *auth_context;
-       const char *auth_unix[] = { "unix", NULL };
-       NTSTATUS nt_status;
-       DATA_BLOB pw_blob;
-
-       nt_status = auth_context_create(tmp_ctx, auth_unix, &auth_context);
-       if (!NT_STATUS_IS_OK(nt_status)) {
-               mprSetPropertyValue(auth, "result", mprCreateBoolVar(False));
-               mprSetPropertyValue(auth, "report", mprCreateStringVar("Auth System Failure", 0));
-               goto done;
-       }
+       const struct {
+               MprType type;
+               const char *name;
+       } types[] = {
+               { MPR_TYPE_UNDEFINED,        "undefined" },
+               { MPR_TYPE_NULL,             "null" },
+               { MPR_TYPE_BOOL,             "boolean" },
+               { MPR_TYPE_CFUNCTION,        "c_function" },
+               { MPR_TYPE_FLOAT,            "float" },
+               { MPR_TYPE_INT,              "integer" },
+               { MPR_TYPE_INT64,            "integer64" },
+               { MPR_TYPE_OBJECT,           "object" },
+               { MPR_TYPE_FUNCTION,         "js_function" },
+               { MPR_TYPE_STRING,           "string" },
+               { MPR_TYPE_STRING_CFUNCTION, "string_c_function" },
+               { MPR_TYPE_PTR,              "pointer" }
+       };
+       int i;
+       const char *type = NULL;
 
-       pw_blob = data_blob(password, strlen(password)),
-       make_user_info(tmp_ctx, username, username,
-                               domain, domain,
-                               remote_host, remote_host,
-                               NULL, NULL,
-                               NULL, NULL,
-                               &pw_blob, False,
-                               USER_INFO_CASE_INSENSITIVE_USERNAME |
-                               USER_INFO_DONT_CHECK_UNIX_ACCOUNT,
-                               &user_info);
-       nt_status = auth_check_password(auth_context, tmp_ctx, user_info, &server_info);
-       if (!NT_STATUS_IS_OK(nt_status)) {
-               mprSetPropertyValue(auth, "result", mprCreateBoolVar(False));
-               mprSetPropertyValue(auth, "report", mprCreateStringVar("Login Failed", 0));
-               goto done;
+       if (argc != 1) return -1;
+       
+       for (i=0;i<ARRAY_SIZE(types);i++) {
+               if (argv[0]->type == types[i].type) {
+                       type = types[i].name;
+                       break;
+               }
        }
+       if (type == NULL) return -1;
 
-       mprSetPropertyValue(auth, "result", mprCreateBoolVar(server_info->authenticated));
-       mprSetPropertyValue(auth, "username", mprCreateStringVar(server_info->account_name, 0));
-       mprSetPropertyValue(auth, "domain", mprCreateStringVar(server_info->domain_name, 0));
-
-done:
+       mpr_ReturnString(eid, type);
        return 0;
 }
 
 /*
-  perform user authentication, returning an array of results
-
-  syntax:
-    var authinfo = new Object();
-    authinfo.username = myname;
-    authinfo.password = mypass;
-    authinfo.domain = mydom;
-    authinfo.rhost = request['REMOTE_HOST'];
-    auth = userAuth(authinfo);
+  libinclude() allows you to include js files using a search path specified
+  in "js include =" in smb.conf. 
 */
-static int ejs_userAuth(MprVarHandle eid, int argc, struct MprVar **argv)
+static int ejs_libinclude(int eid, int argc, char **argv)
 {
-       TALLOC_CTX *tmp_ctx;
-       const char *username;
-       const char *password;
-       const char *domain;
-       const char *remote_host;
-       struct MprVar auth;
-
-       if (argc != 1 || argv[0]->type != MPR_TYPE_OBJECT) {
-               ejsSetErrorMsg(eid, "userAuth invalid arguments, this function requires an object.");
+       int i, j;
+       const char **js_include = lp_js_include(mprLpCtx());
+
+       if (js_include == NULL || js_include[0] == NULL) {
+               ejsSetErrorMsg(eid, "js include path not set");
                return -1;
        }
 
-       username = mprToString(mprGetProperty(argv[0], "username", NULL));
-       password = mprToString(mprGetProperty(argv[0], "password", NULL));
-       domain = mprToString(mprGetProperty(argv[0], "domain", NULL));
-       remote_host = mprToString(mprGetProperty(argv[0], "rhost", NULL));
-
-       tmp_ctx = talloc_new(mprMemCtx());      
-       auth = mprCreateObjVar("auth", MPR_DEFAULT_HASH_SIZE);
-
-       if (strcmp("System User", domain) == 0) {
-
-               ejs_systemAuth(tmp_ctx, &auth, username, password, domain, remote_host);
-       }  else {
+       for (i = 0; i < argc; i++) {
+               const char *script = argv[i];
+               struct MprVar result;
+               char *path, *emsg;
+               int ret;
+
+               /* use specfied path to search for requested file */
+               for (j=0;js_include[j];j++) {
+                       path = talloc_asprintf(mprMemCtx(), "%s/%s", js_include[j], script);
+                       if (path == NULL) {
+                               return -1;
+                       }
+                       if (file_exist(path)) {
+
+                               ret = ejsEvalFile(eid, path, &result, &emsg);
+                               talloc_free(path);
+                               if (ret < 0) {
+                                       ejsSetErrorMsg(eid, "%s: %s", script, emsg);
+                                       return -1;
+                               }
+                               break;
+                       }
+                       talloc_free(path);
+               }
 
-               mprSetPropertyValue(&auth, "result", mprCreateBoolVar(False));
-               mprSetPropertyValue(&auth, "report", mprCreateStringVar("Unknown Domain", 0));
+               if (js_include[j] == NULL) {
+                       ejsSetErrorMsg(eid, "unable to include '%s'", script);
+                       return -1;
+               }
        }
-
-done:
-       ejsSetReturnValue(eid, auth);
-       talloc_free(tmp_ctx);
        return 0;
 }
 
-static int ejs_domain_list(MprVarHandle eid, int argc, char **argv)
+/*
+  return the current version
+*/
+static int ejs_version(MprVarHandle eid, int argc, struct MprVar **argv)
 {
-       struct MprVar list;
-       struct MprVar dom;
-
-       if (argc != 0) {
-               ejsSetErrorMsg(eid, "domList invalid arguments");
-               return -1;
-       }
+       mpr_ReturnString(eid, SAMBA_VERSION_STRING);
+       return 0;
+}
 
-       list = mprCreateObjVar("list", MPR_DEFAULT_HASH_SIZE);
-       dom = mprCreateStringVar("System User", 1);
-       mprCreateProperty(&list, "0", &dom);
 
-       ejsSetReturnValue(eid, list);
+static void (*ejs_exception_handler) (const char *) = NULL;
 
-       return 0;
+_PUBLIC_ void ejs_exception(const char *reason)
+{
+       ejs_exception_handler(reason);          
 }
 
-
 /*
   setup C functions that be called from ejs
 */
-void smb_setup_ejs_functions(void)
+void smb_setup_ejs_functions(void (*exception_handler)(const char *))
 {
-       smb_setup_ejs_config();
-       smb_setup_ejs_ldb();
-       smb_setup_ejs_nbt();
+       init_module_fn static_init[] = { STATIC_smbcalls_MODULES };
+       init_module_fn *shared_init;
+
+       ejs_exception_handler = exception_handler;
+
+       smb_setup_ejs_cli();
+       smb_setup_ejs_options();
+       smb_setup_ejs_credentials();
+       smb_setup_ejs_param();
+        smb_setup_ejs_literal();
+       
+       shared_init = load_samba_modules(NULL, mprLpCtx(), "smbcalls");
+       
+       run_init_functions(static_init);
+       run_init_functions(shared_init);
+
+       talloc_free(shared_init);
 
        ejsDefineCFunction(-1, "typeof", ejs_typeof, NULL, MPR_VAR_SCRIPT_HANDLE);
-       ejsDefineStringCFunction(-1, "getDomainList", ejs_domain_list, NULL, MPR_VAR_SCRIPT_HANDLE);
-       ejsDefineCFunction(-1, "userAuth", ejs_userAuth, NULL, MPR_VAR_SCRIPT_HANDLE);
+       ejsDefineCFunction(-1, "nativeTypeOf", ejs_typeof_native, NULL, MPR_VAR_SCRIPT_HANDLE);
+       ejsDefineStringCFunction(-1, "libinclude", ejs_libinclude, NULL, MPR_VAR_SCRIPT_HANDLE);
+       ejsDefineCFunction(-1, "version", ejs_version, NULL, MPR_VAR_SCRIPT_HANDLE);
 }
+