This is a security-oriented major release with several important security patches, so users are encouraged to update without delay.
From this release, we are also making it clear that our rolling-release channel (edge ) is recommended for faster security patches.
Breaking change π₯:
Disallow access to local networks such as 127.0.0.1 by default, for security reasons
Feature highlightsβ¨:
Filter global view feed list by state and search
New option to hide badges showing number of unread articles (Phantom Obligation )
Refresh only feeds in the current view
Offer to add a prefix when re-sharing user labels
Bug fixes highlights π:
Several security attack scenarios patched
Fix lost elements while parsing search query
Fix βmark as read older thanβ¦β widening the active search
Fix saving user queries
Fix SQL errors breaking some regex searches with MySQL / MariaDB
This release has been made by @Alkarex , @andris155 , @ColonelMoutarde , @Frenzie , @IEEE-754 , @Inverle , @math-GH , @nykula , @polybjorn , @Stunkymonkey and newcomers @0xdeadrelay , @AdamKorcz , @aligundogar , @bossaarebecca-alt , @Cactys12 , @chrislongros , @Divinelink , @Elgeryy1 , @featurecreep-cron , @Fripix , @fzlzjerry , @georatas , @gshimo , @iatman ,@ihsanarifr , @jamalkamaladdin , @JamBalaya56562 , @jbrayton , @jeremy-code , @juherr , @kobihikri , @LeeXiaolan , @masskrdjn , @mohammadlashkari , @nathanpixodeo , @Otolock , @payaci , @salvador-castro , @SamCyber001 , @satyvm , @senti-man , @simitana , @ThomasVermeer , @Totara-thib , @TowyTowy , @utkutibet , @XiaoSong1223
Full changelog :
Security
π₯ Disallow access to local networks such as 127.0.0.1 by default, for security reasons (breaking change) #8400 ,
#9195
Selected local networks can be allowed under System configuration or using the INTERNAL_HOST_ALLOWLIST environment variable
Passing * allows all networks like before (unsafe)
Improve SSRF mitigations by restricting CURLOPT_PROXY #8950
Fix auth CSRFs (login and register actions) #9171
Log invalid challenge and ignore JSON error during login #9278
Disallow fetching of non remote URI #9215
Only allow HTTP/HTTPS schemes for enclosure and thumbnail URLs #9272
Fix access control in rss and opml actions #8912
Refactor to use CSRF field directly instead of borrowing it from a form #9169 , #9205
Cleaner limit anonymous mode to default user #9235
Fix HTML ingestions in templates #9146 , #9170
Fix bad header filtering bypass #8964
Sanitize all fields during JSON import #9168
Gate greader (JSON) user query share format behind Share by OPML #9248
Public OPML should not contain cURL parameters #9070
Ignore security-relevant OPML attributes for dynamic OPML sources #9276
Strip feed URL credentials from anonymous user query output #9246
Set limits for regex during search #8913
Fix path disclosure in cache error message #9206
Limit the length and parentheses nesting depth of a search query #9277
Use timing-safe comparison for tokens #8945
Use hash_equals() for GReader API token comparison #9183
Mailer: allow disabling SMTPAutoTLS via config #9026
Warn during install if document root does not point to ./p/ #9010
Stop the unread-count poller after the session ends #9065
Add remote IP address to warning on form login #8942
Pin the GitHub actions using SHA #9200
Harden cache and SimplePie cache deserialization #9273
SimplePie
Security: Disallow javascript: URI scheme (protocol) #8263
Fix wrong player parent logic leading to invalid type #8893 , simplepie#978
Consistently enable XML_OPTION_PARSE_HUGE #8894 , simplepie#977
Fix null warning in IRI for PHP 8.5+ #8918 , simplepie#979
Fix sanitizer whitelist stripping order #9066
Show only one representation per media:group #9009
Bump upstream SimplePie #8947
Features
Filter global view feed list by state and search #9132
Use global view when searching from subscription page #9144
New option to hide badges showing number of unread articles (Phantom Obligation ) #8844
Refresh only feeds in the current view #9060
Offer to add a prefix when resharing user labels #9236
Add log search to the logs page #9059
Add configurable log_level system setting #9185
New option to keep or not the custom sort order when navigating between categories and feeds #8969
New per-feed option to show or hide enclosures (attachments) #9015
Detect JSON feeds from URLs containing json #9058
Also when subscribing via the API #9167
Order categories during OPML import/export according to position #9203
OPML: include each feedβs refresh interval (TTL) in export/import #8982
Log failed CSS content retrieval (Web scraping) #9077
Allow providing a category when adding a feed by bookmarklet #9047
Add LinkAce sharing service #9024
Add Nextcloud Bookmarks sharing service #9032
Bug fixing
Fix lost elements while parsing search query #8884
Fix βmark as read older thanβ¦β widening the active search #9173
Fix saving user queries #9190
Fix SQL errors breaking some regex searches with MySQL / MariaDB #9036
Fix marking filtered label articles as read in SQLite and PostgreSQL #9264
Fix tagging an already-tagged entry on PostgreSQL raising a SQL error instead of being a no-op #9136
PostgreSQL: make committing new entries resilient to duplicate keys #9231
Preserve negative timezone offsets in date intervals #9071
Fix feed dropdown bugs due to hash desync #8949
Fix slider not reinitializing after form submit #8973
Minz: Skip loading duplicated JS/CSS assets #9000
Respect simplepie_syslog_enabled for the uses cache logs #8986
Fix statistics repartition averages #8996
Fix article hover date visibility #8997
Keep search and state filters when marking articles as read #9007
Fix --db-prefix silently drops following CLI flags #9042
Remove stale dynamic favicon links #9127
Fix desync between favicon and title unread counters #9262
Fix outdated username length hint on registration and install forms #9013
Redirect away from wrong URL paths #9075
Fix auto-share shortcut on first use #9072
Exclude hidden feeds from global view counts #9152
Fix only the last <media:credit> being written to the RSS output #9174
CLI
New cli/reconfigure-user.php to read/write per-user config attributes #8873
Report new articles count per feed in app/actualize_script.php output #8948
Output a diagnostic when the cli/health.php check fails #8980
API
Add a warning message to the API password section and a log warning when a client uses GET instead of recommended POST #8845
Fever API: log the client IP address on authentication failure #8981
WebSub: ignore HTTP/HTTPS scheme difference in Self URL comparison #9005
Deployment
Docker alternative image updated to Alpine 3.24 with PHP 8.5.7 and Apache 2.4.67 #8916
Start supporting PHP 8.6+
Docker dev :newest with PHP 8.6 #9155
Docker: attach provenance and SBOM attestations to the published image #9150
Apache use only CONN_REMOTE_ADDR in logs when mod_remoteip is available, for compatibility with LiteSpeed Web Server #8890
Fix .dockerignore being ignored during build in CI #9001
New ENABLE_ACCESS_LOG environment variable to disable access logs #9191
Check GMP during 32-bit installation #9046
Improve actualize mutex to allow multiple instances #9045
OIDC: redirect to a default URL on expired auth state instead of 400 #9143
UI
Always jump article to top when header is offscreen, also when Stick the article to the top when opened is disabled #8870
Move article header/footer options (feed title, authors and date, icons position, tags) from Reading to Display configuration #9139
Move disable button before remove button in user management #8944
Keep scroll position of slider after form submit #8974
Group export feeds by category #9079 , #9154
Sort feed names with locale-aware collation #8985
Sort labels with locale-aware collation #9023
Format unread counter in title on page load #9263
Display slider after submit for all buttons in feed update UI #8999
Improve aside keyboard navigation #9202
Allows usage of Ctrl/Shift keys with the open website shortcut #9186
Fix padding for .nav_menu in Alternative-Dark, Flat, and Nord themes #8901
Fix typo in alert error border color variable #9266
Use JavaScript Event() constructor instead of deprecated initEvent() #9035
Use :user-invalid instead of :invalid for CSS form field styling #9025
Remove unused simple layout #8998
Various UI and style improvements: #8823 , #8824 ,
#9140 , #9145
Extensions
Minor Minz_Extension typing #8952
Improve extension list fetch diagnostics #9055
Fix a PHP warning in Serve action #9267
Fix extension settings cancel action #9053
Fix sharing menu conflicts with extensions #9074
Add read status hook for entries #8995
Dispatch a new JavaScript event freshrss:entryStateChange when an entry finishes being marked read/unread #9031
Redirect after saving user CSS/JS so changes apply immediately #9006
I18n
Misc.
Update to PHPMailer 7.1.1 #8907
Improve PHP code #8906 , #9156
Fix PHPStan 2.2.2 in CLI #8911
Migrate markdownlint-cli to markdownlint-cli2 #8987
Update dev dependencies #8904 , #8905 , #8926 ,
#8939 , #8940 , #8963 ,
#8961 , #8959 , #8958 ,
#8962 , #8960 , #9148 ,
#9162 , #9165 , #9158 ,
#9159 , #9176 , #9178 ,
#9179 , #9219 , #9253 ,
#9254 , #9255 , #9257