***************************************************
* What's New in Synchronet Version 3.10 for Win32 *
* (ChangeLog since v3.00c for Win32 Dec 31, 2000) *
***************************************************

$Id: v310_new.txt,v 1.12 2003/02/28 10:24:45 rswindell Exp $

Highlights
~~~~~~~~~~
o Server-side JavaScript for dynamically-loaded BBS modules 
  and dynamic-HTML indexes for FTP server

o GUI Configuration Wizard

o TCP socket and FTP client support in loadable modules

o Support for embedded file descriptions (FILE_ID.DIZ/DESC.SDI) in FTP server

o Improved support for multiple SBBSCTRL instances

o Improved support for external DOS/FOSSIL programs (doors)

o Additional configurability/programmability options


General
~~~~~~~
o Support for '*' wildcard syntax in trashcan/filter files
  (e.g. "24.0.193.*" or "*.ppp.someisp.com")


Control Panel
~~~~~~~~~~~~~
o New Configuration Wizard
  - Automatically runs on fresh install
  - Asks basic required questions
  - Hopefully eliminate some FAQs and common newbie-sysop errors

o New MinimizeToSysTray option
  - Minimizes SBBSCTRL to an icon in the system tray
  - Icon animates when there are active clients
  - Icon tool-tip reports number of active clients
  - Double-click icon to restore SBBSCTRL window
  - Right-click for pop-up menu of frequently-used menu items

o New "Events" window for event-thread log messages and status
  - No longer clutters Telnet Server log

o QWK message events (e.g. for FTP-QWK transfers) can be disabled per-instance
  using the new "QWK Events" checkbox (defaults to enabled)
  - Required for multiple instances of SBBSCTRL

o New Control Panel Properties Dialog (File->Properties)
  - Allows configuration of LoginCommand, ConfigCommand, etc.

o Configurable Node and Client window display intervals 
  (previously hard-coded to 1 and 5 seconds, respectively)

o Closing no longer interferes with Windows shut-down procedure

o Sorting by first/last-on dates in User List now works correctly

o Added to the BBS->Edit menu: 
  - New user password (NUP) failure message (text/nupguess.msg)
  - Nodes full message (text/nonodes.txt, previously hard-coded)
  - Logon message (text/menu/logon.asc)
  - Auto-message (data/msgs/auto.msg)

o Eliminated possibility of over-writing registry values with defaults
  if SBBSCTRL is immediately shut-down before initialization has completed

