Newer
Older
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
if((js_can=JS_ValueToString(cx, argv[0]))==NULL) {
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
return(JS_TRUE);
}
if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
HANDLE_PENDING(cx, can);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
JSSTRING_TO_MSTRING(cx, js_str, str, NULL);
if(JS_IsExceptionPending(cx)) {
FREE_AND_NULL(str);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
rc=JS_SUSPENDREQUEST(cx);
ret=trashcan(sys->cfg,str,can);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
static JSBool
js_findstr(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
char* str;
char* fname = NULL;
JSString* js_str;
JSString* js_fname;
if(JSVAL_IS_OBJECT(argv[0]) && !JSVAL_IS_NULL(argv[0])) {
JSObject* array = JSVAL_TO_OBJECT(argv[0]);
if(!JS_IsArrayObject(cx, array))
return(JS_TRUE);
jsuint count;
if(!JS_GetArrayLength(cx, array, &count))
return(JS_TRUE);
char* tmp = NULL;
size_t tmplen = 0;
for(jsuint i = 0; i < count; i++) {
jsval val;
if(!JS_GetElement(cx, array, i, &val))
break;
if(!JSVAL_IS_STRING(val)) /* must be an array of strings */
break;
JSVALUE_TO_RASTRING(cx, val, tmp, &tmplen, NULL);
HANDLE_PENDING(cx, tmp);
strListPush(&list, tmp);
}
free(tmp);
else {
if((js_fname=JS_ValueToString(cx, argv[0]))==NULL) {
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
return(JS_TRUE);
}
JSSTRING_TO_MSTRING(cx, js_fname, fname, NULL);
HANDLE_PENDING(cx, fname);
if(fname==NULL) {
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
return(JS_TRUE);
}
if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
return(JS_TRUE);
}
JSSTRING_TO_MSTRING(cx, js_str, str, NULL);
if(JS_IsExceptionPending(cx)) {
FREE_AND_NULL(str);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(JS_FALSE));
return(JS_TRUE);
}
rc=JS_SUSPENDREQUEST(cx);
if(list != NULL)
ret = findstr_in_list(str, list);
else
ret = findstr(str, fname);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
return(JS_TRUE);
}
js_zonestr(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
int32 val=0;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
if(argc<1)
zone=sys_timezone(sys->cfg);
else {
JS_ValueToInt32(cx,argv[0],&val);
zone=(short)val;
}
rc=JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
if((js_str = JS_NewStringCopyZ(cx, cstr))==NULL)
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
/* Returns a ctime()-like string in the system-preferred time format */

rswindell
committed
static JSBool
js_timestr(JSContext *cx, uintN argc, jsval *arglist)

rswindell
committed
{
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);

rswindell
committed
char str[128];
jsdouble ti;

rswindell
committed
JSString* js_str;

rswindell
committed
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;

rswindell
committed
if(argc<1)
ti=(jsdouble)time(NULL); /* use current time */

rswindell
committed
else
if(!JS_ValueToNumber(cx,argv[0],&ti))
return JS_TRUE;
rc=JS_SUSPENDREQUEST(cx);
timestr(sys->cfg,(time32_t)ti,str);
JS_RESUMEREQUEST(cx, rc);
if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
return(JS_FALSE);

rswindell
committed
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));

