Security
- Unpack: each archive is extracted into its own empty directory. Symbolic links in archives are refused (unrar runs with -ol-, so it never creates them), and nothing is written through a link already in the output folder. A refusal names the entry in the task log and in errors.log. Behaviour changes: links in archives are no longer recreated, extracted files get u+rwX, and a file replaced by an unpack becomes a new inode. (#3494)
- Create: a folder that holds a link resolving outside the top directory, or a link that does not resolve, is refused before any creator starts. This includes mktorrent and the other external creators, which follow links. (#3493)
- The top-directory check refuses . and .. in the part of a path that does not exist yet. It also stops at the root under an open_basedir that hides it, and clears PHP's realpath cache before checking. (#3492)
Core
- The log is written even when another user owns it in a sticky directory such as /tmp (fs.protected_regular). A write that fails no longer leaves the lock held, and a stalled writer no longer hangs every request that logs. (#3496, fixes #3495)
- A torrent's source file is found when the session or tied-file path contains a backslash or a double quote. (#3491)
Interface
- Users can choose between the desktop and the mobile UI: ?mobile=0 or ?mobile=1, remembered per device. The mobile settings page has a "Desktop version" button, and Settings > General has an "Interface" choice. Windows tablets and 2-in-1 devices are no longer stuck in the mobile UI. Arguments like mobile=10 or xmobile=1 no longer select it. (#3497)
Plugins
- Tasks: cancelling a task stops its whole process tree. Before, the program doing the work (createtorrent.php, unrar, unzip) kept running to the end. (#3499)
Themes
- RSS Manager filter names are readable in Oblivion and OblivionBlue, and the URL rewrite rules list in Dark, DarkBetter and MaterialDesign. (#3498, fixes #3487)
Localization
- The new interface strings are translated in every language file; native speakers have not reviewed them. (#3497)
Development
- An incomplete PHP test run now fails the suite, and source paths are preserved. (#3452)
What's Changed
- Unescape the session and tied paths in rTorrent::getSource() by @IvanShift in #3491
- tests: reject incomplete PHP test runs by @IvanShift in #3452
- Stop isInsideTopDirectory() at the root and at .. in a missing tail by @IvanShift in #3492
- Refuse to create from a folder holding a link out of the top directory by @IvanShift in #3493
- Unpack each archive into its own empty directory and keep links out by @IvanShift in #3494
- Write the log when another user owns it in a sticky directory by @xirvik in #3496
- mobile: let the user choose the desktop or the mobile UI by @xirvik in #3497
- rss: readable filter and rule names in dark themes by @xirvik in #3498
- _task: kill the whole process tree of a task by @xirvik in #3499
- Bump version to 5.3.21 by @xirvik in #3500
Full Changelog: v5.3.20...v5.3.21