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