diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 941514e184..4dc43518f6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -239,6 +239,7 @@ docs-deploy: only: - stable@pleroma/pleroma - develop@pleroma/pleroma + review_app: image: alpine:3.9 stage: deploy diff --git a/CHANGELOG.md b/CHANGELOG.md index 19b87f09a1..adc76c7671 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,113 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 2.10 + +### Security + +- Admin API: Fixed self-revocation vulnerability where admins could accidentally revoke their own admin status via the single-user permission endpoint +- Fix bypass of the restrict unauthenticated setting by requesting local Activities + +### Changed + +- Add new activity actor/type index. Greatly speeds up retrieval of rare types (like "Listen") +- Use separate schemas for muted/blocked accounts lists +- Docs: Restore DB schema before data to avoid long restore times +- Return 404 with a better error message instead of 400 when receiving an activity for a deactivated user +- Deleting an instance queues individual jobs for each user that needs to be deleted from the server. +- Update Dockerfile to use Elixir 1.17.3, Erlang 26.2.5.6, and Alpine 3.17.9 to match CI release builds +- Docs RUM index: Add OTP install command, update index size expectation and recommend VACUUM FULL +- Support new Mastodon API for endorsed accounts +- Allow FediIndex crawler bot by default +- Update Cowboy, Gun, and Plug family of dependencies +- Hashtag searches return real results based on words in your query +- Support `quoted_status_id` parameter in post creation request +- Use Mastodon-compatible route for quotes list and param for quotes count +- Updated the example Nginx configuration +- Oban Notifier was changed to Oban.Notifiers.PG for performance and scalability benefits +- Updated relayd/httpd config files to be on par with nginx +- Order favourites and reblogs list from newest to oldest +- Update Pleroma-FE to 2.9.2 +- Updated Postgrex library to 0.20.0 +- Improved the logic of how we determine if a server is unreachable. +- Relax alsoKnownAs requirements to just URI, not necessarily HTTP(S) +- Redirect /users/:nickname.rss to /users/:nickname/feed.rss instead of .atom +- Add `write:scrobbles` and `read:scrobbles` scope for scrobbling +- Change scrobble external link param name to use snake case +- Allow "invisible" and "ellipsis" classes for span tags to match Mastodon behavior +- Change SMTP example to use the Mua adapter that works with OTP>25 +- Updated Tesla to 1.15.3 +- Truncate the length of Rich Media title and description fields +- Don't require an Accept header for WebFinger queries and default to JSON. + +### Added + +- Support Dislike activity, as sent by Mitra and Friendica, by changing it into a thumbs-down EmojiReact +- Support Mitra-style emoji likes. +- Added a way to upload new packs from a URL or ZIP file via Admin API +- Add `duration` to the block endpoint, which makes block expire +- Expose markup configuration in InstanceView +- Allow filtering users with `accepts_chat_messages` capability +- Add `timelines_access` to InstanceView +- Implement language detection with fastText +- Added MRF.QuietReply which prevents replies to public posts from being published to the timelines +- Oban.Plugins.Lazarus to help recover stuck jobs from an unclean shutdown of Pleroma +- Add /api/v1/pleroma/outgoing_follow_requests +- Allow users to select preferred frontend +- Provide full replies collection in ActivityPub objects +- Allow anonymizing reports sent to remote servers +- Add only_reblogs parameter to account statuses API for filtering to show only reblogs/reposts +- Allow setting custom user-agent for fetching rich media content +- Scrubber: Allow `quote-inline` class in
tags used by Mastodon quotes
+- Add `base_urls` to the /api/v1/instance pleroma metadata which provides information about the base URLs for media_proxy and uploads when configured
+- Stream marker updates
+- Allow Terms of Service panel behaviour to be configurable
+- Support translation providers (DeepL, LibreTranslate)
+- Support Mozhi translation provider
+- Support translateLocally translation provider
+
+### Fixed
+
+- AP C2S: Reject interactions with statuses not visible to Actor
+- Fix AssignAppUser migration OOM
+- Fix fetching public keys with authorized fetch enabled
+- Fix building "captcha" library with OpenBSD make
+- Use JSON for DeepL API requests
+- Elixir 1.18: Fixed warnings and new deprecations
+- Fix endorsement state display in relationship view
+- Fix publisher when publishing to a list of users
+- Fix reports being rejected when the activity had an empty CC or TO field (instead of not having them at all)
+- Set PATH in the FreeBSD rc script to avoid failures starting the service
+- Improved performance of status search queries using the default GIN index
+- Use end-of-string in regex for local `get_by_nickname`
+- Respect restrict_unauthenticated in /api/v1/accounts/lookup
+- MastodonAPI: Reject interactions with statuses not visible to user
+- Fix ModerationLog FunctionClauseError for unknown actions
+- MRF InlineQuotePolicy: Don't inline quoted post URL in Mastodon quote posts
+- Fix NodeInfo content-type
+- Add Actor images normalization from array of urls to string
+- Add `update` to @notification_types
+- replaced depracated flags and functions, renamed service to fit other service files
+- Allow to pin/unpip chats
+- Fix federation issue where Public visibility information in cc field was lost when sent to remote servers, causing posts to appear with inconsistent visibility across instances
+- OpenBSD relayd: Fix IPv6 example
+- Fix release builds
+- `remote_url` links to unproxied URL
+- Send push notifications for statuses from subscribed accounts
+- Backport [Elixir PR 14242](https://github.com/elixir-lang/elixir/pull/14242) fixing racy mkdir and lack of error handling of parent directory creation
+- Transmogrifier: convert "as:Public" to full w3 URL
+- Update voters count in remote polls when refreshing
+- Fix sometimes incorrect URI percent encoding
+- Fix HTTP client making invalid requests due to no percent encoding processing or validation.
+- ObjectView: Do not leak unsanitized internal representation of non-Create/non-Undo Activities on fetches
+- Fix WebFinger for split-domain setups
+- Enforce an exact domain match for WebFinger resolution
+- MastodonAPI: Fix misattribution of statuses when fetched via non-Announce Activity ID
+
## 2.9.1
### Security
+
- Fix authorization checks for C2S Update activities to prevent unauthorized modifications of other users' content.
- Fix content-type spoofing vulnerability that could allow users to upload ActivityPub objects as attachments
- Reject cross-domain redirects when fetching ActivityPub objects to prevent bypassing domain-based security controls.
@@ -16,27 +120,33 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Validate Content-Type headers when fetching remote ActivityPub objects to prevent spoofing attacks.
### Changed
+
- Include `pl-fe` in available frontends
### Fixed
+
- Remove trailing ` from end of line 75 which caused issues copy-pasting
## 2.9.0
### Security
+
- Require HTTP signatures (if enabled) for routes used by both C2S and S2S AP API
- Fix several spoofing vectors
### Changed
-- Performance: Use 301 (permanent) redirect instead of 302 (temporary) when redirecting small images in media proxy. This allows browsers to cache the redirect response.
+
+- Performance: Use 301 (permanent) redirect instead of 302 (temporary) when redirecting small images in media proxy. This allows browsers to cache the redirect response.
### Added
+
- Include "published" in actor view
- Link to exported outbox/followers/following collections in backup actor.json
- Hashtag following
- Allow to specify post language
### Fixed
+
- Verify a local Update sent through AP C2S so users can only update their own objects
- Fix Mastodon incoming edits with inlined "likes"
- Allow incoming "Listen" activities
@@ -46,11 +156,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Fix blurhash generation crashes
### Removed
+
- Retire MRFs DNSRBL, FODirectReply, and QuietReply
## 2.8.0
### Changed
+
- Metadata: Do not include .atom feed links for remote accounts
- Bumped `fast_html` to v2.3.0, which notably allows to use system-installed lexbor with passing `WITH_SYSTEM_LEXBOR=1` environment variable at build-time
- Dedupe upload filter now uses a three-level sharding directory structure
@@ -71,6 +183,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Worker configuration is no longer available. This only affects custom max_retries values for a couple Oban queues.
### Added
+
- Add metadata provider for ActivityPub alternate links
- Added support for argon2 passwords and their conversion for migration from Akkoma fork to upstream.
- Respect :restrict_unauthenticated for hashtag rss/atom feeds
@@ -88,6 +201,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Include session scopes in TokenView
### Fixed
+
- Verify a local Update sent through AP C2S so users can only update their own objects
- Fixed malformed follow requests that cause them to appear stuck pending due to the recipient being unable to process them.
- Fix incoming Block activities being rejected
@@ -105,14 +219,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Make vapid_config return empty array, fixing preloading for instances without push notifications configured
### Removed
+
- Remove stub for /api/v1/accounts/:id/identity_proofs (deprecated by Mastodon 3.5.0)
## 2.7.1
### Changed
+
- Accept `application/activity+json` for requests to `/.well-known/nodeinfo`
### Fixed
+
- Truncate remote user fields, avoids them getting rejected
- Improve the `FollowValidator` to successfully incoming activities with an errant `cc` field.
- Resolved edge case where the API can report you are following a user but the relationship is not fully established.
@@ -122,16 +239,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.7.0
### Security
+
- HTTP Security: By default, don't allow unsafe-eval. The setting needs to be changed to allow Flash emulation.
- Fix webfinger spoofing.
- Use proper workers for fetching pins instead of an ad-hoc task, fixing a potential fetch loop
### Changed
+
- Update to Phoenix 1.7
- Elixir Logger configuration is now longer permitted through AdminFE and ConfigDB
- Refactor the user backups code and improve test coverage
- Invalid activities delivered to the inbox will be rejected with a 400 Bad Request
-- Support Bandit as an alternative to Cowboy for the HTTP server.
+- Support Bandit as an alternative to Cowboy for the HTTP server.
- Update Bandit to 1.5.2
- Replace eblurhash with rinpatch_blurhash. This also removes a dependency on ImageMagick.
- Elixir 1.13 is the minimum required version.
@@ -170,6 +289,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Refactor the Mastodon /api/v1/streaming websocket handler to use Phoenix.Socket.Transport
### Added
+
- Uploader: Add support for uploading attachments using IPFS
- Add NSFW-detecting MRF
- Add DNSRBL MRF
@@ -215,6 +335,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Support honk-style attachment summaries as alt-text.
### Fixed
+
- Fix Emoji object IDs not always being valid
- Remove checking ImageMagick's commands for Pleroma.Upload.Filter.AnalyzeMetadata
- Ensure that StripLocation actually removes everything resembling GPS data from PNGs
@@ -257,7 +378,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Fix Optimistic Inbox for failed signatures
- MediaProxy Preview failures prevented when encountering certain video files
- pleroma_ctl: Use realpath(1) instead of readlink(1)
-- ReceiverWorker: Make sure non-{:ok, _} is returned as {:error, …}
+- ReceiverWorker: Make sure non-{:ok, \_} is returned as {:error, …}
- Harden Rich Media parsing against very slow or malicious URLs
- Rich Media Preview cache eviction when the activity is updated.
- Parsing of RichMedia TTLs for Amazon URLs when query parameters are nil
@@ -269,32 +390,41 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Fix validate_webfinger when running a different domain for Webfinger
### Removed
+
- Mastodon API: Remove deprecated GET /api/v1/statuses/:id/card endpoint https://github.com/mastodon/mastodon/pull/11213
- Removed support for multiple federator modules as we only support ActivityPub
## 2.6.2
### Security
+
- MRF StealEmojiPolicy: Sanitize shortcodes (thanks to Hazel K for the report
## 2.6.1
+
### Changed
+
- - Document maximum supported version of Erlang & Elixir
### Added
+
- [docs] add frontends management documentation
### Fixed
+
- TwitterAPI: Return proper error when healthcheck is disabled
- Fix eblurhash and elixir-captcha not using system cflags
## 2.6.0
+
### Security
+
- Preload: Make generated JSON html-safe. It already was html safe because it only consists of config data that is base64 encoded, but this will keep it safe it that ever changes.
- CommonAPI: Prevent users from accessing media of other users by creating a status with reused attachment ID
- Disable XML entity resolution completely to fix a dos vulnerability
### Added
+
- Support for Image activities, namely from Hubzilla
- Add OAuth scope descriptions
- Allow lang attribute in status text
@@ -305,6 +435,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Add unified streaming endpoint
### Fixed
+
- rel="me" was missing its cache
- MediaProxy responses now return a sandbox CSP header
- Filter context activities using Visibility.visible_for_user?
@@ -326,6 +457,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Show more informative errors when profile exceeds char limits
### Removed
+
- BREAKING: Support for passwords generated with `crypt(3)` (Gnu Social migration artifact)
- remove BBS/SSH feature, replaced by an external bridge.
- Remove a few unused indexes.
@@ -335,56 +467,67 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.5.4
## Security
+
- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitrary files from the server's filesystem
## 2.5.3
### Security
+
- Emoji pack loader sanitizes pack names
- Reduced permissions of config files and directories, distros requiring greater permissions like group-read need to pre-create the directories
## 2.5.5
## Security
+
- Prevent users from accessing media of other users by creating a status with reused attachment ID
## 2.5.4
## Security
+
- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitrary files from the server's filesystem
## 2.5.3
### Security
+
- Emoji pack loader sanitizes pack names
- Reduced permissions of config files and directories, distros requiring greater permissions like group-read need to pre-create the directories
## 2.5.2
### Security
+
- `/proxy` endpoint now sets a Content-Security-Policy (sandbox)
- WebSocket endpoint now respects unauthenticated restrictions for streams of public posts
- OEmbed HTML tags are now filtered
### Changed
+
- docs: Be more explicit about the level of compatibility of OTP releases
- Set default background worker timeout to 15 minutes
### Fixed
+
- Atom/RSS formatting (HTML truncation, published, missing summary)
- Remove `static_fe` pipeline for `/users/:nickname/feed`
- Stop oban from retrying if validating errors occur when processing incoming data
- Make sure object refetching as used by already received polls follows MRF rules
### Removed
+
- BREAKING: Support for passwords generated with `crypt(3)` (Gnu Social migration artifact)
## 2.5.1
### Added
+
- Allow customizing instance languages
### Fixed
+
- Security: uploading HTTP endpoint can no longer create directories in the upload dir (internal APIs, like backup, still can do it.)
- ~ character in urls in Markdown posts are handled properly
- Exiftool upload filter will now ignore SVG files
@@ -405,6 +548,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Quack, the logging backend that pushes to Slack channels
### Changed
+
- **Breaking:** Elixir >=1.11 is now required (was >= 1.9)
- Allow users to remove their emails if instance does not need email to register
- Uploadfilter `Pleroma.Upload.Filter.Exiftool` has been renamed to `Pleroma.Upload.Filter.Exiftool.StripLocation`
@@ -415,6 +559,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- CSP now includes wasm-unsafe-eval
### Added
+
- `activeMonth` and `activeHalfyear` fields in NodeInfo usage.users object
- Experimental support for Finch. Put `config :tesla, :adapter, {Tesla.Adapter.Finch, name: MyFinch}` in your secrets file to use it. Reverse Proxy will still use Hackney.
- `ForceMentionsInPostContent` MRF policy
@@ -436,6 +581,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Possibility to discover users like `user@example.org`, while Pleroma is working on `pleroma.example.org`. Additional configuration required.
### Fixed
+
- Subscription(Bell) Notifications: Don't create from Pipeline Ingested replies
- Handle Reject for already-accepted Follows properly
- Display OpenGraph data on alternative notice routes.
@@ -458,6 +604,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.4.5 - 2022-11-27
## Fixed
+
- Image `class` attributes not being scrubbed, allowing to exploit frontend special classes [!3792](https://git.pleroma.social/pleroma/pleroma/-/merge_requests/3792)
- Delete report notifs when demoting from superuser [!3642](https://git.pleroma.social/pleroma/pleroma/-/merge_requests/3642)
- Validate `mediaType` only by it's format rather than using a list [!3597](https://git.pleroma.social/pleroma/pleroma/-/merge_requests/3597)
@@ -472,17 +619,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.4.4 - 2022-08-19
### Security
+
- Streaming API sessions will now properly disconnect if the corresponding token is revoked
## 2.4.3 - 2022-05-06
### Security
+
- Private `/objects/` and `/activities/` leaking if cached by authenticated user
- SweetXML library DTD bomb
## 2.4.2 - 2022-01-10
### Fixed
+
- Federation issues caused by HTTP pool checkout timeouts
- Compatibility with Elixir 1.13
@@ -493,12 +643,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.4.1 - 2021-08-29
### Changed
+
- Make `mix pleroma.database set_text_search_config` run concurrently and indefinitely
### Added
+
- AdminAPI: Missing configuration description for StealEmojiPolicy
### Fixed
+
- MastodonAPI: Stream out Create activities
- MRF ObjectAgePolicy: Fix pattern matching on "published"
- TwitterAPI: Make `change_password` and `change_email` require params on body instead of query
@@ -537,6 +690,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Pinned posts federation
### Fixed
+
- Don't crash so hard when email settings are invalid.
- Checking activated Upload Filters for required commands.
- Remote users can no longer reappear after being deleted.
@@ -554,6 +708,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Fixed some Markdown issues, including trailing slash in links.
### Removed
+
- **Breaking**: Remove deprecated `/api/qvitter/statuses/notifications/read` (replaced by `/api/v1/pleroma/notifications/read`)
## [2.3.0] - 2021-03-01
@@ -672,6 +827,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [2.2.1] - 2020-12-22
### Changed
+
- Updated Pleroma FE
### Fixed
@@ -724,7 +880,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- **Breaking:** `Pleroma.Workers.Cron.ClearOauthTokenWorker` setting from Oban `:crontab` (moved to scheduled jobs).
- **Breaking:** `Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker` setting from Oban `:crontab` (moved to scheduled jobs).
- Removed `:managed_config` option. In practice, it was accidentally removed with 2.0.0 release when frontends were
-switched to a new configuration mechanism, however it was not officially removed until now.
+ switched to a new configuration mechanism, however it was not officially removed until now.
### Added
@@ -755,8 +911,10 @@ switched to a new configuration mechanism, however it was not officially removed
1. Install libmagic and development headers (`libmagic-dev` on Ubuntu/Debian, `file-dev` on Alpine Linux)
2. Run database migrations (inside Pleroma directory):
- - OTP: `./bin/pleroma_ctl migrate`
- - From Source: `mix ecto.migrate`
+
+- OTP: `./bin/pleroma_ctl migrate`
+- From Source: `mix ecto.migrate`
+
3. Restart Pleroma
## [2.1.2] - 2020-09-17
@@ -784,6 +942,7 @@ switched to a new configuration mechanism, however it was not officially removed
## [2.1.1] - 2020-09-08
### Security
+
- Fix possible DoS in Mastodon API user search due to an error in match clauses, leading to an infinite recursion and subsequent OOM with certain inputs.
- Fix metadata leak for accounts and statuses on private instances.
- Fix possible DoS in Admin API search using an atom leak vulnerability. Authentication with admin rights was required to exploit.
@@ -794,6 +953,7 @@ switched to a new configuration mechanism, however it was not officially removed
- Improved error message when cmake is not available at build stage.
### Added
+
- Rich media failure tracking (along with `:failure_backoff` option).
` for newlines
- Mastodon API: Allow registration without email if email verification is not enabled
### Upgrade notes
+
#### Nginx only
+
1. Remove `proxy_ignore_headers Cache-Control;` and `proxy_hide_header Cache-Control;` from your config.
#### Everyone
+
1. Run database migrations (inside Pleroma directory):
- - OTP: `./bin/pleroma_ctl migrate`
- - From Source: `mix ecto.migrate`
+
+- OTP: `./bin/pleroma_ctl migrate`
+- From Source: `mix ecto.migrate`
+
2. Restart Pleroma
## [2.0.0] - 2019-03-08
+
### Security
+
- Mastodon API: Fix being able to request enormous amount of statuses in timelines leading to DoS. Now limited to 40 per request.
### Removed
+
- **Breaking**: Removed 1.0+ deprecated configurations `Pleroma.Upload, :strip_exif` and `:instance, :dedupe_media`
- **Breaking**: OStatus protocol support
- **Breaking**: MDII uploader
@@ -1093,6 +1289,7 @@ switched to a new configuration mechanism, however it was not officially removed
tags used by Mastodon quotes
\ No newline at end of file
diff --git a/changelog.d/scrubber-span-classes.change b/changelog.d/scrubber-span-classes.change
deleted file mode 100644
index 4ba5dfa915..0000000000
--- a/changelog.d/scrubber-span-classes.change
+++ /dev/null
@@ -1 +0,0 @@
-Allow "invisible" and "ellipsis" classes for span tags to match Mastodon behavior
diff --git a/changelog.d/siteinfo-baseurls.add b/changelog.d/siteinfo-baseurls.add
deleted file mode 100644
index 6f0f198475..0000000000
--- a/changelog.d/siteinfo-baseurls.add
+++ /dev/null
@@ -1 +0,0 @@
-Add `base_urls` to the /api/v1/instance pleroma metadata which provides information about the base URLs for media_proxy and uploads when configured
\ No newline at end of file
diff --git a/changelog.d/smtp-docs.change b/changelog.d/smtp-docs.change
deleted file mode 100644
index fb9925e432..0000000000
--- a/changelog.d/smtp-docs.change
+++ /dev/null
@@ -1 +0,0 @@
-Change SMTP example to use the Mua adapter that works with OTP>25
\ No newline at end of file
diff --git a/changelog.d/status-push-notification.fix b/changelog.d/status-push-notification.fix
deleted file mode 100644
index ed0bbff33d..0000000000
--- a/changelog.d/status-push-notification.fix
+++ /dev/null
@@ -1 +0,0 @@
-Send push notifications for statuses from subscribed accounts
diff --git a/changelog.d/stream-marker-updates.add b/changelog.d/stream-marker-updates.add
deleted file mode 100644
index e9fda3e59f..0000000000
--- a/changelog.d/stream-marker-updates.add
+++ /dev/null
@@ -1 +0,0 @@
-Stream marker updates
diff --git a/changelog.d/tesla.change b/changelog.d/tesla.change
deleted file mode 100644
index bd0ec6e94e..0000000000
--- a/changelog.d/tesla.change
+++ /dev/null
@@ -1 +0,0 @@
-Updated Tesla to 1.15.3
diff --git a/changelog.d/toctou-mkdir.fix b/changelog.d/toctou-mkdir.fix
deleted file mode 100644
index b070db1a05..0000000000
--- a/changelog.d/toctou-mkdir.fix
+++ /dev/null
@@ -1 +0,0 @@
-Backport [Elixir PR 14242](https://github.com/elixir-lang/elixir/pull/14242) fixing racy mkdir and lack of error handling of parent directory creation
\ No newline at end of file
diff --git a/changelog.d/tos-setting.add b/changelog.d/tos-setting.add
deleted file mode 100644
index db9b0d5f28..0000000000
--- a/changelog.d/tos-setting.add
+++ /dev/null
@@ -1 +0,0 @@
-Allow Terms of Service panel behaviour to be configurable
diff --git a/changelog.d/translate-posts.add b/changelog.d/translate-posts.add
deleted file mode 100644
index e7a9317a11..0000000000
--- a/changelog.d/translate-posts.add
+++ /dev/null
@@ -1 +0,0 @@
-Support translation providers (DeepL, LibreTranslate)
\ No newline at end of file
diff --git a/changelog.d/translation-provider-mozhi.add b/changelog.d/translation-provider-mozhi.add
deleted file mode 100644
index c3cf5940a2..0000000000
--- a/changelog.d/translation-provider-mozhi.add
+++ /dev/null
@@ -1 +0,0 @@
-Support Mozhi translation provider
diff --git a/changelog.d/translation-provider-translatelocally.add b/changelog.d/translation-provider-translatelocally.add
deleted file mode 100644
index 635e800619..0000000000
--- a/changelog.d/translation-provider-translatelocally.add
+++ /dev/null
@@ -1 +0,0 @@
-Support translateLocally translation provider
diff --git a/changelog.d/truncate-rich-media.change b/changelog.d/truncate-rich-media.change
deleted file mode 100644
index 1df064be1a..0000000000
--- a/changelog.d/truncate-rich-media.change
+++ /dev/null
@@ -1 +0,0 @@
-Truncate the length of Rich Media title and description fields
diff --git a/changelog.d/typo.skip b/changelog.d/typo.skip
deleted file mode 100644
index 721ba96c58..0000000000
--- a/changelog.d/typo.skip
+++ /dev/null
@@ -1 +0,0 @@
-Fix typo in test name
diff --git a/changelog.d/typos.skip b/changelog.d/typos.skip
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/changelog.d/update-poll-voters-count.fix b/changelog.d/update-poll-voters-count.fix
deleted file mode 100644
index 557c2b0df0..0000000000
--- a/changelog.d/update-poll-voters-count.fix
+++ /dev/null
@@ -1 +0,0 @@
-Update voters count in remote polls when refreshing
diff --git a/changelog.d/url-encoding-pt2.fix b/changelog.d/url-encoding-pt2.fix
deleted file mode 100644
index bc6857e022..0000000000
--- a/changelog.d/url-encoding-pt2.fix
+++ /dev/null
@@ -1 +0,0 @@
-Fix sometimes incorrect URI percent encoding
diff --git a/changelog.d/url-encoding.fix b/changelog.d/url-encoding.fix
deleted file mode 100644
index 3cca87ded0..0000000000
--- a/changelog.d/url-encoding.fix
+++ /dev/null
@@ -1 +0,0 @@
-Fix HTTP client making invalid requests due to no percent encoding processing or validation.
diff --git a/changelog.d/vix-0.36.0.fix b/changelog.d/vix-0.36.0.fix
new file mode 100644
index 0000000000..43a8dd8f83
--- /dev/null
+++ b/changelog.d/vix-0.36.0.fix
@@ -0,0 +1 @@
+Fix compilation with vips-8.18.0 with bumping to vix 0.36.0
diff --git a/changelog.d/webfinger-resolution.fix b/changelog.d/webfinger-resolution.fix
deleted file mode 100644
index 71b927bb0a..0000000000
--- a/changelog.d/webfinger-resolution.fix
+++ /dev/null
@@ -1 +0,0 @@
-Enforce an exact domain match for WebFinger resolution
diff --git a/changelog.d/webfinger.change b/changelog.d/webfinger.change
deleted file mode 100644
index 353e65a89b..0000000000
--- a/changelog.d/webfinger.change
+++ /dev/null
@@ -1 +0,0 @@
-Don't require an Accept header for WebFinger queries and default to JSON.
\ No newline at end of file
diff --git a/config/test.exs b/config/test.exs
index e901f08d5b..6be3590fdc 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -104,7 +104,6 @@ config :pleroma, :http, send_user_agent: false
rum_enabled = System.get_env("RUM_ENABLED") == "true"
config :pleroma, :database, rum_enabled: rum_enabled
-IO.puts("RUM enabled: #{rum_enabled}")
config :joken, default_signer: "yU8uHKq+yyAkZ11Hx//jcdacWc8yQ1bxAAGrplzB0Zwwjkp35v0RK9SO8WTPr6QZ"
@@ -194,7 +193,7 @@ config :pleroma, Pleroma.Application,
streamer_registry: false,
test_http_pools: true
-config :pleroma, Pleroma.Web.Streaming, sync_streaming: true
+config :pleroma, Pleroma.Web.Streamer, sync_streaming: true
config :pleroma, Pleroma.Uploaders.Uploader, timeout: 1_000
@@ -209,8 +208,9 @@ config :pleroma, Pleroma.User.Backup, tempdir: "test/tmp"
if File.exists?("./config/test.secret.exs") do
import_config "test.secret.exs"
-else
- IO.puts(
- "You may want to create test.secret.exs to declare custom database connection parameters."
- )
end
+
+# Avoid noisy shutdown logs from os_mon during tests.
+config :os_mon,
+ start_cpu_sup: false,
+ start_memsup: false
diff --git a/docs/administration/dashboards.md b/docs/administration/dashboards.md
new file mode 100644
index 0000000000..b95e0fac0e
--- /dev/null
+++ b/docs/administration/dashboards.md
@@ -0,0 +1,47 @@
+# Dashboards
+
+Pleroma comes with two types of backend dashboards viewable to instance administrators:
+
+* [Phoenix LiveDashboard](https://hexdocs.pm/phoenix_live_dashboard/Phoenix.LiveDashboard.html) - A general system oriented dashboard for viewing statistics about Pleroma resource consumption, Pleroma's database and Pleroma's job processor (Oban).
+* [Oban Web](https://hexdocs.pm/oban_web/overview.html) - A dashboard specific to Oban for viewing Oban statistics, managing jobs and job queues.
+
+!!! note
+ Both dashboards require working Websockets.
+ If your browser or web server don't support Websockets, both dashboards either won't update or will not display all information.
+
+## Phoenix LiveDashboard
+
+Instance administrators can access this dashboard at `/pleroma/live_dashboard`, giving a simple overview of software versions including Erlang and Elixir versions, instance uptime and resource consumption.
+
+This dashboard gives insights into the current state of the BEAM VM running Pleroma code and database statistics including basic diagnostics.
+It can be useful for troubleshooting of some issues namely regarding database performance.
+
+### Relevant dashboard tabs
+
+* Home - A general overview of system information including software versions, uptime and memory BEAM memory consumption.
+* OS Data - Information about the OS and system such as CPU load, memory usage and disk usage.
+* Ecto Stats - Information about the Pleroma database.
+ - Diagnose - Basic database diagnostics, including a `bloat` warning when an index or a table have excessive bloat, which can lead to bad database performance.
+ - Bloat - A table showing size of "bloat" (unused wasted space) in database tables and indexes. Very high bloat size in the `activities` and `objects` tables can lead to bad performance especially on slower disks such as on most VPS providers.
+ - Db settings - A small list of PostgreSQL settings mostly relevant to database performance.
+ - Total table size - Shows sizes of all database tables including indexes sorted by size, useful for quickly checking overall database size.
+ - Long running queries - A list of of slow database queries and their duration. Multiple entries with duration in multiple seconds indicate a slowly performing database.
+* Oban - Shows a list of all Oban jobs.
+
+!!! note
+ The DB bloat warning for `index 'oban_jobs::oban_jobs_args_index'` in Ecto Stats can be safely ignored.
+
+## Oban Web
+
+An advanced dashboard and management console viewable to instance administrators specifically for Oban, Pleroma's job processor.
+It allows managing jobs, including force retrying failed jobs and job deletion.
+It can be accessed at `/pleroma/oban`.
+
+!!! danger
+ This dashboard is very powerful! If you are unsure what a certain feature does, don't use it.
+ Changing individual queue state/settings in the "Queues" view is heavily discouraged.
+
+* Shows a real time chart of either a number of executed jobs, or job execution/wait time per a given time frame and the state/queue/worker.
+* Shows a list of jobs in each state, their argument, number of attempts and execution/scheduled time.
+* Selecting one or multiple jobs in the list allows performing actions like canceling/deleting and retrying.
+* Clicking on a job shows a detailed view including the full argument, when it was inserted, information about its attempts, and performing actions on it.
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index 3465dce589..b41c902081 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -905,21 +905,31 @@ config :logger, :console,
### RUM indexing for full text search
-!!! warning
- It is recommended to use PostgreSQL v11 or newer. We have seen some minor issues with lower PostgreSQL versions.
-
* `rum_enabled`: If RUM indexes should be used. Defaults to `false`.
-RUM indexes are an alternative indexing scheme that is not included in PostgreSQL by default. While they may eventually be mainlined, for now they have to be installed as a PostgreSQL extension from https://github.com/postgrespro/rum.
+RUM indexes are an alternative indexing scheme that is not included in PostgreSQL by default. While they may eventually be mainlined, for now they have to be installed as a PostgreSQL extension from [https://github.com/postgrespro/rum](https://github.com/postgrespro/rum).
-Their advantage over the standard GIN indexes is that they allow efficient ordering of search results by timestamp, which makes search queries a lot faster on larger servers, by one or two orders of magnitude. They take up around 3 times as much space as GIN indexes.
+Their advantage over the standard GIN indexes is that they allow efficient ordering of search results by timestamp, which makes search queries a lot faster on larger servers, by one or two orders of magnitude. They take up around 3-4 times as much space as GIN indexes.
To enable them, both the `rum_enabled` flag has to be set and the following special migration has to be run:
-`mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/`
+ * Source install:
+ - Stop Pleroma
+ - `mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/`
+ * OTP install:
+ - Stop Pleroma
+ - `pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/`
This will probably take a long time.
+!!! note
+ It is recommended to `VACUUM FULL` the objects table after the migration has completed, to do that run:
+ ```
+ # sudo -Hu postgres vacuumdb --full --analyze -t objects 0)return;if(yu){let t=yu;for(yu=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;bu;){let t=bu;for(bu=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function XA(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function JA(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Zy(s),zU(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function A0(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(ZA(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function ZA(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===zu)||(e.globalVersion=zu,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!A0(e))))return;e.flags|=2;const t=e.dep,n=vn,s=kr;vn=e,kr=!0;try{XA(e);const r=e.fn(e._value);(t.version===0||Oi(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{vn=n,kr=s,JA(e),e.flags&=-3}}function Zy(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let o=n.computed.deps;o;o=o.nextDep)Zy(o,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function zU(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let kr=!0;const QA=[];function Ho(){QA.push(kr),kr=!1}function Vo(){const e=QA.pop();kr=e===void 0?!0:e}function u$(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=vn;vn=void 0;try{t()}finally{vn=n}}}let zu=0;class qU{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Qy{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!vn||!kr||vn===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==vn)n=this.activeLink=new qU(vn,this),vn.deps?(n.prevDep=vn.depsTail,vn.depsTail.nextDep=n,vn.depsTail=n):vn.deps=vn.depsTail=n,e8(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=vn.depsTail,n.nextDep=void 0,vn.depsTail.nextDep=n,vn.depsTail=n,vn.deps===n&&(vn.deps=s)}return n}trigger(t){this.version++,zu++,this.notify(t)}notify(t){Xy();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Jy()}}}function e8(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)e8(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const ch=new WeakMap,Aa=Symbol(""),E0=Symbol(""),qu=Symbol("");function fs(e,t,n){if(kr&&vn){let s=ch.get(e);s||ch.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Qy),r.map=s,r.key=n),r.track()}}function Ro(e,t,n,s,r,o){const i=ch.get(e);if(!i){zu++;return}const a=c=>{c&&c.trigger()};if(Xy(),t==="clear")i.forEach(a);else{const c=lt(e),u=c&&xy(n);if(c&&n==="length"){const f=Number(s);i.forEach((h,v)=>{(v==="length"||v===qu||!Ir(v)&&v>=f)&&a(h)})}else switch((n!==void 0||i.has(void 0))&&a(i.get(n)),u&&a(i.get(qu)),t){case"add":c?u&&a(i.get("length")):(a(i.get(Aa)),Ll(e)&&a(i.get(E0)));break;case"delete":c||(a(i.get(Aa)),Ll(e)&&a(i.get(E0)));break;case"set":Ll(e)&&a(i.get(Aa));break}}Jy()}function HU(e,t){const n=ch.get(e);return n&&n.get(t)}function bl(e){const t=Mt(e);return t===e?t:(fs(t,"iterate",qu),mr(e)?t:t.map(ts))}function rp(e){return fs(e=Mt(e),"iterate",qu),e}const VU={__proto__:null,[Symbol.iterator](){return bg(this,Symbol.iterator,ts)},concat(...e){return bl(this).concat(...e.map(t=>lt(t)?bl(t):t))},entries(){return bg(this,"entries",e=>(e[1]=ts(e[1]),e))},every(e,t){return To(this,"every",e,t,void 0,arguments)},filter(e,t){return To(this,"filter",e,t,n=>n.map(ts),arguments)},find(e,t){return To(this,"find",e,t,ts,arguments)},findIndex(e,t){return To(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return To(this,"findLast",e,t,ts,arguments)},findLastIndex(e,t){return To(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return To(this,"forEach",e,t,void 0,arguments)},includes(...e){return yg(this,"includes",e)},indexOf(...e){return yg(this,"indexOf",e)},join(e){return bl(this).join(e)},lastIndexOf(...e){return yg(this,"lastIndexOf",e)},map(e,t){return To(this,"map",e,t,void 0,arguments)},pop(){return Kc(this,"pop")},push(...e){return Kc(this,"push",e)},reduce(e,...t){return d$(this,"reduce",e,t)},reduceRight(e,...t){return d$(this,"reduceRight",e,t)},shift(){return Kc(this,"shift")},some(e,t){return To(this,"some",e,t,void 0,arguments)},splice(...e){return Kc(this,"splice",e)},toReversed(){return bl(this).toReversed()},toSorted(e){return bl(this).toSorted(e)},toSpliced(...e){return bl(this).toSpliced(...e)},unshift(...e){return Kc(this,"unshift",e)},values(){return bg(this,"values",ts)}};function bg(e,t,n){const s=rp(e),r=s[t]();return s!==e&&!mr(e)&&(r._next=r.next,r.next=()=>{const o=r._next();return o.value&&(o.value=n(o.value)),o}),r}const WU=Array.prototype;function To(e,t,n,s,r,o){const i=rp(e),a=i!==e&&!mr(e),c=i[t];if(c!==WU[t]){const h=c.apply(e,o);return a?ts(h):h}let u=n;i!==e&&(a?u=function(h,v){return n.call(this,ts(h),v,e)}:n.length>2&&(u=function(h,v){return n.call(this,h,v,e)}));const f=c.call(i,u,s);return a&&r?r(f):f}function d$(e,t,n,s){const r=rp(e);let o=n;return r!==e&&(mr(e)?n.length>3&&(o=function(i,a,c){return n.call(this,i,a,c,e)}):o=function(i,a,c){return n.call(this,i,ts(a),c,e)}),r[t](o,...s)}function yg(e,t,n){const s=Mt(e);fs(s,"iterate",qu);const r=s[t](...n);return(r===-1||r===!1)&&s_(n[0])?(n[0]=Mt(n[0]),s[t](...n)):r}function Kc(e,t,n=[]){Ho(),Xy();const s=Mt(e)[t].apply(e,n);return Jy(),Vo(),s}const GU=Wy("__proto__,__v_isRef,__isVue"),t8=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ir));function KU(e){Ir(e)||(e=String(e));const t=Mt(this);return fs(t,"has",e),t.hasOwnProperty(e)}class n8{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return o;if(n==="__v_raw")return s===(r?o?s9:i8:o?o8:r8).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const i=lt(t);if(!r){let c;if(i&&(c=VU[n]))return c;if(n==="hasOwnProperty")return KU}const a=Reflect.get(t,n,Sn(t)?t:s);return(Ir(n)?t8.has(n):GU(n))||(r||fs(t,"get",n),o)?a:Sn(a)?i&&xy(n)?a:a.value:pn(a)?r?a8(a):Pr(a):a}}class s8 extends n8{constructor(t=!1){super(!1,t)}set(t,n,s,r){let o=t[n];if(!this._isShallow){const c=Wo(o);if(!mr(s)&&!Wo(s)&&(o=Mt(o),s=Mt(s)),!lt(t)&&Sn(o)&&!Sn(s))return c||(o.value=s),!0}const i=lt(t)&&xy(n)?Number(n)L?0:L+m),_=_===n||_>L?L:At(_),_<0&&(_+=L),_=m>_?0:YS(_);m<_;)l[m++]=d;return l}function Rw(l,d){var m=[];return ci(l,function(_,L,D){d(_,L,D)&&m.push(_)}),m}function Qn(l,d,m,_,L){var D=-1,x=l.length;for(m||(m=oN),L||(L=[]);++D