o SBBS.DLL version is now checked and verified (can't mix versions)

o Minor cosmetic improvements (e.g. FTP server configuration dialog)
  - Fixed tab orders and enabled more control hints (tool-tips)

o Revamped Node Window
  - Improved handling of NODE.DAB read/locking errors
  - New popup menu item to refresh display
  - New keyboard short-cuts for all popup menu items

o Spy Window fix: KeyboardActive checkbox alternating checked status and 
  not reflecting previously saved value

o Link to Online Docs (http://www.synchro.net/docs) on Help menu

o Statistics window update interval (previously hard-coded to 5 seconds) now 
  configured via SCFG->Nodes->Node 1->Advanced Options->Statistics Frequency


Telnet Server
~~~~~~~~~~~~~
o Server-side JavaScript Support for Loadable Modules
  - Full support for Core JavaScript objects and classes:
    - Global (extended and enhanced)
    - Object
    - Function
    - Array
    - String
    - Boolean
    - Number
    - Date
    - Math
    - RegExp (Perlesque regular expressions)
  - Includes Netscape server-side File class
  - Both a procedure and object-oriented language
  - Substantially more powerful language than Baja
  - No "compiling" required (don't ever lose your source code again)
  - For more info on Core JavaScript, see http://mozilla.org/js
  - See exec/*.js for examples
  - Baja modules and command shells are still fully supported
  - Execute JS via command-line with "?modulename" instead of "*modulename"
  - New and evolving ASP/DOM-like Synchronet Object Model:
    - system
    - system.stats
    - system.node_list[]
    - server
    - client
    - user
    - file_area
    - file_area.lib_list[]
    - file_area.lib_list[].dir_list[]
    - Socket (class)
    - User (class)
  - Telnet-specific objects:
    - bbs
    - console

o Improved auto-terminal-type detection
  - Telnet option negotiation occurs before auto-detection sequence 
    (for CRT compatibility)
  - Added ANSI save and restore cursor position codes to sequence 
    (for HyperTerminal compatibility)

o New inactivity (H) exemption
  - Eliminates "Are you still there?" prompt and auto-disconnection for 
    specific users
  - Add to your exec/logon.src (if upgrading):
    compare_ars exempt H
    if_true
        or _console CON_NO_INACT
        end_if

o New @-codes:
  - FULL_VER            Synchronet version and revision
  - VER_NOTICE          Synchronet version notice
  - OS_VER              Operating system name and version
  - JS_VER              JavaScript implementation version
  - PLATFORM            Platform name (e.g. Win32, Linux, etc)
  - COPYRIGHT           Copyright notice
  - COMPILER            Compiler name and version
  - SOCKET_LIB          Socket library name and version
  - MSG_LIB             Message library name and version
  - HOST                Now contains FULL (untruncated) host-name
  - AGE                 User's age (in years)

o Configurable "Nodes full" message (via text/nonodes.txt)

o Better handling of DLL/EXE version mis-matches

o Quicker response to Ctrl-C (abort) command

o Fixed Guru Chat GPF/segfault bug

o Screen pause is disabled while at the private message (Ctrl-P) prompt

o Chat Menu is fully reprogrammable using PCMS (Baja or JavaScript)
  - See exec/chat_sec.src for example

o No longer logs (or displays locally) failed password attempts if the sysop 
  has so configured the system in SCFG

o Fixed problems with changing first/last node parameters during run-time
  - New first/last node parameters don't take effect until server is restarted

o Input and output threads now log/display number of bytes and packets 
  sent/received upon termination

o Changed NODE.DAB locking failure delays (earlier and longer)

o Process directory is now changed to the ctrl directory during initialization

o Uninitialized port numbers (set to 0) are now set to sensible defaults 

o External Program enhancements/fixes:
  - Added %~ command-line specifier for DOS-compatible (8.3) filename
    (use in place of %f to convert long filenames to DOS-compatible)
  - Added SBBSCTRL environment variable when running native external programs
  - Moved exec_mutex protection to cover all types of executables 
    (fixed problem with I/O occasionally going to wrong node/user)
  - Improvement resource clean-up for Win32 version
  - Sets Baja-retrievable errorlevel

o Binary receive mode is automaticaly disabled when returning 
  from external programs
  - Some Telnet clents (e.g. HyperTerminal) enable Binary mode when
    transferring files, but do not disable Binary mode when done.
    This causes transmitted CR/LF pairs to be interpretted as two
    separate characters (instead of one)

o Added support under Win9x/Me for "naughty" FOSSIL programs/doors
  - DOSXTRN.EXE now includes a 16-bit ISR stub for FOSSIL programs/doors
    that DO NOT generate interrupts (e.g. IceEdit, Operation Overkill II, etc)

o Improved background DOS program/door performance under Win9x/Me
  - DOS/FOSSIL driver (SBBSEXEC.VXD) now schedules VM upon user input
  - Most noticable performance gain with Global War

o Reduced CPU utilization for DOS programs/doors under WinNT/2K
  - DOS/FOSSIL driver (SBBSEXEC.DLL) now yields time-slices for programs
    that poll for input (similar to how TAME operates)
  - No more 100% CPU usage from games like LORD, TradeWars, BRE, etc

o Improved disconnected-user detection while running DOS/FOSSIL doors
  - Periodic sending of telnet GA (go-ahead) command

o Non-exclusive timed events now run in the background automatically
  - Allows multiple simultaneous events and asynchronous execution
  - Has nothing to do with child window appearance or priority

o Timed event codes are now logged/displayed in uppercase (cosmetic only)

o Fixed bug in random number generation

o No longer prompts for "Forward To Netmail" if the option is disabled in SCFG

o Optional e-mail/netmail address filter/trashcan file (text/email.can) 

o Event loop delay (previously hard-coded to 1 second) now configured via 
  SCFG->Nodes->Node 1->Advanced Options->Semaphore Frequency
  

Baja v2.3
~~~~~~~~~
o Partially compiled .BIN files are now deleted

o New Control Flow Functions:

  - LOOP                Begins an execution loop (nesting supported)
  - CONTINUE            Continues an execution loop
  - BREAK               Breaks an executuion loop
  - END_LOOP            Ends an execution loop

o New TCP/IP Functions:

  - SOCKET_OPEN         Create/open a TCP/IP socket
  - SOCKET_CLOSE        Close a socket
  - SOCKET_CONNECT      Initiate outbound connection
  - SOCKET_ACCEPT       Accept an inbound connection
  - SOCKET_NREAD        Get number of bytes ready to read
  - SOCKET_PEEK         Peek at receive buffer
  - SOCKET_READ         Read from socket
  - SOCKET_WRITE        Write to socket
  - SOCKET_CHECK        Check socket connection status
  - SOCKET_READLINE     Read a CR/LF terminated line of text

  - FTP_LOGIN           Login to a remote FTP server
  - FTP_LOGOUT          Logout from a remote FTP server
  - FTP_PWD             Print current working directory
  - FTP_CWD             Change current working directory
  - FTP_DIR             Display current directory listing
  - FTP_PUT             Send (upload) a file to server
  - FTP_GET             Receive (download) file from server
  - FTP_RENAME          Rename file on server
  - FTP_DELETE          Delete file from server

o Miscellaneous New Functions:

  - INCHAR              Case-insensitive version of INKEY
  - COPY_CHAR           Copy current cmdkey to int var or str var
  - COMPARE_ANY_BITS    Compares bits in any two integers
  - COMPARE_ALL_BITS    Compares bits in any two integers
  - SHIFT_TO_FIRST_CHAR Shifts string to first occurance of char
  - SHIFT_TO_LAST_CHAR  Shifts string to last occurance of char
  - FILE_RECEIVE        Like FILE_PUT, but doesn't require sys pass
  - LPRINTF             Local printf (to local console)

o New BBS Functions:

  - FILE_RECEIVE        Same as FILE_PUT, but no system password required
  - MULTINODE_CHAT      Joins a specified multinode chat channel
                        (used in new exec/chat_sec.src)

o New System Variables (defined in exec/sbbsdefs.inc):

  - _FTP_MODE           FTP operating modes (see FTP_* constants)
  - _CLIENT_SOCKET      Current telnet client's socket handle
  - _SOCKET_ERROR       Last socket error
  - _STARTUP_OPTIONS    BBS startup options (See BBS_OPT_* constants)


FTP Server v1.10
~~~~~~~~~~~~~~~~
o Dynamic HTML Index support using Server-Side JavaScript 
  - See exec/ftp-html.js for source code
  - Additional FTP-specific objects:
    - ftp.path
    - ftp.sort
    - ftp.reverse
    - ftp.file_list[]
    - ftp.dir_list[]
    - ftp.curlib
    - ftp.curdir
    - ftp.html_index_file

o Automatic support for embedded file descriptions (FILE_ID.DIZ and DESC.SDI)

o Detected hack/intrusion attempts are now logged to data/hack.log

o Directory listings are now sorted alphabetically (ala Unix)

o Failure to create uploaded file (e.g. directory not created) bugs fixed:
  - Error message cause gpf/segfault
  - No 450 error response to client

o Resumed downloads (using FTP "REST" command) fixed (wrong response code)

o Now uses control port-1 (normally 20) as TCP port for all active data 
  sessions
  - Fixes problem of locating FTP server behind intelligent firewalls

o Added active/passive mode indication to upload/download log output

o Configurable QWK packet creation timeout 
  - defaults to 10 minutes, previously hard-coded at 5 minutes

o No longer logs (or displays locally) failed password attempts if the sysop 
  has so configured the system in SCFG

o Fixed mutex leak in Win32 build when stopping/restarting FTP server

o Fix to disallow viewing of (ASCII or HTML) index file for aliased directory
  where user has insufficient access to list files
  (e.g. "/main/uploads" aliased as "/incoming" in ctrl/ftpalias.cfg)

o Shortened thread shutdown timeout (from 60 seconds to 15)

o Fixed upload filename bug in non-Win32 flavors

o Now disallows uploading of dynamic index filenames (if enabled)

o Sending a 0-length file is no longer treated as a failed download

o The path to the upload or sysop directory can now be specified with the STOR 
  (upload) command
  - previously, you had to change the current directory first

o Fixed occasional GPF/segfault during shutdown

o Fixed case sensitivity problem with locally added files via telnet

o Optional "hack attempt" sound file (Win32 version only)

o Optional e-mail address filter for guest account passwords


Mail Server v1.11
~~~~~~~~~~~~~~~~~
o SMTP Sending to a forwarded address (251 response) fixed

o POP3 port, address, hostname activity logged

o Now supports destination address hostnames starting with a digit

o No longer logs (or displays locally) failed password attempts if the sysop 
  has so configured the system in SCFG

o Shortened thread shutdown timeout (from 60 seconds to 15)

o Uninitialized startup values are now set to sensible defaults 

o Fixed memory leak if server stopped and re-started


***********************************************************
* What's New in Synchronet Version 3.10 Revision C (Beta) *
***********************************************************

Telnet Server
~~~~~~~~~~~~~
o 0-byte QWK packets are now simply ignored rather than generating errors
  - It is assumed the file is still being downloaded by another process

o Configurable number of polls before yield for NT/2K/XP fossil driver
  - Allows tuning of multitasker TAME-like performance
  - Was previosly hard-coded to 10, values of 5000+ improve LORD and LORD IGM 
    RIP detection but increases CPU usage for BRE and possibly other doors

o Fixed old bug: anonymous uploads weren't flagged as anonymous unless the 
  entire directory was forced anonymous

o Fixed new bug: FidoNet echomail semaphore files weren't working

o Password display char is now configurable as the fourth character in the 
  last line of the text.dat - defaults to 'X' if not specified
  - third char is currently ignored but is reserved for for configurable
    "quit" character in the future (currently hard-coded to 'Q')

o When replying to mail, no longer prompts to delete message if message was 
  already flagged for deletion (caused unintential UN-deletion of message)

o Fixed Baja bugs: SYSOP_PAGE and GURU_PAGE functions set reversed logic state

o Improved internal chat page performance (random tones) - rarely used


JavaScript
~~~~~~~~~~
o Improved Socket class 
  - last_error property is maintained on a per-instance basis
  - externally created sockets won't be closed on deletion

o Added global sound() function to play external WAV files 
  - use sound.js module via command-line (e.g. for external chat pager)


FTP Server v1.10
~~~~~~~~~~~~~~~~
o JavaScript contexts are only created when needed
  - should improve performance, reduce memory usage, and improve reliability

o Fixed bug: anonymous uploader names were shown in directory listings

o Fixed bug: daily user statistics (logons today, time used today, etc) were
  not being reset if user was logged in during the date change (12 midnight)

o Fixed bug: logoff was setting timed-used-last-call to number of 'seconds'
  used rather than 'minutes'

o Implemented security considerations recommended in RFC2577:
  - Added a 5 second delay after each failed login attempt
  - Session is terminated after 3 failed login attempts
  - Port command supports ports >=1024 only, defeats "bounce attack"


Mail Server v1.11
~~~~~~~~~~~~~~~~~
o Updated mail-abuse.org DNS and HTTP server addresses 
  (for RBL/RSS/DUL SPAM rejection)

o Creates data/spam.log listing every rejected SPAM attempt

o Fixed bug: logoff now handles resetting of user's daily statistics

o Time used during POP3 sessions are now added to user's timeon stats


***********************************************************
* What's New in Synchronet Version 3.10 Revision D (Beta) *
***********************************************************

Control Panel
~~~~~~~~~~~~~
o Fixed linker problem in v3.10c that caused various control panel functions
  to not work or generate access violations or exceptions


Telnet Server
~~~~~~~~~~~~~
o Bug fixes in Online user editor (;UEDIT) when searching based on ARS
  potential memory leak if disconnected and access violation on blank string

o Remote sysops can now give flags and exemptions (using the internal user 
  editor) to users even if they themselves don't have that specific flag or 
  exemption as long as the user has a lower security level than the sysop


***********************************************************
* What's New in Synchronet Version 3.10 Revision E (Beta) *
***********************************************************

Control Panel
~~~~~~~~~~~~~
o Forms are now not "undockable" (they can't be dragged and undocked)
  by default
  - Undockable property toggled in File->Properties dialog

o Log and List colors and fonts are now customizazble via registry keys:
  HKEY_CURRENT_USER/Software/Swindell/Synchronet Control Panel

o File->Properties dialog now contains tool tips

o New Mail->View->SPAM Log menu item

o New Mail->Edit->Domain List menu item to edit domain alias list

o Mail->Edit->Allowed Relay List menu item now edits ctrl/relay.cfg
  instead of text/relay.can (same format and purpose)

o New BBS->Reload Configuration menu item (and toolbar button)
  -Reloads configuration in sbbsctrl and all nodes (when possible)

o Configuration Wizard now loads at appropriate time during "first run"

o Configuration is automatically reloaded after Wizard is run at any time

o New "Lookup Idenity" checkbox in Telnet configuration dialog


GUI User Editor
~~~~~~~~~~~~~~~
o Fixed problems with disabling expiration dates (setting to 00/00/00)


JavaScript
~~~~~~~~~~
o New file_remove() global method/function
o Global exit() method/function now clears pending exceptions
o Created new File class to replace Mozilla's crappy implementation
  - Methods:
        open([mode string], [buflen]) - mode string ala fopen()
        close()
        remove() - deletes file if unopen
        clear_error()
        flush()
        lock(offset, length) - provides record locking
        unlock(offset, length)
        read([length])
        readln([length])
        readBin([size]) - read binary integers of 1, 2, or 4 bytes
        readAll() - read all lines and return as an array
        write(string, [length])
        writeln(string)
        writeBin(val, size])
        writeAll(array)
  - Properties:
        name       [readonly] - filename
        mode       [readonly] - mode string
        exists     [readonly] - file exists?
        date       [readonly] - time_t format
        is_open    [readonly] - file open?
        eof        [readonly] - end of file?
        error      [readonly] 
        descriptor [readonly] - no known use at this time
        etx - end of text character (defaults to 0/NULL)
        debug - enable debug output
        position   (ala seek)
        length     (size in bytes)
        attributes (OS-dependant)
  - see http://synchro.net/docs/js.html for details (in the works)


Baja v2.31
~~~~~~~~~~
o New MATCHUSER function to get the number of a user by name
  - Used in login.src to dynamically detect Guest account


Telnet Server
~~~~~~~~~~~~~
o Added identity look-up and log during logon 
  - using IDENT protocol often utilized by IRC clients/servers

o Added user name to New User dupliate IP warning

o Fixed problem with ZModem/FDSZ file transfers on NT-based OSes

o Event command-lines are now logged to the event log window

o Includes updated DOSXTRN.EXE to allow configurable "polls before yield"
  on NT-based OSes (forgotten in rev D beta)

o Removed unused global Baja variable: CAP_FNAME

o Cleaned up/beautified the log output a bit

o Fixed potential race condition/crash when re-running a node right as
  a client was connecting

o Potentially helpful log message on failure to bind to server port
  - "Another service may be using this port"

o Potentially helpful log message when remote sysop login attempted
  but disabled in SCFG

o Event log output on network call-out

o More fine-grained checking of 'C' restriction in chat functions

o Cleaned up error.log entries 
  - eliminated misleading/unnecessary source code path
  - eliminated useless doserrno

o QWK improvements
  - Added time-slice yields while creating QWK messages.dat file
  - Logs/displays total number of bytes packed in QWK packets
  - Calculates and displays number of sub-boards scanned
  - Beautified the static config menu

o New message scans now calculate and dipslay number of sub-boards scanned

o More configurable text in ctrl/text.dat
  - SendingMessageToUser
  - SendingTelegramToUser
  - TelegramFmt
  - MsgSentToUser
  - PagingUser
  - PrivateChatSeparator
  - SysopChatSeparator
  - SystemPassword
  - InvalidNetMailAddr
  - YNQP (Yes/No/Quit/Password chars)

o In password-entry mode, non-destructive backspace now deletes the
  password char (which is now configurable in ctrl/text.dat)

o @nopause@ and @poff@ codes now work as expected (disabling pause) in
  text/answer.* files
  - Ctrl-AQ trick no longer necessary

o New @-codes:
  - EMAILADDR - user's Internet e-mail address on your system
  - RESETPAUSE - resets line counter for auto-pause (same as Ctrl-AQ)

o Eliminated many hard-coded colors (uses colors from ctrl/attr.cfg instead)


Mail Server v1.11
~~~~~~~~~~~~~~~~~
o New optional ctrl/domains.cfg file can be used to list additional domain
  name aliases to receive mail for
  - wildcards are allowed, e.g. "*.synchro.net"

o Allowed relay list is now stored in ctrl/relay.cfg instead of
  text/relay.can
  - .can files are used for trashcan/filter files

o SendMail thread will now stop sending mail when the server is terminated

o Potentially helpful log message on failure to bind to server port
  - "Another service may be using this port"

o Eliminated potential lock-ups waiting to receive data while looking up
  DNS MX records and while waiting for SMTP respones in SendMail thread


FTP Server v1.10
~~~~~~~~~~~~~~~~
o Fixed potential race condition and segfault while
  "waiting for transfer to complete" upon server termination

o Potentially helpful log message on failure to bind to server port
  - "Another service may be using this port"

o Displays telnet command descriptions rather than decimal value 
  - yes, telnet commands can, and often are, sent on the FTP control port


***********************************************************
* What's New in Synchronet Version 3.10 Revision F (Beta) *
***********************************************************

General
~~~~~~~
o Now using select() before send() or recv() to eliminate potential TCP/IP
  socket blocking problems

o Much improved Linux-build functionality and FreeBSD compatibility
  (X/Y/Zmodem file transfers, native external programs, stdio doors, etc)

o Improved user name matching using underscore and dot replacement
  (e.g. "Dr._Seuss" will match "Dr. Seuss")

o Sysop psuedonym matching is now performed in global matchuser function
  - Basically, anywhere a user name or number can be specified, "Sysop",
    "Postmaster", the configured sysop name (in SCFG) and the system's QWK
    ID will all be considered pseudonym's for user record #1

o Sped up getuserdat() significantly by eliminating call to lastuser->flength
  - this has a side-effect of greatly improving the load-time for the 
    SBBSCTRL:View->User->List menu item and other places in the BBS

o No longer logs <no name> host name if host name lookup is disabled


Control Panel
~~~~~~~~~~~~~
o Fixed Mail Server POP3 sound file configuration

o Fixed the slow close of the User List

o Uninitialized user genders are no longer printed as garbage

o New menu item SBBSCTRL:BBS->Filters->Email Subject Filters

o Added NT-compatible work-around for default LoginCommand 
  ("start telnet://localhost")

o FTP and Mail server logs are now opened shareable (deny none)

o New "Services" window, see below for details


JavaScript (http://synchro.net/docs/js.html)
~~~~~~~~~~
o Each client gets its own JS-runtime to improve multi-threaded reliability
  - This will hopefully eliminate all the JS reliability issues

o New bbs.nodesync() method

o bbs.text() returns null on invalid index (instead of static string)

o Fixed a couple of bugs in Socket.recvline method:
  1. was incrementing buffer char pointer even when there was no new data
  2. was not releasing time-slices when there was no new data
  - This same fix was applied to the Baja SOCKET_READLINE function

o Socket recv, recvline, and peek methods now return null when there is a 
  time-out or no data (instead of an empty string)

o Socket recvline/readline method now supports an optional 'timeout' parameter 
  (second argument)

o Socket recvline method will now truncate \n terminated lines correctly

o Dynamic instances of User class were missing stats and security properties

o Changed User class email property to reflect user's BBS e-mail address
  - Different from the netmail property - their external e-mail address

o New global methods:
    log(str)    - Log specified string to log window and/or file

o System object
    New properties:
        system.uptime   - Time system was brought "up" (in time_t format)
                          Subtract from time() to get seconds "up"
    New methods:
        alias(username) - Returns aliased user name (from ctrl/alias.cfg)
        timestr([time]) - Returns string representation of specified time
                          or current time if not specified

o New msg_area object
    properites:
        msg_area.grp_list[].name
        msg_area.grp_list[].description
        msg_area.grp_list[].sub_list[].name
        msg_area.grp_list[].sub_list[].description
        msg_area.grp_list[].sub_list[].code
        msg_area.grp_list[].sub_list[].newsgroup
        msg_area.grp_list[].sub_list[].can_read
        msg_area.grp_list[].sub_list[].can_post
    (see exec/nntpservice.js for example)

o New MsgBase class - constructor: new MsgBase("code")
    properties:
        MsgBase.last_error
        MsgBase.file
        MsgBase.debug
        MsgBase.retry_time
        MsgBase.first_msg   
        MsgBase.last_msg    
        MsgBase.total_msgs
        MsgBase.max_crcs    
        MsgBase.max_msgs    
        MsgBase.max_age     
        MsgBase.attributes
    methods:
        MsgBase.close()
        MsgBase.get_msg_header(bool by_index, number)
        MsgBase.get_msg_body(bool by_index, number, bool strip_ctrl_a)
        MsgBase.save_msg(header, body)
    (see exec/nntpservice.js for example)


Synchronet Services
~~~~~~~~~~~~~~~~~~~
o Services are TCP servers that are launched dynamically by Synchronet when an
  inbound connection is detected on a specific TCP port (ala Unix inetd)

o Services are normally written in JavaScript, but native (32-bit) services are
  also suppoorted 
  - Native services must be able to receive socket descriptor on command-line

o Stock "sample" services:
  - Finger (exec/fingerservice.js)
  - Gopher (exec/gopherservice.js)
  - HTTP/HTML node list (exec/nodelist-html.js)
  - NNTP, Network News Transfer Protocol (exec/nntpservice.js)

o Services are configured with ctrl/services.cfg

o The Finger service along with the SMTP telegram support creates a new 
  Inter-BBS "Instant Messaging" technology using standard Internet protocols

o Expect to see more standard Internet server protocols supported with 
  Synchronet services in the near future, as well as-yet-to-be-invented 
  technologies


Telnet Server
~~~~~~~~~~~~~
o New finger client (exec/finger.js) launched with the [F]inger command from 
  the chat menu

o New Inter-BBS "Instant Messaging" module (exec/sbbsimsg.js) launched with the
  [I]nstant message command from the chat menu

o Increased delay after ANSI cursor position report (detection response) is 
  received
  - This increases the likelyhood of detecting RIPscrip support properly in
    RIPtel

o Non-QuickBBS/MSGTMP-sytle external editors now use the TEMP directory as the
  current directory and the location of the temporary message files 
  (for additional security)

o Added support for editing existing messages using QuickBBS/MSGINF-style 
  external editors

o Batch download programs can now use %s to represent the full list of files
  to be downloaded (required for Unix sb/sz support)

o Beautified the temp directory listing a bit

o Fixed a really old bug where you couldn't 'R'emove files from the temp dir

o Max QWK message limit now applies to Q-restricted accounts too

o Added new 'O' (QWK packet size) exemption

o Detailed log entries now include user's alias

o userlist will now sort up to 2500 users (previously limited to 1000)

o Changed wildcard use to be more Unix-like ("*" means all files)

o SEND/RECEIVE_FILE functions now use higher level protocol function 
  - prompt for hangup after transfer, handles log parsing, etc.

o @nopause@ and @poff@ codes now disable all pauses, even on screen clears

o New @-code:
  - UPTIME - System up-time in days, hours and minutes

o Fixed potential lock-up in getstr if input_thread is unexpectedly terminated

o inkey now recognizes and adheres to the K_UPPER mode bit

o getkey no longer asks if user is still there if cfg.sec_warn is equal to
  cfg.sec_hangup

o getkey releases time-slices when called with node offline or input_thread not
  running (just in case)

o Added optional date/time argument (%s) to ctrl/text.dat/AutoMsgBy (line 42)


Events
~~~~~~
o Added more event log output, especially concerning exclusive events

o Added one hour time-outs while waiting for exclusive events
  - prevents extended down-time waiting for an unresponsive node or event

o Removed redundant node_daily event execution at end of node_thread 
  - already handled in event_thread


Mail Server v1.11
~~~~~~~~~~~~~~~~~
o POP3 server supports login by alias (from ctrl/alias.cfg)

o SMTP server now rejects mail if there is no body text

o Added ability to post on a sub-board via SMTP (sub:code@host)
  - best to use alias.cfg for this feature (e.g. "syncprog sub:syncprog")

o Support for receving SEND/SOML/SAML SMTP commands (which create telegrams)
  - used in new Inter-BBS "Instant Messaging" technology

o Set a hard maximum number of recipients in a given mail session 
  - currently 1000

o Added last_error strings to smb_getmsgtxt() error log entries for better 
  error reporting

o Added text/email.can and text/subject.can checking as sysop-configurable
  Spam filters

o Illegal relay attempts are now logged in the SPAM.LOG as Spam attempts

o SMTP server now supports messages missing the 'From' field 
  - uses MAIL FROM: return-path

o SMTP server supports external address aliases (you@somedomain.com = sysop) in
  the ctrl/alias.cfg file

o Original destination address is now stored in "name" field of message header


FTP Server v1.10
~~~~~~~~~~~~~~~~
o Periodic transfer progress reports occur even when no data is transferring

o Progress report cps rates are now per-report rather than for total file

o If resuming a transfer, file offset is now shown in progress reports


***********************************************************
* What's New in Synchronet Version 3.10 Revision G (Beta) *
***********************************************************

General
~~~~~~~
o Added user number validation to data functions to eliminate potential user
  database corruption by external programs

o New ARS keyword: SHELL
  - used to specify the user's command shell as an access requirement


Configuration Utility (SCFG) Updated for Version 3.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o True Win32 console mode application

o Added automatic re-running of nodes upon configuration changes (yea!)

o Can be run in "standard input/output" mode (scfg -d) to run as a DOOR!

o Increased default backup_level from 3 to 5

o More flexible command-line syntax

o Reads SBBSCTRL environment variable to determine location of CTRL directory 
  (if not specified on the command-line)

o Supports up to 80x60 console window

o Elimination of version 2-specific options (unused in version 3)

o File paths are no longer forced to uppercase (for Unix support)

o Fixed importing of FIDONET.NA echolist tags with slashes (e.g. "AIDS/ARC")
  - was creating an invalid internal code for imported sub-board

o No more problems with consuming time-slices (100% CPU utilization)

o No more problems with initializing larger than 80x25 console windows

o New options to control the following:
  - Long filename support in listings (Win98/Win2K+)
  - Spinning cursor at [Hit a key] prompt
  - Native 32-bit external programs (doors), timed events, and editors
  - DOOR32.SYS drop file creation
  - Timed events based on frequency (multiple executions per day)
  - Background execution toggle for timed events
  - Global Hot Key events
  - SMTP (inbound e-mail) semaphore file
  - New user e-mail/netmail address question
  - Stripping of FidoNet Kludge lines for external editors


Control Panel
~~~~~~~~~~~~~
o Password-protected tray icon option

o Client form column widths saved/restored

o Added window title to SCFG console ("Synchronet Configuration Utility")

o Fixed crashes when closing while minimized to system tray

o Code Input dialog now lists the available events/hubs in a drop-down list

o Added "User->Truncate Deleted Users" menu option
  - used to remove all deleted user records from end of user database

o Fixed LogColor registry settings (weren't working)

o Created File->Properties->Customize menu to change color/font schemes

o Fixed window position of services config dialog 
  (wasn't visible at low resolutions)

o Detailed error reporting upon failure to load configuration files

o New Help->Frequently Asked Question menu option


Configuration Wizard
~~~~~~~~~~~~~~~~~~~~
o Added automatic detection of DNS server address (yea!)

o Fixed Internet Address configuration page when run for the first time


JavaScript (http://synchro.net/docs/js.html)
~~~~~~~~~~
o Increased maximum JavaScript heap size from 1 to 8 megabytes
  - no additional overhead or memory consumption
  - now supports thousands of message and file areas

o Elminated reliance on exec/nspr4.dll
  - benefit from switching to the "separate run-time per thread" model

o User class is defined before the answer/login procedure
  - answer/login .js modules can now use the User class

o user, file_area, and msg_area objects are now created during logon

o New bbs properties:
    alt_ul_dir, node_action, curgrp, cursub, curlib, curdir,
    smb_group, smb_group_desc, smb_group_number, smb_sub, smb_sub_desc,
    smb_sub_code, smb_sub_number, msg_to, msg_to_ext, msg_to_net,
    msg_to_agent, msg_from, msg_from_ext, msg_from_net, msg_from_agent,
    msg_replyto, msg_replyto_ext, msg_replyto_net, msg_replyto_agent,
    msg_subject, msg_date, msg_timezone, msg_date_imported, msg_attr,
    msg_auxattr, msg_netattr, msg_offset, msg_number, msg_expiration,
    msg_forwarded, msg_thread_orig, msg_thread_first, msg_thread_next, and
    msg_delivery_attempts

o New bbs methods:
    page_sysop, page_guru, multinode_chat, private_message, private_chat,
    get_node_message, put_node_message, get_telegram, put_telegram,
    text_sec, xtrn_sec, user_config, sys_info, sub_info, dir_info, 
    user_info, ver, sys_stats, node_stats, userlist, useredit, logonlist,
    nodelist, whos_online, spy, xfer_policy, read_mail, email, netmail, 
    qwk_sec, post_msg, cfg_msg_scan, cfg_msg_ptrs, reinit_msg_ptrs,
    scan_posts, auto_msg, time_bank, batch_menu, batch_download,
    batch_add_list, temp_xfer, change_user, bulk_mail, bulk_upload,
    resort_dir, listfiles, listfileinfo, scan_subs, scan_dirs, cmdstr,
    get_filespec, get_newscantime, list_users, edit_user, list_logons,
    list_files, list_file_info, post_msg, list_nodes, upload_file, and atcode

o New User class properties:
    logontime   - the exact time (in time_t format) of current login
                  (used to display time spent online in node listings)
    curxtrn     - the internal code of the external program last run
                  (used to display the name of the door in node listings)

o New Socket class property: nonblocking (set to true for nonblocking sockets)

o New Socket class method: ioctl (for sending ioctl commands to TCP/IP driver)

o New MsgBase.put_msg_header() method for modifying or deleting messages

o MsgBase class message header properties can now be enumerated
  - example: for(i in header) print("header." + i + " = " + header[i]);

o MsgBase class now supports anonymous-only and private-only sub-boards

o MsgBase class wasn't locking message headers before reading/writing them

o MsgBase class sub-boards in non-default storage directory didn't work

o exec/sbbsdefs.js now includes SMB constant definitions
  - for use with the MsgBase class

o msg_area.grp_list[x].sub_list[y].can_post property now accounts for P and N 
  user restrictions

o New msg_area.grp_list[x].sub_list[y] properties:
    settings        - bitmask of settings (SUB_*)
    qwk_name        - QWK conference name
    data_dir        - path to data files
    fidonet_origin  - FidoNet origin line
    qwknet_tagline  - QWKnet tagline
    is_operator     - current user is sub-board operator (true/false)
    is_moderated    - sub-board is moderated (true/false)
    ptridx          - index into data/user/ptrs/<usernum>.ixb files
    qwk_conf        - QWK conference number
    max_age         - max message age (in days) before purging
    max_msgs        - max number of messages before purging
    max_crcs        - max number of message CRCs to store (for dupe checking)

o New file_area.lib_list[x].dir_list[y] properties:
    settings        - bitmask of settings (DIR_*)
    can_upload      - current user can upload (true/false)
    can_download    - current user can download (true/false)
    is_exempt       - current user is exempt from d/l credits (true/false)
    is_operator     - current user is a directory operator (true/false)
    path            - path to storage directory
    extensions      - file extensions allowed (comma separated list)
    upload_sem      - path to upload semaphore file
    data_dir        - path to data files
    seqdev          - sequential device number
    sort            - sort order
    max_files       - max number of files allowed
    max_age         - max age before purging
    upload_credit_pct   - percentage of credits given for uploads
    download_credit_pct - percentage of credits given for subsequent downloads

o New system.findstr() method for searching any file for pseudo-regexp strings
  - similar to system.trashcan(), but not limited to text/*.can files

o New global directory() method to return array of files in specified
  local file system directory matching specified wildcard pattern 
  - example: files = directory( system.ctrl_dir + "*.cnf");
  - see exec/dir.js for complete example

o File.readBin() now returns -1 instead of garbage when attempting to read
  past the end-of-file

o system.uptime is now correctly set after accounting for timezone

o Fixed bug with concurrent access to the MsgBase class from the Telnet server
  and the services module


Synchronet Services
~~~~~~~~~~~~~~~~~~~
o Fixed parsing of services.cfg, two spaces were required before port number

o html-nodelist.js:
  - now reports time online and door names in node listings
  - added optional location to node list (use "-l" option)
  - added Runkeeper's mod for Login button to work around MSIE table bug

o fingerservice.js:
  - now reports time online and door names in node listings

o nntpservice.js:
  - fixed message-ids for Netscape (and other client) support
  - now supports real name only sub-boards
  - now supports private and moderated messages
  - includes e-mail address in "From:" header fields

o Added support for server recycle semaphore file (ctrl/services.rec)


Telnet Server
~~~~~~~~~~~~~
o User signature file support (totally independant of message editor)

o Now supports 3-digit ANSI cursor position reports during initial
  terminal screen length detection (fix for Windows 2K/XP telnet)

o New user netmail/e-mail address question can now be toggled off

o Long filenames are now displayed in extended file information and are
  optionally displayed in file listings (requires Win98/Win2K+)
  - files with long filenames must still be uploaded via FTP
  - complete long filename support will follow the emergence of a WinSock
    X/Y/Zmodem driver

o 32-bit external programs (doors) and editors no longer need to be in the
  Native Program List in SCFG for a DOOR32.SYS drop file to be created
  - select "DOOR32.SYS" from the drop file list instead
  - also need to set "Native (32-bit) Executable" toggle option to "Yes"

o Added support for I/O redirection of Win32 console apps (e.g. cmd.exe)
  - ;SHELL command now works on Windows NT/2K/XP
  - unix-like (stdio) doors now supported (e.g. Lord/X)

o Date environment variables (DAY, WEEKDAY, MONTH, MONTHNAME, and YEAR)
  are now set before executing native (32-bit) programs
  - these variables were previously only set when executing DOSXTRN.EXE

o EnterYourBirthday ctrl/text.dat line now uses automatically-supplied
  variable for the format example ("MM/DD/YY" or "DD/MM/YY") based on the
  sysop-configured date format

o Message "Title" ctrl/text.dat entries changed to "Subject"

o New @-codes:
  - SMB_GROUP           Current message group name          
  - SMB_GROUP_DESC      Current message group description (long name)
  - SMB_GROUP_NUM       Current message group number
  - SMB_SUB             Current message sub-board name
  - SMB_SUB_DESC        Current message sub-board description
  - SMB_SUB_CODE        Current message sub-board internal code
  - SMB_SUB_NUM         Current message sub-board number
  - MSG_TO              Current message to-user name/number/address
  - MSG_TO_NAME         Current message to-user name
  - MSG_TO_EXT          Current message to-user extension (number)
  - MSG_TO_NET          Current message to-user network address
  - MSG_FROM            Current message from-user name/number/address
  - MSG_FROM_EXT        Current message from-user extension (number)
  - MSG_FROM_NET        Current message from-user network address
  - MSG_SUBJECT         Current message subject
  - MSG_DATE            Current message date/time
  - MSG_TIMEZONE        Current message timezone
  - MSG_ATTR            Current message attributes

o All @-codes now support the -L and -R variations for fixed length display
  (left or right justified) Example: [@name-l___________________@]

o Fixed %f command-line expansion for DORINFO1.DEF and TRIBBS.SYS drop files

o Fixed bug where the uptime was incorrectly reported in some timezones

o Fixed bug where time left could go negative in Unix builds

o Fixed infinite "error selecting socket for send" error message

o Fixed Baja FTP passive (PASV) mode file transfers
  - exec/getimlst.bin should now work with ftp.synchro.net

o Fixed Baja FTP active/normal (non-passive) transfers 
  - was only broken when Telnet server network interface was set to 0 (<any>)


Events
~~~~~~
o Timed events based on frequency (multiple executions per day)

o DOSXTRN is no longer used to launch timed events (unnecessary overhead)

o Background execution can now be toggled off/on in SCFG


Mail Server v1.11
~~~~~~~~~~~~~~~~~
o Support for MIME-encoding of outbound e-mails with file attachments
  - thanks to Marc for this source code contribution

o Recipient e-mail addresses can now be blocked using text/email.can

o Optional "default user" for catch-all e-mail account (e.g. sysop)

o Support for "port-extended" addresses to send mail to SMTP servers on 
  non-standard ports (e.g. user@some.mail.server:2025)

o alias.cfg can now specify external servers (different address or port)
  '*' wildcard char is supported (e.g. to forward all mail for anyone at
  some.com to the same user at orther.org, use "*@some.com *@other.org")

o More detailed smap.log entries

o Time-slice yields while receiving SMTP messages
  - no more 100% CPU utilization while receiving large e-mails

o Support for SMTP (inbound e-mail) semaphore file
  - used to trigger external mail processing events

o Removed support for logging in with aliases from alias.cfg (bad idea)
  - alias.cfg is strictly used for e-mail recipient aliasing

o Added support for server recycle semaphore file (ctrl/mailsrvr.rec)

o Fixed double domain bug in POP3 server

o Counts and logs number of lines per message


FTP Server v1.10
~~~~~~~~~~~~~~~~
o E-mail aliases (from ctrl/alias.cfg) can no longer be used to login

o Guest/anonymous e-mail address listed in client display

o Added support for server recycle semaphore file (ctrl/ftpsrvr.rec)

o Automatic server recycling upon socket select or accept failure


***********************************************************
* What's New in Synchronet Version 3.10 Revision H (Beta) *
***********************************************************

General
~~~~~~~
o New NewsLink event module (exec/newslink.js)
  - used to link sub-boards with newsgroups (e.g. USENET)
  - requires ctrl/newslink.cfg
  - create a timed event with command line of "?newslink"

o Changed use of gmtime() to localtime() for systems using local/system
  time zone rather than GMT/UTC (the default)

o Including Win32 console-mode version of Synchronet (sbbs.exe)
  - less overhead
  - more ideally suited to run as an NT service
  - identical to Unix version

o Better error reporting (includes text description of errno)

o All TCP servers support recycling via semaphore and semaphore files
  - ctrl/telnet.rec, ftpsrvr.rec, mailsrvr.rec, and services.rec
  - waits until server is not in-use before recycling
  - re-loads config files
  - re-binds sockets

o Fixed bugs in parsing ARS keywords: UNIX, LINUX, and WIN32
  - any additional ARS keywords in the same string were corrupted


Configuration Utility (SCFG) Updated for Version 3.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Changed default QWKnet call-out command line to use QNET-FTP module

o Fixed access violations/segfaults when adding file options:
  protocols, download events, viewable/testable/compressable/extractable file
  types, and alternate file paths, at the end of the list

o New System "Toggle Option" to use local/system time zone instead of
  GMT/UTC

o New Node "Toggle Option" to leave NODE.DAB open (defaults to "Yes")
  - This is how Synchronet operated prior to v3, but was changed in the
    interest of Linux/smbfs-compatibility
  - In the interest of performance and reliability, I've changed the default
    behavior back to leaving the file open and added an option to disable
	this behavior (and make it behave like Synchronet v3.0)

o System toggles default to previously configured state

o Added External Program "Time Option" to enable "Monitor Time Left"
  - Synchronet will automatically disconnect the user if they run out of time

o New "Newsgroup Name" for sub-boards (used by NNTP service)


Control Panel (Win32)
~~~~~~~~~~~~~~~~~~~~~
o Fixed resource (thread and process handle) leak when using BBS->Configure

o Fixed potentially incorrect client counter in status bar

o New File->Properties->Advanced tab to set control directory and host name
  - Host name should be set only if different for this instance of sbbsctrl


JavaScript (http://synchro.net/docs/js.html)
~~~~~~~~~~
o Added BranchCallback for detecting infinite loops and releasing time-slices
  while executing scripts

o New MsgBase.subnum (0-based sub-board number) property

o New message hdr.date property for proper RFC822 date representation

o Added time to message-id for messages in sub-boards (for more uniqueness)

o Added extra bool param to MsgBase.get_msg_body() method (tails)
  - defaults to true if unspecified

o New MsgBase.get_msg_tail() method
  - returns message tail (tear/taglines) only

o New global properties:
  - errno     (mirrors C RTL "errno" variable)
  - errno_str (String description of errno value)

o New global methods: 
  - ascii_str(String)	  return ex-ascii string converted to pure ascii
  - strip_exascii(String) return string with ex-ascii chars removed

o New system methods:
  - system.spamlog(prot, reason, host, ip_addr, to)
  - system.hacklog(prot, user, text, host, ip_addr, port)

o New system.host_name property 
  - may be different from Internet address configured in SCFG->Networks->
    Internet e-mail
  - configured with sbbsctrl->File->Properites->Advanced
  - only required for multiple machine BBSes (e.g. vert/rob/cvs.synchro.net)

o New socket method:
  - socket.sendfile(filename)

o Global printf() function outputs to event log when appropriate

o Fixed JavaScript context corruption caused by bbs.login() method

o Fixed null pointer dereferences when accessing properites of unopen JS file

o Fixed bug in File.writeAll() method (would stop writing prematurely)

o File.readln() and readAll() methods no longer truncate trailing whitespace

o Doesn't ask for new/your message scan if user has access to no message areas


Telnet Server
~~~~~~~~~~~~~
o Added QWK config menu option to toggle QWK_EXT flag

o Added support for long conference names in CONTROL.DAT if QWK_EXT flag set

o Now detects if new user record number (determined by name.dat) is beyond
  the valid size of the user.dat, generates an error log message, and fixes the
  user number so the record can be created successfully

o Added code to putusername() to automatically fix a corrupted name.dat file

o Added error report if failed to create new user record

o Fixed output_sem re-initialization bug that caused segfaults in Linux and
  *may* have been a cause of occasional output blocks in Win32

o Mail maintenance/purge event no longer tries to delete msgs in an empty base

o No longer clears useron number in node.dab when logging off
  - multinode chat users need this value to display the user name that left 
    chat channel (disconnected)

o New toggle option to check time left online while executing doors
  - fix for doors that fail to check user's time left online

o Switched back to using DOSXTRN for offline events
  - executing events without DOSXTRN caused too many problems

o Fixed Win32 resource leaks when executing external programs

o Fixed CR to CRLF expansion for intercepted standard I/O in Win32 programs

o Fixed condition in node.dab where a node status could be left as "in use"

o New command-line specifier (%.) expands to ".exe" for non-Unix platforms
  - Allows Unix and Win32 executables to reside in the same directory

o NT FOSSIL driver no longer creates sbbsexec*.log files


Synchronet Services
~~~~~~~~~~~~~~~~~~~
o NNTP Service (exec/nntpservice.js)
  - Added log output for rejected commands when not authenticated
  - Handles P (post) user restriction more gracefully
  - Served message headers now include properly formatted date field
  - Posted messages now use original date/time in header
  - Added support for SLAVE and IHAVE commands
  - Updated From: headers to include user name separate from address
  - Added subject trashcan (text/subject.can) checking (spam filtering/log)

o Finger Service
  - Fixed negative time online values

o Fixed buffer overflow bug in JavaScript global log() method

o Support for unique host names per Synchronet instance (system.host_name)


FTP Server
~~~~~~~~~~
o Fixed race condition that caused client transfer threads to be orphaned

o Eliminated warning when attempting to close socket after sock_mutex is gone

o Added special log output to ftp_close_socket when closing the server socket

o Rearranged termination sequence at end of ctrl_thread to fix race conditions

o Added wait at end of ftp_server thread for other threads to terminate


***********************************************************
* What's New in Synchronet Version 3.10 Revision I (Beta) *
***********************************************************

General
~~~~~~~
o Additional "buffer overflow" precautions

o Better random number "seeding"

o Better/early detection of corrupt message base headers 

o Fixed long message header field support in message base utilities
  - smbutil, chksmb, and fixsmb


Configuration Utility (SCFG) Updated for Version 3.x
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Fixed bug that was corrupting message headers (build problem?)

o Increased maximum SCFG->Security Levels->Time Per Call/Day to 1440 minutes

o Uses SBBSEXEC environment variable for help file location (if set)


Control Panel (Win32)
~~~~~~~~~~~~~~~~~~~~~
o Fixed bug with reporting incorrect "up time" in daylight savings time

o GUI user editor now saves changes to Note field
  - Deleted/inactive user record status is displayed as red/yellow


Console Mode (sbbs.exe)
~~~~~~~~~~~~~~~~~~~~~~~
o New command-line options:
	-ma			allow SMTP relays from authenticated users
	-md<addr>	set DNS server address for MX-record lookups
	-mr<addr>	set SMTP relay server (and enable SMTP relay)
	            (supports address:port syntax)


Telnet Server
~~~~~~~~~~~~~
o Added optional text/menu/msghdr.* file (actually a couple of revs back)
  - Replaces built-in/text.dat message headers
  - Use new message header @-codes to display message details

o Errno descriptions are now included in error log

o exec_mutex is no longer used for NT-based OSes and native 32-bit executables


Mail Server
~~~~~~~~~~~
o New mail server option to allow SMTP relay to authenticated users
  - Requires user's last logon to be within the hour (via Telnet/FTP/POP3)

o Immediately disconnects upon illegal relay attempt

o More detailed message base error messages

o Reduced maximum SMTP recipients from 1000 to 100 (RFC minimum)

o Improved tracking of number of recipients and enforcement of maximum

o Logs maximum recipients reached error in spam.log

o SMTP MAIL command now resets recipient list per RFC 821


***********************************************************
* What's New in Synchronet Version 3.10 Revision J (Beta) *
***********************************************************

General
~~~~~~~
o Better JavaScript reliability

o Much improved anti-SPAM measures in SMTP Mail server

o More detailed spam.log entries

o Sysop-configurable socket options (applied to all opened sockets)
  - socket options set in ctrl/sockopts.cfg
  - socket option values can be queried using "finger ?sockopts"

o Servers are automatically recycled on an "accept" failure

o Improved message base error handling (SMBLIB v2.15)

o Automated daily backups of user and mail databases

o SBBSCTRL can export/import sbbs.ini file (registry settings)

o Console mode version (sbbs.exe) can read in sbbs.ini file for instance
  settings - no more ugly command-lines required

o Console mode version now includes node listing/control commands

o Services on UDP (datagram) sockets are now supported

o Tons of improvements to both newslink.js and nntpservice.js
  - Better dupe message detection/prevention
  - Better retainment of message-ids across gated message networks
  - Better prevention of inadvertent gating (must have gate-between-net-types)


SCFG
~~~~

o Now creates data and storage directories (again)

o Bugfix: wasn't saving sub-board's newsgroup name

o Backed-up .cnf files are now named *.cnf.# instead of *.cn#
  - no longer limited to 10 backups

o Number of daily user and mail database backups to keep, configured in
  SCFG->System->Advanced Options

o Removed unused new user question toggles: computer type and multiple choice
  computer questions


NewsLink (newslink.js)
~~~~~~~~
o Better dupe message detection/prevention using X-Gateway header field

o Better retainment of message-ids across gated message networks

o Better prevention of inadvertent gating (must have gate-between-net-types)

o Creates default (blank) properties for message header object:
  eliminates script errors when importing malformed message headers

o Uses newsgroup name as default "to" header field value of imported msgs

o Added optional flags field to area lines in newslink.cfg
  Supported flags:
	n - don't add "from newsgroup" tag to imported message text
	t - don't add tear lines to imported message text
	x - don't add tear and tag lines to exported message text

o Improved debug/status output

o Added support for Tracker1's -ix option (import fixed number of messages)

o Added support for parsing and sending of FidoNet-extension headers
  (e.g. X-FTN-MSGID)

o Only includes references/reply_id field if it exists in the header (!undefined)

o print statements are now crlf-terminated for easier debugging with ;EXEC


nntpservice.js
~~~~~~~~~~~~~~
o Many of the improvements made to newslink.js, also made in nntpservice.js

o Added support for the DATE command (RFC 2980)

o Uses message-id of posted msgs if sender is a slave server (not a client)

o Tracker1's modification to set the "to" field of posted messages based on
  the from field of the message referenced in "references" header field
  (if present)

o Tracker1's modification to replace spaces with underscores in e-mail 
  addresses

o Added support for missing argument to ARTICLE, HEAD, BODY, and STAT cmds

o Added support for the STAT command

o Added read/posted messages stats after logoff

o Writes original newsgroups header to outbound msgs


JavaScript
~~~~~~~~~~
o printf() and format() now convert floating point numbers to long (%ld)

o BBS timed events can now use User class

o Branch callbacks now collect garbage (free-up memory) every 100 calls
  - this fixes the problem of every created object living in memory during
    the life of a script causing a long-running script to eventually run 
    out of memory

o Fixed the following global methods (were corrupting passed string buffer):
  ascii_str(), strip_ctrl(), strip_exascii(), and truncsp()

o UDP (datagram) sockets are now supported by the Socket class

o New Socket class properties: local_ip_address, local_port,
  remote_ip_address, and remote_port

o Socket getoption() and setoption() methods no longer have the option "level"
  as an argument and the option name is now specified as a string (the numeric
  values defined in sockdefs.js are not cross-platform)

o Fixed Socket is_connected property value (was true before connect)

o Created Socket poll() method - with optional timeout argument (in seconds)

o Changed Socket recv, recvline, and peek methods to support unlimited buffer
  lengths

o Fixed bug in bbs.replace_text() method when called with empty string ("")

o New bbs properties: msg_id, msg_reply_id, smb_msgs, and smb_curmsg

o New console method: ansi_getxy() to get terminal's current cursor location

o New console method: lock_input() to lock/unlock the input_thread allowing
  direct client.socket read calls from scripts

o system.spamlog() now takes an "action" parameter
  - usage: spamlog(prot, action, reason, host, ip_addr, to);

o Fixed memory leaks in MsgBase class

o MsgBase save_msg() and put_msg_header() methods now parse the header 
  object's id and reply_id properties and place them in the appropriate SMB 
  header fields

o MsgBase get_msg_header() method defines only the following properties as 
  read only: number, id, and reply_id 
  - the rest are now read/write

o MsgBase get_msg_body and get_msg_tail methods now take additional bool
  parameter indicating whether the message is to be rfc822-encoded or not
  (defaults to false)
  - this solves the problem of the nntp service and newslink module sending
    messages with dots in the first character of a line incorrectly

o Added MsgBase ftn_msgid, ftn_reply, ftn_pid, ftn_area, and ftn_flags
  FidoNet msg header properties

o MsgBase msg hdr reply_id based on time and number of original message
  - reply_id property is not created if it doesn't exist in the msg header
  - msg.id is based on the time the message was imported rather than written

o Fixed MsgBase subject, to, and from CRCs in message base index
  - threading on author, to, or subject didn't work on imported msgs

o Added support for MsgBase msg hdr USENET Path and Newsgroups header fields


Telnet Server
~~~~~~~~~~~~~

o PostLink and QWK call-out events now run in foreground (to avoid packet
  open conflicts) and use the command-shell (for shell scripts on Unix)

o An "riosync timeout" is no longer logged as an error

o Non-exclusive timed events can now run *while* the event node is "in use"

o Fixed bug with multiple instances and non-exclusive events, was setting node
  status to WFC even if user was online

o IDENT lookup no longer assumes server is running on port 23

o getkey now releases time-slices while waiting for "cold key" input

o ansi_getxy releases time-slices while waiting for terminal response

o ansi_getlines releases time-slices while waiting for terminal response

o Timed events that use Baja or JavaScript output routines will now print to
  the event log

o "To users" are now supported on Internet-networked message areas

o New user question toggle (SCFG->System->New User Values->Question Toggles)
  to disable the upper/lower case conversion of new-user-supplied strings

o New system toggle options (SCFG->System->Toggle Options) to suppress
  hard-coded displays (system info and active node list) during logon

o New MSGID and REPLY kludge lines in QWK networked messages
  - allows cross-network threading based on message-id

o Added new command (E) to allow users to edit their posted messages on a
  specific sub-board (sysop configurable in SCFG)

o Implemented support for SUB_DELLAST toggle option
  - allows deleting of last message only
  - option has been in SCFG for a long time, but never implemented

o Fixed chat channel 0 (sysop broadcast channel) bugs related to chat actions

o Auto-initializes SBBSDATA and SBBSEXEC convenience environment variables
  for use in external programs/batch files/shell scripts

o Sets socket mode back to blocking after running external programs
  - fix for external programs that change the socket's blocking mode

o If the menu file text/menu/xtrn/code.* exists (where code is the external
  program's internal code), the file will be displayed to the user before the
  door is run

o New @-codes: MSG_NUM, MSG_ID, MSG_REPLY_ID, SMB_MSGS, SMB_CURMSG, 
  SMB_LAST_MSG, SMB_MAX_MSGS, SMB_MAX_CRCS, SMB_MAX_AGE, and SMB_TOTAL_MSGS

o Updated old msg group and sub-board name/number @-codes to use currently
  open message base details, if applicable


SBBSecho
~~~~~~~~
o New option (in ECHOCFG) to strip linefeeds from exported messages
  - Previously, it *always* stripped linefeeds causing formatting problems
    with some non-comforming echomail programs (defaults to "Off")


Mail Server
~~~~~~~~~~~
o Added support to SMTP server for "forward:" and "local:" address prefixes,
  allowing sender-control of forwarding to external mail addresses

o Created generic DNS blacklist support via optional configuration file:
  ctrl/dns_blacklist.cfg - allows multipe RBL-style DNS blacklists

o The hardcoded RBL functionality has been replaced with dns_blacklist.cfg

o Added support for ctrl/dnsbl_exempt.cfg to exempt a list of IPs 
  (or IP masks) from DNSBL testing

o Three new options on handling of mail from DNSBL-listed servers:
  A. refuse sesion (used to be only choice)
  B. refuse mail (e.g. report "bad address")
  C. ignore mail (e.g. pretend to receive)
  D. receive mail, but tag msg subject and header with configurable tags

o Now logs DNS query result (e.g. 127.0.0.2) from DNS-based Blacklist servers

o Changed DNS blacklist reject error code from 571 to 550

o POP3 server allows up to three non-USER commands in authentication state
  i.e. ignores "CAPA" command (RFC 2449)

o Better support for outbound addresses with both "name" and <addr> portions

o sendmail_thread sends properly formatted RCPT TO command even if address
  is not properly formatted ("name" <addr> for example)

o sendmail_thread can now send mail to addresses that have text after hostname

o Made "msg text lines per yield" value configurable (default: 100)

o Made "max recipients" value configurable (default: 100)

o Undeliverable messages from local user #0 can't be bounced
  (e.g. telval/smbutil)


***********************************************************
* What's New in Synchronet Version 3.10 Revision K (Beta) *
***********************************************************

General
~~~~~~~
o New IP filter file: text/ip-silent.can
  - connections from IP addresses in this file are silently refused
    (same format as other text/*.can files)

o More consistent message threading-by-subject

o Non-standard timezones are now represented as UTC+/-hh:mm

o All messages created are assigned both Internet (RFC822) and FidoNet (FTS-9)
  compliant message-IDs

o All messages created are assigned a FidoNet (FSC-46) compliant program ID

o SBBSCTRL (Win32) now saves and restores customized font styles 
  (bold, italic, underline, etc.)

o Fixed handling of invalid Ctrl-A sequences in FILE_ID.DIZ

o Web server included in console-mode version (sbbs.exe) Unix build
  - very preliminary

o Synchronet ported to OpenBSD (thanks Deuce!), so Synchronet for Unix now
  builds and runs on Linux-x86, FreeBSD-x86, and OpenBSD-x86.


JavaScript
~~~~~~~~~~
o New documentation in the works
  http://synchro.net/docs/js.html

o Dynamically-generated Object Model Reference (more complete and accurate)
  http://synchro.net/docs/jsobjs.html

o Better error reporting of internal errors that cause script termination

o User class constructor can be called with no arguments
  - creates a User object representing no existing user
  - number property must be set before any changes can be saved

o Global load() method can now (optionally) take additional arguments which
  are then used to change the values of the global argv and argc properties
  Example: load("myscript.js", arg1, arg2);

o New global truncstr(str,set) method, truncates a given string at the first
  occurance of any char in set (ala strpbrk), returns the truncated string

o New methods: system.put_node_message() and system.put_telegram()
  - same as bbs methods by the same name but can be called from other servers

o New method: system.new_user(alias)
  - returns User object representing a new user record

o New method: system.matchuserdata(field, data, [usernumber]) 
  - searches for an exact string match of any user record data field and
    returns the number of the first matching user
  - the field is specified by offset into user.dat record
  - usernumber is an optional user to skip in the search

o Fixed system.freediskspace property, returns up to 4GB (instead of -1)

o bbs.scan_dirs() and scan_subs() methods ignored first parameter

o bbs.get_newscantime() returns new scan pointer date/time

o bbs.get_telegram() was expecting too many parameters

o Fixed console.question property (was dupe of console.wordwrap property)

o Made console.question property writeable

o New console.strlen() method returns length of string excluding Ctrl-A codes

o File.open() method now accepts an additional, optional bool argument:
  shareable (defaults to false)
  - if a file is opened as 'shareable', then simultaneous opens will be
    allowed (no file locking), otherwise, the file is locked according the
    open 'mode'

o File.open() method now opens file in text mode (on Win32) unless 'b'
  (binary) mode is not specified

o New File.printf() method (works like the C fprintf function)

o File.lock() and unlock() methods:
  - act on the entire file if called with no arguments
  - offset defaults 0, and length defaults to the file length - offset

o New xtrn_area object that represents the configured external programs
  - currently only includes online external programs (doors)
  - will add timed events, external editors, etc. later
  - sorry Rocko, couldn't wait for your version :-)

o MsgBase class:
  Fixed case sensitivity problem with opening message bases on Unix
  Added support for hdr.from_org (Organization) header field
  Imports and exports SMTP reverse_path header field (hdr.reverse_path)

o New MsgBase.open() method - now required to access a message base, allows
  better error handling than opening in the constructor

o New MsgBase.is_open property (boolean), reflects msgbase open state

o MsgBase.save_msg() method will open the message base if necessary

o MsgBase.put_msg_header() method now updates the index record too

o MsgBase.get_msg_header() now exports the following header fields:
  summary, priority, cost, times_downloaded, and last_downloaded

o MsgBase.get_msg_header() method truncates trailing whitespace characters
  from all header fields

o Repeating and generic ASCII header fields (e.g. RFC822HEADER) are accessed
  with the new hdr.field_list array

o New MsgBase.cfg property contains all sub-board configuration settings
  - doesn't exist for "mail" message base

o MsgBase.save_msg():
  USENETPATH headers are no longer *always* added to newly saved messages
  It's up to another application (e.g. nntpservice.js) to add the local system
  to the path
  Added support for importing message headers with replyto header fields

o Fixed bug in Socket.poll() - timeout value only worked as first argument

o Fixed memory leak in Socket.sendfile() if file read failed

o New Socket.recvfrom() method that returns an object with 3 properties:
  data, ip_address, and port (for UDP responses to broadcasted requests)

o New Socket.sendto() method - usage: sendto(data,ip_addr,port) for UDP

o Socket.connect() call is no longer needed for UDP sockets

o Socket.local_port and remote_port properties are now numbers
  (instead of strings)

o New property Socket.type, set to SOCK_STREAM (TCP) or SOCK_DGRAM (UDP)
  when the socket is created (read-only)
  - SOCK_STREAM and SOCK_DGRAM are defined in exec/sockdefs.js

o Fixed bug in Socket.bind() if port number specified (byte-order fix)

o Port arguments in Socket.bind(), connect() and sendto() can now be
  specified as a service name (e.g. "telnet", "http", "finger", etc).

o New Socket.listen() method, puts socket in 'listening' state,
  accepts optional 'backlog' argument (defaults to 1)

o New Socket.accept() method, accepts an inbound TCP connection,
  returns a newly created socket object

o Socket.poll() method now accepts an additional, optional argument: 
  bool poll_for_write, defaults to false (poll for read)


SCFG (Configuration Utility)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Added optional parent directory to file library configuration
  - used to specify a physical parent directory for all logical directories
    in a file library (convenient for importing CD-ROM directories)
  - requires v3 of ADDFILES and FILELIST utilities

o Support for importing "raw" directory listings (containing just dir names)
  - for use in conjunction with the new "parent directory" option

o User signatures can now be disabled on a per sub-board basis

o New option to create lowercase drop file names for external programs
  (for better Unix file system compatibility)

o Exports and imports newsgroup name as part of subs.txt format

o Fixed bug that could occur if new user command shell was set to last
  configured command shell, and that shell was later deleted


Telnet Server
~~~~~~~~~~~~~
o All ctrl-keys (built-ins and hot-key events) use same the recursion 
  protection mechanism now limiting them to a total maximum depth of 2
  - solves re-entrancy issues for hot-key events

o DEL (ASCII 127) is treated the same as backspace (ASCII 8) in string
  input routines

o When importing QWK and REP network packets, the corresponding
  data/qnet/<id>.in is only created when necessary

o Improved message header display with sysop message scan 'OH' command

o New sysop mail read command, 'H', used to display mail message headers

o Converted SMB_CURMSG @-code to 1-based (cosmetic bugfix)

o Added new @-code HOSTNAME, used to display current host name
  - may not always be the same as the INETADDR

o New log entry created when the user pages the sysop to chat

o Added Continue? questions during new user procedure to give user an opt-out

o Creates user, msg_area, and file_area JavaScript objects during user logon
  and new user creation

o Checks for node interruption during an outbound telnet gateway session

o Unix-build creates external program (door) drop-files with CRLF-deliminated
  lines if not configured as 32-bit native
  - for DOSEMU/DOSCMD compatibility

o trashcan() now delays 500 milliseconds after displaying the optional
  text/bad*.msg file 
  - gives time for transmit buffer to clear before disconnecting

o Fixed exception during termination of bbs_thread if subs/dirs were added in
  SCFG and the confg files were re-loaded (node(s) recycled) before shutdown

o Baja FTP function fixes:
  - Removed extra crlf sent with FTP PASS command
  - Fixed bug causing intermittent bind failures on FreeBSD
  - Fixed active (non-PASV) mode file transfers

o FOSSIL driver for NT-based operating systems (sbbsexec.dll) now reports
  I/O buffer fullness more accurately
  - fixes problem with FDSZ sending entire file then timing out while waiting
    for acknowledgement from client

o One-byte-at-time external programs (e.g. LORD) should preform better on
  NT-based operating systems due to better interprocess communication

o When debugging (logging) received telnet commands, sent commands are now
  logged too

o QWKnet kludge line lengths up to 500 chars now supported
  - previously limited to 128 chars

o Fixed bug that would change user #1's QWK settings when importing QWKnet
  packets

o Removed log output during the packing/unpacking of messages for QWK nodes


ADDFILES
~~~~~~~~
o Several bugs fixed since last 3.00 beta releases


FILELIST
~~~~~~~~
o New version 3.00 port (for Win32 and Unix)


SMBUTIL
~~~~~~~
o Messages posted via SMBUTIL now have the SENDERAGENT field set to
  AGENT_SMBUTIL to prevent the Synchronet mail server (or other programs)
  from bouncing undeliverable messages back to a "process"

o Improved packmsgs() handling of failed deletion/renaming of temp files
  (occurs if the msgbase is open by another process at the time of packing)
  - the msgbase should no longer be left in a corrupted state if this occurs

o Cosmetic changes to header dump routine

o Creates a FIDOPID (program identifier) header field when storing messages

o New command-line option (-d) to set default values for header fields
  (to, from, from_number, and subject) when importing messages


CHKSMB
~~~~~~
o Now verifies header lengths match calculated header lengths

o Displays more detail regarding corrupted data field offsets when used 
  with the -e switch


SBBSecho
~~~~~~~~
o Bugfix: FLO files were being truncated rather than appended

o No longer writes the same (duplicate) bundle name to the FLO file if it's
  already listed

o Now deletes BUNDLES.SBE when no longer needed (rather than truncate it)
  - hopefully eliminates FAQs about this file

o OS/2 builds now available again (thanks Watcom!)

o Now imports and exports TZUTC, MSGID, REPLYID, PID, and TID control fields

o Sets "when written" time zone on imported messages based on TZUTC or
  TZUTCINFO kludge lines, if present

o Tosser ID (TID) fields are created if it doesn't already exist

o Fixed the creation of inter-zone outbound point directories for FLO mailers

o Fixed importation of FLAGS ctrl line (was looking for "FLAGS:" not "FLAGS")

o FLAGS and unrecognized kludge lines are now added to exported messages

o Line feeds are ignored when converting non-ASCII chars for ASCII-only subs

o Fixed case of mail message base (for Unix file systems)


Services
~~~~~~~~
o Support for new "static" services
  - services that listen on a socket and accept their own connections/clients
  - requires option bit 1 (0x2) set in ctrl/services.cfg file

o New global write() and writeln() methods to make it consistent with FTP and
  Web server global methods used to generate html (e.g. nodelist-html.js)


Mail Server
~~~~~~~~~~~
o Uses hostname instead of inetaddr (usually the same) in SMTP cmds/responses
  and SMTP "Received" headers

o Support for sender addresses that include comments (in parenthesis)

o Increased read timeout from from 1 to 5 minutes

o POP3 server actually checks the number of lines sent successfully and only
  marks the message as 'read' if all lines requested were sent successfully

o Now stores original, unmodified RFC822: to, from, and reply-to header fields

o Bounce-messages are now flagged as from AGENT_SMTPSYSMSG and messages from
  processes aren't bounced (preventing bounced message loops)

o Reduced mail server cycle time from 5 to 2 seconds (frequency at which
  recycle semaphores are checked)

o Added option to toggle logging of received responses (DEBUG_RX_RSP)

o Much improved message bouncing:
  - delivery failure (bounce) messages now includes error details
  - error message text is no longer crammed into the bounce-message subject
  - the original subject is retained
  - fixed bug that could cause corruption after original message deletion
  - use of original reverse-path for bounced message delivery


FTP Server
~~~~~~~~~~
o Improved string bounds checking

o Fixed bug with continuous recycling

o Now (optionally) echoes password attempt for unknown users

o Increased select timeouts (from 1 to 5 minutes)

o Increased recycle semaphore check frequency (from 5 to 2 seconds)

o The reported "unix" file and directory modes more closely reflect
  the actual read/write permissions (FTP clients should ignore them anyway)

o Added support for resumed uploads (using APPE or REST commands)

o Fixed time display of files in local directory listings

o CWD's to paths with trailing filenames now fail (as they should) 
  - when IE fails to download a file, it attempts to CWD to the path, and if 
    the CWD succeeds the subsequent requested paths were all wrong


***********************************************************
* What's New in Synchronet Version 3.10 Revision L (Beta) *
***********************************************************

General
~~~~~~~
o Timed events can be configured to run only on specific days of the month
  (example: the 1st and 15th of every month)

o Eliminated harmless accept/select errors when shutting down servers

o Win32 build now uses Critical Sections in place of Mutexes
  - Mutexe API routines are slower because they must enter the kernel

o Now using thread-safe time functions in Unix builds

o Now using thread-safe "real path" function in OpenBSD build

o New command-line utility (makeuser) to add a user to the user database
  - run makeuser -? for usage instructions

o Node window in SBBSCTRL no longer unnecessarily locks node.dab
  - eliminates locking/reading errors

o QWK Bugfix: was always truncating MESSAGES.DAT, so appending to an existing
  QWK packet (pre-packed or aborted download) did not work at all (ever)
  - this also resulted in a side-effect of corrupted indexes (if enabled)

o Beautified and sped-up (immensely) the unpacking of QWK network message 
  packets

o New optional ctrl/twitlist.cfg file contains, names (with wildcards) of
  users/authors whose posts will not be imported from QWK or FidoNet networks

o Configurable directory for modified modules/scripts

o Configurable directory for log files

o Message sub-board and file directory internal codes can now be extended to
  16 characters by using the new optional message group/file library 
  "internal code prefix" - this feature allows sysops to easy create message
  and file areas with unique (non-conflicting) internal codes

o Download notifications can now be disabled on a per-directory basis

o New cross-platform graphical user interface (based on FLTK) for SCFG and
  ECHOCFG (run with "-g" to enable GUI interface)

o New Unix installer - installs and builds source code from CVS or tgz files
  - thank Deuce for this neat-o program

o New IRC client module (exec/irc.js) - again, thank Deuce

o All TCP servers individually track and log the number of clients served

o All TCP servers now detect and log client hostname aliases (canonical names)

o Bugfix: TCP server's up-time root value is reset if the server thread is 
  shutdown and restarted (excluding recycles)


Control Panel (Win32 GUI)
~~~~~~~~~~~~~~~~~~~~~~~~~
o Bugfix: Configuration Wizard no longer fails to save configuration files
  if there is no existing mail message database (data/mail.*)

o Servers are recycled/refreshed after completing Configuration Wizard

o Fixed DNS Server address detection on systems with multiple NICs

o File->Import/Export Settings menu options now prompt for path/filename


Synchronet for UNIX
~~~~~~~~~~~~~~~~~~~
o Separately configurable ANSI and Dumb (non-ANSI) terminal values:
  ExternalTermANSI and ExternalTermDumb


Telnet Server
~~~~~~~~~~~~~
o System password is now required to create the first user (sysop) account

o Fixed problem detecting number of rows for Windows 2K/XP telnet client 
  (was reporting 105 lines when used in a scrollable window)
  - fixed by Deuce

o Screen-lines are no longer auto-detected (for ANSI terminals) at every
  "default config" menu prompt, but rather only when using the "Screen Length"
  option and selecting "Auto Detect"
  - solves problem with terminals that don't respond properly to the ANSI
    cursor position request

o Ctrl-C now purges both input and output buffers (when appropriate)

o Built-in ctrl key handling (Ctrl-C, Ctrl-T, Ctrl-U, etc) can be disabled
  with SCFG->System->Advanced->Control Key Pass-through
  - any keys specified in this bit-map will not be handled internally or by
    global hot key events

o New toggle option for external programs, events, and message editors:
  - use Shell to Execute, forces command-line to be executed via system
    command shell (e.g. cmd.exe, bash/sh, etc.)

o The periodic sending of Telnet Go-Ahead commands can now be disabled
  - This feature is useful for quickly detecting dropped connections
  - Unfortunately, some Telnet clients print/echo the Telnet GA command

o Now sends Telnet DO/WILL BINARY TRANSMIT commands before file transfers
  - Fixes problem with some Unix telnet clients that don't do this themselves

o ctrl/attr.cfg now support lower-case attribute character codes

o Improved server shutdown detection in node threads

o Short (single line) error log entry now includes last Win32 error value

o Displays external netmail address before prompting to forward local mail

o The 'F'ind text command while reading messages can now either show message
  headers only or entire text

o Bugfix: files with on extension in filebase would corrupt listing display

o Optional text/menu/msgtabs.* menu, displayed as the "tab bar" in the
  internal editor instead of the hard-coded tab bar

o New FREESPACEK @-code to display free disk space in kilobytes

o New SERVED @-code to report the number of clients served since started

o Bugfix: telnet gateway now handles temporarily blocked sockets (retries)

o Bugfix: occasional attribute mismatch when restoring saved line with ANSI

o %s command-line specifier now represents the configured start-up directory
  when used in online external program (door) and timed event command lines
  - This is actually a cross-platform compatibility fix for Unix systems
    where '.' is not in the current search path

o New default modules: newuser.js and logon.js to replace Baja equivalents
  - newuser.js optionally sends welcome e-mail to new users
  - logon.js prompts sysop to create guest account (calls makeguest.js)

o New chkspace.js event module to check free disk space and e-mail warning
  to sysop when low


JavaScript
~~~~~~~~~~
o Increased the default JavaScript heap size to 8MB

o JavaScript heap size is configurable
  - JavaScriptMaxBytes key in the [Global] section of the sbbs.ini file
  - SBBSCTRL:File->Properties->Advanced->JavaScript Heap

o console.attributes can now be set with an attribute string
  (Ctrl-A codes without the Ctrl-A escape characters)

o New property: console.ctrlkey_passthru, bit-map specifying which control
  keys will not be handled internally or by global hot key events

o New array, console.color_list[] contains sysop-configured attributes from
  ctrl/attr.cfg (which can now be extended with additional color definitions)

o Timed events now have access to user objects (msg_area, file_area, etc)

o Fixed MsgBase.put_msg_header() - no longer creates duplicate header fields

o MsgBase.get/put msg header/body/tail functions can now access messages
  via message ID (rather than by offset or message number)

o system.spamlog() now takes additional 'from' parameter (typically the SMTP
  reverse-path)

o New system.freediskspacek property - free disk space in kilobytes

o New system.logs_dir and system.mods_dir properties

o Socket poll() method accepts a floating point timeout for fractional timeout
  values

o bbs.sub_info() and dir_info methods now accept optional sub/dir argument

o All bbs methods that accept sub/dir argument will now default to current sub
  or dir if not specified

o New properties: bbs.batch_upload_total and bbs.batch_dnload_total

o bbs.batch_download() now checks if download queue is empty, now returns BOOL
  instead of VOID

o New methods: bbs.good_password(), bbs.select_shell(), bbs.select_editor()

o Fixed msg_area.grp_list[].sub_list[].is_operator and is_moderated properties
  - were true if configured as blank in SCFG (should be false)

o file_area.lib_list[].dir_list[].link property returns (as in v3.10j)

o New properties: file_area.min_diskspace, user_dir, sysop_dir, and upload_dir

o Renamed the File.delete() method to File.remove() - can't use JavaScript 
  keyword as method name

o New method: console.telnet_cmd(cmd,opt) - used to send a Telnet command to
  client (with optional 'opt' value)

o New property: console.aborted (bool), true if user hit Ctrl-C to abort I/O

o Renamed property: console.rio_abortable to console.abortable (no local I/O)

o New global method: lfexpand(), converts line-feeds (LF) to carriage-return
  /line-feed pairs (CRLF end-of-line sequences) in strings

o Bugfix: system.new_user(): if a sysop-configured default new user editor has
  terminal-type access requirements (e.g. ANSI), it will now work

o Services now have access to user objects (e.g. msg_area, file_area, etc.),
  without requiring a false login() call


SMBUTIL
~~~~~~~
o Added support for -i (ignore CRC) option, to override duplicate msg checking


SBBSecho
~~~~~~~~
o The TID (Tosser ID) kludge line is only added when exporting messages

o Adds FSP-1010 Via control code to packed NetMail messages

o 0-byte bundles less than 24-hours old are not deleted or overwritten
  - allows unique bundle numbering if mailer truncates sent bundles

o Unix versions expand sole LFs to CRLFs in NetMail created from text files

o Unix version unpacks bundles with upper or mixed case extensions

o Added log message for routed EchoMail bundles

o Added support for ctrl/twitlist.cfg - optional twit list


ADDFILES
~~~~~~~~
o Ignores ex-ASCII chars in filenames only when run in ASCII-only mode
  - support for foreign language chars in filenames

o Added -L option to specify library name to limit Auto-ADD directory list

o Strips whitespace off beginning of second line ext-desc in files.bbs

o Reverted to the old (v2) method of preparing the file descriptions
  (compressing white-space, etc)


FILELIST
~~~~~~~~
o Displays files with no extension without a '.'


Mail Server
~~~~~~~~~~~
o Added support for external (native) mail processing commands that can modify
  a message's header, body, or recipient list, or reject the message with a
  specific error message based on its contents (SPAM filter, virus scan, etc)
  - may also be used for mailing lists, file requests, etc
  - see ctrl/mailproc.cfg for details

o The current hostname is now also used in determing if a received e-mail is
  addressed to a local or external user

o Better handling of misconfigured/missing DNS server address (for MX-lookups)

o SPAM log now includes the SMTP reverse-path (address) as specified by client

o Added option to enable DNSBL debug log output (MAIL_OPT_DNSBL_DEBUG)

o Active client counter is incremented before (potentially lengthy) DNSBL 
  lookups

o dnsbl_exempt.cfg is now checked against the IP address and the hostname
  of the sending server (if either matches, the server is exempt)

o No longer adds the Organization header field to messages received via SMTP

o Now deletes attached file if MSG_KILLFILE aux attribute set

o New log entry when a delivery failure notification message is created

o Configurable maximum message size (in bytes) - default: 10MB

o Now correctly handles (and rejects) mail headers > 64K in size
  - total length of all header fields for a single message cannot exceed 64K

o Fixed failure to create delivery failure notification message:
  !BOUNCE ERROR -100 (msgbase not open) incrementing data allocation units


FTP Server
~~~~~~~~~~
o SITE WHO command now reports total number of active FTP clients

o Added SITE VER and SITE UPTIME commands

o Added SITE RECYCLE and SITE RECYCLE ALL sysop-only commands

o Fixed normal (non-PASV) file transfers on Unix when running as non-root user
  - if it can't bind ctrl_port-1, then it'll retry the bind using any port (0)

o Now gives uploader credits/minutes upon subsequent downloads (as configured)
  
o Now notifies the uploader of a file when the file is later downloaded

o Data sessions now use non-blocking sockets to prevent occasional locked
  client sessions (noticed on Win9x only)

/* End of V310_NEW.TXT */
