Annotation of sbbs/sbbs3/js_user.c, revision 1.1.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.