Skip to content
Snippets Groups Projects
js_user.c 20.1 KiB
Newer Older
/* js_user.c */

/* 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's avatar
rswindell committed
static scfg_t* scfg=NULL;

rswindell's avatar
rswindell committed
	uint	usernumber;
/* User Object Properites */
enum {
rswindell's avatar
rswindell committed
	 USER_PROP_NUMBER
	,USER_PROP_ALIAS 	
	,USER_PROP_NAME		
	,USER_PROP_HANDLE	
	,USER_PROP_NOTE		
	,USER_PROP_COMP		
	,USER_PROP_COMMENT	
	,USER_PROP_NETMAIL	
	,USER_PROP_ADDRESS	
	,USER_PROP_LOCATION	
	,USER_PROP_ZIPCODE	
	,USER_PROP_PASS		
	,USER_PROP_PHONE  	
	,USER_PROP_BIRTH  
	,USER_PROP_AGE		/* READ ONLY */
	,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_FREECDT	
	,USER_PROP_XEDIT 	
	,USER_PROP_SHELL 	
	,USER_PROP_QWK		
	,USER_PROP_TMPEXT	
	,USER_PROP_CHAT		
	,USER_PROP_NS_TIME	
	,USER_PROP_PROT		
};

static JSBool js_user_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
	char*		s=NULL;
	char		tmp[128];
	ulong		val=0;
    jsint       tiny;
rswindell's avatar
rswindell committed
	user_t		user;
	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
