Avenue (v4.3beta9)
Pre-release
Pre-release
A correctness-and-hardening follow-up to beta8, prompted by a review of the beta8 changes. It reworks announce IP/port validation to be per-family and fail as a client fault, makes configuration writes atomic, replaces the truthy %placeholder% defaults with real typed values, and turns the announce rate-limit into a self-contained tunable — plus smaller fixes for numwant=0 and non-UTF-8 client labels, a walk-back of beta8's most aggressive interval defaults, and a round of setting renames for clarity. The tracker protocol and database schema are unchanged — no DB migration is required.
- BREAKING: Rename several hand-edited settings for clarity and consistency. A
phoenix.custom.phpthat sets an old key silently falls back to the new default, so update any overrides:external_ip→allow_client_ip(it accepts a client-supplied IP — not to be confused withannounce_external_ip, which returns one),announce_interval→announce_rec_intervalandmin_interval→announce_min_interval(symmetry withscrape_min_interval),random_limit→random_peers_threshold,clean_with_requests→clean_request_percent,allow_any_proxy→trust_any_forwarded, andbackup_rotate→backup_retention(matchingtask_retention/stats_retention). The installer and admin panel only ever write unaffected keys, so a normal install needs no change. - FIX: Rework announce IP/port validation to be per-family and reject bad input as a client fault rather than a server one. A resolved address with no listening port (
?portomitted,?port=0) is now rejected up front (Missing port.) instead of being stored as an unreachable peer or left to fail at insert; an out-of-range port drops only its own address family, so a valid IPv4 pair still registers when a client supplies a bad?ipv6=[…]:port(withallow_client_ipon); and a peer with no routable address — e.g. a privateREMOTE_ADDRdropped byreject_private_ipswith no public fallback — is rejected rather than stored addressless. A dropped family's absent port is normalised to0before it is bound, so an out-of-range per-family port no longer throws on the peer insert under a strict-mode database. - FIX: Publish
config/phoenix.custom.phpatomically. The admin panel, the installer set-password gate, and the login-time hash upgrade now write to a sibling temp file under an exclusive lock andrename()it over the target, so a concurrent request'ssettings_load()neverincludes a half-written file and fatals the whole tracker. Existing file permissions are preserved, and a failed write leaves the previous config intact. - FIX: Replace the
%placeholder%values inconfig/phoenix.default.phpwith real, typed defaults.db_persistandopen_trackerwere strings — truthy by accident and mistyped against the settings contract — and are now proper booleans (true/false);db_prefixdefaults tophoenix_; the database credentials ship empty.db_is_configured()reads empty credentials as "not configured", and the missing-config fallback no longer injects demo credentials (a hard-codedroot/Password1), so an unconfigured tracker reportsTracker is not configured.cleanly instead of attempting a weak-credential local connection. - FEATURE: Make the announce rate-limit tunable and decouple its window from the announce cadence. New
announce_rate_limit(how many other peer_ids one IP may carry on a torrent within the window before the next is throttled;0disables the check) andannounce_rate_window(seconds) settings replace the old hardcount > 0gate, which cross-blocked unrelated peers sharing one public IPv4 (a home NAT, or CGNAT). The window is now independent, so tuning the announce cadence no longer widens the anti-abuse window as a side effect. On a tracker fronted by a reverse proxy, prefer its per-IP rate limiting and setannounce_rate_limitto0. - FIX: Honour
numwant=0as the valid "send me no peers" request it is (a seed, or astopped/completedannounce) instead of folding it up tomax_peers; the value now clamps to[0, max_peers]and negatives floor to0. (numwantis a de-facto convention, not a numbered BEP;BEPs.mdis corrected accordingly.) - FIX: Harden the detected peer-client label against non-UTF-8 and control bytes. An unrecognised Azureus-style client code is surfaced only when it is plain alphanumeric; anything else collapses to
Unknown, so raw peer_id bytes can never reach the admin Peers views or the storedevents.clientlabel. The views additionally escape withENT_SUBSTITUTE, so an unexpected byte renders as a replacement character rather than blanking the cell. - IMPROVES: Walk back beta8's most aggressive interval defaults, now that per-IP abuse is handled by the rate-limit setting:
announce_min_intervalreturns to 1 minute (from 10) andscrape_min_intervalto 15 minutes (from 30), so a manual re-announce or a client scrape is not throttled as hard.announce_rec_intervalstays at 30 minutes for steady-state load.