1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

r8337: - use 64 bit access functions in ejs calls

- added access to smbd random functions

- fixed ordering in join()

- added sys_interfaces(), sys_hostname(), sys_nttime() and sys_ldaptime()
This commit is contained in:
Andrew Tridgell 2005-07-12 02:34:49 +00:00 committed by Gerald (Jerry) Carter
parent 9dd41e78e1
commit 28c1a1f3c0
9 changed files with 230 additions and 23 deletions

View File

@ -22,6 +22,8 @@ OBJ_FILES = \
scripting/ejs/smbcalls_options.o \
scripting/ejs/smbcalls_nss.o \
scripting/ejs/smbcalls_string.o \
scripting/ejs/smbcalls_rand.o \
scripting/ejs/smbcalls_sys.o \
scripting/ejs/mprutil.o
REQUIRED_SUBSYSTEMS = AUTH EJS LIBBASIC EJSRPC MESSAGING
# End SUBSYSTEM SMBCALLS

View File

@ -211,7 +211,7 @@ struct MprVar mprLdbArray(struct ldb_message **msg, int count, const char *name)
*/
const char *mprToString(const struct MprVar *v)
{
if (v->type != MPR_TYPE_STRING) return NULL;
if (!mprVarIsString(v->type)) return NULL;
return v->string;
}
@ -220,8 +220,8 @@ const char *mprToString(const struct MprVar *v)
*/
int mprToInt(const struct MprVar *v)
{
if (v->type != MPR_TYPE_INT) return 0;
return v->integer;
if (!mprVarIsNumber(v->type)) return 0;
return mprVarToNumber(v);
}
/*
@ -249,6 +249,38 @@ const char **mprToList(TALLOC_CTX *mem_ctx, struct MprVar *v)
return list;
}
/*
turn a MprVar object variable into a string list
this assumes the object variable is an array of strings
*/
const char **mprToArray(TALLOC_CTX *mem_ctx, struct MprVar *v)
{
const char **list = NULL;
struct MprVar *len;
int length, i;
len = mprGetProperty(v, "length", NULL);
if (len == NULL) {
return NULL;
}
length = mprToInt(len);
for (i=0;i<length;i++) {
char idx[16];
struct MprVar *vs;
mprItoa(i, idx, sizeof(idx));
vs = mprGetProperty(v, idx, NULL);
if (vs == NULL || vs->type != MPR_TYPE_STRING) {
talloc_free(list);
return NULL;
}
list = str_list_add(list, mprToString(vs));
}
talloc_steal(mem_ctx, list);
return list;
}
/*
turn a NTSTATUS into a MprVar object with lots of funky properties
*/

View File

@ -64,21 +64,6 @@ static int ejs_typeof(MprVarHandle eid, int argc, struct MprVar **argv)
return 0;
}
/*
return the list of configured network interfaces
*/
static int ejs_IfaceList(MprVarHandle eid, int argc, struct MprVar **argv)
{
int i, count = iface_count();
struct MprVar ret = mprObject("interfaces");
for (i=0;i<count;i++) {
mprAddArray(&ret, i, mprString(iface_n_ip(i)));
}
mpr_Return(eid, ret);
return 0;
}
/*
libinclude() allows you to include js files using a search path specified
in "js include =" in smb.conf.
@ -139,9 +124,10 @@ void smb_setup_ejs_functions(void)
smb_setup_ejs_options();
smb_setup_ejs_nss();
smb_setup_ejs_string();
smb_setup_ejs_random();
smb_setup_ejs_system();
ejsDefineCFunction(-1, "typeof", ejs_typeof, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "IfaceList", ejs_IfaceList, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineStringCFunction(-1, "libinclude", ejs_libinclude, NULL, MPR_VAR_SCRIPT_HANDLE);
}

View File

@ -60,7 +60,7 @@ static int ejs_resolve_name(MprVarHandle eid, int argc, struct MprVar **argv)
if (argc == 2) {
make_nbt_name_client(&name, mprToString(argv[1]));
} else {
if (argv[1]->type != MPR_TYPE_INT) {
if (!mprVarIsNumber(argv[1]->type)) {
ejsSetErrorMsg(eid, "resolveName invalid arguments");
goto done;
}

View File

@ -93,7 +93,7 @@ static int ejs_getpwnam(MprVarHandle eid, int argc, struct MprVar **argv)
static int ejs_getpwuid(MprVarHandle eid, int argc, struct MprVar **argv)
{
/* validate arguments */
if (argc != 1 || argv[0]->type != MPR_TYPE_INT) {
if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
ejsSetErrorMsg(eid, "getpwuid invalid arguments");
return -1;
}

View File

@ -73,7 +73,7 @@ static int ejs_GetOptions(MprVarHandle eid, int argc, struct MprVar **argv)
return -1;
}
opt_argv = mprToList(tmp_ctx, argv[0]);
opt_argv = mprToArray(tmp_ctx, argv[0]);
options = argv[1];
opt_argc = str_list_length(opt_argv);

