|
|
1.1 ! root 1: /* js_bbs.cpp */ ! 2: ! 3: /* Synchronet JavaScript "bbs" Object */ ! 4: ! 5: /* $Id: js_bbs.cpp,v 1.102 2006/11/30 07:28:03 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: /*****************************/ ! 43: /* BBS Object Properites */ ! 44: /*****************************/ ! 45: enum { ! 46: BBS_PROP_SYS_STATUS ! 47: ,BBS_PROP_STARTUP_OPT ! 48: ,BBS_PROP_ANSWER_TIME ! 49: ,BBS_PROP_LOGON_TIME ! 50: ,BBS_PROP_START_TIME ! 51: ,BBS_PROP_NS_TIME ! 52: ,BBS_PROP_LAST_NS_TIME ! 53: ,BBS_PROP_ONLINE ! 54: ,BBS_PROP_TIMELEFT ! 55: ,BBS_PROP_EVENT_TIME ! 56: ,BBS_PROP_EVENT_CODE ! 57: ! 58: ,BBS_PROP_NODE_NUM ! 59: ,BBS_PROP_NODE_MISC ! 60: ,BBS_PROP_NODE_ACTION ! 61: ,BBS_PROP_NODE_VAL_USER ! 62: ! 63: ,BBS_PROP_LOGON_ULB ! 64: ,BBS_PROP_LOGON_DLB ! 65: ,BBS_PROP_LOGON_ULS ! 66: ,BBS_PROP_LOGON_DLS ! 67: ,BBS_PROP_LOGON_POSTS ! 68: ,BBS_PROP_LOGON_EMAILS ! 69: ,BBS_PROP_LOGON_FBACKS ! 70: ,BBS_PROP_POSTS_READ ! 71: ! 72: ,BBS_PROP_MENU_DIR ! 73: ,BBS_PROP_MENU_FILE ! 74: ,BBS_PROP_MAIN_CMDS ! 75: ,BBS_PROP_FILE_CMDS ! 76: ! 77: ,BBS_PROP_CURGRP ! 78: ,BBS_PROP_CURSUB ! 79: ,BBS_PROP_CURSUB_CODE ! 80: ,BBS_PROP_CURLIB ! 81: ,BBS_PROP_CURDIR ! 82: ,BBS_PROP_CURDIR_CODE ! 83: ! 84: ,BBS_PROP_CONNECTION /* READ ONLY */ ! 85: ,BBS_PROP_RLOGIN_NAME ! 86: ,BBS_PROP_CLIENT_NAME ! 87: ! 88: ,BBS_PROP_ALTUL ! 89: ! 90: ,BBS_PROP_ERRORLEVEL /* READ ONLY */ ! 91: ! 92: /* READ ONLY */ ! 93: ,BBS_PROP_SMB_GROUP ! 94: ,BBS_PROP_SMB_GROUP_DESC ! 95: ,BBS_PROP_SMB_GROUP_NUM ! 96: ,BBS_PROP_SMB_SUB ! 97: ,BBS_PROP_SMB_SUB_DESC ! 98: ,BBS_PROP_SMB_SUB_CODE ! 99: ,BBS_PROP_SMB_SUB_NUM ! 100: ,BBS_PROP_SMB_ATTR ! 101: ,BBS_PROP_SMB_LAST_MSG ! 102: ,BBS_PROP_SMB_TOTAL_MSGS ! 103: ,BBS_PROP_SMB_MSGS ! 104: ,BBS_PROP_SMB_CURMSG ! 105: ! 106: /* READ ONLY */ ! 107: ,BBS_PROP_MSG_TO ! 108: ,BBS_PROP_MSG_TO_EXT ! 109: ,BBS_PROP_MSG_TO_NET ! 110: ,BBS_PROP_MSG_TO_AGENT ! 111: ,BBS_PROP_MSG_FROM ! 112: ,BBS_PROP_MSG_FROM_EXT ! 113: ,BBS_PROP_MSG_FROM_NET ! 114: ,BBS_PROP_MSG_FROM_AGENT ! 115: ,BBS_PROP_MSG_REPLYTO ! 116: ,BBS_PROP_MSG_REPLYTO_EXT ! 117: ,BBS_PROP_MSG_REPLYTO_NET ! 118: ,BBS_PROP_MSG_REPLYTO_AGENT ! 119: ,BBS_PROP_MSG_SUBJECT ! 120: ,BBS_PROP_MSG_DATE ! 121: ,BBS_PROP_MSG_TIMEZONE ! 122: ,BBS_PROP_MSG_DATE_IMPORTED ! 123: ,BBS_PROP_MSG_ATTR ! 124: ,BBS_PROP_MSG_AUXATTR ! 125: ,BBS_PROP_MSG_NETATTR ! 126: ,BBS_PROP_MSG_OFFSET ! 127: ,BBS_PROP_MSG_NUMBER ! 128: ,BBS_PROP_MSG_EXPIRATION ! 129: ,BBS_PROP_MSG_FORWARDED ! 130: ,BBS_PROP_MSG_THREAD_BACK ! 131: ,BBS_PROP_MSG_THREAD_NEXT ! 132: ,BBS_PROP_MSG_THREAD_FIRST ! 133: ,BBS_PROP_MSG_ID ! 134: ,BBS_PROP_MSG_REPLY_ID ! 135: ,BBS_PROP_MSG_DELIVERY_ATTEMPTS ! 136: ! 137: /* READ ONLY */ ! 138: ,BBS_PROP_BATCH_UPLOAD_TOTAL ! 139: ,BBS_PROP_BATCH_DNLOAD_TOTAL ! 140: ! 141: ,BBS_PROP_COMMAND_STR ! 142: }; ! 143: ! 144: #ifdef BUILD_JSDOCS ! 145: static char* bbs_prop_desc[] = { ! 146: "system status bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)" ! 147: ,"startup options bitfield (see <tt>BBS_OPT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)" ! 148: ,"answer time, in <i>time_t</i> format" ! 149: ,"logon time, in <i>time_t</i> format" ! 150: ,"time from which user's time left is calculated, in <i>time_t</i> format" ! 151: ,"current file new-scan time, in <i>time_t</i> format" ! 152: ,"previous file new-scan time, in <i>time_t</i> format" ! 153: ,"online (see <tt>ON_*</tt> in <tt>sbbsdefs.js</tt> for valid values)" ! 154: ,"time left (in seconds)" ! 155: ,"time of next exclusive event (in <i>time_t</i> format), or 0 if none" ! 156: ,"internal code of next exclusive event" ! 157: ! 158: ,"current node number" ! 159: ,"current node settings bitfield (see <tt>NM_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)" ! 160: ,"current node action (see <tt>nodedefs.js</tt> for valid values)" ! 161: ,"validation feedback user for this node (or 0 for no validation feedback required)" ! 162: ! 163: ,"bytes uploaded during this session" ! 164: ,"bytes downloaded during this session" ! 165: ,"files uploaded during this session" ! 166: ,"files downloaded during this session" ! 167: ,"messages posted during this session" ! 168: ,"e-mails sent during this session" ! 169: ,"feedback messages sent during this session" ! 170: ,"messages read during this session" ! 171: ! 172: ,"menu subdirectory (overrides default)" ! 173: ,"menu file (overrides default)" ! 174: ,"total main menu commands received from user during this session" ! 175: ,"total file menu commands received from user during this session" ! 176: ! 177: ,"current message group" ! 178: ,"current message sub-board" ! 179: ,"current message sub-board internal code" ! 180: ,"current file library" ! 181: ,"current file directory" ! 182: ,"current file directory internal code" ! 183: ! 184: ,"remote connection type" ! 185: ,"rlogin name" ! 186: ,"client name" ! 187: ! 188: ,"current alternate upload path number" ! 189: ! 190: ,"error level returned from last executed external program" ! 191: ! 192: /* READ ONLY */ ! 193: ,"message group name of message being read" ! 194: ,"message group description of message being read" ! 195: ,"message group number of message being read" ! 196: ,"sub-board name of message being read" ! 197: ,"sub-board description of message being read" ! 198: ,"sub-board internal code of message being read" ! 199: ,"sub-board number of message being read" ! 200: ,"message base attributes" ! 201: ,"highest message number in message base" ! 202: ,"total number of messages in message base" ! 203: ,"number of messages loaded from message base" ! 204: ,"current message number in message base" ! 205: ! 206: /* READ ONLY */ ! 207: ,"message recipient name" ! 208: ,"message recipient extension" ! 209: ,"message recipient network type" ! 210: ,"message recipient agent type" ! 211: ,"message sender name" ! 212: ,"message sender extension" ! 213: ,"message sender network type" ! 214: ,"message sender agent type" ! 215: ,"message reply-to name" ! 216: ,"message reply-to extension" ! 217: ,"message reply-to network type" ! 218: ,"message reply-to agent type" ! 219: ,"message subject" ! 220: ,"message date/time" ! 221: ,"message time zone" ! 222: ,"message date/time imported" ! 223: ,"message attributes" ! 224: ,"message auxillary attributes" ! 225: ,"message network attributes" ! 226: ,"message header offset" ! 227: ,"message number" ! 228: ,"message expiration" ! 229: ,"message forwarded" ! 230: ,"message thread, back message number (AKA msg_thread_orig)" ! 231: ,"message thread, next message number" ! 232: ,"message thread, first reply to this message" ! 233: ,"message identifier" ! 234: ,"message replied-to identifier" ! 235: ,"message delivery attempt counter" ! 236: ! 237: ,"number of files in batch upload queue" ! 238: ,"number of files in batch download queue" ! 239: ! 240: ,"current command shell/module <i>command string</i> value" ! 241: ,NULL ! 242: }; ! 243: #endif ! 244: ! 245: static JSBool js_bbs_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp) ! 246: { ! 247: char* p=NULL; ! 248: char* nulstr=""; ! 249: ulong val=0; ! 250: jsint tiny; ! 251: sbbs_t* sbbs; ! 252: ! 253: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 254: return(JS_FALSE); ! 255: ! 256: tiny = JSVAL_TO_INT(id); ! 257: ! 258: switch(tiny) { ! 259: case BBS_PROP_SYS_STATUS: ! 260: val=sbbs->sys_status; ! 261: break; ! 262: case BBS_PROP_STARTUP_OPT: ! 263: val=sbbs->startup->options; ! 264: break; ! 265: case BBS_PROP_ANSWER_TIME: ! 266: val=sbbs->answertime; ! 267: break; ! 268: case BBS_PROP_LOGON_TIME: ! 269: val=sbbs->logontime; ! 270: break; ! 271: case BBS_PROP_START_TIME: ! 272: val=sbbs->starttime; ! 273: break; ! 274: case BBS_PROP_NS_TIME: ! 275: val=sbbs->ns_time; ! 276: break; ! 277: case BBS_PROP_LAST_NS_TIME: ! 278: val=sbbs->last_ns_time; ! 279: break; ! 280: case BBS_PROP_ONLINE: ! 281: val=sbbs->online; ! 282: break; ! 283: case BBS_PROP_TIMELEFT: ! 284: val=sbbs->timeleft; ! 285: break; ! 286: case BBS_PROP_EVENT_TIME: ! 287: val=sbbs->event_time; ! 288: break; ! 289: case BBS_PROP_EVENT_CODE: ! 290: p=sbbs->event_code; ! 291: break; ! 292: ! 293: case BBS_PROP_NODE_NUM: ! 294: val=sbbs->cfg.node_num; ! 295: break; ! 296: case BBS_PROP_NODE_MISC: ! 297: val=sbbs->cfg.node_misc; ! 298: break; ! 299: case BBS_PROP_NODE_ACTION: ! 300: val=sbbs->action; ! 301: break; ! 302: case BBS_PROP_NODE_VAL_USER: ! 303: val=sbbs->cfg.node_valuser; ! 304: break; ! 305: ! 306: case BBS_PROP_LOGON_ULB: ! 307: val=sbbs->logon_ulb; ! 308: break; ! 309: case BBS_PROP_LOGON_DLB: ! 310: val=sbbs->logon_dlb; ! 311: break; ! 312: case BBS_PROP_LOGON_ULS: ! 313: val=sbbs->logon_uls; ! 314: break; ! 315: case BBS_PROP_LOGON_DLS: ! 316: val=sbbs->logon_dls; ! 317: break; ! 318: case BBS_PROP_LOGON_POSTS: ! 319: val=sbbs->logon_posts; ! 320: break; ! 321: case BBS_PROP_LOGON_EMAILS: ! 322: val=sbbs->logon_emails; ! 323: break; ! 324: case BBS_PROP_LOGON_FBACKS: ! 325: val=sbbs->logon_fbacks; ! 326: break; ! 327: case BBS_PROP_POSTS_READ: ! 328: val=sbbs->posts_read; ! 329: break; ! 330: ! 331: case BBS_PROP_MENU_DIR: ! 332: p=sbbs->menu_dir; ! 333: break; ! 334: case BBS_PROP_MENU_FILE: ! 335: p=sbbs->menu_file; ! 336: break; ! 337: case BBS_PROP_MAIN_CMDS: ! 338: val=sbbs->main_cmds; ! 339: break; ! 340: case BBS_PROP_FILE_CMDS: ! 341: val=sbbs->xfer_cmds; ! 342: break; ! 343: ! 344: case BBS_PROP_CURGRP: ! 345: val=sbbs->curgrp; ! 346: break; ! 347: case BBS_PROP_CURSUB: ! 348: if(sbbs->curgrp<sbbs->usrgrps) ! 349: val=sbbs->cursub[sbbs->curgrp]; ! 350: break; ! 351: case BBS_PROP_CURSUB_CODE: ! 352: if(sbbs->cursubnum<sbbs->cfg.total_subs) ! 353: p=sbbs->cfg.sub[sbbs->cursubnum]->code; ! 354: break; ! 355: ! 356: case BBS_PROP_CURLIB: ! 357: val=sbbs->curlib; ! 358: break; ! 359: case BBS_PROP_CURDIR: ! 360: if(sbbs->curlib<sbbs->usrlibs) ! 361: val=sbbs->curdir[sbbs->curlib]; ! 362: break; ! 363: case BBS_PROP_CURDIR_CODE: ! 364: if(sbbs->curdirnum<sbbs->cfg.total_dirs) ! 365: p=sbbs->cfg.dir[sbbs->curdirnum]->code; ! 366: break; ! 367: ! 368: case BBS_PROP_CONNECTION: ! 369: p=sbbs->connection; ! 370: break; ! 371: case BBS_PROP_RLOGIN_NAME: ! 372: p=sbbs->rlogin_name; ! 373: break; ! 374: case BBS_PROP_CLIENT_NAME: ! 375: p=sbbs->client_name; ! 376: break; ! 377: ! 378: case BBS_PROP_ALTUL: ! 379: val=sbbs->altul; ! 380: break; ! 381: ! 382: case BBS_PROP_ERRORLEVEL: ! 383: val=sbbs->errorlevel; ! 384: break; ! 385: ! 386: /* Currently Open Message Base (sbbs.smb) */ ! 387: case BBS_PROP_SMB_GROUP: ! 388: if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs) ! 389: p=nulstr; ! 390: else ! 391: p=sbbs->cfg.grp[sbbs->cfg.sub[sbbs->smb.subnum]->grp]->sname; ! 392: break; ! 393: case BBS_PROP_SMB_GROUP_DESC: ! 394: if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs) ! 395: p=nulstr; ! 396: else ! 397: p=sbbs->cfg.grp[sbbs->cfg.sub[sbbs->smb.subnum]->grp]->lname; ! 398: break; ! 399: case BBS_PROP_SMB_GROUP_NUM: ! 400: if(sbbs->smb.subnum!=INVALID_SUB && sbbs->smb.subnum<sbbs->cfg.total_subs) { ! 401: uint ugrp; ! 402: for(ugrp=0;ugrp<sbbs->usrgrps;ugrp++) ! 403: if(sbbs->usrgrp[ugrp]==sbbs->cfg.sub[sbbs->smb.subnum]->grp) ! 404: break; ! 405: val=ugrp+1; ! 406: } ! 407: break; ! 408: case BBS_PROP_SMB_SUB: ! 409: if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs) ! 410: p=nulstr; ! 411: else ! 412: p=sbbs->cfg.sub[sbbs->smb.subnum]->sname; ! 413: break; ! 414: case BBS_PROP_SMB_SUB_DESC: ! 415: if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs) ! 416: p=nulstr; ! 417: else ! 418: p=sbbs->cfg.sub[sbbs->smb.subnum]->lname; ! 419: break; ! 420: case BBS_PROP_SMB_SUB_CODE: ! 421: if(sbbs->smb.subnum==INVALID_SUB || sbbs->smb.subnum>=sbbs->cfg.total_subs) ! 422: p=nulstr; ! 423: else ! 424: p=sbbs->cfg.sub[sbbs->smb.subnum]->code; ! 425: break; ! 426: case BBS_PROP_SMB_SUB_NUM: ! 427: if(sbbs->smb.subnum!=INVALID_SUB && sbbs->smb.subnum<sbbs->cfg.total_subs) { ! 428: uint ugrp; ! 429: for(ugrp=0;ugrp<sbbs->usrgrps;ugrp++) ! 430: if(sbbs->usrgrp[ugrp]==sbbs->cfg.sub[sbbs->smb.subnum]->grp) ! 431: break; ! 432: uint usub; ! 433: for(usub=0;usub<sbbs->usrsubs[ugrp];usub++) ! 434: if(sbbs->usrsub[ugrp][usub]==sbbs->smb.subnum) ! 435: break; ! 436: val=usub+1; ! 437: } ! 438: break; ! 439: case BBS_PROP_SMB_ATTR: ! 440: val=sbbs->smb.status.attr; ! 441: break; ! 442: case BBS_PROP_SMB_LAST_MSG: ! 443: val=sbbs->smb.status.last_msg; ! 444: break; ! 445: case BBS_PROP_SMB_TOTAL_MSGS: ! 446: val=sbbs->smb.status.total_msgs; ! 447: break; ! 448: case BBS_PROP_SMB_MSGS: ! 449: val=sbbs->smb.msgs; ! 450: break; ! 451: case BBS_PROP_SMB_CURMSG: ! 452: val=sbbs->smb.curmsg; ! 453: break; ! 454: ! 455: /* Currently Displayed Message Header (sbbs.current_msg) */ ! 456: case BBS_PROP_MSG_TO: ! 457: if(sbbs->current_msg==NULL || sbbs->current_msg->to==NULL) ! 458: p=nulstr; ! 459: else ! 460: p=sbbs->current_msg->to; ! 461: break; ! 462: case BBS_PROP_MSG_TO_EXT: ! 463: if(sbbs->current_msg==NULL || sbbs->current_msg->to_ext==NULL) ! 464: p=nulstr; ! 465: else ! 466: p=sbbs->current_msg->to_ext; ! 467: break; ! 468: case BBS_PROP_MSG_TO_NET: ! 469: if(sbbs->current_msg==NULL || sbbs->current_msg->to_net.type==NET_NONE) ! 470: p=nulstr; ! 471: else ! 472: p=smb_netaddr(&sbbs->current_msg->to_net); ! 473: break; ! 474: case BBS_PROP_MSG_TO_AGENT: ! 475: if(sbbs->current_msg!=NULL) ! 476: val=sbbs->current_msg->to_agent; ! 477: break; ! 478: case BBS_PROP_MSG_FROM: ! 479: if(sbbs->current_msg==NULL || sbbs->current_msg->from==NULL) ! 480: p=nulstr; ! 481: else ! 482: p=sbbs->current_msg->from; ! 483: break; ! 484: case BBS_PROP_MSG_FROM_EXT: ! 485: if(sbbs->current_msg==NULL || sbbs->current_msg->from_ext==NULL) ! 486: p=nulstr; ! 487: else ! 488: p=sbbs->current_msg->from_ext; ! 489: break; ! 490: case BBS_PROP_MSG_FROM_NET: ! 491: if(sbbs->current_msg==NULL || sbbs->current_msg->from_net.type==NET_NONE) ! 492: p=nulstr; ! 493: else ! 494: p=smb_netaddr(&sbbs->current_msg->from_net); ! 495: break; ! 496: case BBS_PROP_MSG_FROM_AGENT: ! 497: if(sbbs->current_msg!=NULL) ! 498: val=sbbs->current_msg->from_agent; ! 499: break; ! 500: case BBS_PROP_MSG_REPLYTO: ! 501: if(sbbs->current_msg==NULL || sbbs->current_msg->replyto==NULL) ! 502: p=nulstr; ! 503: else ! 504: p=sbbs->current_msg->replyto; ! 505: break; ! 506: case BBS_PROP_MSG_REPLYTO_EXT: ! 507: if(sbbs->current_msg==NULL || sbbs->current_msg->replyto_ext==NULL) ! 508: p=nulstr; ! 509: else ! 510: p=sbbs->current_msg->replyto_ext; ! 511: break; ! 512: case BBS_PROP_MSG_REPLYTO_NET: ! 513: if(sbbs->current_msg==NULL || sbbs->current_msg->replyto_net.type==NET_NONE) ! 514: p=nulstr; ! 515: else ! 516: p=smb_netaddr(&sbbs->current_msg->replyto_net); ! 517: break; ! 518: case BBS_PROP_MSG_REPLYTO_AGENT: ! 519: if(sbbs->current_msg!=NULL) ! 520: val=sbbs->current_msg->replyto_agent; ! 521: break; ! 522: ! 523: case BBS_PROP_MSG_SUBJECT: ! 524: if(sbbs->current_msg==NULL || sbbs->current_msg->subj==NULL) ! 525: p=nulstr; ! 526: else ! 527: p=sbbs->current_msg->subj; ! 528: break; ! 529: case BBS_PROP_MSG_DATE: ! 530: if(sbbs->current_msg!=NULL) ! 531: val=sbbs->current_msg->hdr.when_written.time; ! 532: break; ! 533: case BBS_PROP_MSG_TIMEZONE: ! 534: if(sbbs->current_msg!=NULL) ! 535: val=sbbs->current_msg->hdr.when_written.zone; ! 536: break; ! 537: case BBS_PROP_MSG_DATE_IMPORTED: ! 538: if(sbbs->current_msg!=NULL) ! 539: val=sbbs->current_msg->hdr.when_imported.time; ! 540: break; ! 541: case BBS_PROP_MSG_ATTR: ! 542: if(sbbs->current_msg!=NULL) ! 543: val=sbbs->current_msg->hdr.attr; ! 544: break; ! 545: case BBS_PROP_MSG_AUXATTR: ! 546: if(sbbs->current_msg!=NULL) ! 547: val=sbbs->current_msg->hdr.auxattr; ! 548: break; ! 549: case BBS_PROP_MSG_NETATTR: ! 550: if(sbbs->current_msg!=NULL) ! 551: val=sbbs->current_msg->hdr.netattr; ! 552: break; ! 553: case BBS_PROP_MSG_OFFSET: ! 554: if(sbbs->current_msg!=NULL) ! 555: val=sbbs->current_msg->offset; ! 556: break; ! 557: case BBS_PROP_MSG_NUMBER: ! 558: if(sbbs->current_msg!=NULL) ! 559: val=sbbs->current_msg->hdr.number; ! 560: break; ! 561: case BBS_PROP_MSG_EXPIRATION: ! 562: if(sbbs->current_msg!=NULL) ! 563: val=sbbs->current_msg->expiration; ! 564: break; ! 565: case BBS_PROP_MSG_FORWARDED: ! 566: if(sbbs->current_msg!=NULL) ! 567: val=sbbs->current_msg->forwarded; ! 568: break; ! 569: case BBS_PROP_MSG_THREAD_BACK: ! 570: if(sbbs->current_msg!=NULL) ! 571: val=sbbs->current_msg->hdr.thread_back; ! 572: break; ! 573: case BBS_PROP_MSG_THREAD_NEXT: ! 574: if(sbbs->current_msg!=NULL) ! 575: val=sbbs->current_msg->hdr.thread_next; ! 576: break; ! 577: case BBS_PROP_MSG_THREAD_FIRST: ! 578: if(sbbs->current_msg!=NULL) ! 579: val=sbbs->current_msg->hdr.thread_first; ! 580: break; ! 581: case BBS_PROP_MSG_DELIVERY_ATTEMPTS: ! 582: if(sbbs->current_msg!=NULL) ! 583: val=sbbs->current_msg->hdr.delivery_attempts; ! 584: break; ! 585: case BBS_PROP_MSG_ID: ! 586: if(sbbs->current_msg==NULL || sbbs->current_msg->id==NULL) ! 587: p=nulstr; ! 588: else ! 589: p=sbbs->current_msg->id; ! 590: break; ! 591: case BBS_PROP_MSG_REPLY_ID: ! 592: if(sbbs->current_msg==NULL || sbbs->current_msg->reply_id==NULL) ! 593: p=nulstr; ! 594: else ! 595: p=sbbs->current_msg->reply_id; ! 596: break; ! 597: ! 598: case BBS_PROP_BATCH_UPLOAD_TOTAL: ! 599: val=sbbs->batup_total; ! 600: break; ! 601: case BBS_PROP_BATCH_DNLOAD_TOTAL: ! 602: val=sbbs->batdn_total; ! 603: break; ! 604: ! 605: case BBS_PROP_COMMAND_STR: ! 606: p=sbbs->main_csi.str; ! 607: break; ! 608: ! 609: default: ! 610: return(JS_TRUE); ! 611: } ! 612: if(p!=NULL) { ! 613: JSString* js_str=JS_NewStringCopyZ(cx, p); ! 614: if(js_str==NULL) ! 615: return(JS_FALSE); ! 616: *vp = STRING_TO_JSVAL(js_str); ! 617: } else ! 618: JS_NewNumberValue(cx,val,vp); ! 619: ! 620: return(JS_TRUE); ! 621: } ! 622: ! 623: static JSBool js_bbs_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) ! 624: { ! 625: char* p=NULL; ! 626: int32 val=0; ! 627: jsint tiny; ! 628: JSString* js_str; ! 629: sbbs_t* sbbs; ! 630: ! 631: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 632: return(JS_FALSE); ! 633: ! 634: tiny = JSVAL_TO_INT(id); ! 635: ! 636: if(JSVAL_IS_NUM(*vp) || JSVAL_IS_BOOLEAN(*vp)) ! 637: JS_ValueToInt32(cx, *vp, &val); ! 638: else if(JSVAL_IS_STRING(*vp)) { ! 639: if((js_str = JS_ValueToString(cx, *vp))==NULL) ! 640: return(JS_FALSE); ! 641: p=JS_GetStringBytes(js_str); ! 642: } ! 643: ! 644: switch(tiny) { ! 645: case BBS_PROP_SYS_STATUS: ! 646: sbbs->sys_status=val; ! 647: break; ! 648: case BBS_PROP_STARTUP_OPT: ! 649: sbbs->startup->options=val; ! 650: break; ! 651: case BBS_PROP_ANSWER_TIME: ! 652: sbbs->answertime=val; ! 653: break; ! 654: case BBS_PROP_LOGON_TIME: ! 655: sbbs->logontime=val; ! 656: break; ! 657: case BBS_PROP_START_TIME: ! 658: sbbs->starttime=val; ! 659: break; ! 660: case BBS_PROP_NS_TIME: ! 661: sbbs->ns_time=val; ! 662: break; ! 663: case BBS_PROP_LAST_NS_TIME: ! 664: sbbs->last_ns_time=val; ! 665: break; ! 666: case BBS_PROP_ONLINE: ! 667: sbbs->online=val; ! 668: break; ! 669: case BBS_PROP_NODE_MISC: ! 670: sbbs->cfg.node_misc=val; ! 671: break; ! 672: case BBS_PROP_NODE_ACTION: ! 673: sbbs->action=(uchar)val; ! 674: break; ! 675: case BBS_PROP_NODE_VAL_USER: ! 676: sbbs->cfg.node_valuser=(ushort)val; ! 677: break; ! 678: case BBS_PROP_LOGON_ULB: ! 679: sbbs->logon_ulb=val; ! 680: break; ! 681: case BBS_PROP_LOGON_DLB: ! 682: sbbs->logon_dlb=val; ! 683: break; ! 684: case BBS_PROP_LOGON_ULS: ! 685: sbbs->logon_uls=val; ! 686: break; ! 687: case BBS_PROP_LOGON_DLS: ! 688: sbbs->logon_dls=val; ! 689: break; ! 690: case BBS_PROP_LOGON_POSTS: ! 691: sbbs->logon_posts=val; ! 692: break; ! 693: case BBS_PROP_LOGON_EMAILS: ! 694: sbbs->logon_emails=val; ! 695: break; ! 696: case BBS_PROP_LOGON_FBACKS: ! 697: sbbs->logon_fbacks=val; ! 698: break; ! 699: case BBS_PROP_POSTS_READ: ! 700: sbbs->posts_read=val; ! 701: break; ! 702: case BBS_PROP_MENU_DIR: ! 703: SAFECOPY(sbbs->menu_dir,p); ! 704: break; ! 705: case BBS_PROP_MENU_FILE: ! 706: SAFECOPY(sbbs->menu_file,p); ! 707: break; ! 708: case BBS_PROP_MAIN_CMDS: ! 709: sbbs->main_cmds=val; ! 710: break; ! 711: case BBS_PROP_FILE_CMDS: ! 712: sbbs->xfer_cmds=val; ! 713: break; ! 714: ! 715: case BBS_PROP_CURGRP: ! 716: if(p!=NULL) { /* set by name */ ! 717: uint i; ! 718: for(i=0;i<sbbs->usrgrps;i++) ! 719: if(!stricmp(sbbs->cfg.grp[sbbs->usrgrp[i]]->sname,p)) ! 720: break; ! 721: if(i<sbbs->usrgrps) ! 722: sbbs->curgrp=i; ! 723: break; ! 724: } ! 725: if((uint)val<sbbs->cfg.total_grps && (uint)val<sbbs->usrgrps) ! 726: sbbs->curgrp=val; ! 727: break; ! 728: case BBS_PROP_CURSUB: ! 729: case BBS_PROP_CURSUB_CODE: ! 730: if(p!=NULL) { /* set by code */ ! 731: for(uint i=0;i<sbbs->usrgrps;i++) ! 732: for(uint j=0;j<sbbs->usrsubs[i];j++) ! 733: if(!stricmp(sbbs->cfg.sub[sbbs->usrsub[i][j]]->code,p)) { ! 734: sbbs->curgrp=i; ! 735: sbbs->cursub[i]=j; ! 736: break; ! 737: } ! 738: break; ! 739: } ! 740: if(sbbs->curgrp<sbbs->cfg.total_grps && (uint)val<sbbs->usrsubs[sbbs->curgrp]) ! 741: sbbs->cursub[sbbs->curgrp]=val; ! 742: break; ! 743: case BBS_PROP_CURLIB: ! 744: if(p!=NULL) { /* set by name */ ! 745: uint i; ! 746: for(i=0;i<sbbs->usrlibs;i++) ! 747: if(!stricmp(sbbs->cfg.lib[sbbs->usrlib[i]]->sname,p)) ! 748: break; ! 749: if(i<sbbs->usrlibs) ! 750: sbbs->curlib=i; ! 751: break; ! 752: } ! 753: if((uint)val<sbbs->cfg.total_libs && (uint)val<sbbs->usrlibs) ! 754: sbbs->curlib=val; ! 755: break; ! 756: case BBS_PROP_CURDIR: ! 757: case BBS_PROP_CURDIR_CODE: ! 758: if(p!=NULL) { /* set by code */ ! 759: for(uint i=0;i<sbbs->usrlibs;i++) ! 760: for(uint j=0;j<sbbs->usrdirs[i];j++) ! 761: if(!stricmp(sbbs->cfg.dir[sbbs->usrdir[i][j]]->code,p)) { ! 762: sbbs->curlib=i; ! 763: sbbs->curdir[i]=j; ! 764: break; ! 765: } ! 766: break; ! 767: } ! 768: if(sbbs->curlib<sbbs->cfg.total_libs && (uint)val<sbbs->usrdirs[sbbs->curlib]) ! 769: sbbs->curdir[sbbs->curlib]=val; ! 770: break; ! 771: ! 772: case BBS_PROP_RLOGIN_NAME: ! 773: SAFECOPY(sbbs->rlogin_name,p); ! 774: break; ! 775: case BBS_PROP_CLIENT_NAME: ! 776: SAFECOPY(sbbs->client_name,p); ! 777: break; ! 778: ! 779: case BBS_PROP_ALTUL: ! 780: if(val<sbbs->cfg.altpaths) ! 781: sbbs->altul=(ushort)val; ! 782: break; ! 783: ! 784: case BBS_PROP_COMMAND_STR: ! 785: sprintf(sbbs->main_csi.str, "%.*s", 1024, p); ! 786: break; ! 787: ! 788: default: ! 789: return(JS_TRUE); ! 790: } ! 791: ! 792: if(sbbs->usrgrps) ! 793: sbbs->cursubnum=sbbs->usrsub[sbbs->curgrp][sbbs->cursub[sbbs->curgrp]]; /* Used for ARS */ ! 794: else ! 795: sbbs->cursubnum=INVALID_SUB; ! 796: if(sbbs->usrlibs) ! 797: sbbs->curdirnum=sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]]; /* Used for ARS */ ! 798: else ! 799: sbbs->curdirnum=INVALID_DIR; ! 800: ! 801: return(JS_TRUE); ! 802: } ! 803: ! 804: #define PROP_READONLY JSPROP_ENUMERATE|JSPROP_READONLY ! 805: ! 806: static jsSyncPropertySpec js_bbs_properties[] = { ! 807: /* name ,tinyid ,flags ,ver */ ! 808: ! 809: { "sys_status" ,BBS_PROP_SYS_STATUS ,JSPROP_ENUMERATE ,310}, ! 810: { "startup_options" ,BBS_PROP_STARTUP_OPT ,JSPROP_ENUMERATE ,310}, ! 811: { "answer_time" ,BBS_PROP_ANSWER_TIME ,JSPROP_ENUMERATE ,310}, ! 812: { "logon_time" ,BBS_PROP_LOGON_TIME ,JSPROP_ENUMERATE ,310}, ! 813: { "start_time" ,BBS_PROP_START_TIME ,JSPROP_ENUMERATE ,314}, ! 814: { "new_file_time" ,BBS_PROP_NS_TIME ,JSPROP_ENUMERATE ,310}, ! 815: { "last_new_file_time",BBS_PROP_LAST_NS_TIME ,JSPROP_ENUMERATE ,310}, ! 816: { "online" ,BBS_PROP_ONLINE ,JSPROP_ENUMERATE ,310}, ! 817: { "timeleft" ,BBS_PROP_TIMELEFT ,JSPROP_READONLY ,310}, /* alias */ ! 818: { "time_left" ,BBS_PROP_TIMELEFT ,PROP_READONLY ,311}, ! 819: { "event_time" ,BBS_PROP_EVENT_TIME ,PROP_READONLY ,311}, ! 820: { "event_code" ,BBS_PROP_EVENT_CODE ,PROP_READONLY ,311}, ! 821: { "node_num" ,BBS_PROP_NODE_NUM ,PROP_READONLY ,310}, ! 822: { "node_settings" ,BBS_PROP_NODE_MISC ,JSPROP_ENUMERATE ,310}, ! 823: { "node_action" ,BBS_PROP_NODE_ACTION ,JSPROP_ENUMERATE ,310}, ! 824: { "node_val_user" ,BBS_PROP_NODE_VAL_USER ,JSPROP_ENUMERATE ,310}, ! 825: { "logon_ulb" ,BBS_PROP_LOGON_ULB ,JSPROP_ENUMERATE ,310}, ! 826: { "logon_dlb" ,BBS_PROP_LOGON_DLB ,JSPROP_ENUMERATE ,310}, ! 827: { "logon_uls" ,BBS_PROP_LOGON_ULS ,JSPROP_ENUMERATE ,310}, ! 828: { "logon_dls" ,BBS_PROP_LOGON_DLS ,JSPROP_ENUMERATE ,310}, ! 829: { "logon_posts" ,BBS_PROP_LOGON_POSTS ,JSPROP_ENUMERATE ,310}, ! 830: { "logon_emails" ,BBS_PROP_LOGON_EMAILS ,JSPROP_ENUMERATE ,310}, ! 831: { "logon_fbacks" ,BBS_PROP_LOGON_FBACKS ,JSPROP_ENUMERATE ,310}, ! 832: { "posts_read" ,BBS_PROP_POSTS_READ ,JSPROP_ENUMERATE ,310}, ! 833: { "menu_dir" ,BBS_PROP_MENU_DIR ,JSPROP_ENUMERATE ,310}, ! 834: { "menu_file" ,BBS_PROP_MENU_FILE ,JSPROP_ENUMERATE ,310}, ! 835: { "main_cmds" ,BBS_PROP_MAIN_CMDS ,JSPROP_ENUMERATE ,310}, ! 836: { "file_cmds" ,BBS_PROP_FILE_CMDS ,JSPROP_ENUMERATE ,310}, ! 837: { "curgrp" ,BBS_PROP_CURGRP ,JSPROP_ENUMERATE ,310}, ! 838: { "cursub" ,BBS_PROP_CURSUB ,JSPROP_ENUMERATE ,310}, ! 839: { "cursub_code" ,BBS_PROP_CURSUB_CODE ,JSPROP_ENUMERATE ,314}, ! 840: { "curlib" ,BBS_PROP_CURLIB ,JSPROP_ENUMERATE ,310}, ! 841: { "curdir" ,BBS_PROP_CURDIR ,JSPROP_ENUMERATE ,310}, ! 842: { "curdir_code" ,BBS_PROP_CURDIR_CODE ,JSPROP_ENUMERATE ,314}, ! 843: { "connection" ,BBS_PROP_CONNECTION ,PROP_READONLY ,310}, ! 844: { "rlogin_name" ,BBS_PROP_RLOGIN_NAME ,JSPROP_ENUMERATE ,310}, ! 845: { "client_name" ,BBS_PROP_CLIENT_NAME ,JSPROP_ENUMERATE ,310}, ! 846: { "alt_ul_dir" ,BBS_PROP_ALTUL ,JSPROP_ENUMERATE ,310}, ! 847: { "errorlevel" ,BBS_PROP_ERRORLEVEL ,PROP_READONLY ,312}, ! 848: ! 849: { "smb_group" ,BBS_PROP_SMB_GROUP ,PROP_READONLY ,310}, ! 850: { "smb_group_desc" ,BBS_PROP_SMB_GROUP_DESC ,PROP_READONLY ,310}, ! 851: { "smb_group_number" ,BBS_PROP_SMB_GROUP_NUM ,PROP_READONLY ,310}, ! 852: { "smb_sub" ,BBS_PROP_SMB_SUB ,PROP_READONLY ,310}, ! 853: { "smb_sub_desc" ,BBS_PROP_SMB_SUB_DESC ,PROP_READONLY ,310}, ! 854: { "smb_sub_code" ,BBS_PROP_SMB_SUB_CODE ,PROP_READONLY ,310}, ! 855: { "smb_sub_number" ,BBS_PROP_SMB_SUB_NUM ,PROP_READONLY ,310}, ! 856: { "smb_attr" ,BBS_PROP_SMB_ATTR ,PROP_READONLY ,310}, ! 857: { "smb_last_msg" ,BBS_PROP_SMB_LAST_MSG ,PROP_READONLY ,310}, ! 858: { "smb_total_msgs" ,BBS_PROP_SMB_TOTAL_MSGS ,PROP_READONLY ,310}, ! 859: { "smb_msgs" ,BBS_PROP_SMB_MSGS ,PROP_READONLY ,310}, ! 860: { "smb_curmsg" ,BBS_PROP_SMB_CURMSG ,PROP_READONLY ,310}, ! 861: ! 862: { "msg_to" ,BBS_PROP_MSG_TO ,PROP_READONLY ,310}, ! 863: { "msg_to_ext" ,BBS_PROP_MSG_TO_EXT ,PROP_READONLY ,310}, ! 864: { "msg_to_net" ,BBS_PROP_MSG_TO_NET ,PROP_READONLY ,310}, ! 865: { "msg_to_agent" ,BBS_PROP_MSG_TO_AGENT ,PROP_READONLY ,310}, ! 866: { "msg_from" ,BBS_PROP_MSG_FROM ,PROP_READONLY ,310}, ! 867: { "msg_from_ext" ,BBS_PROP_MSG_FROM_EXT ,PROP_READONLY ,310}, ! 868: { "msg_from_net" ,BBS_PROP_MSG_FROM_NET ,PROP_READONLY ,310}, ! 869: { "msg_from_agent" ,BBS_PROP_MSG_FROM_AGENT ,PROP_READONLY ,310}, ! 870: { "msg_replyto" ,BBS_PROP_MSG_REPLYTO ,PROP_READONLY ,310}, ! 871: { "msg_replyto_ext" ,BBS_PROP_MSG_REPLYTO_EXT ,PROP_READONLY ,310}, ! 872: { "msg_replyto_net" ,BBS_PROP_MSG_REPLYTO_NET ,PROP_READONLY ,310}, ! 873: { "msg_replyto_agent" ,BBS_PROP_MSG_REPLYTO_AGENT ,PROP_READONLY ,310}, ! 874: { "msg_subject" ,BBS_PROP_MSG_SUBJECT ,PROP_READONLY ,310}, ! 875: { "msg_date" ,BBS_PROP_MSG_DATE ,PROP_READONLY ,310}, ! 876: { "msg_timezone" ,BBS_PROP_MSG_TIMEZONE ,PROP_READONLY ,310}, ! 877: { "msg_date_imported" ,BBS_PROP_MSG_DATE_IMPORTED ,PROP_READONLY ,310}, ! 878: { "msg_attr" ,BBS_PROP_MSG_ATTR ,PROP_READONLY ,310}, ! 879: { "msg_auxattr" ,BBS_PROP_MSG_AUXATTR ,PROP_READONLY ,310}, ! 880: { "msg_netattr" ,BBS_PROP_MSG_NETATTR ,PROP_READONLY ,310}, ! 881: { "msg_offset" ,BBS_PROP_MSG_OFFSET ,PROP_READONLY ,310}, ! 882: { "msg_number" ,BBS_PROP_MSG_NUMBER ,PROP_READONLY ,310}, ! 883: { "msg_expiration" ,BBS_PROP_MSG_EXPIRATION ,PROP_READONLY ,310}, ! 884: { "msg_forwarded" ,BBS_PROP_MSG_FORWARDED ,PROP_READONLY ,310}, ! 885: { "msg_thread_back" ,BBS_PROP_MSG_THREAD_BACK ,PROP_READONLY ,312}, ! 886: { "msg_thread_orig" ,BBS_PROP_MSG_THREAD_BACK ,JSPROP_READONLY,310}, /* alias */ ! 887: { "msg_thread_next" ,BBS_PROP_MSG_THREAD_NEXT ,PROP_READONLY ,310}, ! 888: { "msg_thread_first" ,BBS_PROP_MSG_THREAD_FIRST ,PROP_READONLY ,310}, ! 889: { "msg_id" ,BBS_PROP_MSG_ID ,PROP_READONLY ,310}, ! 890: { "msg_reply_id" ,BBS_PROP_MSG_REPLY_ID ,PROP_READONLY ,310}, ! 891: { "msg_delivery_attempts" ,BBS_PROP_MSG_DELIVERY_ATTEMPTS ! 892: ,PROP_READONLY ,310}, ! 893: ! 894: { "batch_upload_total",BBS_PROP_BATCH_UPLOAD_TOTAL,PROP_READONLY ,310}, ! 895: { "batch_dnload_total",BBS_PROP_BATCH_DNLOAD_TOTAL,PROP_READONLY ,310}, ! 896: ! 897: { "command_str" ,BBS_PROP_COMMAND_STR ,JSPROP_ENUMERATE, 314}, ! 898: {0} ! 899: }; ! 900: ! 901: /* Utility functions */ ! 902: static uint get_subnum(JSContext* cx, sbbs_t* sbbs, jsval val) ! 903: { ! 904: uint subnum=INVALID_SUB; ! 905: ! 906: if(JSVAL_IS_STRING(val)) { ! 907: char* p=JS_GetStringBytes(JS_ValueToString(cx,val)); ! 908: for(subnum=0;subnum<sbbs->cfg.total_subs;subnum++) ! 909: if(!stricmp(sbbs->cfg.sub[subnum]->code,p)) ! 910: break; ! 911: } else if(JSVAL_IS_NUM(val)) ! 912: JS_ValueToInt32(cx,val,(int32*)&subnum); ! 913: else if(sbbs->usrgrps>0) ! 914: subnum=sbbs->usrsub[sbbs->curgrp][sbbs->cursub[sbbs->curgrp]]; ! 915: ! 916: return(subnum); ! 917: } ! 918: ! 919: static uint get_dirnum(JSContext* cx, sbbs_t* sbbs, jsval val) ! 920: { ! 921: uint dirnum=INVALID_DIR; ! 922: ! 923: if(JSVAL_IS_STRING(val)) { ! 924: char* p=JS_GetStringBytes(JS_ValueToString(cx,val)); ! 925: for(dirnum=0;dirnum<sbbs->cfg.total_dirs;dirnum++) ! 926: if(!stricmp(sbbs->cfg.dir[dirnum]->code,p)) ! 927: break; ! 928: } else if(JSVAL_IS_NUM(val)) ! 929: JS_ValueToInt32(cx,val,(int32*)&dirnum); ! 930: else if(sbbs->usrlibs>0) ! 931: dirnum=sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]]; ! 932: ! 933: return(dirnum); ! 934: } ! 935: ! 936: /**************************/ ! 937: /* bbs Object Methods */ ! 938: /**************************/ ! 939: ! 940: static JSBool ! 941: js_menu(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 942: { ! 943: JSString* str; ! 944: sbbs_t* sbbs; ! 945: ! 946: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 947: return(JS_FALSE); ! 948: ! 949: str = JS_ValueToString(cx, argv[0]); ! 950: if (!str) ! 951: return(JS_FALSE); ! 952: ! 953: sbbs->menu(JS_GetStringBytes(str)); ! 954: ! 955: return(JS_TRUE); ! 956: } ! 957: ! 958: static JSBool ! 959: js_hangup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 960: { ! 961: sbbs_t* sbbs; ! 962: ! 963: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 964: return(JS_FALSE); ! 965: ! 966: sbbs->hangup(); ! 967: ! 968: return(JS_TRUE); ! 969: } ! 970: ! 971: static JSBool ! 972: js_nodesync(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 973: { ! 974: sbbs_t* sbbs; ! 975: ! 976: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 977: return(JS_FALSE); ! 978: ! 979: sbbs->getnodedat(sbbs->cfg.node_num,&sbbs->thisnode,0); ! 980: sbbs->nodesync(); ! 981: ! 982: return(JS_TRUE); ! 983: } ! 984: ! 985: static JSBool ! 986: js_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 987: { ! 988: uintN i; ! 989: sbbs_t* sbbs; ! 990: long mode=0; ! 991: JSString* cmd; ! 992: JSString* startup_dir=NULL; ! 993: char* p_startup_dir=NULL; ! 994: ! 995: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 996: return(JS_FALSE); ! 997: ! 998: if((cmd=JS_ValueToString(cx, argv[0]))==NULL) ! 999: return(JS_FALSE); ! 1000: ! 1001: for(i=1;i<argc;i++) { ! 1002: if(JSVAL_IS_NUM(argv[i])) ! 1003: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 1004: else if(JSVAL_IS_STRING(argv[i])) ! 1005: startup_dir=JS_ValueToString(cx,argv[i]); ! 1006: } ! 1007: ! 1008: if(startup_dir!=NULL) ! 1009: p_startup_dir=JS_GetStringBytes(startup_dir); ! 1010: ! 1011: *rval = INT_TO_JSVAL(sbbs->external(JS_GetStringBytes(cmd),mode,p_startup_dir)); ! 1012: ! 1013: return(JS_TRUE); ! 1014: } ! 1015: ! 1016: static JSBool ! 1017: js_exec_xtrn(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1018: { ! 1019: int32 i=0; ! 1020: char* code; ! 1021: sbbs_t* sbbs; ! 1022: JSString* str; ! 1023: ! 1024: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1025: return(JS_FALSE); ! 1026: ! 1027: if(JSVAL_IS_STRING(argv[0])) { ! 1028: if((str=JS_ValueToString(cx, argv[0]))==NULL) ! 1029: return(JS_FALSE); ! 1030: ! 1031: if((code=JS_GetStringBytes(str))==NULL) ! 1032: return(JS_FALSE); ! 1033: ! 1034: for(i=0;i<sbbs->cfg.total_xtrns;i++) ! 1035: if(!stricmp(sbbs->cfg.xtrn[i]->code,code)) ! 1036: break; ! 1037: } else if(JSVAL_IS_NUM(argv[0])) ! 1038: JS_ValueToInt32(cx,argv[0],&i); ! 1039: ! 1040: if(i>=sbbs->cfg.total_xtrns) { ! 1041: *rval = JSVAL_FALSE; ! 1042: return(JS_TRUE); ! 1043: } ! 1044: ! 1045: *rval = BOOLEAN_TO_JSVAL(sbbs->exec_xtrn(i)); ! 1046: return(JS_TRUE); ! 1047: } ! 1048: ! 1049: static JSBool ! 1050: js_user_event(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1051: { ! 1052: int32 i=0; ! 1053: sbbs_t* sbbs; ! 1054: ! 1055: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1056: return(JS_FALSE); ! 1057: ! 1058: if(JSVAL_IS_NUM(argv[0])) ! 1059: JS_ValueToInt32(cx,argv[0],&i); ! 1060: *rval = BOOLEAN_TO_JSVAL(sbbs->user_event((user_event_t)i)); ! 1061: return(JS_TRUE); ! 1062: } ! 1063: ! 1064: static JSBool ! 1065: js_chksyspass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1066: { ! 1067: sbbs_t* sbbs; ! 1068: ! 1069: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1070: return(JS_FALSE); ! 1071: ! 1072: *rval = BOOLEAN_TO_JSVAL(sbbs->chksyspass()); ! 1073: return(JS_TRUE); ! 1074: } ! 1075: ! 1076: static JSBool ! 1077: js_chkpass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1078: { ! 1079: sbbs_t* sbbs; ! 1080: ! 1081: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1082: return(JS_FALSE); ! 1083: ! 1084: JSString* str=JS_ValueToString(cx,argv[0]); ! 1085: ! 1086: *rval = BOOLEAN_TO_JSVAL(sbbs->chkpass(JS_GetStringBytes(str),&sbbs->useron,true)); ! 1087: return(JS_TRUE); ! 1088: } ! 1089: ! 1090: ! 1091: static JSBool ! 1092: js_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1093: { ! 1094: int32 i=0; ! 1095: sbbs_t* sbbs; ! 1096: ! 1097: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1098: return(JS_FALSE); ! 1099: ! 1100: if(JSVAL_IS_NUM(argv[0])) ! 1101: JS_ValueToInt32(cx,argv[0],&i); ! 1102: i--; ! 1103: ! 1104: if(i<0 || i>=TOTAL_TEXT) ! 1105: *rval = JSVAL_NULL; ! 1106: else { ! 1107: JSString* js_str = JS_NewStringCopyZ(cx, sbbs->text[i]); ! 1108: if(js_str==NULL) ! 1109: return(JS_FALSE); ! 1110: *rval = STRING_TO_JSVAL(js_str); ! 1111: } ! 1112: ! 1113: return(JS_TRUE); ! 1114: } ! 1115: ! 1116: static JSBool ! 1117: js_replace_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1118: { ! 1119: char* p; ! 1120: int32 i=0; ! 1121: int len; ! 1122: JSString* js_str; ! 1123: sbbs_t* sbbs; ! 1124: ! 1125: *rval = JSVAL_FALSE; ! 1126: ! 1127: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1128: return(JS_FALSE); ! 1129: ! 1130: if(JSVAL_IS_NUM(argv[0])) ! 1131: JS_ValueToInt32(cx,argv[0],&i); ! 1132: i--; ! 1133: ! 1134: if(i<0 || i>=TOTAL_TEXT) ! 1135: return(JS_TRUE); ! 1136: ! 1137: if(sbbs->text[i]!=sbbs->text_sav[i] && sbbs->text[i]!=nulstr) ! 1138: free(sbbs->text[i]); ! 1139: ! 1140: if((js_str=JS_ValueToString(cx, argv[1]))==NULL) ! 1141: return(JS_TRUE); ! 1142: ! 1143: if((p=JS_GetStringBytes(js_str))==NULL) ! 1144: return(JS_TRUE); ! 1145: ! 1146: len=strlen(p); ! 1147: if(!len) { ! 1148: sbbs->text[i]=nulstr; ! 1149: *rval = JSVAL_TRUE; ! 1150: } else { ! 1151: sbbs->text[i]=(char *)malloc(len+1); ! 1152: if(sbbs->text[i]==NULL) { ! 1153: sbbs->text[i]=sbbs->text_sav[i]; ! 1154: } else { ! 1155: strcpy(sbbs->text[i],p); ! 1156: *rval = JSVAL_TRUE; ! 1157: } ! 1158: } ! 1159: ! 1160: return(JS_TRUE); ! 1161: } ! 1162: ! 1163: static JSBool ! 1164: js_revert_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1165: { ! 1166: int32 i=0; ! 1167: sbbs_t* sbbs; ! 1168: ! 1169: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1170: return(JS_FALSE); ! 1171: ! 1172: if(JSVAL_IS_NUM(argv[0])) ! 1173: JS_ValueToInt32(cx,argv[0],&i); ! 1174: i--; ! 1175: ! 1176: if(i<0 || i>=TOTAL_TEXT) { ! 1177: for(i=0;i<TOTAL_TEXT;i++) { ! 1178: if(sbbs->text[i]!=sbbs->text_sav[i] && sbbs->text[i]!=nulstr) ! 1179: free(sbbs->text[i]); ! 1180: sbbs->text[i]=sbbs->text_sav[i]; ! 1181: } ! 1182: } else { ! 1183: if(sbbs->text[i]!=sbbs->text_sav[i] && sbbs->text[i]!=nulstr) ! 1184: free(sbbs->text[i]); ! 1185: sbbs->text[i]=sbbs->text_sav[i]; ! 1186: } ! 1187: ! 1188: *rval = JSVAL_TRUE; ! 1189: ! 1190: return(JS_TRUE); ! 1191: } ! 1192: ! 1193: static JSBool ! 1194: js_load_text(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1195: { ! 1196: int i; ! 1197: char path[MAX_PATH+1]; ! 1198: FILE* stream; ! 1199: JSString* js_str; ! 1200: sbbs_t* sbbs; ! 1201: ! 1202: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1203: return(JS_FALSE); ! 1204: ! 1205: if((js_str=JS_ValueToString(cx, argv[0]))==NULL) { ! 1206: *rval = JSVAL_FALSE; ! 1207: return(JS_TRUE); ! 1208: } ! 1209: ! 1210: for(i=0;i<TOTAL_TEXT;i++) { ! 1211: if(sbbs->text[i]!=sbbs->text_sav[i]) { ! 1212: if(sbbs->text[i]!=nulstr) ! 1213: free(sbbs->text[i]); ! 1214: sbbs->text[i]=sbbs->text_sav[i]; ! 1215: } ! 1216: } ! 1217: sprintf(path,"%s%s.dat" ! 1218: ,sbbs->cfg.ctrl_dir,JS_GetStringBytes(js_str)); ! 1219: ! 1220: if((stream=fnopen(NULL,path,O_RDONLY))==NULL) { ! 1221: *rval = JSVAL_FALSE; ! 1222: return(JS_TRUE); ! 1223: } ! 1224: for(i=0;i<TOTAL_TEXT && !feof(stream);i++) { ! 1225: if((sbbs->text[i]=readtext((long *)NULL,stream))==NULL) { ! 1226: i--; ! 1227: continue; ! 1228: } ! 1229: if(!strcmp(sbbs->text[i],sbbs->text_sav[i])) { /* If identical */ ! 1230: free(sbbs->text[i]); /* Don't alloc */ ! 1231: sbbs->text[i]=sbbs->text_sav[i]; ! 1232: } ! 1233: else if(sbbs->text[i][0]==0) { ! 1234: free(sbbs->text[i]); ! 1235: sbbs->text[i]=nulstr; ! 1236: } ! 1237: } ! 1238: if(i<TOTAL_TEXT) ! 1239: *rval = JSVAL_FALSE; ! 1240: else ! 1241: *rval = JSVAL_TRUE; ! 1242: ! 1243: fclose(stream); ! 1244: ! 1245: return(JS_TRUE); ! 1246: } ! 1247: ! 1248: static JSBool ! 1249: js_atcode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1250: { ! 1251: char str[128]; ! 1252: sbbs_t* sbbs; ! 1253: ! 1254: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1255: return(JS_FALSE); ! 1256: ! 1257: char* p = JS_GetStringBytes(JS_ValueToString(cx, argv[0])); ! 1258: ! 1259: p=sbbs->atcode(p,str,sizeof(str)); ! 1260: ! 1261: if(p==NULL) ! 1262: *rval = JSVAL_NULL; ! 1263: else { ! 1264: JSString* js_str = JS_NewStringCopyZ(cx, p); ! 1265: if(js_str==NULL) ! 1266: return(JS_FALSE); ! 1267: *rval = STRING_TO_JSVAL(js_str); ! 1268: } ! 1269: ! 1270: return(JS_TRUE); ! 1271: } ! 1272: ! 1273: ! 1274: static JSBool ! 1275: js_logkey(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1276: { ! 1277: char* p; ! 1278: JSBool comma=false; ! 1279: JSString* js_str; ! 1280: sbbs_t* sbbs; ! 1281: ! 1282: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1283: return(JS_FALSE); ! 1284: ! 1285: if((js_str=JS_ValueToString(cx, argv[0]))==NULL) { ! 1286: *rval = JSVAL_FALSE; ! 1287: return(JS_TRUE); ! 1288: } ! 1289: ! 1290: if(argc>1) ! 1291: JS_ValueToBoolean(cx,argv[1],&comma); ! 1292: ! 1293: if((p=JS_GetStringBytes(js_str))==NULL) { ! 1294: *rval = JSVAL_FALSE; ! 1295: return(JS_TRUE); ! 1296: } ! 1297: ! 1298: sbbs->logch(*p ! 1299: ,comma ? true:false // This is a dumb bool conversion to make BC++ happy ! 1300: ); ! 1301: ! 1302: *rval = JSVAL_TRUE; ! 1303: return(JS_TRUE); ! 1304: } ! 1305: ! 1306: static JSBool ! 1307: js_logstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1308: { ! 1309: char* p; ! 1310: JSString* js_str; ! 1311: sbbs_t* sbbs; ! 1312: ! 1313: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1314: return(JS_FALSE); ! 1315: ! 1316: if((js_str=JS_ValueToString(cx, argv[0]))==NULL) { ! 1317: *rval = JSVAL_FALSE; ! 1318: return(JS_TRUE); ! 1319: } ! 1320: ! 1321: if((p=JS_GetStringBytes(js_str))==NULL) { ! 1322: *rval = JSVAL_FALSE; ! 1323: return(JS_TRUE); ! 1324: } ! 1325: ! 1326: sbbs->log(p); ! 1327: ! 1328: *rval = JSVAL_TRUE; ! 1329: return(JS_TRUE); ! 1330: } ! 1331: ! 1332: static JSBool ! 1333: js_finduser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1334: { ! 1335: char* p; ! 1336: JSString* js_str; ! 1337: sbbs_t* sbbs; ! 1338: ! 1339: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1340: return(JS_FALSE); ! 1341: ! 1342: if((js_str=JS_ValueToString(cx, argv[0]))==NULL) { ! 1343: *rval = INT_TO_JSVAL(0); ! 1344: return(JS_TRUE); ! 1345: } ! 1346: ! 1347: if((p=JS_GetStringBytes(js_str))==NULL) { ! 1348: *rval = INT_TO_JSVAL(0); ! 1349: return(JS_TRUE); ! 1350: } ! 1351: ! 1352: *rval = INT_TO_JSVAL(sbbs->finduser(p)); ! 1353: return(JS_TRUE); ! 1354: } ! 1355: ! 1356: static JSBool ! 1357: js_trashcan(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1358: { ! 1359: char* str; ! 1360: char* can; ! 1361: JSString* js_str; ! 1362: JSString* js_can; ! 1363: sbbs_t* sbbs; ! 1364: ! 1365: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1366: return(JS_FALSE); ! 1367: ! 1368: if((js_can=JS_ValueToString(cx, argv[0]))==NULL) { ! 1369: *rval = JSVAL_FALSE; ! 1370: return(JS_TRUE); ! 1371: } ! 1372: ! 1373: if((js_str=JS_ValueToString(cx, argv[1]))==NULL) { ! 1374: *rval = JSVAL_FALSE; ! 1375: return(JS_TRUE); ! 1376: } ! 1377: ! 1378: if((can=JS_GetStringBytes(js_can))==NULL) { ! 1379: *rval = JSVAL_FALSE; ! 1380: return(JS_TRUE); ! 1381: } ! 1382: ! 1383: if((str=JS_GetStringBytes(js_str))==NULL) { ! 1384: *rval = JSVAL_FALSE; ! 1385: return(JS_TRUE); ! 1386: } ! 1387: ! 1388: *rval = BOOLEAN_TO_JSVAL(sbbs->trashcan(str,can)); // user args are reversed ! 1389: return(JS_TRUE); ! 1390: } ! 1391: ! 1392: static JSBool ! 1393: js_newuser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1394: { ! 1395: sbbs_t* sbbs; ! 1396: ! 1397: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1398: return(JS_FALSE); ! 1399: ! 1400: *rval = BOOLEAN_TO_JSVAL(sbbs->newuser()); ! 1401: return(JS_TRUE); ! 1402: } ! 1403: ! 1404: static JSBool ! 1405: js_logon(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1406: { ! 1407: sbbs_t* sbbs; ! 1408: ! 1409: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1410: return(JS_FALSE); ! 1411: ! 1412: *rval = BOOLEAN_TO_JSVAL(sbbs->logon()); ! 1413: return(JS_TRUE); ! 1414: } ! 1415: ! 1416: static JSBool ! 1417: js_login(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1418: { ! 1419: char* name; ! 1420: char* pw; ! 1421: JSString* js_name; ! 1422: JSString* js_pw; ! 1423: sbbs_t* sbbs; ! 1424: ! 1425: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1426: return(JS_FALSE); ! 1427: ! 1428: if((js_name=JS_ValueToString(cx, argv[0]))==NULL) ! 1429: return(JS_FALSE); ! 1430: ! 1431: if((js_pw=JS_ValueToString(cx, argv[1]))==NULL) ! 1432: return(JS_FALSE); ! 1433: ! 1434: if((name=JS_GetStringBytes(js_name))==NULL) ! 1435: return(JS_FALSE); ! 1436: ! 1437: if((pw=JS_GetStringBytes(js_pw))==NULL) ! 1438: return(JS_FALSE); ! 1439: ! 1440: *rval = BOOLEAN_TO_JSVAL(sbbs->login(name,pw)==LOGIC_TRUE ? JS_TRUE:JS_FALSE); ! 1441: return(JS_TRUE); ! 1442: } ! 1443: ! 1444: ! 1445: static JSBool ! 1446: js_logoff(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1447: { ! 1448: sbbs_t* sbbs; ! 1449: ! 1450: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1451: return(JS_FALSE); ! 1452: ! 1453: if(!sbbs->noyes(sbbs->text[LogOffQ])) { ! 1454: if(sbbs->cfg.logoff_mod[0]) ! 1455: sbbs->exec_bin(sbbs->cfg.logoff_mod,&sbbs->main_csi); ! 1456: sbbs->user_event(EVENT_LOGOFF); ! 1457: sbbs->menu("logoff"); ! 1458: sbbs->hangup(); ! 1459: } ! 1460: ! 1461: return(JS_TRUE); ! 1462: } ! 1463: ! 1464: static JSBool ! 1465: js_logout(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1466: { ! 1467: sbbs_t* sbbs; ! 1468: ! 1469: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1470: return(JS_FALSE); ! 1471: ! 1472: sbbs->logout(); ! 1473: ! 1474: return(JS_TRUE); ! 1475: } ! 1476: ! 1477: static JSBool ! 1478: js_automsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1479: { ! 1480: sbbs_t* sbbs; ! 1481: ! 1482: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1483: return(JS_FALSE); ! 1484: ! 1485: sbbs->automsg(); ! 1486: ! 1487: return(JS_TRUE); ! 1488: } ! 1489: ! 1490: static JSBool ! 1491: js_time_bank(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1492: { ! 1493: sbbs_t* sbbs; ! 1494: ! 1495: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1496: return(JS_FALSE); ! 1497: ! 1498: sbbs->time_bank(); ! 1499: ! 1500: return(JS_TRUE); ! 1501: } ! 1502: ! 1503: static JSBool ! 1504: js_text_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1505: { ! 1506: sbbs_t* sbbs; ! 1507: ! 1508: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1509: return(JS_FALSE); ! 1510: ! 1511: sbbs->text_sec(); ! 1512: ! 1513: return(JS_TRUE); ! 1514: } ! 1515: ! 1516: static JSBool ! 1517: js_qwk_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1518: { ! 1519: sbbs_t* sbbs; ! 1520: ! 1521: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1522: return(JS_FALSE); ! 1523: ! 1524: sbbs->qwk_sec(); ! 1525: ! 1526: return(JS_TRUE); ! 1527: } ! 1528: ! 1529: static JSBool ! 1530: js_xtrn_sec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1531: { ! 1532: sbbs_t* sbbs; ! 1533: ! 1534: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1535: return(JS_FALSE); ! 1536: ! 1537: sbbs->xtrn_sec(); ! 1538: ! 1539: return(JS_TRUE); ! 1540: } ! 1541: ! 1542: static JSBool ! 1543: js_xfer_policy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1544: { ! 1545: sbbs_t* sbbs; ! 1546: ! 1547: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1548: return(JS_FALSE); ! 1549: ! 1550: sbbs->xfer_policy(); ! 1551: ! 1552: return(JS_TRUE); ! 1553: } ! 1554: ! 1555: static JSBool ! 1556: js_batchmenu(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1557: { ! 1558: sbbs_t* sbbs; ! 1559: ! 1560: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1561: return(JS_FALSE); ! 1562: ! 1563: sbbs->batchmenu(); ! 1564: ! 1565: return(JS_TRUE); ! 1566: } ! 1567: ! 1568: static JSBool ! 1569: js_batchdownload(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1570: { ! 1571: sbbs_t* sbbs; ! 1572: ! 1573: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1574: return(JS_FALSE); ! 1575: ! 1576: *rval = BOOLEAN_TO_JSVAL(sbbs->start_batch_download()); ! 1577: return(JS_TRUE); ! 1578: } ! 1579: ! 1580: static JSBool ! 1581: js_batchaddlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1582: { ! 1583: sbbs_t* sbbs; ! 1584: ! 1585: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1586: return(JS_FALSE); ! 1587: ! 1588: sbbs->batch_add_list(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))); ! 1589: ! 1590: return(JS_TRUE); ! 1591: } ! 1592: ! 1593: static JSBool ! 1594: js_sendfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1595: { ! 1596: sbbs_t* sbbs; ! 1597: char prot=0; ! 1598: char* p; ! 1599: ! 1600: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1601: return(JS_FALSE); ! 1602: ! 1603: if(argc>1 && (p=js_ValueToStringBytes(cx, argv[1], NULL))!=NULL) ! 1604: prot=*p; ! 1605: ! 1606: *rval = BOOLEAN_TO_JSVAL(sbbs->sendfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0])),prot)); ! 1607: ! 1608: return(JS_TRUE); ! 1609: } ! 1610: ! 1611: static JSBool ! 1612: js_recvfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1613: { ! 1614: sbbs_t* sbbs; ! 1615: char prot=0; ! 1616: char* p; ! 1617: ! 1618: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1619: return(JS_FALSE); ! 1620: ! 1621: if(argc>1 && (p=js_ValueToStringBytes(cx, argv[1], NULL))!=NULL) ! 1622: prot=*p; ! 1623: ! 1624: *rval = BOOLEAN_TO_JSVAL(sbbs->recvfile(JS_GetStringBytes(JS_ValueToString(cx, argv[0])),prot)); ! 1625: ! 1626: return(JS_TRUE); ! 1627: } ! 1628: ! 1629: static JSBool ! 1630: js_temp_xfer(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1631: { ! 1632: sbbs_t* sbbs; ! 1633: ! 1634: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1635: return(JS_FALSE); ! 1636: ! 1637: sbbs->temp_xfer(); ! 1638: ! 1639: return(JS_TRUE); ! 1640: } ! 1641: ! 1642: static JSBool ! 1643: js_user_config(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1644: { ! 1645: sbbs_t* sbbs; ! 1646: ! 1647: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1648: return(JS_FALSE); ! 1649: ! 1650: sbbs->maindflts(&sbbs->useron); ! 1651: if(!(sbbs->useron.rest&FLAG('G'))) /* not guest */ ! 1652: getuserdat(&sbbs->cfg,&sbbs->useron); ! 1653: ! 1654: return(JS_TRUE); ! 1655: } ! 1656: ! 1657: static JSBool ! 1658: js_user_sync(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1659: { ! 1660: sbbs_t* sbbs; ! 1661: ! 1662: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1663: return(JS_FALSE); ! 1664: ! 1665: getuserdat(&sbbs->cfg,&sbbs->useron); ! 1666: ! 1667: return(JS_TRUE); ! 1668: } ! 1669: ! 1670: static JSBool ! 1671: js_sys_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1672: { ! 1673: sbbs_t* sbbs; ! 1674: ! 1675: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1676: return(JS_FALSE); ! 1677: ! 1678: sbbs->sys_info(); ! 1679: ! 1680: return(JS_TRUE); ! 1681: } ! 1682: ! 1683: static JSBool ! 1684: js_sub_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1685: { ! 1686: sbbs_t* sbbs; ! 1687: ! 1688: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1689: return(JS_FALSE); ! 1690: ! 1691: uint subnum=get_subnum(cx,sbbs,argv[0]); ! 1692: ! 1693: if(subnum<sbbs->cfg.total_subs) ! 1694: sbbs->subinfo(subnum); ! 1695: ! 1696: return(JS_TRUE); ! 1697: } ! 1698: ! 1699: static JSBool ! 1700: js_dir_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1701: { ! 1702: sbbs_t* sbbs; ! 1703: ! 1704: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1705: return(JS_FALSE); ! 1706: ! 1707: uint dirnum=get_dirnum(cx,sbbs,argv[0]); ! 1708: if(dirnum<sbbs->cfg.total_dirs) ! 1709: sbbs->dirinfo(dirnum); ! 1710: ! 1711: return(JS_TRUE); ! 1712: } ! 1713: ! 1714: static JSBool ! 1715: js_user_info(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1716: { ! 1717: sbbs_t* sbbs; ! 1718: ! 1719: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1720: return(JS_FALSE); ! 1721: ! 1722: sbbs->user_info(); ! 1723: ! 1724: return(JS_TRUE); ! 1725: } ! 1726: ! 1727: static JSBool ! 1728: js_ver(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1729: { ! 1730: sbbs_t* sbbs; ! 1731: ! 1732: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1733: return(JS_FALSE); ! 1734: ! 1735: sbbs->ver(); ! 1736: ! 1737: return(JS_TRUE); ! 1738: } ! 1739: ! 1740: static JSBool ! 1741: js_sys_stats(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1742: { ! 1743: sbbs_t* sbbs; ! 1744: ! 1745: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1746: return(JS_FALSE); ! 1747: ! 1748: sbbs->sys_stats(); ! 1749: ! 1750: return(JS_TRUE); ! 1751: } ! 1752: ! 1753: static JSBool ! 1754: js_node_stats(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1755: { ! 1756: int32 node_num=0; ! 1757: sbbs_t* sbbs; ! 1758: ! 1759: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1760: return(JS_FALSE); ! 1761: ! 1762: if(argc>0 && JSVAL_IS_NUM(argv[0])) ! 1763: JS_ValueToInt32(cx,argv[0],&node_num); ! 1764: ! 1765: sbbs->node_stats(node_num); ! 1766: ! 1767: return(JS_TRUE); ! 1768: } ! 1769: ! 1770: static JSBool ! 1771: js_userlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1772: { ! 1773: int32 mode=UL_ALL; ! 1774: sbbs_t* sbbs; ! 1775: ! 1776: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1777: return(JS_FALSE); ! 1778: ! 1779: if(argc>0 && JSVAL_IS_NUM(argv[0])) ! 1780: JS_ValueToInt32(cx,argv[0],&mode); ! 1781: ! 1782: sbbs->userlist(mode); ! 1783: ! 1784: return(JS_TRUE); ! 1785: } ! 1786: ! 1787: static JSBool ! 1788: js_useredit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1789: { ! 1790: int32 usernumber=0; ! 1791: sbbs_t* sbbs; ! 1792: ! 1793: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1794: return(JS_FALSE); ! 1795: ! 1796: if(argc>0 && JSVAL_IS_NUM(argv[0])) ! 1797: JS_ValueToInt32(cx,argv[0],&usernumber); ! 1798: ! 1799: sbbs->useredit(usernumber); ! 1800: ! 1801: return(JS_TRUE); ! 1802: } ! 1803: ! 1804: static JSBool ! 1805: js_change_user(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1806: { ! 1807: sbbs_t* sbbs; ! 1808: ! 1809: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1810: return(JS_FALSE); ! 1811: ! 1812: sbbs->change_user(); ! 1813: ! 1814: return(JS_TRUE); ! 1815: } ! 1816: ! 1817: static JSBool ! 1818: js_logonlist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1819: { ! 1820: sbbs_t* sbbs; ! 1821: ! 1822: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1823: return(JS_FALSE); ! 1824: ! 1825: sbbs->logonlist(); ! 1826: ! 1827: return(JS_TRUE); ! 1828: } ! 1829: ! 1830: static JSBool ! 1831: js_nodelist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1832: { ! 1833: sbbs_t* sbbs; ! 1834: ! 1835: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1836: return(JS_FALSE); ! 1837: ! 1838: sbbs->nodelist(); ! 1839: ! 1840: return(JS_TRUE); ! 1841: } ! 1842: ! 1843: static JSBool ! 1844: js_whos_online(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1845: { ! 1846: sbbs_t* sbbs; ! 1847: ! 1848: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1849: return(JS_FALSE); ! 1850: ! 1851: sbbs->whos_online(true); ! 1852: ! 1853: return(JS_TRUE); ! 1854: } ! 1855: ! 1856: static JSBool ! 1857: js_spy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1858: { ! 1859: int32 node_num=0; ! 1860: sbbs_t* sbbs; ! 1861: ! 1862: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1863: return(JS_FALSE); ! 1864: ! 1865: if(argc && JSVAL_IS_NUM(argv[0])) ! 1866: JS_ValueToInt32(cx,argv[0],&node_num); ! 1867: sbbs->spy(node_num); ! 1868: ! 1869: return(JS_TRUE); ! 1870: } ! 1871: ! 1872: static JSBool ! 1873: js_readmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1874: { ! 1875: int32 readwhich=MAIL_YOUR; ! 1876: int32 usernumber; ! 1877: sbbs_t* sbbs; ! 1878: ! 1879: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1880: return(JS_FALSE); ! 1881: ! 1882: usernumber=sbbs->useron.number; ! 1883: if(argc>0 && JSVAL_IS_NUM(argv[0])) ! 1884: JS_ValueToInt32(cx,argv[0],&readwhich); ! 1885: if(argc>1 && JSVAL_IS_NUM(argv[1])) ! 1886: JS_ValueToInt32(cx,argv[1],&usernumber); ! 1887: ! 1888: sbbs->readmail(usernumber,readwhich); ! 1889: ! 1890: return(JS_TRUE); ! 1891: } ! 1892: ! 1893: static JSBool ! 1894: js_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1895: { ! 1896: int32 usernumber=1; ! 1897: long mode=WM_EMAIL; ! 1898: char* top=""; ! 1899: char* subj=""; ! 1900: JSString* js_top=NULL; ! 1901: JSString* js_subj=NULL; ! 1902: sbbs_t* sbbs; ! 1903: ! 1904: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1905: return(JS_FALSE); ! 1906: ! 1907: if(JSVAL_IS_NUM(argv[0])) ! 1908: JS_ValueToInt32(cx,argv[0],&usernumber); ! 1909: for(uintN i=1;i<argc;i++) { ! 1910: if(JSVAL_IS_NUM(argv[i])) ! 1911: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 1912: else if(JSVAL_IS_STRING(argv[i]) && js_top==NULL) ! 1913: js_top=JS_ValueToString(cx,argv[i]); ! 1914: else if(JSVAL_IS_STRING(argv[i])) ! 1915: js_subj=JS_ValueToString(cx,argv[i]); ! 1916: } ! 1917: ! 1918: if(js_top!=NULL) ! 1919: top=JS_GetStringBytes(js_top); ! 1920: if(js_subj!=NULL) ! 1921: subj=JS_GetStringBytes(js_subj); ! 1922: ! 1923: *rval = BOOLEAN_TO_JSVAL(sbbs->email(usernumber,top,subj,mode)); ! 1924: return(JS_TRUE); ! 1925: } ! 1926: static JSBool ! 1927: js_netmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1928: { ! 1929: long mode=0; ! 1930: char* subj=""; ! 1931: JSString* js_to; ! 1932: JSString* js_subj=NULL; ! 1933: sbbs_t* sbbs; ! 1934: ! 1935: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1936: return(JS_FALSE); ! 1937: ! 1938: if((js_to=JS_ValueToString(cx, argv[0]))==NULL) ! 1939: return(JS_FALSE); ! 1940: ! 1941: for(uintN i=1;i<argc;i++) { ! 1942: if(JSVAL_IS_NUM(argv[i])) ! 1943: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 1944: else if(JSVAL_IS_STRING(argv[i])) ! 1945: js_subj=JS_ValueToString(cx,argv[i]); ! 1946: } ! 1947: ! 1948: if(js_subj!=NULL) ! 1949: subj=JS_GetStringBytes(js_subj); ! 1950: ! 1951: *rval = BOOLEAN_TO_JSVAL(sbbs->netmail(JS_GetStringBytes(js_to),subj,mode)); ! 1952: return(JS_TRUE); ! 1953: } ! 1954: ! 1955: static JSBool ! 1956: js_bulkmail(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1957: { ! 1958: uchar* ar=(uchar*)""; ! 1959: JSString* js_ars=NULL; ! 1960: sbbs_t* sbbs; ! 1961: ! 1962: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1963: return(JS_FALSE); ! 1964: ! 1965: if(argc) { ! 1966: if((js_ars=JS_ValueToString(cx, argv[0]))==NULL) ! 1967: return(JS_FALSE); ! 1968: ! 1969: ar=arstr(NULL,JS_GetStringBytes(js_ars), &sbbs->cfg); ! 1970: } ! 1971: sbbs->bulkmail(ar); ! 1972: if(ar && ar[0]) ! 1973: free(ar); ! 1974: ! 1975: return(JS_TRUE); ! 1976: } ! 1977: ! 1978: static JSBool ! 1979: js_upload_file(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 1980: { ! 1981: uint dirnum=0; ! 1982: sbbs_t* sbbs; ! 1983: ! 1984: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 1985: return(JS_FALSE); ! 1986: ! 1987: dirnum=get_dirnum(cx,sbbs,argv[0]); ! 1988: ! 1989: if(dirnum>=sbbs->cfg.total_dirs) { ! 1990: *rval = JSVAL_FALSE; ! 1991: return(JS_TRUE); ! 1992: } ! 1993: ! 1994: *rval = BOOLEAN_TO_JSVAL(sbbs->upload(dirnum)); ! 1995: return(JS_TRUE); ! 1996: } ! 1997: ! 1998: ! 1999: static JSBool ! 2000: js_bulkupload(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2001: { ! 2002: uint dirnum=0; ! 2003: sbbs_t* sbbs; ! 2004: ! 2005: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2006: return(JS_FALSE); ! 2007: ! 2008: dirnum=get_dirnum(cx,sbbs,argv[0]); ! 2009: ! 2010: if(dirnum>=sbbs->cfg.total_dirs) { ! 2011: *rval = JSVAL_FALSE; ! 2012: return(JS_TRUE); ! 2013: } ! 2014: ! 2015: *rval = BOOLEAN_TO_JSVAL(sbbs->bulkupload(dirnum)==0); ! 2016: return(JS_TRUE); ! 2017: } ! 2018: ! 2019: static JSBool ! 2020: js_resort_dir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2021: { ! 2022: uint dirnum=0; ! 2023: sbbs_t* sbbs; ! 2024: ! 2025: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2026: return(JS_FALSE); ! 2027: ! 2028: dirnum=get_dirnum(cx,sbbs,argv[0]); ! 2029: ! 2030: if(dirnum>=sbbs->cfg.total_dirs) { ! 2031: *rval = JSVAL_FALSE; ! 2032: return(JS_TRUE); ! 2033: } ! 2034: ! 2035: sbbs->resort(dirnum); ! 2036: ! 2037: *rval = JSVAL_TRUE; ! 2038: return(JS_TRUE); ! 2039: } ! 2040: ! 2041: static JSBool ! 2042: js_telnet_gate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2043: { ! 2044: char* addr; ! 2045: int32 mode=0; ! 2046: JSString* js_addr; ! 2047: sbbs_t* sbbs; ! 2048: ! 2049: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2050: return(JS_FALSE); ! 2051: ! 2052: if((js_addr=JS_ValueToString(cx, argv[0]))==NULL) ! 2053: return(JS_FALSE); ! 2054: ! 2055: if((addr=JS_GetStringBytes(js_addr))==NULL) ! 2056: return(JS_FALSE); ! 2057: ! 2058: if(argc>1 && JSVAL_IS_NUM(argv[1])) ! 2059: JS_ValueToInt32(cx,argv[1],&mode); ! 2060: ! 2061: sbbs->telnet_gate(addr,mode); ! 2062: ! 2063: return(JS_TRUE); ! 2064: } ! 2065: ! 2066: static JSBool ! 2067: js_pagesysop(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2068: { ! 2069: sbbs_t* sbbs; ! 2070: ! 2071: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2072: return(JS_FALSE); ! 2073: ! 2074: *rval = BOOLEAN_TO_JSVAL(sbbs->sysop_page()); ! 2075: return(JS_TRUE); ! 2076: } ! 2077: ! 2078: static JSBool ! 2079: js_pageguru(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2080: { ! 2081: sbbs_t* sbbs; ! 2082: ! 2083: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2084: return(JS_FALSE); ! 2085: ! 2086: *rval = BOOLEAN_TO_JSVAL(sbbs->guru_page()); ! 2087: return(JS_TRUE); ! 2088: } ! 2089: ! 2090: static JSBool ! 2091: js_multinode_chat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2092: { ! 2093: sbbs_t* sbbs; ! 2094: int32 channel=1; ! 2095: ! 2096: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2097: return(JS_FALSE); ! 2098: ! 2099: if(argc>1 && JSVAL_IS_NUM(argv[1])) ! 2100: JS_ValueToInt32(cx,argv[1],&channel); ! 2101: ! 2102: sbbs->multinodechat(channel); ! 2103: ! 2104: return(JS_TRUE); ! 2105: } ! 2106: ! 2107: static JSBool ! 2108: js_private_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2109: { ! 2110: sbbs_t* sbbs; ! 2111: ! 2112: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2113: return(JS_FALSE); ! 2114: ! 2115: sbbs->nodemsg(); ! 2116: ! 2117: return(JS_TRUE); ! 2118: } ! 2119: ! 2120: static JSBool ! 2121: js_private_chat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2122: { ! 2123: sbbs_t* sbbs; ! 2124: JSBool local=false; ! 2125: ! 2126: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2127: return(JS_FALSE); ! 2128: ! 2129: if(argc) ! 2130: JS_ValueToBoolean(cx,argv[0],&local); ! 2131: ! 2132: sbbs->privchat(local ? true:false); // <- eliminates stupid msvc6 "performance warning" ! 2133: ! 2134: return(JS_TRUE); ! 2135: } ! 2136: ! 2137: static JSBool ! 2138: js_get_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2139: { ! 2140: sbbs_t* sbbs; ! 2141: ! 2142: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2143: return(JS_FALSE); ! 2144: ! 2145: sbbs->getnmsg(); ! 2146: ! 2147: return(JS_TRUE); ! 2148: } ! 2149: ! 2150: static JSBool ! 2151: js_put_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2152: { ! 2153: sbbs_t* sbbs; ! 2154: int32 node=0; ! 2155: JSString* js_msg; ! 2156: char* msg; ! 2157: ! 2158: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2159: return(JS_FALSE); ! 2160: ! 2161: if(JSVAL_IS_NUM(argv[0])) ! 2162: JS_ValueToInt32(cx,argv[0],&node); ! 2163: if(node<1) ! 2164: node=1; ! 2165: ! 2166: if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) ! 2167: return(JS_FALSE); ! 2168: ! 2169: if((msg=JS_GetStringBytes(js_msg))==NULL) ! 2170: return(JS_FALSE); ! 2171: ! 2172: *rval = BOOLEAN_TO_JSVAL(putnmsg(&sbbs->cfg,node,msg)==0); ! 2173: ! 2174: return(JS_TRUE); ! 2175: } ! 2176: ! 2177: static JSBool ! 2178: js_get_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2179: { ! 2180: sbbs_t* sbbs; ! 2181: int32 usernumber; ! 2182: ! 2183: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2184: return(JS_FALSE); ! 2185: ! 2186: usernumber=sbbs->useron.number; ! 2187: if(argc && JSVAL_IS_NUM(argv[0])) ! 2188: JS_ValueToInt32(cx,argv[0],&usernumber); ! 2189: ! 2190: sbbs->getsmsg(usernumber); ! 2191: ! 2192: return(JS_TRUE); ! 2193: } ! 2194: ! 2195: static JSBool ! 2196: js_put_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2197: { ! 2198: sbbs_t* sbbs; ! 2199: int32 usernumber=0; ! 2200: JSString* js_msg; ! 2201: char* msg; ! 2202: ! 2203: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2204: return(JS_FALSE); ! 2205: ! 2206: if(JSVAL_IS_NUM(argv[0])) ! 2207: JS_ValueToInt32(cx,argv[0],&usernumber); ! 2208: if(usernumber<1) ! 2209: usernumber=1; ! 2210: ! 2211: if((js_msg=JS_ValueToString(cx, argv[1]))==NULL) ! 2212: return(JS_FALSE); ! 2213: ! 2214: if((msg=JS_GetStringBytes(js_msg))==NULL) ! 2215: return(JS_FALSE); ! 2216: ! 2217: *rval = BOOLEAN_TO_JSVAL(putsmsg(&sbbs->cfg,usernumber,msg)==0); ! 2218: ! 2219: return(JS_TRUE); ! 2220: } ! 2221: ! 2222: static JSBool ! 2223: js_cmdstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2224: { ! 2225: char* p; ! 2226: char* fpath=""; ! 2227: char* fspec=""; ! 2228: JSString* js_str; ! 2229: sbbs_t* sbbs; ! 2230: ! 2231: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2232: return(JS_FALSE); ! 2233: ! 2234: js_str = JS_ValueToString(cx, argv[0]); ! 2235: if (!js_str) ! 2236: return(JS_FALSE); ! 2237: ! 2238: p=JS_GetStringBytes(js_str); ! 2239: ! 2240: for(uintN i=1;i<argc;i++) { ! 2241: if(JSVAL_IS_STRING(argv[i])) { ! 2242: js_str = JS_ValueToString(cx, argv[i]); ! 2243: if(fpath==NULL) ! 2244: fpath=JS_GetStringBytes(js_str); ! 2245: else ! 2246: fspec=JS_GetStringBytes(js_str); ! 2247: } ! 2248: } ! 2249: ! 2250: p=sbbs->cmdstr(p,fpath,fspec,NULL); ! 2251: ! 2252: if((js_str=JS_NewStringCopyZ(cx, p))==NULL) ! 2253: return(JS_FALSE); ! 2254: *rval = STRING_TO_JSVAL(js_str); ! 2255: return(JS_TRUE); ! 2256: } ! 2257: ! 2258: static JSBool ! 2259: js_getfilespec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2260: { ! 2261: char* p; ! 2262: char tmp[128]; ! 2263: sbbs_t* sbbs; ! 2264: ! 2265: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2266: return(JS_FALSE); ! 2267: ! 2268: p=sbbs->getfilespec(tmp); ! 2269: ! 2270: if(p==NULL) ! 2271: *rval=JSVAL_NULL; ! 2272: else { ! 2273: JSString* js_str = JS_NewStringCopyZ(cx, p); ! 2274: if(js_str==NULL) ! 2275: return(JS_FALSE); ! 2276: *rval = STRING_TO_JSVAL(js_str); ! 2277: } ! 2278: return(JS_TRUE); ! 2279: } ! 2280: ! 2281: static JSBool ! 2282: js_listfiles(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2283: { ! 2284: long mode=0; ! 2285: char* fspec=ALLFILES; ! 2286: char buf[MAX_PATH+1]; ! 2287: uint dirnum; ! 2288: JSString* js_str; ! 2289: sbbs_t* sbbs; ! 2290: ! 2291: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2292: return(JS_FALSE); ! 2293: ! 2294: dirnum=get_dirnum(cx,sbbs,argv[0]); ! 2295: ! 2296: if(dirnum>=sbbs->cfg.total_dirs) { ! 2297: *rval = INT_TO_JSVAL(0); ! 2298: return(JS_TRUE); ! 2299: } ! 2300: ! 2301: for(uintN i=1;i<argc;i++) { ! 2302: if(JSVAL_IS_NUM(argv[i])) ! 2303: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 2304: else if(JSVAL_IS_STRING(argv[i])) { ! 2305: js_str = JS_ValueToString(cx, argv[i]); ! 2306: fspec=JS_GetStringBytes(js_str); ! 2307: } ! 2308: } ! 2309: ! 2310: if(!(mode&(FL_FINDDESC|FL_EXFIND))) ! 2311: fspec=padfname(fspec,buf); ! 2312: ! 2313: *rval = INT_TO_JSVAL(sbbs->listfiles(dirnum,fspec,0 /* tofile */,mode)); ! 2314: return(JS_TRUE); ! 2315: } ! 2316: ! 2317: ! 2318: static JSBool ! 2319: js_listfileinfo(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2320: { ! 2321: long mode=FI_INFO; ! 2322: char* fspec=ALLFILES; ! 2323: char buf[MAX_PATH+1]; ! 2324: uint dirnum; ! 2325: JSString* js_str; ! 2326: sbbs_t* sbbs; ! 2327: ! 2328: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2329: return(JS_FALSE); ! 2330: ! 2331: dirnum=get_dirnum(cx,sbbs,argv[0]); ! 2332: ! 2333: if(dirnum>=sbbs->cfg.total_dirs) { ! 2334: *rval = INT_TO_JSVAL(0); ! 2335: return(JS_TRUE); ! 2336: } ! 2337: ! 2338: for(uintN i=1;i<argc;i++) { ! 2339: if(JSVAL_IS_NUM(argv[i])) ! 2340: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 2341: else if(JSVAL_IS_STRING(argv[i])) { ! 2342: js_str = JS_ValueToString(cx, argv[i]); ! 2343: fspec=JS_GetStringBytes(js_str); ! 2344: } ! 2345: } ! 2346: ! 2347: *rval = INT_TO_JSVAL(sbbs->listfileinfo(dirnum,padfname(fspec,buf),mode)); ! 2348: return(JS_TRUE); ! 2349: } ! 2350: ! 2351: static JSBool ! 2352: js_postmsg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2353: { ! 2354: long mode=0; ! 2355: uint subnum; ! 2356: uintN n; ! 2357: JSObject* hdrobj; ! 2358: sbbs_t* sbbs; ! 2359: smbmsg_t* remsg=NULL; ! 2360: smbmsg_t msg; ! 2361: ! 2362: *rval = JSVAL_FALSE; ! 2363: ! 2364: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2365: return(JS_FALSE); ! 2366: ! 2367: subnum=get_subnum(cx,sbbs,argv[0]); ! 2368: ! 2369: if(subnum>=sbbs->cfg.total_subs) // invalid sub-board ! 2370: return(JS_TRUE); ! 2371: ! 2372: ZERO_VAR(msg); ! 2373: ! 2374: for(n=1; n<argc; n++) { ! 2375: if(JSVAL_IS_NUM(argv[n])) ! 2376: JS_ValueToInt32(cx,argv[n],(int32*)&mode); ! 2377: else if(JSVAL_IS_OBJECT(argv[n])) { ! 2378: if((hdrobj=JSVAL_TO_OBJECT(argv[n]))==NULL) ! 2379: return(JS_TRUE); ! 2380: remsg=&msg; ! 2381: if(!js_ParseMsgHeaderObject(cx,hdrobj,remsg)) ! 2382: return(JS_TRUE); ! 2383: } ! 2384: } ! 2385: ! 2386: *rval = BOOLEAN_TO_JSVAL(sbbs->postmsg(subnum,remsg,mode)); ! 2387: smb_freemsgmem(&msg); ! 2388: ! 2389: return(JS_TRUE); ! 2390: } ! 2391: ! 2392: static JSBool ! 2393: js_msgscan_cfg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2394: { ! 2395: long mode=SUB_CFG_NSCAN; ! 2396: sbbs_t* sbbs; ! 2397: ! 2398: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2399: return(JS_FALSE); ! 2400: ! 2401: if(argc && JSVAL_IS_NUM(argv[0])) ! 2402: JS_ValueToInt32(cx,argv[0],(int32*)&mode); ! 2403: ! 2404: sbbs->new_scan_cfg(mode); ! 2405: ! 2406: return(JS_TRUE); ! 2407: } ! 2408: ! 2409: ! 2410: static JSBool ! 2411: js_msgscan_ptrs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2412: { ! 2413: sbbs_t* sbbs; ! 2414: ! 2415: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2416: return(JS_FALSE); ! 2417: ! 2418: sbbs->new_scan_ptr_cfg(); ! 2419: ! 2420: return(JS_TRUE); ! 2421: } ! 2422: ! 2423: static JSBool ! 2424: js_msgscan_reinit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2425: { ! 2426: sbbs_t* sbbs; ! 2427: ! 2428: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2429: return(JS_FALSE); ! 2430: ! 2431: for(uint i=0;i<sbbs->cfg.total_subs;i++) { ! 2432: sbbs->subscan[i].ptr=sbbs->subscan[i].sav_ptr; ! 2433: sbbs->subscan[i].last=sbbs->subscan[i].sav_last; ! 2434: } ! 2435: sbbs->bputs(sbbs->text[MsgPtrsInitialized]); ! 2436: ! 2437: return(JS_TRUE); ! 2438: } ! 2439: ! 2440: static JSBool ! 2441: js_scansubs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2442: { ! 2443: long mode=SCAN_NEW; ! 2444: BOOL all=FALSE; ! 2445: sbbs_t* sbbs; ! 2446: ! 2447: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2448: return(JS_FALSE); ! 2449: ! 2450: for(uintN i=0;i<argc;i++) { ! 2451: if(JSVAL_IS_NUM(argv[i])) ! 2452: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 2453: else if(JSVAL_IS_BOOLEAN(argv[i])) ! 2454: all=JSVAL_TO_BOOLEAN(argv[i]); ! 2455: } ! 2456: ! 2457: if(all) ! 2458: sbbs->scanallsubs(mode); ! 2459: else ! 2460: sbbs->scansubs(mode); ! 2461: ! 2462: return(JS_TRUE); ! 2463: } ! 2464: ! 2465: static JSBool ! 2466: js_scandirs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2467: { ! 2468: long mode=0; ! 2469: BOOL all=FALSE; ! 2470: sbbs_t* sbbs; ! 2471: ! 2472: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2473: return(JS_FALSE); ! 2474: ! 2475: for(uintN i=0;i<argc;i++) { ! 2476: if(JSVAL_IS_NUM(argv[i])) ! 2477: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 2478: else if(JSVAL_IS_BOOLEAN(argv[i])) ! 2479: all=JSVAL_TO_BOOLEAN(argv[i]); ! 2480: } ! 2481: ! 2482: if(all) ! 2483: sbbs->scanalldirs(mode); ! 2484: else ! 2485: sbbs->scandirs(mode); ! 2486: ! 2487: return(JS_TRUE); ! 2488: } ! 2489: ! 2490: static JSBool ! 2491: js_scanposts(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2492: { ! 2493: char* find=""; ! 2494: long mode=0; ! 2495: uint subnum; ! 2496: sbbs_t* sbbs; ! 2497: ! 2498: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2499: return(JS_FALSE); ! 2500: ! 2501: subnum=get_subnum(cx,sbbs,argv[0]); ! 2502: ! 2503: if(subnum>=sbbs->cfg.total_subs) { // invalid sub-board ! 2504: *rval = JSVAL_FALSE; ! 2505: return(JS_TRUE); ! 2506: } ! 2507: ! 2508: for(uintN i=1;i<argc;i++) { ! 2509: if(JSVAL_IS_NUM(argv[i])) ! 2510: JS_ValueToInt32(cx,argv[i],(int32*)&mode); ! 2511: else if(JSVAL_IS_STRING(argv[i])) ! 2512: find=JS_GetStringBytes(JS_ValueToString(cx,argv[i])); ! 2513: } ! 2514: ! 2515: if(*find) ! 2516: mode|=SCAN_FIND; ! 2517: ! 2518: *rval = BOOLEAN_TO_JSVAL(sbbs->scanposts(subnum,mode,find)==0); ! 2519: return(JS_TRUE); ! 2520: } ! 2521: ! 2522: static JSBool ! 2523: js_listmsgs(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2524: { ! 2525: char* find=""; ! 2526: long mode=0; ! 2527: long start=0; ! 2528: uint subnum; ! 2529: sbbs_t* sbbs; ! 2530: uintN argn=0; ! 2531: ! 2532: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2533: return(JS_FALSE); ! 2534: ! 2535: *rval = INT_TO_JSVAL(0); ! 2536: ! 2537: subnum=get_subnum(cx,sbbs,argv[argn++]); ! 2538: ! 2539: if(subnum>=sbbs->cfg.total_subs) // invalid sub-board ! 2540: return(JS_TRUE); ! 2541: ! 2542: if(JSVAL_IS_NUM(argv[argn])) ! 2543: JS_ValueToInt32(cx,argv[argn++],(int32*)&mode); ! 2544: if(JSVAL_IS_NUM(argv[argn])) ! 2545: JS_ValueToInt32(cx,argv[argn++],(int32*)&start); ! 2546: if(JSVAL_IS_STRING(argv[argn])) ! 2547: find=JS_GetStringBytes(JS_ValueToString(cx,argv[argn++])); ! 2548: ! 2549: *rval = INT_TO_JSVAL(sbbs->listsub(subnum,mode,start,find)); ! 2550: return(JS_TRUE); ! 2551: } ! 2552: ! 2553: static JSBool ! 2554: js_getnstime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2555: { ! 2556: time_t t=time(NULL); ! 2557: sbbs_t* sbbs; ! 2558: ! 2559: *rval = JSVAL_NULL; ! 2560: ! 2561: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2562: return(JS_FALSE); ! 2563: ! 2564: if(argc && JSVAL_IS_NUM(argv[0])) ! 2565: JS_ValueToInt32(cx,argv[0],(int32*)&t); ! 2566: ! 2567: if(sbbs->inputnstime(&t)==true) ! 2568: JS_NewNumberValue(cx,t,rval); ! 2569: ! 2570: return(JS_TRUE); ! 2571: } ! 2572: ! 2573: static JSBool ! 2574: js_select_shell(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2575: { ! 2576: sbbs_t* sbbs; ! 2577: ! 2578: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2579: return(JS_FALSE); ! 2580: ! 2581: *rval = BOOLEAN_TO_JSVAL(sbbs->select_shell()); ! 2582: return(JS_TRUE); ! 2583: } ! 2584: ! 2585: static JSBool ! 2586: js_select_editor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ! 2587: { ! 2588: sbbs_t* sbbs; ! 2589: ! 2590: if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL) ! 2591: return(JS_FALSE); ! 2592: ! 2593: *rval = BOOLEAN_TO_JSVAL(sbbs->select_editor()); ! 2594: return(JS_TRUE); ! 2595: } ! 2596: ! 2597: static jsSyncMethodSpec js_bbs_functions[] = { ! 2598: {"atcode", js_atcode, 1, JSTYPE_STRING, JSDOCSTR("code_string") ! 2599: ,JSDOCSTR("returns @-code value, specified <i>code</i> string does not include @ character delimiters") ! 2600: ,310 ! 2601: }, ! 2602: /* text.dat */ ! 2603: {"text", js_text, 1, JSTYPE_STRING, JSDOCSTR("line_number") ! 2604: ,JSDOCSTR("returns specified text string from text.dat") ! 2605: ,310 ! 2606: }, ! 2607: {"replace_text", js_replace_text, 2, JSTYPE_BOOLEAN, JSDOCSTR("line_number, string text") ! 2608: ,JSDOCSTR("replaces specified text string in memory") ! 2609: ,310 ! 2610: }, ! 2611: {"revert_text", js_revert_text, 1, JSTYPE_BOOLEAN, JSDOCSTR("[line_number=<i>all</i>]") ! 2612: ,JSDOCSTR("reverts specified text string to original text string; " ! 2613: "if <i>line_number</i> unspecified, reverts all text lines") ! 2614: ,310 ! 2615: }, ! 2616: {"load_text", js_load_text, 1, JSTYPE_BOOLEAN, JSDOCSTR("base_filename") ! 2617: ,JSDOCSTR("load an alternate text.dat from ctrl directory, automatically appends '.dat' to basefilename") ! 2618: ,310 ! 2619: }, ! 2620: /* procedures */ ! 2621: {"newuser", js_newuser, 0, JSTYPE_VOID, JSDOCSTR("") ! 2622: ,JSDOCSTR("interactive new user procedure") ! 2623: ,310 ! 2624: }, ! 2625: {"login", js_login, 2, JSTYPE_BOOLEAN, JSDOCSTR("user_name, password_prompt") ! 2626: ,JSDOCSTR("login with <i>user_name</i>, displaying <i>password_prompt</i> for password (if required)") ! 2627: ,310 ! 2628: }, ! 2629: {"logon", js_logon, 0, JSTYPE_BOOLEAN, JSDOCSTR("") ! 2630: ,JSDOCSTR("interactive logon procedure") ! 2631: ,310 ! 2632: }, ! 2633: {"logoff", js_logoff, 0, JSTYPE_VOID, JSDOCSTR("") ! 2634: ,JSDOCSTR("interactive logoff procedure") ! 2635: ,310 ! 2636: }, ! 2637: {"logout", js_logout, 0, JSTYPE_VOID, JSDOCSTR("") ! 2638: ,JSDOCSTR("non-interactive logout procedure") ! 2639: ,310 ! 2640: }, ! 2641: {"hangup", js_hangup, 0, JSTYPE_VOID, JSDOCSTR("") ! 2642: ,JSDOCSTR("hangup (disconnect) immediately") ! 2643: ,310 ! 2644: }, ! 2645: {"node_sync", js_nodesync, 0, JSTYPE_ALIAS }, ! 2646: {"nodesync", js_nodesync, 0, JSTYPE_VOID, JSDOCSTR("") ! 2647: ,JSDOCSTR("synchronize with node database, checks for messages, interruption, etc. (AKA node_sync)") ! 2648: ,310 ! 2649: }, ! 2650: {"auto_msg", js_automsg, 0, JSTYPE_VOID, JSDOCSTR("") ! 2651: ,JSDOCSTR("read/create system's auto-message") ! 2652: ,310 ! 2653: }, ! 2654: {"time_bank", js_time_bank, 0, JSTYPE_VOID, JSDOCSTR("") ! 2655: ,JSDOCSTR("enter the time banking system") ! 2656: ,310 ! 2657: }, ! 2658: {"qwk_sec", js_qwk_sec, 0, JSTYPE_VOID, JSDOCSTR("") ! 2659: ,JSDOCSTR("enter the QWK message packet upload/download/config section") ! 2660: ,310 ! 2661: }, ! 2662: {"text_sec", js_text_sec, 0, JSTYPE_VOID, JSDOCSTR("") ! 2663: ,JSDOCSTR("enter the text files section") ! 2664: ,310 ! 2665: }, ! 2666: {"xtrn_sec", js_xtrn_sec, 0, JSTYPE_VOID, JSDOCSTR("") ! 2667: ,JSDOCSTR("enter the external programs section") ! 2668: ,310 ! 2669: }, ! 2670: {"xfer_policy", js_xfer_policy, 0, JSTYPE_VOID, JSDOCSTR("") ! 2671: ,JSDOCSTR("display the file transfer policy") ! 2672: ,310 ! 2673: }, ! 2674: {"batch_menu", js_batchmenu, 0, JSTYPE_VOID, JSDOCSTR("") ! 2675: ,JSDOCSTR("enter the batch file transfer menu") ! 2676: ,310 ! 2677: }, ! 2678: {"batch_download", js_batchdownload, 0, JSTYPE_BOOLEAN, JSDOCSTR("") ! 2679: ,JSDOCSTR("start a batch download") ! 2680: ,310 ! 2681: }, ! 2682: {"batch_add_list", js_batchaddlist, 1, JSTYPE_VOID, JSDOCSTR("list_filename") ! 2683: ,JSDOCSTR("add file list to batch download queue") ! 2684: ,310 ! 2685: }, ! 2686: {"send_file", js_sendfile, 1, JSTYPE_BOOLEAN, JSDOCSTR("filename [,protocol]") ! 2687: ,JSDOCSTR("send specified filename (complete path) to user via user-prompted " ! 2688: "(or optionally specified) protocol") ! 2689: ,314 ! 2690: }, ! 2691: {"receive_file", js_recvfile, 1, JSTYPE_BOOLEAN, JSDOCSTR("filename [,protocol]") ! 2692: ,JSDOCSTR("received specified filename (complete path) frome user via user-prompted " ! 2693: "(or optionally specified) protocol") ! 2694: ,314 ! 2695: }, ! 2696: {"temp_xfer", js_temp_xfer, 0, JSTYPE_VOID, JSDOCSTR("") ! 2697: ,JSDOCSTR("enter the temporary file tranfer menu") ! 2698: ,310 ! 2699: }, ! 2700: {"user_sync", js_user_sync, 0, JSTYPE_VOID, JSDOCSTR("") ! 2701: ,JSDOCSTR("read the current user data from the database") ! 2702: ,310 ! 2703: }, ! 2704: {"user_config", js_user_config, 0, JSTYPE_VOID, JSDOCSTR("") ! 2705: ,JSDOCSTR("enter the user settings configuration menu") ! 2706: ,310 ! 2707: }, ! 2708: {"sys_info", js_sys_info, 0, JSTYPE_VOID, JSDOCSTR("") ! 2709: ,JSDOCSTR("display system information") ! 2710: ,310 ! 2711: }, ! 2712: {"sub_info", js_sub_info, 1, JSTYPE_VOID, JSDOCSTR("[sub-board=<i>current</i>]") ! 2713: ,JSDOCSTR("display message sub-board information (current <i>sub-board</i>, if unspecified)") ! 2714: ,310 ! 2715: }, ! 2716: {"dir_info", js_dir_info, 0, JSTYPE_VOID, JSDOCSTR("[directory=<i>current</i>]") ! 2717: ,JSDOCSTR("display file directory information (current <i>directory</i>, if unspecified)") ! 2718: ,310 ! 2719: }, ! 2720: {"user_info", js_user_info, 0, JSTYPE_VOID, JSDOCSTR("") ! 2721: ,JSDOCSTR("display current user information") ! 2722: ,310 ! 2723: }, ! 2724: {"ver", js_ver, 0, JSTYPE_VOID, JSDOCSTR("") ! 2725: ,JSDOCSTR("display software version information") ! 2726: ,310 ! 2727: }, ! 2728: {"sys_stats", js_sys_stats, 0, JSTYPE_VOID, JSDOCSTR("") ! 2729: ,JSDOCSTR("display system statistics") ! 2730: ,310 ! 2731: }, ! 2732: {"node_stats", js_node_stats, 0, JSTYPE_VOID, JSDOCSTR("[node_number=<i>current</i>]") ! 2733: ,JSDOCSTR("display current (or specified) node statistics") ! 2734: ,310 ! 2735: }, ! 2736: {"list_users", js_userlist, 0, JSTYPE_VOID, JSDOCSTR("[mode=<tt>UL_ALL</tt>]") ! 2737: ,JSDOCSTR("display user list" ! 2738: "(see <tt>UL_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> values)") ! 2739: ,310 ! 2740: }, ! 2741: {"edit_user", js_useredit, 0, JSTYPE_VOID, JSDOCSTR("[user_number=<i>current</i>]") ! 2742: ,JSDOCSTR("enter the user editor") ! 2743: ,310 ! 2744: }, ! 2745: {"change_user", js_change_user, 0, JSTYPE_VOID, JSDOCSTR("") ! 2746: ,JSDOCSTR("change to a different user") ! 2747: ,310 ! 2748: }, ! 2749: {"list_logons", js_logonlist, 0, JSTYPE_VOID, JSDOCSTR("") ! 2750: ,JSDOCSTR("display the logon list") ! 2751: ,310 ! 2752: }, ! 2753: {"read_mail", js_readmail, 0, JSTYPE_VOID, JSDOCSTR("[which=<tt>MAIL_YOUR</tt>] [,user_number=<i>current</i>]") ! 2754: ,JSDOCSTR("read private e-mail" ! 2755: "(see <tt>MAIL_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>which</i> values)") ! 2756: ,310 ! 2757: }, ! 2758: {"email", js_email, 1, JSTYPE_BOOLEAN, JSDOCSTR("to_user_number [,mode=<tt>WM_EMAIL</tt>] [,top=<i>none</i>] [,subject=<i>none</i>]") ! 2759: ,JSDOCSTR("send private e-mail to a local user") ! 2760: ,310 ! 2761: }, ! 2762: {"netmail", js_netmail, 1, JSTYPE_BOOLEAN, JSDOCSTR("address [,mode=<tt>WM_NONE</tt>] [,subject=<i>none</i>]") ! 2763: ,JSDOCSTR("send private netmail") ! 2764: ,310 ! 2765: }, ! 2766: {"bulk_mail", js_bulkmail, 0, JSTYPE_VOID, JSDOCSTR("[ars]") ! 2767: ,JSDOCSTR("send bulk private e-mail, if <i>ars</i> not specified, prompt for destination users") ! 2768: ,310 ! 2769: }, ! 2770: {"upload_file", js_upload_file, 1, JSTYPE_BOOLEAN, JSDOCSTR("[directory=<i>current</i>]") ! 2771: ,JSDOCSTR("upload file to file directory specified by number or internal code") ! 2772: ,310 ! 2773: }, ! 2774: {"bulk_upload", js_bulkupload, 1, JSTYPE_BOOLEAN, JSDOCSTR("[directory=<i>current</i>]") ! 2775: ,JSDOCSTR("add files (already in local storage path) to file directory " ! 2776: "specified by number or internal code") ! 2777: ,310 ! 2778: }, ! 2779: {"resort_dir", js_resort_dir, 1, JSTYPE_BOOLEAN, JSDOCSTR("[directory=<i>current</i>]") ! 2780: ,JSDOCSTR("re-sort the file directory specified by number or internal code)") ! 2781: ,310 ! 2782: }, ! 2783: {"list_files", js_listfiles, 1, JSTYPE_NUMBER, JSDOCSTR("[directory=<i>current</i>] [,filespec=<tt>\"*.*\"</tt> or search_string] [,mode=<tt>FL_NONE</tt>]") ! 2784: ,JSDOCSTR("list files in the specified file directory, " ! 2785: "optionally specifying a file specification (wildcards) or a description search string, " ! 2786: "and <i>mode</i> (bitfield)") ! 2787: ,310 ! 2788: }, ! 2789: {"list_file_info", js_listfileinfo, 1, JSTYPE_NUMBER, JSDOCSTR("[directory=<i>current</i>] [,filespec=<tt>\"*.*\"</tt>] [,mode=<tt>FI_INFO</tt>]") ! 2790: ,JSDOCSTR("list extended file information for files in the specified file directory") ! 2791: ,310 ! 2792: }, ! 2793: {"post_msg", js_postmsg, 1, JSTYPE_BOOLEAN, JSDOCSTR("[sub-board=<i>current</i>] [,mode=<tt>WM_MODE</tt>] [,object reply_header]") ! 2794: ,JSDOCSTR("post a message in the specified message sub-board (number or internal code) " ! 2795: "with optinal <i>mode</i> (bitfield)<br>" ! 2796: "If <i>reply_header</i> is specified (a header object returned from <i>MsgBase.get_msg_header()</i>), that header " ! 2797: "will be used for the in-reply-to header fields (this argument added in v3.13)") ! 2798: ,313 ! 2799: }, ! 2800: {"cfg_msg_scan", js_msgscan_cfg, 0, JSTYPE_VOID, JSDOCSTR("[type=<tt>SCAN_CFG_NEW</tt>]") ! 2801: ,JSDOCSTR("configure message scan " ! 2802: "(<i>type</i> is either <tt>SCAN_CFG_NEW</tt> or <tt>SCAN_CFG_TOYOU</tt>)") ! 2803: ,310 ! 2804: }, ! 2805: {"cfg_msg_ptrs", js_msgscan_ptrs, 0, JSTYPE_VOID, JSDOCSTR("") ! 2806: ,JSDOCSTR("change message scan pointer values") ! 2807: ,310 ! 2808: }, ! 2809: {"reinit_msg_ptrs", js_msgscan_reinit, 0, JSTYPE_VOID, JSDOCSTR("") ! 2810: ,JSDOCSTR("re-initialize new message scan pointers") ! 2811: ,310 ! 2812: }, ! 2813: {"scan_subs", js_scansubs, 0, JSTYPE_VOID, JSDOCSTR("[mode=<tt>SCAN_NEW</tt>] [,all=<tt>false</tt>]") ! 2814: ,JSDOCSTR("scan sub-boards for messages") ! 2815: ,310 ! 2816: }, ! 2817: {"scan_dirs", js_scandirs, 0, JSTYPE_VOID, JSDOCSTR("[mode=<tt>FL_NONE</tt>] [,all=<tt>false</tt>]") ! 2818: ,JSDOCSTR("scan directories for files") ! 2819: ,310 ! 2820: }, ! 2821: {"scan_posts", js_scanposts, 1, JSTYPE_ALIAS }, ! 2822: {"scan_msgs", js_scanposts, 1, JSTYPE_BOOLEAN, JSDOCSTR("[sub-board=<i>current</i>] [,mode=<tt>SCAN_READ</tt>] [,string find]") ! 2823: ,JSDOCSTR("scan messages in the specified message sub-board (number or internal code), " ! 2824: "optionally search for 'find' string (AKA scan_posts)") ! 2825: ,310 ! 2826: }, ! 2827: {"list_msgs", js_listmsgs, 1, JSTYPE_NUMBER, JSDOCSTR("[sub-board=<i>current</i>] [,mode=<tt>SCAN_READ</tt>] [,message_number=<tt>0</tt>] [,string find]") ! 2828: ,JSDOCSTR("list messages in the specified message sub-board (number or internal code), " ! 2829: "optionally search for 'find' string, returns number of messages listed") ! 2830: ,314 ! 2831: }, ! 2832: /* menuing */ ! 2833: {"menu", js_menu, 1, JSTYPE_VOID, JSDOCSTR("base_filename") ! 2834: ,JSDOCSTR("display a menu file from the text/menu directory") ! 2835: ,310 ! 2836: }, ! 2837: {"log_key", js_logkey, 1, JSTYPE_BOOLEAN, JSDOCSTR("key [,comma=<tt>false</tt>]") ! 2838: ,JSDOCSTR("log key to node.log (comma optional)") ! 2839: ,310 ! 2840: }, ! 2841: {"log_str", js_logstr, 1, JSTYPE_BOOLEAN, JSDOCSTR("text") ! 2842: ,JSDOCSTR("log string to node.log") ! 2843: ,310 ! 2844: }, ! 2845: /* users */ ! 2846: {"finduser", js_finduser, 1, JSTYPE_NUMBER, JSDOCSTR("username_or_number") ! 2847: ,JSDOCSTR("find user name (partial name support), interactive") ! 2848: ,310 ! 2849: }, ! 2850: {"trashcan", js_trashcan, 2, JSTYPE_BOOLEAN, JSDOCSTR("base_filename, search_string") ! 2851: ,JSDOCSTR("search file for psuedo-regexp (search string) in trashcan file (text/base_filename.can)") ! 2852: ,310 ! 2853: }, ! 2854: /* xtrn programs/modules */ ! 2855: {"exec", js_exec, 2, JSTYPE_NUMBER, JSDOCSTR("cmdline [,mode=<tt>EX_NONE</tt>] [,string startup_dir]") ! 2856: ,JSDOCSTR("execute a program, optionally changing current directory to <i>startup_dir</i> " ! 2857: "(see <tt>EX_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)") ! 2858: ,310 ! 2859: }, ! 2860: {"exec_xtrn", js_exec_xtrn, 1, JSTYPE_BOOLEAN, JSDOCSTR("xtrn_number_or_code") ! 2861: ,JSDOCSTR("execute external program by number or internal code") ! 2862: ,310 ! 2863: }, ! 2864: {"user_event", js_user_event, 1, JSTYPE_BOOLEAN, JSDOCSTR("event_type") ! 2865: ,JSDOCSTR("execute user event by event type " ! 2866: "(see <tt>EVENT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)") ! 2867: ,310 ! 2868: }, ! 2869: {"telnet_gate", js_telnet_gate, 1, JSTYPE_VOID, JSDOCSTR("address [,mode=<tt>TG_NONE</tt>]") ! 2870: ,JSDOCSTR("external telnet/rlogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> bits)") ! 2871: ,310 ! 2872: }, ! 2873: /* security */ ! 2874: {"check_syspass", js_chksyspass, 0, JSTYPE_BOOLEAN, JSDOCSTR("") ! 2875: ,JSDOCSTR("prompt for and verify system password") ! 2876: ,310 ! 2877: }, ! 2878: {"good_password", js_chkpass, 1, JSTYPE_STRING, JSDOCSTR("password") ! 2879: ,JSDOCSTR("check if requested user password meets minimum password requirements " ! 2880: "(length, uniqueness, etc.)") ! 2881: ,310 ! 2882: }, ! 2883: /* chat/node stuff */ ! 2884: {"page_sysop", js_pagesysop, 0, JSTYPE_BOOLEAN, JSDOCSTR("") ! 2885: ,JSDOCSTR("page the sysop for chat, returns <i>false</i> if the sysop could not be paged") ! 2886: ,310 ! 2887: }, ! 2888: {"page_guru", js_pageguru, 0, JSTYPE_BOOLEAN, JSDOCSTR("") ! 2889: ,JSDOCSTR("page the guru for chat") ! 2890: ,310 ! 2891: }, ! 2892: {"multinode_chat", js_multinode_chat, 0, JSTYPE_VOID, JSDOCSTR("") ! 2893: ,JSDOCSTR("enter multi-node chat") ! 2894: ,310 ! 2895: }, ! 2896: {"private_message", js_private_message, 0, JSTYPE_VOID, JSDOCSTR("") ! 2897: ,JSDOCSTR("use the private inter-node message prompt") ! 2898: ,310 ! 2899: }, ! 2900: {"private_chat", js_private_chat, 0, JSTYPE_VOID, JSDOCSTR("[local=<i>false</i>]") ! 2901: ,JSDOCSTR("enter private inter-node chat, or local sysop chat (if <i>local</i>=<i>true</i>)") ! 2902: ,310 ! 2903: }, ! 2904: {"get_node_message",js_get_node_message,0, JSTYPE_VOID, JSDOCSTR("") ! 2905: ,JSDOCSTR("receive and display an inter-node message") ! 2906: ,310 ! 2907: }, ! 2908: {"put_node_message",js_put_node_message,2, JSTYPE_BOOLEAN, JSDOCSTR("node_number, text") ! 2909: ,JSDOCSTR("send an inter-node message") ! 2910: ,310 ! 2911: }, ! 2912: {"get_telegram", js_get_telegram, 1, JSTYPE_VOID, JSDOCSTR("[user_number=<i>current</i>]") ! 2913: ,JSDOCSTR("receive and display waiting telegrams for specified (or current) user") ! 2914: ,310 ! 2915: }, ! 2916: {"put_telegram", js_put_telegram, 2, JSTYPE_BOOLEAN, JSDOCSTR("user_number, text") ! 2917: ,JSDOCSTR("send a telegram to a user") ! 2918: ,310 ! 2919: }, ! 2920: {"list_nodes", js_nodelist, 0, JSTYPE_VOID, JSDOCSTR("") ! 2921: ,JSDOCSTR("list all nodes") ! 2922: ,310 ! 2923: }, ! 2924: {"whos_online", js_whos_online, 0, JSTYPE_VOID, JSDOCSTR("") ! 2925: ,JSDOCSTR("list active nodes only (who's online)") ! 2926: ,310 ! 2927: }, ! 2928: {"spy", js_spy, 1, JSTYPE_VOID, JSDOCSTR("node_number") ! 2929: ,JSDOCSTR("spy on a node") ! 2930: ,310 ! 2931: }, ! 2932: /* misc */ ! 2933: {"cmdstr", js_cmdstr, 1, JSTYPE_STRING, JSDOCSTR("command_string [,string fpath=<tt>\"\"</tt>] [,string fspec=<tt>\"\"</tt>]") ! 2934: ,JSDOCSTR("return expanded command string using Synchronet command-line specifiers") ! 2935: ,310 ! 2936: }, ! 2937: /* input */ ! 2938: {"get_filespec", js_getfilespec, 0, JSTYPE_STRING, JSDOCSTR("") ! 2939: ,JSDOCSTR("returns a file specification input by the user (optionally with wildcards)") ! 2940: ,310 ! 2941: }, ! 2942: {"get_newscantime", js_getnstime, 1, JSTYPE_NUMBER, JSDOCSTR("time=<i>current</i>") ! 2943: ,JSDOCSTR("confirm or change a new-scan time, returns the new new-scan time value (<i>time_t</i> format)") ! 2944: ,310 ! 2945: }, ! 2946: {"select_shell", js_select_shell, 0, JSTYPE_BOOLEAN, JSDOCSTR("") ! 2947: ,JSDOCSTR("prompt user to select a new command shell") ! 2948: ,310 ! 2949: }, ! 2950: {"select_editor", js_select_editor, 0, JSTYPE_BOOLEAN, JSDOCSTR("") ! 2951: ,JSDOCSTR("prompt user to select a new external message editor") ! 2952: ,310 ! 2953: }, ! 2954: {0} ! 2955: }; ! 2956: ! 2957: ! 2958: static JSClass js_bbs_class = { ! 2959: "BBS" /* name */ ! 2960: ,0 /* flags */ ! 2961: ,JS_PropertyStub /* addProperty */ ! 2962: ,JS_PropertyStub /* delProperty */ ! 2963: ,js_bbs_get /* getProperty */ ! 2964: ,js_bbs_set /* setProperty */ ! 2965: ,JS_EnumerateStub /* enumerate */ ! 2966: ,JS_ResolveStub /* resolve */ ! 2967: ,JS_ConvertStub /* convert */ ! 2968: ,JS_FinalizeStub /* finalize */ ! 2969: }; ! 2970: ! 2971: JSObject* js_CreateBbsObject(JSContext* cx, JSObject* parent) ! 2972: { ! 2973: JSObject* obj; ! 2974: JSObject* mods; ! 2975: ! 2976: obj = JS_DefineObject(cx, parent, "bbs", &js_bbs_class, NULL ! 2977: ,JSPROP_ENUMERATE|JSPROP_READONLY); ! 2978: ! 2979: if(obj==NULL) ! 2980: return(NULL); ! 2981: ! 2982: if(!js_DefineSyncProperties(cx, obj, js_bbs_properties)) ! 2983: return(NULL); ! 2984: ! 2985: if (!js_DefineSyncMethods(cx, obj, js_bbs_functions, FALSE)) ! 2986: return(NULL); ! 2987: ! 2988: if((mods=JS_DefineObject(cx, obj, "mods", NULL, NULL ,JSPROP_ENUMERATE))==NULL) ! 2989: return(NULL); ! 2990: ! 2991: #ifdef BUILD_JSDOCS ! 2992: js_DescribeSyncObject(cx,mods,"Global repository for 3rd party modifications",312); ! 2993: js_DescribeSyncObject(cx,obj,"Controls the Telnet/RLogin BBS experience",310); ! 2994: js_CreateArrayOfStrings(cx, obj, "_property_desc_list", bbs_prop_desc, JSPROP_READONLY); ! 2995: #endif ! 2996: ! 2997: return(obj); ! 2998: } ! 2999: ! 3000: #endif /* JAVSCRIPT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.