SPECIAL NOTES ABOUT THIS UPDATE:
This document covers all PX/WIN Version 10.0 Build 500.2 changes organized by component. For the main Wildcat! 500.2 change list see the Version 10.0 Build 500.2 notes in the AUP help system.
Changes, New Features and Enhancements by Wildcat! Component
PXWIN (Platinum Xpress)
- NEW: Added BinkP/1.1 protocol support to the PX Frontend mailer PXONLINE. PX now supports inbound and outbound Fidonet file transfers using the BinkP/1.1 protocol (FTS-1026) over TCP/IP. Compatible with popular BinkP mailers including BinkIT, Internet Rex (IR), and sbbs. - NEW: BINKP.UMP is a new Modem Profile for BinkP support. Import the profile using the command: cd \wcat wcmodemcfg /importmp:binkp.ump Then run wcConfig | Modems Setup, add/edit a node, and set the Modem Profile to BinkP. Set the InitBaud field to the desired listen port (default 24554). Save and restart wconline and pxonline. For outbound-only nodes (no listen port), use a NONMODEM/NULL profile and the BinkP dial string format: IBN or hostname:port. - CHG: Online help files updated from *.hlp (WinHelp) to *.chm (HTML Help). F1 help in pxconfig.exe, pxtools.exe, pxonline.exe, and pxecho.exe now opens the corresponding *.chm file. - UPD: PX/WIN installer now removes legacy WinHelp (*.hlp) files on install or upgrade. Online help has used the HTML Help (*.chm) format since v10. The old WinHelp files are removed automatically during setup. - UPD: All PX desktop windows now remember which monitor they were on and reopen on that monitor after a restart. On a multi-monitor system, pxonline, pxecho, pxtools, and pxstart previously always reopened on the primary monitor. Windows now restore to the correct monitor. Popup dialogs (startup splash, shutdown confirmation, manual poll) also follow the main window to whichever monitor it occupies. - ENH: PxOnline and PxEcho windows now show the BBS name in the title bar (500.2 26.5.27). The Platinum Xpress Online Controller, each node activity window, and the Platinum Xpress Data Processor window now include the BBS name, for example: Platinum Xpress Online Controller - NTBBS Node 1 Activity Window - NTBBS Platinum Xpress Data Processor - NTBBS This makes it easier to identify which system you are managing when running PX tools on multiple machines. - NEW: fidomsg.wcx handles outbound Fidonet netmail trigger. When a user posts a Fidonet netmail message, the new fidomsg.wcx notifies the PX server to process outbound mail immediately via a semaphore signal. This was done via "Enter A message.wcc" and "Html-Create Message.wcc" - NEW: Entering a message in a Fido ECho mail conference will trigger an echo mail scan by PxEcho. This was done via "Enter A message.wcc" and "Html-Create Message.wcc" - NEW: Fidomsg automatically pre-fills the Subject line with the node password when writing to AREAFIX or FILEFIX (500.2 26.5.27). When composing a Fidonet netmail message addressed to AREAFIX or FILEFIX, the Subject field is now automatically pre-filled with the AreaFix or FileFix password from the Node Book Manager for that node. The Subject field remains editable so you can review or change the password before sending. This saves you the step of looking up or remembering the password each time you send an AreaFix or FileFix command. - FIX: FREQ documentation added to the PX/WIN reference set (500.2 26.5.29). A plain-text reference file docs\filerequest.txt has been added covering the File Request (FREQ) configuration: General Options, Request Paths, Magic Names, and the FREQRESP.TPL response template substitution keywords. Contributed by Terry Roati (3:640/238). - NEW: PXHELP.CMD -- command line quick-reference for all PX/WIN tools (500.2 26.5.29). Run PXHELP from any command prompt for a one-line description of every PX/WIN program and utility. Identifies pxonline and pxecho as the core 24x7 processes; all other tools are on-demand helpers. - NEW: html-suggest-nodes.wcx and html-get-fixpwd.wcx added to the PX/WIN distribution (500.2 26.6.9/10). Two new wcBASIC server scripts are installed to the Wildcat! server folder (c:\wcat) alongside the existing fidomsg.wcx: html-suggest-nodes.wcx Ajax autosuggest backend for the wcWEB new message compose form. Searches the compiled PX nodelist by sysop name or FTN address prefix and returns matching entries to the browser. Used by the To: name and FTN address fields in message_create.htm. html-get-fixpwd.wcx Ajax backend that returns the AreaFix or FileFix password for a given node address from the PX Node Book Manager. Used by the wcWEB compose form to pre-fill the Subject line when the To: name is AreaFix or FileFix. Both scripts require PX/WIN to be installed and the nodelist compiled by PXNLIST. They are invoked automatically by the wcWEB compose form and do not require any manual configuration. See wcWEB for the full description of the autosuggest feature.
PXONLINE (Platinum Xpress Online Controller)
- NEW: Nodelist IBN:/INA: flag support. PX now reads IBN and INA: flags from the compiled nodelist to determine BinkP capability and hostname for a node. Re-run PXNLIST after upgrading to recompile the nodelist into the updated format. - NEW: CRAM-MD5 challenge-response authentication for BinkP sessions (FSP-1018). When PX answers an inbound BinkP call, it now issues a CRAM-MD5 challenge in the session greeting (M_NUL OPT CRAM-MD5-). An originating mailer that supports FSP-1018 responds with an HMAC-MD5 hash of the session password rather than sending it in plaintext. PX as originator also supports CRAM-MD5: if the answering mailer offers a challenge, PX sends the HMAC-MD5 response automatically. Plain-text password exchange is retained as a fallback for mailers that do not support CRAM-MD5, so interoperability with existing nodes is preserved. - FIX: BinkP inbound bundle files now routed to EchoInPath for PxEcho tossing. Files with day-of-week bundle extensions (.MO .TU .WE .TH .FR .SA .SU) received via BinkP were incorrectly placed in the general InPath rather than EchoInPath. PxEcho watches EchoInPath for bundles to toss; the misrouting caused received echo mail to be stranded in the inbound folder. Routing now mirrors the EMSI/FTSC transfer path exactly: .PKT / .REQ -> WorkPath day bundles -> EchoInPath (triggers $TOSS.0 semaphore) .TIC -> TicsInPath everything else -> InPath - NEW: BINKP service state integrated with wcNode service control. The BINKP mailer service state is now published to the wcNode service monitor. Operators can issue REFUSE, STOP, or START commands from wcNode to control inbound BinkP sessions without restarting pxonline. REFUSE - stops accepting new inbound calls; sessions in progress continue STOP - initiates orderly shutdown of all BinkP listener nodes START - resumes accepting inbound calls after REFUSE - NEW: BinkP inbound IP flood filtering and connection rate limiting. PX now protects the BinkP listener against flood attacks and abusive IP addresses using two complementary mechanisms: 1. Connection rate limiting (wciptrack.dll): Tracks connection attempts per IP in a sliding time window. After BINKP_CONNECT_LIMIT (default: 10) attempts within the window, further connections from that IP are silently dropped until the window expires. Configure the time window and drop delay in wc:\data\iptrack.ini: [BINKP] BlockEnabled=1 CacheTimeoutSecs=60 SessionDropDelay=2 Omit the [BINKP] section or set BlockEnabled=0 to disable rate limiting. Successful authentication clears the attempt counter for that IP. 2. Permanent IP block list (wcserver / CheckClientAddressEx): Specific IP addresses can be permanently blocked by adding them to wc:\cfig\ipaccess-binkp.dat using the standard Wildcat! IP access file format: -165.154.172.244 (block this address) +192.168.1.0/24 (allow this subnet) If ipaccess-binkp.dat does not exist, all IPs are allowed (no filtering). Temporary semaphore-based blocks are stored in wc:\iptrack\. - FIX: PxOnline event scheduler no longer fires hourly events repeatedly when the event window crosses midnight (23:xx hour). This restores correct behavior for all hourly events active in the 23:xx window (e.g. "Hourly Mail Scan Poll Hub"). All other hours were unaffected. - FIX: BinkP nodelist IBN:hostname and IBN:hostname:port formats now parsed correctly by ParseBinkpDialStr in pxonline. Nodes that publish their BinkP address as IBN:hostname (e.g. IBN:ftn.vk3heg.net) or IBN:hostname:port (e.g. IBN:freeway.vkradio.com:24555) without a separate INA: flag could not be polled by PX. The parser treated the part after IBN: as a port number only; when it was a hostname, StrToIntDef silently returned the default port and the hostname was discarded, leaving no dial address. ParseBinkpDialStr now handles all four IBN/INA flag combinations: IBN BinkP on port 24554, hostname from INA: IBN:port BinkP on non-default port, hostname from INA: IBN:hostname BinkP on port 24554, hostname from IBN: IBN:hostname:port BinkP on non-default port, hostname from IBN: INA:hostname still takes priority over a hostname embedded in IBN: when both are present. Nodes with -Unpublished- phone and IBN:hostname in their nodelist entry are now dialable without a manual PXCONFIG override. - FIX: Beta 16 point-node password bug where polling a point sent no password. - FIX: Fixed File Requests (FREQ) over BinkP sessions. File requests sent by a remote node are now fulfilled and the requested files are sent back in the same BinkP session. Previously the request was received but no files were returned. - FIX: Fixed file transfer byte counts showing (0) in PX transfer logs for BinkP sessions. Both the sent and received file sizes now appear correctly in XFERFILE.LOG, XFERMAIL.LOG, and the node console log lines ("File Sent: filename (bytes) cps: rate"). - FIX: Fixed TIC file forwarding - the accompanying file is now sent with the TIC to downstream nodes. When PX received a TIC+file bundle and forwarded it to linked nodes, only the TIC control file was transmitted; the actual attached file was silently skipped. Both the TIC and its associated file are now sent together in the same BinkP session. - FIX: BinkP sessions with simultaneous bidirectional transfer now correctly acknowledge all received files. When a remote system (such as Synchronet) sends files at the same time as PX is sending its own outbound files, PX now properly receives and acknowledges all incoming files. Previously, files arriving during the outbound send phase were silently discarded and the remote would re-send them on every subsequent connection. - UPD: Node Activity log window now shows a dated session divider at the start of each inbound or outbound BinkP session. A separator line with the current date appears at the beginning of each session making it easier to distinguish individual sessions in the log. - UPD: Mouse wheel scrolling now works in the Node Activity log window (pxonline) and the PXECHO log window (pxecho). - FIX: Outbound file attaches and TIC queue entries no longer re-send on every BinkP session after a successful transfer. After a session completed, some queued file entries were not being marked as sent and PX would re-send those files on every subsequent connection. Fixed. - CHG: CRAM-MD5 password security is now opt-in (default OFF). CRAM-MD5 is an optional BinkP extension that hashes the session password before transmitting it. Some mailers do not support it and loop on reconnect when PX offered it. CRAM-MD5 is now disabled by default so PX works cleanly with all BinkP mailers out of the box. Sysops who want it can enable it per the BinkP configuration notes. - UPD: PX version and beta label now appear in the BinkP session greeting. The session log at the remote end now shows the full PX build identifier (e.g. PxOnline/10.0b21). Hub operators can confirm which version their downlinks are running without having to ask. - FIX: Session passwords no longer appear in plain text in PX log files. Several log lines (session accepted, session downgraded, CRAM-MD5 result) were showing the expected session password in plain text. All password references in the BinkP session log are now masked. Log lines now show "***" when a password is configured and "none" when no password is expected, allowing operators to diagnose configuration issues without exposing credentials. - NEW: BinkP Mailer Compatibility reference file added. A new file system\Binkp-compat.ini is installed with PX/WIN. It documents the BinkP mailer identifiers and known compatibility characteristics of all mailers observed on the FTN network, including binkd, Mystic, Argus, BinkIT, Synchronet, Internet Rex, and mbcico. This file is used by PX internally and may be reviewed by sysops for reference. - FIX: Session divider line in the Node Activity window no longer causes a blank line on 80-column terminals. - FIX: BinkP M_ADR session greeting now sends the complete AKA address list. PX was sending only the primary address in the BinkP M_ADR handshake. Nodes that authenticate sessions by matching the remote address against their nodebook (e.g. Synchronet / BinkIT) were rejecting the connection with "Sorry, you are not who I expected" when the expected address was an alias, not the primary. BinkpCall and BinkpAnswer now send the full alias pool: primary address followed by all configured AKAs, respecting the AllowAliases event flag. Addresses include the @domain suffix when the AKA is configured with one in PXCONFIG (e.g. 21:5/100@fsxnet). Sysops should verify their AKA entries in PXCONFIG include the correct @domain suffix. - CHG: CRAM-MD5 is now on by default with per-mailer exceptions (replaces the global opt-in introduced in Beta 20). Beta 20 disabled CRAM-MD5 globally to avoid reconnect loops with non-compliant mailers. Beta 22 restores CRAM-MD5 as the default and uses a per-mailer compatibility table to disable it only for mailers known not to support FSP-1018 correctly. The built-in table covers all mailers observed on the FTN network: PxOnline CRAM-MD5 ON (PX-to-PX, full FSP-1018) binkd/1.1a-115 CRAM-MD5 OFF (violates FSP-1018 fallback, loops) binkd/1.1a-113 CRAM-MD5 OFF (older Linux build, conservative) binkd/1.1a-49 CRAM-MD5 OFF (older Win32 build, conservative) Mystic CRAM-MD5 OFF (binkp/1.0, CRAM-MD5 unconfirmed) Argus CRAM-MD5 OFF (binkp/1.0, CRAM-MD5 unknown) BinkIT CRAM-MD5 OFF (no issues, conservative default) Internet Rex CRAM-MD5 OFF (unmaintained, unknown) mbcico CRAM-MD5 OFF (Unix FTN, unknown) (all others) CRAM-MD5 ON (default) - UPD: system\Binkp-compat.ini controls per-mailer CRAM-MD5 settings. The installed system\Binkp-compat.ini now actively controls CRAM-MD5 behaviour per remote mailer VER string. The file merges with the built-in defaults: a matching section overrides the built-in entry for that mailer; an unrecognised section adds a new entry. Sysops can add local overrides or new mailer entries without updating PX/WIN. A restart of pxonline is required for changes to take effect. If the file is absent, the built-in defaults apply and a warning is logged at startup. - FIX: Leftover mail bundles from a previous interrupted session are no longer re-sent as outbound mail in the next BinkP session. If a BinkP session ended abnormally (power loss, crash, dropped connection), temporary bundle files could be left behind in the work folder. At the start of the next session PX was picking these up and sending them out again as new outbound mail, which caused messages to appear to come from the wrong system or arrive in the wrong conference at the receiving end. PX now moves any leftover temporary bundles from the work folder to the inbound folder at the start of each new session. They are tossed by PxEcho as normal inbound mail rather than re-transmitted. - FIX: Outbound mail packets sent to a node with a per-node session password are now sealed with the correct password. When a node in the nodebook has its own password that differs from the default session password, PX was sealing the outbound PKT file using the wrong password. The receiving system rejected those packets and the mail was never imported. PX now looks up the correct per-node password when building each outbound PKT file. - FIX: Sessions with mailers that send an End-of-Batch signal before acknowledging the last file (e.g. Argus) now complete cleanly. PX was waiting for a file acknowledgement that never arrived because the remote mailer had already sent an end-of-batch signal instead. PX treated this as a protocol error and closed the connection without a clean handshake, and re-queued the same files for the next session. PX now recognises an end-of-batch signal at any point in the file exchange and finishes the session gracefully. - NEW: PX now automatically signals PxEcho to process received TIC files. When PX receives TIC file distribution packets over a BinkP session, it now notifies PxEcho to process them immediately. Previously PxEcho was not notified and sysops had to run a separate batch file after each session to trigger TIC processing. The session log now shows TIC:Y at the end of any session that received TIC files. - FIX: Multi-node BinkP polling no longer sends several nodes to the same unreachable address at once (the "node pile-on" problem). In a multi-node PX setup, when one node tried to call a remote BinkP site and the remote was down or unreachable, the failed poll entry was being released back to the shared pool. On a TCP/IP network (unlike modem lines where a busy signal provided natural serialization), all idle nodes could immediately grab the same entry and attempt the same address simultaneously, resulting in two, three, or four nodes piling onto the same unreachable destination within seconds. Default behavior (PollingNode = 0 in PXCONFIG Polling Delegation): PX/WIN handles this automatically starting with 500.2. The first node to claim a poll entry now owns it for all retry attempts. Other nodes skip that entry until polling is manually reset. No PXCONFIG change is required for this protection to take effect. If you want a specific node to handle all BinkP polls: Open PXCONFIG -> Frontend Mailer -> Polling Delegation. Set the "Node to handle Netmail Polls", "Node to handle EchoMail Polls", and "Node to handle TIC Polls" fields to the node number you want to own BinkP polling (e.g. 2 for node 2). Set to -1 to let the first available node claim each poll entry and stick with it. Set to 0 to use the automatic 500.2 first-come/first-served behavior. For a full explanation of the polling delegation settings including the change introduced in 500.2 for BinkP/TCP environments, see: docs\delegate.txt - FIX: PxOnline no longer crashes with an application error during the hourly mail scan event on multi-node systems. On systems running two or more PX nodes, pxonline could crash with an application error (APPCRASH in VCL30.dpl) at the top of the hour when the mail scan event fired. The crash appeared in an unrelated part of the program and the timing varied, making it difficult to reproduce. The root cause was a thread-safety issue in an internal data structure used to coordinate BinkP outbound polling across node threads. The structure has been changed to use a thread-safe storage type. No configuration change is required. - ENH: Improved Poll Entry Creation Error display for Manual Polls. When a manual poll request fails (via the Manual Poll window in pxonline), the error popup now includes a numeric error code identifying the reason: Error 1 - Invalid address (zone is zero) Error 2 - Cannot open poll queue file (check PXOBQUE.DAT) Error 3 - Node is flagged bad (use PxTools Poll Manager -> Reset Calls Exceeded to clear the flag, then retry the manual poll) Error 4 - Bad password on record (tick Bypass Password in the Manual Poll window and retry) Error 5 - Write error (disk full or corrupt poll queue file) - FIX: Pressing F1 or clicking Help in PxOnline node windows no longer opens a Microsoft web page. On Windows Vista and later, the legacy WinHelp viewer is no longer included with Windows. Any program that calls the old WinHelp API is silently redirected to a Microsoft download page instead of showing help. PxOnline was falling back to WinHelp because its HTML help handler was being installed too early in the startup sequence and was later reset during window creation. PX now installs the HTML help handler after all node windows have been created, so it is always in effect when the user presses F1 or clicks Help. PxOnline, ManualPoll, and File Request windows all open the correct pxonline.chm help file. PxEcho and PxConfig were not affected by this problem. - FIX: AreaFix and FileFix responses are now delivered in the same BinkP session that received the request (Beta 33). Previously, a downlink's AreaFix or FileFix request required two sessions: the first to deliver the request, and a second session (initiated by the downlink) to receive the hub's reply. This was a holdover from the modem era when slow links and slow CPUs made deferred processing practical. PxOnline now processes received mail packets inline before sending its outbound file list. The AreaFix or FileFix reply is created and delivered in the same inbound BinkP session that received the request. No second call is required. The wcLocal notification for the reply message is immediate. - FIX: Node-specific auto polls silently dropped when designated node is busy (500.2 26.5.31). Auto polls configured in PXCONFIG with a specific node assignment (Node Handling Poll = N) were silently skipped when that node was occupied in a BinkP session during an event transition, causing the poll to never be enqueued for that event cycle. Root cause: CheckAutoPoll() in the event scheduler contained a gate (CheckPXNodeAccess) that prevented any node other than the designated one from queuing the poll. When the designated node was busy in FE_EVENT, it did not call CheckEvents() for that cycle. Another available node would call CheckEvents() and reach CheckAutoPoll(), but the gate would silently discard the poll entry. Fix: the CheckPXNodeAccess gate has been removed from CheckAutoPoll(). Any node can now enqueue a node-specific poll during an event transition. NextPollRec() already enforces that only the designated node executes the poll when it becomes available -- the gate was redundant. Reported by Michael Purdy (99:1/5). - FIX: Hourly event re-run suppression could miss due to actual-runtime timestamp (500.2 26.5.31). Hourly and minute-interval events were stamped with the actual clock time at which they fired (e.g. 10:00:03) rather than the scheduled slot boundary (10:00:00). The suppression check in the event scheduler compares the current time against the rounded-down hour of LastRunTime. When the two values were derived differently -- one rounded, one not -- edge conditions near the hour boundary could allow an event to be selected again in the same slot. Fix: the event record now stamps RunStartTime (the pre-rounded slot boundary already computed by GetCurrentEvent) instead of the raw CurrentTime. This makes selection and suppression use identical bucket boundaries. - FIX: Missed-event recovery path in event scheduler was never reachable (500.2 26.5.31). A conditional expression in InitializeEventSystem contained a logical contradiction: (X >= Y) AND (X < Y) is always false. The recovery path intended to detect and reschedule missed events therefore never executed. Fix: corrected the condition to compare CurrentTime against RunStartTime and RunStopTime, the fields that bound the active event window. - FIX: BinkP outbound polling now follows the same duplicate-prevention method as the modem path (500.2 26.6.2). BinkP and modem outbound polling both rely on the PXPOLL.DAT record lock (_pqLocked) set atomically by NextQueueRec. Only one node thread can claim a given poll at a time; the lock is cleared by SetPollInActive when the session ends. A secondary in-memory locking layer introduced in a prior build was redundant and could cause both nodes to loop indefinitely reporting "Poll : in progress on another node, skipping" if a release was missed. That layer has been removed. - FIX: BBS name containing an ampersand displayed with the following character underlined in the Manual Poll address label (500.2 26.6.1). Windows VCL TLabel treats the & character as an accelerator prefix and underlines the next character (e.g. "SSI R&D" displayed as "SSI RD" with D underlined). The Manual Poll address label now has ShowAccelChar=False, which disables accelerator interpretation for that label. - ENH: BinkP outbound session log now shows which local AKA address is used for each poll (500.2 26.6.3). After AKA matching selects the best local address for the remote node's zone, the session log now shows a "Using Address z:n/f" line immediately after the "Polling" line. This makes it easy to confirm that the correct AKA is being presented in M_ADR. - FIX: BinkP answering side now performs a graceful close before closing the socket, ensuring M_GOT and M_EOB are delivered to the remote (500.2 26.6.4 revised 26.6.7). BinkpAnswer previously called closesocket() immediately after sending M_EOB. On Windows, this can issue a TCP RST that discards buffered send data before the remote reads it. The remote (mbcico, SBBS) would see "connection closed by foreign host" and treat the transfer as failed despite PX having sent M_GOT. 500.2 26.6.4 (b44): BpShutdown() added -- shutdown(SD_SEND) + drain + close. Mirrors TSocketIO::Shutdown() in the wcServer socket layer. 500.2 26.6.7 (b46): BinkpAnswer revised to use BpDrain (passive drain, no shutdown(SD_SEND)) after sending M_EOB. See b46 entry below for details. - FIX: BinkP outbound caller no longer logs a false "receive error" after a clean session end (500.2 26.6.5). After completing a BinkP outbound session, the Phase 6 drain loop could log "receive error in Phase 6 err=10060" even though the session had completed successfully (TX:Y PKT:Y). The error appeared when the remote mailer (e.g. binkd) closed the TCP connection during PX's post-EOB drain window. WSAETIMEDOUT (10060) during Phase 6 after a successful exchange is expected behavior and is now treated the same as a clean EOF. The log will instead show "remote closed connection (session end)". BpShutdown() is also now called before closesocket() in BinkpCall, mirroring the BinkpAnswer fix from b44. Reported by Terry Roati (3:640/238). - ENH: Modem-specific menu items are now hidden for BinkP nodes (500.2 26.6.5). The right-click popup menu on the node controller grid and the Options menu in each node activity window previously showed modem-specific items for all nodes regardless of type. For BinkP nodes (BINKP profile or NONMODEM/NULL profile with BinkP dial string), the following items are now hidden: Make Modem Busy Reset Modem / Reset Modem/Abort Hangup Modem Release Port (IDLE) / Release Port Comm Properties / Display Comm Properties Trace Log (popup menu only) Terminal Window (popup menu only) Items that apply to all nodes remain visible regardless of node type: Activity Window, No Answer, Mailer Only, Manual Poll, Poll Boss Address, Reset Event, Verbose Log, and Backup Packets. On systems with mixed node types (e.g. BinkP nodes 1-3 and a Netserial node 4), each node's menu adapts correctly when right-clicked. - FIX: BinkP session with binkd-1.1a-113 marked FAILED after receiving a PKT, followed by an empty retry poll (500.2 26.6.7). After receiving a PKT bundle over BinkP and completing the session, binkd would log "connection closed by foreign host", mark the session FAILED, and restore a poll entry pointing to an empty queue. The PKT was actually received; the retry session found nothing to transfer. Root cause: TCP protocol requires the caller (client) to initiate the TCP close after the file exchange is complete. The answering side (server) should wait for the caller's FIN rather than sending one first. b44's BpShutdown() called shutdown(SD_SEND), sending PX's FIN immediately after M_EOB. binkd was still in its post-M_GOT receive loop when PX's FIN arrived and interpreted it as an abnormal close. Fix (b46): BinkpAnswer now calls BpDrain() after sending M_EOB instead of BpShutdown(). BpDrain passively reads incoming data (up to 10x8KB) without sending a FIN, allowing the caller to initiate the close. PX waits for the caller's EOF and then closes the socket cleanly. BinkpCall (outbound caller) continues to use BpShutdown() as the caller is expected to send the first FIN. Reported by Terry Roati (3:640/238) -- binkd-1.1a-113 calling tfb-bbs.org. - FIX: BinkIT (Synchronet) and JSBinkP authentication failure when a session password is configured (500.2 26.6.7). BinkIT and JSBinkP require CRAM-MD5 authentication when a session password is set. If the answering side does not offer CRAM-MD5, they send an M_ERR "CRAM-MD5 authentication required" and drop the session. The PX mailer compatibility table (binkp-compat.ini and internal defaults) includes an entry for the BinkIT/JSBinkP version identifier. That entry was incorrectly set to disable CRAM-MD5 for these mailers. The entry is corrected to enable CRAM-MD5 for all BinkIT and JSBinkP sessions. Reported by Dan Clough (1:135/382). - FIX: Netmail PKT header origin address now matches the AKA used to compose the message (500.2 26.6.7). When a user composed outbound netmail using an alias address (e.g. 3:712/1321.10 rather than the primary 99:1/5), PX correctly preserved the alias as the message origin in the netmail queue. However, WC2FidoPkt was called with the primary address (CCI.HostFidoAddress) as the PKT header origin regardless of the message origin address. The resulting PKT showed: Message From: 3:712/1321.10 (correct) PKT header From: 99:1/5 (incorrect) Some receiving mailers and processors reject or flag PKTs where the message origin and PKT header origin differ. Fix: MakeNetMailFileList (QueLib.pas) now uses the message queue origin address (nrec.Oaddress) as the PKT header origin when that address is a local AKA (AddRouteVia = FALSE). For mail that originates outside the local system and is being routed, the primary address is used as before. Reported by Michael Purdy (99:1/5). - ENH: BinkP inbound session log now shows which local AKA address is used (500.2 26.6.7). The "Using Address z:n/f" log line added in 500.2 26.6.3 for outbound polls now also appears for inbound sessions answered by BinkpAnswer. Both directions show the address PX presents in the M_ADR handshake. - FIX: BinkP inbound "Using Address" now logged after authentication with the correct zone-matched AKA (500.2 26.6.8). Previously the "Using Address" log line appeared before authentication and used the primary address rather than the AKA matched to the remote node's zone. It now appears after M_OK, showing the address that was actually selected and presented to the remote system. - FIX: Event scheduler collision -- first-scheduled hourly event now wins when multiple events share the same minute offset (500.2 26.6.8). When two or more hourly events were configured to run at the same minute offset (e.g. both at :00 past the hour), the scheduler could fire both events in the same cycle. The first event in the list now wins and the others are deferred to the next cycle. - FIX: AKA zone-family matching now correctly selects a local alias from the same FidoNet zone family (zones 1-6) when calling or answering a node (500.2 26.6.8). When an outbound or inbound BinkP session involved a node in a FidoNet zone (1 through 6) and the system had both a FidoNet AKA and a non- FidoNet AKA (e.g. zone 99), PX was selecting the wrong AKA and logging "Using Address 99:1/1" instead of the correct FidoNet address. PX now applies a zone-family fallback: when no exact zone match is found, all FidoNet zones (1-6) are treated as the same family for AKA selection purposes. This ensures that a zone 1 node calling into a system with a 3:xxx AKA, or vice versa, gets the FidoNet AKA rather than an unrelated network address. - FIX: BinkP poll no longer fails for nodes with trailing whitespace in their nodelist flags entry (500.2 26.6.8). ParseBinkpDialStr now trims the Options string before parsing as a secondary safeguard. See PXNLIST for the root cause and the PXNLIST database fix. Re-run PXNLIST after upgrading to recompile the nodelist with clean flag data.
PXCONFIG (Platinum Xpress Configuration)
- NEW: PxEchoAreas.txt maintained by PXCONFIG Echo Manager. PXCONFIG now writes a file system\PxEchoAreas.txt listing the conference numbers of all active non-passthru PX echo areas. This file is used by the "Enter a Message" and "Html-Create Message" scripts to determine whether to trigger a PxEcho scan signal when a message is posted. The file is created automatically on first run and kept current whenever echo areas are added, edited, imported, or deleted in PXCONFIG. - ENH: Received file attaches can now be routed to a per-node inbound subfolder (AltImportPath, Beta 30). When a node in the Node Book has an Optional Internet Import Path configured, non-mail file attaches received from that node over a BinkP session are placed in a subfolder below the standard inbound path rather than the inbound path itself. The subfolder is created automatically on the first receive. Mail packets, echo bundles, and TIC files are not affected and continue to route to their normal destinations so that PxEcho tosses them without any change. Example: set Optional Internet Import Path to TERRY for a node that sends daily log files. Those files arrive in inbound\TERRY\ while all mail from that same node tosses normally from inbound\. This prevents filename collisions when multiple nodes send files with the same name (such as NODELIST.Z or FILES.LST) and makes it easy to identify which node sent which files. To configure: PXCONFIG -> Node Manager -> edit the node -> set the Optional Internet Import Path field (max 40 characters, folder name only, no path separators). Leave blank to keep current behaviour. - FIX: File Echo Manager and Mail Echo Manager node lists now show only nodes from the correct network (Beta 33). In the Echo Manager (both File and Mail), the Available Nodes list for a given echo was showing nodes from all networks rather than only nodes in the same zone as that echo. This was a regression introduced in Beta 32 when an unrelated security filter was corrected. Nodes are now filtered by zone so that only nodes belonging to the same network as the selected echo are shown in the Available Nodes list. - FIX: PXCONFIG Security Setup now correctly displays all entries and the Add button works (500.2 26.5.27). When the Security Setup contained two or more entries, only the first entry was displayed in the list. In addition, clicking the Add/New button appeared to do nothing. Both issues are now corrected. Reported by Michael Purdy (99:1/5). - ENH: Sub-hourly event scheduling -- Minute interval added (500.2 26.5.29). The Event Editor When group now includes a Minute option alongside the existing Hourly, Daily, and Monthly choices. When Minute is selected, the Run Every field accepts a value from 1 to 59. For example, setting Run Every to 15 fires the event every 15 minutes within the configured Start/Stop Time window. Existing events are not affected. The Minute interval reuses an internal ordinal that was previously reserved for a Yearly type that was never implemented, so no data migration is required. - FIX: Node Book Manager password fields no longer force uppercase (500.2 26.5.29). The Session Password, Mail Packet Password, AreaFix Password, FileFix Password, and TIC Password fields in the Node Book Editor previously converted all typed characters to uppercase automatically. This meant a sysop who typed a mixed-case or lowercase password would silently store the uppercase form, and PX would send the uppercase version to the remote system. The forced-uppercase behavior has been removed. PX now stores and sends passwords exactly as entered. Password behaviour note: PX inbound session verification (BinkpAnswer) normalises both the received password and the stored expected password to uppercase before comparing, so inbound sessions always succeed regardless of the case the remote sends. This is the same case-insensitive design used historically by Wildcat!. PX outbound (BinkpCall) sends the password exactly as stored in the Node Book. If the remote mailer performs a case-sensitive inbound check and expects a specific case, PX must store the password in the same case that the remote expects. With the forced-uppercase UI removed, sysops can now enter the password in the exact form required. A new option, Enable Case Sensitive Passwords, has been added to PXCONFIG General Fidonet Mailer Setup (Misc Options tab). When enabled, PX inbound verification compares passwords as-is (case-sensitive). When disabled (default), PX normalises both sides to uppercase before comparing, preserving backward compatibility with systems that historically used uppercase-only passwords. See the b40 entry below. Reported by Joe Schweier and Robert Wolfe (1:261/20). - ENH: Enable Case Sensitive Passwords option added to Mailer Setup (500.2 26.5.30). A new checkbox, Enable Case Sensitive Passwords, has been added to PXCONFIG General Fidonet Mailer Setup under the Misc Options tab. When unchecked (default), PX normalises both the received password and the stored expected password to uppercase before comparing. This is the FTN convention and preserves backward compatibility with all existing node configurations and remote mailers. When checked, PX compares passwords exactly as received and stored, with no case conversion. This is required when connecting to a system that performs strict case-sensitive password validation. The option applies to both BinkP session passwords (BinkpAnswer M_PWD handling) and EMSI session passwords (rcvdemsi). The PKT password comparison (ComparePktPwd) always uses case-insensitive comparison regardless of this setting, as PKT passwords are transported within mail bundles and have no runtime UI equivalent. Raised by Terry Roati (3:640/238) and Deon George (FTSC) in response to the b37 removal of forced-uppercase password entry. - FIX: PXCONFIG Event Editor allowed hourly HourInc = 0 to be saved (500.2 26.5.31). An hourly event with an interval of zero causes the already-run suppression window to collapse to zero length, making the event eligible to run on every scheduler cycle. Fix: PXCONFIG Event Editor now validates that the hourly interval is between 1 and 23 when closing the event editor for an hourly event. If the field is zero or blank, it is defaulted to 1. A value outside 1-23 produces a validation error and the editor remains open with focus on the interval field. Reported by Michael Purdy (99:1/5). - ENH: PXCONFIG title bar now shows the Wildcat! BBS name (500.2 26.6.1). The main PXCONFIG window caption now appends the BBS name from the Wildcat! configuration (e.g. "Platinum Xpress Config - NTBBS") so the operator can immediately identify which system is being configured when multiple instances are open. - FIX: Node Manager Mail Links and File Links now filter echo areas by the node's network zone (500.2 26.6.3). Mail Links and File Links previously displayed echo areas from all networks for any node. Both now call FindMasterNetworkDef + MatchZones to show only echo areas whose network zone matches the selected node's address zone. A Fidonet node (zone 1) will only see Fidonet echos; an XNET node (zone 99) will only see XNET echos, regardless of echo FixSec configuration. Mail Links PassSecurity check (regression from 500.2 26.5.27) also restored. - ENH: PathSetup mouse wheel scrolling in Directory Paths form (500.2 26.6.3). The Directory Paths form (PXCONFIG | Setup | Directory Paths) now responds to the mouse wheel, moving the selected row up or down. Implemented via TPxStringGrid in lib3\pxstringgrid.pas, following the same pattern as TPxListBox.
PXECHO (Platinum Xpress Echo Processor)
- NEW: PXUTILS ECHOAREAS command regenerates PxEchoAreas.txt on demand. A new PXUTILS command regenerates system\PxEchoAreas.txt from the current echo area database. The file is also regenerated automatically after a successful PXUTILS UPDATE MNET operation. Usage: PXUTILS ECHOAREAS - FIX: pxinit StartupCleanup() removes stale %NETBUSY.* semaphores on startup (500.2 26.6.3). If pxonline terminated abnormally while building the outbound netmail queue, %NETBUSY.N could be left on disk permanently, causing pxecho to skip all netmail scans until the file was manually deleted. StartupCleanup() is now called from both pxonline and pxecho after config load to erase any stale %NETBUSY.* files. Dead $NETBUSY CreateSemaFile/CheckSema calls in binkplib (never read by pxecho) also removed. - FIX: Echo scanner no longer skips linked nodes with "Unsecured link" (500.2 26.5.29). Nodes explicitly linked to an echo via PXCONFIG were being silently skipped during mail scanning and rescan operations with the log message: ! Unsecured link Run Repair ! Node(s) not connected to echoRoot cause: a legacy security check (v2.1j) compared the node's AreaFix security level against the echo's required security level. Systems upgraded from v7 databases can have a non-zero echo security requirement while new nodes carry the default security level of zero, causing the check to fail for all new nodes. A sysop-configured node link is now treated as authoritative. Reported by Michael Purdy (99:1/5). - FIX: Inbound FTN mail now displays with the correct local date and time (500.2 26.5.28). Messages received from nodes in other time zones were displayed with an incorrect date. The ^aTZUTC kludge included in FTN packets was not being converted to the receiving system's local time. Inbound message dates are now correctly adjusted to local time regardless of the originating system's time zone. - FIX: AreaFix and FileFix %QUERY command now returns the correct echo list (500.2 26.5.30). The %QUERY command (list connected echo areas) was returning a blank response for nodes on systems upgraded from v7 databases. The same legacy security check (v2.1j) that caused the "Unsecured link" scanner issue also filtered the %QUERY output, suppressing all echoes whose security level exceeded the requesting node's default level. Both the mail echo query (ShowMailEchoLinks) and file echo query (ShowFileEchoLinks) are fixed. %QUERY now returns the full list of connected areas. Confirmed by Michael Purdy (99:1/5). - ENH: RAW archiver tag sends echo mail as uncompressed PKT files (Beta 34). A node can now receive echo mail as raw, uncompressed .PKT files instead of compressed bundles. To enable, create an archiver entry in PXCONFIG Archiver Setup with Tag set to RAW and no Compress command, then select RAW as the Mail Compression Method for that node in Node Manager. PxEcho moves the PKT directly from the work path to the outbound path and queues it for BinkP delivery without invoking any archiver. The receiving system gets a plain .PKT file and can toss it directly. This was requested by Mark Lewis (Synchronet) for interoperability with mailers that prefer or require uncompressed packets. - FIX: AreaFix and FileFix %LIST and %QUERY commands showed only a subset of available echo areas for some nodes (500.2 26.6.7). Nodes in zone 99 (or any zone that matched a master network definition) with echo access flags A, E, and O received a %LIST report showing only the "Others" category echoes. The Star, Fidonet, and Echo echoes were missing. Root cause: the AreaFix processor (fixlib.pas ShowMailEchobySec) applied an unconditional nettag filter before checking whether network-based gating was actually in effect for the requester. If FindMasterNetworkByZone found any network definition for the requester's zone (even when gating was not configured), all echoes whose nettag did not match that network's tag were silently excluded from the report. Fix: introduced HaveNetDef to record whether a master network definition was actually found. The nettag filter and echo-level gating check are now both guarded by ShowByNet (which requires HaveNetDef AND the node's _Fix_NoGating option). If no network definition matches the requester's zone, all accessible echoes are listed without filtering. Same correction applied to the FileFix report path (ShowFileEchobySec). Reported by Michael Purdy (99:1/5) and Terry Roati (3:640/238).
PXTOOLS (Platinum Xpress Tools)
- NEW: PxTools, PxEdit, and all PX sysop editors now support the wcLocal default logon settings (500.2 26.5.26). PX sysop tools (PxTools, PxEdit, PxConfig, PxEcho, PxRepair) now read the default logon settings configured under wcLocal | Tools | Options | General. When UseDefaultLogon is enabled, the tools log in silently with the saved credentials without showing the login dialog. When a default user name is saved but UseDefaultLogon is not set, the tool prompts "Login as [name]?" so you can confirm or switch to a different account. The /LOGIN command-line switch bypasses auto-login and always shows the login dialog. - FIX: PxTools and PxEdit no longer show a "Cannot create file" error on Windows 11 and Windows Server 2025. Windows 11 and Windows Server 2025 assign each login session its own temporary folder, but that folder is not created on disk until something first writes to it. PX tools that compose or display messages were failing silently or showing a "Cannot create file" popup because the folder did not yet exist. PX now creates the temporary folder automatically when needed. - NEW: PxTools and PxEdit activity is now recorded in the Wildcat! activity and caller logs. Logging into PxTools is recorded in the Wildcat! caller log and activity log in the same format used by all other Wildcat! sessions. Writing a message via PxEdit records the conference name, recipient, and message number in the activity log. This makes it easy to audit PX mail activity alongside regular Wildcat! user activity from the sysop logs. - ENH: Mouse wheel now scrolls list views and the message display in PxTools and PxConfig. Scrolling with the mouse wheel now works in all list windows in PxTools (conference list, queue manager, address book, mail selector) and in PxConfig list views, without needing to click the list first. The message display pane in PxEdit also scrolls with the wheel. The mouse wheel support uses the native Delphi grid scroll mechanism, which is more reliable across Windows versions than earlier approaches that were tried. - ENH: Netmail compose warns when To and From zone numbers do not match (Beta 34). When saving a Fidonet netmail message, PxEdit now checks whether the zone number in the To address matches the zone number in the From address. If they differ, a warning is shown so the operator can correct the From AKA before sending. The message can still be saved if the mismatch is intentional. This addresses the common mistake of composing cross-zone netmail with the primary address selected as the From address when an AKA belonging to the destination zone should be used instead.
PXNLIST (Platinum Xpress Nodelist Compiler)
- FIX: Nodelist *.NA and *.NO update files with Unix-style line endings (LF only, no CR) are now read correctly by PXNLIST and PXUTILS. Some hub sites distribute nodelist segment files with Unix line endings. PXNLIST was reading only the first line of such files, causing the nodelist to be compiled incomplete or not at all after an update run. All nodelist update files are now accepted regardless of whether they use Windows (CR+LF) or Unix (LF only) line endings. - FIX: BinkP poll no longer fails for nodes with trailing whitespace in their nodelist flags entry (500.2 26.6.8). Some nodelist segment files contain trailing spaces on node lines. When PXNLIST compiled these files, the trailing space was included in the stored Options field (e.g. "IBN " instead of "IBN"). PX could not match the "IBN " token and blocked the poll with no dial address. PXNLIST now trims trailing whitespace from the Options field before writing it to the compiled nodelist database. ParseBinkpDialStr also trims the Options string before parsing as a secondary safeguard. Re-run PXNLIST after upgrading to recompile the nodelist with clean flag data. The Nodelist Browser in PxEdit also now displays Options without trailing whitespace.