rswindell's avatar
rswindell committed
	user.number=p->usernumber;
	getuserdat(p->cfg,&user);

    tiny = JSVAL_TO_INT(id);

	switch(tiny) {
rswindell's avatar
rswindell committed
		case USER_PROP_NUMBER:
			val=user.number;
			break;
rswindell's avatar
rswindell committed
			s=user.alias;
rswindell's avatar
rswindell committed
			s=user.name;
			break;
		case USER_PROP_HANDLE:
rswindell's avatar
rswindell committed
			s=user.handle;
rswindell's avatar
rswindell committed
			s=user.note;
rswindell's avatar
rswindell committed
			s=user.comp;
			break;
		case USER_PROP_COMMENT:
rswindell's avatar
rswindell committed
			s=user.comment;
			break;
		case USER_PROP_NETMAIL:
rswindell's avatar
rswindell committed
			s=user.netmail;
			break;
		case USER_PROP_ADDRESS:
rswindell's avatar
rswindell committed
			s=user.address;
			break;
		case USER_PROP_LOCATION:
rswindell's avatar
rswindell committed
			s=user.location;
			break;
		case USER_PROP_ZIPCODE:
rswindell's avatar
rswindell committed
			s=user.zipcode;
rswindell's avatar
rswindell committed
			s=user.pass;
rswindell's avatar
rswindell committed
			s=user.phone;
rswindell's avatar
rswindell committed
			s=user.birth;
rswindell's avatar
rswindell committed
			val=getage(p->cfg,user.birth);
rswindell's avatar
rswindell committed
			s=user.modem;
			break;
		case USER_PROP_LASTON:
rswindell's avatar
rswindell committed
			val=user.laston;
			break;
		case USER_PROP_FIRSTON:
rswindell's avatar
rswindell committed
			val=user.firston;
			break;
		case USER_PROP_EXPIRE:
rswindell's avatar
rswindell committed
			val=user.expire;
rswindell's avatar
rswindell committed
			val=user.pwmod;
			break;
		case USER_PROP_LOGONS:
rswindell's avatar
rswindell committed
			val=user.logons;
			break;
		case USER_PROP_LTODAY:
rswindell's avatar
rswindell committed
			val=user.ltoday;
			break;
		case USER_PROP_TIMEON:
rswindell's avatar
rswindell committed
			val=user.timeon;
			break;
		case USER_PROP_TEXTRA:
rswindell's avatar
rswindell committed
			val=user.textra;
			break;
		case USER_PROP_TTODAY:
rswindell's avatar
rswindell committed
			val=user.ttoday;
rswindell's avatar
rswindell committed
			val=user.tlast;
rswindell's avatar
rswindell committed
			val=user.posts;
			break;
		case USER_PROP_EMAILS: 
rswindell's avatar
rswindell committed
			val=user.emails;
			break;
		case USER_PROP_FBACKS: 
rswindell's avatar
rswindell committed
			val=user.fbacks;
			break;
		case USER_PROP_ETODAY:	
rswindell's avatar
rswindell committed
			val=user.etoday;
			break;
		case USER_PROP_PTODAY:
rswindell's avatar
rswindell committed
			val=user.ptoday;
rswindell's avatar
rswindell committed
			val=user.ulb;
rswindell's avatar
rswindell committed
			val=user.uls;
rswindell's avatar
rswindell committed
			val=user.dlb;
rswindell's avatar
rswindell committed
			val=user.dls;
rswindell's avatar
rswindell committed
			val=user.cdt;
rswindell's avatar
rswindell committed
			val=user.min;
rswindell's avatar
rswindell committed
			val=user.level;
			break;
		case USER_PROP_FLAGS1:
rswindell's avatar
rswindell committed
			val=user.flags1;
			break;
		case USER_PROP_FLAGS2:
rswindell's avatar
rswindell committed
			val=user.flags2;
			break;
		case USER_PROP_FLAGS3:
rswindell's avatar
rswindell committed
			val=user.flags3;
			break;
		case USER_PROP_FLAGS4:
rswindell's avatar
rswindell committed
			val=user.flags4;
			break;
		case USER_PROP_EXEMPT:
rswindell's avatar
rswindell committed
			val=user.exempt;
rswindell's avatar
rswindell committed
			val=user.rest;
rswindell's avatar
rswindell committed
			val=user.rows;
rswindell's avatar
rswindell committed
			sprintf(tmp,"%c",user.sex);
		case USER_PROP_MISC:
rswindell's avatar
rswindell committed
			val=user.misc;
rswindell's avatar
rswindell committed
			val=user.leech;
			break;
		case USER_PROP_CURSUB:
rswindell's avatar
rswindell committed
			s=user.cursub;
			break;
		case USER_PROP_CURDIR:
rswindell's avatar
rswindell committed
			s=user.curdir;
			break;
		case USER_PROP_FREECDT:
rswindell's avatar
rswindell committed
			val=user.freecdt;
rswindell's avatar
rswindell committed
			val=user.xedit;
rswindell's avatar
rswindell committed
			val=user.shell;
rswindell's avatar
rswindell committed
			val=user.qwk;
			break;
		case USER_PROP_TMPEXT:
rswindell's avatar
rswindell committed
			s=user.tmpext;
rswindell's avatar
rswindell committed
			val=user.laston;
			break;
		case USER_PROP_NS_TIME:
rswindell's avatar
rswindell committed
			val=user.laston;
rswindell's avatar
rswindell committed
			sprintf(tmp,"%c",user.prot);
			s=tmp;
			break;
		default:
			return(JS_TRUE);
	if(s!=NULL) 
		*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, s));
	else
		*vp = INT_TO_JSVAL(val);
static JSBool js_user_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
	char*		str;
	char		tmp[64];
	ulong		val;
