|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.