Newer
Older
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* Synchronet JavaScript "User" Object */
/* $Id$ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2001 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* 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. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to mods@synchro.net *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
#ifdef JAVASCRIPT

rswindell
committed
typedef struct
{

rswindell
committed
scfg_t* cfg;
} private_t;
/* User Object Properites */
enum {
,USER_PROP_NAME
,USER_PROP_HANDLE
,USER_PROP_NOTE
,USER_PROP_COMP
,USER_PROP_COMMENT
,USER_PROP_NETMAIL

rswindell
committed
,USER_PROP_EMAIL /* READ ONLY */
,USER_PROP_ADDRESS
,USER_PROP_LOCATION
,USER_PROP_ZIPCODE
,USER_PROP_PASS
,USER_PROP_PHONE
,USER_PROP_BIRTH
,USER_PROP_AGE /* READ ONLY */
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
,USER_PROP_MODEM
,USER_PROP_LASTON
,USER_PROP_FIRSTON
,USER_PROP_EXPIRE
,USER_PROP_PWMOD
,USER_PROP_LOGONS
,USER_PROP_LTODAY
,USER_PROP_TIMEON
,USER_PROP_TEXTRA
,USER_PROP_TTODAY
,USER_PROP_TLAST
,USER_PROP_POSTS
,USER_PROP_EMAILS
,USER_PROP_FBACKS
,USER_PROP_ETODAY
,USER_PROP_PTODAY
,USER_PROP_ULB
,USER_PROP_ULS
,USER_PROP_DLB
,USER_PROP_DLS
,USER_PROP_CDT
,USER_PROP_MIN
,USER_PROP_LEVEL
,USER_PROP_FLAGS1
,USER_PROP_FLAGS2
,USER_PROP_FLAGS3
,USER_PROP_FLAGS4
,USER_PROP_EXEMPT
,USER_PROP_REST
,USER_PROP_ROWS
,USER_PROP_SEX
,USER_PROP_MISC
,USER_PROP_LEECH
,USER_PROP_CURSUB
,USER_PROP_CURDIR
,USER_PROP_CURXTRN
,USER_PROP_FREECDT
,USER_PROP_XEDIT
,USER_PROP_SHELL
,USER_PROP_QWK
,USER_PROP_TMPEXT
,USER_PROP_CHAT
,USER_PROP_NS_TIME
,USER_PROP_PROT
,USER_PROP_LOGONTIME
static JSBool js_user_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
char* s=NULL;
char tmp[128];
ulong val=0;

rswindell
committed
private_t* p;

rswindell
committed
if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
return(JS_FALSE);
user.number=p->usernumber;
getuserdat(p->cfg,&user);
tiny = JSVAL_TO_INT(id);
switch(tiny) {
case USER_PROP_NUMBER:
val=user.number;
break;
case USER_PROP_ALIAS:
break;
case USER_PROP_NAME:
break;
case USER_PROP_HANDLE:
break;
case USER_PROP_NOTE:
break;
case USER_PROP_COMP:
break;
case USER_PROP_COMMENT:
break;
case USER_PROP_NETMAIL:

rswindell
committed
case USER_PROP_EMAIL:
s=usermailaddr(p->cfg, tmp
,p->cfg->inetmail_misc&NMAIL_ALIAS ? user.alias : user.name);
break;
case USER_PROP_ADDRESS:
break;
case USER_PROP_LOCATION:
break;
case USER_PROP_ZIPCODE:
break;
case USER_PROP_PASS:
break;
case USER_PROP_PHONE:
break;
case USER_PROP_BIRTH:
break;
case USER_PROP_AGE:
break;
case USER_PROP_MODEM:
break;
case USER_PROP_LASTON:
break;
case USER_PROP_FIRSTON:
break;
case USER_PROP_EXPIRE:
break;
case USER_PROP_PWMOD:
break;
case USER_PROP_LOGONS:
break;
case USER_PROP_LTODAY:
break;
case USER_PROP_TIMEON:
break;
case USER_PROP_TEXTRA:
break;
case USER_PROP_TTODAY:
break;
case USER_PROP_TLAST:
break;
case USER_PROP_POSTS:
break;
case USER_PROP_EMAILS:
break;
case USER_PROP_FBACKS:
break;
case USER_PROP_ETODAY:
break;
case USER_PROP_PTODAY:
break;
case USER_PROP_ULB:
break;
case USER_PROP_ULS:
break;
case USER_PROP_DLB:
break;
case USER_PROP_DLS:
break;
case USER_PROP_CDT:
break;
case USER_PROP_MIN:
break;
case USER_PROP_LEVEL:
break;
case USER_PROP_FLAGS1:
break;
case USER_PROP_FLAGS2:
break;
case USER_PROP_FLAGS3:
break;
case USER_PROP_FLAGS4:
break;
case USER_PROP_EXEMPT:
break;
case USER_PROP_REST:
break;
case USER_PROP_ROWS:
break;
case USER_PROP_SEX:
s=tmp;
break;
break;
case USER_PROP_LEECH:
break;
case USER_PROP_CURSUB:
break;
case USER_PROP_CURDIR:
case USER_PROP_CURXTRN:
s=user.curxtrn;
break;
case USER_PROP_FREECDT:
break;
case USER_PROP_XEDIT:

rswindell
committed
if(user.xedit>0 && user.xedit<=p->cfg->total_xedits)
s=p->cfg->xedit[user.xedit-1]->code;
else
s=""; /* internal editor */
break;
case USER_PROP_SHELL:

rswindell
committed
s=p->cfg->shell[user.shell]->code;
case USER_PROP_QWK:
break;
case USER_PROP_TMPEXT:
break;
case USER_PROP_CHAT:
break;
case USER_PROP_NS_TIME:
val=user.ns_time;
break;
case USER_PROP_PROT:
s=tmp;
break;
case USER_PROP_LOGONTIME:
val=user.logontime;
break;
default:
/* This must not set vp in order for child objects to work (stats and security) */
return(JS_TRUE);
if(s!=NULL)
*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, s));
else
*vp = INT_TO_JSVAL(val);
return(JS_TRUE);
static JSBool js_user_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
char* str;
char tmp[64];
JSString* js_str;

