Newer
Older
/* Synchronet JavaScript "bbs" Object */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#include "sbbs.h"
#include "js_request.h"
#ifdef JAVASCRIPT
/*****************************/
/* BBS Object Properites */
/*****************************/
enum {
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
BBS_PROP_SYS_STATUS
, BBS_PROP_STARTUP_OPT
, BBS_PROP_ANSWER_TIME
, BBS_PROP_LOGON_TIME
, BBS_PROP_START_TIME
, BBS_PROP_NS_TIME
, BBS_PROP_LAST_NS_TIME
, BBS_PROP_ONLINE
, BBS_PROP_TIMELEFT
, BBS_PROP_EVENT_TIME
, BBS_PROP_EVENT_CODE
, BBS_PROP_FIRST_NODE
, BBS_PROP_LAST_NODE
, BBS_PROP_NODE_NUM
, BBS_PROP_NODE_SETTINGS
, BBS_PROP_NODE_STATUS
, BBS_PROP_NODE_ERRORS
, BBS_PROP_NODE_ACTION
, BBS_PROP_NODE_USERON
, BBS_PROP_NODE_CONNECTION
, BBS_PROP_NODE_MISC
, BBS_PROP_NODE_AUX
, BBS_PROP_NODE_EXTAUX
, BBS_PROP_NODE_VAL_USER
, BBS_PROP_LOGON_ULB
, BBS_PROP_LOGON_DLB
, BBS_PROP_LOGON_ULS
, BBS_PROP_LOGON_DLS
, BBS_PROP_LOGON_POSTS
, BBS_PROP_LOGON_EMAILS
, BBS_PROP_LOGON_FBACKS
, BBS_PROP_POSTS_READ
, BBS_PROP_MENU_DIR
, BBS_PROP_MENU_FILE
, BBS_PROP_MAIN_CMDS
, BBS_PROP_FILE_CMDS
, BBS_PROP_CURGRP
, BBS_PROP_CURSUB
, BBS_PROP_CURSUB_CODE
, BBS_PROP_CURLIB
, BBS_PROP_CURDIR
, BBS_PROP_CURDIR_CODE
, BBS_PROP_CONNECTION /* READ ONLY */
, BBS_PROP_RLOGIN_NAME
, BBS_PROP_RLOGIN_PASS
, BBS_PROP_RLOGIN_TERM
, BBS_PROP_CLIENT_NAME
, BBS_PROP_ERRORLEVEL /* READ ONLY */
/* READ ONLY */
, BBS_PROP_SMB_GROUP
, BBS_PROP_SMB_GROUP_DESC
, BBS_PROP_SMB_GROUP_NUM
, BBS_PROP_SMB_SUB
, BBS_PROP_SMB_SUB_DESC
, BBS_PROP_SMB_SUB_CODE
, BBS_PROP_SMB_SUB_NUM
, BBS_PROP_SMB_ATTR
, BBS_PROP_SMB_LAST_MSG
, BBS_PROP_SMB_TOTAL_MSGS
, BBS_PROP_SMB_MSGS
, BBS_PROP_SMB_CURMSG // writable
/* READ ONLY */
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
, BBS_PROP_MSG_TO
, BBS_PROP_MSG_TO_EXT
, BBS_PROP_MSG_TO_NET
, BBS_PROP_MSG_TO_AGENT
, BBS_PROP_MSG_FROM
, BBS_PROP_MSG_FROM_EXT
, BBS_PROP_MSG_FROM_NET
, BBS_PROP_MSG_FROM_BBSID
, BBS_PROP_MSG_FROM_AGENT
, BBS_PROP_MSG_REPLYTO
, BBS_PROP_MSG_REPLYTO_EXT
, BBS_PROP_MSG_REPLYTO_NET
, BBS_PROP_MSG_REPLYTO_AGENT
, BBS_PROP_MSG_SUBJECT
, BBS_PROP_MSG_DATE
, BBS_PROP_MSG_TIMEZONE
, BBS_PROP_MSG_DATE_IMPORTED
, BBS_PROP_MSG_ATTR
, BBS_PROP_MSG_AUXATTR
, BBS_PROP_MSG_NETATTR
, BBS_PROP_MSG_OFFSET
, BBS_PROP_MSG_NUMBER // writable
, BBS_PROP_MSG_EXPIRATION
, BBS_PROP_MSG_FORWARDED
, BBS_PROP_MSG_THREAD_ID
, BBS_PROP_MSG_THREAD_BACK
, BBS_PROP_MSG_THREAD_NEXT
, BBS_PROP_MSG_THREAD_FIRST
, BBS_PROP_MSG_ID
, BBS_PROP_MSG_REPLY_ID
, BBS_PROP_MSG_DELIVERY_ATTEMPTS
, BBS_PROP_MSGHDR_TOS
/* READ ONLY */
, BBS_PROP_DOWNLOAD_CPS
, BBS_PROP_BATCH_UPLOAD_TOTAL
, BBS_PROP_BATCH_DNLOAD_TOTAL
, BBS_PROP_FILE_NAME
, BBS_PROP_FILE_DESC
, BBS_PROP_FILE_DIR
, BBS_PROP_FILE_ATTR
, BBS_PROP_FILE_DATE
, BBS_PROP_FILE_SIZE
, BBS_PROP_FILE_CREDITS
, BBS_PROP_FILE_ULER
, BBS_PROP_FILE_DATE_ULED
, BBS_PROP_FILE_DATE_DLED
, BBS_PROP_FILE_TIMES_DLED
, BBS_PROP_COMMAND_STR
#ifdef BUILD_JSDOCS
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
static const char* bbs_prop_desc[] = {
"System status bit-flags (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
, "Startup options bit-flags (see <tt>BBS_OPT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
, "Answer time, in <i>time_t</i> format"
, "Logon time, in <i>time_t</i> format"
, "Time from which user's time left is calculated, in <i>time_t</i> format"
, "Current file new-scan time, in <i>time_t</i> format"
, "Previous file new-scan time, in <i>time_t</i> format"
, "Online (see <tt>ON_*</tt> in <tt>sbbsdefs.js</tt> for valid values)"
, "Time left (in seconds)"
, "Time of next exclusive event (in <i>time_t</i> format), or 0 if none"
, "Internal code of next exclusive event"
, "First node number (of this instance of Synchronet)"
, "Last node number (of this instance of Synchronet)"
, "Current node number"
, "Current node settings bit-flags (see <tt>NM_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
, "Current node status value (see <tt>nodedefs.js</tt> for valid values)"
, "Current node error counter"
, "Current node action (see <tt>nodedefs.js</tt> for valid values)"
, "Current node user number (<i>useron</i> value)"
, "Current node connection type (see <tt>nodedefs.js</tt> for valid values)"
, "Current node misc value (see <tt>nodedefs.js</tt> for valid values)"
, "Current node aux value"
, "Current node extended aux (<i>extaux</i>) value"
, "Validation feedback user for this node (or 0 for no validation feedback required)"
, "Bytes uploaded during this session"
, "Bytes downloaded during this session"
, "Files uploaded during this session"
, "Files downloaded during this session"
, "Messages posted during this session"
, "E-mails sent during this session"
, "Feedback messages sent during this session"
, "Messages read during this session"
, "Menu subdirectory (overrides default)"
, "Menu file (overrides default)"
, "Total main menu commands received from user during this session"
, "Total file menu commands received from user during this session"
, "Current message group"
, "Current message sub-board"
, "Current message sub-board internal code"
, "Current file library"
, "Current file directory"
, "Current file directory internal code"
, "Remote connection type"
, "Login name given during RLogin negotiation"
, "Password specified during RLogin negotiation"
, "Terminal specified during RLogin negotiation"
, "Client name"
, "Error level returned from last executed external program"
, "Message group name of message being read"
, "Message group description of message being read"
, "Message group number of message being read"
, "Sub-board name of message being read"
, "Sub-board description of message being read"
, "Sub-board internal code of message being read"
, "Sub-board number of message being read"
, "Message base attributes"
, "Highest message number in message base"
, "Total number of messages in message base"
, "Number of messages loaded from message base"
, "Current message number in message base"
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
, "Message recipient name"
, "Message recipient extension"
, "Message recipient network address"
, "Message recipient agent type"
, "Message sender name"
, "Message sender extension"
, "Message sender network address"
, "Message sender BBS ID"
, "Message sender agent type"
, "Message reply-to name"
, "Message reply-to extension"
, "Message reply-to network address"
, "Message reply-to agent type"
, "Message subject"
, "Message date/time"
, "Message time zone"
, "Message date/time imported"
, "Message attributes"
, "Message auxiliary attributes"
, "Message network attributes"
, "Message header offset"
, "Message number (unique, monotonically incrementing)"
, "Message expiration"
, "Message forwarded"
, "Message thread identifier (0 if unknown)"
, "Message thread, back message number"
, "Message thread, next message number"
, "Message thread, message number of first reply to this message"
, "Message identifier"
, "Message replied-to identifier"
, "Message delivery attempt counter"
, "Message header displayed at top-of-screen"
, "File name"
, "File description"
, "File directory (number)"
, "File attribute flags"
, "File date"
, "File size (in bytes)"
, "File credit value"
, "File uploader (user name)"
, "File upload date"
, "File last-download date"
, "File download count"
, "Most recent file download rate (in characters/bytes per second)"
, "Number of files in batch upload queue"
, "Number of files in batch download queue"
, "Current command shell/module <i>command string</i> value"
, NULL
};
extern JSClass js_bbs_class; // defined later
static sbbs_t *js_GetPrivate(JSContext *cx, JSObject *obj)
return (sbbs_t *)js_GetClassPrivate(cx, obj, &js_bbs_class);
static JSBool js_bbs_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
jsval idval;
char tmp[128];
const char* p = NULL;
const char* nulstr = "";
uint32 val = 0;
jsint tiny;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, obj)) == NULL)
JS_IdToValue(cx, id, &idval);
tiny = JSVAL_TO_INT(idval);
val = sbbs->sys_status;
break;
case BBS_PROP_STARTUP_OPT:
val = sbbs->startup->options;
break;
case BBS_PROP_ANSWER_TIME:
val = (uint32)sbbs->answertime;
break;
case BBS_PROP_LOGON_TIME:
val = (uint32)sbbs->logontime;
case BBS_PROP_START_TIME:
val = (uint32)sbbs->starttime;
val = (uint32)sbbs->ns_time;
break;
case BBS_PROP_LAST_NS_TIME:
val = (uint32)sbbs->last_ns_time;
rc = JS_SUSPENDREQUEST(cx);
val = sbbs->gettimeleft(false);
JS_RESUMEREQUEST(cx, rc);
case BBS_PROP_EVENT_TIME:
val = (uint32)sbbs->event_time;
break;
case BBS_PROP_EVENT_CODE:
break;
case BBS_PROP_FIRST_NODE:
val = sbbs->startup->first_node;
break;
case BBS_PROP_LAST_NODE:
val = sbbs->startup->last_node;
break;
val = sbbs->cfg.node_num;
val = sbbs->cfg.node_misc;
val = sbbs->thisnode.status;
val = sbbs->thisnode.errors;
val = sbbs->thisnode.useron;
val = sbbs->thisnode.connection;
val = sbbs->thisnode.misc;
val = sbbs->thisnode.aux;
val = sbbs->thisnode.extaux;
case BBS_PROP_NODE_VAL_USER:
val = sbbs->cfg.valuser;
break;
case BBS_PROP_LOGON_ULB:
val = (uint32_t)sbbs->logon_ulb; // TODO: fix for > 4GB!
break;
case BBS_PROP_LOGON_DLB:
val = (uint32_t)sbbs->logon_dlb; // TODO: fix for > 4GB!
break;
case BBS_PROP_LOGON_ULS:
val = (uint32_t)sbbs->logon_uls; // TODO: fix for > 4GB!
break;
case BBS_PROP_LOGON_DLS:
val = (uint32_t)sbbs->logon_dls; // TODO: fix for > 4GB!
break;
case BBS_PROP_LOGON_POSTS:
val = sbbs->logon_posts;
break;
case BBS_PROP_LOGON_EMAILS:
val = sbbs->logon_emails;
break;
case BBS_PROP_LOGON_FBACKS:
val = sbbs->logon_fbacks;
break;
case BBS_PROP_POSTS_READ:
val = sbbs->posts_read;
break;
case BBS_PROP_MENU_DIR:
val = sbbs->main_cmds;
val = sbbs->xfer_cmds;
case BBS_PROP_CURGRP:
break;
case BBS_PROP_CURSUB:
if (sbbs->curgrp < sbbs->usrgrps)
val = sbbs->cursub[sbbs->curgrp];
case BBS_PROP_CURSUB_CODE:
if (sbbs->subnum_is_valid(sbbs->cursubnum))
p = sbbs->cfg.sub[sbbs->cursubnum]->code;
else
case BBS_PROP_CURLIB:
break;
case BBS_PROP_CURDIR:
if (sbbs->curlib < sbbs->usrlibs)
val = sbbs->curdir[sbbs->curlib];
case BBS_PROP_CURDIR_CODE:
if (sbbs->dirnum_is_valid(sbbs->curdirnum))
p = sbbs->cfg.dir[sbbs->curdirnum]->code;
else
p = sbbs->rlogin_name;
case BBS_PROP_RLOGIN_PASS:
p = sbbs->rlogin_pass;
case BBS_PROP_RLOGIN_TERM:
p = sbbs->rlogin_term;
p = sbbs->client_name;
case BBS_PROP_ERRORLEVEL:
val = sbbs->errorlevel;
break;
/* Currently Open Message Base (sbbs.smb) */
case BBS_PROP_SMB_GROUP:
if (!subnum_is_valid(&sbbs->cfg, sbbs->smb.subnum))
p = nulstr;
else
p = sbbs->cfg.grp[sbbs->cfg.sub[sbbs->smb.subnum]->grp]->sname;
break;
case BBS_PROP_SMB_GROUP_DESC:
if (!subnum_is_valid(&sbbs->cfg, sbbs->smb.subnum))
p = nulstr;
else
p = sbbs->cfg.grp[sbbs->cfg.sub[sbbs->smb.subnum]->grp]->lname;
break;
case BBS_PROP_SMB_GROUP_NUM:
if (sbbs->subnum_is_valid(sbbs->smb.subnum)) {

Rob Swindell
committed
int ugrp;
for (ugrp = 0; ugrp < sbbs->usrgrps; ugrp++)
if (sbbs->usrgrp[ugrp] == sbbs->cfg.sub[sbbs->smb.subnum]->grp)
break;
}
break;
case BBS_PROP_SMB_SUB:
if (!subnum_is_valid(&sbbs->cfg, sbbs->smb.subnum))
p = nulstr;
else
p = sbbs->cfg.sub[sbbs->smb.subnum]->sname;
break;
case BBS_PROP_SMB_SUB_DESC:
if (!subnum_is_valid(&sbbs->cfg, sbbs->smb.subnum))
p = nulstr;
else
p = sbbs->cfg.sub[sbbs->smb.subnum]->lname;
break;
case BBS_PROP_SMB_SUB_CODE:
if (!subnum_is_valid(&sbbs->cfg, sbbs->smb.subnum))
p = nulstr;
else
p = sbbs->cfg.sub[sbbs->smb.subnum]->code;
break;
case BBS_PROP_SMB_SUB_NUM:
if (sbbs->usrsubs && sbbs->subnum_is_valid(sbbs->smb.subnum)) {

Rob Swindell
committed
int ugrp;
for (ugrp = 0; ugrp < sbbs->usrgrps; ugrp++)
if (sbbs->usrgrp[ugrp] == sbbs->cfg.sub[sbbs->smb.subnum]->grp)
break;

Rob Swindell
committed
int usub;
for (usub = 0; usub < sbbs->usrsubs[ugrp]; usub++)
if (sbbs->usrsub[ugrp][usub] == sbbs->smb.subnum)
break;
}
break;
case BBS_PROP_SMB_ATTR:
val = sbbs->smb.status.attr;
break;
case BBS_PROP_SMB_LAST_MSG:
val = sbbs->smb.status.last_msg;
break;
case BBS_PROP_SMB_TOTAL_MSGS:
val = sbbs->smb.status.total_msgs;
break;
case BBS_PROP_SMB_MSGS:
break;
case BBS_PROP_SMB_CURMSG:
val = sbbs->smb.curmsg;
/* Currently Displayed Message Header (sbbs.current_msg) */
case BBS_PROP_MSG_TO:
if (sbbs->current_msg_to == NULL)
p = nulstr;
else
p = sbbs->current_msg_to;
break;
case BBS_PROP_MSG_TO_EXT:
if (sbbs->current_msg == NULL || sbbs->current_msg->to_ext == NULL)
p = nulstr;
else
p = sbbs->current_msg->to_ext;
break;
case BBS_PROP_MSG_TO_NET:
if (sbbs->current_msg == NULL || sbbs->current_msg->to_net.type == NET_NONE)
p = nulstr;
else
p = smb_netaddrstr(&sbbs->current_msg->to_net, tmp);
break;
case BBS_PROP_MSG_TO_AGENT:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->to_agent;
break;
case BBS_PROP_MSG_FROM:
if (sbbs->current_msg_from == NULL)
p = nulstr;
else
p = sbbs->current_msg_from;
break;
case BBS_PROP_MSG_FROM_EXT:
if (sbbs->current_msg == NULL || sbbs->current_msg->from_ext == NULL)
p = nulstr;
else
p = sbbs->current_msg->from_ext;
break;
case BBS_PROP_MSG_FROM_NET:
if (sbbs->current_msg == NULL || sbbs->current_msg->from_net.type == NET_NONE)
p = nulstr;
else
p = smb_netaddrstr(&sbbs->current_msg->from_net, tmp);
break;
if (sbbs->current_msg == NULL || sbbs->current_msg->ftn_bbsid == NULL)
p = nulstr;
else // Should we return only the last ID of the QWKnet route here?
p = sbbs->current_msg->ftn_bbsid;
break;
case BBS_PROP_MSG_FROM_AGENT:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->from_agent;
break;
case BBS_PROP_MSG_REPLYTO:
if (sbbs->current_msg == NULL || sbbs->current_msg->replyto == NULL)
p = nulstr;
else
p = sbbs->current_msg->replyto;
break;
case BBS_PROP_MSG_REPLYTO_EXT:
if (sbbs->current_msg == NULL || sbbs->current_msg->replyto_ext == NULL)
p = nulstr;
else
p = sbbs->current_msg->replyto_ext;
break;
case BBS_PROP_MSG_REPLYTO_NET:
if (sbbs->current_msg == NULL || sbbs->current_msg->replyto_net.type == NET_NONE)
p = nulstr;
else
p = smb_netaddrstr(&sbbs->current_msg->replyto_net, tmp);
break;
case BBS_PROP_MSG_REPLYTO_AGENT:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->replyto_agent;
break;
case BBS_PROP_MSG_SUBJECT:
if (sbbs->current_msg_subj == NULL)
p = nulstr;
else
p = sbbs->current_msg_subj;
break;
case BBS_PROP_MSG_DATE:
if (sbbs->current_msg != NULL)
val = (uint32)smb_time(sbbs->current_msg->hdr.when_written);
break;
case BBS_PROP_MSG_TIMEZONE:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.when_written.zone;
break;
case BBS_PROP_MSG_DATE_IMPORTED:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.when_imported.time;
break;
case BBS_PROP_MSG_ATTR:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.attr;
break;
case BBS_PROP_MSG_AUXATTR:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.auxattr;
break;
case BBS_PROP_MSG_NETATTR:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.netattr;
break;
case BBS_PROP_MSG_OFFSET:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->idx_offset;
break;
case BBS_PROP_MSG_NUMBER:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.number;
val = sbbs->current_msg_number;
break;
case BBS_PROP_MSG_EXPIRATION:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->expiration;
break;
case BBS_PROP_MSG_FORWARDED:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->forwarded;
break;
case BBS_PROP_MSG_THREAD_ID:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.thread_id;
break;
case BBS_PROP_MSG_THREAD_BACK:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.thread_back;
break;
case BBS_PROP_MSG_THREAD_NEXT:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.thread_next;
break;
case BBS_PROP_MSG_THREAD_FIRST:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.thread_first;
break;
case BBS_PROP_MSG_DELIVERY_ATTEMPTS:
if (sbbs->current_msg != NULL)
val = sbbs->current_msg->hdr.delivery_attempts;
break;
case BBS_PROP_MSG_ID:
if (sbbs->current_msg == NULL || sbbs->current_msg->id == NULL)
p = nulstr;
p = sbbs->current_msg->id;
break;
case BBS_PROP_MSG_REPLY_ID:
if (sbbs->current_msg == NULL || sbbs->current_msg->reply_id == NULL)
p = nulstr;
p = sbbs->current_msg->reply_id;
case BBS_PROP_MSGHDR_TOS:
val = sbbs->msghdr_tos;
break;
/* Currently Displayed File (sbbs.current_file) */
case BBS_PROP_FILE_NAME:
if (sbbs->current_file == NULL)
p = nulstr;
p = sbbs->current_file->name;
break;
case BBS_PROP_FILE_DESC:
if (sbbs->current_file == NULL)
p = nulstr;
p = sbbs->current_file->desc;
break;
case BBS_PROP_FILE_ULER:
if (sbbs->current_file == NULL)
p = nulstr;
p = sbbs->current_file->from;
break;
case BBS_PROP_FILE_DATE:
if (sbbs->current_file == NULL)
p = nulstr;
val = (uint32)sbbs->current_file->time;
break;
case BBS_PROP_FILE_DATE_ULED:
if (sbbs->current_file == NULL)
p = nulstr;
val = sbbs->current_file->hdr.when_imported.time;
break;
case BBS_PROP_FILE_DATE_DLED:
if (sbbs->current_file == NULL)
p = nulstr;
val = sbbs->current_file->hdr.last_downloaded;
break;
case BBS_PROP_FILE_TIMES_DLED:
if (sbbs->current_file == NULL)
p = nulstr;
val = sbbs->current_file->hdr.times_downloaded;
break;
case BBS_PROP_FILE_SIZE:
if (sbbs->current_file == NULL)
p = nulstr;
else // TODO: fix for 64-bit file sizes
val = (uint32)sbbs->current_file->size;
break;
case BBS_PROP_FILE_CREDITS:
if (sbbs->current_file == NULL)
p = nulstr;
val = (uint32_t)sbbs->current_file->cost; // TODO (cost is now 64-bit)
if (sbbs->current_file == NULL)
p = nulstr;
val = sbbs->current_file->dir;
break;
case BBS_PROP_FILE_ATTR:
if (sbbs->current_file == NULL)
p = nulstr;
val = sbbs->current_file->hdr.attr;
case BBS_PROP_DOWNLOAD_CPS:
val = sbbs->cur_cps;
break;
case BBS_PROP_BATCH_UPLOAD_TOTAL:
val = sbbs->batup_total();
break;
case BBS_PROP_BATCH_DNLOAD_TOTAL:
val = sbbs->batdn_total();
case BBS_PROP_COMMAND_STR:
p = sbbs->main_csi.str;
break;
if (p != NULL) {
JSString* js_str = JS_NewStringCopyZ(cx, p);
if (js_str == NULL)
return(JS_FALSE);
*vp = STRING_TO_JSVAL(js_str);
} else
*vp = UINT_TO_JSVAL(val);
static JSBool js_bbs_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp)
jsval idval;
char* p = NULL;
uint32 val = 0;
jsint tiny;
JSString* js_str;
sbbs_t* sbbs;
if ((sbbs = js_GetPrivate(cx, obj)) == NULL)
JS_IdToValue(cx, id, &idval);
tiny = JSVAL_TO_INT(idval);
if (JSVAL_IS_NUMBER(*vp) || JSVAL_IS_BOOLEAN(*vp)) {
if (!JS_ValueToECMAUint32(cx, *vp, &val))
return(JS_FALSE);
}
else if (JSVAL_IS_STRING(*vp)) {
if ((js_str = JS_ValueToString(cx, *vp)) == NULL)
HANDLE_PENDING(cx, p);
sbbs->sys_status = val;
break;
case BBS_PROP_STARTUP_OPT:
sbbs->startup->options = val;
break;
case BBS_PROP_ANSWER_TIME:
sbbs->answertime = val;
break;
case BBS_PROP_LOGON_TIME:
sbbs->logontime = val;
case BBS_PROP_START_TIME:
sbbs->starttime = val;
break;
case BBS_PROP_LAST_NS_TIME:
sbbs->last_ns_time = val;
sbbs->cfg.node_misc = val;
sbbs->action = (uchar)val;
case BBS_PROP_NODE_VAL_USER:
sbbs->cfg.valuser = (ushort)val;
break;
case BBS_PROP_LOGON_ULB:
sbbs->logon_ulb = val;
break;
case BBS_PROP_LOGON_DLB:
sbbs->logon_dlb = val;
break;
case BBS_PROP_LOGON_ULS:
sbbs->logon_uls = val;
break;
case BBS_PROP_LOGON_DLS:
sbbs->logon_dls = val;
break;
case BBS_PROP_LOGON_POSTS:
sbbs->logon_posts = val;
break;
case BBS_PROP_LOGON_EMAILS:
sbbs->logon_emails = val;
case BBS_PROP_LOGON_FBACKS:
sbbs->logon_fbacks = val;
sbbs->posts_read = val;
if (p != NULL)
SAFECOPY(sbbs->menu_dir, p);
if (p != NULL)
SAFECOPY(sbbs->menu_file, p);
sbbs->main_cmds = val;
sbbs->xfer_cmds = val;
case BBS_PROP_SMB_CURMSG:
sbbs->smb.curmsg = val;
break;
case BBS_PROP_MSG_NUMBER:
sbbs->current_msg_number = val;
break;
case BBS_PROP_CURGRP:
if (p != NULL) { /* set by name */

Rob Swindell
committed
int i;
for (i = 0; i < sbbs->usrgrps; i++)
if (!stricmp(sbbs->cfg.grp[sbbs->usrgrp[i]]->sname, p))
break;
if (i < sbbs->usrgrps)
sbbs->curgrp = i;
break;
}
if ((int)val < sbbs->cfg.total_grps && (int)val < sbbs->usrgrps)
sbbs->curgrp = val;
break;
case BBS_PROP_CURSUB:
case BBS_PROP_CURSUB_CODE:
if (p != NULL) { /* set by code */
for (int i = 0; i < sbbs->usrgrps; i++)
for (int j = 0; j < sbbs->usrsubs[i]; j++)
if (!stricmp(sbbs->cfg.sub[sbbs->usrsub[i][j]]->code, p)) {
sbbs->curgrp = i;
sbbs->cursub[i] = j;
}
break;
}
if (sbbs->curgrp < sbbs->cfg.total_grps && (int)val < sbbs->usrsubs[sbbs->curgrp])
sbbs->cursub[sbbs->curgrp] = val;
break;
case BBS_PROP_CURLIB:
if (p != NULL) { /* set by name */

Rob Swindell
committed
int i;
for (i = 0; i < sbbs->usrlibs; i++)
if (!stricmp(sbbs->cfg.lib[sbbs->usrlib[i]]->sname, p))
break;
if (i < sbbs->usrlibs)
sbbs->curlib = i;
break;
}
if ((int)val < sbbs->cfg.total_libs && (int)val < sbbs->usrlibs)
sbbs->curlib = val;
break;
case BBS_PROP_CURDIR:
case BBS_PROP_CURDIR_CODE:
if (p != NULL) { /* set by code */
for (int i = 0; i < sbbs->usrlibs; i++)
for (int j = 0; j < sbbs->usrdirs[i]; j++)
if (!stricmp(sbbs->cfg.dir[sbbs->usrdir[i][j]]->code, p)) {
sbbs->curlib = i;
sbbs->curdir[i] = j;
}
break;
}
if (sbbs->curlib < sbbs->cfg.total_libs && (int)val < sbbs->usrdirs[sbbs->curlib])
sbbs->curdir[sbbs->curlib] = val;
if (p != NULL)
SAFECOPY(sbbs->rlogin_name, p);
case BBS_PROP_RLOGIN_PASS:
if (p != NULL)
SAFECOPY(sbbs->rlogin_pass, p);
case BBS_PROP_RLOGIN_TERM:
if (p != NULL)
SAFECOPY(sbbs->rlogin_term, p);
if (p != NULL)
SAFECOPY(sbbs->client_name, p);
case BBS_PROP_COMMAND_STR:
strlcpy(sbbs->main_csi.str, p, 1024);
break;
if (sbbs->usrgrps)
sbbs->cursubnum = sbbs->usrsub[sbbs->curgrp][sbbs->cursub[sbbs->curgrp]]; /* Used for ARS */
sbbs->cursubnum = INVALID_SUB;
if (sbbs->usrlibs)
sbbs->curdirnum = sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]]; /* Used for ARS */
sbbs->curdirnum = INVALID_DIR;
#define PROP_READONLY JSPROP_ENUMERATE | JSPROP_READONLY
static jsSyncPropertySpec js_bbs_properties[] = {
/* name ,tinyid ,flags ,ver */
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
{ "sys_status", BBS_PROP_SYS_STATUS, JSPROP_ENUMERATE, 310},
{ "startup_options", BBS_PROP_STARTUP_OPT, JSPROP_ENUMERATE, 310},
{ "answer_time", BBS_PROP_ANSWER_TIME, JSPROP_ENUMERATE, 310},
{ "logon_time", BBS_PROP_LOGON_TIME, JSPROP_ENUMERATE, 310},
{ "start_time", BBS_PROP_START_TIME, JSPROP_ENUMERATE, 314},
{ "new_file_time", BBS_PROP_NS_TIME, JSPROP_ENUMERATE, 310},
{ "last_new_file_time", BBS_PROP_LAST_NS_TIME, JSPROP_ENUMERATE, 310},
{ "online", BBS_PROP_ONLINE, JSPROP_ENUMERATE, 310},
{ "timeleft", BBS_PROP_TIMELEFT, JSPROP_READONLY, 310}, /* alias */
{ "time_left", BBS_PROP_TIMELEFT, PROP_READONLY, 311},
{ "event_time", BBS_PROP_EVENT_TIME, PROP_READONLY, 311},
{ "event_code", BBS_PROP_EVENT_CODE, PROP_READONLY, 311},
{ "first_node", BBS_PROP_FIRST_NODE, PROP_READONLY, 320},
{ "last_node", BBS_PROP_LAST_NODE, PROP_READONLY, 320},
{ "node_num", BBS_PROP_NODE_NUM, PROP_READONLY, 310},
{ "node_settings", BBS_PROP_NODE_SETTINGS, JSPROP_ENUMERATE, 310},
{ "node_status", BBS_PROP_NODE_STATUS, PROP_READONLY, 31700},
{ "node_errors", BBS_PROP_NODE_ERRORS, PROP_READONLY, 31700},
{ "node_action", BBS_PROP_NODE_ACTION, JSPROP_ENUMERATE, 310},
{ "node_useron", BBS_PROP_NODE_USERON, PROP_READONLY, 31700},
{ "node_connection", BBS_PROP_NODE_CONNECTION, PROP_READONLY, 31700},
{ "node_misc", BBS_PROP_NODE_MISC, PROP_READONLY, 31700},
{ "node_aux", BBS_PROP_NODE_AUX, PROP_READONLY, 31700},
{ "node_extaux", BBS_PROP_NODE_EXTAUX, PROP_READONLY, 31700},
{ "node_val_user", BBS_PROP_NODE_VAL_USER, JSPROP_ENUMERATE, 310},
{ "logon_ulb", BBS_PROP_LOGON_ULB, JSPROP_ENUMERATE, 310},
{ "logon_dlb", BBS_PROP_LOGON_DLB, JSPROP_ENUMERATE, 310},
{ "logon_uls", BBS_PROP_LOGON_ULS, JSPROP_ENUMERATE, 310},
{ "logon_dls", BBS_PROP_LOGON_DLS, JSPROP_ENUMERATE, 310},
{ "logon_posts", BBS_PROP_LOGON_POSTS, JSPROP_ENUMERATE, 310},
{ "logon_emails", BBS_PROP_LOGON_EMAILS, JSPROP_ENUMERATE, 310},
{ "logon_fbacks", BBS_PROP_LOGON_FBACKS, JSPROP_ENUMERATE, 310},
{ "posts_read", BBS_PROP_POSTS_READ, JSPROP_ENUMERATE, 310},
{ "menu_dir", BBS_PROP_MENU_DIR, JSPROP_ENUMERATE, 310},
{ "menu_file", BBS_PROP_MENU_FILE, JSPROP_ENUMERATE, 310},
{ "main_cmds", BBS_PROP_MAIN_CMDS, JSPROP_ENUMERATE, 310},
{ "file_cmds", BBS_PROP_FILE_CMDS, JSPROP_ENUMERATE, 310},
{ "curgrp", BBS_PROP_CURGRP, JSPROP_ENUMERATE, 310},
{ "cursub", BBS_PROP_CURSUB, JSPROP_ENUMERATE, 310},
{ "cursub_code", BBS_PROP_CURSUB_CODE, JSPROP_ENUMERATE, 314},
{ "curlib", BBS_PROP_CURLIB, JSPROP_ENUMERATE, 310},
{ "curdir", BBS_PROP_CURDIR, JSPROP_ENUMERATE, 310},
{ "curdir_code", BBS_PROP_CURDIR_CODE, JSPROP_ENUMERATE, 314},
{ "connection", BBS_PROP_CONNECTION, PROP_READONLY, 310},
{ "rlogin_name", BBS_PROP_RLOGIN_NAME, JSPROP_ENUMERATE, 310},
{ "rlogin_password", BBS_PROP_RLOGIN_PASS, JSPROP_ENUMERATE, 315},
{ "rlogin_terminal", BBS_PROP_RLOGIN_TERM, JSPROP_ENUMERATE, 316},
{ "client_name", BBS_PROP_CLIENT_NAME, JSPROP_ENUMERATE, 310},
{ "errorlevel", BBS_PROP_ERRORLEVEL, PROP_READONLY, 312},
{ "smb_group", BBS_PROP_SMB_GROUP, PROP_READONLY, 310},
{ "smb_group_desc", BBS_PROP_SMB_GROUP_DESC, PROP_READONLY, 310},
{ "smb_group_number", BBS_PROP_SMB_GROUP_NUM, PROP_READONLY, 310},
{ "smb_sub", BBS_PROP_SMB_SUB, PROP_READONLY, 310},
{ "smb_sub_desc", BBS_PROP_SMB_SUB_DESC, PROP_READONLY, 310},
{ "smb_sub_code", BBS_PROP_SMB_SUB_CODE, PROP_READONLY, 310},
{ "smb_sub_number", BBS_PROP_SMB_SUB_NUM, PROP_READONLY, 310},
{ "smb_attr", BBS_PROP_SMB_ATTR, PROP_READONLY, 310},
{ "smb_last_msg", BBS_PROP_SMB_LAST_MSG, PROP_READONLY, 310},
{ "smb_total_msgs", BBS_PROP_SMB_TOTAL_MSGS, PROP_READONLY, 310},
{ "smb_msgs", BBS_PROP_SMB_MSGS, PROP_READONLY, 310},
{ "smb_curmsg", BBS_PROP_SMB_CURMSG, JSPROP_ENUMERATE, 310},
{ "msg_to", BBS_PROP_MSG_TO, PROP_READONLY, 310},
{ "msg_to_ext", BBS_PROP_MSG_TO_EXT, PROP_READONLY, 310},
{ "msg_to_net", BBS_PROP_MSG_TO_NET, PROP_READONLY, 310},
{ "msg_to_agent", BBS_PROP_MSG_TO_AGENT, PROP_READONLY, 310},
{ "msg_from", BBS_PROP_MSG_FROM, PROP_READONLY, 310},
{ "msg_from_ext", BBS_PROP_MSG_FROM_EXT, PROP_READONLY, 310},
{ "msg_from_net", BBS_PROP_MSG_FROM_NET, PROP_READONLY, 310},
{ "msg_from_bbsid", BBS_PROP_MSG_FROM_BBSID, PROP_READONLY, 31802},
{ "msg_from_agent", BBS_PROP_MSG_FROM_AGENT, PROP_READONLY, 310},
{ "msg_replyto", BBS_PROP_MSG_REPLYTO, PROP_READONLY, 310},
{ "msg_replyto_ext", BBS_PROP_MSG_REPLYTO_EXT, PROP_READONLY, 310},
{ "msg_replyto_net", BBS_PROP_MSG_REPLYTO_NET, PROP_READONLY, 310},
{ "msg_replyto_agent", BBS_PROP_MSG_REPLYTO_AGENT, PROP_READONLY, 310},
{ "msg_subject", BBS_PROP_MSG_SUBJECT, PROP_READONLY, 310},
{ "msg_date", BBS_PROP_MSG_DATE, PROP_READONLY, 310},
{ "msg_timezone", BBS_PROP_MSG_TIMEZONE, PROP_READONLY, 310},
{ "msg_date_imported", BBS_PROP_MSG_DATE_IMPORTED, PROP_READONLY, 310},
{ "msg_attr", BBS_PROP_MSG_ATTR, PROP_READONLY, 310},
{ "msg_auxattr", BBS_PROP_MSG_AUXATTR, PROP_READONLY, 310},
{ "msg_netattr", BBS_PROP_MSG_NETATTR, PROP_READONLY, 310},
{ "msg_offset", BBS_PROP_MSG_OFFSET, PROP_READONLY, 310},
{ "msg_number", BBS_PROP_MSG_NUMBER, JSPROP_ENUMERATE, 310},
{ "msg_expiration", BBS_PROP_MSG_EXPIRATION, PROP_READONLY, 310},
{ "msg_forwarded", BBS_PROP_MSG_FORWARDED, PROP_READONLY, 310},
{ "msg_thread_id", BBS_PROP_MSG_THREAD_BACK, PROP_READONLY, 316},
{ "msg_thread_back", BBS_PROP_MSG_THREAD_BACK, PROP_READONLY, 312},
{ "msg_thread_orig", BBS_PROP_MSG_THREAD_BACK, JSPROP_READONLY, 310}, /* alias */
{ "msg_thread_next", BBS_PROP_MSG_THREAD_NEXT, PROP_READONLY, 310},
{ "msg_thread_first", BBS_PROP_MSG_THREAD_FIRST, PROP_READONLY, 310},
{ "msg_id", BBS_PROP_MSG_ID, PROP_READONLY, 310},
{ "msg_reply_id", BBS_PROP_MSG_REPLY_ID, PROP_READONLY, 310},
{ "msg_delivery_attempts", BBS_PROP_MSG_DELIVERY_ATTEMPTS
, PROP_READONLY, 310},
{ "msghdr_top_of_screen", BBS_PROP_MSGHDR_TOS, PROP_READONLY, 31702},
{ "file_name", BBS_PROP_FILE_NAME, PROP_READONLY, 317},
{ "file_description", BBS_PROP_FILE_DESC, PROP_READONLY, 317},
{ "file_dir_number", BBS_PROP_FILE_DIR, PROP_READONLY, 317},
{ "file_attr", BBS_PROP_FILE_ATTR, PROP_READONLY, 317},
{ "file_date", BBS_PROP_FILE_DATE, PROP_READONLY, 317},
{ "file_size", BBS_PROP_FILE_SIZE, PROP_READONLY, 317},
{ "file_credits", BBS_PROP_FILE_CREDITS, PROP_READONLY, 317},
{ "file_uploader", BBS_PROP_FILE_ULER, PROP_READONLY, 317},
{ "file_upload_date", BBS_PROP_FILE_DATE_ULED, PROP_READONLY, 317},
{ "file_download_date", BBS_PROP_FILE_DATE_DLED, PROP_READONLY, 317},
{ "file_download_count", BBS_PROP_FILE_TIMES_DLED, PROP_READONLY, 317},
{ "download_cps", BBS_PROP_DOWNLOAD_CPS, PROP_READONLY, 320},
{ "batch_upload_total", BBS_PROP_BATCH_UPLOAD_TOTAL, PROP_READONLY, 310},
{ "batch_dnload_total", BBS_PROP_BATCH_DNLOAD_TOTAL, PROP_READONLY, 310},
{ "command_str", BBS_PROP_COMMAND_STR, JSPROP_ENUMERATE, 314},
static uint get_subnum(JSContext* cx, sbbs_t* sbbs, jsval *argv, int argc, int pos)
int subnum = INVALID_SUB;
if (argc > pos && JSVAL_IS_STRING(argv[pos])) {
JSSTRING_TO_ASTRING(cx, JSVAL_TO_STRING(argv[pos]), p, LEN_EXTCODE + 2, NULL);
for (subnum = 0; subnum < sbbs->cfg.total_subs; subnum++)
if (!stricmp(sbbs->cfg.sub[subnum]->code, p))
} else if (argc > pos && JSVAL_IS_NUMBER(argv[pos])) {
uint32 i;
if (!JS_ValueToECMAUint32(cx, argv[pos], &i))
subnum = i;
else if (sbbs->usrgrps > 0)
subnum = sbbs->usrsub[sbbs->curgrp][sbbs->cursub[sbbs->curgrp]];
return(subnum);
}
static uint get_dirnum(JSContext* cx, sbbs_t* sbbs, jsval val, bool dflt)
int dirnum = INVALID_DIR;
if (sbbs->usrlibs > 0)
dirnum = sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]];
if (!dflt) {
if (JSVAL_IS_STRING(val)) {
char *p;
JSSTRING_TO_ASTRING(cx, JSVAL_TO_STRING(val), p, LEN_EXTCODE + 2, NULL);
for (dirnum = 0; dirnum < sbbs->cfg.total_dirs; dirnum++)
if (!stricmp(sbbs->cfg.dir[dirnum]->code, p))
break;
} else if (JSVAL_IS_NUMBER(val)) {
uint32 i;
if (!JS_ValueToECMAUint32(cx, val, &i))
return JS_FALSE;
dirnum = i;
}
else if (sbbs->usrlibs > 0)
dirnum = sbbs->usrdir[sbbs->curlib][sbbs->curdir[sbbs->curlib]];
}
/**************************/
/* bbs Object Methods */
/**************************/
js_menu(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
JSString* str;
sbbs_t* sbbs;
jsrefcount rc;
char * menu;
int32 mode = P_NONE;
JSObject* obj = JS_GetScopeChain(cx);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
uintN argn = 1;
if (argc > argn && JSVAL_IS_NUMBER(argv[argn])) {
if (!JS_ValueToInt32(cx, argv[argn], &mode))
return JS_FALSE;
argn++;
}
if (argc > argn && JSVAL_IS_OBJECT(argv[argn])) {
if ((obj = JSVAL_TO_OBJECT(argv[argn])) == NULL)
return JS_FALSE;
argn++;
}
rc = JS_SUSPENDREQUEST(cx);
bool result = sbbs->menu(menu, mode, obj);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, result ? JSVAL_TRUE : JSVAL_FALSE);
static JSBool
js_menu_exists(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
JSString* str;
sbbs_t* sbbs;
jsrefcount rc;
char * menu;
if (!js_argc(cx, argc, 1))
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
str = JS_ValueToString(cx, argv[0]);
if (!str)
return(JS_FALSE);
rc = JS_SUSPENDREQUEST(cx);
bool result = sbbs->menu_exists(menu);
free(menu);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(result));
js_hangup(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
js_nodesync(JSContext *cx, uintN argc, jsval *arglist)
jsval* argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
JSBool clearline = false;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (argc > 0 && JSVAL_IS_BOOLEAN(argv[0]))
clearline = JSVAL_TO_BOOLEAN(argv[0]);
rc = JS_SUSPENDREQUEST(cx);
sbbs->getnodedat(sbbs->cfg.node_num, &sbbs->thisnode);
sbbs->nodesync(clearline ? true : false);
JS_RESUMEREQUEST(cx, rc);
js_exec(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uintN i;
sbbs_t* sbbs;
uint32 mode = 0;
JSString* cmd;
JSString* startup_dir = NULL;
char* p_startup_dir = NULL;
jsrefcount rc;
char* cstr;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if ((cmd = JS_ValueToString(cx, argv[0])) == NULL)
for (i = 1; i < argc; i++) {
if (JSVAL_IS_NUMBER(argv[i])) {
if (!JS_ValueToECMAUint32(cx, argv[i], &mode))
return JS_FALSE;
}
else if (JSVAL_IS_STRING(argv[i]))
startup_dir = JS_ValueToString(cx, argv[i]);
if (startup_dir != NULL) {
JSSTRING_TO_MSTRING(cx, startup_dir, p_startup_dir, NULL);
if (p_startup_dir == NULL)
FREE_AND_NULL(p_startup_dir);
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(sbbs->external(cstr, mode, p_startup_dir)));
JS_RESUMEREQUEST(cx, rc);
js_exec_xtrn(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
int32 i = 0;
char* code;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
if (!js_argc(cx, argc, 1))
return JS_FALSE;
if (JSVAL_IS_STRING(argv[0])) {
JSVALUE_TO_ASTRING(cx, argv[0], code, LEN_CODE + 2, NULL);
if (code == NULL)
return(JS_FALSE);
for (i = 0; i < sbbs->cfg.total_xtrns; i++)
if (!stricmp(sbbs->cfg.xtrn[i]->code, code))
} else if (JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToInt32(cx, argv[0], &i))
return JS_FALSE;
if (i < 0 || i >= sbbs->cfg.total_xtrns) {
JS_ReportError(cx, "Invalid external program specified");
return JS_FALSE;
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->exec_xtrn(i)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_user_event(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 i = 0;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
if (argc && JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &i))
return JS_FALSE;
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->user_event((user_event_t)i)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_checkfname(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char* fname = NULL;
jsrefcount rc;
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if (argc < 1 || !JSVAL_IS_STRING(argv[0]))
return JS_TRUE;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return JS_FALSE;
JSVALUE_TO_MSTRING(cx, argv[0], fname, NULL);
return JS_FALSE;
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->checkfname(fname)));
JS_RESUMEREQUEST(cx, rc);
free(fname);
return JS_TRUE;
}
js_chksyspass(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char* sys_pw = NULL;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
if (argc) {
JSString* str = JS_ValueToString(cx, argv[0]);
JSSTRING_TO_ASTRING(cx, str, sys_pw, sizeof(sbbs->cfg.sys_pass) + 2, NULL);
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->chksyspass(sys_pw)));
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_chkpass(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char* cstr;
jsrefcount rc;
bool unique = false;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if (argc > 1 && JSVAL_IS_BOOLEAN(argv[1]))
unique = JSVAL_TO_BOOLEAN(argv[1]);
JSString* str = JS_ValueToString(cx, argv[0]);
JSSTRING_TO_ASTRING(cx, str, cstr, LEN_PASS + 2, NULL);
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->chkpass(cstr, &sbbs->useron, unique)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_text(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 i = 0;
sbbs_t* sbbs;
bool dflt = false;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (argc > 0) {
if (JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &i))

Rob Swindell
committed
return JS_FALSE;
} else {
JSString* js_str = JS_ValueToString(cx, argv[0]);

Rob Swindell
committed
return JS_FALSE;

Rob Swindell
committed
JSSTRING_TO_MSTRING(cx, js_str, id, NULL);
i = sbbs->get_text_num(id) + 1;
free(id);
}
if (argc > 1 && JSVAL_IS_BOOLEAN(argv[1]))
if (i > 0 && i <= TOTAL_TEXT) {
JSString* js_str = JS_NewStringCopyZ(cx, dflt ? sbbs->text_sav[i - 1] : sbbs->text[i - 1]);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}
static JSBool
js_replace_text(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* p;
uint32 i = 0;
int len;
sbbs_t* sbbs;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if (!js_argc(cx, argc, 2))
return(JS_FALSE);
if (JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &i))
} else {
JSString* js_str = JS_ValueToString(cx, argv[0]);
return JS_FALSE;
JSSTRING_TO_MSTRING(cx, js_str, id, NULL);
i = sbbs->get_text_num(id) + 1;
free(id);
if (i < 1 || i > TOTAL_TEXT)
if (sbbs->text[i] != sbbs->text_sav[i] && sbbs->text[i] != nulstr)
len = strlen(p);
if (!len) {
sbbs->text[i] = (char*)nulstr;
JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
free(p);
} else {
}
return(JS_TRUE);
}
static JSBool
js_revert_text(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 i = 0;
sbbs_t* sbbs;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if (JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &i))
i--;
} else {
JSString* js_str = JS_ValueToString(cx, argv[0]);
return JS_FALSE;
JSSTRING_TO_MSTRING(cx, js_str, id, NULL);
i = sbbs->get_text_num(id);
free(id);
if (i >= TOTAL_TEXT) {
for (i = 0; i < TOTAL_TEXT; i++) {
if (sbbs->text[i] != sbbs->text_sav[i] && sbbs->text[i] != nulstr)
sbbs->text[i] = sbbs->text_sav[i];
if (sbbs->text[i] != sbbs->text_sav[i] && sbbs->text[i] != nulstr)
sbbs->text[i] = sbbs->text_sav[i];
JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
return(JS_TRUE);
}
static JSBool
js_load_text(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
int i;
char path[MAX_PATH + 1];
FILE* stream;
JSString* js_str;
sbbs_t* sbbs;
char* cstr;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
return(JS_TRUE);
}
rc = JS_SUSPENDREQUEST(cx);
for (i = 0; i < TOTAL_TEXT; i++) {
if (sbbs->text[i] != sbbs->text_sav[i]) {
if (sbbs->text[i] != nulstr)
sbbs->text[i] = sbbs->text_sav[i];
snprintf(path, sizeof path, "%s%s.dat"
, sbbs->cfg.ctrl_dir, cstr);
if ((stream = fnopen(NULL, path, O_RDONLY)) == NULL) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
for (i = 0; i < TOTAL_TEXT && !feof(stream); i++) {
if ((sbbs->text[i] = readtext(NULL, stream, i)) == NULL) {
if (!strcmp(sbbs->text[i], sbbs->text_sav[i])) { /* If identical */
free(sbbs->text[i]); /* Don't alloc */
sbbs->text[i] = sbbs->text_sav[i];
else if (sbbs->text[i][0] == 0) {
sbbs->text[i] = (char*)nulstr;
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
fclose(stream);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_load_user_text(JSContext* cx, uintN argc, jsval* arglist)
{
sbbs_t* sbbs;
jsrefcount rc;
bool result;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
rc = JS_SUSPENDREQUEST(cx);
result = sbbs->load_user_text();
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(result));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_atcode(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char str[128];
char * instr;
const char *cp;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
JSVALUE_TO_MSTRING(cx, argv[0], instr, NULL);
rc = JS_SUSPENDREQUEST(cx);
cp = sbbs->formatted_atcode(instr, str, sizeof(str));
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, JSVAL_NULL);
JSString* js_str = JS_NewStringCopyZ(cx, cp);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return(JS_TRUE);
}

Rob Swindell
committed
static JSBool
js_expand_atcodes(JSContext* cx, uintN argc, jsval* arglist)
{
jsval* argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char result[256] = "";
char* instr;
jsrefcount rc;

Rob Swindell
committed
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return JS_FALSE;
smbmsg_t* msg = (smbmsg_t*)sbbs->current_msg;

Rob Swindell
committed
if (!js_argc(cx, argc, 1))
return JS_FALSE;
JSVALUE_TO_MSTRING(cx, argv[0], instr, NULL);
if (instr == NULL)
return JS_FALSE;
if (argc > 1 && (JSVAL_IS_OBJECT(argv[1]) && !JSVAL_IS_NULL(argv[1]))) {
JSObject* hdrobj;
if ((hdrobj = JSVAL_TO_OBJECT(argv[1])) == NULL) {
return JS_FALSE;
if (!js_GetMsgHeaderObjectPrivates(cx, hdrobj, /* smb_t: */ NULL, &msg, /* post: */ NULL)) {
return JS_FALSE;

Rob Swindell
committed
rc = JS_SUSPENDREQUEST(cx);
sbbs->expand_atcodes(instr, result, sizeof result, msg);

Rob Swindell
committed
free(instr);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(JS_NewStringCopyZ(cx, result)));
return JS_TRUE;
}
js_logkey(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* p;
JSBool comma = false;
JSString* js_str;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if (argc > 1)
JS_ValueToBoolean(cx, argv[1], &comma);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
rc = JS_SUSPENDREQUEST(cx);
, comma ? true:false // This is a dumb bool conversion to make BC++ happy
);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
js_logstr(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* p;
JSString* js_str;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
js_finduser(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* p;
JSString* js_str;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if ((js_str = JS_ValueToString(cx, argv[0])) == NULL) {
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(0));
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(sbbs->finduser(p, /* silent_failure: */ true)));
JS_RESUMEREQUEST(cx, rc);
js_trashcan(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* str;
char* can;
JSString* js_str;
JSString* js_can;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 2))
return(JS_FALSE);
if ((js_can = JS_ValueToString(cx, argv[0])) == NULL) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if ((js_str = JS_ValueToString(cx, argv[1])) == NULL) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->trashcan(str, can)));
JS_RESUMEREQUEST(cx, rc);
js_newuser(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->newuser()));
JS_RESUMEREQUEST(cx, rc);
js_logon(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->logon()));
JS_RESUMEREQUEST(cx, rc);
js_login(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* name;
char* pw_prompt = NULL;
char* user_pw = NULL;
char* sys_pw = NULL;
JSString* js_name;
JSString* js_pw_prompt = NULL;
JSString* js_user_pw = NULL;
JSString* js_sys_pw = NULL;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 2))
return(JS_FALSE);
if ((js_name = JS_ValueToString(cx, argv[0])) == NULL)
JSSTRING_TO_ASTRING(cx, js_name, name, (LEN_ALIAS > LEN_NAME) ? LEN_ALIAS + 2 : LEN_NAME + 2, NULL);
if (name == NULL)
JSSTRING_TO_MSTRING(cx, js_pw_prompt, pw_prompt, NULL);
JSSTRING_TO_MSTRING(cx, js_user_pw, user_pw, NULL);
JSSTRING_TO_MSTRING(cx, js_sys_pw, sys_pw, NULL);
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->login(name, pw_prompt, user_pw, sys_pw) == LOGIC_TRUE ? JS_TRUE:JS_FALSE));
JS_RESUMEREQUEST(cx, rc);
FREE_AND_NULL(pw_prompt);
FREE_AND_NULL(user_pw);
FREE_AND_NULL(sys_pw);
return(JS_TRUE);
}
static JSBool
js_logoff(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
JSBool prompt = JS_TRUE;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if (argc)
JS_ValueToBoolean(cx, argv[0], &prompt);
rc = JS_SUSPENDREQUEST(cx);
if (!prompt || !sbbs->noyes(sbbs->text[LogOffQ])) {
if (sbbs->cfg.logoff_mod[0])
sbbs->exec_bin(sbbs->cfg.logoff_mod, &sbbs->main_csi);
sbbs->user_event(EVENT_LOGOFF);
sbbs->menu("logoff");
sbbs->sync();
sbbs->hangup();
JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_logout(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
js_automsg(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_time_bank(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
sbbs->time_bank();
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_text_sec(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_chat_sec(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
sbbs->chatsection();
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_qwk_sec(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
sbbs->qwk_sec();
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_xtrn_sec(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* section = (char*)"";
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
JSVALUE_TO_ASTRING(cx, argv[0], section, LEN_CODE + 1, NULL);
}
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
js_xfer_policy(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_batchmenu(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
sbbs->batchmenu();
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_batchdownload(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->start_batch_download()));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_batchaddlist(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
char* cstr;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_batch_clear(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
enum XFER_TYPE xfer_type = XFER_BATCH_DOWNLOAD;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
if (argc > 0 && argv[0] == JSVAL_TRUE)
rc = JS_SUSPENDREQUEST(cx);
bool result = batch_list_clear(&sbbs->cfg, sbbs->useron.number, xfer_type);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(result));
return(JS_TRUE);
}
static JSBool
js_batch_remove(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
enum XFER_TYPE xfer_type = XFER_BATCH_DOWNLOAD;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (argc > 0 && argv[0] == JSVAL_TRUE)
xfer_type = XFER_BATCH_UPLOAD;
rc = JS_SUSPENDREQUEST(cx);
if (argc > 1) {
if (JSVAL_IS_STRING(argv[1])) {
char* cstr{};
JSVALUE_TO_MSTRING(cx, argv[1], cstr, NULL);
result = batch_file_remove(&sbbs->cfg, sbbs->useron.number, xfer_type, cstr);
free(cstr);
} else if (JSVAL_IS_NUMBER(argv[1])) {
result = batch_file_remove_n(&sbbs->cfg, sbbs->useron.number, xfer_type, JSVAL_TO_INT(argv[1]));
}
}
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(result));
return(JS_TRUE);
}
static JSBool
js_batch_sort(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
enum XFER_TYPE xfer_type = XFER_BATCH_DOWNLOAD;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (argc > 0 && argv[0] == JSVAL_TRUE)
xfer_type = XFER_BATCH_UPLOAD;
rc = JS_SUSPENDREQUEST(cx);
bool result = batch_list_sort(&sbbs->cfg, sbbs->useron.number, xfer_type);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(result));
return(JS_TRUE);
}
static JSBool
js_xfer_prot_menu(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char keys[128];
jsrefcount rc;
enum XFER_TYPE xfer_type = XFER_DOWNLOAD;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
if (argc > 0 && argv[0] == JSVAL_TRUE)
if (argc > 1 && argv[1] == JSVAL_TRUE)
xfer_type = ((xfer_type == XFER_UPLOAD) ? XFER_BATCH_UPLOAD : XFER_BATCH_DOWNLOAD);
rc = JS_SUSPENDREQUEST(cx);
sbbs->xfer_prot_menu(xfer_type, &sbbs->useron, keys, sizeof keys);
JSString* js_str = JS_NewStringCopyZ(cx, keys);
if (js_str == nullptr)
return JS_FALSE;
JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str));
return JS_TRUE;
static JSBool
js_viewfile(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
char* cstr;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
if (!js_argc(cx, argc, 1))
return JS_FALSE;
JSVALUE_TO_MSTRING(cx, argv[0], cstr, NULL);
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->viewfile(cstr)));
free(cstr);
JS_RESUMEREQUEST(cx, rc);
return JS_TRUE;
}
static JSBool
js_sendfile(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char prot = 0;
char* desc = NULL;
bool autohang = true;
char* p;
jsrefcount rc;
char* cstr;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);

Rob Swindell
committed
JSVALUE_TO_ASTRING(cx, argv[1], p, 8, NULL);
if (p != NULL)
prot = *p;
uintN argn = 2;
if (argc > argn && JSVAL_IS_STRING(argv[argn])) {
JSVALUE_TO_MSTRING(cx, argv[argn], desc, NULL);
argn++;
}
if (argc > argn && JSVAL_IS_BOOLEAN(argv[argn])) {
autohang = JSVAL_TO_BOOLEAN(argv[argn]);
argn++;
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->sendfile(cstr, prot, desc, autohang)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_recvfile(JSContext *cx, uintN argc, jsval *arglist)
{
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
char prot = 0;
bool autohang = true;
char* p;
char* cstr;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);

Rob Swindell
committed
JSVALUE_TO_ASTRING(cx, argv[1], p, 8, NULL);
if (p != NULL)
prot = *p;
if (argc > 2)
autohang = JSVAL_TO_BOOLEAN(argv[2]);
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->recvfile(cstr, prot, autohang)));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_temp_xfer(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
sbbs->temp_xfer();
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_user_config(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
if (!(sbbs->useron.rest & FLAG('G'))) /* not guest */
sbbs->getuseron(WHERE);
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_user_sync(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
sbbs->getuseron(WHERE);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_sys_info(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_sub_info(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
int subnum = get_subnum(cx, sbbs, argv, argc, 0);
rc = JS_SUSPENDREQUEST(cx);
if (sbbs->subnum_is_valid(subnum))
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_dir_info(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
int dirnum = get_dirnum(cx, sbbs, argv[0], argc == 0);
rc = JS_SUSPENDREQUEST(cx);
if (sbbs->dirnum_is_valid(dirnum))
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_user_info(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_ver(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_sys_stats(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_node_stats(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 node_num = 0;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (argc > 0 && JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &node_num))
return JS_FALSE;
}
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_userlist(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 mode = UL_ALL;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (argc > 0 && JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &mode))
return JS_FALSE;
}
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_useredit(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
int32 usernumber = 0;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (argc > 0 && JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToInt32(cx, argv[0], &usernumber))
return JS_FALSE;
}
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_change_user(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
sbbs->change_user();
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_logonlist(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
char* args = (char*)"";
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
JSVALUE_TO_ASTRING(cx, argv[0], args, LEN_CMD, NULL);
}
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_nodelist(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_whos_online(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_spy(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
int32 node_num = 0;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if (JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToInt32(cx, argv[0], &node_num))
return JS_FALSE;
}
rc = JS_SUSPENDREQUEST(cx);
sbbs->spy(node_num);
JS_RESUMEREQUEST(cx, rc);
js_readmail(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 readwhich = MAIL_YOUR;
uint32 usernumber;
uint32 lm_mode = 0;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
usernumber = sbbs->useron.number;
if (argc > 0 && JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &readwhich))
return JS_FALSE;
}
if (argc > 1 && JSVAL_IS_NUMBER(argv[1])) {
if (!JS_ValueToECMAUint32(cx, argv[1], &usernumber))
return JS_FALSE;
}
if (argc > 2 && JSVAL_IS_NUMBER(argv[2])) {
if (!JS_ValueToECMAUint32(cx, argv[2], &lm_mode))
rc = JS_SUSPENDREQUEST(cx);
int result = sbbs->readmail(usernumber, readwhich, lm_mode);
JS_RESUMEREQUEST(cx, rc);
JS_SET_RVAL(cx, arglist, INT_TO_JSVAL(result));
return(JS_TRUE);
}
static JSBool
js_email(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 usernumber = 1;
uint32 mode = WM_EMAIL;
const char *def = "";
char* top = (char *)def;
char* subj = (char *)def;
JSString* js_top = NULL;
JSString* js_subj = NULL;
JSObject* hdrobj;
sbbs_t* sbbs;
smb_t* resmb = NULL;
smbmsg_t* remsg = NULL;
smbmsg_t msg;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
ZERO_VAR(msg);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if (JSVAL_IS_NUMBER(argv[0])) {
if (!JS_ValueToECMAUint32(cx, argv[0], &usernumber))
return JS_FALSE;
}
for (uintN i = 1; i < argc; i++) {
if (JSVAL_IS_NUMBER(argv[i])) {
if (!JS_ValueToECMAUint32(cx, argv[i], &mode))
return JS_FALSE;
}
else if (JSVAL_IS_STRING(argv[i]) && js_top == NULL)
js_top = JS_ValueToString(cx, argv[i]);
else if (JSVAL_IS_STRING(argv[i]))
js_subj = JS_ValueToString(cx, argv[i]);
else if (JSVAL_IS_OBJECT(argv[i]) && !JSVAL_IS_NULL(argv[i])) {
if ((hdrobj = JSVAL_TO_OBJECT(argv[i])) == NULL)
return JS_FALSE;
if (!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &resmb, &remsg, /* post: */ NULL)) {
if (!js_ParseMsgHeaderObject(cx, hdrobj, &msg)) {
JS_ReportError(cx, "msg hdr object cannot be parsed");
return JS_FALSE;
remsg = &msg;
}
}
JSSTRING_TO_MSTRING(cx, js_subj, subj, NULL);
if (subj == NULL) {
if (top != def)
free(top);
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->email(usernumber, top, subj, mode, resmb, remsg)));
smb_freemsgmem(&msg);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_netmail(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint32 mode = 0;
char* to = NULL;
char* subj = NULL;
JSString* js_str;
JSObject* hdrobj;
sbbs_t* sbbs;
smb_t* resmb = NULL;
smbmsg_t* remsg = NULL;
str_list_t to_list = NULL;
smbmsg_t msg;
jsrefcount rc;
bool error = false;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
ZERO_VAR(msg);
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
for (uintN i = 0; i < argc && !error; i++) {
if (JSVAL_IS_NUMBER(argv[i])) {
if (!JS_ValueToECMAUint32(cx, argv[i], &mode))
else if (JSVAL_IS_STRING(argv[i])) {
if ((js_str = JS_ValueToString(cx, argv[i])) == NULL) {
if (to == NULL && to_list == NULL) {
} else if (subj == NULL) {
JSSTRING_TO_MSTRING(cx, js_str, subj, NULL);
}
}
else if (JSVAL_IS_OBJECT(argv[i]) && !JSVAL_IS_NULL(argv[i])) {
if ((hdrobj = JSVAL_TO_OBJECT(argv[i])) == NULL) {
jsuint len = 0;
if (JS_GetArrayLength(cx, hdrobj, &len) && len > 0) { // to_list[]
for (jsuint j = 0; j < len; j++) {
jsval val;
if (!JS_GetElement(cx, hdrobj, j, &val)) {
if ((js_str = JS_ValueToString(cx, val)) == NULL) {
error = true;
break;
}
char* cstr = NULL;
JSSTRING_TO_ASTRING(cx, js_str, cstr, 64, NULL);
error = true;
break;
}
strListPush(&to_list, cstr);
}
continue;
}
if (!js_GetMsgHeaderObjectPrivates(cx, hdrobj, &resmb, &remsg, /* post: */ NULL)) {
if (!js_ParseMsgHeaderObject(cx, hdrobj, &msg)) {
JS_ReportError(cx, "msg hdr object cannot be parsed");
remsg = &msg;
}
}
rc = JS_SUSPENDREQUEST(cx);
if (!error)
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->netmail(to, subj, mode, resmb, remsg, to_list)));
smb_freemsgmem(&msg);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
static JSBool
js_bulkmail(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uchar* ar = NULL;
sbbs_t* sbbs;
jsrefcount rc;
char * p;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
ar = arstr(NULL, p, &sbbs->cfg, NULL);
rc = JS_SUSPENDREQUEST(cx);

rswindell
committed
free(ar);
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_upload_file(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint dirnum = 0;
sbbs_t* sbbs;
jsrefcount rc;
char* fname = nullptr;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
dirnum = get_dirnum(cx, sbbs, argv[0], argc == 0);
if (!dirnum_is_valid(&sbbs->cfg, dirnum)) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
if (argc > 1 && JSVAL_IS_STRING(argv[1])) {
if ((js_str = JS_ValueToString(cx, argv[1])) == NULL)
return JS_FALSE;
JSSTRING_TO_MSTRING(cx, js_str, fname, NULL);
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->upload(dirnum, fname)));
JS_RESUMEREQUEST(cx, rc);
static JSBool
js_batch_upload(JSContext *cx, uintN argc, jsval *arglist)
{
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->batch_upload()));
JS_RESUMEREQUEST(cx, rc);
return JS_TRUE;
}
js_bulkupload(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uint dirnum = 0;
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
dirnum = get_dirnum(cx, sbbs, argv[0], argc == 0);
if (!dirnum_is_valid(&sbbs->cfg, dirnum)) {
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
return(JS_TRUE);
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->bulkupload(dirnum) == 0));
JS_RESUMEREQUEST(cx, rc);
return(JS_TRUE);
}
js_telnet_gate(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uintN argn;
char* addr;
uint32 mode = 0;
uint32 timeout = 10;
JSString* js_addr;
sbbs_t* sbbs;
str_list_t send_strings = NULL;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
return(JS_FALSE);
if ((js_addr = JS_ValueToString(cx, argv[0])) == NULL)
JSSTRING_TO_MSTRING(cx, js_addr, addr, NULL);
argn = 1;
if (argc > argn && JSVAL_IS_NUMBER(argv[argn])) {
if (!JS_ValueToECMAUint32(cx, argv[argn], &mode)) {
++argn;
if (argc > argn && JSVAL_IS_NUMBER(argv[argn])) {
if (!JS_ValueToECMAUint32(cx, argv[argn], &timeout)) {
free(addr);
return JS_FALSE;
}
++argn;
}
if (argc > argn && JSVAL_IS_OBJECT(argv[argn])) {
JSObject* array = JSVAL_TO_OBJECT(argv[argn]);
jsuint count = 0;
if (array != NULL && JS_IsArrayObject(cx, array) && JS_GetArrayLength(cx, array, &count)) {
send_strings = strListInit();
size_t tmplen = 0;
for (jsuint i = 0; i < count; ++i) {
jsval val;
if (!JS_GetElement(cx, array, i, &val))
break;
JSVALUE_TO_RASTRING(cx, val, tmp, &tmplen, NULL);
strListPush(&send_strings, tmp);
}
free(tmp);
++argn;
}
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->telnet_gate(addr, mode, timeout, send_strings)));
strListFree(&send_strings);
JS_RESUMEREQUEST(cx, rc);
#define TG_MODE_UNSPECIFIED ~0U
static JSBool
js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist)
{
jsval* argv = JS_ARGV(cx, arglist);
uintN argn;
char* addr;
char* client_user_name = NULL;
char* server_user_name = NULL;
char* term_type = NULL;
bool fail = false;
uint32 mode = TG_MODE_UNSPECIFIED;
uint32 timeout = 10;
JSString* js_str;
sbbs_t* sbbs;
str_list_t send_strings = NULL;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
return(JS_FALSE);
if (!js_argc(cx, argc, 1))
if ((js_str = JS_ValueToString(cx, argv[0])) == NULL)
return(JS_FALSE);
JSSTRING_TO_MSTRING(cx, js_str, addr, NULL);
return(JS_FALSE);
/* Parse optional arguments if provided */
for (argn = 1; argn < argc; argn++) {
if (JSVAL_IS_STRING(argv[argn])) {
if ((js_str = JS_ValueToString(cx, argv[argn])) == NULL) {
if (client_user_name == NULL) {
JSSTRING_TO_MSTRING(cx, js_str, client_user_name, NULL);
} else if (server_user_name == NULL) {
JSSTRING_TO_MSTRING(cx, js_str, server_user_name, NULL);
} else if (term_type == NULL) {
JSSTRING_TO_MSTRING(cx, js_str, term_type, NULL);
}
} else if (JSVAL_IS_NUMBER(argv[argn])) {
if (mode == TG_MODE_UNSPECIFIED) {
if (!JS_ValueToECMAUint32(cx, argv[argn], &mode)) {
fail = true;
break;
}
} else {
if (!JS_ValueToECMAUint32(cx, argv[argn], &timeout)) {
fail = true;
break;
}
} else if (JSVAL_IS_OBJECT(argv[argn])) {
JSObject* array = JSVAL_TO_OBJECT(argv[argn]);
jsuint count = 0;
if (array != NULL && JS_IsArrayObject(cx, array) && JS_GetArrayLength(cx, array, &count)) {
send_strings = strListInit();
size_t tmplen = 0;
for (jsuint i = 0; i < count; ++i) {
jsval val;
if (!JS_GetElement(cx, array, i, &val))
break;
JSVALUE_TO_RASTRING(cx, val, tmp, &tmplen, NULL);
strListPush(&send_strings, tmp);
}
free(tmp);
}
if (!fail) {
if (mode == TG_MODE_UNSPECIFIED)
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist
, BOOLEAN_TO_JSVAL(sbbs->telnet_gate(addr, mode | TG_RLOGIN, timeout, send_strings, client_user_name, server_user_name, term_type)));
JS_RESUMEREQUEST(cx, rc);
FREE_AND_NULL(addr);
FREE_AND_NULL(client_user_name);
FREE_AND_NULL(server_user_name);
FREE_AND_NULL(term_type);
strListFree(&send_strings);
return(fail ? JS_FALSE : JS_TRUE);
js_pagesysop(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->sysop_page()));
JS_RESUMEREQUEST(cx, rc);
js_pageguru(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
rc = JS_SUSPENDREQUEST(cx);
JS_SET_RVAL(cx, arglist, BOOLEAN_TO_JSVAL(sbbs->guru_page()));
JS_RESUMEREQUEST(cx, rc);
js_multinode_chat(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
int32 channel = 1;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (argc > 1 && JSVAL_IS_NUMBER(argv[1])) {
if (!JS_ValueToInt32(cx, argv[1], &channel))
return JS_FALSE;
}
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
js_private_message(JSContext *cx, uintN argc, jsval *arglist)
sbbs_t* sbbs;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
rc = JS_SUSPENDREQUEST(cx);
JS_RESUMEREQUEST(cx, rc);
js_private_chat(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
JSBool local = false;
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (argc)
JS_ValueToBoolean(cx, argv[0], &local);
rc = JS_SUSPENDREQUEST(cx);
sbbs->privchat(local ? true:false); // <- eliminates stupid msvc6 "performance warning"
JS_RESUMEREQUEST(cx, rc);
js_get_node_message(JSContext *cx, uintN argc, jsval *arglist)
jsval* argv = JS_ARGV(cx, arglist);
sbbs_t* sbbs;
jsrefcount rc;
JSBool clearline = false;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_VOID);
if (argc > 0 && JSVAL_IS_BOOLEAN(argv[0]))
clearline = JSVAL_TO_BOOLEAN(argv[0]);
rc = JS_SUSPENDREQUEST(cx);
sbbs->getnmsg(clearline ? true : false);
JS_RESUMEREQUEST(cx, rc);
js_put_node_message(JSContext *cx, uintN argc, jsval *arglist)
jsval * argv = JS_ARGV(cx, arglist);
uintN argn = 0;
sbbs_t* sbbs;
int32 nodenum = 0;
JSString* js_msg;
char* msg = NULL;
char str[256];
char tmp[512];
jsrefcount rc;
if ((sbbs = js_GetPrivate(cx, JS_THIS_OBJECT(cx, arglist))) == NULL)
JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
/* Get the destination node number */
if (argn < argc && JSVAL_IS_NUMBER(argv[argn])) {
if (!JS_ValueToInt32(cx, argv[argn], &nodenum))
rc = JS_SUSPENDREQUEST(cx);
nodenum = sbbs->getnodetopage(/* all: */ TRUE, /* telegram: */ FALSE);
if (nodenum >= 1) { /* !all */
sbbs->getnodedat(nodenum, &node);
if ((node.misc & NODE_POFF) && !user_is_sysop(&sbbs->useron)) {
sbbs->bprintf(sbbs->text[CantPageNode]
, node.misc & NODE_ANON ? sbbs->text[UNKNOWN_USER] : username(&sbbs->cfg, node.useron, tmp));
return JS_TRUE;
}
}
/* Get the node message text */
if (argn < argc) {
if ((js_msg = JS_ValueToString(cx, argv[argn])) == NULL)
return JS_FALSE;
argn++;
JSSTRING_TO_MSTRING(cx, js_msg, msg, NULL);
} else {
sbbs->bprintf(sbbs->text[SendingMessageToUser]
, node.misc & NODE_ANON ? sbbs->text[UNKNOWN_USER]
: username(&sbbs->cfg, node.useron, tmp)
, node.misc & NODE_ANON ? 0 : node.useron);
sbbs->bputs(sbbs->text[NodeMsgPrompt]);
rc = JS_SUSPENDREQUEST(cx);
int result = sbbs->getstr(line, 69, K_LINE);
snprintf(str, sizeof str, sbbs->text[nodenum >= 1 ? NodeMsgFmt : AllNodeMsgFmt]
, sbbs->cfg.node_num
, sbbs->thisnode.misc & NODE_ANON
? sbbs->text[UNKNOWN_USER] : sbbs->useron.alias, line);
msg = strdup(str);
}
return JS_FALSE;
/* Send the message(s) */
BOOL success = TRUE;
rc = JS_SUSPENDREQUEST(cx);
if (nodenum < 0) { /* ALL */
for (int i = 1; i <= sbbs->cfg.sys_nodes && success; i++) {
if (i == sbbs->cfg.node_num)
sbbs->getnodedat(i, &node);
if ((node.status == NODE_INUSE
|| (user_is_sysop(&sbbs->useron) && node.status == NODE_QUIET))
&& (user_is_sysop(&sbbs->useron) || !(node.misc & NODE_POFF)))
if (putnmsg(&sbbs->cfg, i, msg) != 0)
success = FALSE;
}
Loading
Loading full blame...