rswindell's avatar
rswindell committed
	ulong		usermisc;
    jsint       tiny;
	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) {
rswindell's avatar
rswindell committed
		case USER_PROP_NUMBER:
			JS_ValueToInt32(cx, *vp, &p->usernumber);
			break;
rswindell's avatar
rswindell committed
			/* 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);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_NAME,LEN_NAME,str);
			break;
		case USER_PROP_HANDLE:
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_HANDLE,LEN_HANDLE,str);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_NOTE,LEN_NOTE,str);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_COMP,LEN_COMP,str);
			break;
		case USER_PROP_COMMENT:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_COMMENT,LEN_COMMENT,str);
			break;
		case USER_PROP_NETMAIL:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_NETMAIL,LEN_NETMAIL,str);
			break;
		case USER_PROP_ADDRESS:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_ADDRESS,LEN_ADDRESS,str);
			break;
		case USER_PROP_LOCATION:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_LOCATION,LEN_LOCATION,str);
			break;
		case USER_PROP_ZIPCODE:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_ZIPCODE,LEN_ZIPCODE,str);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_PHONE,LEN_PHONE,str);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_BIRTH,LEN_BIRTH,str);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_MODEM,LEN_MODEM,str);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_ROWS,2,str);	/* base 10 */
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_SEX,1,strupr(str));	/* single char */
			break;
		case USER_PROP_CURSUB:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_CURSUB,8,strupr(str));
			break;
		case USER_PROP_CURDIR:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_CURDIR,8,strupr(str));
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_XEDIT,8,strupr(str));
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_COMP,8,strupr(str));
			break;
		case USER_PROP_MISC:
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_MISC,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_QWK:		 
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_QWK,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_CHAT:		 
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_CHAT,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_TMPEXT:	 
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_TMPEXT,3,str);
			break;
		case USER_PROP_NS_TIME:	 
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_NS_TIME,8,ultoa(val,tmp,16));
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_PROT,1,strupr(str)); /* single char */
			break;
			
		/* security properties*/
		case USER_PROP_PASS:	
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_PASS,LEN_PASS,strupr(str));
			break;
		case USER_PROP_PWMOD:
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_PWMOD,8,ultoa(val,tmp,16));
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_LEVEL,2,str);
			break;
		case USER_PROP_FLAGS1:
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_FLAGS1,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_FLAGS2:
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_FLAGS2,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_FLAGS3:
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_FLAGS3,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_FLAGS4:
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_FLAGS4,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_EXEMPT:
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_EXEMPT,8,ultoa(val,tmp,16));
			break;
		case USER_PROP_REST:	
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_REST,8,ultoa(val,tmp,16));
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_CDT,10,str);
			break;
		case USER_PROP_FREECDT:
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_FREECDT,10,str);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_MIN,10,str);
			break;
		case USER_PROP_TEXTRA:  
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_TEXTRA,5,str);
			break;
		case USER_PROP_EXPIRE:  
			JS_ValueToInt32(cx,*vp,&val);
rswindell's avatar
rswindell committed
			putuserrec(p->cfg,p->usernumber,U_EXPIRE,8,ultoa(val,tmp,16));
#define USER_PROP_FLAGS JSPROP_ENUMERATE

static struct JSPropertySpec js_user_properties[] = {
/*		 name				,tinyid					,flags,				getter,	setter	*/

rswindell's avatar
rswindell committed
	{	"number"			,USER_PROP_NUMBER		,USER_PROP_NUMBER,		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},
	{	"email"				,USER_PROP_NETMAIL	 	,USER_PROP_FLAGS,		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},
	{	"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},
/* 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},
static void js_user_finalize(JSContext *cx, JSObject *obj)
{
	private_t* p;

	p=(private_t*)JS_GetPrivate(cx,obj);

rswindell's avatar
rswindell committed
	if(p!=NULL && (scfg_t*)p!=scfg)
		free(p);

	p=NULL;
	JS_SetPrivate(cx,obj,p);
}

static JSBool
js_chk_ar(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
	char*		ar;
	JSString*	js_str;
rswindell's avatar
rswindell committed
	user_t		user;
	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);

rswindell's avatar
rswindell committed
	user.number=p->usernumber;
	getuserdat(p->cfg,&user);

	*rval = BOOLEAN_TO_JSVAL(chk_ar(p->cfg,ar,&user));

	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		*/
};

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		*/
};

rswindell's avatar
rswindell committed
/* 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;

	user.number=(ushort)(JSVAL_TO_INT(argv[0]));
	if(getuserdat(scfg,&user)!=0)
		return(JS_FALSE);

	if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
		return(JS_FALSE);

	p->cfg = scfg;
	p->usernumber = user.number;

	JS_SetPrivate(cx, obj, 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);

//	JS_SetPrivate(cx, userclass, cfg);	

	return(userclass);
}

JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* cfg, char* name, uint usernumber)
{
	JSObject*	userobj;
	JSObject*	statsobj;
	JSObject*	securityobj;
	private_t*	p;

	if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
		return(NULL);

	p->cfg = cfg;
rswindell's avatar
rswindell committed
	p->usernumber = usernumber;

	userobj = JS_DefineObject(cx, parent, name, &js_user_class, NULL, 0);

	if(userobj==NULL)
		return(NULL);


	JS_DefineProperties(cx, userobj, js_user_properties);

	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);


	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);


	JS_DefineProperties(cx, securityobj, js_user_security_properties);

	return(userobj);
}

#endif	/* JAVSCRIPT */