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

unix.superglobalmegacorp.com

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