TNT/docs/CHANGELOG.md
m1ngsama d9382882d1 chore: bug fixes and code cleanup
Fixes:
- message_load() now holds g_message_file_lock for the read, so :last [N]
  can no longer observe a half-written line while message_save() is
  flushing.
- constant_time_strcmp() accumulates the length difference in size_t.
  The old code truncated to unsigned char, which collapsed pairs whose
  lengths differed by a multiple of 256 down to 0 and lost the signal.

Refactor:
- buffer_appendf() / buffer_append_bytes() moved to common.c; the two
  identical copies in ssh_server.c and tui.c have been removed.

Docs / cleanup:
- README clarifies that exec 'post' uses the SSH login name as the
  author and that anonymous mode performs no identity check.
- Removed TODO.md (both items completed) and docs/README.old.
- Trimmed the auto-generated 2025 entry block from docs/CHANGELOG.md
  and added a 2026-05-16 entry summarising this change.
2026-05-16 22:44:41 +08:00

5.7 KiB
Raw Blame History

Changelog

2026-05-16 - Internal cleanup

Fixed

  • message_load() now holds g_message_file_lock for the duration of the read. Previously :last [N] could race with message_save() and observe a half-written line.
  • constant_time_strcmp() accumulates the length difference in size_t instead of unsigned char. The old code lost the length-mismatch signal when the two lengths differed by a multiple of 256.

Changed

  • buffer_appendf() and buffer_append_bytes() moved to common.c; the two identical copies in ssh_server.c and tui.c have been removed.
  • Removed TODO.md (both items completed) and docs/README.old (superseded by the root README.md).
  • Trimmed the auto-generated 2025 entry block from this changelog.

2026-04-23 - Chat UX Commands and MOTD

Added

  • :last [N] — show last N messages retrieved directly from the log file (150, default 10), bypassing the 100-message in-memory ring buffer limit
  • :search <keyword> — case-insensitive full-text search across the entire message history on disk; returns the most recent 15 matches
  • :mute-joins — per-client toggle to silence join/leave system notifications; title bar shows [静音] when active
  • MOTD support — place motd.txt in the state directory; users see it on connect and press any key to enter chat
  • message_search() — new function in message.c / message.h for log file keyword search with rolling result collection
  • Updated in-TUI help screens (English and Chinese) with new commands

2026-03-10 - SSH Runtime & Unix Interface Update

Fixed

  • moved SSH handshake/auth/channel setup out of the main accept loop
  • replaced synchronous room-wide fan-out with room update sequencing and per-client refresh
  • switched idle session handling to ssh_channel_poll_timeout() plus blocking reads so quiet sessions are not dropped incorrectly
  • made -d/--state-dir create the runtime state directory automatically

Added

  • SSH exec commands: help, health, users, stats --json, tail, post
  • PTY window-change handling for terminal resize
  • TNT_MAX_CONN_RATE_PER_IP for per-IP connection-rate control
  • tests/test_exec_mode.sh
  • tests/test_connection_limits.sh

Changed

  • TNT_MAX_CONN_PER_IP now means concurrent sessions per IP
  • stress tests now disable rate-based blocking so they exercise concurrency instead of self-throttling

2026-01-22 - Security Audit Fixes

Comprehensive security hardening addressing 23 identified vulnerabilities across 6 categories.

Critical

  • [AUTH] Add optional access token authentication (TNT_ACCESS_TOKEN)
  • [AUTH] Implement IP-based rate limiting (10 conn/IP/60s, 5-min block after 5 auth failures)
  • [AUTH] Add global connection limits (default: 64, configurable via TNT_MAX_CONNECTIONS)

High Priority

  • [BUFFER] Replace all strcpy() with strncpy() (3 locations)
  • [BUFFER] Add buffer overflow checking in client_printf()
  • [BUFFER] Implement UTF-8 validation to prevent malformed input and overlong encodings
  • [SSH] Upgrade RSA key from 2048 to 4096 bits
  • [SSH] Fix key file permission race with atomic generation (umask + temp file + rename)
  • [SSH] Add configurable bind address (TNT_BIND_ADDR) and log level (TNT_SSH_LOG_LEVEL)
  • [CONCURRENCY] Fix room_broadcast() reference counting race
  • [CONCURRENCY] Fix tui_render_screen() message array TOCTOU via snapshot approach
  • [CONCURRENCY] Fix handle_key() scroll position TOCTOU

Medium Priority

  • [INPUT] Add username validation rejecting shell metacharacters and control chars
  • [INPUT] Sanitize message content to prevent log injection attacks
  • [INPUT] Enhance message_load() with field length and timestamp validation
  • [RESOURCE] Convert message position array from fixed 1000 to dynamic allocation
  • [RESOURCE] Enhance setup_host_key() validation (size, permissions, auto-regeneration)
  • [RESOURCE] Improve thread cleanup with proper pthread_attr and error handling

New Environment Variables

  • TNT_ACCESS_TOKEN - Optional password for authentication (backward compatible)
  • TNT_BIND_ADDR - Bind address (default: 0.0.0.0)
  • TNT_SSH_LOG_LEVEL - SSH logging verbosity 0-4 (default: 1)
  • TNT_RATE_LIMIT - Enable/disable rate limiting (default: 1)
  • TNT_MAX_CONNECTIONS - Max concurrent connections (default: 64)
  • TNT_MAX_CONN_PER_IP - Max connections per IP (default: 5)

Security Summary

Category Fixes Impact
Buffer Security 3 Prevents overflows, malformed UTF-8
SSH Hardening 4 Stronger crypto, no races
Input Validation 3 Prevents injection, log poisoning
Resource Management 3 Handles large logs, prevents DoS
Authentication 3 Optional protection, rate limiting
Concurrency Safety 3 Eliminates races, crashes
TOTAL 19 23 vulnerabilities fixed

All changes maintain backward compatibility. Server remains open by default.


2025-12-02 - Stability & Testing Update

Fixed

  • Double colon bug in vim command mode (: key consumed properly)
  • strtok data corruption in command output rendering
  • Use-after-free race condition (added reference counting)
  • SSH read blocking issues (added timeouts)
  • PTY request infinite loop
  • Message history memory waste (optimized loading)

Added

  • Reference counting for thread-safe client cleanup
  • SSH read timeout (30s) and error handling
  • UTF-8 incomplete sequence detection
  • AddressSanitizer build target (make asan)
  • Basic functional tests (test_basic.sh)
  • Stress testing script (test_stress.sh)
  • Static analysis target (make check)
  • Developer documentation (HACKING)

Changed

  • Improved error handling throughout
  • Better memory management in message loading