rswindell
committed
return(JS_TRUE);
}
/* Returns a mm/dd/yy or dd/mm/yy formated string */
static JSBool
js_datestr(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char str[128];
time32_t t;
JSString* js_str;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
if(argc<1)
t=time32(NULL); /* use current time */
else {
if(JSVAL_IS_STRING(argv[0])) { /* convert from string to time_t? */
JS_SET_RVAL(cx, arglist, DOUBLE_TO_JSVAL((double)dstrtounix(sys->cfg, p)));
return(JS_TRUE);
}
JS_ValueToECMAUint32(cx,argv[0],(uint32_t*)&t);
unixtodstr(sys->cfg,t,str);
if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}
static JSBool
js_secondstr(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
char str[128];
JSString* js_str;
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
if(!js_argc(cx, argc, 1))
return JS_FALSE;
if(JSVAL_NULL_OR_VOID(argv[0])) {
JS_ReportError(cx, "Invalid argument");
return JS_FALSE;
}
JS_ValueToECMAUint32(cx,argv[0],&t);
sectostr(t,str);
if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}
#ifndef JSDOOR
js_spamlog(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char* action=NULL;
char* reason=NULL;
char* host=NULL;
char* ip_addr=NULL;
char* to=NULL;
char* from=NULL;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
for(i=0;i<argc && from == NULL;i++) {
if(!JSVAL_IS_STRING(argv[i]))
continue;
JSVALUE_TO_MSTRING(cx, argv[i], p, NULL);
if(p == NULL || JS_IsExceptionPending(cx)) {
free(prot);
free(action);
free(reason);
free(host);
free(ip_addr);
free(to);
free(p);
return JS_FALSE;
if(prot==NULL)
prot=p;
else if(action==NULL)
action=p;
else if(reason==NULL)
reason=p;
else if(host==NULL)
host=p;
else if(ip_addr==NULL)
ip_addr=p;
else if(to==NULL)
to=p;
else
from=p;
rc=JS_SUSPENDREQUEST(cx);
ret=spamlog(sys->cfg,/* mqtt: */NULL,prot,action,reason,host,ip_addr,to,from);
free(prot);
free(action);
free(reason);
free(host);
free(ip_addr);
free(to);
free(from);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
return(JS_TRUE);
}
static JSBool
js_hacklog(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
int32 i32=0;
char* prot=NULL;
char* user=NULL;
char* text=NULL;
char* host=NULL;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
memset(&addr,0,sizeof(addr));
for(i=0;i<argc;i++) {
if(JSVAL_IS_NUMBER(argv[i])) {
JS_ValueToInt32(cx,argv[i],&i32);
if(addr.in.sin_addr.s_addr==0)
addr.in.sin_addr.s_addr=i32;
continue;
}
if(!JSVAL_IS_STRING(argv[i]))
continue;
if(host==NULL) {
JSVALUE_TO_MSTRING(cx, argv[i], p, NULL);
if(JS_IsExceptionPending(cx) || p == NULL) {
free(prot);
free(user);
free(text);
free(p);
if(prot==NULL)
prot=p;
else if(user==NULL)
user=p;
else if(text==NULL)
text=p;
else
host=p;
rc=JS_SUSPENDREQUEST(cx);
ret=hacklog(sys->cfg,/* MQTT: */NULL,prot,user,text,host,&addr);
free(prot);
free(user);
free(text);
free(host);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
return(JS_TRUE);
}
js_filter_ip(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char* prot=NULL;
char* reason=NULL;
char* ip_addr=NULL;
char* from=NULL;
char* fname=NULL;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
for(i=0; i<argc && fname == NULL; i++) {
if(!JSVAL_IS_STRING(argv[i]))
continue;
JSVALUE_TO_MSTRING(cx, argv[i], p, NULL);
if(JS_IsExceptionPending(cx) || p == NULL) {
free(prot);
free(reason);
free(host);
free(ip_addr);
free(from);
free(p);
return JS_FALSE;
if(prot==NULL)
prot=p;
else if(reason==NULL)
reason=p;
else if(ip_addr==NULL)
ip_addr=p;
else if(from==NULL)
from=p;
fname=p;
rc=JS_SUSPENDREQUEST(cx);
ret=filter_ip(sys->cfg,prot,reason,host,ip_addr,from,fname);
free(prot);
free(reason);
free(host);
free(ip_addr);
free(from);
free(fname);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
static JSBool
js_get_node(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject* obj=JS_THIS_OBJECT(cx, arglist);
JSObject* nodeobj;
jsval* argv=JS_ARGV(cx, arglist);
node_t node = {0};
int32 node_num;
jsrefcount rc;
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
scfg_t* cfg = sys->cfg;
node_num=cfg->node_num;
if(argc) {
if(!JS_ValueToInt32(cx,argv[0],&node_num))
return JS_TRUE;
}
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
if(node_num<1)
node_num=1;
rc=JS_SUSPENDREQUEST(cx);
int retval = getnodedat(sys->cfg, node_num, &node, /* lockit: */FALSE, &sys->nodefile);
sys->nodegets++;
JS_RESUMEREQUEST(cx, rc);
if(retval != 0) {
JS_ReportError(cx, "getnodat(%d) returned %d", node_num, retval);
return JS_TRUE;
}
if((nodeobj = JS_NewObject(cx, NULL, NULL, obj)) == NULL) {
JS_ReportError(cx, "JS_NewObject failure");
return JS_TRUE;
}
JS_DefineProperty(cx, nodeobj, "status", INT_TO_JSVAL((int)node.status), NULL, NULL, JSPROP_ENUMERATE);
JS_DefineProperty(cx, nodeobj, "errors", INT_TO_JSVAL((int)node.errors), NULL, NULL, JSPROP_ENUMERATE);
JS_DefineProperty(cx, nodeobj, "action", INT_TO_JSVAL((int)node.action), NULL, NULL, JSPROP_ENUMERATE);
JS_DefineProperty(cx, nodeobj, "useron", INT_TO_JSVAL((int)node.useron), NULL, NULL, JSPROP_ENUMERATE);
JS_DefineProperty(cx, nodeobj, "connection", INT_TO_JSVAL((int)node.connection), NULL, NULL, JSPROP_ENUMERATE);
JS_DefineProperty(cx, nodeobj, "misc", INT_TO_JSVAL((int)node.misc), NULL, NULL, JSPROP_ENUMERATE);
JS_DefineProperty(cx, nodeobj, "aux", INT_TO_JSVAL((int)node.aux), NULL, NULL, JSPROP_ENUMERATE);
JS_DefineProperty(cx, nodeobj, "extaux", INT_TO_JSVAL((int)node.extaux), NULL, NULL, JSPROP_ENUMERATE);
JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(nodeobj));
return JS_TRUE;
}
js_get_node_message(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char* buf;
int32 node_num;
JSString* js_str;
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
scfg_t* cfg = sys->cfg;
node_num=cfg->node_num;
if(argc)
JS_ValueToInt32(cx,argv[0],&node_num);
if(node_num<1)
node_num=1;
rc=JS_SUSPENDREQUEST(cx);
buf=getnmsg(sys->cfg,node_num);
JS_RESUMEREQUEST(cx, rc);
if(buf==NULL)
return(JS_TRUE);
js_str=JS_NewStringCopyZ(cx, buf);
free(buf);
if(js_str==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}
js_put_node_message(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
int32 node=1;
JSString* js_msg;
char* msg = NULL;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
JS_ValueToInt32(cx,argv[0],&node);
if(node<1)
if((js_msg=JS_ValueToString(cx, argv[1]))==NULL)
return(JS_FALSE);
HANDLE_PENDING(cx, msg);
if(msg==NULL)
rc=JS_SUSPENDREQUEST(cx);
ret=putnmsg(sys->cfg,node,msg)==0;
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
return(JS_TRUE);
}
js_get_telegram(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char* buf;
int32 usernumber=1;
JSString* js_str;
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
JS_ValueToInt32(cx,argv[0],&usernumber);
if(usernumber<1)
usernumber=1;
rc=JS_SUSPENDREQUEST(cx);
buf=getsmsg(sys->cfg,usernumber);
JS_RESUMEREQUEST(cx, rc);
if(buf==NULL)
return(JS_TRUE);
js_str=JS_NewStringCopyZ(cx, buf);
free(buf);
if(js_str==NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}
js_put_telegram(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
int32 usernumber=1;
JSString* js_msg;
char* msg = NULL;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
JS_ValueToInt32(cx,argv[0],&usernumber);
if(usernumber<1)
usernumber=1;
if((js_msg=JS_ValueToString(cx, argv[1]))==NULL)
return(JS_FALSE);
HANDLE_PENDING(cx, msg);
rc=JS_SUSPENDREQUEST(cx);
ret=putsmsg(sys->cfg,usernumber,msg)==0;
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
return(JS_TRUE);
}

Rob Swindell
committed
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
static JSBool
js_notify(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
int32 usernumber=1;
JSString* js_subj;
JSString* js_msg;
char* subj;
char* msg = NULL;
jsrefcount rc;
BOOL ret;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
JS_ValueToInt32(cx,argv[0],&usernumber);
if(usernumber<1)
usernumber=1;
if((js_subj=JS_ValueToString(cx, argv[1]))==NULL)

Rob Swindell
committed
return JS_FALSE;
if(argc > 2) {
if((js_msg=JS_ValueToString(cx, argv[2]))==NULL)

Rob Swindell
committed
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
return JS_FALSE;
JSSTRING_TO_MSTRING(cx, js_msg, msg, NULL);
HANDLE_PENDING(cx, msg);
if(msg==NULL)
return JS_TRUE;
}
JSSTRING_TO_MSTRING(cx, js_subj, subj, NULL);
HANDLE_PENDING(cx,subj);
if(subj==NULL) {
free(msg);
return JS_TRUE;
}
rc=JS_SUSPENDREQUEST(cx);
ret=notify(sys->cfg, usernumber, subj, msg)==0;
free(subj);
free(msg);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(ret));
return JS_TRUE;
}
static JSBool
js_new_user(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char* alias;
int i;
uintN n;
user_t user;
JSObject* userobj;
JSObject* objarg;
JSClass* cl;
client_t* client=NULL;
jsval val;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
scfg_t* cfg = sys->cfg;
if(!js_argc(cx, argc, 1))
return JS_FALSE;
if(JSVAL_NULL_OR_VOID(argv[0])) {
JS_ReportError(cx, "Invalid argument");
return JS_FALSE;
}
JSVALUE_TO_ASTRING(cx, argv[0], alias, LEN_ALIAS+2, NULL);
rc=JS_SUSPENDREQUEST(cx);
if(!check_name(cfg,alias)) {
JS_RESUMEREQUEST(cx, rc);
JS_ReportError(cx,"Invalid or duplicate user alias: %s", alias);
return JS_FALSE;
}
memset(&user,0,sizeof(user));
for(n=0;n<argc;n++) {
if(JSVAL_IS_OBJECT(argv[n])) {
objarg = JSVAL_TO_OBJECT(argv[n]);
if((cl=JS_GetClass(cx,objarg))!=NULL && strcmp(cl->name,"Client")==0) {
client=JS_GetPrivate(cx,objarg);
continue;
}
}
}
// Find and use the global client object if possible...
if(client==NULL) {
if(JS_GetProperty(cx, JS_GetGlobalObject(cx), "client", &val) && !JSVAL_NULL_OR_VOID(val)) {
objarg = JSVAL_TO_OBJECT(val);
if((cl=JS_GetClass(cx,objarg))!=NULL && strcmp(cl->name,"Client")==0)
client=JS_GetPrivate(cx,objarg);
}
}
if(client!=NULL) {
if(client->protocol != NULL)
SAFECOPY(user.modem,client->protocol);
SAFECOPY(user.ipaddr,client->addr);
}
SAFECOPY(user.alias,alias);
i=newuserdat(cfg,&user);
JS_RESUMEREQUEST(cx, rc);
if(i==0) {
userobj=js_CreateUserObject(cx, obj, cfg, NULL, &user, /* client: */NULL, /* global_user: */FALSE);
JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(userobj));
} else
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(i));
return(JS_TRUE);
}
static JSBool
js_del_user(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
jsrefcount rc;
int32 n;
user_t user;
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
if(!JS_ValueToInt32(cx,argv[0],&n))
return(JS_FALSE);
user.number=n;
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE); /* fail, by default */
if(getuserdat(sys->cfg, &user)==0
&& putusermisc(sys->cfg, n, user.misc | DELETED)==0
&& putusername(sys->cfg,n,nulstr)==0)
JS_SET_RVAL(cx, arglist, JSVAL_TRUE); /* success */
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
#endif
static JSBool
js_sys_exec(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv=JS_ARGV(cx, arglist);
char *cmd = NULL;
HANDLE_PENDING(cx, cmd);
if(cmd==NULL) {
JS_ReportError(cx, "Illegal NULL command");
return JS_FALSE;
}
if(*cmd == 0) {
free(cmd);
JS_ReportError(cx, "Missing or invalid argument");
return JS_FALSE;
}
rc=JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_popen(JSContext *cx, uintN argc, jsval *arglist)
jsval *argv=JS_ARGV(cx, arglist);
char str[1024];
char* cmd = NULL;
FILE* fp;
jsint line=0;
jsval val;
JSObject* array;
JSString* js_str;
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if(!js_argc(cx, argc, 1))
return JS_FALSE;
if(JSVAL_NULL_OR_VOID(argv[0])) {
JS_ReportError(cx, "Invalid argument");
return JS_FALSE;
}
if((array=JS_NewArrayObject(cx,0,NULL))==NULL)
return(JS_FALSE);
HANDLE_PENDING(cx, cmd);
if(cmd==NULL) {
JS_ReportError(cx, "Illegal NULL command");
return JS_FALSE;
}
rc=JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
while(!feof(fp)) {
if(fgets(str,sizeof(str),fp)==NULL)
break;
JS_RESUMEREQUEST(cx, rc);
if((js_str=JS_NewStringCopyZ(cx,str))==NULL) {
rc=JS_SUSPENDREQUEST(cx);
val=STRING_TO_JSVAL(js_str);
if(!JS_SetElement(cx, array, line++, &val)) {
rc=JS_SUSPENDREQUEST(cx);
rc=JS_SUSPENDREQUEST(cx);
}
pclose(fp);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, OBJECT_TO_JSVAL(array));
return(JS_TRUE);
}
#ifndef JSDOOR
static JSBool
js_chksyspass(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
JSVALUE_TO_ASTRING(cx, argv[0], pass, LEN_PASS+2, NULL); // +2 is so overly long passwords fail.
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(stricmp(pass,sys->cfg->sys_pass)==0));
return(JS_TRUE);
}
static JSBool
js_chkname(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
JSVALUE_TO_ASTRING(cx, argv[0], str, (LEN_ALIAS > LEN_NAME)?LEN_ALIAS+2:LEN_NAME+2, NULL);
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(check_name(sys->cfg,str)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
static JSBool
js_chkfname(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject *obj = JS_THIS_OBJECT(cx, arglist);
jsval *argv = JS_ARGV(cx, arglist);
char* fname = NULL;
jsrefcount rc;
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if(argc < 1 || !JSVAL_IS_STRING(argv[0]))
return JS_TRUE;
js_system_private_t* sys;
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
JSVALUE_TO_MSTRING(cx, argv[0], fname, NULL);
if(fname == NULL)
return JS_FALSE;
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(!illegal_filename(fname)
&& allowed_filename(sys->cfg, fname)
&& !trashcan(sys->cfg, fname, "file")));
JS_RESUMEREQUEST(cx, rc);
free(fname);
return JS_TRUE;
}
static JSBool
js_safest_fname(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv = JS_ARGV(cx, arglist);
char* fname = NULL;
jsrefcount rc;
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if(argc < 1 || !JSVAL_IS_STRING(argv[0]))
return JS_TRUE;
JSVALUE_TO_MSTRING(cx, argv[0], fname, NULL);
if(fname == NULL)
return JS_FALSE;
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(safest_filename(fname)));
JS_RESUMEREQUEST(cx, rc);
free(fname);
return JS_TRUE;
}
static JSBool
js_illegal_fname(JSContext *cx, uintN argc, jsval *arglist)
{
jsval *argv = JS_ARGV(cx, arglist);
char* fname = NULL;
jsrefcount rc;
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if(argc < 1 || !JSVAL_IS_STRING(argv[0]))
return JS_TRUE;
JSVALUE_TO_MSTRING(cx, argv[0], fname, NULL);