r25026: Move param/param.h out of includes.h
[kai/samba.git] / source4 / scripting / ejs / smbcalls.c
index 3ca6003ee4c356a78ab90153363d761fd4f23aac..08b9eac5c1a37b3e6177ea59b535276f67b28e82 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,185 @@ 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();
+
+       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;
+               }
        }
+       return 0;
+}
 
-done:
-       ejsSetReturnValue(eid, auth);
-       talloc_free(tmp_ctx);
+/*
+  return the current version
+*/
+static int ejs_version(MprVarHandle eid, int argc, struct MprVar **argv)
+{
+       mpr_ReturnString(eid, SAMBA_VERSION_STRING);
        return 0;
 }
 
-static int ejs_domain_list(MprVarHandle eid, int argc, char **argv)
+
+/*
+ * jsonrpc_include() allows you to include jsonrpc files from a path based at
+ * "jsonrpc services directory =" in smb.conf.
+ */
+static int jsonrpc_include(int eid, int argc, char **argv)
 {
-       struct MprVar list;
-       struct MprVar dom;
+        int ret = -1;
+        char *path;
+        char *emsg;
+       const char *jsonrpc_services_dir = lp_jsonrpc_services_dir();
+        struct MprVar result;
+
 
-       if (argc != 0) {
-               ejsSetErrorMsg(eid, "domList invalid arguments");
+       if (jsonrpc_services_dir == NULL || jsonrpc_services_dir == NULL) {
+               ejsSetErrorMsg(eid, "'jsonrpc services directory' not set");
                return -1;
        }
 
-       list = mprCreateObjVar("list", MPR_DEFAULT_HASH_SIZE);
-       dom = mprCreateStringVar("System User", 1);
-       mprCreateProperty(&list, "0", &dom);
-
-       ejsSetReturnValue(eid, list);
-
+        if (argc != 1) {
+                mpr_Return(eid, mprCreateIntegerVar(-1));
+               return 0;
+        }
+
+        path = talloc_asprintf(mprMemCtx(), "%s/%s",
+                               jsonrpc_services_dir,
+                               argv[0]);
+        if (path == NULL) {
+                mpr_Return(eid, mprCreateIntegerVar(-1));
+                return 0;
+        }
+
+        if (file_exist(path)) {
+                ret = ejsEvalFile(eid, path, &result, &emsg);
+                if (ret < 0) {
+                        ejsSetErrorMsg(eid, "Could not eval file");
+                        printf("file found; ret=%d (%s)\n", ret, emsg);
+                }
+        }
+        
+        mpr_Return(eid, mprCreateIntegerVar(ret));
+        talloc_free(path);
        return 0;
 }
 
 
+static void (*ejs_exception_handler) (const char *) = NULL;
+
+_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, "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);
+       ejsDefineStringCFunction(-1, "jsonrpc_include", jsonrpc_include, NULL, MPR_VAR_SCRIPT_HANDLE);
 }
+