Annotation of sbbs/sbbs3/js_system.c, revision 1.1.1.1

1.1       root        1: /* js_system.c */
                      2: 
                      3: /* Synchronet JavaScript "system" Object */
                      4: 
                      5: /* $Id: js_system.c,v 1.96 2004/12/31 02:39:19 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 2004 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: /* System Object Properites */
                     43: enum {
                     44:         SYS_PROP_NAME
                     45:        ,SYS_PROP_OP
                     46:        ,SYS_PROP_ID
                     47:        ,SYS_PROP_MISC
                     48:        ,SYS_PROP_PSNAME
                     49:        ,SYS_PROP_PSNUM
                     50:        ,SYS_PROP_INETADDR
                     51:        ,SYS_PROP_LOCATION
                     52:        ,SYS_PROP_TIMEZONE
                     53:        ,SYS_PROP_PWDAYS
                     54:        ,SYS_PROP_DELDAYS
                     55: 
                     56:        ,SYS_PROP_LASTUSER
                     57:        ,SYS_PROP_LASTUSERON
                     58:        ,SYS_PROP_FREEDISKSPACE
                     59:        ,SYS_PROP_FREEDISKSPACEK
                     60: 
                     61:        ,SYS_PROP_NODES
                     62:        ,SYS_PROP_LASTNODE
                     63: 
                     64:        ,SYS_PROP_NEW_PASS
                     65:        ,SYS_PROP_NEW_MAGIC
                     66:        ,SYS_PROP_NEW_LEVEL
                     67:        ,SYS_PROP_NEW_FLAGS1
                     68:        ,SYS_PROP_NEW_FLAGS2
                     69:        ,SYS_PROP_NEW_FLAGS3
                     70:        ,SYS_PROP_NEW_FLAGS4
                     71:        ,SYS_PROP_NEW_REST
                     72:        ,SYS_PROP_NEW_EXEMPT
                     73:        ,SYS_PROP_NEW_CDT
                     74:        ,SYS_PROP_NEW_MIN
                     75:        ,SYS_PROP_NEW_SHELL
                     76:        ,SYS_PROP_NEW_XEDIT
                     77:        ,SYS_PROP_NEW_MISC
                     78:        ,SYS_PROP_NEW_PROT
                     79:        ,SYS_PROP_NEW_EXPIRE
                     80:        ,SYS_PROP_NEW_UQ
                     81: 
                     82:        ,SYS_PROP_EXPIRED_LEVEL
                     83:        ,SYS_PROP_EXPIRED_FLAGS1
                     84:        ,SYS_PROP_EXPIRED_FLAGS2
                     85:        ,SYS_PROP_EXPIRED_FLAGS3
                     86:        ,SYS_PROP_EXPIRED_FLAGS4
                     87:        ,SYS_PROP_EXPIRED_REST
                     88:        ,SYS_PROP_EXPIRED_EXEMPT
                     89: 
                     90:        /* directories */
                     91:        ,SYS_PROP_NODE_DIR
                     92:        ,SYS_PROP_CTRL_DIR
                     93:        ,SYS_PROP_DATA_DIR
                     94:        ,SYS_PROP_TEXT_DIR
                     95:        ,SYS_PROP_TEMP_DIR
                     96:        ,SYS_PROP_EXEC_DIR
                     97:        ,SYS_PROP_MODS_DIR
                     98:        ,SYS_PROP_LOGS_DIR
                     99: 
                    100:        /* msclock() access */
                    101:        ,SYS_PROP_CLOCK
                    102:        ,SYS_PROP_CLOCK_PER_SEC
                    103: 
                    104:        /* filenames */
                    105:        ,SYS_PROP_DEVNULL
                    106:        ,SYS_PROP_TEMP_PATH
                    107: 
                    108:        /* last */
                    109:        ,SYS_PROP_LOCAL_HOSTNAME
                    110: };
                    111: 
                    112: static JSBool js_system_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
                    113: {
                    114:        char            str[128];
                    115:        char*           p=NULL;
                    116:     jsint       tiny;
                    117:        JSString*       js_str;
                    118:        ulong           val;
                    119:        scfg_t*         cfg;
                    120: 
                    121:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    122:                return(JS_FALSE);
                    123: 
                    124:     tiny = JSVAL_TO_INT(id);
                    125: 
                    126:        switch(tiny) {
                    127:                case SYS_PROP_NAME:
                    128:                p=cfg->sys_name;
                    129:                        break;
                    130:                case SYS_PROP_OP:
                    131:                        p=cfg->sys_op;
                    132:                        break;
                    133:                case SYS_PROP_ID:
                    134:                        p=cfg->sys_id;
                    135:                        break;
                    136:                case SYS_PROP_MISC:
                    137:                        JS_NewNumberValue(cx,cfg->sys_misc,vp);
                    138:                        break;
                    139:                case SYS_PROP_PSNAME:
                    140:                        p=cfg->sys_psname;
                    141:                        break;
                    142:                case SYS_PROP_PSNUM:
                    143:                        *vp = INT_TO_JSVAL(cfg->sys_psnum);
                    144:                        break;
                    145:                case SYS_PROP_INETADDR:
                    146:                        p=cfg->sys_inetaddr;
                    147:                        break;
                    148:                case SYS_PROP_LOCATION:
                    149:                        p=cfg->sys_location;
                    150:                        break;
                    151:                case SYS_PROP_TIMEZONE:
                    152:                        sys_timezone(cfg);
                    153:                        *vp = INT_TO_JSVAL(cfg->sys_timezone);
                    154:                        break;
                    155:                case SYS_PROP_NODES:
                    156:                        *vp = INT_TO_JSVAL(cfg->sys_nodes);
                    157:                        break;
                    158:                case SYS_PROP_LASTNODE:
                    159:                        *vp = INT_TO_JSVAL(cfg->sys_lastnode);
                    160:                        break;
                    161:                case SYS_PROP_PWDAYS:
                    162:                        *vp = INT_TO_JSVAL(cfg->sys_pwdays);
                    163:                        break;
                    164:                case SYS_PROP_DELDAYS:
                    165:                        *vp = INT_TO_JSVAL(cfg->sys_deldays);
                    166:                        break;
                    167:                case SYS_PROP_LASTUSER:
                    168:                        *vp = INT_TO_JSVAL(lastuser(cfg));
                    169:                        break;
                    170:                case SYS_PROP_LASTUSERON:
                    171:                        p=lastuseron;
                    172:                        break;
                    173:                case SYS_PROP_FREEDISKSPACE:
                    174:                case SYS_PROP_FREEDISKSPACEK:
                    175:                        if(tiny==SYS_PROP_FREEDISKSPACE)
                    176:                                val = getfreediskspace(cfg->temp_dir,0);
                    177:                        else
                    178:                                val = getfreediskspace(cfg->temp_dir,1024);
                    179:                        JS_NewNumberValue(cx,val,vp);
                    180:                        break;
                    181: 
                    182:                case SYS_PROP_NEW_PASS:
                    183:                        p=cfg->new_magic;
                    184:                        break;
                    185:                case SYS_PROP_NEW_MAGIC:
                    186:                        p=cfg->new_pass;
                    187:                        break;
                    188:                case SYS_PROP_NEW_LEVEL:
                    189:                        *vp = INT_TO_JSVAL(cfg->new_level);
                    190:                        break;
                    191:                case SYS_PROP_NEW_FLAGS1:
                    192:                        *vp = INT_TO_JSVAL(cfg->new_flags1);
                    193:                        break;
                    194:                case SYS_PROP_NEW_FLAGS2:
                    195:                        *vp = INT_TO_JSVAL(cfg->new_flags2);
                    196:                        break;
                    197:                case SYS_PROP_NEW_FLAGS3:
                    198:                        *vp = INT_TO_JSVAL(cfg->new_flags3);
                    199:                        break;
                    200:                case SYS_PROP_NEW_FLAGS4:
                    201:                        *vp = INT_TO_JSVAL(cfg->new_flags4);
                    202:                        break;
                    203:                case SYS_PROP_NEW_REST:
                    204:                        *vp = INT_TO_JSVAL(cfg->new_rest);
                    205:                        break;
                    206:                case SYS_PROP_NEW_EXEMPT:
                    207:                        *vp = INT_TO_JSVAL(cfg->new_exempt);
                    208:                        break;
                    209:                case SYS_PROP_NEW_CDT:
                    210:                        JS_NewNumberValue(cx,cfg->new_cdt,vp);
                    211:                        break;
                    212:                case SYS_PROP_NEW_MIN:
                    213:                        JS_NewNumberValue(cx,cfg->new_min,vp);
                    214:                        break;
                    215:                case SYS_PROP_NEW_SHELL:
                    216:                        *vp = INT_TO_JSVAL(cfg->new_shell);
                    217:                        break;
                    218:                case SYS_PROP_NEW_XEDIT:
                    219:                        p=cfg->new_xedit;
                    220:                        break;
                    221:                case SYS_PROP_NEW_MISC:
                    222:                        JS_NewNumberValue(cx,cfg->new_misc,vp);
                    223:                        break;
                    224:                case SYS_PROP_NEW_PROT:
                    225:                        sprintf(str,"%c",cfg->new_prot);
                    226:                        p=str;
                    227:                        break;
                    228:                case SYS_PROP_NEW_EXPIRE:
                    229:                        JS_NewNumberValue(cx,cfg->new_expire,vp);
                    230:                        break;
                    231:                case SYS_PROP_NEW_UQ:
                    232:                        JS_NewNumberValue(cx,cfg->uq,vp);
                    233:                        break;
                    234: 
                    235:                case SYS_PROP_EXPIRED_LEVEL:
                    236:                        *vp = INT_TO_JSVAL(cfg->expired_level);
                    237:                        break;
                    238:                case SYS_PROP_EXPIRED_FLAGS1:
                    239:                        *vp = INT_TO_JSVAL(cfg->expired_flags1);
                    240:                        break;
                    241:                case SYS_PROP_EXPIRED_FLAGS2:
                    242:                        *vp = INT_TO_JSVAL(cfg->expired_flags2);
                    243:                        break;
                    244:                case SYS_PROP_EXPIRED_FLAGS3:
                    245:                        *vp = INT_TO_JSVAL(cfg->expired_flags3);
                    246:                        break;
                    247:                case SYS_PROP_EXPIRED_FLAGS4:
                    248:                        *vp = INT_TO_JSVAL(cfg->expired_flags4);
                    249:                        break;
                    250:                case SYS_PROP_EXPIRED_REST:
                    251:                        *vp = INT_TO_JSVAL(cfg->expired_rest);
                    252:                        break;
                    253:                case SYS_PROP_EXPIRED_EXEMPT:
                    254:                        *vp = INT_TO_JSVAL(cfg->expired_exempt);
                    255:                        break;
                    256:                case SYS_PROP_NODE_DIR:
                    257:                        p=cfg->node_dir;
                    258:                        break;
                    259:                case SYS_PROP_CTRL_DIR:
                    260:                        p=cfg->ctrl_dir;
                    261:                        break;
                    262:                case SYS_PROP_DATA_DIR:
                    263:                        p=cfg->data_dir;
                    264:                        break;
                    265:                case SYS_PROP_TEXT_DIR:
                    266:                        p=cfg->text_dir;
                    267:                        break;
                    268:                case SYS_PROP_TEMP_DIR:
                    269:                        p=cfg->temp_dir;
                    270:                        break;
                    271:                case SYS_PROP_EXEC_DIR:
                    272:                        p=cfg->exec_dir;
                    273:                        break;
                    274:                case SYS_PROP_MODS_DIR:
                    275:                        p=cfg->mods_dir;
                    276:                        break;
                    277:                case SYS_PROP_LOGS_DIR:
                    278:                        p=cfg->logs_dir;
                    279:                        break;
                    280: 
                    281:                case SYS_PROP_DEVNULL:
                    282:                        p=_PATH_DEVNULL;
                    283:                        break;
                    284:                case SYS_PROP_TEMP_PATH:
                    285:                        p=_PATH_TMP;
                    286:                        break;
                    287: 
                    288:                case SYS_PROP_CLOCK:
                    289:                        JS_NewNumberValue(cx,msclock(),vp);
                    290:                        break;
                    291:                case SYS_PROP_CLOCK_PER_SEC:
                    292:                        JS_NewNumberValue(cx,MSCLOCKS_PER_SEC,vp);
                    293:                        break;
                    294: 
                    295:                case SYS_PROP_LOCAL_HOSTNAME:
                    296:                        gethostname(str,sizeof(str));
                    297:                        p=str;
                    298:                        break;
                    299:        }
                    300: 
                    301:        if(p!=NULL) {   /* string property */
                    302:                if((js_str=JS_NewStringCopyZ(cx, p))==NULL)
                    303:                        return(JS_FALSE);
                    304:                *vp = STRING_TO_JSVAL(js_str);
                    305:        }
                    306: 
                    307:        return(JS_TRUE);
                    308: }
                    309: 
                    310: static JSBool js_system_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
                    311: {
                    312:     jsint       tiny;
                    313:        scfg_t*         cfg;
                    314: 
                    315:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    316:                return(JS_FALSE);
                    317: 
                    318:     tiny = JSVAL_TO_INT(id);
                    319: 
                    320:        switch(tiny) {
                    321:                case SYS_PROP_MISC:
                    322:                        JS_ValueToInt32(cx, *vp, (int32*)&cfg->sys_misc);
                    323:                        break;
                    324:        }
                    325: 
                    326:        return(TRUE);
                    327: }
                    328: 
                    329: 
                    330: #define SYSOBJ_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
                    331: 
                    332: static jsSyncPropertySpec js_system_properties[] = {
                    333: /*              name,                                          tinyid,                         flags,                          ver     */
                    334: 
                    335:        {       "name",                                         SYS_PROP_NAME,          SYSOBJ_FLAGS,           310  },
                    336:        {       "operator",                                     SYS_PROP_OP,            SYSOBJ_FLAGS,           310  },
                    337:        {       "qwk_id",                                       SYS_PROP_ID,            SYSOBJ_FLAGS,           310  },
                    338:        {       "settings",                                     SYS_PROP_MISC,          JSPROP_ENUMERATE,       310  },
                    339:        {       "psname",                                       SYS_PROP_PSNAME,        SYSOBJ_FLAGS,           310  },
                    340:        {       "psnum",                                        SYS_PROP_PSNUM,         SYSOBJ_FLAGS,           310  },
                    341:        {       "inetaddr",                                     SYS_PROP_INETADDR,      JSPROP_READONLY,        310  }, /* alias */
                    342:        {       "inet_addr",                            SYS_PROP_INETADDR,      SYSOBJ_FLAGS,           311  },
                    343:        {       "location",                                     SYS_PROP_LOCATION,      SYSOBJ_FLAGS,           310  },
                    344:        {       "timezone",                                     SYS_PROP_TIMEZONE,      SYSOBJ_FLAGS,           310  },
                    345:        {       "pwdays",                                       SYS_PROP_PWDAYS,        SYSOBJ_FLAGS,           310  },
                    346:        {       "deldays",                                      SYS_PROP_DELDAYS,       SYSOBJ_FLAGS,           310  },
                    347: 
                    348:        {       "lastuser",                                     SYS_PROP_LASTUSER               ,SYSOBJ_FLAGS,  311  },
                    349:        {       "lastuseron",                           SYS_PROP_LASTUSERON             ,SYSOBJ_FLAGS,  310  },
                    350:        {       "freediskspace",                        SYS_PROP_FREEDISKSPACE  ,SYSOBJ_FLAGS,  310  },
                    351:        {       "freediskspacek",                       SYS_PROP_FREEDISKSPACEK ,SYSOBJ_FLAGS,  310  },
                    352: 
                    353:        {       "nodes",                                        SYS_PROP_NODES,         SYSOBJ_FLAGS,           310  },
                    354:        {       "lastnode",                                     SYS_PROP_LASTNODE,      SYSOBJ_FLAGS,           310  },
                    355: 
                    356:        {       "newuser_password",                     SYS_PROP_NEW_PASS               ,SYSOBJ_FLAGS,  310  },
                    357:        {       "newuser_magic_word",           SYS_PROP_NEW_MAGIC              ,SYSOBJ_FLAGS,  310  },
                    358:        {       "newuser_level",                        SYS_PROP_NEW_LEVEL              ,SYSOBJ_FLAGS,  310  },
                    359:        {       "newuser_flags1",                       SYS_PROP_NEW_FLAGS1             ,SYSOBJ_FLAGS,  310  },
                    360:        {       "newuser_flags2",                       SYS_PROP_NEW_FLAGS2             ,SYSOBJ_FLAGS,  310  },
                    361:        {       "newuser_flags3",                       SYS_PROP_NEW_FLAGS3             ,SYSOBJ_FLAGS,  310  },
                    362:        {       "newuser_flags4",                       SYS_PROP_NEW_FLAGS4             ,SYSOBJ_FLAGS,  310  },
                    363:        {       "newuser_restrictions",         SYS_PROP_NEW_REST               ,SYSOBJ_FLAGS,  310  },
                    364:        {       "newuser_exemptions",           SYS_PROP_NEW_EXEMPT             ,SYSOBJ_FLAGS,  310  },
                    365:        {       "newuser_credits",                      SYS_PROP_NEW_CDT                ,SYSOBJ_FLAGS,  310  },
                    366:        {       "newuser_minutes",                      SYS_PROP_NEW_MIN                ,SYSOBJ_FLAGS,  310  },
                    367:        {       "newuser_command_shell",        SYS_PROP_NEW_SHELL              ,SYSOBJ_FLAGS,  310  },
                    368:        {       "newuser_editor",                       SYS_PROP_NEW_XEDIT              ,SYSOBJ_FLAGS,  310  },
                    369:        {       "newuser_settings",                     SYS_PROP_NEW_MISC               ,SYSOBJ_FLAGS,  310  },
                    370:        {       "newuser_download_protocol",SYS_PROP_NEW_PROT           ,SYSOBJ_FLAGS,  310  },
                    371:        {       "newuser_expiration_days",      SYS_PROP_NEW_EXPIRE             ,SYSOBJ_FLAGS,  310  },
                    372:        {       "newuser_questions",            SYS_PROP_NEW_UQ                 ,SYSOBJ_FLAGS,  310  },
                    373: 
                    374:        {       "expired_level",                        SYS_PROP_EXPIRED_LEVEL  ,SYSOBJ_FLAGS,  310  },
                    375:        {       "expired_flags1",                       SYS_PROP_EXPIRED_FLAGS1 ,SYSOBJ_FLAGS,  310  },
                    376:        {       "expired_flags2",                       SYS_PROP_EXPIRED_FLAGS2 ,SYSOBJ_FLAGS,  310  },
                    377:        {       "expired_flags3",                       SYS_PROP_EXPIRED_FLAGS3 ,SYSOBJ_FLAGS,  310  },
                    378:        {       "expired_flags4",                       SYS_PROP_EXPIRED_FLAGS4 ,SYSOBJ_FLAGS,  310  },
                    379:        {       "expired_restrictions",         SYS_PROP_EXPIRED_REST   ,SYSOBJ_FLAGS,  310  },
                    380:        {       "expired_exemptions",           SYS_PROP_EXPIRED_EXEMPT ,SYSOBJ_FLAGS,  310  }, 
                    381: 
                    382:        /* directories */
                    383:        {       "node_dir",                                     SYS_PROP_NODE_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    384:        {       "ctrl_dir",                                     SYS_PROP_CTRL_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    385:        {       "data_dir",                                     SYS_PROP_DATA_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    386:        {       "text_dir",                                     SYS_PROP_TEXT_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    387:        {       "temp_dir",                                     SYS_PROP_TEMP_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    388:        {       "exec_dir",                                     SYS_PROP_EXEC_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    389:        {       "mods_dir",                                     SYS_PROP_MODS_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    390:        {       "logs_dir",                                     SYS_PROP_LOGS_DIR               ,SYSOBJ_FLAGS,  310  }, 
                    391: 
                    392:        /* filenames */
                    393:        {       "devnull",                                      SYS_PROP_DEVNULL                ,SYSOBJ_FLAGS,  311  },
                    394:        {       "temp_path",                            SYS_PROP_TEMP_PATH              ,SYSOBJ_FLAGS,  312      },
                    395: 
                    396:        /* clock access */
                    397:        {       "clock_ticks",                          SYS_PROP_CLOCK                  ,SYSOBJ_FLAGS,  311  },
                    398:        {       "clock_ticks_per_second",       SYS_PROP_CLOCK_PER_SEC  ,SYSOBJ_FLAGS,  311  },
                    399: 
                    400:        /* last */
                    401:        {       "local_host_name",                      SYS_PROP_LOCAL_HOSTNAME ,SYSOBJ_FLAGS,  311  },
                    402:        {0}
                    403: };
                    404: 
                    405: #ifdef _DEBUG
                    406: static char* sys_prop_desc[] = {
                    407:         "BBS name"
                    408:        ,"operator name"
                    409:        ,"system QWK-ID (for QWK packets)"
                    410:        ,"settings bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
                    411:        ,"PostLink name"
                    412:        ,"PostLink system number"
                    413:        ,"Internet address (host or domain name)"
                    414:        ,"location (city, state)"
                    415:        ,"timezone (use <i>system.zonestr()</i> to get string representation)"
                    416:        ,"days between forced password changes"
                    417:        ,"days to preserve deleted user records"
                    418: 
                    419:        ,"last user record number in user database (includes deleted and inactive user records)"
                    420:        ,"name of last user to logoff"
                    421:        ,"amount of free disk space (in bytes)"
                    422:        ,"amount of free disk space (in kilobytes)"
                    423: 
                    424:        ,"total number of BBS nodes"
                    425:        ,"last displayable node number"
                    426: 
                    427:        ,"new user password"
                    428:        ,"new user magic word"
                    429:        ,"new user level"
                    430:        ,"new user flag set #1"
                    431:        ,"new user flag set #2"
                    432:        ,"new user flag set #3"
                    433:        ,"new user flag set #4"
                    434:        ,"new user restriction flags"
                    435:        ,"new user exemption flags"
                    436:        ,"new user credits"
                    437:        ,"new user extra minutes"
                    438:        ,"new user command shell"
                    439:        ,"new user external editor"
                    440:        ,"new user settings"
                    441:        ,"new user file transfer protocol (command key)"
                    442:        ,"new user expiration days"
                    443:        ,"new user questions bitfield (see <tt>UQ_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
                    444: 
                    445:        ,"expired user level"
                    446:        ,"expired user flag set #1"
                    447:        ,"expired user flag set #2"
                    448:        ,"expired user flag set #3"
                    449:        ,"expired user flag set #4"
                    450:        ,"expired user restriction flags"
                    451:        ,"expired user exemption flags"
                    452: 
                    453:        /* directories */
                    454:        ,"node directory"
                    455:        ,"control file directory"
                    456:        ,"data file directory"
                    457:        ,"text file directory"
                    458:        ,"temporary file directory"
                    459:        ,"executable file directory"
                    460:        ,"modified modules directory (optional)"
                    461:        ,"log file directory"
                    462: 
                    463:        /* filenames */
                    464:        ,"platform-specific \"null\" device filename"
                    465:        ,"platform-specific temporary file directory"
                    466: 
                    467:        /* clock */
                    468:        ,"amount of elapsed processor time in clock 'ticks'"
                    469:        ,"number of clock ticks per second"
                    470: 
                    471:        /* INSERT new tabled properties here */
                    472:        ,"private host name that uniquely identifies this system on the local network"
                    473: 
                    474:        /* Manually created (non-tabled) properties */
                    475:        ,"public host name that uniquely identifies this system on the Internet (usually the same as <i>system.inetaddr</i>)"
                    476:        ,"Synchronet version number (e.g. '3.10')"
                    477:        ,"Synchronet revision letter (e.g. 'k')"
                    478:        ,"Synchronet alpha/beta designation (e.g. ' beta')"
                    479:        ,"Synchronet full version information (e.g. '3.10k Beta Debug')"
                    480:        ,"Synchronet version notice (includes version and platform)"
                    481:        ,"platform description (e.g. 'Win32', 'Linux', 'FreeBSD')"
                    482:        ,"socket library version information"
                    483:        ,"message base library version information"
                    484:        ,"compiler used to build Synchronet"
                    485:        ,"date and time compiled"
                    486:        ,"Synchronet copyright display"
                    487:        ,"JavaScript engine version information"
                    488:        ,"operating system version information"
                    489:        ,"time/date system was brought online (in time_t format)"
                    490: 
                    491:        ,"array of FidoNet Technology Network (FTN) addresses associated with this system"
                    492:        ,NULL
                    493: };
                    494: #endif
                    495: 
                    496: 
                    497: static JSClass js_system_class = {
                    498:      "System"                          /* name                 */
                    499:     ,JSCLASS_HAS_PRIVATE       /* flags                */
                    500:        ,JS_PropertyStub                /* addProperty  */
                    501:        ,JS_PropertyStub                /* delProperty  */
                    502:        ,js_system_get                  /* getProperty  */
                    503:        ,js_system_set                  /* setProperty  */
                    504:        ,JS_EnumerateStub               /* enumerate    */
                    505:        ,JS_ResolveStub                 /* resolve              */
                    506:        ,JS_ConvertStub                 /* convert              */
                    507:        ,JS_FinalizeStub                /* finalize             */
                    508: };
                    509: 
                    510: /* System Stats Propertiess */
                    511: enum {
                    512:         SYSSTAT_PROP_LOGONS
                    513:        ,SYSSTAT_PROP_LTODAY
                    514:        ,SYSSTAT_PROP_TIMEON
                    515:        ,SYSSTAT_PROP_TTODAY
                    516:        ,SYSSTAT_PROP_ULS
                    517:        ,SYSSTAT_PROP_ULB
                    518:        ,SYSSTAT_PROP_DLS
                    519:        ,SYSSTAT_PROP_DLB
                    520:        ,SYSSTAT_PROP_PTODAY
                    521:        ,SYSSTAT_PROP_ETODAY
                    522:        ,SYSSTAT_PROP_FTODAY
                    523:        ,SYSSTAT_PROP_NUSERS
                    524: 
                    525:        ,SYSSTAT_PROP_TOTALUSERS
                    526:        ,SYSSTAT_PROP_TOTALFILES
                    527:        ,SYSSTAT_PROP_TOTALMSGS
                    528:        ,SYSSTAT_PROP_TOTALMAIL
                    529:        ,SYSSTAT_PROP_FEEDBACK
                    530: };
                    531: 
                    532: static JSBool js_sysstats_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
                    533: {
                    534:     jsint       tiny;
                    535:        scfg_t*         cfg;
                    536:        stats_t         stats;
                    537:        uint            i;
                    538:        ulong           l;
                    539: 
                    540:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    541:                return(JS_FALSE);
                    542: 
                    543:     tiny = JSVAL_TO_INT(id);
                    544: 
                    545:        if(!getstats(cfg, 0, &stats))
                    546:                return(FALSE);
                    547: 
                    548:        switch(tiny) {
                    549:                case SYSSTAT_PROP_LOGONS:
                    550:                        JS_NewNumberValue(cx,stats.logons,vp);
                    551:                        break;
                    552:                case SYSSTAT_PROP_LTODAY:
                    553:                        JS_NewNumberValue(cx,stats.ltoday,vp);
                    554:                        break;
                    555:                case SYSSTAT_PROP_TIMEON:
                    556:                        JS_NewNumberValue(cx,stats.timeon,vp);
                    557:                        break;
                    558:                case SYSSTAT_PROP_TTODAY:
                    559:                        JS_NewNumberValue(cx,stats.ttoday,vp);
                    560:                        break;
                    561:                case SYSSTAT_PROP_ULS:
                    562:                        JS_NewNumberValue(cx,stats.uls,vp);
                    563:                        break;
                    564:                case SYSSTAT_PROP_ULB:
                    565:                        JS_NewNumberValue(cx,stats.ulb,vp);
                    566:                        break;
                    567:                case SYSSTAT_PROP_DLS:
                    568:                        JS_NewNumberValue(cx,stats.dls,vp);
                    569:                        break;
                    570:                case SYSSTAT_PROP_DLB:
                    571:                        JS_NewNumberValue(cx,stats.dlb,vp);
                    572:                        break;
                    573:                case SYSSTAT_PROP_PTODAY:
                    574:                        JS_NewNumberValue(cx,stats.ptoday,vp);
                    575:                        break;
                    576:                case SYSSTAT_PROP_ETODAY:
                    577:                        JS_NewNumberValue(cx,stats.etoday,vp);
                    578:                        break;
                    579:                case SYSSTAT_PROP_FTODAY:
                    580:                        JS_NewNumberValue(cx,stats.ftoday,vp);
                    581:                        break;
                    582:                case SYSSTAT_PROP_NUSERS:
                    583:                        JS_NewNumberValue(cx,stats.nusers,vp);
                    584:                        break;
                    585: 
                    586:                case SYSSTAT_PROP_TOTALUSERS:
                    587:                        *vp = INT_TO_JSVAL(total_users(cfg));
                    588:                        break;
                    589:                case SYSSTAT_PROP_TOTALMSGS:
                    590:                        l=0;
                    591:                        for(i=0;i<cfg->total_subs;i++)
                    592:                                l+=getposts(cfg,i); 
                    593:                        JS_NewNumberValue(cx,l,vp); 
                    594:                        break;
                    595:                case SYSSTAT_PROP_TOTALFILES:
                    596:                        l=0;
                    597:                        for(i=0;i<cfg->total_dirs;i++)
                    598:                                l+=getfiles(cfg,i);
                    599:                        JS_NewNumberValue(cx,l,vp);
                    600:                        break;
                    601:                case SYSSTAT_PROP_TOTALMAIL:
                    602:                        *vp = INT_TO_JSVAL(getmail(cfg, 0,0));
                    603:                        break;
                    604:                case SYSSTAT_PROP_FEEDBACK:
                    605:                        *vp = INT_TO_JSVAL(getmail(cfg, 1,0));
                    606:                        break;
                    607:        }
                    608: 
                    609:        return(TRUE);
                    610: }
                    611: 
                    612: #define SYSSTAT_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
                    613: 
                    614: static jsSyncPropertySpec js_sysstats_properties[] = {
                    615: /*              name,                                          tinyid,                                         flags,                  ver     */
                    616: 
                    617:        {       "total_logons",                         SYSSTAT_PROP_LOGONS,            SYSSTAT_FLAGS,  310 },
                    618:        {       "logons_today",                         SYSSTAT_PROP_LTODAY,            SYSSTAT_FLAGS,  310 },
                    619:        {       "total_timeon",                         SYSSTAT_PROP_TIMEON,            SYSSTAT_FLAGS,  310 },
                    620:        {       "timeon_today",                         SYSSTAT_PROP_TTODAY,            SYSSTAT_FLAGS,  310 },
                    621:        {       "total_files",                          SYSSTAT_PROP_TOTALFILES,        SYSSTAT_FLAGS,  310 },
                    622:        {       "files_uploaded_today",         SYSSTAT_PROP_ULS,                       SYSSTAT_FLAGS,  310 },
                    623:        {       "bytes_uploaded_today",         SYSSTAT_PROP_ULB,                       SYSSTAT_FLAGS,  310 },
                    624:        {       "files_downloaded_today",       SYSSTAT_PROP_DLS,                       SYSSTAT_FLAGS,  310 },
                    625:        {       "bytes_downloaded_today",       SYSSTAT_PROP_DLB,                       SYSSTAT_FLAGS,  310 },
                    626:        {       "total_messages",                       SYSSTAT_PROP_TOTALMSGS,         SYSSTAT_FLAGS,  310 },
                    627:        {       "messages_posted_today",        SYSSTAT_PROP_PTODAY,            SYSSTAT_FLAGS,  310 },
                    628:        {       "total_email",                          SYSSTAT_PROP_TOTALMAIL,         SYSSTAT_FLAGS,  310 },
                    629:        {       "email_sent_today",                     SYSSTAT_PROP_ETODAY,            SYSSTAT_FLAGS,  310 },
                    630:        {       "total_feedback",                       SYSSTAT_PROP_FEEDBACK,          SYSSTAT_FLAGS,  310 },
                    631:        {       "feedback_sent_today",          SYSSTAT_PROP_FTODAY,            SYSSTAT_FLAGS,  310 },
                    632:        {       "total_users",                          SYSSTAT_PROP_TOTALUSERS,        SYSSTAT_FLAGS,  310 },
                    633:        {       "new_users_today",                      SYSSTAT_PROP_NUSERS,            SYSSTAT_FLAGS,  310 },
                    634:        {0}
                    635: };
                    636: 
                    637: #ifdef _DEBUG
                    638: static char* sysstat_prop_desc[] = {
                    639:         "total logons"
                    640:        ,"logons today"
                    641:        ,"total time used"
                    642:        ,"time used today"
                    643:        ,"total files in file bases"
                    644:        ,"files uploaded today"
                    645:        ,"bytes uploaded today"
                    646:        ,"files downloaded today"
                    647:        ,"bytes downloaded today"
                    648:        ,"total messages in message bases"
                    649:        ,"messages posted today"
                    650:        ,"total messages in mail base"
                    651:        ,"email sent today"
                    652:        ,"total feedback messages waiting"
                    653:        ,"feedback sent today"
                    654:        ,"total user records (does not include deleted or inactive user records)"
                    655:        ,"new users today"
                    656:        ,NULL
                    657: };
                    658: #endif
                    659: 
                    660: 
                    661: static JSClass js_sysstats_class = {
                    662:      "Stats"                           /* name                 */
                    663:     ,JSCLASS_HAS_PRIVATE       /* flags                */
                    664:        ,JS_PropertyStub                /* addProperty  */
                    665:        ,JS_PropertyStub                /* delProperty  */
                    666:        ,js_sysstats_get                /* getProperty  */
                    667:        ,JS_PropertyStub                /* setProperty  */
                    668:        ,JS_EnumerateStub               /* enumerate    */
                    669:        ,JS_ResolveStub                 /* resolve              */
                    670:        ,JS_ConvertStub                 /* convert              */
                    671:        ,JS_FinalizeStub                /* finalize             */
                    672: };
                    673: 
                    674: static JSBool
                    675: js_alias(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    676: {
                    677:        char*           p;
                    678:        char            buf[128];
                    679:        JSString*       js_str;
                    680:        scfg_t*         cfg;
                    681: 
                    682:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    683:                return(JS_FALSE);
                    684: 
                    685:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
                    686:                *rval = INT_TO_JSVAL(0);
                    687:                return(JS_TRUE);
                    688:        }
                    689: 
                    690:        if((p=JS_GetStringBytes(js_str))==NULL) {
                    691:                *rval = INT_TO_JSVAL(0);
                    692:                return(JS_TRUE);
                    693:        }
                    694: 
                    695:        p=alias(cfg,p,buf);
                    696: 
                    697:        if((js_str = JS_NewStringCopyZ(cx, p))==NULL)
                    698:                return(JS_FALSE);
                    699: 
                    700:        *rval = STRING_TO_JSVAL(js_str);
                    701:        return(JS_TRUE);
                    702: }
                    703: 
                    704: static JSBool
                    705: js_username(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    706: {
                    707:        int32           val;
                    708:        char            buf[128];
                    709:        JSString*       js_str;
                    710:        scfg_t*         cfg;
                    711: 
                    712:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    713:                return(JS_FALSE);
                    714: 
                    715:        val=0;
                    716:        JS_ValueToInt32(cx,argv[0],&val);
                    717: 
                    718:        if((js_str = JS_NewStringCopyZ(cx, username(cfg,val,buf)))==NULL)
                    719:                return(JS_FALSE);
                    720: 
                    721:        *rval = STRING_TO_JSVAL(js_str);
                    722:        return(JS_TRUE);
                    723: }
                    724: 
                    725: 
                    726: static JSBool
                    727: js_matchuser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    728: {
                    729:        char*           p;
                    730:        JSString*       js_str;
                    731:        scfg_t*         cfg;
                    732:        BOOL            sysop_alias=TRUE;
                    733: 
                    734:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    735:                return(JS_FALSE);
                    736: 
                    737:        if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
                    738:                *rval = INT_TO_JSVAL(0);
                    739:                return(JS_TRUE);
                    740:        }
                    741: 
                    742:        if(argc>1)
                    743:                JS_ValueToBoolean(cx,argv[1],&sysop_alias);
                    744: 
                    745:        if((p=JS_GetStringBytes(js_str))==NULL) {
                    746:                *rval = INT_TO_JSVAL(0);
                    747:                return(JS_TRUE);
                    748:        }
                    749: 
                    750:        *rval = INT_TO_JSVAL(matchuser(cfg,p,sysop_alias));
                    751:        return(JS_TRUE);
                    752: }
                    753: 
                    754: static JSBool
                    755: js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    756: {
                    757:        char*           p;
                    758:        JSString*       js_str;
                    759:        int32           offset=0;
                    760:        int32           usernumber=0;
                    761:        int                     len;
                    762:        scfg_t*         cfg;
                    763: 
                    764:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    765:                return(JS_FALSE);
                    766: 
                    767:        JS_ValueToInt32(cx,argv[0],&offset);
                    768:        if((len=user_rec_len(offset))<0)
                    769:                return(JS_FALSE);
                    770: 
                    771:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
                    772:                *rval = INT_TO_JSVAL(0);
                    773:                return(JS_TRUE);
                    774:        }
                    775: 
                    776:        if(argc>2)
                    777:                JS_ValueToInt32(cx,argv[2],&usernumber);
                    778: 
                    779:        if((p=JS_GetStringBytes(js_str))==NULL) {
                    780:                *rval = INT_TO_JSVAL(0);
                    781:                return(JS_TRUE);
                    782:        }
                    783: 
                    784:        *rval = INT_TO_JSVAL(userdatdupe(cfg,usernumber,offset,len,p,FALSE /* deleted users */));
                    785:        return(JS_TRUE);
                    786: }
                    787: 
                    788: static JSBool
                    789: js_trashcan(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    790: {
                    791:        char*           str;
                    792:        char*           can;
                    793:        JSString*       js_str;
                    794:        JSString*       js_can;
                    795:        scfg_t*         cfg;
                    796: 
                    797:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    798:                return(JS_FALSE);
                    799: 
                    800:        if((js_can=JS_ValueToString(cx, argv[0]))==NULL) {
                    801:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    802:                return(JS_TRUE);
                    803:        }
                    804: 
                    805:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
                    806:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    807:                return(JS_TRUE);
                    808:        }
                    809: 
                    810:        if((can=JS_GetStringBytes(js_can))==NULL) {
                    811:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    812:                return(JS_TRUE);
                    813:        }
                    814: 
                    815:        if((str=JS_GetStringBytes(js_str))==NULL) {
                    816:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    817:                return(JS_TRUE);
                    818:        }
                    819: 
                    820:        *rval = BOOLEAN_TO_JSVAL(trashcan(cfg,str,can));        // user args are reversed
                    821:        return(JS_TRUE);
                    822: }
                    823: 
                    824: static JSBool
                    825: js_findstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    826: {
                    827:        char*           str;
                    828:        char*           fname;
                    829:        JSString*       js_str;
                    830:        JSString*       js_fname;
                    831: 
                    832:        if((js_fname=JS_ValueToString(cx, argv[0]))==NULL) {
                    833:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    834:                return(JS_TRUE);
                    835:        }
                    836: 
                    837:        if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
                    838:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    839:                return(JS_TRUE);
                    840:        }
                    841: 
                    842:        if((fname=JS_GetStringBytes(js_fname))==NULL) {
                    843:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    844:                return(JS_TRUE);
                    845:        }
                    846: 
                    847:        if((str=JS_GetStringBytes(js_str))==NULL) {
                    848:                *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
                    849:                return(JS_TRUE);
                    850:        }
                    851: 
                    852:        *rval = BOOLEAN_TO_JSVAL(findstr(str,fname));   // user args are reversed
                    853:        return(JS_TRUE);
                    854: }
                    855: 
                    856: 
                    857: static JSBool
                    858: js_zonestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    859: {
                    860:        JSString*       js_str;
                    861:        short           zone;
                    862:        int32           val=0;
                    863:        scfg_t*         cfg;
                    864: 
                    865:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    866:                return(JS_FALSE);
                    867: 
                    868:        if(argc<1)
                    869:                zone=sys_timezone(cfg);
                    870:        else {
                    871:                JS_ValueToInt32(cx,argv[0],&val);
                    872:                zone=(short)val;
                    873:        }
                    874: 
                    875:        if((js_str = JS_NewStringCopyZ(cx, smb_zonestr(zone,NULL)))==NULL)
                    876:                return(JS_FALSE);
                    877: 
                    878:        *rval = STRING_TO_JSVAL(js_str);
                    879:        return(JS_TRUE);
                    880: }
                    881: 
                    882: // Returns a ctime()-like string in the system-preferred time format
                    883: static JSBool
                    884: js_timestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    885: {
                    886:        char            str[128];
                    887:        int32           i=0;
                    888:        time_t          t;
                    889:        JSString*       js_str;
                    890:        scfg_t*         cfg;
                    891: 
                    892:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    893:                return(JS_FALSE);
                    894: 
                    895:        if(argc<1)
                    896:                i=time(NULL);   /* use current time */
                    897:        else
                    898:                JS_ValueToInt32(cx,argv[0],&i);
                    899:        t=i;
                    900:        timestr(cfg,&t,str);
                    901:        if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
                    902:                return(JS_FALSE);
                    903: 
                    904:        *rval = STRING_TO_JSVAL(js_str);
                    905:        return(JS_TRUE);
                    906: }
                    907: 
                    908: 
                    909: // Returns a mm/dd/yy or dd/mm/yy formated string
                    910: static JSBool
                    911: js_datestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    912: {
                    913:        char            str[128];
                    914:        time_t          t;
                    915:        JSString*       js_str;
                    916:        scfg_t*         cfg;
                    917: 
                    918:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    919:                return(JS_FALSE);
                    920: 
                    921:        if(argc<1)
                    922:                t=time(NULL);   /* use current time */
                    923:        else {
                    924:                if(JSVAL_IS_STRING(argv[0])) {  /* convert from string to time_t? */
                    925:                        *rval = INT_TO_JSVAL(
                    926:                                dstrtounix(cfg,JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
                    927:                        return(JS_TRUE);
                    928:                }
                    929:                JS_ValueToInt32(cx,argv[0],(int32*)&t);
                    930:        }
                    931:        unixtodstr(cfg,t,str);
                    932:        if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
                    933:                return(JS_FALSE);
                    934: 
                    935:        *rval = STRING_TO_JSVAL(js_str);
                    936:        return(JS_TRUE);
                    937: }
                    938: 
                    939: static JSBool
                    940: js_secondstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    941: {
                    942:        char            str[128];
                    943:        int32           t=0;
                    944:        JSString*       js_str;
                    945: 
                    946:        *rval = JSVAL_NULL;
                    947: 
                    948:        if(argc<1)
                    949:                return(JS_TRUE);
                    950: 
                    951:        JS_ValueToInt32(cx,argv[0],&t);
                    952:        sectostr(t,str);
                    953:        if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
                    954:                return(JS_FALSE);
                    955: 
                    956:        *rval = STRING_TO_JSVAL(js_str);
                    957:        return(JS_TRUE);
                    958: }
                    959: 
                    960: static JSBool
                    961: js_spamlog(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                    962: {
                    963:        uintN           i;
                    964:        char*           p;
                    965:        char*           prot=NULL;
                    966:        char*           action=NULL;
                    967:        char*           reason=NULL;
                    968:        char*           host=NULL;
                    969:        char*           ip_addr=NULL;
                    970:        char*           to=NULL;
                    971:        char*           from=NULL;
                    972:        scfg_t*         cfg;
                    973: 
                    974:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                    975:                return(JS_FALSE);
                    976: 
                    977:        for(i=0;i<argc;i++) {
                    978:                if(!JSVAL_IS_STRING(argv[i]))
                    979:                        continue;
                    980:                p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
                    981:                if(p==NULL)
                    982:                        continue;
                    983:                if(prot==NULL)
                    984:                        prot=p;
                    985:                else if(action==NULL)
                    986:                        action=p;
                    987:                else if(reason==NULL)
                    988:                        reason=p;
                    989:                else if(host==NULL)
                    990:                        host=p;
                    991:                else if(ip_addr==NULL)
                    992:                        ip_addr=p;
                    993:                else if(to==NULL)
                    994:                        to=p;
                    995:                else if(from==NULL)
                    996:                        from=p;
                    997:        }
                    998:        *rval = BOOLEAN_TO_JSVAL(spamlog(cfg,prot,action,reason,host,ip_addr,to,from));
                    999:        return(JS_TRUE);
                   1000: }
                   1001: 
                   1002: static JSBool
                   1003: js_hacklog(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1004: {
                   1005:        uintN           i;
                   1006:        int32           i32=0;
                   1007:        char*           p;
                   1008:        char*           prot=NULL;
                   1009:        char*           user=NULL;
                   1010:        char*           text=NULL;
                   1011:        char*           host=NULL;
                   1012:        SOCKADDR_IN     addr;
                   1013:        scfg_t*         cfg;
                   1014: 
                   1015:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1016:                return(JS_FALSE);
                   1017: 
                   1018:        memset(&addr,0,sizeof(addr));
                   1019:        for(i=0;i<argc;i++) {
                   1020:                if(JSVAL_IS_NUMBER(argv[i])) {
                   1021:                        JS_ValueToInt32(cx,argv[i],&i32);
                   1022:                        if(addr.sin_addr.s_addr==0)
                   1023:                                addr.sin_addr.s_addr=i32;
                   1024:                        else
                   1025:                                addr.sin_port=(ushort)i32;
                   1026:                        continue;
                   1027:                }
                   1028:                if(!JSVAL_IS_STRING(argv[i]))
                   1029:                        continue;
                   1030:                p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
                   1031:                if(p==NULL)
                   1032:                        continue;
                   1033:                if(prot==NULL)
                   1034:                        prot=p;
                   1035:                else if(user==NULL)
                   1036:                        user=p;
                   1037:                else if(text==NULL)
                   1038:                        text=p;
                   1039:                else if(host==NULL)
                   1040:                        host=p;
                   1041:        }
                   1042:        *rval = BOOLEAN_TO_JSVAL(hacklog(cfg,prot,user,text,host,&addr));
                   1043:        return(JS_TRUE);
                   1044: }
                   1045: 
                   1046: static JSBool
                   1047: js_filter_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1048: {
                   1049:        uintN           i;
                   1050:        char*           p;
                   1051:        char*           prot=NULL;
                   1052:        char*           reason=NULL;
                   1053:        char*           host=NULL;
                   1054:        char*           ip_addr=NULL;
                   1055:        char*           from=NULL;
                   1056:        char*           fname=NULL;
                   1057:        scfg_t*         cfg;
                   1058: 
                   1059:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1060:                return(JS_FALSE);
                   1061: 
                   1062:        for(i=0;i<argc;i++) {
                   1063:                if(!JSVAL_IS_STRING(argv[i]))
                   1064:                        continue;
                   1065:                p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
                   1066:                if(p==NULL)
                   1067:                        continue;
                   1068:                if(prot==NULL)
                   1069:                        prot=p;
                   1070:                else if(reason==NULL)
                   1071:                        reason=p;
                   1072:                else if(host==NULL)
                   1073:                        host=p;
                   1074:                else if(ip_addr==NULL)
                   1075:                        ip_addr=p;
                   1076:                else if(from==NULL)
                   1077:                        from=p;
                   1078:                else if(fname==NULL)
                   1079:                        fname=p;
                   1080:        }
                   1081:        *rval = BOOLEAN_TO_JSVAL(filter_ip(cfg,prot,reason,host,ip_addr,from,fname));
                   1082:        return(JS_TRUE);
                   1083: }
                   1084: 
                   1085: static JSBool
                   1086: js_get_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1087: {
                   1088:        char*           buf;
                   1089:        int32           node_num;
                   1090:        JSString*       js_str;
                   1091:        scfg_t*         cfg;
                   1092: 
                   1093:        *rval = JSVAL_NULL;
                   1094: 
                   1095:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1096:                return(JS_FALSE);
                   1097: 
                   1098:        node_num=cfg->node_num;
                   1099:        if(argc) 
                   1100:                JS_ValueToInt32(cx,argv[0],&node_num);
                   1101:        if(node_num<1)
                   1102:                node_num=1;
                   1103: 
                   1104:        if((buf=getnmsg(cfg,node_num))==NULL)
                   1105:                return(JS_TRUE);
                   1106: 
                   1107:        js_str=JS_NewStringCopyZ(cx, buf);
                   1108:        free(buf);
                   1109: 
                   1110:        if(js_str==NULL)
                   1111:                return(JS_FALSE);
                   1112:        *rval = STRING_TO_JSVAL(js_str);
                   1113:        return(JS_TRUE);
                   1114: }
                   1115: 
                   1116: 
                   1117: static JSBool
                   1118: js_put_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1119: {
                   1120:        int32           node=1;
                   1121:        JSString*       js_msg;
                   1122:        char*           msg;
                   1123:        scfg_t*         cfg;
                   1124: 
                   1125:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1126:                return(JS_FALSE);
                   1127: 
                   1128:        JS_ValueToInt32(cx,argv[0],&node);
                   1129:        if(node<1)
                   1130:                node=1;
                   1131: 
                   1132:        if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) 
                   1133:                return(JS_FALSE);
                   1134: 
                   1135:        if((msg=JS_GetStringBytes(js_msg))==NULL) 
                   1136:                return(JS_FALSE);
                   1137: 
                   1138:        *rval = BOOLEAN_TO_JSVAL(putnmsg(cfg,node,msg)==0);
                   1139: 
                   1140:        return(JS_TRUE);
                   1141: }
                   1142: 
                   1143: static JSBool
                   1144: js_get_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1145: {
                   1146:        char*           buf;
                   1147:        int32           usernumber=1;
                   1148:        JSString*       js_str;
                   1149:        scfg_t*         cfg;
                   1150: 
                   1151:        *rval = JSVAL_NULL;
                   1152: 
                   1153:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1154:                return(JS_FALSE);
                   1155: 
                   1156:        JS_ValueToInt32(cx,argv[0],&usernumber);
                   1157:        if(usernumber<1)
                   1158:                usernumber=1;
                   1159: 
                   1160:        if((buf=getsmsg(cfg,usernumber))==NULL)
                   1161:                return(JS_TRUE);
                   1162: 
                   1163:        js_str=JS_NewStringCopyZ(cx, buf);
                   1164:        free(buf);
                   1165: 
                   1166:        if(js_str==NULL)
                   1167:                return(JS_FALSE);
                   1168:        *rval = STRING_TO_JSVAL(js_str);
                   1169:        return(JS_TRUE);
                   1170: }
                   1171: 
                   1172: static JSBool
                   1173: js_put_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1174: {
                   1175:        int32           usernumber=1;
                   1176:        JSString*       js_msg;
                   1177:        char*           msg;
                   1178:        scfg_t*         cfg;
                   1179: 
                   1180:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1181:                return(JS_FALSE);
                   1182: 
                   1183:        JS_ValueToInt32(cx,argv[0],&usernumber);
                   1184:        if(usernumber<1)
                   1185:                usernumber=1;
                   1186: 
                   1187:        if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) 
                   1188:                return(JS_FALSE);
                   1189: 
                   1190:        if((msg=JS_GetStringBytes(js_msg))==NULL) 
                   1191:                return(JS_FALSE);
                   1192: 
                   1193:        *rval = BOOLEAN_TO_JSVAL(putsmsg(cfg,usernumber,msg)==0);
                   1194: 
                   1195:        return(JS_TRUE);
                   1196: }
                   1197: 
                   1198: static JSBool
                   1199: js_new_user(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1200: {
                   1201:        char*           alias;
                   1202:        int                     i;
                   1203:        scfg_t*         cfg;
                   1204:        user_t          user;
                   1205:        JSObject*       userobj;
                   1206: 
                   1207:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1208:                return(JS_FALSE);
                   1209: 
                   1210:        alias=JS_GetStringBytes(JS_ValueToString(cx,argv[0]));
                   1211: 
                   1212:        memset(&user,0,sizeof(user));
                   1213: 
                   1214:        user.sex=' ';
                   1215:        SAFECOPY(user.alias,alias);
                   1216: 
                   1217:        /* statistics */
                   1218:        user.firston=user.laston=user.pwmod=time(NULL);
                   1219: 
                   1220:        /* security */
                   1221:        user.level=cfg->new_level;
                   1222:        user.flags1=cfg->new_flags1;
                   1223:        user.flags2=cfg->new_flags2;
                   1224:        user.flags3=cfg->new_flags3;
                   1225:        user.flags4=cfg->new_flags4;
                   1226:        user.rest=cfg->new_rest;
                   1227:        user.exempt=cfg->new_exempt;
                   1228: 
                   1229:        user.cdt=cfg->new_cdt;
                   1230:        user.min=cfg->new_min;
                   1231:        user.freecdt=cfg->level_freecdtperday[user.level];
                   1232:        if(cfg->new_expire)
                   1233:                user.expire=user.firston+((long)cfg->new_expire*24L*60L*60L);
                   1234:        else
                   1235:                user.expire=0;
                   1236: 
                   1237:        /* settings */
                   1238:        if(cfg->total_fcomps)
                   1239:                strcpy(user.tmpext,cfg->fcomp[0]->ext);
                   1240:        else
                   1241:                strcpy(user.tmpext,"ZIP");
                   1242: 
                   1243:        user.shell=cfg->new_shell;
                   1244:        user.misc=cfg->new_misc|(AUTOTERM|COLOR);
                   1245:        user.prot=cfg->new_prot;
                   1246:        user.qwk=QWK_DEFAULT;
                   1247: 
                   1248:        for(i=0;i<cfg->total_xedits;i++)
                   1249:                if(!stricmp(cfg->xedit[i]->code,cfg->new_xedit) && chk_ar(cfg,cfg->xedit[i]->ar,&user))
                   1250:                        break;
                   1251:        if(i<cfg->total_xedits)
                   1252:                user.xedit=i+1;
                   1253: 
                   1254:        i=newuserdat(cfg,&user);
                   1255: 
                   1256:        if(i==0) {
                   1257:                userobj=js_CreateUserObject(cx, obj, cfg, NULL, user.number);
                   1258:                *rval = OBJECT_TO_JSVAL(userobj);
                   1259:        } else
                   1260:                *rval = INT_TO_JSVAL(i);
                   1261: 
                   1262:        return(JS_TRUE);
                   1263: }
                   1264: 
                   1265: static JSBool
                   1266: js_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1267: {
                   1268:        *rval = INT_TO_JSVAL(system(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
                   1269:        
                   1270:        return(JS_TRUE);
                   1271: }
                   1272: 
                   1273: static JSBool
                   1274: js_popen(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1275: {
                   1276:        char            str[1024];
                   1277:        char*           cmd;
                   1278:        FILE*           fp;
                   1279:        jsint           line=0;
                   1280:        jsval           val;
                   1281:        JSObject*       array;
                   1282:        JSString*       js_str;
                   1283: 
                   1284:        *rval = JSVAL_VOID;
                   1285: 
                   1286:        if(argc<1)
                   1287:                return(JS_TRUE);
                   1288: 
                   1289:        if((array=JS_NewArrayObject(cx,0,NULL))==NULL)
                   1290:                return(JS_FALSE);
                   1291: 
                   1292:        cmd=JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
                   1293:        if((fp=popen(cmd,"r"))==NULL)
                   1294:                return(JS_TRUE);
                   1295:        while(!feof(fp)) {
                   1296:                if(fgets(str,sizeof(str),fp)==NULL)
                   1297:                        break;
                   1298:                if((js_str=JS_NewStringCopyZ(cx,str))==NULL)
                   1299:                        break;
                   1300:                val=STRING_TO_JSVAL(js_str);
                   1301:         if(!JS_SetElement(cx, array, line++, &val))
                   1302:                        break;
                   1303:        }
                   1304:        pclose(fp);
                   1305: 
                   1306:     *rval = OBJECT_TO_JSVAL(array);
                   1307: 
                   1308:     return(JS_TRUE);
                   1309: }
                   1310: 
                   1311: static JSBool
                   1312: js_chksyspass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
                   1313: {
                   1314:        scfg_t*         cfg;
                   1315: 
                   1316:        if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
                   1317:                return(JS_FALSE);
                   1318: 
                   1319:        *rval = BOOLEAN_TO_JSVAL(stricmp(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))
                   1320:                                                                ,cfg->sys_pass)==0);
                   1321:        
                   1322:        return(JS_TRUE);
                   1323: }
                   1324: 
                   1325: 
                   1326: 
                   1327: static jsSyncMethodSpec js_system_functions[] = {
                   1328:        {"username",            js_username,            1,      JSTYPE_STRING,  JSDOCSTR("number")
                   1329:        ,JSDOCSTR("returns name of user in specified user record <i>number</i>, or empty string if not found")
                   1330:        ,311
                   1331:        },
                   1332:        {"alias",                       js_alias,                       1,      JSTYPE_STRING,  JSDOCSTR("string alias")
                   1333:        ,JSDOCSTR("returns name of user that matches alias (if found in <tt>ctrl/alias.cfg</tt>)")
                   1334:        ,310
                   1335:        },              
                   1336:        {"matchuser",           js_matchuser,           1,      JSTYPE_NUMBER,  JSDOCSTR("string username [,bool sysop_alias]")
                   1337:        ,JSDOCSTR("exact user name matching, returns number of user whose name/alias matches <i>username</i> "
                   1338:                " or 0 if not found, matches well-known sysop aliases by default")
                   1339:        ,310
                   1340:        },              
                   1341:        {"matchuserdata",       js_matchuserdata,       2,      JSTYPE_NUMBER,  JSDOCSTR("field, data [,usernumber]")
                   1342:        ,JSDOCSTR("search user database for data in a specific field (specified by offset), "
                   1343:                "returns first matching user record number, optional <i>usernumber</i> specifies user record to skip")
                   1344:        ,310
                   1345:        },
                   1346:        {"trashcan",            js_trashcan,            2,      JSTYPE_BOOLEAN, JSDOCSTR("string filename, search")
                   1347:        ,JSDOCSTR("search text/filename.can for pseudo-regexp")
                   1348:        ,310
                   1349:        },              
                   1350:        {"findstr",                     js_findstr,                     2,      JSTYPE_BOOLEAN, JSDOCSTR("string filename, search")
                   1351:        ,JSDOCSTR("search any file for pseudo-regexp")
                   1352:        ,310
                   1353:        },              
                   1354:        {"zonestr",                     js_zonestr,                     0,      JSTYPE_STRING,  JSDOCSTR("[timezone]")
                   1355:        ,JSDOCSTR("convert time zone integer to string, defaults to system timezone if <i>timezone</i> not specified")
                   1356:        ,310
                   1357:        },              
                   1358:        {"timestr",                     js_timestr,                     0,      JSTYPE_STRING,  JSDOCSTR("[time]")
                   1359:        ,JSDOCSTR("convert time_t integer into a time string, "
                   1360:                "defaults to current time if <i>time</i> not specified")
                   1361:        ,310
                   1362:        },              
                   1363:        {"datestr",                     js_datestr,                     0,      JSTYPE_STRING,  JSDOCSTR("[time]")
                   1364:        ,JSDOCSTR("convert time_t integer into a date string (in either <tt>MM/DD/YY</tt> or <tt>DD/MM/YY</tt> format), "
                   1365:                "defaults to current date if <i>time</i> not specified")
                   1366:        ,310
                   1367:        },              
                   1368:        {"secondstr",           js_secondstr,           0,      JSTYPE_STRING,  JSDOCSTR("seconds")
                   1369:        ,JSDOCSTR("convert elapsed time in seconds into a string in <tt>hh:mm:ss</tt> format")
                   1370:        ,310
                   1371:        },              
                   1372:        {"spamlog",                     js_spamlog,                     6,      JSTYPE_BOOLEAN, JSDOCSTR("[protocol, action, reason, host, ip, to, from]")
                   1373:        ,JSDOCSTR("log a suspected SPAM attempt")
                   1374:        ,310
                   1375:        },              
                   1376:        {"hacklog",                     js_hacklog,                     5,      JSTYPE_BOOLEAN, JSDOCSTR("[protocol, user, text, host, ip, port]")
                   1377:        ,JSDOCSTR("log a suspected hack attempt")
                   1378:        ,310
                   1379:        },
                   1380:        {"filter_ip",           js_filter_ip,           4,      JSTYPE_BOOLEAN, JSDOCSTR("[protocol, reason, host, ip, username]")
                   1381:        ,JSDOCSTR("add an IP address (with comment) to the system's IP filter file")
                   1382:        ,311
                   1383:        },              
                   1384:        {"get_node_message",js_get_node_message,0,      JSTYPE_STRING,  JSDOCSTR("number node")
                   1385:        ,JSDOCSTR("read any messages waiting for the specified node and return in a single string")
                   1386:        ,311
                   1387:        },              
                   1388:        {"put_node_message",js_put_node_message,2,      JSTYPE_BOOLEAN, JSDOCSTR("number node, string message")
                   1389:        ,JSDOCSTR("send a node a short text message, delivered immediately")
                   1390:        ,310
                   1391:        },              
                   1392:        {"get_telegram",        js_get_telegram,        1,      JSTYPE_STRING,  JSDOCSTR("number user")
                   1393:        ,JSDOCSTR("returns any short text messages waiting for the specified user")
                   1394:        ,311
                   1395:        },              
                   1396:        {"put_telegram",        js_put_telegram,        2,      JSTYPE_BOOLEAN, JSDOCSTR("number user, string message")
                   1397:        ,JSDOCSTR("sends a user a short text message, delivered immediately or during next logon")
                   1398:        ,310
                   1399:        },              
                   1400:        {"newuser",                     js_new_user,            1,      JSTYPE_ALIAS },
                   1401:        {"new_user",            js_new_user,            1,      JSTYPE_OBJECT,  JSDOCSTR("name/alias")
                   1402:        ,JSDOCSTR("creates a new user record, returns a new <a href=#User>User</a> object representing the new user account")
                   1403:        ,310
                   1404:        },
                   1405:        {"exec",                        js_exec,                        1,      JSTYPE_NUMBER,  JSDOCSTR("command-line")
                   1406:        ,JSDOCSTR("executes a native system/shell command-line, returns <i>0</i> on success")
                   1407:        ,311
                   1408:        },
                   1409:        {"popen",                       js_popen,                       0,      JSTYPE_ARRAY,   JSDOCSTR("command-line")
                   1410:        ,JSDOCSTR("executes a native system/shell command-line, returns array of captured output lines on success "
                   1411:                "(<b>only functional on UNIX systems</b>)")
                   1412:        ,311
                   1413:        },
                   1414:        {"check_syspass",       js_chksyspass,          1,      JSTYPE_BOOLEAN, JSDOCSTR("string password")
                   1415:        ,JSDOCSTR("compares the supplied <i>password</i> against the system password and return's <i>true</i> if it matches")
                   1416:        ,311
                   1417:        },
                   1418:        {0}
                   1419: };
                   1420: 
                   1421: 
                   1422: /* node properties */
                   1423: enum {
                   1424:        /* raw node_t fields */
                   1425:         NODE_PROP_STATUS
                   1426:        ,NODE_PROP_ERRORS
                   1427:        ,NODE_PROP_ACTION
                   1428:        ,NODE_PROP_USERON
                   1429:        ,NODE_PROP_CONNECTION
                   1430:        ,NODE_PROP_MISC
                   1431:        ,NODE_PROP_AUX
                   1432:        ,NODE_PROP_EXTAUX
                   1433: };
                   1434: 
                   1435: #ifdef _DEBUG
                   1436: static char* node_prop_desc[] = {
                   1437:         "status (see <tt>nodedefs.js</tt> for valid values)"
                   1438:        ,"error counter"
                   1439:        ,"current user action (see <tt>nodedefs.js</tt>)"
                   1440:        ,"current user number"
                   1441:        ,"connection speed (<tt>0xffff</tt> = Telnet or RLogin)"
                   1442:        ,"miscellaneous bitfield (see <tt>nodedefs.js</tt>)"
                   1443:        ,"auxillary value"
                   1444:        ,"extended auxillary value"
                   1445:        ,NULL
                   1446: };
                   1447: #endif
                   1448: 
                   1449: 
                   1450: static JSBool js_node_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
                   1451: {
                   1452:        uint            node_num;
                   1453:     jsint       tiny;
                   1454:        node_t          node;
                   1455:        scfg_t*         cfg;
                   1456:        JSObject*       sysobj;
                   1457:        JSObject*       node_list;
                   1458: 
                   1459:        tiny = JSVAL_TO_INT(id);
                   1460: 
                   1461:        if((node_list=JS_GetParent(cx, obj))==NULL)
                   1462:                return(JS_FALSE);
                   1463: 
                   1464:        if((sysobj=JS_GetParent(cx, node_list))==NULL)
                   1465:                return(JS_FALSE);
                   1466: 
                   1467:        if((cfg=(scfg_t*)JS_GetPrivate(cx,sysobj))==NULL)
                   1468:                return(JS_FALSE);
                   1469: 
                   1470:        node_num=(uint)JS_GetPrivate(cx,obj)>>1;
                   1471: 
                   1472:        memset(&node,0,sizeof(node));
                   1473:        if(getnodedat(cfg, node_num, &node, NULL))
                   1474:                return(JS_TRUE);
                   1475:        
                   1476:     switch(tiny) {
                   1477:                case NODE_PROP_STATUS:
                   1478:                        *vp = INT_TO_JSVAL((int)node.status);
                   1479:                        break;
                   1480:                case NODE_PROP_ERRORS:  
                   1481:                        *vp = INT_TO_JSVAL((int)node.errors);
                   1482:                        break;
                   1483:                case NODE_PROP_ACTION:  
                   1484:                        *vp = INT_TO_JSVAL((int)node.action);
                   1485:                        break;
                   1486:                case NODE_PROP_USERON:  
                   1487:                        *vp = INT_TO_JSVAL((int)node.useron);
                   1488:                        break;
                   1489:                case NODE_PROP_CONNECTION:
                   1490:                        *vp = INT_TO_JSVAL((int)node.connection);
                   1491:                        break;
                   1492:                case NODE_PROP_MISC:            
                   1493:                        *vp = INT_TO_JSVAL((int)node.misc);
                   1494:                        break;
                   1495:                case NODE_PROP_AUX:             
                   1496:                        *vp = INT_TO_JSVAL((int)node.aux);
                   1497:                        break;
                   1498:                case NODE_PROP_EXTAUX:  
                   1499:                        JS_NewNumberValue(cx,node.extaux,vp);
                   1500:                        break;
                   1501:        }
                   1502:        return(JS_TRUE);
                   1503: }
                   1504: 
                   1505: static JSBool js_node_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
                   1506: {
                   1507:        uint            node_num;
                   1508:        int                     file;
                   1509:        jsint           val=0;
                   1510:     jsint       tiny;
                   1511:        node_t          node;
                   1512:        scfg_t*         cfg;
                   1513:        JSObject*       sysobj;
                   1514:        JSObject*       node_list;
                   1515: 
                   1516:        if((node_list=JS_GetParent(cx, obj))==NULL)
                   1517:                return(JS_FALSE);
                   1518: 
                   1519:        if((sysobj=JS_GetParent(cx, node_list))==NULL)
                   1520:                return(JS_FALSE);
                   1521: 
                   1522:        if((cfg=(scfg_t*)JS_GetPrivate(cx,sysobj))==NULL)
                   1523:                return(JS_FALSE);
                   1524: 
                   1525:        node_num=(uint)JS_GetPrivate(cx,obj)>>1;
                   1526: 
                   1527:        memset(&node,0,sizeof(node));
                   1528:        if(getnodedat(cfg, node_num, &node, &file)) 
                   1529:                return(JS_TRUE);
                   1530: 
                   1531:        if(JSVAL_IS_NUMBER(*vp))
                   1532:                JS_ValueToInt32(cx, *vp, &val);
                   1533: 
                   1534:        tiny = JSVAL_TO_INT(id);
                   1535:        
                   1536:     switch(tiny) {
                   1537:                case NODE_PROP_STATUS:
                   1538:                        node.status=(BYTE)val;
                   1539:                        break;
                   1540:                case NODE_PROP_ERRORS:  
                   1541:                        node.errors=(BYTE)val;
                   1542:                        break;
                   1543:                case NODE_PROP_ACTION:  
                   1544:                        node.action=(BYTE)val;
                   1545:                        break;
                   1546:                case NODE_PROP_USERON:  
                   1547:                        node.useron=(WORD)val;
                   1548:                        break;
                   1549:                case NODE_PROP_CONNECTION:
                   1550:                        node.connection=(WORD)val;
                   1551:                        break;
                   1552:                case NODE_PROP_MISC:            
                   1553:                        node.misc=(WORD)val;
                   1554:                        break;
                   1555:                case NODE_PROP_AUX:             
                   1556:                        node.aux=(WORD)val;
                   1557:                        break;
                   1558:                case NODE_PROP_EXTAUX:  
                   1559:                        node.extaux=val;
                   1560:                        break;
                   1561:        }
                   1562:        putnodedat(cfg,node_num,&node,file);
                   1563: 
                   1564:        return(JS_TRUE);
                   1565: }
                   1566: 
                   1567: static jsSyncPropertySpec js_node_properties[] = {
                   1568: /*              name,                                          tinyid,                                 flags,                          ver     */
                   1569: 
                   1570: /* raw node_t fields */
                   1571:        {       "status",                                       NODE_PROP_STATUS,               JSPROP_ENUMERATE,       310 },
                   1572:        {       "errors",                                       NODE_PROP_ERRORS,               JSPROP_ENUMERATE,       310 },
                   1573:        {       "action",                                       NODE_PROP_ACTION,               JSPROP_ENUMERATE,       310 },
                   1574:        {       "useron",                                       NODE_PROP_USERON,               JSPROP_ENUMERATE,       310 },
                   1575:        {       "connection",                           NODE_PROP_CONNECTION,   JSPROP_ENUMERATE,       310 },
                   1576:        {       "misc",                                         NODE_PROP_MISC,                 JSPROP_ENUMERATE,       310 },
                   1577:        {       "aux",                                          NODE_PROP_AUX,                  JSPROP_ENUMERATE,       310 },
                   1578:        {       "extaux",                                       NODE_PROP_EXTAUX,               JSPROP_ENUMERATE,       310 },
                   1579:        {0}
                   1580: };
                   1581: 
                   1582: static JSClass js_node_class = {
                   1583:      "Node"                                    /* name                 */
                   1584:     ,JSCLASS_HAS_PRIVATE       /* flags                */
                   1585:        ,JS_PropertyStub                /* addProperty  */
                   1586:        ,JS_PropertyStub                /* delProperty  */
                   1587:        ,js_node_get                    /* getProperty  */
                   1588:        ,js_node_set                    /* setProperty  */
                   1589:        ,JS_EnumerateStub               /* enumerate    */
                   1590:        ,JS_ResolveStub                 /* resolve              */
                   1591:        ,JS_ConvertStub                 /* convert              */
                   1592:        ,JS_FinalizeStub                /* finalize             */
                   1593: };
                   1594: 
                   1595: JSObject* DLLCALL js_CreateSystemObject(JSContext* cx, JSObject* parent
                   1596:                                                                                ,scfg_t* cfg, time_t uptime, char* host_name, char* socklib_desc)
                   1597: {
                   1598:        char            str[256];
                   1599:        uint            i;
                   1600:        jsval           val;
                   1601:        JSObject*       sysobj;
                   1602:        JSObject*       statsobj;
                   1603:        JSObject*       nodeobj;
                   1604:        JSObject*       node_list;
                   1605:        JSObject*       fido_addr_list;
                   1606:        JSString*       js_str;
                   1607: 
                   1608:        sysobj = JS_DefineObject(cx, parent, "system", &js_system_class, NULL
                   1609:                ,JSPROP_ENUMERATE|JSPROP_READONLY);
                   1610: 
                   1611:        if(sysobj==NULL)
                   1612:                return(NULL);
                   1613: 
                   1614:        if(!JS_SetPrivate(cx, sysobj, cfg))     /* Store a pointer to scfg_t */
                   1615:                return(NULL);
                   1616: 
                   1617:        if(!js_DefineSyncProperties(cx, sysobj, js_system_properties))
                   1618:                return(NULL);
                   1619: 
                   1620:        if (!js_DefineSyncMethods(cx, sysobj, js_system_functions, FALSE)) 
                   1621:                return(NULL);
                   1622: 
                   1623: #ifdef _DEBUG
                   1624:        js_DescribeSyncObject(cx,sysobj,"Global system-related properties and methods",310);
                   1625:        js_CreateArrayOfStrings(cx, sysobj, "_property_desc_list", sys_prop_desc, JSPROP_READONLY);
                   1626: #endif
                   1627: 
                   1628:        /****************************/
                   1629:        /* static string properties */
                   1630:        if((js_str=JS_NewStringCopyZ(cx, host_name))==NULL)
                   1631:                return(NULL);
                   1632:        val = STRING_TO_JSVAL(js_str);
                   1633:        if(!JS_SetProperty(cx, sysobj, "host_name", &val))
                   1634:                return(NULL);
                   1635: 
                   1636:        if((js_str=JS_NewStringCopyZ(cx, VERSION))==NULL)
                   1637:                return(NULL);
                   1638:        val = STRING_TO_JSVAL(js_str);
                   1639:        if(!JS_SetProperty(cx, sysobj, "version", &val))
                   1640:                return(NULL);
                   1641: 
                   1642:        sprintf(str,"%c",REVISION);
                   1643:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
                   1644:                return(NULL);
                   1645:        val = STRING_TO_JSVAL(js_str);
                   1646:        if(!JS_SetProperty(cx, sysobj, "revision", &val))
                   1647:                return(NULL);
                   1648: 
                   1649:        SAFECOPY(str,beta_version);
                   1650:        truncsp(str);
                   1651:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
                   1652:                return(NULL);
                   1653:        val = STRING_TO_JSVAL(js_str);
                   1654:        if(!JS_SetProperty(cx, sysobj, "beta_version", &val))
                   1655:                return(NULL);
                   1656: 
                   1657: 
                   1658:        sprintf(str,"%s%c%s",VERSION,REVISION,beta_version);
                   1659:        truncsp(str);
                   1660: #if defined(_DEBUG)
                   1661:        strcat(str," Debug");
                   1662: #endif
                   1663:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
                   1664:                return(NULL);
                   1665:        val = STRING_TO_JSVAL(js_str);
                   1666:        if(!JS_SetProperty(cx, sysobj, "full_version", &val))
                   1667:                return(NULL);
                   1668: 
                   1669:        if((js_str=JS_NewStringCopyZ(cx, VERSION_NOTICE))==NULL)
                   1670:                return(NULL);
                   1671:        val = STRING_TO_JSVAL(js_str);
                   1672:        if(!JS_SetProperty(cx, sysobj, "version_notice", &val))
                   1673:                return(NULL);
                   1674: 
                   1675:        if((js_str=JS_NewStringCopyZ(cx, PLATFORM_DESC))==NULL)
                   1676:                return(NULL);
                   1677:        val = STRING_TO_JSVAL(js_str);
                   1678:        if(!JS_SetProperty(cx, sysobj, "platform", &val))
                   1679:                return(NULL);
                   1680: 
                   1681:        if((js_str=JS_NewStringCopyZ(cx, socklib_version(str, socklib_desc)))==NULL)
                   1682:                return(NULL);
                   1683:        val = STRING_TO_JSVAL(js_str);
                   1684:        if(!JS_SetProperty(cx, sysobj, "socket_lib", &val))
                   1685:                return(NULL);
                   1686: 
                   1687:        sprintf(str,"SMBLIB %s",smb_lib_ver());
                   1688:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
                   1689:                return(NULL);
                   1690:        val = STRING_TO_JSVAL(js_str);
                   1691:        if(!JS_SetProperty(cx, sysobj, "msgbase_lib", &val))
                   1692:                return(NULL);
                   1693: 
                   1694:        DESCRIBE_COMPILER(str);
                   1695:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
                   1696:                return(NULL);
                   1697:        val = STRING_TO_JSVAL(js_str);
                   1698:        if(!JS_SetProperty(cx, sysobj, "compiled_with", &val))
                   1699:                return(NULL);
                   1700: 
                   1701:        sprintf(str,"%s %.5s",__DATE__,__TIME__);
                   1702:        if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
                   1703:                return(NULL);
                   1704:        val = STRING_TO_JSVAL(js_str);
                   1705:        if(!JS_SetProperty(cx, sysobj, "compiled_when", &val))
                   1706:                return(NULL);
                   1707: 
                   1708:        if((js_str=JS_NewStringCopyZ(cx, COPYRIGHT_NOTICE))==NULL)
                   1709:                return(NULL);
                   1710:        val = STRING_TO_JSVAL(js_str);
                   1711:        if(!JS_SetProperty(cx, sysobj, "copyright", &val))
                   1712:                return(NULL);
                   1713: 
                   1714:        if((js_str=JS_NewStringCopyZ(cx
                   1715:                ,(char *)JS_GetImplementationVersion()))==NULL)
                   1716:                return(NULL);
                   1717:        val = STRING_TO_JSVAL(js_str);
                   1718:        if(!JS_SetProperty(cx, sysobj, "js_version", &val))
                   1719:                return(NULL);
                   1720: 
                   1721:        if((js_str=JS_NewStringCopyZ(cx,os_version(str)))==NULL)
                   1722:                return(NULL);
                   1723:        val = STRING_TO_JSVAL(js_str);
                   1724:        if(!JS_SetProperty(cx, sysobj, "os_version", &val))
                   1725:                return(NULL);
                   1726: 
                   1727:        /***********************/
                   1728: 
                   1729:        JS_NewNumberValue(cx,uptime,&val);
                   1730:        if(!JS_SetProperty(cx, sysobj, "uptime", &val))
                   1731:                return(NULL);
                   1732: 
                   1733:        /* fido_addr_list property */
                   1734: 
                   1735:        if((fido_addr_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
                   1736:                return(NULL);
                   1737: 
                   1738:        if(!JS_DefineProperty(cx, sysobj, "fido_addr_list", OBJECT_TO_JSVAL(fido_addr_list)
                   1739:                , NULL, NULL, JSPROP_ENUMERATE))
                   1740:                return(NULL);
                   1741: 
                   1742:        for(i=0;i<cfg->total_faddrs;i++) {
                   1743:                val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,smb_faddrtoa(&cfg->faddr[i],str)));
                   1744:                JS_SetElement(cx, fido_addr_list, i, &val);
                   1745:        }
                   1746: 
                   1747:        statsobj = JS_DefineObject(cx, sysobj, "stats", &js_sysstats_class, NULL
                   1748:                ,JSPROP_ENUMERATE|JSPROP_READONLY);
                   1749: 
                   1750:        if(statsobj==NULL)
                   1751:                return(NULL);
                   1752: 
                   1753:        JS_SetPrivate(cx, statsobj, cfg);       /* Store a pointer to scfg_t */
                   1754: 
                   1755:        if(!js_DefineSyncProperties(cx, statsobj, js_sysstats_properties))
                   1756:                return(NULL);
                   1757: 
                   1758: #ifdef _DEBUG
                   1759:        js_DescribeSyncObject(cx,statsobj,"System statistics",310);
                   1760:        js_CreateArrayOfStrings(cx, statsobj, "_property_desc_list", sysstat_prop_desc, JSPROP_READONLY);
                   1761: #endif
                   1762: 
                   1763:        /* node_list property */
                   1764: 
                   1765:        if((node_list=JS_NewArrayObject(cx, 0, NULL))==NULL) 
                   1766:                return(NULL);
                   1767: 
                   1768:        if(!JS_DefineProperty(cx, sysobj, "node_list", OBJECT_TO_JSVAL(node_list)
                   1769:                , NULL, NULL, JSPROP_ENUMERATE))
                   1770:                return(NULL);
                   1771: 
                   1772:        for(i=0;i<cfg->sys_nodes && i<cfg->sys_lastnode;i++) {
                   1773: 
                   1774:                nodeobj = JS_NewObject(cx, &js_node_class, NULL, node_list);
                   1775: 
                   1776:                if(nodeobj==NULL)
                   1777:                        return(NULL);
                   1778: 
                   1779:                /* Store node number */
                   1780:                /* We have to shift it to make it look like a pointer to JS. :-( */
                   1781:                if(!JS_SetPrivate(cx, nodeobj, (char*)((i+1)<<1)))      
                   1782:                        return(NULL);
                   1783: 
                   1784:                if(!js_DefineSyncProperties(cx, nodeobj, js_node_properties))
                   1785:                        return(NULL);
                   1786: 
                   1787: #ifdef _DEBUG
                   1788:                if(i==0) {
                   1789:                        js_DescribeSyncObject(cx,nodeobj,"BBS node listing",310);
                   1790:                        js_CreateArrayOfStrings(cx, nodeobj, "_property_desc_list", node_prop_desc, JSPROP_READONLY);
                   1791:                }
                   1792: #endif
                   1793: 
                   1794:                val=OBJECT_TO_JSVAL(nodeobj);
                   1795:                if(!JS_SetElement(cx, node_list, i, &val))
                   1796:                        return(NULL);
                   1797:        }       
                   1798: 
                   1799:        return(sysobj);
                   1800: }
                   1801: 
                   1802: #endif /* JAVSCRIPT */

unix.superglobalmegacorp.com

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