Files
maziggy fc746ae218 [Fix] Virtual Printer FTP routed to wrong VP with different access codes (#735)
When running multiple virtual printers with different access codes on
  separate bind IPs, FTP connections were always routed to the wrong VP.

  Root cause: the iptables REDIRECT rule (990→9990) rewrites the
  destination IP to the incoming interface's primary address. With Linux's
  weak host model (arp_filter=0), packets for secondary IPs arrive on the
  primary interface, and REDIRECT sends them all to the first VP's FTP
  server. MQTT was unaffected because port 8883 had no redirect.

  Fix: FTP server now binds directly to port 990 (standard implicit FTPS),
  eliminating the iptables redirect entirely. Requires CAP_NET_BIND_SERVICE
  (already set in the systemd service file and Docker image).

  Also removed a global asyncio set_exception_handler() in the MQTT server
  that was overwritten by each VP instance, causing spurious "Unhandled
  exception in client_connected_cb" errors on startup.

  Changes:
  - FTP_PORT: 9990 → 990 (ftp_server.py)
  - Removed set_exception_handler() from MQTT server
  - Updated Dockerfile, docker-compose.yml port mappings
  - Deprecated --redirect-990 in install script
  - Updated wiki: removed iptables instructions for all platforms
  - Added migration guide (docs/migration-vp-ftp-port.md)
  - Added unit tests for port constant and no-global-state invariant
2026-03-18 09:28:33 +01:00

21 lines
756 B
Python

"""Tests for Virtual Printer FTP server port configuration."""
from backend.app.services.virtual_printer.ftp_server import FTP_PORT
class TestFTPPort:
"""Verify FTP server uses the standard FTPS port."""
def test_ftp_port_is_990(self):
"""FTP must bind to port 990 (standard implicit FTPS).
Port 9990 required an iptables REDIRECT rule which rewrites
the destination IP to the interface's primary address, breaking
multi-VP setups with different bind IPs and access codes.
"""
assert FTP_PORT == 990, (
f"FTP_PORT must be 990 (standard FTPS), not {FTP_PORT}. "
"Using a non-standard port requires iptables REDIRECT which "
"breaks multi-VP setups."
)