Annotation of sbbs/src/sbbs3/js_user.c, revision 1.1

1.1     ! root        1: /* js_user.c */
        !             2: 
        !             3: /* Synchronet JavaScript "User" Object */
        !             4: 
        !             5: /* $Id: js_user.c,v 1.62 2006/06/06 17:17:18 rswindell Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            12:  *                                                                                                                                                     *
        !            13:  * This program is free software; you can redistribute it and/or                       *
        !            14:  * modify it under the terms of the GNU General Public License                         *
        !            15:  * as published by the Free Software Foundation; either version 2                      *
        !            16:  * of the License, or (at your option) any later version.                                      *
        !            17:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            19:  *                                                                                                                                                     *
        !            20:  * Anonymous FTP access to the most recent released source is available at     *
        !            21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            22:  *                                                                                                                                                     *
        !            23:  * Anonymous CVS access to the development source and modification history     *
        !            24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            26:  *     (just hit return, no password is necessary)                                                     *
        !            27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            28:  *                                                                                                                                                     *
        !            29:  * For Synchronet coding style and modification guidelines, see                                *
        !            30:  * http://www.synchro.net/source.html                                                                          *
        !            31:  *                                                                                                                                                     *
        !            32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            33:  * format) via e-mail to [email protected]                                                                      *
        !            34:  *                                                                                                                                                     *
        !            35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            36:  ****************************************************************************/
        !            37: 
        !            38: #include "sbbs.h"
        !            39: 
        !            40: #ifdef JAVASCRIPT
        !            41: 
        !            42: static scfg_t* scfg=NULL;
        !            43: 
        !            44: static const char* getprivate_failure = "line %d %s JS_GetPrivate failed";
        !            45: 
        !            46: typedef struct
        !            47: {
        !            48:        user_t  user;
        !            49:        BOOL    cached;
        !            50:        scfg_t* cfg;
        !            51: 
        !            52: } private_t;
        !            53: 
        !            54: /* User Object Properites */
        !            55: enum {
        !            56:         USER_PROP_NUMBER
        !            57:        ,USER_PROP_ALIAS        
        !            58:        ,USER_PROP_NAME         
        !            59:        ,USER_PROP_HANDLE       
        !            60:        ,USER_PROP_NOTE         
        !            61:        ,USER_PROP_COMP         
        !            62:        ,USER_PROP_COMMENT      
        !            63:        ,USER_PROP_NETMAIL      
        !            64:        ,USER_PROP_EMAIL        /* READ ONLY */
        !            65:        ,USER_PROP_ADDRESS      
        !            66:        ,USER_PROP_LOCATION     
        !            67:        ,USER_PROP_ZIPCODE
        !            68:        ,USER_PROP_PASS
        !            69:        ,USER_PROP_PHONE        
        !            70:        ,USER_PROP_BIRTH  
        !            71:        ,USER_PROP_AGE          /* READ ONLY */
        !            72:        ,USER_PROP_MODEM     
        !            73:        ,USER_PROP_LASTON       
        !            74:        ,USER_PROP_FIRSTON      
        !            75:        ,USER_PROP_EXPIRE    
        !            76:        ,USER_PROP_PWMOD     
        !            77:        ,USER_PROP_LOGONS    
        !            78:        ,USER_PROP_LTODAY    
        !            79:        ,USER_PROP_TIMEON    
        !            80:        ,USER_PROP_TEXTRA       
        !            81:        ,USER_PROP_TTODAY    
        !            82:        ,USER_PROP_TLAST     
        !            83:        ,USER_PROP_POSTS     
        !            84:        ,USER_PROP_EMAILS    
        !            85:        ,USER_PROP_FBACKS    
        !            86:        ,USER_PROP_ETODAY       
        !            87:        ,USER_PROP_PTODAY
        !            88:        ,USER_PROP_MAIL_WAITING
        !            89:        ,USER_PROP_MAIL_PENDING
        !            90:        ,USER_PROP_ULB       
        !            91:        ,USER_PROP_ULS       
        !            92:        ,USER_PROP_DLB       
        !            93:        ,USER_PROP_DLS       
        !            94:        ,USER_PROP_CDT          
        !            95:        ,USER_PROP_MIN          
        !            96:        ,USER_PROP_LEVEL        
        !            97:        ,USER_PROP_FLAGS1       
        !            98:        ,USER_PROP_FLAGS2       
        !            99:        ,USER_PROP_FLAGS3       
        !           100:        ,USER_PROP_FLAGS4       
        !           101:        ,USER_PROP_EXEMPT       
        !           102:        ,USER_PROP_REST         
        !           103:        ,USER_PROP_ROWS         
        !           104:        ,USER_PROP_SEX          
        !           105:        ,USER_PROP_MISC         
        !           106:        ,USER_PROP_LEECH        
        !           107:        ,USER_PROP_CURSUB       
        !           108:        ,USER_PROP_CURDIR       
        !           109:        ,USER_PROP_CURXTRN
        !           110:        ,USER_PROP_FREECDT      
        !           111:        ,USER_PROP_XEDIT        
        !           112:        ,USER_PROP_SHELL        
        !           113:        ,USER_PROP_QWK          
        !           114:        ,USER_PROP_TMPEXT       
        !           115:        ,USER_PROP_CHAT         
        !           116:        ,USER_PROP_NS_TIME      
        !           117:        ,USER_PROP_PROT         
        !           118:        ,USER_PROP_LOGONTIME
        !           119:        ,USER_PROP_TIMEPERCALL
        !           120:        ,USER_PROP_TIMEPERDAY
        !           121:        ,USER_PROP_CALLSPERDAY
        !           122:        ,USER_PROP_LINESPERMSG
        !           123:        ,USER_PROP_EMAILPERDAY
        !           124:        ,USER_PROP_POSTSPERDAY
        !           125:        ,USER_PROP_FREECDTPERDAY
        !           126:        ,USER_PROP_CACHED
        !           127: };
        !           128: 
        !           129: static void js_getuserdat(private_t* p)
        !           130: {
        !           131:        if(!p->cached) {
        !           132:                if(getuserdat(p->cfg,&p->user)==0)
        !           133:                        p->cached=TRUE;
        !           134:        }
        !           135: }
        !           136: 
        !           137: 
        !           138: static JSBool js_user_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           139: {
        !           140:        char*           s=NULL;
        !           141:        char            tmp[128];
        !           142:        ulong           val=0;
        !           143:     jsint       tiny;
        !           144:        JSString*       js_str;
        !           145:        private_t*      p;
        !           146: 
        !           147:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
        !           148:                JS_ReportError(cx,getprivate_failure,WHERE);
        !           149:                return(JS_FALSE);
        !           150:        }
        !           151: 
        !           152:        js_getuserdat(p);
        !           153: 
        !           154:     tiny = JSVAL_TO_INT(id);
        !           155: 
        !           156:        switch(tiny) {
        !           157:                case USER_PROP_NUMBER:
        !           158:                        val=p->user.number;
        !           159:                        break;
        !           160:                case USER_PROP_ALIAS: 
        !           161:                        s=p->user.alias;
        !           162:                        break;
        !           163:                case USER_PROP_NAME:
        !           164:                        s=p->user.name;
        !           165:                        break;
        !           166:                case USER_PROP_HANDLE:
        !           167:                        s=p->user.handle;
        !           168:                        break;
        !           169:                case USER_PROP_NOTE:
        !           170:                        s=p->user.note;
        !           171:                        break;
        !           172:                case USER_PROP_COMP:
        !           173:                        s=p->user.comp;
        !           174:                        break;
        !           175:                case USER_PROP_COMMENT:
        !           176:                        s=p->user.comment;
        !           177:                        break;
        !           178:                case USER_PROP_NETMAIL:
        !           179:                        s=p->user.netmail;
        !           180:                        break;
        !           181:                case USER_PROP_EMAIL:
        !           182:                        s=usermailaddr(p->cfg, tmp
        !           183:                                ,p->cfg->inetmail_misc&NMAIL_ALIAS ? p->user.alias : p->user.name);
        !           184:                        break;
        !           185:                case USER_PROP_ADDRESS:
        !           186:                        s=p->user.address;
        !           187:                        break;
        !           188:                case USER_PROP_LOCATION:
        !           189:                        s=p->user.location;
        !           190:                        break;
        !           191:                case USER_PROP_ZIPCODE:
        !           192:                        s=p->user.zipcode;
        !           193:                        break;
        !           194:                case USER_PROP_PASS:
        !           195:                        s=p->user.pass;
        !           196:                        break;
        !           197:                case USER_PROP_PHONE:
        !           198:                        s=p->user.phone;
        !           199:                        break;
        !           200:                case USER_PROP_BIRTH:
        !           201:                        s=p->user.birth;
        !           202:                        break;
        !           203:                case USER_PROP_AGE:
        !           204:                        val=getage(p->cfg,p->user.birth);
        !           205:                        break;
        !           206:                case USER_PROP_MODEM:
        !           207:                        s=p->user.modem;
        !           208:                        break;
        !           209:                case USER_PROP_LASTON:
        !           210:                        val=p->user.laston;
        !           211:                        break;
        !           212:                case USER_PROP_FIRSTON:
        !           213:                        val=p->user.firston;
        !           214:                        break;
        !           215:                case USER_PROP_EXPIRE:
        !           216:                        val=p->user.expire;
        !           217:                        break;
        !           218:                case USER_PROP_PWMOD: 
        !           219:                        val=p->user.pwmod;
        !           220:                        break;
        !           221:                case USER_PROP_LOGONS:
        !           222:                        val=p->user.logons;
        !           223:                        break;
        !           224:                case USER_PROP_LTODAY:
        !           225:                        val=p->user.ltoday;
        !           226:                        break;
        !           227:                case USER_PROP_TIMEON:
        !           228:                        val=p->user.timeon;
        !           229:                        break;
        !           230:                case USER_PROP_TEXTRA:
        !           231:                        val=p->user.textra;
        !           232:                        break;
        !           233:                case USER_PROP_TTODAY:
        !           234:                        val=p->user.ttoday;
        !           235:                        break;
        !           236:                case USER_PROP_TLAST: 
        !           237:                        val=p->user.tlast;
        !           238:                        break;
        !           239:                case USER_PROP_POSTS: 
        !           240:                        val=p->user.posts;
        !           241:                        break;
        !           242:                case USER_PROP_EMAILS: 
        !           243:                        val=p->user.emails;
        !           244:                        break;
        !           245:                case USER_PROP_FBACKS: 
        !           246:                        val=p->user.fbacks;
        !           247:                        break;
        !           248:                case USER_PROP_ETODAY:  
        !           249:                        val=p->user.etoday;
        !           250:                        break;
        !           251:                case USER_PROP_PTODAY:
        !           252:                        val=p->user.ptoday;
        !           253:                        break;
        !           254:                case USER_PROP_ULB:
        !           255:                        val=p->user.ulb;
        !           256:                        break;
        !           257:                case USER_PROP_ULS:
        !           258:                        val=p->user.uls;
        !           259:                        break;
        !           260:                case USER_PROP_DLB:
        !           261:                        val=p->user.dlb;
        !           262:                        break;
        !           263:                case USER_PROP_DLS:
        !           264:                        val=p->user.dls;
        !           265:                        break;
        !           266:                case USER_PROP_CDT:
        !           267:                        val=p->user.cdt;
        !           268:                        break;
        !           269:                case USER_PROP_MIN:
        !           270:                        val=p->user.min;
        !           271:                        break;
        !           272:                case USER_PROP_LEVEL:
        !           273:                        val=p->user.level;
        !           274:                        break;
        !           275:                case USER_PROP_FLAGS1:
        !           276:                        val=p->user.flags1;
        !           277:                        break;
        !           278:                case USER_PROP_FLAGS2:
        !           279:                        val=p->user.flags2;
        !           280:                        break;
        !           281:                case USER_PROP_FLAGS3:
        !           282:                        val=p->user.flags3;
        !           283:                        break;
        !           284:                case USER_PROP_FLAGS4:
        !           285:                        val=p->user.flags4;
        !           286:                        break;
        !           287:                case USER_PROP_EXEMPT:
        !           288:                        val=p->user.exempt;
        !           289:                        break;
        !           290:                case USER_PROP_REST:
        !           291:                        val=p->user.rest;
        !           292:                        break;
        !           293:                case USER_PROP_ROWS:
        !           294:                        val=p->user.rows;
        !           295:                        break;
        !           296:                case USER_PROP_SEX:
        !           297:                        sprintf(tmp,"%c",p->user.sex);
        !           298:                        s=tmp;
        !           299:                        break;
        !           300:                case USER_PROP_MISC:
        !           301:                        val=p->user.misc;
        !           302:                        break;
        !           303:                case USER_PROP_LEECH:
        !           304:                        val=p->user.leech;
        !           305:                        break;
        !           306:                case USER_PROP_CURSUB:
        !           307:                        s=p->user.cursub;
        !           308:                        break;
        !           309:                case USER_PROP_CURDIR:
        !           310:                        s=p->user.curdir;
        !           311:                        break;
        !           312:                case USER_PROP_CURXTRN:
        !           313:                        s=p->user.curxtrn;
        !           314:                        break;
        !           315: 
        !           316:                case USER_PROP_FREECDT:
        !           317:                        val=p->user.freecdt;
        !           318:                        break;
        !           319:                case USER_PROP_XEDIT:
        !           320:                        if(p->user.xedit>0 && p->user.xedit<=p->cfg->total_xedits)
        !           321:                                s=p->cfg->xedit[p->user.xedit-1]->code;
        !           322:                        else
        !           323:                                s=""; /* internal editor */
        !           324:                        break;
        !           325:                case USER_PROP_SHELL:
        !           326:                        s=p->cfg->shell[p->user.shell]->code;
        !           327:                        break;
        !           328:                case USER_PROP_QWK:
        !           329:                        val=p->user.qwk;
        !           330:                        break;
        !           331:                case USER_PROP_TMPEXT:
        !           332:                        s=p->user.tmpext;
        !           333:                        break;
        !           334:                case USER_PROP_CHAT:
        !           335:                        val=p->user.chat;
        !           336:                        break;
        !           337:                case USER_PROP_NS_TIME:
        !           338:                        val=p->user.ns_time;
        !           339:                        break;
        !           340:                case USER_PROP_PROT:
        !           341:                        sprintf(tmp,"%c",p->user.prot);
        !           342:                        s=tmp;
        !           343:                        break;
        !           344:                case USER_PROP_LOGONTIME:
        !           345:                        val=p->user.logontime;
        !           346:                        break;
        !           347:                case USER_PROP_TIMEPERCALL:
        !           348:                        val=p->cfg->level_timepercall[p->user.level];
        !           349:                        break;
        !           350:                case USER_PROP_TIMEPERDAY:
        !           351:                        val=p->cfg->level_timeperday[p->user.level];
        !           352:                        break;
        !           353:                case USER_PROP_CALLSPERDAY:
        !           354:                        val=p->cfg->level_callsperday[p->user.level];
        !           355:                        break;
        !           356:                case USER_PROP_LINESPERMSG:
        !           357:                        val=p->cfg->level_linespermsg[p->user.level];
        !           358:                        break;
        !           359:                case USER_PROP_POSTSPERDAY:
        !           360:                        val=p->cfg->level_postsperday[p->user.level];
        !           361:                        break;
        !           362:                case USER_PROP_EMAILPERDAY:
        !           363:                        val=p->cfg->level_emailperday[p->user.level];
        !           364:                        break;
        !           365:                case USER_PROP_FREECDTPERDAY:
        !           366:                        val=p->cfg->level_freecdtperday[p->user.level];
        !           367:                        break;
        !           368:                case USER_PROP_MAIL_WAITING:
        !           369:                        val=getmail(p->cfg,p->user.number,/* sent? */FALSE);
        !           370:                        break;
        !           371:                case USER_PROP_MAIL_PENDING:
        !           372:                        val=getmail(p->cfg,p->user.number,/* sent? */TRUE);
        !           373:                        break;
        !           374: 
        !           375:                case USER_PROP_CACHED:
        !           376:                        *vp = BOOLEAN_TO_JSVAL(p->cached);
        !           377:                        return(JS_TRUE);        /* intentional early return */
        !           378: 
        !           379:                default:        
        !           380:                        /* This must not set vp in order for child objects to work (stats and security) */
        !           381:                        return(JS_TRUE);
        !           382:        }
        !           383:        if(s!=NULL) {
        !           384:                if((js_str=JS_NewStringCopyZ(cx, s))==NULL)
        !           385:                        return(JS_FALSE);
        !           386:                *vp = STRING_TO_JSVAL(js_str);
        !           387:        } else
        !           388:                JS_NewNumberValue(cx,val,vp);
        !           389: 
        !           390:        return(JS_TRUE);
        !           391: }
        !           392: 
        !           393: static JSBool js_user_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
        !           394: {
        !           395:        char*           str;
        !           396:        char            tmp[64];
        !           397:        jsint           val;
        !           398:        ulong           usermisc;
        !           399:     jsint       tiny;
        !           400:        JSString*       js_str;
        !           401:        private_t*      p;
        !           402:        int32           usernumber;
        !           403: 
        !           404:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
        !           405:                JS_ReportError(cx,getprivate_failure,WHERE);
        !           406:                return(JS_FALSE);
        !           407:        }
        !           408: 
        !           409:        if((js_str=JS_ValueToString(cx,*vp))==NULL)
        !           410:                return(JS_FALSE);
        !           411: 
        !           412:        if((str=JS_GetStringBytes(js_str))==NULL)
        !           413:                return(JS_FALSE);
        !           414: 
        !           415:     tiny = JSVAL_TO_INT(id);
        !           416: 
        !           417:        switch(tiny) {
        !           418:                case USER_PROP_NUMBER:
        !           419:                        JS_ValueToInt32(cx, *vp, &usernumber);
        !           420:                        if(usernumber!=p->user.number)
        !           421:                                p->user.number=(ushort)usernumber;
        !           422:                        break;
        !           423:                case USER_PROP_ALIAS:
        !           424:                        /* update USER.DAT */
        !           425:                        putuserrec(p->cfg,p->user.number,U_ALIAS,LEN_ALIAS,str);
        !           426: 
        !           427:                        /* update NAME.DAT */
        !           428:                        getuserrec(p->cfg,p->user.number,U_MISC,8,tmp);
        !           429:                        usermisc=ahtoul(tmp);
        !           430:                        if(!(usermisc&DELETED))
        !           431:                                putusername(p->cfg,p->user.number,str);
        !           432:                        break;
        !           433:                case USER_PROP_NAME:
        !           434:                        putuserrec(p->cfg,p->user.number,U_NAME,LEN_NAME,str);
        !           435:                        break;
        !           436:                case USER_PROP_HANDLE:
        !           437:                        putuserrec(p->cfg,p->user.number,U_HANDLE,LEN_HANDLE,str);
        !           438:                        break;
        !           439:                case USER_PROP_NOTE:             
        !           440:                        putuserrec(p->cfg,p->user.number,U_NOTE,LEN_NOTE,str);
        !           441:                        break;
        !           442:                case USER_PROP_COMP:             
        !           443:                        putuserrec(p->cfg,p->user.number,U_COMP,LEN_COMP,str);
        !           444:                        break;
        !           445:                case USER_PROP_COMMENT:  
        !           446:                        putuserrec(p->cfg,p->user.number,U_COMMENT,LEN_COMMENT,str);
        !           447:                        break;
        !           448:                case USER_PROP_NETMAIL:  
        !           449:                        putuserrec(p->cfg,p->user.number,U_NETMAIL,LEN_NETMAIL,str);
        !           450:                        break;
        !           451:                case USER_PROP_ADDRESS:  
        !           452:                        putuserrec(p->cfg,p->user.number,U_ADDRESS,LEN_ADDRESS,str);
        !           453:                        break;
        !           454:                case USER_PROP_LOCATION:         
        !           455:                        putuserrec(p->cfg,p->user.number,U_LOCATION,LEN_LOCATION,str);
        !           456:                        break;
        !           457:                case USER_PROP_ZIPCODE:  
        !           458:                        putuserrec(p->cfg,p->user.number,U_ZIPCODE,LEN_ZIPCODE,str);
        !           459:                        break;
        !           460:                case USER_PROP_PHONE:    
        !           461:                        putuserrec(p->cfg,p->user.number,U_PHONE,LEN_PHONE,str);
        !           462:                        break;
        !           463:                case USER_PROP_BIRTH:    
        !           464:                        putuserrec(p->cfg,p->user.number,U_BIRTH,LEN_BIRTH,str);
        !           465:                        break;
        !           466:                case USER_PROP_MODEM:     
        !           467:                        putuserrec(p->cfg,p->user.number,U_MODEM,LEN_MODEM,str);
        !           468:                        break;
        !           469:                case USER_PROP_ROWS:             
        !           470:                        putuserrec(p->cfg,p->user.number,U_ROWS,0,str); /* base 10 */
        !           471:                        break;
        !           472:                case USER_PROP_SEX:              
        !           473:                        putuserrec(p->cfg,p->user.number,U_SEX,0,strupr(str));  /* single char */
        !           474:                        break;
        !           475:                case USER_PROP_CURSUB:   
        !           476:                        putuserrec(p->cfg,p->user.number,U_CURSUB,0,strupr(str));
        !           477:                        break;
        !           478:                case USER_PROP_CURDIR:   
        !           479:                        putuserrec(p->cfg,p->user.number,U_CURDIR,0,strupr(str));
        !           480:                        break;
        !           481:                case USER_PROP_CURXTRN:  
        !           482:                        putuserrec(p->cfg,p->user.number,U_CURXTRN,0,strupr(str));
        !           483:                        break;
        !           484:                case USER_PROP_XEDIT:    
        !           485:                        putuserrec(p->cfg,p->user.number,U_XEDIT,0,strupr(str));
        !           486:                        break;
        !           487:                case USER_PROP_SHELL:    
        !           488:                        putuserrec(p->cfg,p->user.number,U_COMP,0,strupr(str));
        !           489:                        break;
        !           490:                case USER_PROP_MISC:
        !           491:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           492:                                putuserrec(p->cfg,p->user.number,U_MISC,0,ultoa(val,tmp,16));
        !           493:                        break;
        !           494:                case USER_PROP_QWK:              
        !           495:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           496:                                putuserrec(p->cfg,p->user.number,U_QWK,0,ultoa(val,tmp,16));
        !           497:                        break;
        !           498:                case USER_PROP_CHAT:             
        !           499:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           500:                                putuserrec(p->cfg,p->user.number,U_CHAT,0,ultoa(val,tmp,16));
        !           501:                        break;
        !           502:                case USER_PROP_TMPEXT:   
        !           503:                        putuserrec(p->cfg,p->user.number,U_TMPEXT,0,str);
        !           504:                        break;
        !           505:                case USER_PROP_NS_TIME:  
        !           506:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           507:                                putuserrec(p->cfg,p->user.number,U_NS_TIME,0,ultoa(val,tmp,16));
        !           508:                        break;
        !           509:                case USER_PROP_PROT:    
        !           510:                        putuserrec(p->cfg,p->user.number,U_PROT,0,strupr(str)); /* single char */
        !           511:                        break;
        !           512:                case USER_PROP_LOGONTIME:        
        !           513:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           514:                                putuserrec(p->cfg,p->user.number,U_LOGONTIME,0,ultoa(val,tmp,16));
        !           515:                        break;
        !           516:                        
        !           517:                /* security properties*/
        !           518:                case USER_PROP_PASS:    
        !           519:                        putuserrec(p->cfg,p->user.number,U_PASS,LEN_PASS,strupr(str));
        !           520:                        break;
        !           521:                case USER_PROP_PWMOD:
        !           522:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           523:                                putuserrec(p->cfg,p->user.number,U_PWMOD,0,ultoa(val,tmp,16));
        !           524:                        break;
        !           525:                case USER_PROP_LEVEL: 
        !           526:                        putuserrec(p->cfg,p->user.number,U_LEVEL,0,str);
        !           527:                        break;
        !           528:                case USER_PROP_FLAGS1:
        !           529:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           530:                                putuserrec(p->cfg,p->user.number,U_FLAGS1,0,ultoa(val,tmp,16));
        !           531:                        break;
        !           532:                case USER_PROP_FLAGS2:
        !           533:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           534:                                putuserrec(p->cfg,p->user.number,U_FLAGS2,0,ultoa(val,tmp,16));
        !           535:                        break;
        !           536:                case USER_PROP_FLAGS3:
        !           537:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           538:                                putuserrec(p->cfg,p->user.number,U_FLAGS3,0,ultoa(val,tmp,16));
        !           539:                        break;
        !           540:                case USER_PROP_FLAGS4:
        !           541:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           542:                                putuserrec(p->cfg,p->user.number,U_FLAGS4,0,ultoa(val,tmp,16));
        !           543:                        break;
        !           544:                case USER_PROP_EXEMPT:
        !           545:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           546:                                putuserrec(p->cfg,p->user.number,U_EXEMPT,0,ultoa(val,tmp,16));
        !           547:                        break;
        !           548:                case USER_PROP_REST:    
        !           549:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           550:                                putuserrec(p->cfg,p->user.number,U_REST,0,ultoa(val,tmp,16));
        !           551:                        break;
        !           552:                case USER_PROP_CDT:     
        !           553:                        putuserrec(p->cfg,p->user.number,U_CDT,0,str);
        !           554:                        break;
        !           555:                case USER_PROP_FREECDT:
        !           556:                        putuserrec(p->cfg,p->user.number,U_FREECDT,0,str);
        !           557:                        break;
        !           558:                case USER_PROP_MIN:     
        !           559:                        putuserrec(p->cfg,p->user.number,U_MIN,0,str);
        !           560:                        break;
        !           561:                case USER_PROP_TEXTRA:  
        !           562:                        putuserrec(p->cfg,p->user.number,U_TEXTRA,0,str);
        !           563:                        break;
        !           564:                case USER_PROP_EXPIRE:  
        !           565:                        if(JS_ValueToInt32(cx,*vp,&val))
        !           566:                                putuserrec(p->cfg,p->user.number,U_EXPIRE,0,ultoa(val,tmp,16));
        !           567:                        break;
        !           568: 
        !           569:                case USER_PROP_CACHED:
        !           570:                        JS_ValueToBoolean(cx, *vp, &p->cached);
        !           571:                        return(JS_TRUE);        /* intentional early return */
        !           572: 
        !           573:        }
        !           574:        p->cached=FALSE;
        !           575: 
        !           576: 
        !           577:        return(JS_TRUE);
        !           578: }
        !           579: 
        !           580: #define USER_PROP_FLAGS JSPROP_ENUMERATE
        !           581: 
        !           582: static jsSyncPropertySpec js_user_properties[] = {
        !           583: /*              name                           ,tinyid                                 ,flags,                                 ver     */
        !           584: 
        !           585:        {       "number"                        ,USER_PROP_NUMBER               ,USER_PROP_FLAGS,               310},
        !           586:        {       "alias"                         ,USER_PROP_ALIAS                ,USER_PROP_FLAGS,               310},
        !           587:        {       "name"                          ,USER_PROP_NAME                 ,USER_PROP_FLAGS,               310},
        !           588:        {       "handle"                        ,USER_PROP_HANDLE               ,USER_PROP_FLAGS,               310},
        !           589:        {       "ip_address"            ,USER_PROP_NOTE                 ,USER_PROP_FLAGS,               310},
        !           590:        {       "note"                          ,USER_PROP_NOTE                 ,USER_PROP_FLAGS,               310},
        !           591:        {       "host_name"                     ,USER_PROP_COMP                 ,USER_PROP_FLAGS,               310},
        !           592:        {       "computer"                      ,USER_PROP_COMP                 ,USER_PROP_FLAGS,               310},
        !           593:        {       "comment"                       ,USER_PROP_COMMENT              ,USER_PROP_FLAGS,               310},
        !           594:        {       "netmail"                       ,USER_PROP_NETMAIL              ,USER_PROP_FLAGS,               310},
        !           595:        {       "email"                         ,USER_PROP_EMAIL                ,USER_PROP_FLAGS|JSPROP_READONLY,               310},
        !           596:        {       "address"                       ,USER_PROP_ADDRESS              ,USER_PROP_FLAGS,               310},
        !           597:        {       "location"                      ,USER_PROP_LOCATION             ,USER_PROP_FLAGS,               310},
        !           598:        {       "zipcode"                       ,USER_PROP_ZIPCODE              ,USER_PROP_FLAGS,               310},
        !           599:        {       "phone"                         ,USER_PROP_PHONE                ,USER_PROP_FLAGS,               310},
        !           600:        {       "birthdate"                     ,USER_PROP_BIRTH                ,USER_PROP_FLAGS,               310},
        !           601:        {       "age"                           ,USER_PROP_AGE                  ,USER_PROP_FLAGS|JSPROP_READONLY,               310},
        !           602:        {       "connection"            ,USER_PROP_MODEM        ,USER_PROP_FLAGS,               310},
        !           603:        {       "modem"                         ,USER_PROP_MODEM        ,USER_PROP_FLAGS,               310},
        !           604:        {       "screen_rows"           ,USER_PROP_ROWS                 ,USER_PROP_FLAGS,               310},
        !           605:        {       "gender"                        ,USER_PROP_SEX                  ,USER_PROP_FLAGS,               310},
        !           606:        {       "cursub"                        ,USER_PROP_CURSUB               ,USER_PROP_FLAGS,               310},
        !           607:        {       "curdir"                        ,USER_PROP_CURDIR               ,USER_PROP_FLAGS,               310},
        !           608:        {       "curxtrn"                       ,USER_PROP_CURXTRN              ,USER_PROP_FLAGS,               310},
        !           609:        {       "editor"                        ,USER_PROP_XEDIT                ,USER_PROP_FLAGS,               310},
        !           610:        {       "command_shell"         ,USER_PROP_SHELL                ,USER_PROP_FLAGS,               310},
        !           611:        {       "settings"                      ,USER_PROP_MISC                 ,USER_PROP_FLAGS,               310},
        !           612:        {       "qwk_settings"          ,USER_PROP_QWK                  ,USER_PROP_FLAGS,               310},
        !           613:        {       "chat_settings"         ,USER_PROP_CHAT                 ,USER_PROP_FLAGS,               310},
        !           614:        {       "temp_file_ext"         ,USER_PROP_TMPEXT               ,USER_PROP_FLAGS,               310},
        !           615:        {       "new_file_time"         ,USER_PROP_NS_TIME              ,USER_PROP_FLAGS,               311},
        !           616:        {       "newscan_date"          ,USER_PROP_NS_TIME              ,0, /* Alias */                 310},
        !           617:        {       "download_protocol"     ,USER_PROP_PROT                 ,USER_PROP_FLAGS,               310},
        !           618:        {       "logontime"                     ,USER_PROP_LOGONTIME    ,USER_PROP_FLAGS,               310},
        !           619:        {       "cached"                        ,USER_PROP_CACHED               ,USER_PROP_FLAGS,               314},
        !           620:        {0}
        !           621: };
        !           622: 
        !           623: #ifdef BUILD_JSDOCS
        !           624: static char* user_prop_desc[] = {
        !           625: 
        !           626:         "record number (1-based)"
        !           627:        ,"alias/name"
        !           628:        ,"real name"
        !           629:        ,"chat handle"
        !           630:        ,"IP address last logged on from"
        !           631:        ,"AKA ip_address"
        !           632:        ,"host name last logged on from"
        !           633:        ,"AKA host_name"
        !           634:        ,"sysop's comment"
        !           635:        ,"external e-mail address"
        !           636:        ,"local Internet e-mail address - <small>READ ONLY</small>"
        !           637:        ,"street address"
        !           638:        ,"location (city, state)"
        !           639:        ,"zip/postal code"
        !           640:        ,"phone number"
        !           641:        ,"birth date"
        !           642:        ,"calculated age in years - <small>READ ONLY</small>"
        !           643:        ,"connection type"
        !           644:        ,"AKA connection"
        !           645:        ,"terminal rows (lines)"
        !           646:        ,"gender type"
        !           647:        ,"current message sub-board"
        !           648:        ,"current file directory"
        !           649:        ,"current external program being run"
        !           650:        ,"external message editor"
        !           651:        ,"command shell"
        !           652:        ,"settings bitfield - see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
        !           653:        ,"QWK packet settings bitfield - see <tt>QWK_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
        !           654:        ,"chat settings bitfield - see <tt>CHAT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
        !           655:        ,"temporary file type (extension)"
        !           656:        ,"new file scan date/time (time_t format)"
        !           657:        ,"file transfer protocol (command key)"
        !           658:        ,"logon time (time_t format)"
        !           659:        ,"record is currently cached in memory"
        !           660:        ,NULL
        !           661: };
        !           662: #endif
        !           663: 
        !           664: 
        !           665: /* user.security */
        !           666: static jsSyncPropertySpec js_user_security_properties[] = {
        !           667: /*              name                           ,tinyid                                 ,flags,                         ver     */
        !           668: 
        !           669:        {       "password"                      ,USER_PROP_PASS                 ,USER_PROP_FLAGS,       310 },
        !           670:        {       "password_date"         ,USER_PROP_PWMOD        ,USER_PROP_FLAGS,       310 },
        !           671:        {       "level"                         ,USER_PROP_LEVEL                ,USER_PROP_FLAGS,       310 },
        !           672:        {       "flags1"                        ,USER_PROP_FLAGS1               ,USER_PROP_FLAGS,       310 },
        !           673:        {       "flags2"                        ,USER_PROP_FLAGS2               ,USER_PROP_FLAGS,       310 },
        !           674:        {       "flags3"                        ,USER_PROP_FLAGS3               ,USER_PROP_FLAGS,       310 },
        !           675:        {       "flags4"                        ,USER_PROP_FLAGS4               ,USER_PROP_FLAGS,       310 },
        !           676:        {       "exemptions"            ,USER_PROP_EXEMPT               ,USER_PROP_FLAGS,       310 },
        !           677:        {       "restrictions"          ,USER_PROP_REST                 ,USER_PROP_FLAGS,       310 },
        !           678:        {       "credits"                       ,USER_PROP_CDT                  ,USER_PROP_FLAGS,       310 },
        !           679:        {       "free_credits"          ,USER_PROP_FREECDT              ,USER_PROP_FLAGS,       310 },
        !           680:        {       "minutes"                       ,USER_PROP_MIN                  ,USER_PROP_FLAGS,       310 },
        !           681:        {       "extra_time"            ,USER_PROP_TEXTRA               ,USER_PROP_FLAGS,       310 },
        !           682:        {       "expiration_date"       ,USER_PROP_EXPIRE       ,USER_PROP_FLAGS,       310 },
        !           683:        {0}
        !           684: };
        !           685: 
        !           686: #ifdef BUILD_JSDOCS
        !           687: static char* user_security_prop_desc[] = {
        !           688: 
        !           689:         "password"
        !           690:        ,"date password last modified (time_t format)"
        !           691:        ,"security level (0-99)"
        !           692:        ,"flag set #1 (bitfield)"
        !           693:        ,"flag set #2 (bitfield)"
        !           694:        ,"flag set #3 (bitfield)"
        !           695:        ,"flag set #4 (bitfield)"
        !           696:        ,"exemption flags (bitfield)"
        !           697:        ,"restriction flags (bitfield)"
        !           698:        ,"credits"
        !           699:        ,"free credits (for today only)"
        !           700:        ,"extra minutes (time bank)"
        !           701:        ,"extra minutes (for today only)"
        !           702:        ,"expiration date/time (time_t format)"
        !           703:        ,NULL
        !           704: };
        !           705: #endif
        !           706: 
        !           707: #undef  USER_PROP_FLAGS
        !           708: #define USER_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
        !           709: 
        !           710: /* user.limits: These should be READ ONLY by nature */
        !           711: static jsSyncPropertySpec js_user_limits_properties[] = {
        !           712: /*              name                                   ,tinyid                                 ,flags,                         ver     */
        !           713: 
        !           714:        {       "time_per_logon"                ,USER_PROP_TIMEPERCALL  ,USER_PROP_FLAGS,       311 },
        !           715:        {       "time_per_day"                  ,USER_PROP_TIMEPERDAY   ,USER_PROP_FLAGS,       311 },
        !           716:        {       "logons_per_day"                ,USER_PROP_CALLSPERDAY  ,USER_PROP_FLAGS,       311 },
        !           717:        {       "lines_per_message"             ,USER_PROP_LINESPERMSG  ,USER_PROP_FLAGS,       311 },
        !           718:        {       "email_per_day"                 ,USER_PROP_EMAILPERDAY  ,USER_PROP_FLAGS,       311 },
        !           719:        {       "posts_per_day"                 ,USER_PROP_POSTSPERDAY  ,USER_PROP_FLAGS,       311 },
        !           720:        {       "free_credits_per_day"  ,USER_PROP_FREECDTPERDAY,USER_PROP_FLAGS,       311 },
        !           721:        {0}
        !           722: };
        !           723: 
        !           724: 
        !           725: #ifdef BUILD_JSDOCS
        !           726: static char* user_limits_prop_desc[] = {
        !           727: 
        !           728:         "time (in minutes) per logon"
        !           729:        ,"time (in minutes) per day"
        !           730:        ,"logons per day"
        !           731:        ,"lines per message (post or email)"
        !           732:        ,"email sent per day"
        !           733:        ,"messages posted per day"
        !           734:        ,"free credits given per day"
        !           735:        ,NULL
        !           736: };
        !           737: #endif
        !           738: 
        !           739: 
        !           740: #undef  USER_PROP_FLAGS
        !           741: #define USER_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
        !           742: 
        !           743: /* user.stats: These should be READ ONLY by nature */
        !           744: static jsSyncPropertySpec js_user_stats_properties[] = {
        !           745: /*              name                           ,tinyid                                 ,flags,                                 ver     */
        !           746: 
        !           747:        {       "laston_date"           ,USER_PROP_LASTON               ,USER_PROP_FLAGS,               310 },
        !           748:        {       "firston_date"          ,USER_PROP_FIRSTON              ,USER_PROP_FLAGS,               310 },
        !           749:        {       "total_logons"          ,USER_PROP_LOGONS       ,USER_PROP_FLAGS,               310 },
        !           750:        {       "logons_today"          ,USER_PROP_LTODAY       ,USER_PROP_FLAGS,               310 },
        !           751:        {       "total_timeon"          ,USER_PROP_TIMEON       ,USER_PROP_FLAGS,               310 },
        !           752:        {       "timeon_today"          ,USER_PROP_TTODAY       ,USER_PROP_FLAGS,               310 },
        !           753:        {       "timeon_last_logon"     ,USER_PROP_TLAST        ,USER_PROP_FLAGS,               310 },
        !           754:        {       "total_posts"           ,USER_PROP_POSTS        ,USER_PROP_FLAGS,               310 },
        !           755:        {       "total_emails"          ,USER_PROP_EMAILS       ,USER_PROP_FLAGS,               310 },
        !           756:        {       "total_feedbacks"       ,USER_PROP_FBACKS       ,USER_PROP_FLAGS,               310 },
        !           757:        {       "email_today"           ,USER_PROP_ETODAY               ,USER_PROP_FLAGS,               310 },
        !           758:        {       "posts_today"           ,USER_PROP_PTODAY               ,USER_PROP_FLAGS,               310 },
        !           759:        {       "bytes_uploaded"        ,USER_PROP_ULB          ,USER_PROP_FLAGS,               310 },
        !           760:        {       "files_uploaded"        ,USER_PROP_ULS          ,USER_PROP_FLAGS,               310 },
        !           761:        {       "bytes_downloaded"      ,USER_PROP_DLB          ,USER_PROP_FLAGS,               310 },
        !           762:        {       "files_downloaded"      ,USER_PROP_DLS          ,USER_PROP_FLAGS,               310 },
        !           763:        {       "leech_attempts"        ,USER_PROP_LEECH                ,USER_PROP_FLAGS,               310 },
        !           764:        {       "mail_waiting"          ,USER_PROP_MAIL_WAITING ,USER_PROP_FLAGS,               312     },
        !           765:        {       "mail_pending"          ,USER_PROP_MAIL_PENDING ,USER_PROP_FLAGS,               312     },
        !           766:        {0}
        !           767: };
        !           768: 
        !           769: #ifdef BUILD_JSDOCS
        !           770: static char* user_stats_prop_desc[] = {
        !           771: 
        !           772:         "date of previous logon"
        !           773:        ,"date of first logon"
        !           774:        ,"total number of logons"
        !           775:        ,"total logons today"
        !           776:        ,"total time used (in minutes)"
        !           777:        ,"time used today"
        !           778:        ,"time used last session"
        !           779:        ,"total messages posted"
        !           780:        ,"total e-mails sent"
        !           781:        ,"total feedback messages sent"
        !           782:        ,"e-mail sent today"
        !           783:        ,"messages posted today"
        !           784:        ,"total bytes uploaded"
        !           785:        ,"total files uploaded"
        !           786:        ,"total bytes downloaded"
        !           787:        ,"total files downloaded"
        !           788:        ,"suspected leech downloads"
        !           789:        ,"number of e-mail messages currently waiting"
        !           790:        ,"number of e-mail messages sent, currently pending deletion"
        !           791:        ,NULL
        !           792: };
        !           793: #endif
        !           794: 
        !           795: 
        !           796: static void js_user_finalize(JSContext *cx, JSObject *obj)
        !           797: {
        !           798:        private_t* p;
        !           799: 
        !           800:        p=(private_t*)JS_GetPrivate(cx,obj);
        !           801: 
        !           802:        if(p!=NULL && (scfg_t*)p!=scfg)
        !           803:                free(p);
        !           804: 
        !           805:        p=NULL;
        !           806:        JS_SetPrivate(cx,obj,p);
        !           807: }
        !           808: 
        !           809: static JSBool
        !           810: js_chk_ar(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           811: {
        !           812:        uchar*          ar;
        !           813:        JSString*       js_str;
        !           814:        private_t*      p;
        !           815: 
        !           816:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
        !           817:                return JS_FALSE;
        !           818: 
        !           819:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
        !           820:                return JS_FALSE;
        !           821: 
        !           822:        ar = arstr(NULL,JS_GetStringBytes(js_str),p->cfg);
        !           823: 
        !           824:        js_getuserdat(p);
        !           825: 
        !           826:        *rval = BOOLEAN_TO_JSVAL(chk_ar(p->cfg,ar,&p->user));
        !           827: 
        !           828:        if(ar!=NULL && ar!=nular)
        !           829:                free(ar);
        !           830: 
        !           831:        return JS_TRUE;
        !           832: }
        !           833: 
        !           834: static JSBool
        !           835: js_posted_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           836: {
        !           837:        private_t*      p;
        !           838:        int32   count=1;
        !           839: 
        !           840:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
        !           841:                return JS_FALSE;
        !           842: 
        !           843:        if(argc)
        !           844:                JS_ValueToInt32(cx, argv[0], &count);
        !           845: 
        !           846:        js_getuserdat(p);
        !           847: 
        !           848:        *rval = BOOLEAN_TO_JSVAL(user_posted_msg(p->cfg, &p->user, count));
        !           849: 
        !           850:        return JS_TRUE;
        !           851: }
        !           852: 
        !           853: static JSBool
        !           854: js_sent_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           855: {
        !           856:        private_t*      p;
        !           857:        int32   count=1;
        !           858:        BOOL    feedback=FALSE;
        !           859: 
        !           860:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
        !           861:                return JS_FALSE;
        !           862: 
        !           863:        if(argc)
        !           864:                JS_ValueToInt32(cx, argv[0], &count);
        !           865:        if(argc>1)
        !           866:                JS_ValueToBoolean(cx, argv[1], &feedback);
        !           867: 
        !           868:        js_getuserdat(p);
        !           869: 
        !           870:        *rval = BOOLEAN_TO_JSVAL(user_sent_email(p->cfg, &p->user, count, feedback));
        !           871: 
        !           872:        return JS_TRUE;
        !           873: }
        !           874: 
        !           875: static JSBool
        !           876: js_downloaded_file(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           877: {
        !           878:        private_t*      p;
        !           879:        int32   files=1;
        !           880:        int32   bytes=0;
        !           881: 
        !           882:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
        !           883:                return JS_FALSE;
        !           884: 
        !           885:        if(argc)
        !           886:                JS_ValueToInt32(cx, argv[0], &bytes);
        !           887:        if(argc>1)
        !           888:                JS_ValueToInt32(cx, argv[1], &files);
        !           889: 
        !           890:        js_getuserdat(p);
        !           891: 
        !           892:        *rval = BOOLEAN_TO_JSVAL(user_downloaded(p->cfg, &p->user, files, bytes));
        !           893: 
        !           894:        return JS_TRUE;
        !           895: }
        !           896: 
        !           897: static JSBool
        !           898: js_uploaded_file(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           899: {
        !           900:        private_t*      p;
        !           901:        int32   files=1;
        !           902:        int32   bytes=0;
        !           903: 
        !           904:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
        !           905:                return JS_FALSE;
        !           906: 
        !           907:        if(argc)
        !           908:                JS_ValueToInt32(cx, argv[0], &bytes);
        !           909:        if(argc>1)
        !           910:                JS_ValueToInt32(cx, argv[1], &files);
        !           911: 
        !           912:        js_getuserdat(p);
        !           913: 
        !           914:        *rval = BOOLEAN_TO_JSVAL(user_uploaded(p->cfg, &p->user, files, bytes));
        !           915: 
        !           916:        return JS_TRUE;
        !           917: }
        !           918: 
        !           919: static JSBool
        !           920: js_adjust_credits(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           921: {
        !           922:        private_t*      p;
        !           923:        int32   count=0;
        !           924: 
        !           925:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
        !           926:                return JS_FALSE;
        !           927: 
        !           928:        if(argc)
        !           929:                JS_ValueToInt32(cx, argv[0], &count);
        !           930: 
        !           931:        js_getuserdat(p);
        !           932: 
        !           933:        *rval = BOOLEAN_TO_JSVAL(user_adjust_credits(p->cfg, &p->user, count));
        !           934: 
        !           935:        return JS_TRUE;
        !           936: }
        !           937: 
        !           938: static JSBool
        !           939: js_adjust_minutes(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !           940: {
        !           941:        private_t*      p;
        !           942:        int32   count=0;
        !           943: 
        !           944:        if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
        !           945:                return JS_FALSE;
        !           946: 
        !           947:        if(argc)
        !           948:                JS_ValueToInt32(cx, argv[0], &count);
        !           949: 
        !           950:        js_getuserdat(p);
        !           951: 
        !           952:        *rval = BOOLEAN_TO_JSVAL(user_adjust_minutes(p->cfg, &p->user, count));
        !           953: 
        !           954:        return JS_TRUE;
        !           955: }
        !           956: 
        !           957: static jsSyncMethodSpec js_user_functions[] = {
        !           958:        {"compare_ars",         js_chk_ar,                      1,      JSTYPE_BOOLEAN, JSDOCSTR("string ars")
        !           959:        ,JSDOCSTR("Verify user meets access requirements string")
        !           960:        ,310
        !           961:        },              
        !           962:        {"adjust_credits",      js_adjust_credits,      1,      JSTYPE_BOOLEAN, JSDOCSTR("count")
        !           963:        ,JSDOCSTR("Adjust user's credits by <i>count</i> (negative to subtract)")
        !           964:        ,314
        !           965:        },              
        !           966:        {"adjust_minutes",      js_adjust_minutes,      1,      JSTYPE_BOOLEAN, JSDOCSTR("count")
        !           967:        ,JSDOCSTR("Adjust user's extra minutes <i>count</i> (negative to subtract)")
        !           968:        ,314
        !           969:        },              
        !           970:        {"posted_message",      js_posted_msg,          1,      JSTYPE_BOOLEAN, JSDOCSTR("[count]")
        !           971:        ,JSDOCSTR("Adjust user's posted-messages statistics by <i>count</i> (default: 1) (negative to subtract)")
        !           972:        ,314
        !           973:        },              
        !           974:        {"sent_email",          js_sent_email,          1,      JSTYPE_BOOLEAN, JSDOCSTR("[count] [,bool feedback]")
        !           975:        ,JSDOCSTR("Adjust user's email/feedback-sent statistics by <i>count</i> (default: 1) (negative to subtract)")
        !           976:        ,314
        !           977:        },              
        !           978:        {"uploaded_file",       js_uploaded_file,       1,      JSTYPE_BOOLEAN, JSDOCSTR("[bytes] [,files]")
        !           979:        ,JSDOCSTR("Adjust user's files/bytes-uploaded statistics")
        !           980:        ,314
        !           981:        },              
        !           982:        {"downloaded_file",     js_downloaded_file,     1,      JSTYPE_BOOLEAN, JSDOCSTR("[bytes] [,files]")
        !           983:        ,JSDOCSTR("Adjust user's files/bytes-downloaded statistics")
        !           984:        ,314
        !           985:        },              
        !           986:        {0}
        !           987: };
        !           988: 
        !           989: static JSClass js_user_class = {
        !           990:      "User"                                    /* name                 */
        !           991:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !           992:        ,JS_PropertyStub                /* addProperty  */
        !           993:        ,JS_PropertyStub                /* delProperty  */
        !           994:        ,js_user_get                    /* getProperty  */
        !           995:        ,js_user_set                    /* setProperty  */
        !           996:        ,JS_EnumerateStub               /* enumerate    */
        !           997:        ,JS_ResolveStub                 /* resolve              */
        !           998:        ,JS_ConvertStub                 /* convert              */
        !           999:        ,js_user_finalize               /* finalize             */
        !          1000: };
        !          1001: 
        !          1002: static JSClass js_user_stats_class = {
        !          1003:      "UserStats"                       /* name                 */
        !          1004:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !          1005:        ,JS_PropertyStub                /* addProperty  */
        !          1006:        ,JS_PropertyStub                /* delProperty  */
        !          1007:        ,js_user_get                    /* getProperty  */
        !          1008:        ,js_user_set                    /* setProperty  */
        !          1009:        ,JS_EnumerateStub               /* enumerate    */
        !          1010:        ,JS_ResolveStub                 /* resolve              */
        !          1011:        ,JS_ConvertStub                 /* convert              */
        !          1012:        ,JS_FinalizeStub        /* finalize             */
        !          1013: };
        !          1014: 
        !          1015: static JSClass js_user_security_class = {
        !          1016:      "UserSecurity"                    /* name                 */
        !          1017:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !          1018:        ,JS_PropertyStub                /* addProperty  */
        !          1019:        ,JS_PropertyStub                /* delProperty  */
        !          1020:        ,js_user_get                    /* getProperty  */
        !          1021:        ,js_user_set                    /* setProperty  */
        !          1022:        ,JS_EnumerateStub               /* enumerate    */
        !          1023:        ,JS_ResolveStub                 /* resolve              */
        !          1024:        ,JS_ConvertStub                 /* convert              */
        !          1025:        ,JS_FinalizeStub        /* finalize             */
        !          1026: };
        !          1027: 
        !          1028: static JSClass js_user_limits_class = {
        !          1029:      "UserLimits"                      /* name                 */
        !          1030:     ,JSCLASS_HAS_PRIVATE       /* flags                */
        !          1031:        ,JS_PropertyStub                /* addProperty  */
        !          1032:        ,JS_PropertyStub                /* delProperty  */
        !          1033:        ,js_user_get                    /* getProperty  */
        !          1034:        ,js_user_set                    /* setProperty  */
        !          1035:        ,JS_EnumerateStub               /* enumerate    */
        !          1036:        ,JS_ResolveStub                 /* resolve              */
        !          1037:        ,JS_ConvertStub                 /* convert              */
        !          1038:        ,JS_FinalizeStub        /* finalize             */
        !          1039: };
        !          1040: 
        !          1041: /* User Constructor (creates instance of user class) */
        !          1042: 
        !          1043: static JSBool
        !          1044: js_user_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
        !          1045: {
        !          1046:        int                     i;
        !          1047:        int32           val=0;
        !          1048:        user_t          user;
        !          1049:        private_t*      p;
        !          1050:        JSObject*       statsobj;
        !          1051:        JSObject*       securityobj;
        !          1052:        JSObject*       limitsobj;
        !          1053: 
        !          1054:        JS_ValueToInt32(cx,argv[0],&val);
        !          1055:        user.number=(ushort)val;
        !          1056:        if(user.number!=0 && (i=getuserdat(scfg,&user))!=0) {
        !          1057:                JS_ReportError(cx,"Error %d reading user number %d",i,val);
        !          1058:                return(JS_FALSE);
        !          1059:        }
        !          1060: 
        !          1061:        /* user.stats */
        !          1062:        if((statsobj=JS_DefineObject(cx, obj, "stats"
        !          1063:                ,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) 
        !          1064:                return(JS_FALSE);
        !          1065: 
        !          1066:        if(!js_DefineSyncProperties(cx, statsobj, js_user_stats_properties))
        !          1067:                return(JS_FALSE);
        !          1068: 
        !          1069:        /* user.security */
        !          1070:        if((securityobj=JS_DefineObject(cx, obj, "security"
        !          1071:                ,&js_user_security_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) 
        !          1072:                return(JS_FALSE);
        !          1073: 
        !          1074:        if(!js_DefineSyncProperties(cx, securityobj, js_user_security_properties))
        !          1075:                return(JS_FALSE);
        !          1076: 
        !          1077:        /* user.limits */
        !          1078:        if((limitsobj=JS_DefineObject(cx, obj, "limits"
        !          1079:                ,&js_user_limits_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL) 
        !          1080:                return(JS_FALSE);
        !          1081: 
        !          1082:        if(!js_DefineSyncProperties(cx, limitsobj, js_user_limits_properties))
        !          1083:                return(JS_FALSE);
        !          1084: 
        !          1085:        /* other user properties */
        !          1086:        if(!js_DefineSyncProperties(cx, obj, js_user_properties))
        !          1087:                return(JS_FALSE);
        !          1088: 
        !          1089:        if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
        !          1090:                return(JS_FALSE);
        !          1091: 
        !          1092:        p->cfg = scfg;
        !          1093:        p->user = user;
        !          1094:        p->cached = (user.number==0 ? FALSE : TRUE);
        !          1095: 
        !          1096:        JS_SetPrivate(cx, obj, p);      /* Must do this before calling js_DefineSyncMethods() */
        !          1097: 
        !          1098:        if(!js_DefineSyncMethods(cx, obj, js_user_functions, FALSE)) {
        !          1099:                JS_SetPrivate(cx, obj, NULL);
        !          1100:                free(p);
        !          1101:                return(JS_FALSE);
        !          1102:        }
        !          1103: 
        !          1104:        JS_SetPrivate(cx, statsobj, p);
        !          1105:        JS_SetPrivate(cx, securityobj, p);
        !          1106:        JS_SetPrivate(cx, limitsobj, p);
        !          1107: 
        !          1108:        return(JS_TRUE);
        !          1109: }
        !          1110: 
        !          1111: JSObject* DLLCALL js_CreateUserClass(JSContext* cx, JSObject* parent, scfg_t* cfg)
        !          1112: {
        !          1113:        JSObject*       userclass;
        !          1114: 
        !          1115:        scfg = cfg;
        !          1116:        userclass = JS_InitClass(cx, parent, NULL
        !          1117:                ,&js_user_class
        !          1118:                ,js_user_constructor
        !          1119:                ,1      /* number of constructor args */
        !          1120:                ,NULL /* props, defined in constructor */
        !          1121:                ,NULL /* funcs, defined in constructor */
        !          1122:                ,NULL,NULL);
        !          1123: 
        !          1124:        return(userclass);
        !          1125: }
        !          1126: 
        !          1127: JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* cfg, char* name
        !          1128:                                                                          , uint usernumber)
        !          1129: {
        !          1130:        JSObject*       userobj;
        !          1131:        JSObject*       statsobj;
        !          1132:        JSObject*       limitsobj;
        !          1133:        JSObject*       securityobj;
        !          1134:        private_t*      p;
        !          1135:        jsval           val;
        !          1136: 
        !          1137:        if(name==NULL)
        !          1138:            userobj = JS_NewObject(cx, &js_user_class, NULL, parent);
        !          1139:        else if(JS_GetProperty(cx,parent,name,&val) && val!=JSVAL_VOID)
        !          1140:                userobj = JSVAL_TO_OBJECT(val); /* Return existing user object */
        !          1141:        else
        !          1142:                userobj = JS_DefineObject(cx, parent, name, &js_user_class
        !          1143:                                                                , NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
        !          1144:        if(userobj==NULL)
        !          1145:                return(NULL);
        !          1146: 
        !          1147:        if((p=JS_GetPrivate(cx, userobj)) == NULL)      /* Uses existing private pointer: Fix memory leak? */
        !          1148:                if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
        !          1149:                        return(NULL);
        !          1150: 
        !          1151:        p->cfg = cfg;
        !          1152:        p->user.number = usernumber;
        !          1153:        p->cached = FALSE;
        !          1154: 
        !          1155:        JS_SetPrivate(cx, userobj, p);  
        !          1156: 
        !          1157:        if(!js_DefineSyncProperties(cx, userobj, js_user_properties)) {
        !          1158:                free(p);
        !          1159:                return(NULL);
        !          1160:        }
        !          1161: 
        !          1162: #ifdef BUILD_JSDOCS
        !          1163:        js_DescribeSyncObject(cx,userobj
        !          1164:                ,"Instance of <i>User</i> class, representing current user online"
        !          1165:                ,310);
        !          1166:        js_DescribeSyncConstructor(cx,userobj
        !          1167:                ,"To create a new user object: <tt>var u = new User(<i>number</i>)</tt>");
        !          1168:        js_CreateArrayOfStrings(cx, userobj
        !          1169:                ,"_property_desc_list", user_prop_desc, JSPROP_READONLY);
        !          1170: #endif
        !          1171: 
        !          1172:        js_DefineSyncMethods(cx, userobj, js_user_functions, FALSE);
        !          1173: 
        !          1174:        /* user.stats */
        !          1175:        statsobj = JS_DefineObject(cx, userobj, "stats"
        !          1176:                ,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
        !          1177: 
        !          1178:        if(statsobj==NULL) {
        !          1179:                free(p);
        !          1180:                return(NULL);
        !          1181:        }
        !          1182: 
        !          1183:        JS_SetPrivate(cx, statsobj, p);
        !          1184: 
        !          1185:        if(!js_DefineSyncProperties(cx, statsobj, js_user_stats_properties)) {
        !          1186:                free(p);
        !          1187:                return(NULL);
        !          1188:        }
        !          1189: 
        !          1190: #ifdef BUILD_JSDOCS
        !          1191:        js_DescribeSyncObject(cx,statsobj,"User statistics (all <small>READ ONLY</small>)",310);
        !          1192:        js_CreateArrayOfStrings(cx, statsobj, "_property_desc_list", user_stats_prop_desc, JSPROP_READONLY);
        !          1193: #endif
        !          1194: 
        !          1195:        /* user.limits */
        !          1196:        limitsobj = JS_DefineObject(cx, userobj, "limits"
        !          1197:                ,&js_user_limits_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
        !          1198: 
        !          1199:        if(limitsobj==NULL) {
        !          1200:                free(p);
        !          1201:                return(NULL);
        !          1202:        }
        !          1203: 
        !          1204:        JS_SetPrivate(cx, limitsobj, p);
        !          1205: 
        !          1206:        if(!js_DefineSyncProperties(cx, limitsobj, js_user_limits_properties)) {
        !          1207:                free(p);
        !          1208:                return(NULL);
        !          1209:        }
        !          1210: 
        !          1211: #ifdef BUILD_JSDOCS
        !          1212:        js_DescribeSyncObject(cx,limitsobj,"User limitations based on security level (all <small>READ ONLY</small>)",311);
        !          1213:        js_CreateArrayOfStrings(cx, limitsobj, "_property_desc_list", user_limits_prop_desc, JSPROP_READONLY);
        !          1214: #endif
        !          1215: 
        !          1216: 
        !          1217:        /* user.security */
        !          1218:        securityobj = JS_DefineObject(cx, userobj, "security"
        !          1219:                ,&js_user_security_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
        !          1220: 
        !          1221:        if(securityobj==NULL) {
        !          1222:                free(p);
        !          1223:                return(NULL);
        !          1224:        }
        !          1225: 
        !          1226:        JS_SetPrivate(cx, securityobj, p);
        !          1227: 
        !          1228:        if(!js_DefineSyncProperties(cx, securityobj, js_user_security_properties)) {
        !          1229:                free(p);
        !          1230:                return(NULL);
        !          1231:        }
        !          1232: 
        !          1233: #ifdef BUILD_JSDOCS
        !          1234:        js_DescribeSyncObject(cx,securityobj,"User security settings",310);
        !          1235:        js_CreateArrayOfStrings(cx, securityobj, "_property_desc_list", user_security_prop_desc, JSPROP_READONLY);
        !          1236: #endif
        !          1237: 
        !          1238:        return(userobj);
        !          1239: }
        !          1240: 
        !          1241: /****************************************************************************/
        !          1242: /* Creates all the user-specific objects: user, msg_area, file_area                    */
        !          1243: /****************************************************************************/
        !          1244: JSBool DLLCALL
        !          1245: js_CreateUserObjects(JSContext* cx, JSObject* parent, scfg_t* cfg, user_t* user
        !          1246:                                         ,char* html_index_file, subscan_t* subscan)
        !          1247: {
        !          1248:        if(js_CreateUserObject(cx,parent,cfg,"user",user==NULL ? 0 : user->number)==NULL)
        !          1249:                return(JS_FALSE);
        !          1250:        if(js_CreateFileAreaObject(cx,parent,cfg,user,html_index_file)==NULL) 
        !          1251:                return(JS_FALSE);
        !          1252:        if(js_CreateMsgAreaObject(cx,parent,cfg,user,subscan)==NULL) 
        !          1253:                return(JS_FALSE);
        !          1254:        if(js_CreateXtrnAreaObject(cx,parent,cfg,user)==NULL)
        !          1255:                return(JS_FALSE);
        !          1256: 
        !          1257:        return(JS_TRUE);
        !          1258: }
        !          1259: 
        !          1260: #endif /* JAVSCRIPT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.