diff --git a/ChangeLog b/ChangeLog index 9cf460aa..a2f2af3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,87 @@ +Version 2.2.10 (June 23, 2025) +------------------------------ + +* test(sanitizer): add unit test for 0x0 pixel tracker +* test(sanitizer): add test case to cover Vimeo iframe rewrite without query string +* refactor(youtube): Remove a regex and make use of `fetchWatchTime` +* refactor(youtube): initialize two maps to the proper length +* refactor(tests): use `b.Loop()` instead of for range `b.N` +* refactor(server): avoid double call to `Sprintf` +* refactor(sanitizer): use global variables to avoid recreating slices on every call +* refactor(sanitizer): use a map for iframe allow list +* refactor(sanitizer): remove two useless `www.` prefixes +* refactor(sanitizer): make `isValidAttribute()` check O(1) +* refactor(rewrite): rename `Rewriter` function to `ApplyContentRewriteRules` +* refactor(processor): simplify Bilibili processing +* refactor(processor): remove a useless type declaration +* refactor(processor): remove a duplicated function call +* refactor(processor): refactor common code into a `fetchWatchTime` function +* refactor(processor): move filters to a `filter` package +* refactor(processor): move `FilterEntryMaxAgeDays` filter to filter package +* refactor(processor): move `RewriteEntryURL` function to `rewrite` package +* refactor(processor): minor simplification of a loop +* refactor(internal): add an `urllib.DomainWithoutWWW` function +* refactor(http): rename package from `httpd` to `server` for consistency +* refactor(http): Don't hardcode TLS configuration +* refactor(filter): avoid code duplication between `IsBlockedEntry` and `IsAllowedEntry` functions +* refactor(database): drop 3 columns in a single transaction +* refactor(crypto): use `rand.Text()` instead of a custom implementation +* refactor(config): remove deprecated config options +* refactor(appjs): no need to check if always present elements are always present +* perf(xml): optimized `NewXMLDecoder` +* perf(xml): optimize XML filtering +* perf(validator): slightly optimize a regex +* perf(timezone): cache `getLocation`'s results +* perf(storage): pre-allocate a slice in `RefreshFeedEntries` +* perf(storage): optimize away two `Sprintf` calls +* perf(sanitizer): use a switch-case instead of a map +* perf(sanitizer): minor simplifications of the sanitizer +* perf(sanitizer): extract a call to `url.Parse` and make intensive use of it +* perf(rss): optimize a bit `BuildFeed` +* perf(rss): early return when looking for an item's author +* perf(rewrite): make `getPredefinedRewriteRules` O(1) +* perf(reader): use a non-cryptographic hash when possible +* perf(reader): optimize `RemoveTrackingParameters` +* perf(readability): minor regex improvement +* perf(media): minor regex simplification +* perf(fetcher): pre-allocate the cipherSuites +* perf(database): use `TRUNCATE` instead of `DELETE FROM` in migrations +* perf(database): marginally speeds migrations up +* perf(api): use `math/rand/v2` instead of `math/rand` for better performance +* fix(readability): do not remove elements within code blocks +* fix(karakeep): correct method name and improve error handling in `SaveURL` +* fix(filter): skip invalid rules instead of exiting the loop +* feat(ui): display external link in single entry view because the URL was not visible on mobile (no mouse over) +* feat(ui): avoid showing an excessive number of tags +* feat(ui): add user setting to control `target="_blank"` on links +* feat(sanitizer): validate MathML XML namespace +* feat(sanitizer): consider images of size 0x0 as pixel trackers +* feat(sanitizer): add validation for empty `width` and `height` attributes in img tags +* feat(sanitizer): add support for `fetchpriority` and `decoding` attributes in img tags +* feat(rewrite): add support for YouTube Shorts video URL pattern +* feat(rewrite): add `parkablogs.com` to the referer override list +* feat(oidc): use `preferred_username` first instead of `email` claim +* feat(locale): update Polish translations +* feat(locale): update locales using machine translation +* feat(locale): update Indonesian translations +* feat(locale): update German translations +* feat(locale): update Chinese translations +* feat(integration)!: remove Pocket integration (Pocket will no longer be available after July 8, 2025) +* feat(filter): add `EntryDate=max-age:duration` filter +* feat(css): add margin-bottom to input for consistent spacing +* feat(config)!: remove `SERVER_TIMING_HEADER` config option +* feat: Allow multiple listen addresses +* feat: adding support for saving entries to Karakeep +* feat: add entry filters at the feed level +* docs(readme): document a couple of nifty features +* docs: add `CONTRIBUTING.md` file +* chore(template): remove `X-UA-Compatible` meta tag specific to Internet Explorer +* build(go): bump to go 1.24 +* build(deps): bump `library/alpine` in `/packaging/docker/alpine` +* build(deps): bump `golang.org/x/net` from `0.40.0` to `0.41.0` +* build(deps): bump `golang.org/x/image` from `0.27.0` to `0.28.0` +* build(deps): bump `golang.org/x/crypto` from `0.38.0` to `0.39.0` + Version 2.2.9 (May 26, 2025) ----------------------------