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