Newer
Older
if((sys = (js_system_private_t*)js_GetClassPrivate(cx,obj,&js_system_class))==NULL)
return JS_FALSE;
JS_ValueToInt32(cx,argv[0],&field);
rc=JS_SUSPENDREQUEST(cx);
len=user_field_len(field);
JS_RESUMEREQUEST(cx, rc);
if(len < 1) {
JS_ReportError(cx,"Invalid user field: %d", field);
return(JS_FALSE);
if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
return(JS_TRUE);
}
if(JSVAL_IS_BOOLEAN(argv[argnum]))
JS_ValueToBoolean(cx, argv[argnum], &match_del);
if(JSVAL_IS_NUMBER(argv[argnum]))
JS_ValueToInt32(cx, argv[argnum++], &usernumber);
if(JSVAL_IS_BOOLEAN(argv[argnum]))
JS_ValueToBoolean(cx, argv[argnum], &match_next);
JSSTRING_TO_ASTRING(cx, js_str, p, 128, NULL);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
return(JS_TRUE);
}
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(finduserstr(sys->cfg, usernumber, field, p, match_del, match_next, NULL, NULL)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
static JSBool
js_find_login_id(JSContext *cx, uintN argc, jsval *arglist)
{
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char* p;
JSString* js_str;
jsrefcount rc;
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_str=JS_ValueToString(cx, argv[0]))==NULL) {
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
return(JS_TRUE);
}
JSSTRING_TO_ASTRING(cx, js_str, p, (LEN_ALIAS > LEN_NAME) ? LEN_ALIAS+2:LEN_NAME+2, NULL);
if(p==NULL) {
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
return(JS_TRUE);
}
rc=JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(find_login_id(sys->cfg, p)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
#endif
js_trashcan(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);
char* can = NULL;
JSString* js_str;
JSString* js_can;
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(array == NULL || !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);
ret = findstr_in_list(str, list, NULL);
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);
}
/* Convert between string and time_t representations of date */
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;
enum date_fmt fmt;
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;
fmt = sys->cfg->sys_date_fmt;
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(fmt, p)));
return(JS_TRUE);
}
JS_ValueToECMAUint32(cx,argv[0],(uint32_t*)&t);
datestr(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, sys->mqtt, 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, sys->mqtt, 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;
jsint duration = 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;
for(i=0; i<argc && fname == NULL; i++) {
if(JSVAL_IS_NUMBER(argv[i])) {
JS_ValueToInt32(cx, argv[i], &duration);
continue;
}
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, duration);
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;
}
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
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;
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
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
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
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
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(objarg != NULL && (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(objarg != NULL && (cl=JS_GetClass(cx,objarg))!=NULL && strcmp(cl->name,"Client")==0)
client=JS_GetPrivate(cx,objarg);
}
}
if(client!=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, NULL, &user, /* client: */NULL, /* global_user: */FALSE, (struct mqtt*)NULL);
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);
}
js_chkname(JSContext *cx, uintN argc, jsval *arglist)
JSObject *obj=JS_THIS_OBJECT(cx, arglist);
jsval *argv=JS_ARGV(cx, arglist);