Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into lazarus
This commit is contained in:
commit
8428a1bed3
414 changed files with 10688 additions and 2368 deletions
|
|
@ -1,8 +1,8 @@
|
|||
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.13.4-otp-25
|
||||
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.14.5-otp-25
|
||||
|
||||
variables: &global_variables
|
||||
# Only used for the release
|
||||
ELIXIR_VER: 1.13.4
|
||||
ELIXIR_VER: 1.17.3
|
||||
POSTGRES_DB: pleroma_test
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
|
|
@ -14,9 +14,10 @@ variables: &global_variables
|
|||
workflow:
|
||||
rules:
|
||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
||||
- if: $CI_COMMIT_BRANCH == "develop"
|
||||
- if: $CI_COMMIT_BRANCH == "stable"
|
||||
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH
|
||||
|
||||
cache: &global_cache_policy
|
||||
key: $CI_JOB_IMAGE-$CI_COMMIT_SHORT_SHA
|
||||
|
|
@ -71,7 +72,7 @@ check-changelog:
|
|||
tags:
|
||||
- amd64
|
||||
|
||||
build-1.13.4-otp-25:
|
||||
build-1.14.5-otp-25:
|
||||
extends:
|
||||
- .build_changes_policy
|
||||
- .using-ci-base
|
||||
|
|
@ -79,12 +80,12 @@ build-1.13.4-otp-25:
|
|||
script:
|
||||
- mix compile --force
|
||||
|
||||
build-1.17.1-otp-26:
|
||||
build-1.18.3-otp-27:
|
||||
extends:
|
||||
- .build_changes_policy
|
||||
- .using-ci-base
|
||||
stage: build
|
||||
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.17.1-otp-26
|
||||
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.18.3-otp-27
|
||||
script:
|
||||
- mix compile --force
|
||||
|
||||
|
|
@ -119,7 +120,7 @@ benchmark:
|
|||
- mix ecto.migrate
|
||||
- mix pleroma.load_testing
|
||||
|
||||
unit-testing-1.13.4-otp-25:
|
||||
unit-testing-1.14.5-otp-25:
|
||||
extends:
|
||||
- .build_changes_policy
|
||||
- .using-ci-base
|
||||
|
|
@ -131,10 +132,25 @@ unit-testing-1.13.4-otp-25:
|
|||
- name: postgres:13-alpine
|
||||
alias: postgres
|
||||
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
|
||||
before_script: &testing_before_script
|
||||
- echo $MIX_ENV
|
||||
- rm -rf _build/*/lib/pleroma
|
||||
# Create a non-root user for running tests
|
||||
- useradd -m -s /bin/bash testuser
|
||||
# Install dependencies as root first
|
||||
- mix deps.get
|
||||
# Set proper ownership for everything
|
||||
- chown -R testuser:testuser .
|
||||
- chown -R testuser:testuser /root/.mix || true
|
||||
- chown -R testuser:testuser /root/.hex || true
|
||||
# Create user-specific directories
|
||||
- su testuser -c "HOME=/home/testuser mix local.hex --force"
|
||||
- su testuser -c "HOME=/home/testuser mix local.rebar --force"
|
||||
script: &testing_script
|
||||
- mix ecto.create
|
||||
- mix ecto.migrate
|
||||
- mix pleroma.test_runner --cover --preload-modules
|
||||
# Run tests as non-root user
|
||||
- su testuser -c "HOME=/home/testuser mix ecto.create"
|
||||
- su testuser -c "HOME=/home/testuser mix ecto.migrate"
|
||||
- su testuser -c "HOME=/home/testuser mix pleroma.test_runner --cover --preload-modules"
|
||||
coverage: '/^Line total: ([^ ]*%)$/'
|
||||
artifacts:
|
||||
reports:
|
||||
|
|
@ -142,14 +158,15 @@ unit-testing-1.13.4-otp-25:
|
|||
coverage_format: cobertura
|
||||
path: coverage.xml
|
||||
|
||||
unit-testing-1.17.1-otp-26:
|
||||
unit-testing-1.18.3-otp-27:
|
||||
extends:
|
||||
- .build_changes_policy
|
||||
- .using-ci-base
|
||||
stage: test
|
||||
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.17.1-otp-26
|
||||
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.18.3-otp-27
|
||||
cache: *testing_cache_policy
|
||||
services: *testing_services
|
||||
before_script: *testing_before_script
|
||||
script: *testing_script
|
||||
|
||||
formatting-1.15:
|
||||
|
|
@ -208,7 +225,7 @@ docs-deploy:
|
|||
before_script:
|
||||
- apk add curl
|
||||
script:
|
||||
- curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
|
||||
- curl --fail-with-body -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
|
||||
review_app:
|
||||
image: alpine:3.9
|
||||
stage: deploy
|
||||
|
|
@ -249,7 +266,7 @@ spec-deploy:
|
|||
before_script:
|
||||
- apk add curl
|
||||
script:
|
||||
- curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline
|
||||
- curl --fail-with-body -X POST -F"token=$API_DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline
|
||||
|
||||
|
||||
stop_review_app:
|
||||
|
|
@ -272,7 +289,8 @@ stop_review_app:
|
|||
|
||||
amd64:
|
||||
stage: release
|
||||
image: elixir:$ELIXIR_VER
|
||||
image:
|
||||
name: hexpm/elixir-amd64:1.17.3-erlang-26.2.5.6-ubuntu-focal-20241011
|
||||
only: &release-only
|
||||
- stable@pleroma/pleroma
|
||||
- develop@pleroma/pleroma
|
||||
|
|
@ -297,8 +315,9 @@ amd64:
|
|||
variables: &release-variables
|
||||
MIX_ENV: prod
|
||||
VIX_COMPILATION_MODE: PLATFORM_PROVIDED_LIBVIPS
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
before_script: &before-release
|
||||
- apt-get update && apt-get install -y cmake libmagic-dev libvips-dev erlang-dev
|
||||
- apt-get update && apt-get install -y cmake libmagic-dev libvips-dev erlang-dev git
|
||||
- echo "import Config" > config/prod.secret.exs
|
||||
- mix local.hex --force
|
||||
- mix local.rebar --force
|
||||
|
|
@ -313,7 +332,8 @@ amd64-musl:
|
|||
stage: release
|
||||
artifacts: *release-artifacts
|
||||
only: *release-only
|
||||
image: elixir:$ELIXIR_VER-alpine
|
||||
image:
|
||||
name: hexpm/elixir-amd64:1.17.3-erlang-26.2.5.6-alpine-3.17.9
|
||||
tags:
|
||||
- amd64
|
||||
cache: *release-cache
|
||||
|
|
@ -327,6 +347,7 @@ amd64-musl:
|
|||
|
||||
arm:
|
||||
stage: release
|
||||
allow_failure: true
|
||||
artifacts: *release-artifacts
|
||||
only: *release-only
|
||||
tags:
|
||||
|
|
@ -355,7 +376,8 @@ arm64:
|
|||
only: *release-only
|
||||
tags:
|
||||
- arm
|
||||
image: arm64v8/elixir:$ELIXIR_VER
|
||||
image:
|
||||
name: hexpm/elixir-arm64:1.17.3-erlang-26.2.5.6-ubuntu-focal-20241011
|
||||
cache: *release-cache
|
||||
variables: *release-variables
|
||||
before_script: *before-release
|
||||
|
|
@ -367,7 +389,8 @@ arm64-musl:
|
|||
only: *release-only
|
||||
tags:
|
||||
- arm
|
||||
image: arm64v8/elixir:$ELIXIR_VER-alpine
|
||||
image:
|
||||
name: hexpm/elixir-arm64:1.17.3-erlang-26.2.5.6-alpine-3.17.9
|
||||
cache: *release-cache
|
||||
variables: *release-variables
|
||||
before_script: *before-release-musl
|
||||
|
|
|
|||
115
CHANGELOG.md
115
CHANGELOG.md
|
|
@ -4,6 +4,121 @@ 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.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.
|
||||
- Limit emoji shortcodes to alphanumeric, dash, or underscore characters to prevent potential abuse.
|
||||
- Block attempts to fetch activities from the local instance to prevent spoofing.
|
||||
- Sanitize Content-Type headers in media proxy to prevent serving malicious ActivityPub content through proxied media.
|
||||
- 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.
|
||||
|
||||
### 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
|
||||
- Fix missing check for domain presence in rich media ignore_host configuration
|
||||
- Fix Rich Media parsing of TwitterCards/OpenGraph to adhere to the spec and always choose the first image if multiple are provided.
|
||||
- Fix OpenGraph/TwitterCard meta tag ordering for posts with multiple attachments
|
||||
- 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
|
||||
- Deprecate `/api/v1/pleroma/accounts/:id/subscribe`/`unsubscribe`
|
||||
- Restrict incoming activities from unknown actors to a subset that does not imply a previous relationship and early rejection of unrecognized activity types.
|
||||
- Elixir 1.14 and Erlang/OTP 23 is now the minimum supported release
|
||||
- Support `id` param in `GET /api/v1/statuses`
|
||||
- LDAP authentication has been refactored to operate as a GenServer process which will maintain an active connection to the LDAP server.
|
||||
- Fix 'Setting a marker should mark notifications as read'
|
||||
- Adjust more Oban workers to enforce unique job constraints.
|
||||
- Oban updated to 2.18.3
|
||||
- Publisher behavior improvement when snoozing Oban jobs due to Gun connection pool contention.
|
||||
- Poll results refreshing is handled asynchronously and will not attempt to keep fetching updates to a closed poll.
|
||||
- Tuning for release builds to lower CPU usage.
|
||||
- Rich Media preview fetching will skip making an HTTP HEAD request to check a URL for allowed content type and length if the Tesla adapter is Gun or Finch
|
||||
- Fix nonexisting user will not generate metadata for search engine opt-out
|
||||
- Update Oban to 2.18
|
||||
- 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
|
||||
- LDAP configuration now permits overriding the CA root certificate file for TLS validation.
|
||||
- LDAP now supports users changing their passwords
|
||||
- Include list id in StatusView
|
||||
- Added MRF.FODirectReply which changes replies to followers-only posts to be direct.
|
||||
- Add `id_filter` to MRF to filter URLs and their domain prior to fetching
|
||||
- Added MRF.QuietReply which prevents replies to public posts from being published to the timelines
|
||||
- Add `group_key` to notifications
|
||||
- Allow providing avatar/header descriptions
|
||||
- Added RemoteReportPolicy from Rebased for handling bogus federated reports
|
||||
- scrubbers/default: Allow "mention hashtag" classes used by Mastodon
|
||||
- Added dependencies for Swoosh's Mua mail adapter
|
||||
- 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
|
||||
- STARTTLS certificate and hostname verification for LDAP authentication
|
||||
- LDAPS connections (implicit TLS) are now supported.
|
||||
- Fix /api/v2/media returning the wrong status code (202) for media processed synchronously
|
||||
- Miscellaneous fixes for Meilisearch support
|
||||
- Fix pleroma_ctl mix task calls sometimes not being found
|
||||
- Add a rate limiter to the OAuth App creation endpoint and ensure registered apps are assigned to users.
|
||||
- ReceiverWorker will cancel processing jobs instead of retrying if the user cannot be fetched due to 403, 404, or 410 errors or if the account is disabled locally.
|
||||
- Address case where instance reachability status couldn't be updated
|
||||
- Remote Fetcher Worker recognizes more permanent failure errors
|
||||
- StreamerView: Do not leak follows count if hidden
|
||||
- Imports of blocks, mutes, and follows would retry repeatedly due to incorrect error handling and all work executed in a single job
|
||||
- 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.
|
||||
- The Swoosh email adapter for Mailgun was missing a new dependency on `:multipart`
|
||||
- Fix Mastodon WebSocket authentication
|
||||
|
||||
## 2.7.0
|
||||
|
||||
### Security
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
# https://hub.docker.com/r/hexpm/elixir/tags
|
||||
ARG ELIXIR_IMG=hexpm/elixir
|
||||
ARG ELIXIR_VER=1.13.4
|
||||
ARG ERLANG_VER=24.3.4.15
|
||||
ARG ALPINE_VER=3.17.5
|
||||
ARG ELIXIR_VER=1.14.5
|
||||
ARG ERLANG_VER=25.3.2.14
|
||||
ARG ALPINE_VER=3.17.9
|
||||
|
||||
FROM ${ELIXIR_IMG}:${ELIXIR_VER}-erlang-${ERLANG_VER}-alpine-${ALPINE_VER} as build
|
||||
|
||||
|
|
|
|||
1
changelog.d/activity_type_index.change
Normal file
1
changelog.d/activity_type_index.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Add new activity actor/type index. Greatly speeds up retrieval of rare types (like "Listen")
|
||||
1
changelog.d/admin-api-docs-fix.skip
Normal file
1
changelog.d/admin-api-docs-fix.skip
Normal file
|
|
@ -0,0 +1 @@
|
|||
Fix 'Create a user' description in admin api docs
|
||||
|
|
@ -1 +0,0 @@
|
|||
Added support for argon2 passwords and their conversion for migration from Akkoma fork to upstream.
|
||||
1
changelog.d/assign-app-user-oom.fix
Normal file
1
changelog.d/assign-app-user-oom.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Fix AssignAppUser migration OOM
|
||||
|
|
@ -1 +0,0 @@
|
|||
Truncate remote user fields, avoids them getting rejected
|
||||
1
changelog.d/bump-captcha-posix-make.fix
Normal file
1
changelog.d/bump-captcha-posix-make.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
- Fix building "captcha" library with OpenBSD make
|
||||
1
changelog.d/db-restore-docs.change
Normal file
1
changelog.d/db-restore-docs.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Docs: Restore DB schema before data to avoid long restore times
|
||||
1
changelog.d/deactivated-404-inbox.change
Normal file
1
changelog.d/deactivated-404-inbox.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Return 404 with a better error message instead of 400 when receiving an activity for a deactivated user
|
||||
1
changelog.d/deepl-json.fix
Normal file
1
changelog.d/deepl-json.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Use JSON for DeepL API requests
|
||||
1
changelog.d/delete-instance.change
Normal file
1
changelog.d/delete-instance.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Deleting an instance queues individual jobs for each user that needs to be deleted from the server.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Deprecate `/api/v1/pleroma/accounts/:id/subscribe`/`unsubscribe`
|
||||
1
changelog.d/dislike-activity.add
Normal file
1
changelog.d/dislike-activity.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Support Dislike activity, as sent by Mitra and Friendica, by changing it into a thumbs-down EmojiReact
|
||||
|
|
@ -1 +0,0 @@
|
|||
Restrict incoming activities from unknown actors to a subset that does not imply a previous relationship and early rejection of unrecognized activity types.
|
||||
1
changelog.d/elixir-1-18.fix
Normal file
1
changelog.d/elixir-1-18.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Elixir 1.18: Fixed warnings and new deprecations
|
||||
1
changelog.d/emoji-pack-upload-zip.add
Normal file
1
changelog.d/emoji-pack-upload-zip.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Added a way to upload new packs from a URL or ZIP file via Admin API
|
||||
1
changelog.d/emoji_likes.add
Normal file
1
changelog.d/emoji_likes.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Support Mitra-style emoji likes.
|
||||
1
changelog.d/endorsement-state.fix
Normal file
1
changelog.d/endorsement-state.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Fix endorsement state display in relationship view
|
||||
1
changelog.d/expiring-blocks.add
Normal file
1
changelog.d/expiring-blocks.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Add `duration` to the block endpoint, which makes block expire
|
||||
1
changelog.d/expose-markup-configuration.add
Normal file
1
changelog.d/expose-markup-configuration.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Expose markup configuration in InstanceView
|
||||
|
|
@ -1 +0,0 @@
|
|||
Fixed malformed follow requests that cause them to appear stuck pending due to the recipient being unable to process them.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Improve the FollowValidator to successfully incoming activities with an errant cc field.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Resolved edge case where the API can report you are following a user but the relationship is not fully established.
|
||||
1
changelog.d/freebsd-rc.fix
Normal file
1
changelog.d/freebsd-rc.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Set PATH in the FreeBSD rc script to avoid failures starting the service
|
||||
|
|
@ -1 +0,0 @@
|
|||
Support `id` param in `GET /api/v1/statuses`
|
||||
1
changelog.d/gin-search.fix
Normal file
1
changelog.d/gin-search.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Improved performance of status search queries using the default GIN index
|
||||
1
changelog.d/gun.change
Normal file
1
changelog.d/gun.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Update Cowboy, Gun, and Plug family of dependencies
|
||||
1
changelog.d/hashtag-search.change
Normal file
1
changelog.d/hashtag-search.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Hashtag searches return real results based on words in your query
|
||||
|
|
@ -1 +0,0 @@
|
|||
Remove stub for /api/v1/accounts/:id/identity_proofs (deprecated by Mastodon 3.5.0)
|
||||
1
changelog.d/language-detection.add
Normal file
1
changelog.d/language-detection.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Implement language detection with fastText
|
||||
|
|
@ -1 +0,0 @@
|
|||
LDAP configuration now permits overriding the CA root certificate file for TLS validation.
|
||||
|
|
@ -1 +0,0 @@
|
|||
LDAP authentication has been refactored to operate as a GenServer process which will maintain an active connection to the LDAP server.
|
||||
|
|
@ -1 +0,0 @@
|
|||
STARTTLS certificate and hostname verification for LDAP authentication
|
||||
|
|
@ -1 +0,0 @@
|
|||
LDAPS connections (implicit TLS) are now supported.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Include list id in StatusView
|
||||
|
|
@ -1 +0,0 @@
|
|||
The Swoosh email adapter for Mailgun was missing a new dependency on :multipart
|
||||
|
|
@ -1 +0,0 @@
|
|||
Added MRF.FODirectReply which changes replies to followers-only posts to be direct.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Add `group_key` to notifications
|
||||
|
|
@ -1 +0,0 @@
|
|||
Fix 'Setting a marker should mark notifications as read'
|
||||
|
|
@ -1 +0,0 @@
|
|||
Add a rate limiter to the OAuth App creation endpoint and ensure registered apps are assigned to users.
|
||||
1
changelog.d/oban-notifier.change
Normal file
1
changelog.d/oban-notifier.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Oban Notifier was changed to Oban.Notifiers.PG for performance and scalability benefits
|
||||
|
|
@ -1 +0,0 @@
|
|||
ReceiverWorker will cancel processing jobs instead of retrying if the user cannot be fetched due to 403, 404, or 410 errors or if the account is disabled locally.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Adjust more Oban workers to enforce unique job constraints.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Publisher behavior improvement when snoozing Oban jobs due to Gun connection pool contention.
|
||||
1
changelog.d/openbsd-update-httpd-relayd.change
Normal file
1
changelog.d/openbsd-update-httpd-relayd.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Updated relayd/httpd config files to be on par with nginx
|
||||
1
changelog.d/openbsd-update-rc.fix
Normal file
1
changelog.d/openbsd-update-rc.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
replaced depracated flags and functions, renamed service to fit other service files
|
||||
1
changelog.d/postgrex.change
Normal file
1
changelog.d/postgrex.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Updated Postgrex library to 0.20.0
|
||||
1
changelog.d/preserve-public-cc.fix
Normal file
1
changelog.d/preserve-public-cc.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
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
|
||||
|
|
@ -1 +0,0 @@
|
|||
Allow providing avatar/header descriptions
|
||||
|
|
@ -1 +0,0 @@
|
|||
Address case where instance reachability status couldn't be updated
|
||||
1
changelog.d/reachability.change
Normal file
1
changelog.d/reachability.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Improved the logic of how we determine if a server is unreachable.
|
||||
1
changelog.d/relax-also-known-as.change
Normal file
1
changelog.d/relax-also-known-as.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Relax alsoKnownAs requirements to just URI, not necessarily HTTP(S)
|
||||
1
changelog.d/releases.fix
Normal file
1
changelog.d/releases.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Fix release builds
|
||||
|
|
@ -1 +0,0 @@
|
|||
Remote Fetcher Worker recognizes more permanent failure errors
|
||||
|
|
@ -1 +0,0 @@
|
|||
Rich Media preview fetching will skip making an HTTP HEAD request to check a URL for allowed content type and length if the Tesla adapter is Gun or Finch
|
||||
1
changelog.d/scrobbles.change
Normal file
1
changelog.d/scrobbles.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Change scrobble external link param name to use snake case
|
||||
|
|
@ -1 +0,0 @@
|
|||
scrubbers/default: Allow "mention hashtag" classes used by Mastodon
|
||||
1
changelog.d/siteinfo-baseurls.add
Normal file
1
changelog.d/siteinfo-baseurls.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Add `base_urls` to the /api/v1/instance pleroma metadata which provides information about the base URLs for media_proxy and uploads when configured
|
||||
1
changelog.d/smtp-docs.change
Normal file
1
changelog.d/smtp-docs.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Change SMTP example to use the Mua adapter that works with OTP>25
|
||||
|
|
@ -1 +0,0 @@
|
|||
StreamerView: Do not leak follows count if hidden
|
||||
1
changelog.d/tesla.change
Normal file
1
changelog.d/tesla.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Updated Tesla to 1.15.3
|
||||
1
changelog.d/toctou-mkdir.fix
Normal file
1
changelog.d/toctou-mkdir.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Backport [Elixir PR 14242](https://github.com/elixir-lang/elixir/pull/14242) fixing racy mkdir and lack of error handling of parent directory creation
|
||||
1
changelog.d/tos-setting.add
Normal file
1
changelog.d/tos-setting.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Allow Terms of Service panel behaviour to be configurable
|
||||
1
changelog.d/translate-posts.add
Normal file
1
changelog.d/translate-posts.add
Normal file
|
|
@ -0,0 +1 @@
|
|||
Support translation providers (DeepL, LibreTranslate)
|
||||
1
changelog.d/truncate-rich-media.change
Normal file
1
changelog.d/truncate-rich-media.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Truncate the length of Rich Media title and description fields
|
||||
|
|
@ -1 +0,0 @@
|
|||
Update Oban to 2.18
|
||||
1
changelog.d/url-encoding.fix
Normal file
1
changelog.d/url-encoding.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Fix HTTP client making invalid requests due to no percent encoding processing or validation.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Imports of blocks, mutes, and follows would retry repeatedly due to incorrect error handling and all work executed in a single job
|
||||
1
changelog.d/webfinger-resolution.fix
Normal file
1
changelog.d/webfinger-resolution.fix
Normal file
|
|
@ -0,0 +1 @@
|
|||
Enforce an exact domain match for WebFinger resolution
|
||||
1
changelog.d/webfinger.change
Normal file
1
changelog.d/webfinger.change
Normal file
|
|
@ -0,0 +1 @@
|
|||
Don't require an Accept header for WebFinger queries and default to JSON.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Accept application/activity+json for requests to .well-known/nodeinfo
|
||||
|
|
@ -1 +0,0 @@
|
|||
Worker configuration is no longer available. This only affects custom max_retries values for a couple Oban queues.
|
||||
|
|
@ -1 +0,0 @@
|
|||
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.12 --push .
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
FROM elixir:1.12.3
|
||||
FROM elixir:1.14.5-otp-25
|
||||
|
||||
# Single RUN statement, otherwise intermediate images are created
|
||||
# https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
|
||||
|
|
@ -1 +1 @@
|
|||
docker buildx build --platform linux/amd64,linux/arm64 -t git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.13.4-otp-25 --push .
|
||||
docker buildx build --platform linux/amd64,linux/arm64 -t git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.14.5-otp-25 --push .
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
FROM elixir:1.13.4-otp-25
|
||||
FROM elixir:1.18.3-otp-27
|
||||
|
||||
# Single RUN statement, otherwise intermediate images are created
|
||||
# https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
|
||||
1
ci/elixir-1.18.3-otp-27/build_and_push.sh
Executable file
1
ci/elixir-1.18.3-otp-27/build_and_push.sh
Executable file
|
|
@ -0,0 +1 @@
|
|||
docker buildx build --platform linux/amd64,linux/arm64 -t git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.18.3-otp-27 --push .
|
||||
|
|
@ -48,7 +48,7 @@ config :pleroma, ecto_repos: [Pleroma.Repo]
|
|||
|
||||
config :pleroma, Pleroma.Repo,
|
||||
telemetry_event: [Pleroma.Repo.Instrumenter],
|
||||
migration_lock: nil
|
||||
migration_lock: :pg_advisory_lock
|
||||
|
||||
config :pleroma, Pleroma.Captcha,
|
||||
enabled: true,
|
||||
|
|
@ -65,7 +65,8 @@ config :pleroma, Pleroma.Upload,
|
|||
proxy_remote: false,
|
||||
filename_display_max_length: 30,
|
||||
default_description: nil,
|
||||
base_url: nil
|
||||
base_url: nil,
|
||||
allowed_mime_types: ["image", "audio", "video"]
|
||||
|
||||
config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads"
|
||||
|
||||
|
|
@ -150,7 +151,10 @@ config :mime, :types, %{
|
|||
"application/xrd+xml" => ["xrd+xml"],
|
||||
"application/jrd+json" => ["jrd+json"],
|
||||
"application/activity+json" => ["activity+json"],
|
||||
"application/ld+json" => ["activity+json"]
|
||||
"application/ld+json" => ["activity+json"],
|
||||
# Can be removed when bumping MIME past 2.0.5
|
||||
# see https://akkoma.dev/AkkomaGang/akkoma/issues/657
|
||||
"image/apng" => ["apng"]
|
||||
}
|
||||
|
||||
config :tesla, adapter: Tesla.Adapter.Hackney
|
||||
|
|
@ -190,7 +194,6 @@ config :pleroma, :instance,
|
|||
account_approval_required: false,
|
||||
federating: true,
|
||||
federation_incoming_replies_max_depth: 100,
|
||||
federation_reachability_timeout_days: 7,
|
||||
allow_relay: true,
|
||||
public: true,
|
||||
quarantined_instances: [],
|
||||
|
|
@ -303,6 +306,7 @@ config :pleroma, :frontend_configurations,
|
|||
collapseMessageWithSubject: false,
|
||||
disableChat: false,
|
||||
greentext: false,
|
||||
embeddedToS: true,
|
||||
hideFilteredStatuses: false,
|
||||
hideMutedPosts: false,
|
||||
hidePostStats: false,
|
||||
|
|
@ -359,7 +363,8 @@ config :pleroma, :activitypub,
|
|||
follow_handshake_timeout: 500,
|
||||
note_replies_output_limit: 5,
|
||||
sign_object_fetches: true,
|
||||
authorized_fetch_mode: false
|
||||
authorized_fetch_mode: false,
|
||||
client_api_enabled: false
|
||||
|
||||
config :pleroma, :streamer,
|
||||
workers: 3,
|
||||
|
|
@ -413,11 +418,6 @@ config :pleroma, :mrf_vocabulary,
|
|||
accept: [],
|
||||
reject: []
|
||||
|
||||
config :pleroma, :mrf_dnsrbl,
|
||||
nameserver: "127.0.0.1",
|
||||
port: 53,
|
||||
zone: "bl.pleroma.com"
|
||||
|
||||
# threshold of 7 days
|
||||
config :pleroma, :mrf_object_age,
|
||||
threshold: 604_800,
|
||||
|
|
@ -434,6 +434,11 @@ config :pleroma, :mrf_follow_bot, follower_nickname: nil
|
|||
|
||||
config :pleroma, :mrf_inline_quote, template: "<bdi>RT:</bdi> {url}"
|
||||
|
||||
config :pleroma, :mrf_remote_report,
|
||||
reject_all: false,
|
||||
reject_anonymous: true,
|
||||
reject_empty_message: true
|
||||
|
||||
config :pleroma, :mrf_force_mention,
|
||||
mention_parent: true,
|
||||
mention_quoted: true
|
||||
|
|
@ -584,6 +589,7 @@ config :pleroma, Pleroma.User,
|
|||
# value or it cannot enforce uniqueness.
|
||||
config :pleroma, Oban,
|
||||
repo: Pleroma.Repo,
|
||||
notifier: Oban.Notifiers.PG,
|
||||
log: false,
|
||||
queues: [
|
||||
activity_expiration: 10,
|
||||
|
|
@ -802,6 +808,13 @@ config :pleroma, :frontends,
|
|||
"https://lily-is.land/infra/glitch-lily/-/jobs/artifacts/${ref}/download?job=build",
|
||||
"ref" => "servant",
|
||||
"build_dir" => "public"
|
||||
},
|
||||
"pl-fe" => %{
|
||||
"name" => "pl-fe",
|
||||
"git" => "https://github.com/mkljczk/pl-fe",
|
||||
"build_url" => "https://pl.mkljczk.pl/pl-fe.zip",
|
||||
"ref" => "develop",
|
||||
"build_dir" => "."
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -117,6 +117,19 @@ config :pleroma, :config_description, [
|
|||
key: :filename_display_max_length,
|
||||
type: :integer,
|
||||
description: "Set max length of a filename to display. 0 = no limit. Default: 30"
|
||||
},
|
||||
%{
|
||||
key: :allowed_mime_types,
|
||||
label: "Allowed MIME types",
|
||||
type: {:list, :string},
|
||||
description:
|
||||
"List of MIME (main) types uploads are allowed to identify themselves with. Other types may still be uploaded, but will identify as a generic binary to clients. WARNING: Loosening this over the defaults can lead to security issues. Removing types is safe, but only add to the list if you are sure you know what you are doing.",
|
||||
suggestions: [
|
||||
"image",
|
||||
"audio",
|
||||
"video",
|
||||
"font"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -1248,6 +1261,7 @@ config :pleroma, :config_description, [
|
|||
background: "/static/aurora_borealis.jpg",
|
||||
collapseMessageWithSubject: false,
|
||||
greentext: false,
|
||||
embeddedToS: true,
|
||||
hideFilteredStatuses: false,
|
||||
hideMutedPosts: false,
|
||||
hidePostStats: false,
|
||||
|
|
@ -1299,6 +1313,12 @@ config :pleroma, :config_description, [
|
|||
type: :boolean,
|
||||
description: "Enables green text on lines prefixed with the > character"
|
||||
},
|
||||
%{
|
||||
key: :embeddedToS,
|
||||
label: "Embedded ToS panel",
|
||||
type: :boolean,
|
||||
description: "Hide Terms of Service panel decorations on About and Registration pages"
|
||||
},
|
||||
%{
|
||||
key: :hideFilteredStatuses,
|
||||
label: "Hide Filtered Statuses",
|
||||
|
|
@ -1772,6 +1792,11 @@ config :pleroma, :config_description, [
|
|||
type: :integer,
|
||||
description: "Following handshake timeout",
|
||||
suggestions: [500]
|
||||
},
|
||||
%{
|
||||
key: :client_api_enabled,
|
||||
type: :boolean,
|
||||
description: "Allow client to server ActivityPub interactions"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -3302,8 +3327,7 @@ config :pleroma, :config_description, [
|
|||
suggestions: [
|
||||
Pleroma.Web.Preload.Providers.Instance,
|
||||
Pleroma.Web.Preload.Providers.User,
|
||||
Pleroma.Web.Preload.Providers.Timelines,
|
||||
Pleroma.Web.Preload.Providers.StatusNet
|
||||
Pleroma.Web.Preload.Providers.Timelines
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -3483,5 +3507,71 @@ config :pleroma, :config_description, [
|
|||
suggestion: [100_000]
|
||||
}
|
||||
]
|
||||
},
|
||||
%{
|
||||
group: :pleroma,
|
||||
key: Pleroma.Language.LanguageDetector,
|
||||
type: :group,
|
||||
description: "Language detection providers",
|
||||
children: [
|
||||
%{
|
||||
key: :provider,
|
||||
type: :module,
|
||||
suggestions: [
|
||||
Pleroma.Language.LanguageDetector.Fasttext
|
||||
]
|
||||
},
|
||||
%{
|
||||
group: {:subgroup, Pleroma.Language.LanguageDetector.Fasttext},
|
||||
key: :model,
|
||||
label: "fastText language detection model",
|
||||
type: :string,
|
||||
suggestions: ["/usr/share/fasttext/lid.176.bin"]
|
||||
}
|
||||
]
|
||||
},
|
||||
%{
|
||||
group: :pleroma,
|
||||
key: Pleroma.Language.Translation,
|
||||
type: :group,
|
||||
description: "Translation providers",
|
||||
children: [
|
||||
%{
|
||||
key: :provider,
|
||||
type: :module,
|
||||
suggestions: [
|
||||
Pleroma.Language.Translation.Deepl,
|
||||
Pleroma.Language.Translation.Libretranslate
|
||||
]
|
||||
},
|
||||
%{
|
||||
group: {:subgroup, Pleroma.Language.Translation.Deepl},
|
||||
key: :base_url,
|
||||
label: "DeepL base URL",
|
||||
type: :string,
|
||||
suggestions: ["https://api-free.deepl.com", "https://api.deepl.com"]
|
||||
},
|
||||
%{
|
||||
group: {:subgroup, Pleroma.Language.Translation.Deepl},
|
||||
key: :api_key,
|
||||
label: "DeepL API Key",
|
||||
type: :string,
|
||||
suggestions: ["YOUR_API_KEY"]
|
||||
},
|
||||
%{
|
||||
group: {:subgroup, Pleroma.Language.Translation.Libretranslate},
|
||||
key: :base_url,
|
||||
label: "LibreTranslate instance URL",
|
||||
type: :string,
|
||||
suggestions: ["https://libretranslate.com"]
|
||||
},
|
||||
%{
|
||||
group: {:subgroup, Pleroma.Language.Translation.Libretranslate},
|
||||
key: :api_key,
|
||||
label: "LibreTranslate API Key",
|
||||
type: :string,
|
||||
suggestions: ["YOUR_API_KEY"]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -38,7 +38,10 @@ config :pleroma, :instance,
|
|||
external_user_synchronization: false,
|
||||
static_dir: "test/instance_static/"
|
||||
|
||||
config :pleroma, :activitypub, sign_object_fetches: false, follow_handshake_timeout: 0
|
||||
config :pleroma, :activitypub,
|
||||
sign_object_fetches: false,
|
||||
follow_handshake_timeout: 0,
|
||||
client_api_enabled: true
|
||||
|
||||
# Configure your database
|
||||
config :pleroma, Pleroma.Repo,
|
||||
|
|
@ -144,6 +147,7 @@ config :pleroma, Pleroma.Search.Meilisearch, url: "http://127.0.0.1:7700/", priv
|
|||
config :phoenix, :plug_init_mode, :runtime
|
||||
|
||||
config :pleroma, :config_impl, Pleroma.UnstubbedConfigMock
|
||||
config :pleroma, :datetime_impl, Pleroma.DateTimeMock
|
||||
|
||||
config :pleroma, Pleroma.PromEx, disabled: true
|
||||
|
||||
|
|
@ -152,12 +156,19 @@ config :pleroma, Pleroma.User.Backup, config_impl: Pleroma.UnstubbedConfigMock
|
|||
config :pleroma, Pleroma.Uploaders.S3, ex_aws_impl: Pleroma.Uploaders.S3.ExAwsMock
|
||||
config :pleroma, Pleroma.Uploaders.S3, config_impl: Pleroma.UnstubbedConfigMock
|
||||
config :pleroma, Pleroma.Upload, config_impl: Pleroma.UnstubbedConfigMock
|
||||
config :pleroma, Pleroma.Language.LanguageDetector, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
config :pleroma, Pleroma.ScheduledActivity, config_impl: Pleroma.UnstubbedConfigMock
|
||||
config :pleroma, Pleroma.Web.RichMedia.Helpers, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
config :pleroma, Pleroma.Uploaders.IPFS, config_impl: Pleroma.UnstubbedConfigMock
|
||||
config :pleroma, Pleroma.Web.Plugs.HTTPSecurityPlug, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
config :pleroma, Pleroma.Web.Plugs.HTTPSignaturePlug, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
|
||||
config :pleroma, Pleroma.Upload.Filter.AnonymizeFilename,
|
||||
config_impl: Pleroma.StaticStubbedConfigMock
|
||||
|
||||
config :pleroma, Pleroma.Upload.Filter.Mogrify, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
config :pleroma, Pleroma.Upload.Filter.Mogrify, mogrify_impl: Pleroma.MogrifyMock
|
||||
|
||||
config :pleroma, Pleroma.Signature, http_signatures_impl: Pleroma.StubbedHTTPSignaturesMock
|
||||
|
||||
peer_module =
|
||||
|
|
|
|||
|
|
@ -2,28 +2,60 @@
|
|||
|
||||
## Backup
|
||||
|
||||
1. Stop the Pleroma service.
|
||||
2. Go to the working directory of Pleroma (default is `/opt/pleroma`)
|
||||
3. Run `sudo -Hu postgres pg_dump -d <pleroma_db> --format=custom -f </path/to/backup_location/pleroma.pgdump>` (make sure the postgres user has write access to the destination file)
|
||||
1. Stop the Pleroma service:
|
||||
```
|
||||
# sudo systemctl stop pleroma
|
||||
```
|
||||
2. Go to the working directory of Pleroma (default is `/opt/pleroma`).
|
||||
3. Run (make sure the postgres user has write access to the destination file):
|
||||
```
|
||||
# sudo -Hu postgres pg_dump -d <pleroma_db> -v --format=custom --compress=9 -f </path/to/backup_location/pleroma.pgdump>
|
||||
```
|
||||
4. Copy `pleroma.pgdump`, `config/prod.secret.exs`, `config/setup_db.psql` (if still available) and the `uploads` folder to your backup destination. If you have other modifications, copy those changes too.
|
||||
5. Restart the Pleroma service.
|
||||
5. Restart the Pleroma service:
|
||||
```
|
||||
# sudo systemctl start pleroma
|
||||
```
|
||||
|
||||
## Restore/Move
|
||||
|
||||
1. Optionally reinstall Pleroma (either on the same server or on another server if you want to move servers).
|
||||
2. Stop the Pleroma service.
|
||||
3. Go to the working directory of Pleroma (default is `/opt/pleroma`)
|
||||
2. Stop the Pleroma service:
|
||||
```
|
||||
# sudo systemctl stop pleroma
|
||||
```
|
||||
3. Go to the working directory of Pleroma (default is `/opt/pleroma`).
|
||||
4. Copy the above mentioned files back to their original position.
|
||||
5. Drop the existing database and user if restoring in-place. `sudo -Hu postgres psql -c 'DROP DATABASE <pleroma_db>;';` `sudo -Hu postgres psql -c 'DROP USER <pleroma_db>;'`
|
||||
6. Restore the database schema and pleroma postgres role the with the original `setup_db.psql` if you have it: `sudo -Hu postgres psql -f config/setup_db.psql`.
|
||||
5. Drop the existing database and user if restoring in-place:
|
||||
```
|
||||
# sudo -Hu postgres dropdb <pleroma_db>
|
||||
# sudo -Hu postgres dropuser <pleroma_user>
|
||||
```
|
||||
6. Restore the database schema and pleroma database user the with the original `setup_db.psql` if you have it:
|
||||
```
|
||||
# sudo -Hu postgres psql -f config/setup_db.psql
|
||||
```
|
||||
|
||||
Alternatively, run the `mix pleroma.instance gen` task again. You can ignore most of the questions, but make the database user, name, and password the same as found in your backup of `config/prod.secret.exs`. Then run the restoration of the pleroma role and schema with of the generated `config/setup_db.psql` as instructed above. You may delete the `config/generated_config.exs` file as it is not needed.
|
||||
Alternatively, run the `mix pleroma.instance gen` task again. You can ignore most of the questions, but make the database user, name, and password the same as found in your backup of `config/prod.secret.exs`. Then run the restoration of the pleroma user and schema with the generated `config/setup_db.psql` as instructed above. You may delete the `config/generated_config.exs` file as it is not needed.
|
||||
|
||||
7. Now restore the Pleroma instance's data into the empty database schema: `sudo -Hu postgres pg_restore -d <pleroma_db> -v -1 </path/to/backup_location/pleroma.pgdump>`
|
||||
8. If you installed a newer Pleroma version, you should run `mix ecto.migrate`[^1]. This task performs database migrations, if there were any.
|
||||
9. Restart the Pleroma service.
|
||||
10. Run `sudo -Hu postgres vacuumdb --all --analyze-in-stages`. This will quickly generate the statistics so that postgres can properly plan queries.
|
||||
11. If setting up on a new server configure Nginx by using the `installation/pleroma.nginx` config sample or reference the Pleroma installation guide for your OS which contains the Nginx configuration instructions.
|
||||
7. Now restore the Pleroma instance's schema into the empty database schema:
|
||||
```
|
||||
# sudo -Hu postgres pg_restore -d <pleroma_db> -v -s -1 </path/to/backup_location/pleroma.pgdump>
|
||||
```
|
||||
8. Now restore the Pleroma instance's data into the database:
|
||||
```
|
||||
# sudo -Hu postgres pg_restore -d <pleroma_db> -v -a -1 --disable-triggers </path/to/backup_location/pleroma.pgdump>
|
||||
```
|
||||
9. If you installed a newer Pleroma version, you should run `mix ecto.migrate`[^1]. This task performs database migrations, if there were any.
|
||||
10. Generate the statistics so that PostgreSQL can properly plan queries:
|
||||
```
|
||||
# sudo -Hu postgres vacuumdb -v --all --analyze-in-stages
|
||||
```
|
||||
11. Restart the Pleroma service:
|
||||
```
|
||||
# sudo systemctl start pleroma
|
||||
```
|
||||
12. If setting up on a new server, configure Nginx by using your original configuration or by using the `installation/pleroma.nginx` config sample or reference the Pleroma installation guide for your OS which contains the Nginx configuration instructions.
|
||||
|
||||
[^1]: Prefix with `MIX_ENV=prod` to run it using the production config file.
|
||||
|
||||
|
|
@ -32,10 +64,26 @@
|
|||
1. Optionally you can remove the users of your instance. This will trigger delete requests for their accounts and posts. Note that this is 'best effort' and doesn't mean that all traces of your instance will be gone from the fediverse.
|
||||
* You can do this from the admin-FE where you can select all local users and delete the accounts using the *Moderate multiple users* dropdown.
|
||||
* You can also list local users and delete them individually using the CLI tasks for [Managing users](./CLI_tasks/user.md).
|
||||
2. Stop the Pleroma service `systemctl stop pleroma`
|
||||
3. Disable pleroma from systemd `systemctl disable pleroma`
|
||||
2. Stop the Pleroma service:
|
||||
```
|
||||
# systemctl stop pleroma
|
||||
```
|
||||
3. Disable pleroma from systemd:
|
||||
```
|
||||
# systemctl disable pleroma
|
||||
```
|
||||
4. Remove the files and folders you created during installation (see installation guide). This includes the pleroma, nginx and systemd files and folders.
|
||||
5. Reload nginx now that the configuration is removed `systemctl reload nginx`
|
||||
6. Remove the database and database user `sudo -Hu postgres psql -c 'DROP DATABASE <pleroma_db>;';` `sudo -Hu postgres psql -c 'DROP USER <pleroma_db>;'`
|
||||
7. Remove the system user `userdel pleroma`
|
||||
8. Remove the dependencies that you don't need anymore (see installation guide). Make sure you don't remove packages that are still needed for other software that you have running!
|
||||
5. Reload nginx now that the configuration is removed:
|
||||
```
|
||||
# systemctl reload nginx
|
||||
```
|
||||
6. Remove the database and database user:
|
||||
```
|
||||
# sudo -Hu postgres dropdb <pleroma_db>
|
||||
# sudo -Hu postgres dropuser <pleroma_user>
|
||||
```
|
||||
7. Remove the system user:
|
||||
```
|
||||
# userdel -r pleroma
|
||||
```
|
||||
8. Remove the dependencies that you don't need anymore (see installation guide). **Make sure you don't remove packages that are still needed for other software that you have running!**
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ Feel free to contact us to be added to this list!
|
|||
### AndStatus
|
||||
- Homepage: <http://andstatus.org/>
|
||||
- Source Code: <https://github.com/andstatus/andstatus/>
|
||||
- Contact: [@AndStatus@mastodon.social](https://mastodon.social/@AndStatus)
|
||||
- Platforms: Android
|
||||
- Features: MastoAPI, ActivityPub (Client-to-Server)
|
||||
|
||||
|
|
@ -40,8 +41,8 @@ Feel free to contact us to be added to this list!
|
|||
|
||||
### Fedilab
|
||||
- Homepage: <https://fedilab.app/>
|
||||
- Source Code: <https://framagit.org/tom79/fedilab/>
|
||||
- Contact: [@fedilab@framapiaf.org](https://framapiaf.org/users/fedilab)
|
||||
- Source Code: <https://codeberg.org/tom79/Fedilab>
|
||||
- Contact: [@apps@toot.fedilab.app](https://toot.fedilab.app/@apps)
|
||||
- Platforms: Android
|
||||
- Features: MastoAPI, Streaming Ready, Moderation, Text Formatting
|
||||
|
||||
|
|
@ -51,8 +52,8 @@ Feel free to contact us to be added to this list!
|
|||
- Features: MastoAPI, No Streaming
|
||||
|
||||
### Husky
|
||||
- Source code: <https://git.mentality.rip/FWGS/Husky>
|
||||
- Contact: [@Husky@enigmatic.observer](https://enigmatic.observer/users/Husky)
|
||||
- Source code: <https://github.com/captainepoch/husky>
|
||||
- Contact: [@husky@stereophonic.space](https://stereophonic.space/users/husky)
|
||||
- Platforms: Android
|
||||
- Features: MastoAPI, No Streaming, Emoji Reactions, Text Formatting, FE Stickers
|
||||
|
||||
|
|
@ -65,7 +66,7 @@ Feel free to contact us to be added to this list!
|
|||
### Tusky
|
||||
- Homepage: <https://tuskyapp.github.io/>
|
||||
- Source Code: <https://github.com/tuskyapp/Tusky>
|
||||
- Contact: [@ConnyDuck@mastodon.social](https://mastodon.social/users/ConnyDuck)
|
||||
- Contact: [@Tusky@mastodon.social](https://mastodon.social/@Tusky)
|
||||
- Platforms: Android
|
||||
- Features: MastoAPI, No Streaming
|
||||
|
||||
|
|
@ -76,10 +77,10 @@ Feel free to contact us to be added to this list!
|
|||
- Platform: Android
|
||||
- Features: MastoAPI, No Streaming
|
||||
|
||||
### Indigenous
|
||||
- Homepage: <https://indigenous.realize.be/>
|
||||
- Source Code: <https://github.com/swentel/indigenous-android/>
|
||||
- Contact: [@swentel@realize.be](https://realize.be)
|
||||
### IndiePass
|
||||
- Homepage: <https://indiepass.app/>
|
||||
- Source Code: <https://github.com/IndiePass/indiepass-android>
|
||||
- Contact: [@marksuth@mastodon.social](https://mastodon.social/@marksuth)
|
||||
- Platforms: Android
|
||||
- Features: MastoAPI, No Streaming
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ To add configuration to your config file, you can copy it from the base config.
|
|||
* `moderator_privileges`: A list of privileges a moderator has (e.g. delete messages, manage reports...)
|
||||
* Possible values are the same as for `admin_privileges`
|
||||
|
||||
## :database
|
||||
## :features
|
||||
* `improved_hashtag_timeline`: Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes).
|
||||
|
||||
## Background migrations
|
||||
|
|
@ -733,13 +733,26 @@ An example for SMTP adapter:
|
|||
```elixir
|
||||
config :pleroma, Pleroma.Emails.Mailer,
|
||||
enabled: true,
|
||||
adapter: Swoosh.Adapters.SMTP,
|
||||
adapter: Swoosh.Adapters.Mua,
|
||||
relay: "smtp.gmail.com",
|
||||
username: "YOUR_USERNAME@gmail.com",
|
||||
password: "YOUR_SMTP_PASSWORD",
|
||||
auth: [username: "YOUR_USERNAME@gmail.com", password: "YOUR_SMTP_PASSWORD"],
|
||||
port: 465,
|
||||
ssl: true,
|
||||
auth: :always
|
||||
protocol: :ssl
|
||||
```
|
||||
|
||||
An example for Mua adapter:
|
||||
|
||||
```elixir
|
||||
config :pleroma, Pleroma.Emails.Mailer,
|
||||
enabled: true,
|
||||
adapter: Swoosh.Adapters.Mua,
|
||||
relay: "mail.example.com",
|
||||
port: 465,
|
||||
auth: [
|
||||
username: "YOUR_USERNAME@domain.tld",
|
||||
password: "YOUR_SMTP_PASSWORD"
|
||||
],
|
||||
protocol: :ssl
|
||||
```
|
||||
|
||||
### :email_notifications
|
||||
|
|
|
|||
|
|
@ -70,6 +70,8 @@ The `/api/v1/pleroma/admin/*` path is backwards compatible with `/api/pleroma/ad
|
|||
- `nicknames`
|
||||
- Response: Array of user nicknames
|
||||
|
||||
## `POST /api/v1/pleroma/admin/users`
|
||||
|
||||
### Create a user
|
||||
|
||||
- Method: `POST`
|
||||
|
|
@ -81,7 +83,7 @@ The `/api/v1/pleroma/admin/*` path is backwards compatible with `/api/pleroma/ad
|
|||
`password`
|
||||
}
|
||||
]
|
||||
- Response: User’s nickname
|
||||
- Response: Array of user objects
|
||||
|
||||
## `POST /api/v1/pleroma/admin/users/follow`
|
||||
|
||||
|
|
|
|||
|
|
@ -671,6 +671,7 @@ Audio scrobbling in Pleroma is **deprecated**.
|
|||
"artist": "Some Artist",
|
||||
"album": "Some Album",
|
||||
"length": 180000,
|
||||
"external_link": "https://www.last.fm/music/Some+Artist/_/Some+Title",
|
||||
"created_at": "2019-09-28T12:40:45.000Z"
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1 +1,7 @@
|
|||
This section contains notes and guidelines for developers.
|
||||
|
||||
- [Setting up a Pleroma development environment](setting_up_pleroma_dev.md)
|
||||
- [Setting up a Gitlab Runner](setting_up_a_gitlab_runner.md)
|
||||
- [Authentication & Authorization](authentication_authorization.md)
|
||||
- [ActivityPub Extensions](ap_extensions.md)
|
||||
- [Mox Testing Guide](mox_testing.md)
|
||||
|
|
|
|||
485
docs/development/mox_testing.md
Normal file
485
docs/development/mox_testing.md
Normal file
|
|
@ -0,0 +1,485 @@
|
|||
# Using Mox for Testing in Pleroma
|
||||
|
||||
## Introduction
|
||||
|
||||
This guide explains how to use [Mox](https://hexdocs.pm/mox/Mox.html) for testing in Pleroma and how to migrate existing tests from Mock/meck to Mox. Mox is a library for defining concurrent mocks in Elixir that offers several key advantages:
|
||||
|
||||
- **Async-safe testing**: Mox supports concurrent testing with `async: true`
|
||||
- **Explicit contract through behaviors**: Enforces implementation of behavior callbacks
|
||||
- **No module redefinition**: Avoids runtime issues caused by redefining modules
|
||||
- **Expectations scoped to the current process**: Prevents test state from leaking between tests
|
||||
|
||||
## Why Migrate from Mock/meck to Mox?
|
||||
|
||||
### Problems with Mock/meck
|
||||
|
||||
1. **Not async-safe**: Tests using Mock/meck cannot safely run with `async: true`, which slows down the test suite
|
||||
2. **Global state**: Mocked functions are global, leading to potential cross-test contamination
|
||||
3. **No explicit contract**: No guarantee that mocked functions match the actual implementation
|
||||
4. **Module redefinition**: Can lead to hard-to-debug runtime issues
|
||||
|
||||
### Benefits of Mox
|
||||
|
||||
1. **Async-safe testing**: Tests can run concurrently with `async: true`, significantly speeding up the test suite
|
||||
2. **Process isolation**: Expectations are set per process, preventing leakage between tests
|
||||
3. **Explicit contracts via behaviors**: Ensures mocks implement all required functions
|
||||
4. **Compile-time checks**: Prevents mocking non-existent functions
|
||||
5. **No module redefinition**: Mocks are defined at compile time, not runtime
|
||||
|
||||
## Existing Mox Setup in Pleroma
|
||||
|
||||
Pleroma already has a basic Mox setup in the `Pleroma.DataCase` module, which handles some common mocking scenarios automatically. Here's what's included:
|
||||
|
||||
### Default Mox Configuration
|
||||
|
||||
The `setup` function in `DataCase` does the following:
|
||||
|
||||
1. Sets up Mox for either async or non-async tests
|
||||
2. Verifies all mock expectations on test exit
|
||||
3. Stubs common dependencies with their real implementations
|
||||
|
||||
```elixir
|
||||
# From test/support/data_case.ex
|
||||
setup tags do
|
||||
setup_multi_process_mode(tags)
|
||||
setup_streamer(tags)
|
||||
stub_pipeline()
|
||||
|
||||
Mox.verify_on_exit!()
|
||||
|
||||
:ok
|
||||
end
|
||||
```
|
||||
|
||||
### Async vs. Non-Async Test Setup
|
||||
|
||||
Pleroma configures Mox differently depending on whether your test is async or not:
|
||||
|
||||
```elixir
|
||||
def setup_multi_process_mode(tags) do
|
||||
:ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo)
|
||||
|
||||
if tags[:async] do
|
||||
# For async tests, use process-specific mocks and stub CachexMock with NullCache
|
||||
Mox.stub_with(Pleroma.CachexMock, Pleroma.NullCache)
|
||||
Mox.set_mox_private()
|
||||
else
|
||||
# For non-async tests, use global mocks and stub CachexMock with CachexProxy
|
||||
Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()})
|
||||
|
||||
Mox.set_mox_global()
|
||||
Mox.stub_with(Pleroma.CachexMock, Pleroma.CachexProxy)
|
||||
clear_cachex()
|
||||
end
|
||||
|
||||
:ok
|
||||
end
|
||||
```
|
||||
|
||||
### Default Pipeline Stubs
|
||||
|
||||
Pleroma automatically stubs several core components with their real implementations:
|
||||
|
||||
```elixir
|
||||
def stub_pipeline do
|
||||
Mox.stub_with(Pleroma.Web.ActivityPub.SideEffectsMock, Pleroma.Web.ActivityPub.SideEffects)
|
||||
Mox.stub_with(Pleroma.Web.ActivityPub.ObjectValidatorMock, Pleroma.Web.ActivityPub.ObjectValidator)
|
||||
Mox.stub_with(Pleroma.Web.ActivityPub.MRFMock, Pleroma.Web.ActivityPub.MRF)
|
||||
Mox.stub_with(Pleroma.Web.ActivityPub.ActivityPubMock, Pleroma.Web.ActivityPub.ActivityPub)
|
||||
Mox.stub_with(Pleroma.Web.FederatorMock, Pleroma.Web.Federator)
|
||||
Mox.stub_with(Pleroma.ConfigMock, Pleroma.Config)
|
||||
Mox.stub_with(Pleroma.StaticStubbedConfigMock, Pleroma.Test.StaticConfig)
|
||||
Mox.stub_with(Pleroma.StubbedHTTPSignaturesMock, Pleroma.Test.HTTPSignaturesProxy)
|
||||
end
|
||||
```
|
||||
|
||||
This means that by default, these mocks will behave like their real implementations unless you explicitly override them with expectations in your tests.
|
||||
|
||||
### Understanding Config Mock Types
|
||||
|
||||
Pleroma has three different Config mock implementations, each with a specific purpose and different characteristics regarding async test safety:
|
||||
|
||||
#### 1. ConfigMock
|
||||
|
||||
- Defined in `test/support/mocks.ex` as `Mox.defmock(Pleroma.ConfigMock, for: Pleroma.Config.Getting)`
|
||||
- It's stubbed with the real `Pleroma.Config` by default in `DataCase`: `Mox.stub_with(Pleroma.ConfigMock, Pleroma.Config)`
|
||||
- This means it falls back to the normal configuration behavior unless explicitly overridden
|
||||
- Used for general mocking of configuration in tests where you want most config to behave normally
|
||||
- ⚠️ **NOT ASYNC-SAFE**: Since it's stubbed with the real `Pleroma.Config`, it modifies global application state
|
||||
- Can not be used in tests with `async: true`
|
||||
|
||||
#### 2. StaticStubbedConfigMock
|
||||
|
||||
- Defined in `test/support/mocks.ex` as `Mox.defmock(Pleroma.StaticStubbedConfigMock, for: Pleroma.Config.Getting)`
|
||||
- It's stubbed with `Pleroma.Test.StaticConfig` (defined in `test/test_helper.exs`)
|
||||
- `Pleroma.Test.StaticConfig` creates a completely static configuration snapshot at the start of the test run:
|
||||
```elixir
|
||||
defmodule Pleroma.Test.StaticConfig do
|
||||
@moduledoc """
|
||||
This module provides a Config that is completely static, built at startup time from the environment.
|
||||
It's safe to use in testing as it will not modify any state.
|
||||
"""
|
||||
|
||||
@behaviour Pleroma.Config.Getting
|
||||
@config Application.get_all_env(:pleroma)
|
||||
|
||||
def get(path, default \\ nil) do
|
||||
get_in(@config, path) || default
|
||||
end
|
||||
end
|
||||
```
|
||||
- Configuration is frozen at startup time and doesn't change during the test run
|
||||
- ✅ **ASYNC-SAFE**: Never modifies global state since it uses a frozen snapshot of the configuration
|
||||
|
||||
#### 3. UnstubbedConfigMock
|
||||
|
||||
- Defined in `test/support/mocks.ex` as `Mox.defmock(Pleroma.UnstubbedConfigMock, for: Pleroma.Config.Getting)`
|
||||
- Unlike the other two mocks, it's not automatically stubbed with any implementation in `DataCase`
|
||||
- Starts completely "unstubbed" and requires tests to explicitly set expectations or stub it
|
||||
- The most commonly used configuration mock in the test suite
|
||||
- Often aliased as `ConfigMock` in individual test files: `alias Pleroma.UnstubbedConfigMock, as: ConfigMock`
|
||||
- Set as the default config implementation in `config/test.exs`: `config :pleroma, :config_impl, Pleroma.UnstubbedConfigMock`
|
||||
- Offers maximum flexibility for tests that need precise control over configuration values
|
||||
- ✅ **ASYNC-SAFE**: Safe if used with `expect()` to set up test-specific expectations (since expectations are process-scoped)
|
||||
|
||||
#### Configuring Components to Use Specific Mocks
|
||||
|
||||
In `config/test.exs`, different components can be configured to use different configuration mocks:
|
||||
|
||||
```elixir
|
||||
# Components using UnstubbedConfigMock
|
||||
config :pleroma, Pleroma.Upload, config_impl: Pleroma.UnstubbedConfigMock
|
||||
config :pleroma, Pleroma.User.Backup, config_impl: Pleroma.UnstubbedConfigMock
|
||||
config :pleroma, Pleroma.Uploaders.S3, config_impl: Pleroma.UnstubbedConfigMock
|
||||
|
||||
# Components using StaticStubbedConfigMock (async-safe)
|
||||
config :pleroma, Pleroma.Language.LanguageDetector, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
config :pleroma, Pleroma.Web.RichMedia.Helpers, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
config :pleroma, Pleroma.Web.Plugs.HTTPSecurityPlug, config_impl: Pleroma.StaticStubbedConfigMock
|
||||
```
|
||||
|
||||
This allows different parts of the application to use the most appropriate configuration mocking strategy based on their specific needs.
|
||||
|
||||
#### When to Use Each Config Mock Type
|
||||
|
||||
- **ConfigMock**: ⚠️ For non-async tests only, when you want most configuration to behave normally with occasional overrides
|
||||
- **StaticStubbedConfigMock**: ✅ For async tests where modifying global state would be problematic and a static configuration is sufficient
|
||||
- **UnstubbedConfigMock**: ⚠️ Use carefully in async tests; set specific expectations rather than stubbing with implementations that modify global state
|
||||
|
||||
#### Summary of Async Safety
|
||||
|
||||
| Mock Type | Async-Safe? | Best Use Case |
|
||||
|-----------|-------------|--------------|
|
||||
| ConfigMock | ❌ No | Non-async tests that need minimal configuration overrides |
|
||||
| StaticStubbedConfigMock | ✅ Yes | Async tests that need configuration values without modification |
|
||||
| UnstubbedConfigMock | ⚠️ Depends | Any test with careful usage; set expectations rather than stubbing |
|
||||
|
||||
## Configuration in Async Tests
|
||||
|
||||
### Understanding `clear_config` Limitations
|
||||
|
||||
The `clear_config` helper is commonly used in Pleroma tests to modify configuration for specific tests. However, it's important to understand that **`clear_config` is not async-safe** and should not be used in tests with `async: true`.
|
||||
|
||||
Here's why:
|
||||
|
||||
```elixir
|
||||
# Implementation of clear_config in test/support/helpers.ex
|
||||
defmacro clear_config(config_path, temp_setting) do
|
||||
quote do
|
||||
clear_config(unquote(config_path)) do
|
||||
Config.put(unquote(config_path), unquote(temp_setting))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
defmacro clear_config(config_path, do: yield) do
|
||||
quote do
|
||||
initial_setting = Config.fetch(unquote(config_path))
|
||||
|
||||
unquote(yield)
|
||||
|
||||
on_exit(fn ->
|
||||
case initial_setting do
|
||||
:error ->
|
||||
Config.delete(unquote(config_path))
|
||||
|
||||
{:ok, value} ->
|
||||
Config.put(unquote(config_path), value)
|
||||
end
|
||||
end)
|
||||
|
||||
:ok
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
The issue is that `clear_config`:
|
||||
1. Modifies the global application environment
|
||||
2. Uses `on_exit` to restore the original value after the test
|
||||
3. Can lead to race conditions when multiple async tests modify the same configuration
|
||||
|
||||
### Async-Safe Configuration Approaches
|
||||
|
||||
When writing async tests with Mox, use these approaches instead of `clear_config`:
|
||||
|
||||
1. **Dependency Injection with Module Attributes**:
|
||||
```elixir
|
||||
# In your module
|
||||
@config_impl Application.compile_env(:pleroma, [__MODULE__, :config_impl], Pleroma.Config)
|
||||
|
||||
def some_function do
|
||||
value = @config_impl.get([:some, :config])
|
||||
# ...
|
||||
end
|
||||
```
|
||||
|
||||
2. **Mock the Config Module**:
|
||||
```elixir
|
||||
# In your test
|
||||
Pleroma.ConfigMock
|
||||
|> expect(:get, fn [:some, :config] -> "test_value" end)
|
||||
```
|
||||
|
||||
3. **Use Test-Specific Implementations**:
|
||||
```elixir
|
||||
# Define a test-specific implementation
|
||||
defmodule TestConfig do
|
||||
def get([:some, :config]), do: "test_value"
|
||||
def get(_), do: nil
|
||||
end
|
||||
|
||||
# In your test
|
||||
Mox.stub_with(Pleroma.ConfigMock, TestConfig)
|
||||
```
|
||||
|
||||
4. **Pass Configuration as Arguments**:
|
||||
```elixir
|
||||
# Refactor functions to accept configuration as arguments
|
||||
def some_function(config \\ nil) do
|
||||
config = config || Pleroma.Config.get([:some, :config])
|
||||
# ...
|
||||
end
|
||||
|
||||
# In your test
|
||||
some_function("test_value")
|
||||
```
|
||||
|
||||
By using these approaches, you can safely run tests with `async: true` without worrying about configuration conflicts.
|
||||
|
||||
## Setting Up Mox in Pleroma
|
||||
|
||||
### Step 1: Define a Behavior
|
||||
|
||||
Start by defining a behavior for the module you want to mock. This specifies the contract that both the real implementation and mocks must follow.
|
||||
|
||||
```elixir
|
||||
# In your implementation module (e.g., lib/pleroma/uploaders/s3.ex)
|
||||
defmodule Pleroma.Uploaders.S3.ExAwsAPI do
|
||||
@callback request(op :: ExAws.Operation.t()) :: {:ok, ExAws.Operation.t()} | {:error, term()}
|
||||
end
|
||||
```
|
||||
|
||||
### Step 2: Make Your Implementation Configurable
|
||||
|
||||
Modify your module to use a configurable implementation. This allows for dependency injection and easier testing.
|
||||
|
||||
```elixir
|
||||
# In your implementation module
|
||||
@ex_aws_impl Application.compile_env(:pleroma, [__MODULE__, :ex_aws_impl], ExAws)
|
||||
@config_impl Application.compile_env(:pleroma, [__MODULE__, :config_impl], Pleroma.Config)
|
||||
|
||||
def put_file(%Pleroma.Upload{} = upload) do
|
||||
# Use @ex_aws_impl instead of ExAws directly
|
||||
case @ex_aws_impl.request(op) do
|
||||
{:ok, _} ->
|
||||
{:ok, {:file, s3_name}}
|
||||
|
||||
error ->
|
||||
Logger.error("#{__MODULE__}: #{inspect(error)}")
|
||||
error
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
### Step 3: Define the Mock in test/support/mocks.ex
|
||||
|
||||
Add your mock definition in the central mocks file:
|
||||
|
||||
```elixir
|
||||
# In test/support/mocks.ex
|
||||
Mox.defmock(Pleroma.Uploaders.S3.ExAwsMock, for: Pleroma.Uploaders.S3.ExAwsAPI)
|
||||
```
|
||||
|
||||
### Step 4: Configure the Mock in Test Environment
|
||||
|
||||
In your test configuration (e.g., `config/test.exs`), specify which mock implementation to use:
|
||||
|
||||
```elixir
|
||||
config :pleroma, Pleroma.Uploaders.S3, ex_aws_impl: Pleroma.Uploaders.S3.ExAwsMock
|
||||
config :pleroma, Pleroma.Uploaders.S3, config_impl: Pleroma.UnstubbedConfigMock
|
||||
```
|
||||
|
||||
## Writing Tests with Mox
|
||||
|
||||
### Setting Up Your Test
|
||||
|
||||
```elixir
|
||||
defmodule Pleroma.Uploaders.S3Test do
|
||||
use Pleroma.DataCase, async: true # Note: async: true is now possible!
|
||||
|
||||
alias Pleroma.Uploaders.S3
|
||||
alias Pleroma.Uploaders.S3.ExAwsMock
|
||||
alias Pleroma.UnstubbedConfigMock, as: ConfigMock
|
||||
|
||||
import Mox # Import Mox functions
|
||||
|
||||
# Note: verify_on_exit! is already called in DataCase setup
|
||||
# so you don't need to add it explicitly in your test module
|
||||
end
|
||||
```
|
||||
|
||||
### Setting Expectations with Mox
|
||||
|
||||
Mox uses an explicit expectation system. Here's how to use it:
|
||||
|
||||
```elixir
|
||||
# Basic expectation for a function call
|
||||
ExAwsMock
|
||||
|> expect(:request, fn _req -> {:ok, %{status_code: 200}} end)
|
||||
|
||||
# Expectation for multiple calls with same response
|
||||
ExAwsMock
|
||||
|> expect(:request, 3, fn _req -> {:ok, %{status_code: 200}} end)
|
||||
|
||||
# Expectation with specific arguments
|
||||
ExAwsMock
|
||||
|> expect(:request, fn %{bucket: "test_bucket"} -> {:ok, %{status_code: 200}} end)
|
||||
|
||||
# Complex configuration mocking
|
||||
ConfigMock
|
||||
|> expect(:get, fn key ->
|
||||
[
|
||||
{Pleroma.Upload, [uploader: Pleroma.Uploaders.S3, base_url: "https://s3.amazonaws.com"]},
|
||||
{Pleroma.Uploaders.S3, [bucket: "test_bucket"]}
|
||||
]
|
||||
|> get_in(key)
|
||||
end)
|
||||
```
|
||||
|
||||
### Understanding Mox Modes in Pleroma
|
||||
|
||||
Pleroma's DataCase automatically configures Mox differently based on whether your test is async or not:
|
||||
|
||||
1. **Async tests** (`async: true`):
|
||||
- Uses `Mox.set_mox_private()` - expectations are scoped to the current process
|
||||
- Stubs `Pleroma.CachexMock` with `Pleroma.NullCache`
|
||||
- Each test process has its own isolated mock expectations
|
||||
|
||||
2. **Non-async tests** (`async: false`):
|
||||
- Uses `Mox.set_mox_global()` - expectations are shared across processes
|
||||
- Stubs `Pleroma.CachexMock` with `Pleroma.CachexProxy`
|
||||
- Mock expectations can be set in one process and called from another
|
||||
|
||||
Choose the appropriate mode based on your test requirements. For most tests, async mode is preferred for better performance.
|
||||
|
||||
## Migrating from Mock/meck to Mox
|
||||
|
||||
Here's a step-by-step guide for migrating existing tests from Mock/meck to Mox:
|
||||
|
||||
### 1. Identify the Module to Mock
|
||||
|
||||
Look for `with_mock` or `test_with_mock` calls in your tests:
|
||||
|
||||
```elixir
|
||||
# Old approach with Mock
|
||||
with_mock ExAws, request: fn _ -> {:ok, :ok} end do
|
||||
assert S3.put_file(file_upload) == {:ok, {:file, "test_folder/image-tet.jpg"}}
|
||||
end
|
||||
```
|
||||
|
||||
### 2. Define a Behavior for the Module
|
||||
|
||||
Create a behavior that defines the functions you want to mock:
|
||||
|
||||
```elixir
|
||||
defmodule Pleroma.Uploaders.S3.ExAwsAPI do
|
||||
@callback request(op :: ExAws.Operation.t()) :: {:ok, ExAws.Operation.t()} | {:error, term()}
|
||||
end
|
||||
```
|
||||
|
||||
### 3. Update Your Implementation to Use a Configurable Dependency
|
||||
|
||||
```elixir
|
||||
# Old
|
||||
def put_file(%Pleroma.Upload{} = upload) do
|
||||
case ExAws.request(op) do
|
||||
# ...
|
||||
end
|
||||
end
|
||||
|
||||
# New
|
||||
@ex_aws_impl Application.compile_env(:pleroma, [__MODULE__, :ex_aws_impl], ExAws)
|
||||
|
||||
def put_file(%Pleroma.Upload{} = upload) do
|
||||
case @ex_aws_impl.request(op) do
|
||||
# ...
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
### 4. Define the Mock in mocks.ex
|
||||
|
||||
```elixir
|
||||
Mox.defmock(Pleroma.Uploaders.S3.ExAwsMock, for: Pleroma.Uploaders.S3.ExAwsAPI)
|
||||
```
|
||||
|
||||
### 5. Configure the Test Environment
|
||||
|
||||
```elixir
|
||||
config :pleroma, Pleroma.Uploaders.S3, ex_aws_impl: Pleroma.Uploaders.S3.ExAwsMock
|
||||
```
|
||||
|
||||
### 6. Update Your Tests to Use Mox
|
||||
|
||||
```elixir
|
||||
# Old (with Mock)
|
||||
test_with_mock "save file", ExAws, request: fn _ -> {:ok, :ok} end do
|
||||
assert S3.put_file(file_upload) == {:ok, {:file, "test_folder/image-tet.jpg"}}
|
||||
assert_called(ExAws.request(:_))
|
||||
end
|
||||
|
||||
# New (with Mox)
|
||||
test "save file" do
|
||||
ExAwsMock
|
||||
|> expect(:request, fn _req -> {:ok, %{status_code: 200}} end)
|
||||
|
||||
assert S3.put_file(file_upload) == {:ok, {:file, "test_folder/image-tet.jpg"}}
|
||||
end
|
||||
```
|
||||
|
||||
### 7. Enable Async Testing
|
||||
|
||||
Now you can safely enable `async: true` in your test module:
|
||||
|
||||
```elixir
|
||||
use Pleroma.DataCase, async: true
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always define behaviors**: They serve as contracts and documentation
|
||||
2. **Keep mocks in a central location**: Use test/support/mocks.ex for all mock definitions
|
||||
3. **Use verify_on_exit!**: This is already set up in DataCase, ensuring all expected calls were made
|
||||
4. **Use specific expectations**: Be as specific as possible with your expectations
|
||||
5. **Enable async: true**: Take advantage of Mox's concurrent testing capability
|
||||
6. **Don't over-mock**: Only mock external dependencies that are difficult to test directly
|
||||
7. **Leverage existing stubs**: Use the default stubs provided by DataCase when possible
|
||||
8. **Avoid clear_config in async tests**: Use dependency injection and mocking instead
|
||||
|
||||
## Example: Complete Migration
|
||||
|
||||
For a complete example of migrating a test from Mock/meck to Mox, you can refer to commit `90a47ca050c5839e8b4dc3bac315dc436d49152d` in the Pleroma repository, which shows how the S3 uploader tests were migrated.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Migrating tests from Mock/meck to Mox provides significant benefits for the Pleroma test suite, including faster test execution through async testing, better isolation between tests, and more robust mocking through explicit contracts. By following this guide, you can successfully migrate existing tests and write new tests using Mox.
|
||||
|
|
@ -69,12 +69,18 @@ cd /opt/pleroma
|
|||
sudo -Hu pleroma mix deps.get
|
||||
```
|
||||
|
||||
* Generate the configuration: `sudo -Hu pleroma MIX_ENV=prod mix pleroma.instance gen`
|
||||
* Generate the configuration:
|
||||
|
||||
```shell
|
||||
sudo -Hu pleroma MIX_ENV=prod mix pleroma.instance gen
|
||||
```
|
||||
|
||||
* During this process:
|
||||
* Answer with `yes` if it asks you to install `rebar3`.
|
||||
* This may take some time, because parts of pleroma get compiled first.
|
||||
* After that it will ask you a few questions about your instance and generates a configuration file in `config/generated_config.exs`.
|
||||
|
||||
* Check the configuration and if all looks right, rename it, so Pleroma will load it (`prod.secret.exs` for productive instance, `dev.secret.exs` for development instances):
|
||||
* Check the configuration and if all looks right, rename it, so Pleroma will load it (`prod.secret.exs` for production instances, `dev.secret.exs` for development instances):
|
||||
|
||||
```shell
|
||||
sudo -Hu pleroma mv config/{generated_config.exs,prod.secret.exs}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue