jcs
/subtext
/amendments
/286
GUIDE: Add
jcs made amendment 286 over 2 years ago
--- GUIDE Thu Nov 17 23:10:52 2022
+++ GUIDE Fri Nov 18 09:17:30 2022
@@ -0,0 +1,190 @@
+Subtext: a multi-user BBS server for Macintosh
+Written by joshua stein <jcs@jcs.org> - http://jcs.org/subtext
+
+Subtext is free software; see the LICENSE file for copyright/licensing.
+
+Introduction
+==================================================================
+Subtext is a multi-user BBS server that is developed and runs on Macintosh
+System 6 and above. It supports dialin access through a serial modem and
+Telnet access through MacTCP.
+
+Features
+==================================================================
+- Multithreaded, multi-user BBS server that runs on System 6+
+- Telnet support through MacTCP
+- Direct serial modem support (no Communications Toolbox)
+- Integrated ANSI-capable local console
+- Local log window with smart screen blanking
+- Multiple threaded message boards
+- Multi-user interactive chat
+- Private messaging/mail
+- File uploading and downloading with ZMODEM support
+- Secure user password storage with SHA256
+- View/menu templates with variable expansion
+- Configurable main menu key shortcuts
+- Telnet brute-force IP banning by sending UDP packets to a firewall host
+
+Setup
+==================================================================
+Most of the administration is done through the BBS itself, by logging in as
+a sysop and accessing the sysop menu. BBS settings, file areas, message
+boards, and user accounts can all be modified through this menu.
+
+Editing views must be done from console, as it is easier to work in large
+blocks of text in a Mac window than through telnet.
+
+When first run, Subtext will ask to open an existing BBS database. Clicking
+Cancel will prompt to save a new database. On subsequent runs, Subtext
+will automatically try to open the last database that it successfully opened.
+
+When creating a new database, Subtext will create a default sysop user
+with the username "sysop" and password "p4ssw0rd". It will also fill in
+some defaults such as an example BBS name and hostname.
+
+On launch, Subtext will open its logger window and initialize its connection
+methods, which are only the console by default. Clicking the BBS menu and
+then Open Console will open a sysop session. Pressing ! will access the
+Sysop menu, and then S will enter the BBS Settings menu.
+
+To enable dialin access, change the Modem Port setting to 1 for the modem
+port, or 2 for the printer port depending on where the modem is connected.
+An appropriate Modem Init String can also be configured, though it should
+*not* be configured for Auto-Answer.
+
+To enable Telnet access, set the Telnet Port to anything other than 0, such
+as the standard telnet port of 23. Enabling Telnet requires MacTCP to be
+installed.
+
+View Templates
+==================================================================
+In the BBS -> Views menu, each view used in the BBS can be edited:
+
+ - Pre-Login (Issue)
+ - Main Menu
+ - Short Menu (shown after user has seen main menu)
+ - Account Signup
+ - No Free Nodes
+ - Session Signoff
+
+Views support expansion of variables, which are put inside {{ and }}
+characters, such as "You are connected to {{node}}."
+
+Supported variables:
+
+ - {{B}}
+ Enable bold attribute if the user's terminal supports ANSI (otherwise
+ it prints nothing).
+ - {{/B}}
+ Resets ANSI attributes (including bold) if the user's terminal supports
+ ANSI.
+ - {{#}}
+ Stops varible expansion for the rest of the template. Useful when
+ printing untrusted data (mostly used internally).
+ - {{node}}
+ The current node, such as "ttyt0".
+ - {{phone_number}}
+ The system's configured phone number, such as "(312) 555-1212".
+ - {{time}}
+ The current system time in 24-hour format, such as "23:59".
+ - {{username}}
+ The currently logged-in user's username, or "guest".
+ - {{new_mail}}
+ If the user has any new, unread mail messages, the count such as
+ "(4 New)". Otherwise it is blank.
+ - {{"string"}}
+ Print the literal string "string". This is useful in conditionals.
+
+Variable results can also be truncated or padded to a particular length,
+which can be helpful when creating menus with columns. This is done with
+the pipe character and the length, such as:
+
+ {{ username|10 }}
+
+Conditionals are also supported with ternary operators "?" and ":" to print
+something if the condition is true (or non-null), otherwise print something
+else. The following conditionals are supported:
+
+ - user
+ True if the current user is logged in as a non-guest.
+ - sysop
+ True if the current user is a sysop.
+
+For example, the following would print one string in menu if the user is
+a sysop, otherwise it prints something else.
+
+ {{ sysop ? "Answer sysop page" : "Page the sysop" }}
+
+Or when printing mail for the user:
+
+ {{ user ? new_mail : "Guests cannot access mail." }}
+
+Main Menu Configuration
+==================================================================
+In addition to creating a custom menu layout, it may be desirable to change
+the mapping of keys to functions. This can be done through Edit Menu
+Options. The mapping is one action per line, with the Action, Menu Key,
+All Keys list, and Label, separated by a colon. Blank lines and those starting
+with # are ignored.
+
+When there is no custom Main Menu view defined, a list of options will be
+programmatically generated by showing all menu options with a Menu Key
+defined with the Menu Key and Label. Options with no Menu Key defined are
+still accessible by any key in the All Keys field, but are not shown.
+
+The default mapping is:
+
+ # Action:Menu Key:All Keys:Label
+ BOARD_SHOW_FIRST:B:Bb:Message Board
+ BOARD_SHOW_1::1:Message Board 1
+ BOARD_SHOW_2::2:Message Board 2
+ BOARD_SHOW_3::3:Message Board 3
+ BOARD_SHOW_4::4:Message Board 4
+ BOARD_SHOW_5::5:Message Board 5
+ BOARD_SHOW_6::6:Message Board 6
+ BOARD_SHOW_7::7:Message Board 7
+ BOARD_SHOW_8::8:Message Board 8
+ BOARD_SHOW_9::9:Message Board 9
+ BOARD_SHOW_10::10:Message Board 10
+ CHAT:C:Cc:Multi-User Chat
+ FILES_MENU:F:Ff:File Areas
+ GOODBYE:G:GgXx:Goodbye
+ RECENT_LOGINS:L:Ll:Recent Logins
+ MAIL_COMPOSE:N:Nn:Compose New Mail
+ MAIL_MENU:M:Mm:Private Mail {{ user ? new_mail : "" }}
+ MOTD:O:Oo:Message Of The Day
+ PAGE_SEND_OR_ANSWER:P:Pp:{{ sysop ? "Answer Page" : "Page Sysop" }}
+ SETTINGS_OR_SIGNUP:S:Ss:{{ user ? "Settings" : "Signup For Account" }}
+ WHOS_ONLINE:W:Ww:Who's Online
+ SHOW_MENU:?:?:List Menu Options
+ SYSOP_MENU::!:Sysop Menu
+
+Trusted Host
+==================================================================
+While Subtext can handle direct TCP connections for Telnet, it will likely
+be behind a firewall/trusted host. To limit brute-force login attempts,
+Subtext has a hard-coded list of banned account names that most bots will
+try in rapid succession, such as "root", "admin", etc. When a Telnet client
+tries one of these usernames, Subtext can send a UDP packet to the trusted host containing the IP to be banned (in dotted-quad plaintext format, such
+as "192.168.1.1"). The trusted host IP and port can be configured in the
+Sysop menu. If either value is empty/zero, this functionality is disabled.
+Since there is no authentication with this mechanism, ensure the trusted
+host is only listening for UDP packets on the interface facing the Subtext
+server!
+
+Also during Telnet negotiation, if the IP of the connecting client matches
+the trusted host's IP, Subtext will honor the "REMOTE_ADDR" value present
+in the NEWENV variable list and use it as the client's connecting IP address
+in logs. This is useful if the trusted host is acting as a web proxy and can
+pass the IP of the web client through to Subtext over Telnet.
+
+Screen Blanking
+==================================================================
+When running on compact Macs, it is recommended to enable Subtext's
+screen blanking option to prevent the log window from burning into the
+CRT. When the system is idle for a configured amount of time, it will blank
+the entire screen for a configured amount of time, immediately unblanking
+as soon as a new connection comes in, or when a key is pressed or a mouse
+button is clicked. This is better than using a dedicated screen saver which
+will not unblank after a period of time, and may be wasting CPU time
+drawing flying toasters while Subtext needs to process user activity.