|
|
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.