No more temp files in data or data/temp ctrl/../temp (e.g. sbbs/temp) is the new default location for temporary files
Each server has its own separately configurable temp dir (in ctrl/sbbs.ini)
BBS events (e.g. QWK packet processing) now have their own exclusive-use
temp dir (e.g. sbbs/temp/event)
All server threads will attempt to create and verify the validity of their temp dir
The system temp directory is only used as the default temp dir for Unix (i.e. /tmp)
since the Windows default temp dir (e.g. C:\DOCUME~1\Rob\LOCALS~1\Temp) is not
particularly friendly or attractive
The startup/initialization file may now be named: ctrl/sbbs[.host | .platform].ini or ctrl/startup[.host | .platform].ini
New bool ARS keywords (convenience shorthand):
GUEST (shorthand for "REST G")
QNODE (shorthand for "REST Q")
Web Server
Win32-CGI support (tested with php-cgi.exe)
Created ctrl/cgi_env.ini which dictates which system environment variables
will be passed to CGI processes and which default or forced values they will have
Default CGI content-type is now configurable via sbbs.ini [web] DefaultCGIContent
(defaults to "text/plain")
Added CGI environment variable REDIRECT_STATUS=200 for PHP-CGI kludge (thx Deuce)
Added non-standard (Apache) SCRIPT_FILENAME environment variable required by PHP-CGI
Bug-fix: default server-side JavaScript file extension (".ssjs", not "ssjs")
Bug-fix: removed ":port" specification from vhost paths
When logging and using virtual hosts, log every virtual host in it's own
separate file in the format: (prefix)vhostname-date.log
Renamed sbbs.ini [web] CgiTempDirectory to just TempDirectory
(this directory is actually used for SSJS, not CGI)
Work-around: change current directory to ctrl directory during initialization
Deuce's .ssjs files
make assumptions about the current working directory when opening files
Created global JS variables: web_root_dir and web_error_dir
to be used in the
future instead of assuming that "../web/.." will be the correct location of a
specific file
Created global JS log() function (like all good servers should have)
JS print() is an alias for writeln()
Bug-fix: JS write() and writeln() methods must return string written
as other servers' implementations do
Add support for streaming-style .ssjs files If you set http_reply.fast to
true BEFORE the first write(), the first write will send the headers and
every write will go through the socket immediately
This will make large
.ssjs files appear to be faster (e.g. Large user lists)
CGI scripts now have STDIN directly from the socket. File uploads should
work again now
If a CGI script sends the LENGTH header, turn keep-alives on
New formmail.ssjs script to emulate Matt Wright's FormMail.pl script
New 404.ssjs file to display directory contents
[example]
Bug-fix: numerous memory leaks were present due to things being allocated, and structures being
zeroed every time through the redirect loop instead of per-request
Added external web-content handler support using ctrl/web_handler.ini
This should allow for competing dynamic HTML solutions based on server-side
JavaScript (e.g. .xjs).
Tip: use http_request.real_path for the path to file-to-be-parsed
This should also allow php-cgi.exe (for example) to automatically handle .php files
Bug-fix: when logging failed login attempts, was logging wrong password variable (i.e. garbage)
Mail Server
Bug-fixes: Numerous External Mail Processor (mailproc.ini) related problems
Set the "reply-to" header field on outbound mail if the local sender has their account configured to
forward received mail to a valid netmail address
SMTP RCPT TO command now fails if no recipient specified
Represent FidoNet addresses in "From:" header fields using "name" <ftn_addr>
notation (for Deuce)
Bug-fix: send "EHLO" (instead of "HELO") for SMTP relay attempts using SMTP authentication (which requires
the ESMTP extensions implied by the "EHLO" command)
Bug-fix: handle received multiple-hop (routed) QWK netmail correctly
If sending to a domain your system handles (i.e. system inetaddr, host name
or an entry in ctrl/domains.cfg), connect to the local SMTP server, by interface IP if server is
bound to a specific IP, or "127.0.0.1" if it is not
Reject (don't attempt to send to) MX records that resolve to 127.x.x.x
(e.g. sbcglobel.net [sic])
Bug-fix: handles attachments of multiple files specified in subject
(typically FTN netmail messages)
FTP Server
Now supports configurable IP address to use in PASV responses
(for broken firewall/NAT devices) and PASV port ranges (default is 1024-65535)
See the TCP/IP FAQ for more details
Added kludge required to work-around SMC Barricade router "P@SW" bug
Bug-fix: not allowing simultaneous downloads of the same file
Support "LIST -opts" command in local file system mode
Create tempory transfer files in the (*gasp*) temporary directory (instead of data directory)
Use more unique temporary transfer filenames (includes the local hostname)
If an aliased file or directory has a description of "hidden", don't display it
in directory listings
Created exec/ftp-web-html.js for sysops running the Synchronet Web Server
Uses HTTP for CSS and image files. Edit ctrl/sbbs.ini to use ftp-web-html.js instead of
the default ftp-html.js
Telnet/RLogin Server
Bug-fix: the Win32 list long filename feature didn't work correctly with filenames with
a less than 8 character base name
Bug-fix: if a file with a long filename was blind uploaded
(e.g. with SEXYZ or rz), then it would not be properly added to the database
(but the file would be copied to the destination directory)
Bug-fix: moving a file between directories would use the Micros~1 shortened version of the filename
When uploading a file, if no description is given, use the filename
(rather than "No description given") if the real filename is different than
the one in the database (e.g. it's a long filename)
Now passes QWKnet hub name as %s on QWKnet call-out command-line
Bug-fix: qnet-ftp will only delete the .REP packet if it was sent successfully
Delete/ignore the file ATTXREF.DAT if included in .REP packets
Ignore the "Your Messages Only" scan configuration flag for QWKnet accounts
Don't ask "Your Messages Only?" during scan configuration for QWKnet accounts
Bug-fix: when answering 'No' to the "Use an external text editor?" new user question, it would
not force the editor to the internal line editor
Bug-fix: hitting 'Q' from the external editor selection dialog,
the current editor would be changed anyway
Bug-fix: allow control keys (e.g. Ctrl-U) to have effect while waiting for paged node to respond
Bug-fix: buffer overflow (segfault) in temporary directory file extraction/transfer section
Subtle Bug-fix: when executing a native external program, the server process's
environment is no longer modified to set variables in the spawned process's
environment. This could result in a race condition where if multinodes executed
native externals simultaneously, one node's child process could get the wrong
node number (SBBSNNUM) or node directory (SBBSNODE) value (in theory).
This Bug-fix only applies to Win32 builds only
Changed parsing of DSZLOG (protocol.log) to account for long filenames and
filenames with spaces in them
Fix ups for new user creation via RLogin (Deuce)
Bug-fix: don't upper-case the file path when it's input for a new file in a text file section
Bug-fixes: interrupting users or chatting with users during logon process
New @-code: INCLUDE
Just like TYPE, except no auto-prepending of CRLF (blank line)
Used for including head.asc and tail.asc in the new menu/main.asc
The width of fixed-width @-codes may now be specified (as a decimal number)
following the -R or -L (right or left justification) appendage
Allows expanded text to be shorter than the unexpanded @-code length
(e.g. @NODE-L2@ for a left-justified 2 character node number)
Bugfix: Ctrl-A codes to move the cursor right (>0x7f) weren't working for non-ANSI users
New command-line specifier (%@) expands to exec dir on Win32
(same as %!), blank on Unix for use with info-zip command-lines
Command-lines containing filenames (%f) with spaces in them are now automatically
quoted as needed
Command-lines of external programs are now logged
Additional (potentially helpful) log output when detecting QWK pack semaphore
and mutex (lock) files
Bugfix: Baja/PCMS integer manipulation functions (e.g. ADD,SUB,MUL,DIV,AND, etc.)
did not work if the second argument was a string variable
Password masking now handles space characters correctly
ESC immediately followed by anything other than '[' is now handled immediately
Auto-terminating JavaScript modules:
If js.auto_terminate is true (the default value) and the remote user disconnects,
the script will automatically terminate
(use the new js.on_exit() method to have any critical clean-up functions perfomed during termination)
New Baja module/shell decompiler (from Deuce): unbaja
JavaScript
Bug-fix: predictable random numbers being returned from random()
Bug-fix: system.newuser_password and system.newuser_magic_word were reversed
Bug-fix: Queue objects can now have null encoded/enqueued and dequeued
without converting to an empty object or segfaulting
Bug-fix: a background-executed script (via load(true,...)) was not enqueueing
the result of the last evaluated statement if it was undefined
(some functions return undefined on failure)
Bug-fix: corrected link property for directories in libraries that use a "code prefix"
(the prefix isn't used in the FTP virtual directories)
JSexec-Unix: a SIGHUP will cause a recycle/re-run
JSexec: added -f option to force console output stream to non-buffered
JSexec: added -S option to set thread stack size limit, default is 256K bytes
This should keep JSexec from crashing due to the ircd recursion bug.
It'll log a JS exception/error and exit (or loop) instead
Use -S0 to set an unlimited thread stack size (not recommended)
JSexec: if error and console messages are redirected to files (using -e and -o options)
echo error messages to status output (default: stderr) as well
All string-modification methods now return undefined if passed an undefined
value (rather than converting to the string "undefined")
Enhancements: Queue.peek() and Queue.read() now support an optional timeout
argument (in milliseconds)
bbs.get_newscantime() now returns null on abort instead of undefined
It's been determined that null is the better error return value for functions
(for one, it's easier to to enqueue/dequeue)
New feature (requested by sinister-x), if a msg header object is passed to
bbs.post_msg(), it will be used for the in-relpy-to header fields and thread
linkage automatically
Always enqueue the result of a background-executed script (even if it fails with an
error)
If an argument is passed to exit(), enqueue that value instead
Global sleep() function now returns the number of elapsed timer ticks instead of undefined
Defined new global variable socket_errno, for debugging socket errors without an
associated Socket object
(e.g. failed resolve_ip() or resolve_host() calls)
On *nix, this
value will be the same as errno, but on Win32, it will be different
New global function: flags_str() to convert string flag representations
(e.g. "A-Z") to/from numeric representation (used in the user.security
properties)
New advanced function: js.report_error()
used to report errors using the internal JS error reporter
(passing false as the second argument causes the script to immediately terminate) log() should be used instead, for normal script error reporting
New console.printfile() mode flag: P_NOCRLF (defined in sbbsdefs.js)
Bug-fix: log() now treats a single numeric argument as the value to be logged rather than the log level
New advanced function: js.on_exit()
used to add a string to a last-in-first-out queue
of strings to be automatically evaluated/executed upon termination of the script
If a Date object is passed as the default value to File.iniGetObject(), return
a Date object
The object properties returned from MsgBase.get_msg_index() and get_msg_header()
(header and index fields) are now writable
SBBSecho
Work-around for BRE/FE inter-BBS attachment bug (remove pre-pended '^' from attached filename)
Fix case of attached files before placing in .?LO files (for Unix file system compatibility)
Now supports %@ (for info-zip), %., and %? command-line specifiers
in file pack/unpack command-line
Create RFC822 mesage-IDs for imported FTN echomail messages
(for later cross-referencing of posted replies via nntpservice.js)
Synchronet Console
Bug-fix: for log output, display control characters in ^X format
(ths should fix the mystery termination bug when ran from xterm and logging a Ctrl-E character)
Bug-fix: don't over-ride the Unix syslog facility type when using the sbbs -d option
and no facility type was specified
Allow the Unix syslog identity to be configured using the sbbs.ini [Unix] LogIdent key
Allow the Unix PID file name to be configured using the sbbs.ini [Unix] PidFile
(when daemonized only) default is still /var/run/sbbs.pid
Synchronet Control Panel (for Win32)
Bug-fix: hostname being set to "(null)" when importing registry settings from v3.00-v3.11
List of web server index files is now configurable
External changes to ctrl/sbbs.ini are now loaded when starting servers
Bug-fix: restore the current working dir (ctrl dir) when done selecting sound
files from configuration dialogs
Don't add selected sound files to recent documents history
Only request the minimum required security access in SCM calls
This allows sbbsctrl.exe to be run by non-admin users and still start/stop/monitor
Synchronet NT Services
Synchronet NT Services
If [-]help or [-]? is passed on the command-line, no longer attempts to start
service control dispatcher (just displays usage)
Usage is no longer displayed if the service control dispatcher is started successfully
"/options" are supported (as well as -options and just options)
When re-enabling a disabled service, sets the service's start type to "auto" or
"manual" based on the AutoStart settings in the startup file (e.g. sbbs.ini)
Added "list" command, to list service install/start mode and current state
Added "start" and "stop" commands to easily start and stop one or all services using sbbsNTsvcs
Added mute, unmute, and recycle commands
Allow short-hand service names on command-line (e.g. just "BBS" instead of "SynchronetBBS")
CHKSMB
Detect and report number of "in-transit" messages
Detect and report number of unvalidated moderated messages
ListServer
Work-around bug in v3.12a: remove msgtxt file to prevent mail server from
attempting delivery of list contributions to user #0
Stops parsing listserver commands when tear line (---) is reached
Export no messages if the list.ptr file is empty/invalid
Report an error if no listname was specified on the subscribe/unsubscribe command line
Beautified/unified log output (include "ListServer" in all output)
Don't send help text for every invalid command (just once)
Bug-fix: moderated message posting
Bug-fix: convert sub code to lowercase for use as index into msg_area.sub[] array
NewsLink
Bug-fix: If aborted due to disconnection, the import pointer would be off by one
causing the next article to not be imported the next time NewsLink was run
Use XOVER to get article headers (if supported on server) This reduces the
likelihood of requesting a bad article number which some servers now consider
worthy of disconnection!
Added -nx command-line option or "no_xover" newlink.cfg option to disable
XOVER-on-import support
Added an "unmangle" option to newslink.cfg (or -um on the command-line)
to automatically remove the NewsLink anti-spam measure from the e-mail address
(if present) in imported messages
If "NNTP-Posting-Host" header field is defined, compare value to contents of
ip and ip-silent trashcan/filter files.
Allows easy silent filtering of trash-canned twit/spammer IPs.
Requires the latest newsutil.js
NNTP Service
Added support for the LISTGROUP command (from RFC 2980)
Bug-fix: Don't allow guest/anonymous logins if the -na option is used
Bug-fix: Always logout the current user upon receipt of AUTHINFO PASS
Bug-fix: don't attempt to use msgbase.cfg for xref field:
use selected.newsgroup instead, which is always valid, even for the "mail" group
Bug-fix: treat messages posted by non-QWKnet accounts as "local" messages
(i.e. set header.from_net_type to NET_NONE)
This defeats the v3.12 "feature"
in msgbase.save_msg(), which auto-detects the from_net_type based on the
from_net_addr