rswindell
committed
private_t* p;

rswindell
committed
if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
return(JS_FALSE);
if((js_str=JS_ValueToString(cx,*vp))==NULL)
return(JS_FALSE);
if((str=JS_GetStringBytes(js_str))==NULL)
return(JS_FALSE);
tiny = JSVAL_TO_INT(id);
switch(tiny) {
JS_ValueToInt32(cx, *vp, (jsint*)&p->usernumber);
case USER_PROP_ALIAS:
/* update USER.DAT */
putuserrec(p->cfg,p->usernumber,U_ALIAS,LEN_ALIAS,str);
/* update NAME.DAT */
getuserrec(p->cfg,p->usernumber,U_MISC,8,tmp);
usermisc=ahtoul(tmp);
if(!(usermisc&DELETED))
putusername(p->cfg,p->usernumber,str);
break;
case USER_PROP_NAME:
putuserrec(p->cfg,p->usernumber,U_NAME,LEN_NAME,str);
break;
case USER_PROP_HANDLE:
putuserrec(p->cfg,p->usernumber,U_HANDLE,LEN_HANDLE,str);
break;
case USER_PROP_NOTE:
putuserrec(p->cfg,p->usernumber,U_NOTE,LEN_NOTE,str);
break;
case USER_PROP_COMP:
putuserrec(p->cfg,p->usernumber,U_COMP,LEN_COMP,str);
break;
case USER_PROP_COMMENT:
putuserrec(p->cfg,p->usernumber,U_COMMENT,LEN_COMMENT,str);
break;
case USER_PROP_NETMAIL:
putuserrec(p->cfg,p->usernumber,U_NETMAIL,LEN_NETMAIL,str);
break;
case USER_PROP_ADDRESS:
putuserrec(p->cfg,p->usernumber,U_ADDRESS,LEN_ADDRESS,str);
break;
case USER_PROP_LOCATION:
putuserrec(p->cfg,p->usernumber,U_LOCATION,LEN_LOCATION,str);
break;
case USER_PROP_ZIPCODE:
putuserrec(p->cfg,p->usernumber,U_ZIPCODE,LEN_ZIPCODE,str);
break;
case USER_PROP_PHONE:
putuserrec(p->cfg,p->usernumber,U_PHONE,LEN_PHONE,str);
break;
case USER_PROP_BIRTH:
putuserrec(p->cfg,p->usernumber,U_BIRTH,LEN_BIRTH,str);
break;
case USER_PROP_MODEM:
putuserrec(p->cfg,p->usernumber,U_MODEM,LEN_MODEM,str);
break;
case USER_PROP_ROWS:
putuserrec(p->cfg,p->usernumber,U_ROWS,2,str); /* base 10 */
break;
case USER_PROP_SEX:
putuserrec(p->cfg,p->usernumber,U_SEX,1,strupr(str)); /* single char */
break;
case USER_PROP_CURSUB:
putuserrec(p->cfg,p->usernumber,U_CURSUB,8,strupr(str));
break;
case USER_PROP_CURDIR:
putuserrec(p->cfg,p->usernumber,U_CURDIR,8,strupr(str));
case USER_PROP_CURXTRN:
putuserrec(p->cfg,p->usernumber,U_CURXTRN,8,strupr(str));
break;
case USER_PROP_XEDIT:
putuserrec(p->cfg,p->usernumber,U_XEDIT,8,strupr(str));
break;
case USER_PROP_SHELL:
putuserrec(p->cfg,p->usernumber,U_COMP,8,strupr(str));
break;
case USER_PROP_MISC:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_MISC,8,ultoa(val,tmp,16));
break;
case USER_PROP_QWK:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_QWK,8,ultoa(val,tmp,16));
break;
case USER_PROP_CHAT:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_CHAT,8,ultoa(val,tmp,16));
break;
case USER_PROP_TMPEXT:
putuserrec(p->cfg,p->usernumber,U_TMPEXT,3,str);
break;
case USER_PROP_NS_TIME:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_NS_TIME,8,ultoa(val,tmp,16));
break;
case USER_PROP_PROT:
putuserrec(p->cfg,p->usernumber,U_PROT,1,strupr(str)); /* single char */
case USER_PROP_LOGONTIME:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_LOGONTIME,8,ultoa(val,tmp,16));
break;
/* security properties*/
case USER_PROP_PASS:
putuserrec(p->cfg,p->usernumber,U_PASS,LEN_PASS,strupr(str));
break;
case USER_PROP_PWMOD:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_PWMOD,8,ultoa(val,tmp,16));
break;
case USER_PROP_LEVEL:
putuserrec(p->cfg,p->usernumber,U_LEVEL,2,str);
break;
case USER_PROP_FLAGS1:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_FLAGS1,8,ultoa(val,tmp,16));
break;
case USER_PROP_FLAGS2:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_FLAGS2,8,ultoa(val,tmp,16));
break;
case USER_PROP_FLAGS3:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_FLAGS3,8,ultoa(val,tmp,16));
break;
case USER_PROP_FLAGS4:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_FLAGS4,8,ultoa(val,tmp,16));
break;
case USER_PROP_EXEMPT:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_EXEMPT,8,ultoa(val,tmp,16));
break;
case USER_PROP_REST:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_REST,8,ultoa(val,tmp,16));
break;
case USER_PROP_CDT:
putuserrec(p->cfg,p->usernumber,U_CDT,10,str);
break;
case USER_PROP_FREECDT:
putuserrec(p->cfg,p->usernumber,U_FREECDT,10,str);
break;
case USER_PROP_MIN:
putuserrec(p->cfg,p->usernumber,U_MIN,10,str);
break;
case USER_PROP_TEXTRA:
putuserrec(p->cfg,p->usernumber,U_TEXTRA,5,str);
break;
case USER_PROP_EXPIRE:
JS_ValueToInt32(cx,*vp,&val);
putuserrec(p->cfg,p->usernumber,U_EXPIRE,8,ultoa(val,tmp,16));
return(JS_TRUE);
#define USER_PROP_FLAGS JSPROP_ENUMERATE
static struct JSPropertySpec js_user_properties[] = {
/* name ,tinyid ,flags, getter, setter */
{ "number" ,USER_PROP_NUMBER ,USER_PROP_FLAGS, NULL,NULL},
{ "alias" ,USER_PROP_ALIAS ,USER_PROP_FLAGS, NULL,NULL},
{ "name" ,USER_PROP_NAME ,USER_PROP_FLAGS, NULL,NULL},
{ "handle" ,USER_PROP_HANDLE ,USER_PROP_FLAGS, NULL,NULL},
{ "note" ,USER_PROP_NOTE ,USER_PROP_FLAGS, NULL,NULL},
{ "ip_address" ,USER_PROP_NOTE ,USER_PROP_FLAGS, NULL,NULL},
{ "computer" ,USER_PROP_COMP ,USER_PROP_FLAGS, NULL,NULL},
{ "host_name" ,USER_PROP_COMP ,USER_PROP_FLAGS, NULL,NULL},
{ "comment" ,USER_PROP_COMMENT ,USER_PROP_FLAGS, NULL,NULL},
{ "netmail" ,USER_PROP_NETMAIL ,USER_PROP_FLAGS, NULL,NULL},

rswindell
committed
{ "email" ,USER_PROP_EMAIL ,USER_PROP_FLAGS|JSPROP_READONLY, NULL,NULL},
{ "address" ,USER_PROP_ADDRESS ,USER_PROP_FLAGS, NULL,NULL},
{ "location" ,USER_PROP_LOCATION ,USER_PROP_FLAGS, NULL,NULL},
{ "zipcode" ,USER_PROP_ZIPCODE ,USER_PROP_FLAGS, NULL,NULL},
{ "phone" ,USER_PROP_PHONE ,USER_PROP_FLAGS, NULL,NULL},
{ "birthdate" ,USER_PROP_BIRTH ,USER_PROP_FLAGS, NULL,NULL},
{ "age" ,USER_PROP_AGE ,USER_PROP_FLAGS|JSPROP_READONLY, NULL,NULL},
{ "modem" ,USER_PROP_MODEM ,USER_PROP_FLAGS, NULL,NULL},
{ "connection" ,USER_PROP_MODEM ,USER_PROP_FLAGS, NULL,NULL},
{ "screen_rows" ,USER_PROP_ROWS ,USER_PROP_FLAGS, NULL,NULL},
{ "gender" ,USER_PROP_SEX ,USER_PROP_FLAGS, NULL,NULL},
{ "cursub" ,USER_PROP_CURSUB ,USER_PROP_FLAGS, NULL,NULL},
{ "curdir" ,USER_PROP_CURDIR ,USER_PROP_FLAGS, NULL,NULL},
{ "curxtrn" ,USER_PROP_CURXTRN ,USER_PROP_FLAGS, NULL,NULL},
{ "editor" ,USER_PROP_XEDIT ,USER_PROP_FLAGS, NULL,NULL},
{ "command_shell" ,USER_PROP_SHELL ,USER_PROP_FLAGS, NULL,NULL},
{ "settings" ,USER_PROP_MISC ,USER_PROP_FLAGS, NULL,NULL},
{ "qwk_settings" ,USER_PROP_QWK ,USER_PROP_FLAGS, NULL,NULL},
{ "chat_settings" ,USER_PROP_CHAT ,USER_PROP_FLAGS, NULL,NULL},
{ "temp_file_ext" ,USER_PROP_TMPEXT ,USER_PROP_FLAGS, NULL,NULL},
{ "newscan_date" ,USER_PROP_NS_TIME ,USER_PROP_FLAGS, NULL,NULL},
{ "download_protocol" ,USER_PROP_PROT ,USER_PROP_FLAGS, NULL,NULL},
{ "logontime" ,USER_PROP_LOGONTIME ,USER_PROP_FLAGS, NULL,NULL},
/* user.security */
static struct JSPropertySpec js_user_security_properties[] = {
/* name ,tinyid ,flags, getter, setter */
{ "password" ,USER_PROP_PASS ,USER_PROP_FLAGS, NULL,NULL},
{ "password_date" ,USER_PROP_PWMOD ,USER_PROP_FLAGS, NULL,NULL},
{ "level" ,USER_PROP_LEVEL ,USER_PROP_FLAGS, NULL,NULL},
{ "flags1" ,USER_PROP_FLAGS1 ,USER_PROP_FLAGS, NULL,NULL},
{ "flags2" ,USER_PROP_FLAGS2 ,USER_PROP_FLAGS, NULL,NULL},
{ "flags3" ,USER_PROP_FLAGS3 ,USER_PROP_FLAGS, NULL,NULL},
{ "flags4" ,USER_PROP_FLAGS4 ,USER_PROP_FLAGS, NULL,NULL},
{ "exemptions" ,USER_PROP_EXEMPT ,USER_PROP_FLAGS, NULL,NULL},
{ "restrictions" ,USER_PROP_REST ,USER_PROP_FLAGS, NULL,NULL},
{ "credits" ,USER_PROP_CDT ,USER_PROP_FLAGS, NULL,NULL},
{ "free_credits" ,USER_PROP_FREECDT ,USER_PROP_FLAGS, NULL,NULL},
{ "minutes" ,USER_PROP_MIN ,USER_PROP_FLAGS, NULL,NULL},
{ "extra_time" ,USER_PROP_TEXTRA ,USER_PROP_FLAGS, NULL,NULL},
{ "expiration_date" ,USER_PROP_EXPIRE ,USER_PROP_FLAGS, NULL,NULL},
#undef USER_PROP_FLAGS
#define USER_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
/* user.stats: These should be READ ONLY by nature */
static struct JSPropertySpec js_user_stats_properties[] = {
/* name ,tinyid ,flags, getter, setter */
{ "laston_date" ,USER_PROP_LASTON ,USER_PROP_FLAGS, NULL,NULL},
{ "firston_date" ,USER_PROP_FIRSTON ,USER_PROP_FLAGS, NULL,NULL},
{ "total_logons" ,USER_PROP_LOGONS ,USER_PROP_FLAGS, NULL,NULL},
{ "logons_today" ,USER_PROP_LTODAY ,USER_PROP_FLAGS, NULL,NULL},
{ "total_timeon" ,USER_PROP_TIMEON ,USER_PROP_FLAGS, NULL,NULL},
{ "timeon_today" ,USER_PROP_TTODAY ,USER_PROP_FLAGS, NULL,NULL},
{ "timeon_last_logon" ,USER_PROP_TLAST ,USER_PROP_FLAGS, NULL,NULL},
{ "total_posts" ,USER_PROP_POSTS ,USER_PROP_FLAGS, NULL,NULL},
{ "total_emails" ,USER_PROP_EMAILS ,USER_PROP_FLAGS, NULL,NULL},
{ "total_feedbacks" ,USER_PROP_FBACKS ,USER_PROP_FLAGS, NULL,NULL},
{ "email_today" ,USER_PROP_ETODAY ,USER_PROP_FLAGS, NULL,NULL},
{ "posts_today" ,USER_PROP_PTODAY ,USER_PROP_FLAGS, NULL,NULL},
{ "bytes_uploaded" ,USER_PROP_ULB ,USER_PROP_FLAGS, NULL,NULL},
{ "files_uploaded" ,USER_PROP_ULS ,USER_PROP_FLAGS, NULL,NULL},
{ "bytes_downloaded" ,USER_PROP_DLB ,USER_PROP_FLAGS, NULL,NULL},
{ "files_downloaded" ,USER_PROP_DLS ,USER_PROP_FLAGS, NULL,NULL},
{ "leech_attempts" ,USER_PROP_LEECH ,USER_PROP_FLAGS, NULL,NULL},

rswindell
committed
static void js_user_finalize(JSContext *cx, JSObject *obj)
{
private_t* p;
p=(private_t*)JS_GetPrivate(cx,obj);

rswindell
committed
free(p);
p=NULL;
JS_SetPrivate(cx,obj,p);
}
static JSBool
js_chk_ar(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{

rswindell
committed
JSString* js_str;

rswindell
committed
private_t* p;
if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
return JS_FALSE;
if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
return JS_FALSE;
ar = arstr(NULL,JS_GetStringBytes(js_str),p->cfg);
user.number=p->usernumber;
getuserdat(p->cfg,&user);
*rval = BOOLEAN_TO_JSVAL(chk_ar(p->cfg,ar,&user));

rswindell
committed
if(ar!=NULL && ar!=nular)
free(ar);
return(JS_TRUE);
}
static JSFunctionSpec js_user_functions[] = {
{"compare_ars", js_chk_ar, 1}, /* Verify ARS */
{0}
};
static JSClass js_user_class = {
"User" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */

rswindell
committed
,js_user_finalize /* finalize */
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
};
static JSClass js_user_stats_class = {
"UserStats" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
static JSClass js_user_security_class = {
"UserSecurity" /* name */
,JSCLASS_HAS_PRIVATE /* flags */
,JS_PropertyStub /* addProperty */
,JS_PropertyStub /* delProperty */
,js_user_get /* getProperty */
,js_user_set /* setProperty */
,JS_EnumerateStub /* enumerate */
,JS_ResolveStub /* resolve */
,JS_ConvertStub /* convert */
,JS_FinalizeStub /* finalize */
};
/* User Constructor (creates instance of user class) */
static JSBool
js_user_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
user_t user;
private_t* p;
JSObject* statsobj;
JSObject* securityobj;
user.number=(ushort)(JSVAL_TO_INT(argv[0]));
if(getuserdat(scfg,&user)!=0)
return(JS_FALSE);
/* user.stats */
if((statsobj=JS_DefineObject(cx, obj, "stats"
,&js_user_stats_class, NULL, 0))==NULL)
return(JS_FALSE);
JS_DefineProperties(cx, statsobj, js_user_stats_properties);
/* user.security */
if((securityobj=JS_DefineObject(cx, obj, "security"
,&js_user_security_class, NULL, 0))==NULL)
return(JS_FALSE);
JS_DefineProperties(cx, securityobj, js_user_security_properties);
if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
return(JS_FALSE);
p->cfg = scfg;
p->usernumber = user.number;
JS_SetPrivate(cx, obj, p);
JS_SetPrivate(cx, statsobj, p);
JS_SetPrivate(cx, securityobj, p);
return(JS_TRUE);
}
JSObject* DLLCALL js_CreateUserClass(JSContext* cx, JSObject* parent, scfg_t* cfg)
{
JSObject* userclass;
scfg = cfg;
userclass = JS_InitClass(cx, parent, NULL
,&js_user_class
,js_user_constructor
,1 /* number of constructor args */
,js_user_properties
,js_user_functions
,NULL,NULL);
return(userclass);
}
JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* cfg, char* name, uint usernumber)
{
JSObject* userobj;
JSObject* statsobj;
JSObject* securityobj;

rswindell
committed
private_t* p;
if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
return(NULL);
p->cfg = cfg;
userobj = JS_DefineObject(cx, parent, name, &js_user_class, NULL, 0);
if(userobj==NULL)
return(NULL);

rswindell
committed
JS_SetPrivate(cx, userobj, p);
JS_DefineProperties(cx, userobj, js_user_properties);

rswindell
committed
JS_DefineFunctions(cx, userobj, js_user_functions);
/* user.stats */
statsobj = JS_DefineObject(cx, userobj, "stats"
,&js_user_stats_class, NULL, 0);
if(statsobj==NULL)
return(NULL);

rswindell
committed
JS_SetPrivate(cx, statsobj, p);
JS_DefineProperties(cx, statsobj, js_user_stats_properties);
/* user.security */
securityobj = JS_DefineObject(cx, userobj, "security"
,&js_user_security_class, NULL, 0);
if(securityobj==NULL)
return(NULL);

rswindell
committed
JS_SetPrivate(cx, securityobj, p);
JS_DefineProperties(cx, securityobj, js_user_security_properties);
return(userobj);
}