mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-12-23 00:26:30 +00:00
Merge remote-tracking branch 'origin/develop' into instance-contact-account
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
commit
c0c4a9ed0d
335 changed files with 3031 additions and 1802 deletions
6
.dialyzer_ignore.exs
Normal file
6
.dialyzer_ignore.exs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[
|
||||||
|
{"lib/cachex.ex", "Unknown type: Spec.cache/0."},
|
||||||
|
{"lib/pleroma/web/plugs/rate_limiter.ex", "The pattern can never match the type {:commit, _} | {:ignore, _}."},
|
||||||
|
{"lib/pleroma/web/plugs/rate_limiter.ex", "Function get_scale/2 will never be called."},
|
||||||
|
{"lib/pleroma/web/plugs/rate_limiter.ex", "Function initialize_buckets!/1 will never be called."}
|
||||||
|
]
|
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -57,5 +57,6 @@ pleroma.iml
|
||||||
.tool-versions
|
.tool-versions
|
||||||
|
|
||||||
# Editor temp files
|
# Editor temp files
|
||||||
/*~
|
*~
|
||||||
/*#
|
*#
|
||||||
|
*.swp
|
||||||
|
|
|
@ -28,6 +28,7 @@ cache: &global_cache_policy
|
||||||
stages:
|
stages:
|
||||||
- check-changelog
|
- check-changelog
|
||||||
- build
|
- build
|
||||||
|
- lint
|
||||||
- test
|
- test
|
||||||
- benchmark
|
- benchmark
|
||||||
- deploy
|
- deploy
|
||||||
|
@ -71,7 +72,7 @@ check-changelog:
|
||||||
tags:
|
tags:
|
||||||
- amd64
|
- amd64
|
||||||
|
|
||||||
build:
|
build-1.12.3:
|
||||||
extends:
|
extends:
|
||||||
- .build_changes_policy
|
- .build_changes_policy
|
||||||
- .using-ci-base
|
- .using-ci-base
|
||||||
|
@ -79,10 +80,20 @@ build:
|
||||||
script:
|
script:
|
||||||
- mix compile --force
|
- mix compile --force
|
||||||
|
|
||||||
|
build-1.15.7-otp-25:
|
||||||
|
extends:
|
||||||
|
- .build_changes_policy
|
||||||
|
- .using-ci-base
|
||||||
|
stage: build
|
||||||
|
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.15
|
||||||
|
allow_failure: true
|
||||||
|
script:
|
||||||
|
- mix compile --force
|
||||||
|
|
||||||
spec-build:
|
spec-build:
|
||||||
extends:
|
extends:
|
||||||
- .using-ci-base
|
- .using-ci-base
|
||||||
stage: test
|
stage: build
|
||||||
rules:
|
rules:
|
||||||
- changes:
|
- changes:
|
||||||
- ".gitlab-ci.yml"
|
- ".gitlab-ci.yml"
|
||||||
|
@ -110,7 +121,7 @@ benchmark:
|
||||||
- mix ecto.migrate
|
- mix ecto.migrate
|
||||||
- mix pleroma.load_testing
|
- mix pleroma.load_testing
|
||||||
|
|
||||||
unit-testing:
|
unit-testing-1.12.3:
|
||||||
extends:
|
extends:
|
||||||
- .build_changes_policy
|
- .build_changes_policy
|
||||||
- .using-ci-base
|
- .using-ci-base
|
||||||
|
@ -118,12 +129,11 @@ unit-testing:
|
||||||
cache: &testing_cache_policy
|
cache: &testing_cache_policy
|
||||||
<<: *global_cache_policy
|
<<: *global_cache_policy
|
||||||
policy: pull
|
policy: pull
|
||||||
|
services: &testing_services
|
||||||
services:
|
|
||||||
- name: postgres:13-alpine
|
- name: postgres:13-alpine
|
||||||
alias: postgres
|
alias: postgres
|
||||||
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
|
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
|
||||||
script:
|
script: &testing_script
|
||||||
- mix ecto.create
|
- mix ecto.create
|
||||||
- mix ecto.migrate
|
- mix ecto.migrate
|
||||||
- mix test --cover --preload-modules
|
- mix test --cover --preload-modules
|
||||||
|
@ -134,27 +144,32 @@ unit-testing:
|
||||||
coverage_format: cobertura
|
coverage_format: cobertura
|
||||||
path: coverage.xml
|
path: coverage.xml
|
||||||
|
|
||||||
unit-testing-erratic:
|
unit-testing-1.15.7-otp-25:
|
||||||
|
extends:
|
||||||
|
- .build_changes_policy
|
||||||
|
- .using-ci-base
|
||||||
|
stage: test
|
||||||
|
image: git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.15-otp25
|
||||||
|
allow_failure: true
|
||||||
|
cache: *testing_cache_policy
|
||||||
|
services: *testing_services
|
||||||
|
script: *testing_script
|
||||||
|
|
||||||
|
unit-testing-1.12-erratic:
|
||||||
extends:
|
extends:
|
||||||
- .build_changes_policy
|
- .build_changes_policy
|
||||||
- .using-ci-base
|
- .using-ci-base
|
||||||
stage: test
|
stage: test
|
||||||
retry: 2
|
retry: 2
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
cache: &testing_cache_policy
|
cache: *testing_cache_policy
|
||||||
<<: *global_cache_policy
|
services: *testing_services
|
||||||
policy: pull
|
|
||||||
|
|
||||||
services:
|
|
||||||
- name: postgres:13-alpine
|
|
||||||
alias: postgres
|
|
||||||
command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"]
|
|
||||||
script:
|
script:
|
||||||
- mix ecto.create
|
- mix ecto.create
|
||||||
- mix ecto.migrate
|
- mix ecto.migrate
|
||||||
- mix test --only=erratic
|
- mix test --only=erratic
|
||||||
|
|
||||||
unit-testing-rum:
|
unit-testing-1.12-rum:
|
||||||
extends:
|
extends:
|
||||||
- .build_changes_policy
|
- .build_changes_policy
|
||||||
- .using-ci-base
|
- .using-ci-base
|
||||||
|
@ -173,10 +188,10 @@ unit-testing-rum:
|
||||||
- "mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/"
|
- "mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/"
|
||||||
- mix test --preload-modules
|
- mix test --preload-modules
|
||||||
|
|
||||||
lint:
|
formatting-1.13:
|
||||||
extends: .build_changes_policy
|
extends: .build_changes_policy
|
||||||
image: ¤t_elixir elixir:1.13-alpine
|
image: &formatting_elixir elixir:1.13-alpine
|
||||||
stage: test
|
stage: lint
|
||||||
cache: *testing_cache_policy
|
cache: *testing_cache_policy
|
||||||
before_script: ¤t_bfr_script
|
before_script: ¤t_bfr_script
|
||||||
- apk update
|
- apk update
|
||||||
|
@ -187,25 +202,38 @@ lint:
|
||||||
script:
|
script:
|
||||||
- mix format --check-formatted
|
- mix format --check-formatted
|
||||||
|
|
||||||
analysis:
|
cycles-1.13:
|
||||||
extends:
|
|
||||||
- .build_changes_policy
|
|
||||||
- .using-ci-base
|
|
||||||
stage: test
|
|
||||||
cache: *testing_cache_policy
|
|
||||||
script:
|
|
||||||
- mix credo --strict --only=warnings,todo,fixme,consistency,readability
|
|
||||||
|
|
||||||
cycles:
|
|
||||||
extends: .build_changes_policy
|
extends: .build_changes_policy
|
||||||
image: *current_elixir
|
image: *formatting_elixir
|
||||||
stage: test
|
stage: lint
|
||||||
cache: {}
|
cache: {}
|
||||||
before_script: *current_bfr_script
|
before_script: *current_bfr_script
|
||||||
script:
|
script:
|
||||||
- mix compile
|
- mix compile
|
||||||
- mix xref graph --format cycles --label compile | awk '{print $0} END{exit ($0 != "No cycles found")}'
|
- mix xref graph --format cycles --label compile | awk '{print $0} END{exit ($0 != "No cycles found")}'
|
||||||
|
|
||||||
|
analysis:
|
||||||
|
extends:
|
||||||
|
- .build_changes_policy
|
||||||
|
- .using-ci-base
|
||||||
|
stage: lint
|
||||||
|
cache: *testing_cache_policy
|
||||||
|
script:
|
||||||
|
- mix credo --strict --only=warnings,todo,fixme,consistency,readability
|
||||||
|
|
||||||
|
dialyzer:
|
||||||
|
extends:
|
||||||
|
- .build_changes_policy
|
||||||
|
- .using-ci-base
|
||||||
|
stage: lint
|
||||||
|
allow_failure: true
|
||||||
|
when: manual
|
||||||
|
cache: *testing_cache_policy
|
||||||
|
tags:
|
||||||
|
- feld
|
||||||
|
script:
|
||||||
|
- mix dialyzer
|
||||||
|
|
||||||
docs-deploy:
|
docs-deploy:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
cache: *testing_cache_policy
|
cache: *testing_cache_policy
|
||||||
|
|
17
CHANGELOG.md
17
CHANGELOG.md
|
@ -4,6 +4,11 @@ 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/).
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
|
## 2.6.2
|
||||||
|
|
||||||
|
### Security
|
||||||
|
- MRF StealEmojiPolicy: Sanitize shortcodes (thanks to Hazel K for the report
|
||||||
|
|
||||||
## 2.6.1
|
## 2.6.1
|
||||||
### Changed
|
### Changed
|
||||||
- - Document maximum supported version of Erlang & Elixir
|
- - Document maximum supported version of Erlang & Elixir
|
||||||
|
@ -62,7 +67,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
## 2.5.4
|
## 2.5.4
|
||||||
|
|
||||||
## Security
|
## Security
|
||||||
- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitary files from the server's filesystem
|
- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitrary files from the server's filesystem
|
||||||
|
|
||||||
## 2.5.3
|
## 2.5.3
|
||||||
|
|
||||||
|
@ -78,7 +83,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
## 2.5.4
|
## 2.5.4
|
||||||
|
|
||||||
## Security
|
## Security
|
||||||
- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitary files from the server's filesystem
|
- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitrary files from the server's filesystem
|
||||||
|
|
||||||
## 2.5.3
|
## 2.5.3
|
||||||
|
|
||||||
|
@ -118,7 +123,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Fix `block_from_stranger` setting
|
- Fix `block_from_stranger` setting
|
||||||
- Fix rel="me"
|
- Fix rel="me"
|
||||||
- Docker images will now run properly
|
- Docker images will now run properly
|
||||||
- Fix inproper content being cached in report content
|
- Fix improper content being cached in report content
|
||||||
- Notification filter on object content will not operate on the ones that inherently have no content
|
- Notification filter on object content will not operate on the ones that inherently have no content
|
||||||
- ZWNJ and double dots in links are parsed properly for Plain-text posts
|
- ZWNJ and double dots in links are parsed properly for Plain-text posts
|
||||||
- OTP releases will work on systems with a newer libcrypt
|
- OTP releases will work on systems with a newer libcrypt
|
||||||
|
@ -784,7 +789,7 @@ switched to a new configuration mechanism, however it was not officially removed
|
||||||
- Rate limiter crashes when there is no explicitly specified ip in the config
|
- Rate limiter crashes when there is no explicitly specified ip in the config
|
||||||
- 500 errors when no `Accept` header is present if Static-FE is enabled
|
- 500 errors when no `Accept` header is present if Static-FE is enabled
|
||||||
- Instance panel not being updated immediately due to wrong `Cache-Control` headers
|
- Instance panel not being updated immediately due to wrong `Cache-Control` headers
|
||||||
- Statuses posted with BBCode/Markdown having unncessary newlines in Pleroma-FE
|
- Statuses posted with BBCode/Markdown having unnecessary newlines in Pleroma-FE
|
||||||
- OTP: Fix some settings not being migrated to in-database config properly
|
- OTP: Fix some settings not being migrated to in-database config properly
|
||||||
- No `Cache-Control` headers on attachment/media proxy requests
|
- No `Cache-Control` headers on attachment/media proxy requests
|
||||||
- Character limit enforcement being off by 1
|
- Character limit enforcement being off by 1
|
||||||
|
@ -1104,10 +1109,10 @@ curl -Lo ./bin/pleroma_ctl 'https://git.pleroma.social/pleroma/pleroma/raw/devel
|
||||||
- Reverse Proxy limiting `max_body_length` was incorrectly defined and only checked `Content-Length` headers which may not be sufficient in some circumstances
|
- Reverse Proxy limiting `max_body_length` was incorrectly defined and only checked `Content-Length` headers which may not be sufficient in some circumstances
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- Expiring/ephemeral activites. All activities can have expires_at value set, which controls when they should be deleted automatically.
|
- Expiring/ephemeral activities. All activities can have expires_at value set, which controls when they should be deleted automatically.
|
||||||
- Mastodon API: in post_status, the expires_in parameter lets you set the number of seconds until an activity expires. It must be at least one hour.
|
- Mastodon API: in post_status, the expires_in parameter lets you set the number of seconds until an activity expires. It must be at least one hour.
|
||||||
- Mastodon API: all status JSON responses contain a `pleroma.expires_at` item which states when an activity will expire. The value is only shown to the user who created the activity. To everyone else it's empty.
|
- Mastodon API: all status JSON responses contain a `pleroma.expires_at` item which states when an activity will expire. The value is only shown to the user who created the activity. To everyone else it's empty.
|
||||||
- Configuration: `ActivityExpiration.enabled` controls whether expired activites will get deleted at the appropriate time. Enabled by default.
|
- Configuration: `ActivityExpiration.enabled` controls whether expired activities will get deleted at the appropriate time. Enabled by default.
|
||||||
- Conversations: Add Pleroma-specific conversation endpoints and status posting extensions. Run the `bump_all_conversations` task again to create the necessary data.
|
- Conversations: Add Pleroma-specific conversation endpoints and status posting extensions. Run the `bump_all_conversations` task again to create the necessary data.
|
||||||
- MRF: Support for priming the mediaproxy cache (`Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy`)
|
- MRF: Support for priming the mediaproxy cache (`Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy`)
|
||||||
- MRF: Support for excluding specific domains from Transparency.
|
- MRF: Support for excluding specific domains from Transparency.
|
||||||
|
|
1
changelog.d/account-rendering-auth-check.fix
Normal file
1
changelog.d/account-rendering-auth-check.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix authentication check on account rendering when bio is defined
|
0
changelog.d/api-docs.skip
Normal file
0
changelog.d/api-docs.skip
Normal file
0
changelog.d/atom-leak.skip
Normal file
0
changelog.d/atom-leak.skip
Normal file
1
changelog.d/bandit.change
Normal file
1
changelog.d/bandit.change
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Support Bandit as an alternative to Cowboy for the HTTP server.
|
1
changelog.d/bugfix-ccworks.fix
Normal file
1
changelog.d/bugfix-ccworks.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix federation with Convergence AP Bridge
|
1
changelog.d/chat-attachment-empty-array.fix
Normal file
1
changelog.d/chat-attachment-empty-array.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ChatMessage: Tolerate attachment field set to an empty array
|
1
changelog.d/config-stat-symlink.fix
Normal file
1
changelog.d/config-stat-symlink.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
- Config: Check the permissions of the linked file instead of the symlink
|
1
changelog.d/content-length.fix
Normal file
1
changelog.d/content-length.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
MediaProxy was setting the content-length header which is not permitted by RFC9112§6.2 when we are chunking the reply as it conflicts with the existence of the transfer-encoding header.
|
0
changelog.d/deps-bump-2024-01-25.skip
Normal file
0
changelog.d/deps-bump-2024-01-25.skip
Normal file
0
changelog.d/dialyzer.skip
Normal file
0
changelog.d/dialyzer.skip
Normal file
0
changelog.d/dialyzer2.skip
Normal file
0
changelog.d/dialyzer2.skip
Normal file
0
changelog.d/dialyzer3.skip
Normal file
0
changelog.d/dialyzer3.skip
Normal file
0
changelog.d/dialyzer4.skip
Normal file
0
changelog.d/dialyzer4.skip
Normal file
1
changelog.d/emoji-download-paginate.fix
Normal file
1
changelog.d/emoji-download-paginate.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
When downloading remote emojis packs, account for pagination
|
1
changelog.d/emoji-use-v1.fix
Normal file
1
changelog.d/emoji-use-v1.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Make remote emoji packs API use specifically the V1 URL. Akkoma does not understand it without V1, and it works either way with normal pleroma, so no reason to not do this
|
0
changelog.d/exile-bsds.skip
Normal file
0
changelog.d/exile-bsds.skip
Normal file
0
changelog.d/exile-freebsd.skip
Normal file
0
changelog.d/exile-freebsd.skip
Normal file
0
changelog.d/exile-macos.skip
Normal file
0
changelog.d/exile-macos.skip
Normal file
0
changelog.d/exile.skip
Normal file
0
changelog.d/exile.skip
Normal file
1
changelog.d/federator-modules.remove
Normal file
1
changelog.d/federator-modules.remove
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Removed support for multiple federator modules as we only support ActivityPub
|
0
changelog.d/federator.skip
Normal file
0
changelog.d/federator.skip
Normal file
1
changelog.d/finch_redirects.fix
Normal file
1
changelog.d/finch_redirects.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Following HTTP Redirects when the HTTP Adapter is Finch
|
0
changelog.d/fix-duplicate-inbox-deliveries.fix
Normal file
0
changelog.d/fix-duplicate-inbox-deliveries.fix
Normal file
1
changelog.d/group-actor.add
Normal file
1
changelog.d/group-actor.add
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Implement group actors
|
0
changelog.d/gun-logs.skip
Normal file
0
changelog.d/gun-logs.skip
Normal file
1
changelog.d/gun_pool.fix
Normal file
1
changelog.d/gun_pool.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix logic error in Gun connection pooling which prevented retries even when the worker was launched with retry = true
|
1
changelog.d/gun_pool2.fix
Normal file
1
changelog.d/gun_pool2.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Connection pool errors when publishing an activity is a soft-error that will be retried shortly.
|
0
changelog.d/gun_pool3.skip
Normal file
0
changelog.d/gun_pool3.skip
Normal file
1
changelog.d/handle_object_fetch_failures.change
Normal file
1
changelog.d/handle_object_fetch_failures.change
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Remote object fetch failures will prevent the object fetch job from retrying if the object request returns 401, 403, 404, 410, or exceeds the maximum thread depth.
|
0
changelog.d/instance-defdelegates.skip
Normal file
0
changelog.d/instance-defdelegates.skip
Normal file
0
changelog.d/instance-v2.skip
Normal file
0
changelog.d/instance-v2.skip
Normal file
1
changelog.d/link-verification.add
Normal file
1
changelog.d/link-verification.add
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Verify profile link ownership with rel="me"
|
1
changelog.d/local-webfinger.fix
Normal file
1
changelog.d/local-webfinger.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Use correct domain for fqn and InstanceView
|
1
changelog.d/mastodon_directory.fix
Normal file
1
changelog.d/mastodon_directory.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Mastodon API /api/v1/directory: Fix listing directory contents when not authenticated
|
1
changelog.d/memleak.fix
Normal file
1
changelog.d/memleak.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix a memory leak caused by Websocket connections that would not enter a state where a full garbage collection run could be triggered.
|
0
changelog.d/mergeback-2.6.2.skip
Normal file
0
changelog.d/mergeback-2.6.2.skip
Normal file
1
changelog.d/mrf-regex-error.fix
Normal file
1
changelog.d/mrf-regex-error.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
MRF: Log sensible error for subdomains_regex
|
1
changelog.d/mrf-steal-emoji-extname.fix
Normal file
1
changelog.d/mrf-steal-emoji-extname.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
MRF.StealEmojiPolicy: Properly add fallback extension to filenames missing one
|
1
changelog.d/mrf_hashtags.fix
Normal file
1
changelog.d/mrf_hashtags.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Federated timeline removal of hashtags via MRF HashtagPolicy
|
1
changelog.d/nil-content-map.fix
Normal file
1
changelog.d/nil-content-map.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Support objects with a null contentMap (firefish)
|
1
changelog.d/notifications-index.fix
Normal file
1
changelog.d/notifications-index.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Fix notifications query which was not using the index properly
|
1
changelog.d/oauth-nickname.skip
Normal file
1
changelog.d/oauth-nickname.skip
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Use User.full_nickname/1 in oauth html template
|
1
changelog.d/otp26.add
Normal file
1
changelog.d/otp26.add
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Support for Erlang OTP 26
|
1
changelog.d/publisher_discard.change
Normal file
1
changelog.d/publisher_discard.change
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Activity publishing failures will prevent the job from retrying if the publishing request returns a 403 or 410
|
1
changelog.d/publisher_log.change
Normal file
1
changelog.d/publisher_log.change
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Publisher errors will now emit logs indicating the inbox that was not available for delivery.
|
1
changelog.d/qtfaststart.fix
Normal file
1
changelog.d/qtfaststart.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
MediaProxy Preview failures prevented when encountering certain video files
|
0
changelog.d/remote-fetcher-error.skip
Normal file
0
changelog.d/remote-fetcher-error.skip
Normal file
1
changelog.d/rich_media.fix
Normal file
1
changelog.d/rich_media.fix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Rich Media Preview cache eviction when the activity is updated.
|
0
changelog.d/rich_media_tests.skip
Normal file
0
changelog.d/rich_media_tests.skip
Normal file
1
changelog.d/tesla.deps
Normal file
1
changelog.d/tesla.deps
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Update Tesla HTTP client middleware to 1.8.0
|
0
changelog.d/typo.skip
Normal file
0
changelog.d/typo.skip
Normal file
1
changelog.d/websocket-refactor.change
Normal file
1
changelog.d/websocket-refactor.change
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Refactor the Mastodon /api/v1/streaming websocket handler to use Phoenix.Socket.Transport
|
|
@ -1 +0,0 @@
|
||||||
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t git.pleroma.social:5050/pleroma/pleroma/ci-base:latest --push .
|
|
1
ci/elixir-1.12/build_and_push.sh
Executable file
1
ci/elixir-1.12/build_and_push.sh
Executable file
|
@ -0,0 +1 @@
|
||||||
|
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.12 --push .
|
8
ci/elixir-1.15-otp25/Dockerfile
Normal file
8
ci/elixir-1.15-otp25/Dockerfile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
FROM elixir:1.15.7-otp-25
|
||||||
|
|
||||||
|
# Single RUN statement, otherwise intermediate images are created
|
||||||
|
# https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
|
||||||
|
RUN apt-get update &&\
|
||||||
|
apt-get install -y libmagic-dev cmake libimage-exiftool-perl ffmpeg &&\
|
||||||
|
mix local.hex --force &&\
|
||||||
|
mix local.rebar --force
|
1
ci/elixir-1.15-otp25/build_and_push.sh
Executable file
1
ci/elixir-1.15-otp25/build_and_push.sh
Executable file
|
@ -0,0 +1 @@
|
||||||
|
docker buildx build --platform linux/amd64 -t git.pleroma.social:5050/pleroma/pleroma/ci-base:elixir-1.15-otp25 --push .
|
|
@ -79,6 +79,10 @@ IO.puts("RUM enabled: #{rum_enabled}")
|
||||||
|
|
||||||
config :pleroma, Pleroma.ReverseProxy.Client, Pleroma.ReverseProxy.ClientMock
|
config :pleroma, Pleroma.ReverseProxy.Client, Pleroma.ReverseProxy.ClientMock
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Application,
|
||||||
|
background_migrators: false,
|
||||||
|
streamer_registry: false
|
||||||
|
|
||||||
if File.exists?("./config/benchmark.secret.exs") do
|
if File.exists?("./config/benchmark.secret.exs") do
|
||||||
import_config "benchmark.secret.exs"
|
import_config "benchmark.secret.exs"
|
||||||
else
|
else
|
||||||
|
|
|
@ -114,14 +114,7 @@ config :pleroma, :uri_schemes,
|
||||||
config :pleroma, Pleroma.Web.Endpoint,
|
config :pleroma, Pleroma.Web.Endpoint,
|
||||||
url: [host: "localhost"],
|
url: [host: "localhost"],
|
||||||
http: [
|
http: [
|
||||||
ip: {127, 0, 0, 1},
|
ip: {127, 0, 0, 1}
|
||||||
dispatch: [
|
|
||||||
{:_,
|
|
||||||
[
|
|
||||||
{"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []},
|
|
||||||
{:_, Plug.Cowboy.Handler, {Pleroma.Web.Endpoint, []}}
|
|
||||||
]}
|
|
||||||
]
|
|
||||||
],
|
],
|
||||||
protocol: "https",
|
protocol: "https",
|
||||||
secret_key_base: "aK4Abxf29xU9TTDKre9coZPUgevcVCFQJe/5xP/7Lt4BEif6idBIbjupVbOrbKxl",
|
secret_key_base: "aK4Abxf29xU9TTDKre9coZPUgevcVCFQJe/5xP/7Lt4BEif6idBIbjupVbOrbKxl",
|
||||||
|
@ -192,9 +185,6 @@ config :pleroma, :instance,
|
||||||
federating: true,
|
federating: true,
|
||||||
federation_incoming_replies_max_depth: 100,
|
federation_incoming_replies_max_depth: 100,
|
||||||
federation_reachability_timeout_days: 7,
|
federation_reachability_timeout_days: 7,
|
||||||
federation_publisher_modules: [
|
|
||||||
Pleroma.Web.ActivityPub.Publisher
|
|
||||||
],
|
|
||||||
allow_relay: true,
|
allow_relay: true,
|
||||||
public: true,
|
public: true,
|
||||||
quarantined_instances: [],
|
quarantined_instances: [],
|
||||||
|
@ -907,6 +897,15 @@ config :pleroma, Pleroma.Search.Meilisearch,
|
||||||
private_key: nil,
|
private_key: nil,
|
||||||
initial_indexing_chunk_size: 100_000
|
initial_indexing_chunk_size: 100_000
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Application,
|
||||||
|
background_migrators: true,
|
||||||
|
internal_fetch: true,
|
||||||
|
load_custom_modules: true,
|
||||||
|
max_restarts: 3,
|
||||||
|
streamer_registry: true
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Uploaders.Uploader, timeout: 30_000
|
||||||
|
|
||||||
# Import environment specific config. This must remain at the bottom
|
# Import environment specific config. This must remain at the bottom
|
||||||
# of this file so it overrides the configuration defined above.
|
# of this file so it overrides the configuration defined above.
|
||||||
import_config "#{Mix.env()}.exs"
|
import_config "#{Mix.env()}.exs"
|
||||||
|
|
|
@ -566,6 +566,14 @@ config :pleroma, :config_description, [
|
||||||
"Cool instance"
|
"Cool instance"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
%{
|
||||||
|
key: :status_page,
|
||||||
|
type: :string,
|
||||||
|
description: "A page where people can see the status of the server during an outage",
|
||||||
|
suggestions: [
|
||||||
|
"https://status.pleroma.example.org"
|
||||||
|
]
|
||||||
|
},
|
||||||
%{
|
%{
|
||||||
key: :contact_username,
|
key: :contact_username,
|
||||||
type: :string,
|
type: :string,
|
||||||
|
@ -1450,7 +1458,7 @@ config :pleroma, :config_description, [
|
||||||
label: "Subject line behavior",
|
label: "Subject line behavior",
|
||||||
type: :string,
|
type: :string,
|
||||||
description: "Allows changing the default behaviour of subject lines in replies.
|
description: "Allows changing the default behaviour of subject lines in replies.
|
||||||
`email`: copy and preprend re:, as in email,
|
`email`: copy and prepend re:, as in email,
|
||||||
`masto`: copy verbatim, as in Mastodon,
|
`masto`: copy verbatim, as in Mastodon,
|
||||||
`noop`: don't copy the subject.",
|
`noop`: don't copy the subject.",
|
||||||
suggestions: ["email", "masto", "noop"]
|
suggestions: ["email", "masto", "noop"]
|
||||||
|
@ -3102,7 +3110,7 @@ config :pleroma, :config_description, [
|
||||||
key: :max_waiting,
|
key: :max_waiting,
|
||||||
type: :integer,
|
type: :integer,
|
||||||
description:
|
description:
|
||||||
"Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made",
|
"Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errors when a new request is made",
|
||||||
suggestions: [10]
|
suggestions: [10]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
|
@ -3368,7 +3376,7 @@ config :pleroma, :config_description, [
|
||||||
%{
|
%{
|
||||||
key: :purge_after_days,
|
key: :purge_after_days,
|
||||||
type: :integer,
|
type: :integer,
|
||||||
description: "Remove backup achives after N days",
|
description: "Remove backup archives after N days",
|
||||||
suggestions: [30]
|
suggestions: [30]
|
||||||
},
|
},
|
||||||
%{
|
%{
|
||||||
|
|
|
@ -8,8 +8,7 @@ import Config
|
||||||
# with brunch.io to recompile .js and .css sources.
|
# with brunch.io to recompile .js and .css sources.
|
||||||
config :pleroma, Pleroma.Web.Endpoint,
|
config :pleroma, Pleroma.Web.Endpoint,
|
||||||
http: [
|
http: [
|
||||||
port: 4000,
|
port: 4000
|
||||||
protocol_options: [max_request_line_length: 8192, max_header_value_length: 8192]
|
|
||||||
],
|
],
|
||||||
protocol: "http",
|
protocol: "http",
|
||||||
debug_errors: true,
|
debug_errors: true,
|
||||||
|
|
|
@ -162,6 +162,18 @@ peer_module =
|
||||||
|
|
||||||
config :pleroma, Pleroma.Cluster, peer_module: peer_module
|
config :pleroma, Pleroma.Cluster, peer_module: peer_module
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Application,
|
||||||
|
background_migrators: false,
|
||||||
|
internal_fetch: false,
|
||||||
|
load_custom_modules: false,
|
||||||
|
max_restarts: 100,
|
||||||
|
streamer_registry: false,
|
||||||
|
test_http_pools: true
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Uploaders.Uploader, timeout: 1_000
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Emoji.Loader, test_emoji: true
|
||||||
|
|
||||||
if File.exists?("./config/test.secret.exs") do
|
if File.exists?("./config/test.secret.exs") do
|
||||||
import_config "test.secret.exs"
|
import_config "test.secret.exs"
|
||||||
else
|
else
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Transfering the config to/from the database
|
# Transferring the config to/from the database
|
||||||
|
|
||||||
{! backend/administration/CLI_tasks/general_cli_task_info.include !}
|
{! backend/administration/CLI_tasks/general_cli_task_info.include !}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
|
|
||||||
- `<path>` - where to save migrated config. E.g. `--path=/tmp`. If file saved into non standart folder, you must manually copy file into directory where Pleroma can read it. For OTP install path will be `PLEROMA_CONFIG_PATH` or `/etc/pleroma`. For installation from source - `config` directory in the pleroma folder.
|
- `<path>` - where to save migrated config. E.g. `--path=/tmp`. If file saved into non-standard folder, you must manually copy file into directory where Pleroma can read it. For OTP install path will be `PLEROMA_CONFIG_PATH` or `/etc/pleroma`. For installation from source - `config` directory in the pleroma folder.
|
||||||
- `<env>` - environment, for which is migrated config. By default is `prod`.
|
- `<env>` - environment, for which is migrated config. By default is `prod`.
|
||||||
- To delete transferred settings from database optional flag `-d` can be used
|
- To delete transferred settings from database optional flag `-d` can be used
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
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.
|
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 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 individualy using the CLI tasks for [Managing users](./CLI_tasks/user.md).
|
* 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`
|
2. Stop the Pleroma service `systemctl stop pleroma`
|
||||||
3. Disable pleroma from systemd `systemctl disable 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.
|
4. Remove the files and folders you created during installation (see installation guide). This includes the pleroma, nginx and systemd files and folders.
|
||||||
|
|
|
@ -154,7 +154,7 @@ To add configuration to your config file, you can copy it from the base config.
|
||||||
* `Pleroma.Web.ActivityPub.MRF.MentionPolicy`: Drops posts mentioning configurable users. (See [`:mrf_mention`](#mrf_mention)).
|
* `Pleroma.Web.ActivityPub.MRF.MentionPolicy`: Drops posts mentioning configurable users. (See [`:mrf_mention`](#mrf_mention)).
|
||||||
* `Pleroma.Web.ActivityPub.MRF.VocabularyPolicy`: Restricts activities to a configured set of vocabulary. (See [`:mrf_vocabulary`](#mrf_vocabulary)).
|
* `Pleroma.Web.ActivityPub.MRF.VocabularyPolicy`: Restricts activities to a configured set of vocabulary. (See [`:mrf_vocabulary`](#mrf_vocabulary)).
|
||||||
* `Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy`: Rejects or delists posts based on their age when received. (See [`:mrf_object_age`](#mrf_object_age)).
|
* `Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy`: Rejects or delists posts based on their age when received. (See [`:mrf_object_age`](#mrf_object_age)).
|
||||||
* `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Sets a default expiration on all posts made by users of the local instance. Requires `Pleroma.Workers.PurgeExpiredActivity` to be enabled for processing the scheduled delections.
|
* `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Sets a default expiration on all posts made by users of the local instance. Requires `Pleroma.Workers.PurgeExpiredActivity` to be enabled for processing the scheduled deletions.
|
||||||
* `Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy`: Makes all bot posts to disappear from public timelines.
|
* `Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy`: Makes all bot posts to disappear from public timelines.
|
||||||
* `Pleroma.Web.ActivityPub.MRF.FollowBotPolicy`: Automatically follows newly discovered users from the specified bot account. Local accounts, locked accounts, and users with "#nobot" in their bio are respected and excluded from being followed.
|
* `Pleroma.Web.ActivityPub.MRF.FollowBotPolicy`: Automatically follows newly discovered users from the specified bot account. Local accounts, locked accounts, and users with "#nobot" in their bio are respected and excluded from being followed.
|
||||||
* `Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy`: Drops follow requests from followbots. Users can still allow bots to follow them by first following the bot.
|
* `Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy`: Drops follow requests from followbots. Users can still allow bots to follow them by first following the bot.
|
||||||
|
@ -506,7 +506,7 @@ config :pleroma, :rate_limit,
|
||||||
Means that:
|
Means that:
|
||||||
|
|
||||||
1. In 60 seconds, 15 authentication attempts can be performed from the same IP address.
|
1. In 60 seconds, 15 authentication attempts can be performed from the same IP address.
|
||||||
2. In 1 second, 10 search requests can be performed from the same IP adress by unauthenticated users, while authenticated users can perform 30 search requests per second.
|
2. In 1 second, 10 search requests can be performed from the same IP address by unauthenticated users, while authenticated users can perform 30 search requests per second.
|
||||||
|
|
||||||
Supported rate limiters:
|
Supported rate limiters:
|
||||||
|
|
||||||
|
@ -1081,7 +1081,7 @@ config :pleroma, Pleroma.Formatter,
|
||||||
|
|
||||||
## :configurable_from_database
|
## :configurable_from_database
|
||||||
|
|
||||||
Boolean, enables/disables in-database configuration. Read [Transfering the config to/from the database](../administration/CLI_tasks/config.md) for more information.
|
Boolean, enables/disables in-database configuration. Read [Transferring the config to/from the database](../administration/CLI_tasks/config.md) for more information.
|
||||||
|
|
||||||
## :database_config_whitelist
|
## :database_config_whitelist
|
||||||
|
|
||||||
|
@ -1142,7 +1142,7 @@ Control favicons for instances.
|
||||||
!!! note
|
!!! note
|
||||||
Requires enabled email
|
Requires enabled email
|
||||||
|
|
||||||
* `:purge_after_days` an integer, remove backup achives after N days.
|
* `:purge_after_days` an integer, remove backup achieves after N days.
|
||||||
* `:limit_days` an integer, limit user to export not more often than once per N days.
|
* `:limit_days` an integer, limit user to export not more often than once per N days.
|
||||||
* `:dir` a string with a path to backup temporary directory or `nil` to let Pleroma choose temporary directory in the following order:
|
* `:dir` a string with a path to backup temporary directory or `nil` to let Pleroma choose temporary directory in the following order:
|
||||||
1. the directory named by the TMPDIR environment variable
|
1. the directory named by the TMPDIR environment variable
|
||||||
|
|
|
@ -29,7 +29,7 @@ foo, /emoji/custom/foo.png
|
||||||
|
|
||||||
The files should be PNG (APNG is okay with `.png` for `image/png` Content-type) and under 50kb for compatibility with mastodon.
|
The files should be PNG (APNG is okay with `.png` for `image/png` Content-type) and under 50kb for compatibility with mastodon.
|
||||||
|
|
||||||
Default file extentions and locations for emojis are set in `config.exs`. To use different locations or file-extentions, add the `shortcode_globs` to your secrets file (`prod.secret.exs` or `dev.secret.exs`) and edit it. Note that not all fediverse-software will show emojis with other file extentions:
|
Default file extensions and locations for emojis are set in `config.exs`. To use different locations or file-extensions, add the `shortcode_globs` to your secrets file (`prod.secret.exs` or `dev.secret.exs`) and edit it. Note that not all fediverse-software will show emojis with other file extensions:
|
||||||
```elixir
|
```elixir
|
||||||
config :pleroma, :emoji, shortcode_globs: ["/emoji/custom/**/*.png", "/emoji/custom/**/*.gif"]
|
config :pleroma, :emoji, shortcode_globs: ["/emoji/custom/**/*.png", "/emoji/custom/**/*.gif"]
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# I2P Federation and Accessability
|
# I2P Federation and Accessibility
|
||||||
|
|
||||||
This guide is going to focus on the Pleroma federation aspect. The actual installation is neatly explained in the official documentation, and more likely to remain up-to-date.
|
This guide is going to focus on the Pleroma federation aspect. The actual installation is neatly explained in the official documentation, and more likely to remain up-to-date.
|
||||||
It might be added to this guide if there will be a need for that.
|
It might be added to this guide if there will be a need for that.
|
||||||
|
|
|
@ -29,7 +29,7 @@ HiddenServiceDir /var/lib/tor/pleroma_hidden_service/
|
||||||
HiddenServicePort 80 127.0.0.1:8099
|
HiddenServicePort 80 127.0.0.1:8099
|
||||||
HiddenServiceVersion 3 # Remove if Tor version is below 0.3 ( tor --version )
|
HiddenServiceVersion 3 # Remove if Tor version is below 0.3 ( tor --version )
|
||||||
```
|
```
|
||||||
Restart Tor to generate an adress:
|
Restart Tor to generate an address:
|
||||||
```
|
```
|
||||||
systemctl restart tor@default.service
|
systemctl restart tor@default.service
|
||||||
```
|
```
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Optimizing the BEAM
|
# Optimizing the BEAM
|
||||||
|
|
||||||
Pleroma is built upon the Erlang/OTP VM known as BEAM. The BEAM VM is highly optimized for latency, but this has drawbacks in environments without dedicated hardware. One of the tricks used by the BEAM VM is [busy waiting](https://en.wikipedia.org/wiki/Busy_waiting). This allows the application to pretend to be busy working so the OS kernel does not pause the application process and switch to another process waiting for the CPU to execute its workload. It does this by spinning for a period of time which inflates the apparent CPU usage of the application so it is immediately ready to execute another task. This can be observed with utilities like **top(1)** which will show consistently high CPU usage for the process. Switching between procesess is a rather expensive operation and also clears CPU caches further affecting latency and performance. The goal of busy waiting is to avoid this penalty.
|
Pleroma is built upon the Erlang/OTP VM known as BEAM. The BEAM VM is highly optimized for latency, but this has drawbacks in environments without dedicated hardware. One of the tricks used by the BEAM VM is [busy waiting](https://en.wikipedia.org/wiki/Busy_waiting). This allows the application to pretend to be busy working so the OS kernel does not pause the application process and switch to another process waiting for the CPU to execute its workload. It does this by spinning for a period of time which inflates the apparent CPU usage of the application so it is immediately ready to execute another task. This can be observed with utilities like **top(1)** which will show consistently high CPU usage for the process. Switching between processes is a rather expensive operation and also clears CPU caches further affecting latency and performance. The goal of busy waiting is to avoid this penalty.
|
||||||
|
|
||||||
This strategy is very successful in making a performant and responsive application, but is not desirable on Virtual Machines or hardware with few CPU cores. Pleroma instances are often deployed on the same server as the required PostgreSQL database which can lead to situations where the Pleroma application is holding the CPU in a busy-wait loop and as a result the database cannot process requests in a timely manner. The fewer CPUs available, the more this problem is exacerbated. The latency is further amplified by the OS being installed on a Virtual Machine as the Hypervisor uses CPU time-slicing to pause the entire OS and switch between other tasks.
|
This strategy is very successful in making a performant and responsive application, but is not desirable on Virtual Machines or hardware with few CPU cores. Pleroma instances are often deployed on the same server as the required PostgreSQL database which can lead to situations where the Pleroma application is holding the CPU in a busy-wait loop and as a result the database cannot process requests in a timely manner. The fewer CPUs available, the more this problem is exacerbated. The latency is further amplified by the OS being installed on a Virtual Machine as the Hypervisor uses CPU time-slicing to pause the entire OS and switch between other tasks.
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ config :pleroma, Pleroma.Repo,
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
A more detailed explaination of the issue can be found at <https://blog.soykaf.com/post/postgresql-elixir-troubles/>.
|
A more detailed explanation of the issue can be found at <https://blog.soykaf.com/post/postgresql-elixir-troubles/>.
|
||||||
|
|
||||||
## Example configurations
|
## Example configurations
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ indexes faster when it can process many posts in a single batch.
|
||||||
Information about setting up meilisearch can be found in the
|
Information about setting up meilisearch can be found in the
|
||||||
[official documentation](https://docs.meilisearch.com/learn/getting_started/installation.html).
|
[official documentation](https://docs.meilisearch.com/learn/getting_started/installation.html).
|
||||||
You probably want to start it with `MEILI_NO_ANALYTICS=true` environment variable to disable analytics.
|
You probably want to start it with `MEILI_NO_ANALYTICS=true` environment variable to disable analytics.
|
||||||
At least version 0.25.0 is required, but you are strongly adviced to use at least 0.26.0, as it introduces
|
At least version 0.25.0 is required, but you are strongly advised to use at least 0.26.0, as it introduces
|
||||||
the `--enable-auto-batching` option which drastically improves performance. Without this option, the search
|
the `--enable-auto-batching` option which drastically improves performance. Without this option, the search
|
||||||
is hardly usable on a somewhat big instance.
|
is hardly usable on a somewhat big instance.
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ You will see a "Default Admin API Key", this is the key you actually put into yo
|
||||||
|
|
||||||
### Initial indexing
|
### Initial indexing
|
||||||
|
|
||||||
After setting up the configuration, you'll want to index all of your already existsing posts. Only public posts are indexed. You'll only
|
After setting up the configuration, you'll want to index all of your already existing posts. Only public posts are indexed. You'll only
|
||||||
have to do it one time, but it might take a while, depending on the amount of posts your instance has seen. This is also a fairly RAM
|
have to do it one time, but it might take a while, depending on the amount of posts your instance has seen. This is also a fairly RAM
|
||||||
consuming process for `meilisearch`, and it will take a lot of RAM when running if you have a lot of posts (seems to be around 5G for ~1.2
|
consuming process for `meilisearch`, and it will take a lot of RAM when running if you have a lot of posts (seems to be around 5G for ~1.2
|
||||||
million posts while idle and up to 7G while indexing initially, but your experience may be different).
|
million posts while idle and up to 7G while indexing initially, but your experience may be different).
|
||||||
|
|
|
@ -303,7 +303,7 @@ Removes the user(s) from follower recommendations.
|
||||||
|
|
||||||
## `GET /api/v1/pleroma/admin/users/:nickname_or_id`
|
## `GET /api/v1/pleroma/admin/users/:nickname_or_id`
|
||||||
|
|
||||||
### Retrive the details of a user
|
### Retrieve the details of a user
|
||||||
|
|
||||||
- Params:
|
- Params:
|
||||||
- `nickname` or `id`
|
- `nickname` or `id`
|
||||||
|
@ -313,7 +313,7 @@ Removes the user(s) from follower recommendations.
|
||||||
|
|
||||||
## `GET /api/v1/pleroma/admin/users/:nickname_or_id/statuses`
|
## `GET /api/v1/pleroma/admin/users/:nickname_or_id/statuses`
|
||||||
|
|
||||||
### Retrive user's latest statuses
|
### Retrieve user's latest statuses
|
||||||
|
|
||||||
- Params:
|
- Params:
|
||||||
- `nickname` or `id`
|
- `nickname` or `id`
|
||||||
|
@ -337,7 +337,7 @@ Removes the user(s) from follower recommendations.
|
||||||
|
|
||||||
## `GET /api/v1/pleroma/admin/instances/:instance/statuses`
|
## `GET /api/v1/pleroma/admin/instances/:instance/statuses`
|
||||||
|
|
||||||
### Retrive instance's latest statuses
|
### Retrieve instance's latest statuses
|
||||||
|
|
||||||
- Params:
|
- Params:
|
||||||
- `instance`: instance name
|
- `instance`: instance name
|
||||||
|
@ -377,7 +377,7 @@ It may take some time.
|
||||||
|
|
||||||
## `GET /api/v1/pleroma/admin/statuses`
|
## `GET /api/v1/pleroma/admin/statuses`
|
||||||
|
|
||||||
### Retrives all latest statuses
|
### Retrieves all latest statuses
|
||||||
|
|
||||||
- Params:
|
- Params:
|
||||||
- *optional* `page_size`: number of statuses to return (default is `20`)
|
- *optional* `page_size`: number of statuses to return (default is `20`)
|
||||||
|
@ -541,7 +541,7 @@ Response:
|
||||||
|
|
||||||
## `PATCH /api/v1/pleroma/admin/users/force_password_reset`
|
## `PATCH /api/v1/pleroma/admin/users/force_password_reset`
|
||||||
|
|
||||||
### Force passord reset for a user with a given nickname
|
### Force password reset for a user with a given nickname
|
||||||
|
|
||||||
- Params:
|
- Params:
|
||||||
- `nicknames`
|
- `nicknames`
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Differences in Mastodon API responses from vanilla Mastodon
|
# Differences in Mastodon API responses from vanilla Mastodon
|
||||||
|
|
||||||
A Pleroma instance can be identified by "<Mastodon version> (compatible; Pleroma <version>)" present in `version` field in response from `/api/v1/instance`
|
A Pleroma instance can be identified by "<Mastodon version> (compatible; Pleroma <version>)" present in `version` field in response from `/api/v1/instance` and `/api/v2/instance`
|
||||||
|
|
||||||
## Flake IDs
|
## Flake IDs
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ Has these additional fields under the `pleroma` object:
|
||||||
- `emoji_reactions`: A list with emoji / reaction maps. The format is `{name: "☕", count: 1, me: true}`. Contains no information about the reacting users, for that use the `/statuses/:id/reactions` endpoint.
|
- `emoji_reactions`: A list with emoji / reaction maps. The format is `{name: "☕", count: 1, me: true}`. Contains no information about the reacting users, for that use the `/statuses/:id/reactions` endpoint.
|
||||||
- `parent_visible`: If the parent of this post is visible to the user or not.
|
- `parent_visible`: If the parent of this post is visible to the user or not.
|
||||||
- `pinned_at`: a datetime (iso8601) when status was pinned, `null` otherwise.
|
- `pinned_at`: a datetime (iso8601) when status was pinned, `null` otherwise.
|
||||||
|
- `quotes_count`: the count of status quotes.
|
||||||
|
|
||||||
The `GET /api/v1/statuses/:id/source` endpoint additionally has the following attributes:
|
The `GET /api/v1/statuses/:id/source` endpoint additionally has the following attributes:
|
||||||
|
|
||||||
|
@ -304,19 +305,27 @@ Has these additional parameters (which are the same as in Pleroma-API):
|
||||||
`GET /api/v1/instance` has additional fields
|
`GET /api/v1/instance` has additional fields
|
||||||
|
|
||||||
- `max_toot_chars`: The maximum characters per post
|
- `max_toot_chars`: The maximum characters per post
|
||||||
|
- `max_media_attachments`: Maximum number of post media attachments
|
||||||
- `chat_limit`: The maximum characters per chat message
|
- `chat_limit`: The maximum characters per chat message
|
||||||
- `description_limit`: The maximum characters per image description
|
- `description_limit`: The maximum characters per image description
|
||||||
- `poll_limits`: The limits of polls
|
- `poll_limits`: The limits of polls
|
||||||
|
- `shout_limit`: The maximum characters per Shoutbox message
|
||||||
- `upload_limit`: The maximum upload file size
|
- `upload_limit`: The maximum upload file size
|
||||||
- `avatar_upload_limit`: The same for avatars
|
- `avatar_upload_limit`: The same for avatars
|
||||||
- `background_upload_limit`: The same for backgrounds
|
- `background_upload_limit`: The same for backgrounds
|
||||||
- `banner_upload_limit`: The same for banners
|
- `banner_upload_limit`: The same for banners
|
||||||
- `background_image`: A background image that frontends can use
|
- `background_image`: A background image that frontends can use
|
||||||
|
- `pleroma.metadata.account_activation_required`: Whether users are required to confirm their emails before signing in
|
||||||
|
- `pleroma.metadata.birthday_required`: Whether users are required to provide their birth day when signing in
|
||||||
|
- `pleroma.metadata.birthday_min_age`: The minimum user age (in days)
|
||||||
- `pleroma.metadata.features`: A list of supported features
|
- `pleroma.metadata.features`: A list of supported features
|
||||||
- `pleroma.metadata.federation`: The federation restrictions of this instance
|
- `pleroma.metadata.federation`: The federation restrictions of this instance
|
||||||
- `pleroma.metadata.fields_limits`: A list of values detailing the length and count limitation for various instance-configurable fields.
|
- `pleroma.metadata.fields_limits`: A list of values detailing the length and count limitation for various instance-configurable fields.
|
||||||
- `pleroma.metadata.post_formats`: A list of the allowed post format types
|
- `pleroma.metadata.post_formats`: A list of the allowed post format types
|
||||||
- `vapid_public_key`: The public key needed for push messages
|
- `pleroma.stats.mau`: Monthly active user count
|
||||||
|
- `pleroma.vapid_public_key`: The public key needed for push messages
|
||||||
|
|
||||||
|
In, `GET /api/v2/instance` Pleroma-specific fields are all moved into `pleroma` object. `max_toot_chars`, `poll_limits` and `upload_limit` are replaced with their MastoAPI counterparts.
|
||||||
|
|
||||||
## Push Subscription
|
## Push Subscription
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ The `/api/v1/pleroma/*` path is backwards compatible with `/api/pleroma/*` (`/ap
|
||||||
* method: `GET`
|
* method: `GET`
|
||||||
* Authentication: required
|
* Authentication: required
|
||||||
* OAuth scope: `write:security`
|
* OAuth scope: `write:security`
|
||||||
* Response: JSON. Returns `{"codes": codes}`when successful, otherwise HTTP 422 `{"error": "[error message]"}`
|
* Response: JSON. Returns `{"codes": codes}` when successful, otherwise HTTP 422 `{"error": "[error message]"}`
|
||||||
|
|
||||||
## `/api/v1/pleroma/admin/`
|
## `/api/v1/pleroma/admin/`
|
||||||
See [Admin-API](admin_api.md)
|
See [Admin-API](admin_api.md)
|
||||||
|
@ -251,6 +251,15 @@ See [Admin-API](admin_api.md)
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## `/api/v1/pleroma/accounts/:id/endorsements`
|
||||||
|
### Returns users endorsed by a user
|
||||||
|
* Method `GET`
|
||||||
|
* Authentication: not required
|
||||||
|
* Params:
|
||||||
|
* `id`: the id of the account for whom to return results
|
||||||
|
* Response: JSON, returns a list of Mastodon Account entities
|
||||||
|
|
||||||
## `/api/v1/pleroma/accounts/update_*`
|
## `/api/v1/pleroma/accounts/update_*`
|
||||||
### Set and clear account avatar, banner, and background
|
### Set and clear account avatar, banner, and background
|
||||||
|
|
||||||
|
@ -266,6 +275,14 @@ See [Admin-API](admin_api.md)
|
||||||
* Authentication: not required
|
* Authentication: not required
|
||||||
* Response: 204 No Content
|
* Response: 204 No Content
|
||||||
|
|
||||||
|
## `/api/v1/pleroma/statuses/:id/quotes`
|
||||||
|
### Gets quotes for a given status
|
||||||
|
* Method `GET`
|
||||||
|
* Authentication: not required
|
||||||
|
* Params:
|
||||||
|
* `id`: the id of the status
|
||||||
|
* Response: JSON, returns a list of Mastodon Status entities
|
||||||
|
|
||||||
## `/api/v1/pleroma/mascot`
|
## `/api/v1/pleroma/mascot`
|
||||||
### Gets user mascot image
|
### Gets user mascot image
|
||||||
* Method `GET`
|
* Method `GET`
|
||||||
|
@ -372,6 +389,15 @@ See [Admin-API](admin_api.md)
|
||||||
* `alias`: the nickname of the alias to delete, e.g. `foo@example.org`.
|
* `alias`: the nickname of the alias to delete, e.g. `foo@example.org`.
|
||||||
* Response: JSON. Returns `{"status": "success"}` if the change was successful, `{"error": "[error message]"}` otherwise
|
* Response: JSON. Returns `{"status": "success"}` if the change was successful, `{"error": "[error message]"}` otherwise
|
||||||
|
|
||||||
|
## `/api/v1/pleroma/remote_interaction`
|
||||||
|
## Interact with profile or status from remote account
|
||||||
|
* Metod `POST`
|
||||||
|
* Authentication: not required
|
||||||
|
* Params:
|
||||||
|
* `ap_id`: Profile or status ActivityPub ID
|
||||||
|
* `profile`: Remote profile webfinger
|
||||||
|
* Response: JSON. Returns `{"url": "[redirect url]"}` on success, `{"error": "[error message]"}` otherwise
|
||||||
|
|
||||||
# Pleroma Conversations
|
# Pleroma Conversations
|
||||||
|
|
||||||
Pleroma Conversations have the same general structure that Mastodon Conversations have. The behavior differs in the following ways when using these endpoints:
|
Pleroma Conversations have the same general structure that Mastodon Conversations have. The behavior differs in the following ways when using these endpoints:
|
||||||
|
@ -382,7 +408,7 @@ Pleroma Conversations have the same general structure that Mastodon Conversation
|
||||||
|
|
||||||
Conversations have the additional field `recipients` under the `pleroma` key. This holds a list of all the accounts that will receive a message in this conversation.
|
Conversations have the additional field `recipients` under the `pleroma` key. This holds a list of all the accounts that will receive a message in this conversation.
|
||||||
|
|
||||||
The status posting endpoint takes an additional parameter, `in_reply_to_conversation_id`, which, when set, will set the visiblity to direct and address only the people who are the recipients of that Conversation.
|
The status posting endpoint takes an additional parameter, `in_reply_to_conversation_id`, which, when set, will set the visibility to direct and address only the people who are the recipients of that Conversation.
|
||||||
|
|
||||||
⚠ Conversation IDs can be found in direct messages with the `pleroma.direct_conversation_id` key, do not confuse it with `pleroma.conversation_id`.
|
⚠ Conversation IDs can be found in direct messages with the `pleroma.direct_conversation_id` key, do not confuse it with `pleroma.conversation_id`.
|
||||||
|
|
||||||
|
|
|
@ -20,16 +20,16 @@ Content-Type: multipart/form-data
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
- (required) `file`: The file being uploaded
|
- (required) `file`: The file being uploaded
|
||||||
- (optionnal) `description`: A plain-text description of the media, for accessibility purposes.
|
- (optional) `description`: A plain-text description of the media, for accessibility purposes.
|
||||||
|
|
||||||
Response: HTTP 201 Created with the object into the body, no `Location` header provided as it doesn't have an `id`
|
Response: HTTP 201 Created with the object into the body, no `Location` header provided as it doesn't have an `id`
|
||||||
|
|
||||||
The object given in the reponse should then be inserted into an Object's `attachment` field.
|
The object given in the response should then be inserted into an Object's `attachment` field.
|
||||||
|
|
||||||
## ChatMessages
|
## ChatMessages
|
||||||
|
|
||||||
`ChatMessage`s are the messages sent in 1-on-1 chats. They are similar to
|
`ChatMessage`s are the messages sent in 1-on-1 chats. They are similar to
|
||||||
`Note`s, but the addresing is done by having a single AP actor in the `to`
|
`Note`s, but the addressing is done by having a single AP actor in the `to`
|
||||||
field. Addressing multiple actors is not allowed. These messages are always
|
field. Addressing multiple actors is not allowed. These messages are always
|
||||||
private, there is no public version of them. They are created with a `Create`
|
private, there is no public version of them. They are created with a `Create`
|
||||||
activity.
|
activity.
|
||||||
|
|
|
@ -15,7 +15,7 @@ Pleroma requires some adjustments from the defaults for running the instance loc
|
||||||
2. Change the dev.secret.exs
|
2. Change the dev.secret.exs
|
||||||
* Change the scheme in `config :pleroma, Pleroma.Web.Endpoint` to http (see examples below)
|
* Change the scheme in `config :pleroma, Pleroma.Web.Endpoint` to http (see examples below)
|
||||||
* If you want to change other settings, you can do that too
|
* If you want to change other settings, you can do that too
|
||||||
3. You can now start the server `mix phx.server`. Once it's build and started, you can access the instance on `http://<host>:<port>` (e.g.http://localhost:4000 ) and should be able to do everything locally you normaly can.
|
3. You can now start the server `mix phx.server`. Once it's build and started, you can access the instance on `http://<host>:<port>` (e.g.http://localhost:4000 ) and should be able to do everything locally you normally can.
|
||||||
|
|
||||||
Example config to change the scheme to http. Change the port if you want to run on another port.
|
Example config to change the scheme to http. Change the port if you want to run on another port.
|
||||||
```elixir
|
```elixir
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
* PostgreSQL >=9.6
|
* PostgreSQL >=9.6
|
||||||
* Elixir >=1.11.0 <1.15
|
* Elixir >=1.11.0 <1.15
|
||||||
* Erlang OTP >=22.2.0 <26
|
* Erlang OTP >=22.2.0 (supported: <27)
|
||||||
* git
|
* git
|
||||||
* file / libmagic
|
* file / libmagic
|
||||||
* gcc or clang
|
* gcc or clang
|
||||||
|
|
|
@ -59,7 +59,7 @@ Gentoo quite pointedly does not come with a cron daemon installed, and as such i
|
||||||
|
|
||||||
If you would not like to install the optional packages, remove them from this line.
|
If you would not like to install the optional packages, remove them from this line.
|
||||||
|
|
||||||
If you're running this from a low-powered virtual machine, it should work though it will take some time. There were no issues on a VPS with a single core and 1GB of RAM; if you are using an even more limited device and run into issues, you can try creating a swapfile or use a more powerful machine running Gentoo to [cross build](https://wiki.gentoo.org/wiki/Cross_build_environment). If you have a wait ahead of you, now would be a good time to take a break, strech a bit, refresh your beverage of choice and/or get a snack, and reply to Arch users' posts with "I use Gentoo btw" as we do.
|
If you're running this from a low-powered virtual machine, it should work though it will take some time. There were no issues on a VPS with a single core and 1GB of RAM; if you are using an even more limited device and run into issues, you can try creating a swapfile or use a more powerful machine running Gentoo to [cross build](https://wiki.gentoo.org/wiki/Cross_build_environment). If you have a wait ahead of you, now would be a good time to take a break, stretch a bit, refresh your beverage of choice and/or get a snack, and reply to Arch users' posts with "I use Gentoo btw" as we do.
|
||||||
|
|
||||||
### Install PostgreSQL
|
### Install PostgreSQL
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ Not only does this make it much easier to deploy changes you make, as you can co
|
||||||
|
|
||||||
* Add a new system user for the Pleroma service and set up default directories:
|
* Add a new system user for the Pleroma service and set up default directories:
|
||||||
|
|
||||||
Remove `,wheel` if you do not want this user to be able to use `sudo`, however note that being able to `sudo` as the `pleroma` user will make finishing the insallation and common maintenence tasks somewhat easier:
|
Remove `,wheel` if you do not want this user to be able to use `sudo`, however note that being able to `sudo` as the `pleroma` user will make finishing the installation and common maintenance tasks somewhat easier:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# useradd -m -G users,wheel -s /bin/bash pleroma
|
# useradd -m -G users,wheel -s /bin/bash pleroma
|
||||||
|
|
|
@ -49,7 +49,7 @@ Gentoo quite pointedly does not come with a cron daemon installed, and as such i
|
||||||
|
|
||||||
If you would not like to install the optional packages, remove them from this line.
|
If you would not like to install the optional packages, remove them from this line.
|
||||||
|
|
||||||
If you're running this from a low-powered virtual machine, it should work though it will take some time. There were no issues on a VPS with a single core and 1GB of RAM; if you are using an even more limited device and run into issues, you can try creating a swapfile or use a more powerful machine running Gentoo to [cross build](https://wiki.gentoo.org/wiki/Cross_build_environment). If you have a wait ahead of you, now would be a good time to take a break, strech a bit, refresh your beverage of choice and/or get a snack, and reply to Arch users' posts with "I use Gentoo btw" as we do.
|
If you're running this from a low-powered virtual machine, it should work though it will take some time. There were no issues on a VPS with a single core and 1GB of RAM; if you are using an even more limited device and run into issues, you can try creating a swapfile or use a more powerful machine running Gentoo to [cross build](https://wiki.gentoo.org/wiki/Cross_build_environment). If you have a wait ahead of you, now would be a good time to take a break, stretch a bit, refresh your beverage of choice and/or get a snack, and reply to Arch users' posts with "I use Gentoo btw" as we do.
|
||||||
|
|
||||||
### Setup PostgreSQL
|
### Setup PostgreSQL
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ rcctl start postgresql
|
||||||
To check that it started properly and didn't fail right after starting, you can run `ps aux | grep postgres`, there should be multiple lines of output.
|
To check that it started properly and didn't fail right after starting, you can run `ps aux | grep postgres`, there should be multiple lines of output.
|
||||||
|
|
||||||
#### httpd
|
#### httpd
|
||||||
httpd will have three fuctions:
|
httpd will have three functions:
|
||||||
|
|
||||||
* redirect requests trying to reach the instance over http to the https URL
|
* redirect requests trying to reach the instance over http to the https URL
|
||||||
* serve a robots.txt file
|
* serve a robots.txt file
|
||||||
|
@ -225,7 +225,7 @@ pass in quick on $if inet6 proto icmp6 to ($if) icmp6-type { echoreq unreach par
|
||||||
pass in quick on $if proto tcp to ($if) port { http https } # relayd/httpd
|
pass in quick on $if proto tcp to ($if) port { http https } # relayd/httpd
|
||||||
pass in quick on $if proto tcp from $authorized_ssh_clients to ($if) port ssh
|
pass in quick on $if proto tcp from $authorized_ssh_clients to ($if) port ssh
|
||||||
```
|
```
|
||||||
Replace *<network interface\>* by your server's network interface name (which you can get with ifconfig). Consider replacing the content of the authorized\_ssh\_clients macro by, for exemple, your home IP address, to avoid SSH connection attempts from bots.
|
Replace *<network interface\>* by your server's network interface name (which you can get with ifconfig). Consider replacing the content of the authorized\_ssh\_clients macro by, for example, your home IP address, to avoid SSH connection attempts from bots.
|
||||||
|
|
||||||
Check pf's configuration by running `pfctl -nf /etc/pf.conf`, load it with `pfctl -f /etc/pf.conf` and enable pf at boot with `rcctl enable pf`.
|
Check pf's configuration by running `pfctl -nf /etc/pf.conf`, load it with `pfctl -f /etc/pf.conf` and enable pf at boot with `rcctl enable pf`.
|
||||||
|
|
||||||
|
|
|
@ -238,7 +238,7 @@ At this point if you open your (sub)domain in a browser you should see a 502 err
|
||||||
systemctl enable pleroma
|
systemctl enable pleroma
|
||||||
```
|
```
|
||||||
|
|
||||||
If everything worked, you should see Pleroma-FE when visiting your domain. If that didn't happen, try reviewing the installation steps, starting Pleroma in the foreground and seeing if there are any errrors.
|
If everything worked, you should see Pleroma-FE when visiting your domain. If that didn't happen, try reviewing the installation steps, starting Pleroma in the foreground and seeing if there are any errors.
|
||||||
|
|
||||||
Questions about the installation or didn’t it work as it should be, ask in [#pleroma:libera.chat](https://matrix.to/#/#pleroma:libera.chat) via Matrix or **#pleroma** on **libera.chat** via IRC, you can also [file an issue on our Gitlab](https://git.pleroma.social/pleroma/pleroma-support/issues/new).
|
Questions about the installation or didn’t it work as it should be, ask in [#pleroma:libera.chat](https://matrix.to/#/#pleroma:libera.chat) via Matrix or **#pleroma** on **libera.chat** via IRC, you can also [file an issue on our Gitlab](https://git.pleroma.social/pleroma/pleroma-support/issues/new).
|
||||||
|
|
||||||
|
|
|
@ -204,7 +204,7 @@
|
||||||
]}
|
]}
|
||||||
]},
|
]},
|
||||||
|
|
||||||
%% Following HTTP API is deprected, the new one abouve should be used instead
|
%% Following HTTP API is deprecated, the new one above should be used instead
|
||||||
|
|
||||||
{ {5288, "127.0.0.1"} , ejabberd_cowboy, [
|
{ {5288, "127.0.0.1"} , ejabberd_cowboy, [
|
||||||
{num_acceptors, 10},
|
{num_acceptors, 10},
|
||||||
|
@ -824,7 +824,7 @@
|
||||||
|
|
||||||
%% Enable archivization for private messages (default)
|
%% Enable archivization for private messages (default)
|
||||||
% {pm, [
|
% {pm, [
|
||||||
%% Top-level options can be overriden here if needed, for example:
|
%% Top-level options can be overridden here if needed, for example:
|
||||||
% {async_writer, false}
|
% {async_writer, false}
|
||||||
% ]},
|
% ]},
|
||||||
|
|
||||||
|
@ -834,7 +834,7 @@
|
||||||
%%
|
%%
|
||||||
% {muc, [
|
% {muc, [
|
||||||
% {host, "muc.@HOST@"}
|
% {host, "muc.@HOST@"}
|
||||||
%% As with pm, top-level options can be overriden for MUC archive
|
%% As with pm, top-level options can be overridden for MUC archive
|
||||||
% ]},
|
% ]},
|
||||||
%
|
%
|
||||||
%% Do not use a <stanza-id/> element (by default stanzaid is used)
|
%% Do not use a <stanza-id/> element (by default stanzaid is used)
|
||||||
|
|
|
@ -193,7 +193,7 @@ defmodule Mix.Tasks.Pleroma.Database do
|
||||||
"ALTER DATABASE #{db} SET default_text_search_config = '#{tsconfig}';"
|
"ALTER DATABASE #{db} SET default_text_search_config = '#{tsconfig}';"
|
||||||
)
|
)
|
||||||
|
|
||||||
# non-exist config will not raise excpetion but only give >0 messages
|
# non-exist config will not raise exception but only give >0 messages
|
||||||
if length(msg) > 0 do
|
if length(msg) > 0 do
|
||||||
shell_info("Error: #{inspect(msg, pretty: true)}")
|
shell_info("Error: #{inspect(msg, pretty: true)}")
|
||||||
else
|
else
|
||||||
|
|
|
@ -30,7 +30,7 @@ defmodule Mix.Tasks.Pleroma.Digest do
|
||||||
shell_info("Digest email have been sent to #{nickname} (#{user.email})")
|
shell_info("Digest email have been sent to #{nickname} (#{user.email})")
|
||||||
else
|
else
|
||||||
_ ->
|
_ ->
|
||||||
shell_info("Cound't find any mentions for #{nickname} since #{last_digest_emailed_at}")
|
shell_info("Couldn't find any mentions for #{nickname} since #{last_digest_emailed_at}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -61,7 +61,7 @@ defmodule Mix.Tasks.Pleroma.Ecto.Rollback do
|
||||||
Logger.configure(level: :info)
|
Logger.configure(level: :info)
|
||||||
|
|
||||||
if opts[:env] == "test" do
|
if opts[:env] == "test" do
|
||||||
Logger.info("Rollback succesfully")
|
Logger.info("Rollback successfully")
|
||||||
else
|
else
|
||||||
{:ok, _, _} =
|
{:ok, _, _} =
|
||||||
Ecto.Migrator.with_repo(Pleroma.Repo, &Ecto.Migrator.run(&1, path, :down, opts))
|
Ecto.Migrator.with_repo(Pleroma.Repo, &Ecto.Migrator.run(&1, path, :down, opts))
|
||||||
|
|
|
@ -111,7 +111,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do
|
||||||
|
|
||||||
{:ok, _} =
|
{:ok, _} =
|
||||||
:zip.unzip(binary_archive,
|
:zip.unzip(binary_archive,
|
||||||
cwd: pack_path,
|
cwd: String.to_charlist(pack_path),
|
||||||
file_list: files_to_unzip
|
file_list: files_to_unzip
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -292,7 +292,7 @@ defmodule Mix.Tasks.Pleroma.Instance do
|
||||||
|
|
||||||
if db_configurable? do
|
if db_configurable? do
|
||||||
shell_info(
|
shell_info(
|
||||||
" Please transfer your config to the database after running database migrations. Refer to \"Transfering the config to/from the database\" section of the docs for more information."
|
" Please transfer your config to the database after running database migrations. Refer to \"Transferring the config to/from the database\" section of the docs for more information."
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
@ -352,6 +352,4 @@ defmodule Mix.Tasks.Pleroma.Instance do
|
||||||
|
|
||||||
enabled_filters
|
enabled_filters
|
||||||
end
|
end
|
||||||
|
|
||||||
defp upload_filters(_), do: []
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,93 +0,0 @@
|
||||||
# Pleroma: A lightweight social networking server
|
|
||||||
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
defmodule Phoenix.Transports.WebSocket.Raw do
|
|
||||||
import Plug.Conn,
|
|
||||||
only: [
|
|
||||||
fetch_query_params: 1,
|
|
||||||
send_resp: 3
|
|
||||||
]
|
|
||||||
|
|
||||||
alias Phoenix.Socket.Transport
|
|
||||||
|
|
||||||
def default_config do
|
|
||||||
[
|
|
||||||
timeout: 60_000,
|
|
||||||
transport_log: false,
|
|
||||||
cowboy: Phoenix.Endpoint.CowboyWebSocket
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
def init(%Plug.Conn{method: "GET"} = conn, {endpoint, handler, transport}) do
|
|
||||||
{_, opts} = handler.__transport__(transport)
|
|
||||||
|
|
||||||
conn =
|
|
||||||
conn
|
|
||||||
|> fetch_query_params
|
|
||||||
|> Transport.transport_log(opts[:transport_log])
|
|
||||||
|> Transport.check_origin(handler, endpoint, opts)
|
|
||||||
|
|
||||||
case conn do
|
|
||||||
%{halted: false} = conn ->
|
|
||||||
case handler.connect(%{
|
|
||||||
endpoint: endpoint,
|
|
||||||
transport: transport,
|
|
||||||
options: [serializer: nil],
|
|
||||||
params: conn.params
|
|
||||||
}) do
|
|
||||||
{:ok, socket} ->
|
|
||||||
{:ok, conn, {__MODULE__, {socket, opts}}}
|
|
||||||
|
|
||||||
:error ->
|
|
||||||
send_resp(conn, :forbidden, "")
|
|
||||||
{:error, conn}
|
|
||||||
end
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
{:error, conn}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def init(conn, _) do
|
|
||||||
send_resp(conn, :bad_request, "")
|
|
||||||
{:error, conn}
|
|
||||||
end
|
|
||||||
|
|
||||||
def ws_init({socket, config}) do
|
|
||||||
Process.flag(:trap_exit, true)
|
|
||||||
{:ok, %{socket: socket}, config[:timeout]}
|
|
||||||
end
|
|
||||||
|
|
||||||
def ws_handle(op, data, state) do
|
|
||||||
state.socket.handler
|
|
||||||
|> apply(:handle, [op, data, state])
|
|
||||||
|> case do
|
|
||||||
{op, data} ->
|
|
||||||
{:reply, {op, data}, state}
|
|
||||||
|
|
||||||
{op, data, state} ->
|
|
||||||
{:reply, {op, data}, state}
|
|
||||||
|
|
||||||
%{} = state ->
|
|
||||||
{:ok, state}
|
|
||||||
|
|
||||||
_ ->
|
|
||||||
{:ok, state}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def ws_info({_, _} = tuple, state) do
|
|
||||||
{:reply, tuple, state}
|
|
||||||
end
|
|
||||||
|
|
||||||
def ws_info(_tuple, state), do: {:ok, state}
|
|
||||||
|
|
||||||
def ws_close(state) do
|
|
||||||
ws_handle(:closed, :normal, state)
|
|
||||||
end
|
|
||||||
|
|
||||||
def ws_terminate(reason, state) do
|
|
||||||
ws_handle(:closed, reason, state)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -28,7 +28,7 @@ defmodule Pleroma.Activity.HTML do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp add_cache_key_for(activity_id, additional_key) do
|
def add_cache_key_for(activity_id, additional_key) do
|
||||||
current = get_cache_keys_for(activity_id)
|
current = get_cache_keys_for(activity_id)
|
||||||
|
|
||||||
unless additional_key in current do
|
unless additional_key in current do
|
||||||
|
|
|
@ -9,7 +9,7 @@ defmodule Pleroma.Activity.Queries do
|
||||||
|
|
||||||
import Ecto.Query, only: [from: 2, where: 3]
|
import Ecto.Query, only: [from: 2, where: 3]
|
||||||
|
|
||||||
@type query :: Ecto.Queryable.t() | Activity.t()
|
@type query :: Ecto.Queryable.t() | Pleroma.Activity.t()
|
||||||
|
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
|
|
@ -23,19 +23,21 @@ defmodule Pleroma.Announcement do
|
||||||
timestamps(type: :utc_datetime)
|
timestamps(type: :utc_datetime)
|
||||||
end
|
end
|
||||||
|
|
||||||
def change(struct, params \\ %{}) do
|
@doc "Generates changeset for %Pleroma.Announcement{}"
|
||||||
struct
|
@spec changeset(%__MODULE__{}, map()) :: %Ecto.Changeset{}
|
||||||
|> cast(validate_params(struct, params), [:data, :starts_at, :ends_at, :rendered])
|
def changeset(announcement \\ %__MODULE__{}, params \\ %{data: %{}}) do
|
||||||
|
announcement
|
||||||
|
|> cast(validate_params(announcement, params), [:data, :starts_at, :ends_at, :rendered])
|
||||||
|> validate_required([:data])
|
|> validate_required([:data])
|
||||||
end
|
end
|
||||||
|
|
||||||
defp validate_params(struct, params) do
|
defp validate_params(announcement, params) do
|
||||||
base_data =
|
base_data =
|
||||||
%{
|
%{
|
||||||
"content" => "",
|
"content" => "",
|
||||||
"all_day" => false
|
"all_day" => false
|
||||||
}
|
}
|
||||||
|> Map.merge((struct && struct.data) || %{})
|
|> Map.merge((announcement && announcement.data) || %{})
|
||||||
|
|
||||||
merged_data =
|
merged_data =
|
||||||
Map.merge(base_data, params.data)
|
Map.merge(base_data, params.data)
|
||||||
|
@ -61,13 +63,13 @@ defmodule Pleroma.Announcement do
|
||||||
end
|
end
|
||||||
|
|
||||||
def add(params) do
|
def add(params) do
|
||||||
changeset = change(%__MODULE__{}, params)
|
changeset = changeset(%__MODULE__{}, params)
|
||||||
|
|
||||||
Repo.insert(changeset)
|
Repo.insert(changeset)
|
||||||
end
|
end
|
||||||
|
|
||||||
def update(announcement, params) do
|
def update(announcement, params) do
|
||||||
changeset = change(announcement, params)
|
changeset = changeset(announcement, params)
|
||||||
|
|
||||||
Repo.update(changeset)
|
Repo.update(changeset)
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,7 +14,6 @@ defmodule Pleroma.Application do
|
||||||
@name Mix.Project.config()[:name]
|
@name Mix.Project.config()[:name]
|
||||||
@version Mix.Project.config()[:version]
|
@version Mix.Project.config()[:version]
|
||||||
@repository Mix.Project.config()[:source_url]
|
@repository Mix.Project.config()[:source_url]
|
||||||
@mix_env Mix.env()
|
|
||||||
|
|
||||||
def name, do: @name
|
def name, do: @name
|
||||||
def version, do: @version
|
def version, do: @version
|
||||||
|
@ -98,7 +97,7 @@ defmodule Pleroma.Application do
|
||||||
{Task.Supervisor, name: Pleroma.TaskSupervisor}
|
{Task.Supervisor, name: Pleroma.TaskSupervisor}
|
||||||
] ++
|
] ++
|
||||||
cachex_children() ++
|
cachex_children() ++
|
||||||
http_children(adapter, @mix_env) ++
|
http_children(adapter) ++
|
||||||
[
|
[
|
||||||
Pleroma.Stats,
|
Pleroma.Stats,
|
||||||
Pleroma.JobQueueMonitor,
|
Pleroma.JobQueueMonitor,
|
||||||
|
@ -106,8 +105,9 @@ defmodule Pleroma.Application do
|
||||||
{Oban, Config.get(Oban)},
|
{Oban, Config.get(Oban)},
|
||||||
Pleroma.Web.Endpoint
|
Pleroma.Web.Endpoint
|
||||||
] ++
|
] ++
|
||||||
task_children(@mix_env) ++
|
task_children() ++
|
||||||
dont_run_in_test(@mix_env) ++
|
streamer_registry() ++
|
||||||
|
background_migrators() ++
|
||||||
shout_child(shout_enabled?()) ++
|
shout_child(shout_enabled?()) ++
|
||||||
[Pleroma.Gopher.Server]
|
[Pleroma.Gopher.Server]
|
||||||
|
|
||||||
|
@ -116,12 +116,7 @@ defmodule Pleroma.Application do
|
||||||
# If we have a lot of caches, default max_restarts can cause test
|
# If we have a lot of caches, default max_restarts can cause test
|
||||||
# resets to fail.
|
# resets to fail.
|
||||||
# Go for the default 3 unless we're in test
|
# Go for the default 3 unless we're in test
|
||||||
max_restarts =
|
max_restarts = Application.get_env(:pleroma, __MODULE__)[:max_restarts]
|
||||||
if @mix_env == :test do
|
|
||||||
100
|
|
||||||
else
|
|
||||||
3
|
|
||||||
end
|
|
||||||
|
|
||||||
opts = [strategy: :one_for_one, name: Pleroma.Supervisor, max_restarts: max_restarts]
|
opts = [strategy: :one_for_one, name: Pleroma.Supervisor, max_restarts: max_restarts]
|
||||||
result = Supervisor.start_link(children, opts)
|
result = Supervisor.start_link(children, opts)
|
||||||
|
@ -159,7 +154,7 @@ defmodule Pleroma.Application do
|
||||||
raise "Invalid custom modules"
|
raise "Invalid custom modules"
|
||||||
|
|
||||||
{:ok, modules, _warnings} ->
|
{:ok, modules, _warnings} ->
|
||||||
if @mix_env != :test do
|
if Application.get_env(:pleroma, __MODULE__)[:load_custom_modules] do
|
||||||
Enum.each(modules, fn mod ->
|
Enum.each(modules, fn mod ->
|
||||||
Logger.info("Custom module loaded: #{inspect(mod)}")
|
Logger.info("Custom module loaded: #{inspect(mod)}")
|
||||||
end)
|
end)
|
||||||
|
@ -213,9 +208,8 @@ defmodule Pleroma.Application do
|
||||||
|
|
||||||
defp shout_enabled?, do: Config.get([:shout, :enabled])
|
defp shout_enabled?, do: Config.get([:shout, :enabled])
|
||||||
|
|
||||||
defp dont_run_in_test(env) when env in [:test, :benchmark], do: []
|
defp streamer_registry do
|
||||||
|
if Application.get_env(:pleroma, __MODULE__)[:streamer_registry] do
|
||||||
defp dont_run_in_test(_) do
|
|
||||||
[
|
[
|
||||||
{Registry,
|
{Registry,
|
||||||
[
|
[
|
||||||
|
@ -223,14 +217,21 @@ defmodule Pleroma.Application do
|
||||||
keys: :duplicate,
|
keys: :duplicate,
|
||||||
partitions: System.schedulers_online()
|
partitions: System.schedulers_online()
|
||||||
]}
|
]}
|
||||||
] ++ background_migrators()
|
]
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp background_migrators do
|
defp background_migrators do
|
||||||
|
if Application.get_env(:pleroma, __MODULE__)[:background_migrators] do
|
||||||
[
|
[
|
||||||
Pleroma.Migrators.HashtagsTableMigrator,
|
Pleroma.Migrators.HashtagsTableMigrator,
|
||||||
Pleroma.Migrators.ContextObjectsDeletionMigrator
|
Pleroma.Migrators.ContextObjectsDeletionMigrator
|
||||||
]
|
]
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp shout_child(true) do
|
defp shout_child(true) do
|
||||||
|
@ -242,37 +243,43 @@ defmodule Pleroma.Application do
|
||||||
|
|
||||||
defp shout_child(_), do: []
|
defp shout_child(_), do: []
|
||||||
|
|
||||||
defp task_children(:test) do
|
defp task_children do
|
||||||
[
|
children = [
|
||||||
%{
|
%{
|
||||||
id: :web_push_init,
|
id: :web_push_init,
|
||||||
start: {Task, :start_link, [&Pleroma.Web.Push.init/0]},
|
start: {Task, :start_link, [&Pleroma.Web.Push.init/0]},
|
||||||
restart: :temporary
|
restart: :temporary
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
end
|
|
||||||
|
|
||||||
defp task_children(_) do
|
if Application.get_env(:pleroma, __MODULE__)[:internal_fetch] do
|
||||||
|
children ++
|
||||||
[
|
[
|
||||||
%{
|
|
||||||
id: :web_push_init,
|
|
||||||
start: {Task, :start_link, [&Pleroma.Web.Push.init/0]},
|
|
||||||
restart: :temporary
|
|
||||||
},
|
|
||||||
%{
|
%{
|
||||||
id: :internal_fetch_init,
|
id: :internal_fetch_init,
|
||||||
start: {Task, :start_link, [&Pleroma.Web.ActivityPub.InternalFetchActor.init/0]},
|
start: {Task, :start_link, [&Pleroma.Web.ActivityPub.InternalFetchActor.init/0]},
|
||||||
restart: :temporary
|
restart: :temporary
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
else
|
||||||
|
children
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# start hackney and gun pools in tests
|
# start hackney and gun pools in tests
|
||||||
defp http_children(_, :test) do
|
defp http_children(adapter) do
|
||||||
http_children(Tesla.Adapter.Hackney, nil) ++ http_children(Tesla.Adapter.Gun, nil)
|
if Application.get_env(:pleroma, __MODULE__)[:test_http_pools] do
|
||||||
|
http_children_hackney() ++ http_children_gun()
|
||||||
|
else
|
||||||
|
cond do
|
||||||
|
match?(Tesla.Adapter.Hackney, adapter) -> http_children_hackney()
|
||||||
|
match?(Tesla.Adapter.Gun, adapter) -> http_children_gun()
|
||||||
|
true -> []
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp http_children(Tesla.Adapter.Hackney, _) do
|
defp http_children_hackney do
|
||||||
pools = [:federation, :media]
|
pools = [:federation, :media]
|
||||||
|
|
||||||
pools =
|
pools =
|
||||||
|
@ -288,13 +295,11 @@ defmodule Pleroma.Application do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp http_children(Tesla.Adapter.Gun, _) do
|
defp http_children_gun do
|
||||||
Pleroma.Gun.ConnectionPool.children() ++
|
Pleroma.Gun.ConnectionPool.children() ++
|
||||||
[{Task, &Pleroma.HTTP.AdapterHelper.Gun.limiter_setup/0}]
|
[{Task, &Pleroma.HTTP.AdapterHelper.Gun.limiter_setup/0}]
|
||||||
end
|
end
|
||||||
|
|
||||||
defp http_children(_, _), do: []
|
|
||||||
|
|
||||||
@spec limiters_setup() :: :ok
|
@spec limiters_setup() :: :ok
|
||||||
def limiters_setup do
|
def limiters_setup do
|
||||||
config = Config.get(ConcurrentLimiter, [])
|
config = Config.get(ConcurrentLimiter, [])
|
||||||
|
|
|
@ -7,7 +7,10 @@ defmodule Pleroma.ApplicationRequirements do
|
||||||
The module represents the collection of validations to runs before start server.
|
The module represents the collection of validations to runs before start server.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
defmodule VerifyError, do: defexception([:message])
|
defmodule VerifyError do
|
||||||
|
defexception([:message])
|
||||||
|
@type t :: %__MODULE__{}
|
||||||
|
end
|
||||||
|
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.Helpers.MediaHelper
|
alias Pleroma.Helpers.MediaHelper
|
||||||
|
@ -193,8 +196,6 @@ defmodule Pleroma.ApplicationRequirements do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp check_system_commands!(result), do: result
|
|
||||||
|
|
||||||
defp check_repo_pool_size!(:ok) do
|
defp check_repo_pool_size!(:ok) do
|
||||||
if Pleroma.Config.get([Pleroma.Repo, :pool_size], 10) != 10 and
|
if Pleroma.Config.get([Pleroma.Repo, :pool_size], 10) != 10 and
|
||||||
not Pleroma.Config.get([:dangerzone, :override_repo_pool_size], false) do
|
not Pleroma.Config.get([:dangerzone, :override_repo_pool_size], false) do
|
||||||
|
|
|
@ -22,8 +22,8 @@ defmodule Pleroma.Bookmark do
|
||||||
timestamps()
|
timestamps()
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec create(FlakeId.Ecto.CompatType.t(), FlakeId.Ecto.CompatType.t()) ::
|
@spec create(Ecto.UUID.t(), Ecto.UUID.t()) ::
|
||||||
{:ok, Bookmark.t()} | {:error, Changeset.t()}
|
{:ok, Bookmark.t()} | {:error, Ecto.Changeset.t()}
|
||||||
def create(user_id, activity_id) do
|
def create(user_id, activity_id) do
|
||||||
attrs = %{
|
attrs = %{
|
||||||
user_id: user_id,
|
user_id: user_id,
|
||||||
|
@ -37,7 +37,7 @@ defmodule Pleroma.Bookmark do
|
||||||
|> Repo.insert()
|
|> Repo.insert()
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec for_user_query(FlakeId.Ecto.CompatType.t()) :: Ecto.Query.t()
|
@spec for_user_query(Ecto.UUID.t()) :: Ecto.Query.t()
|
||||||
def for_user_query(user_id) do
|
def for_user_query(user_id) do
|
||||||
Bookmark
|
Bookmark
|
||||||
|> where(user_id: ^user_id)
|
|> where(user_id: ^user_id)
|
||||||
|
@ -52,8 +52,8 @@ defmodule Pleroma.Bookmark do
|
||||||
|> Repo.one()
|
|> Repo.one()
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec destroy(FlakeId.Ecto.CompatType.t(), FlakeId.Ecto.CompatType.t()) ::
|
@spec destroy(Ecto.UUID.t(), Ecto.UUID.t()) ::
|
||||||
{:ok, Bookmark.t()} | {:error, Changeset.t()}
|
{:ok, Bookmark.t()} | {:error, Ecto.Changeset.t()}
|
||||||
def destroy(user_id, activity_id) do
|
def destroy(user_id, activity_id) do
|
||||||
from(b in Bookmark,
|
from(b in Bookmark,
|
||||||
where: b.user_id == ^user_id,
|
where: b.user_id == ^user_id,
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue