v5.3.13
Security
- The XMLRPC proxy is hardened and available as a standalone endpoint, with the proxy decision separated from the send (#3188). Client-quoted
load.*arguments are preserved instead of dropped, including an escaped comma inside an argument (#3209). - The download directory is escaped in the
loadcommand string (#3195). - Input validation across
_task,create,httprpc,rutracker_check,screenshots,tracklabelsandtrafic(#3185). - loginmgr matches a stored account by the URL's host and never below its scheme, so credentials are not offered to a host that merely looks similar (#3205, #3206).
- Tracker status messages render clickable URLs with sanitization (#3200).
Core
- Torrent metadata keys are declared instead of created dynamically, a numeric key stored under one spelling reads back under the other, and binary metainfo is no longer probed as a filesystem path (#3213, #3225, #3229).
- Settings writes are checked against rtorrent's socket allocation limits, the effective limits are reported, and a save that rtorrent rejects is rolled back and reported rather than left half-applied (#3196, #3227).
- A settings object whose probe failed is no longer cached (#3191).
getScheduleCommandstarts deterministically (#3199).FileUtil::deleteDirectory()recurses — it previously fataled on any non-empty directory (#3216); both branches ofFileUtil::makeDirectory()are braced (#3226).- The log file created by
toLog()gets$profileMask, log paths and permissions are validated, and a profile mask the configuration could not read is reported instead of silently applied (#3193, #3231, #3233). RU_LOCALHOSTSis read from the same source as the rest ofconf/config.php(#3235).- httprpc tells the client when a list answer is a full one (#3190) and reports a refused XMLRPC call as a refusal rather than an outage (#3192).
unpacktreatsquotaspaceas the optional field it is (#3216).- Plugin
init.phprequires resolve against the file's own directory (#3218). - A
enabledByDefaultflag inplugins.ini, with a shared lookup and a defined meaning for an unset flag (#3197, #3203).
Interface
- s-table: the delayed draw is fixed and no longer drops row changes (#3189).
- The RSS and Ratio rules dialogs have distinct titles (#3238).
- Assorted small UI corrections (#3200).
Plugins
- check_port: the yougetsignal check works again against its GraphQL API, and the plugin now falls back through a configurable provider chain, with Globalping added as a provider for both IPv4 and IPv6 (#3222, #3245).
- erasedata: erase requests are queued so a mass erase cannot flood rtorrent (#3240); a ratio group set to remove data now deletes the data of downloads rtorrent never opened (#3187).
- filedrop: paste a magnet link or torrent URL to add it (#3202).
- loginmgr: an unavailable cached session is distinguished from a rejected one (#3198).
- extsearch: ImmortalSeed no longer loses three categories to duplicate array keys; ZamundaNet corrected (#3217).
- Fixes in cpuload, log_history and the Toloka account handler (#3217).
- Every bundled plugin declares the PHP extensions it uses, and
env_check.phpreports which plugins a missing extension would disable or limit (#3242, #3247).
Themes
- Material Design: placeholder text is legible again — it was rendering at 1.09:1 contrast against the dark field background (#3244).
Localization
- Every key the interface asks for is defined in every language, and a test keeps it that way (#3210, #3243).
- The mobile plugin's hard-coded strings are localized across all 28 languages (#3204).
- check_port ships its previously missing keys (#3241).
- Greek translations updated.
Development
- PHPStan level 0 gate in CI, and the tree is at zero findings — including the vendored XMPPHP and JShrink, fixed in place rather than excluded (#3215, #3219).
- Test coverage for rtorrent 0.16.21 compatibility and the socket allocation gate (#3230, #3236), the scripts that rewrite a torrent (#3212, #3214), and the erasedata queue (#3248).
- The PHP test harness reports comparisons independently of assertions (#3232).
brace-expansionbumped to 1.1.18 (#3220).
GitHub commit-by-commit follows:
What's Changed
- Misc input validations by @xirvik in #3185
- ratio: delete the data of downloads a ratio group erases by @xirvik in #3187
- Harden the XMLRPC proxy and add a standalone endpoint by @xirvik in #3188
- s-table: fix the delayed draw, and stop it dropping row changes by @xirvik in #3189
- httprpc: tell the client when the list answer is a full one by @xirvik in #3190
- Do not cache a settings object whose probe failed by @xirvik in #3191
- httprpc: report a refused XMLRPC call as a refusal, not an outage by @xirvik in #3192
- Apply $profileMask to the log file toLog() creates by @xirvik in #3193
- Escape the download directory in the load command string by @noctuum in #3195
- Give getScheduleCommand a deterministic start by @IvanShift in #3199
- Up/small UI by @IvanShift in #3200
- Say which two things the tracker message separator joins by @xirvik in #3201
- Add enabledByDefault flag to plugins.ini by @adenwuts in #3197
- Share the plugins.ini flag lookup and pin what an unset flag means by @xirvik in #3203
- loginmgr: match an account by the URL's host, and never below its scheme by @IvanShift in #3205
- loginmgr: match NNMClub by the URL host too by @xirvik in #3206
- mobile plugin: localize hard-coded strings by @koblack in #3204
- Check that every localization key the interface asks for exists by @xirvik in #3210
- httprpc: keep client-quoted load.* arguments instead of dropping them by @xombiemp in #3209
- Keep an escaped comma inside a load argument by @xirvik in #3211
- Test what the scripts that rewrite a torrent do to it by @xirvik in #3212
- Declare a torrent's keys instead of creating them dynamically by @xirvik in #3213
- Test that a torrent key named like an object field is still a key by @xirvik in #3214
- Fix the PHPStan level-0 findings in the vendored XMPPHP and JShrink by @xirvik in #3215
- Fix/deletedirectory and optional quotaspace by @xirvik in #3216
- Fix/plugin defects by @xirvik in #3217
- Anchor plugin init.php requires on the file's own directory by @xirvik in #3218
- Add a PHPStan level 0 gate by @xirvik in #3219
- build(deps): bump brace-expansion from 1.1.11 to 1.1.18 in /tests by @dependabot[bot] in #3220
- filedrop: add paste-to-add for magnet links and torrent URLs by @lebowitz in #3202
- Report the socket allocation limits and check a settings write againt them by @xirvik in #3196
- Fix
check_port_yougetsignalusing GraphQL API by @ToshY in #3222 - check_port: make the yougetsignal answer testable, and send Origin by @xirvik in #3223
- Restore PHP 7.4 Torrent metadata compatibility by @IvanShift in #3224
- Read a numeric torrent key back by either spelling by @xirvik in #3225
- Brace both branches of FileUtil::makeDirectory() by @xirvik in #3226
- Harden FileUtil log paths and permission handling by @IvanShift in #3231
- Say when a profile mask could not be read, and pin the log path rules by @xirvik in #3233
- Report a profile mask the configuration could not read by @xirvik in #3234
- Read RU_LOCALHOSTS from the source the rest of the file reads by @xirvik in #3235
- Test rTorrent 0.16.21 compatibility by @IvanShift in #3230
- Test the rtorrent 0.16.21 socket allocation gate by @xirvik in #3236
- Avoid probing binary torrent data as filesystem paths by @IvanShift in #3229
- Make settings saves recover socket allocation failures by @IvanShift in #3227
- Fix httprpc refusal responses by @IvanShift in #3228
- Make PHP test failures independent of assertions by @IvanShift in #3232
- Give the RSS and Ratio rules dialogs distinct titles by @noctuum in #3238
- Fix/rules dialog nits by @xirvik in #3239
- loginmgr: distinguish unavailable responses from expired sessions by @IvanShift in #3198
- check_port plugin: add missing localization keys by @koblack in #3241
- Define every en.js key in every language, and keep it that way by @xirvik in #3243
- check_port: add Brazilian Portuguese localization by @chiphead2332 in #3246
- Material Design: make placeholder text visible by @xirvik in #3244
- _getdir plugin: require PHP mbstring extensions by @koblack in #3242
- Declare the PHP extensions the bundled plugins use, and check them by @xirvik in #3247
- erasedata: queue erase requests so mass erases cannot flood rtorrent by @adenwuts in #3240
- Cover the erasedata queue, and let it require what it uses by @xirvik in #3248
- check_port: add provider failover and Globalping by @chiphead2332 in #3245
- check_port: cover the Globalping verdict with tests by @xirvik in #3249
- Bump version to 5.3.13 by @xirvik in #3250
New Contributors
- @noctuum made their first contribution in #3195
- @lebowitz made their first contribution in #3202
- @ToshY made their first contribution in #3222
Full Changelog: v5.3.12...v5.3.13