View File

@ -0,0 +1,92 @@
/*
Unix SMB/CIFS implementation.
provide access to randomisation functions
Copyright (C) Andrew Tridgell 2005
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
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
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.
*/
#include "includes.h"
#include "scripting/ejs/smbcalls.h"
#include "lib/ejs/ejs.h"
#include "system/passwd.h"
/*
usage:
var i = random();
*/
static int ejs_random(MprVarHandle eid, int argc, struct MprVar **argv)
{
mpr_Return(eid, mprCreateIntegerVar(generate_random()));
return 0;
}
/*
usage:
var s = randpass(len);
*/
static int ejs_randpass(MprVarHandle eid, int argc, struct MprVar **argv)
{
char *s;
if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
ejsSetErrorMsg(eid, "randpass invalid arguments");
return -1;
}
s = generate_random_str(mprMemCtx(), mprToInt(argv[0]));
mpr_Return(eid, mprString(s));
talloc_free(s);
return 0;
}
/*
usage:
var guid = randguid();
*/
static int ejs_randguid(MprVarHandle eid, int argc, struct MprVar **argv)
{
struct GUID guid = GUID_random();
char *s = GUID_string(mprMemCtx(), &guid);
mpr_Return(eid, mprString(s));
talloc_free(s);
return 0;
}
/*
usage:
var sid = randsid();
*/
static int ejs_randsid(MprVarHandle eid, int argc, struct MprVar **argv)
{
char *s = talloc_asprintf(mprMemCtx(), "S-1-5-21-%8u-%8u-%8u",
(unsigned)generate_random(),
(unsigned)generate_random(),
(unsigned)generate_random());
mpr_Return(eid, mprString(s));
talloc_free(s);
return 0;
}
/*
setup C functions that be called from ejs
*/
void smb_setup_ejs_random(void)
{
ejsDefineCFunction(-1, "random", ejs_random, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "randpass", ejs_randpass, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "randguid", ejs_randguid, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "randsid", ejs_randsid, NULL, MPR_VAR_SCRIPT_HANDLE);
}

View File

@ -115,7 +115,7 @@ static int ejs_join(MprVarHandle eid, int argc, struct MprVar **argv)
}
separator = mprToString(argv[0]);
list = mprToList(tmp_ctx, argv[1]);
list = mprToArray(tmp_ctx, argv[1]);
if (list == NULL || list[0] == NULL) {
talloc_free(tmp_ctx);

View File

@ -0,0 +1,95 @@
/*
Unix SMB/CIFS implementation.
provide access to system functions
Copyright (C) Andrew Tridgell 2005
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
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
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.
*/
#include "includes.h"
#include "scripting/ejs/smbcalls.h"
#include "lib/ejs/ejs.h"
/*
return the list of configured network interfaces
*/
static int ejs_sys_interfaces(MprVarHandle eid, int argc, struct MprVar **argv)
{
int i, count = iface_count();
struct MprVar ret = mprObject("interfaces");
for (i=0;i<count;i++) {
mprAddArray(&ret, i, mprString(iface_n_ip(i)));
}
mpr_Return(eid, ret);
return 0;
}
/*
return the hostname from gethostname()
*/
static int ejs_sys_hostname(MprVarHandle eid, int argc, struct MprVar **argv)
{
char name[200];
if (gethostname(name, sizeof(name)-1) == -1) {
ejsSetErrorMsg(eid, "gethostname failed - %s", strerror(errno));
return -1;
}
mpr_Return(eid, mprString(name));
return 0;
}
/*
return current time as a 64 bit nttime value
*/
static int ejs_sys_nttime(MprVarHandle eid, int argc, struct MprVar **argv)
{
struct timeval tv = timeval_current();
struct MprVar v = mprCreateNumberVar(timeval_to_nttime(&tv));
mpr_Return(eid, v);
return 0;
}
/*
return a ldap time string from a nttime
*/
static int ejs_sys_ldaptime(MprVarHandle eid, int argc, struct MprVar **argv)
{
char *s;
time_t t;
if (argc != 1 || !mprVarIsNumber(argv[0]->type)) {
ejsSetErrorMsg(eid, "sys_ldaptime invalid arguments");
return -1;
}
t = nt_time_to_unix(mprVarToNumber(argv[0]));
s = ldap_timestring(mprMemCtx(), t);
mpr_Return(eid, mprString(s));
talloc_free(s);
return 0;
}
/*
setup C functions that be called from ejs
*/
void smb_setup_ejs_system(void)
{
ejsDefineCFunction(-1, "sys_interfaces", ejs_sys_interfaces, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "sys_hostname", ejs_sys_hostname, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "sys_nttime", ejs_sys_nttime, NULL, MPR_VAR_SCRIPT_HANDLE);
ejsDefineCFunction(-1, "sys_ldaptime", ejs_sys_ldaptime, NULL, MPR_VAR_SCRIPT_HANDLE);
}