pleroma issueshttps://git.pleroma.social/pleroma/pleroma/-/issues2023-05-08T01:26:08Zhttps://git.pleroma.social/pleroma/pleroma/-/issues/2820Revoking oauth tokens should require password2023-05-08T01:26:08ZtusooaRevoking oauth tokens should require passwordAs title, or an evil client can just keep listing tokens and removing everything except its own.As title, or an evil client can just keep listing tokens and removing everything except its own.https://git.pleroma.social/pleroma/pleroma/-/issues/2814Alternative domains support2023-05-08T01:30:13ZtusooaAlternative domains supportAs in https://docs.joinmastodon.org/admin/config/#basic :
> ALTERNATE_DOMAINS
>
> If you have multiple domains pointed at your Mastodon server, this setting will allow Mastodon to recognize itself when users are addressed using those ot...As in https://docs.joinmastodon.org/admin/config/#basic :
> ALTERNATE_DOMAINS
>
> If you have multiple domains pointed at your Mastodon server, this setting will allow Mastodon to recognize itself when users are addressed using those other domains. Separate the domains by commas, e.g. foo.com,bar.com
Current situation is we can run another frontend at another domain (e.g. Soapbox) by purely calling the API at that domain, but the main domain is still required for things like media proxy.https://git.pleroma.social/pleroma/pleroma/-/issues/2811tzdata and releases2023-05-08T01:31:19Zfeldtzdata and releasesWhere do we store tzdata at for releases? It appears we're shipping an incompatible configuration.
> The library uses a file directory to store data. By default this directory is priv. In some cases you might want to use a different dir...Where do we store tzdata at for releases? It appears we're shipping an incompatible configuration.
> The library uses a file directory to store data. By default this directory is priv. In some cases you might want to use a different directory. For instance when using releases this is recommended. If so, create the directory and make sure Elixir can read and write to it. Then use elixir config files like this to tell Tzdata to use that directory:
https://hexdocs.pm/tzdata/readme.html#data-directory-and-releaseshttps://git.pleroma.social/pleroma/pleroma/-/issues/2808Erratic tests2023-05-08T01:21:58ZAlex GleasonErratic testsI'm going to track when the CI fails in this issue to see if they should be tagged with `@tag :erratic`
First one:
```elixir
1) test direct streams it sends conversation update to the 'direct' stream when a message is deleted (Plerom...I'm going to track when the CI fails in this issue to see if they should be tagged with `@tag :erratic`
First one:
```elixir
1) test direct streams it sends conversation update to the 'direct' stream when a message is deleted (Pleroma.Web.StreamerTest)
test/pleroma/web/streamer_test.exs:775
No message matching {:text, received_conversation1} after 100ms.
The process mailbox is empty.
code: assert_receive {:text, received_conversation1}
stacktrace:
test/pleroma/web/streamer_test.exs:797: (test)
The following output was logged:
[debug] QUERY OK db=0.5ms queue=0.1ms
begin []
```https://git.pleroma.social/pleroma/pleroma/-/issues/2806CHANGELOG.md is unreliable for changelogs2023-05-08T01:31:57Za1batrossa1ba.omarov@gmail.comCHANGELOG.md is unreliable for changelogsPatches that older than one release, append changelog entry to existing release.
For example, !3480 is a 5 months old patch that got just merged to `develop` branch but after merge but it's changelog entry applied to 2.4.1 release.
Ma...Patches that older than one release, append changelog entry to existing release.
For example, !3480 is a 5 months old patch that got just merged to `develop` branch but after merge but it's changelog entry applied to 2.4.1 release.
Maybe unreleased changelog should be maintained through separate file and then copied to main CHANGELOG.md on each release?https://git.pleroma.social/pleroma/pleroma/-/issues/2805Ampersand in a link got replaced by the HTML entity2023-05-08T01:30:04ZMinoruAmpersand in a link got replaced by the HTML entityI'm on a server that runs the following versions:
- Backend version: 2.4.51-1957-gec41de22-emr-develop
- Frontend version: ea0887a1
I sent a DM with this link: https://www.webtoons.com/en/challenge/whats-up-beanie/bike-ride/viewer?title...I'm on a server that runs the following versions:
- Backend version: 2.4.51-1957-gec41de22-emr-develop
- Frontend version: ea0887a1
I sent a DM with this link: https://www.webtoons.com/en/challenge/whats-up-beanie/bike-ride/viewer?title_no=295880&episode_no=394 It's rendered correctly, but the `href` attribute has ampersand replaced by the HTML entity: https://www.webtoons.com/en/challenge/whats-up-beanie/bike-ride/viewer?title_no=295880&episode_no=394 (note how `&` got replaced by `&`). This breaks the link.https://git.pleroma.social/pleroma/pleroma/-/issues/2803Following relationship inconsistency2023-11-08T16:33:46ZtusooaFollowing relationship inconsistency<!--
### Precheck
* For support use https://git.pleroma.social/pleroma/pleroma-support or [community channels](https://git.pleroma.social/pleroma/pleroma#community-channels).
* Please do a quick search to ensure no similar bug has been ...<!--
### Precheck
* For support use https://git.pleroma.social/pleroma/pleroma-support or [community channels](https://git.pleroma.social/pleroma/pleroma#community-channels).
* Please do a quick search to ensure no similar bug has been reported before. If the bug has not been addressed after 2 weeks, it's fine to bump it.
* Try to ensure that the bug is actually related to the Pleroma backend. For example, if a bug happens in Pleroma-FE but not in Mastodon-FE or mobile clients, it's likely that the bug should be filed in [Pleroma-FE](https://git.pleroma.social/pleroma/pleroma-fe/issues/new) repository.
-->
### Environment
* Installation type (OTP or From Source): OTP
* Pleroma version (could be found in the "Version" tab of settings in Pleroma-FE): 2.4.1 https://lily.kazv.moe/infra/pleroma/-/commit/182d2d2b9
* Elixir version (`elixir -v` for from source installations, N/A for OTP): N/A
* Operating system: Docker image, host system = Ubuntu 20.04
* PostgreSQL version (`psql -V`): 13.5
### Bug description
In frontend, some users are shown as if you are following them, but they are not in your following list. In https://git.pleroma.social/pleroma/pleroma/-/issues/2802 , I analysed this as the `Follow` Activity not being updated properly.
`/opt/pleroma/bin/pleroma remote`, then
```
t = Pleroma.User.get_by_nickname("tusooa")
import Ecto.Query
q = Pleroma.Activity.Queries.by_type("Follow") |> Pleroma.Activity.Queries.by_actor(t.ap_id) |> where(fragment("data->>'state' = 'accept'"))
as = q |> Pleroma.Repo.all()
apIds = as |> Enum.map(fn a -> a.data["object"] end) |> Enum.filter(fn a -> a end)
folUsers = apIds |> Enum.map(fn id -> Pleroma.User.get_by_ap_id(id) end) |> Enum.filter(fn a -> a end)
problematic = folUsers |> Enum.filter(fn u -> if !Pleroma.User.following?(t, u) do Pleroma.User.get_follow_state(t, u) == :follow_accept else nil end end)
probIds = problematic |> Enum.map(fn u -> u.ap_id end)
```
One part of the inconsistency is due to user migration. On `develop`, `Repo.delete(following_relationship)` was run instead of the full unfollow process.
Another part is due to #2802 .
Another question to ask is: should we really use `follow_state == :follow_accept` without guarding (`Pleroma.User.following?(one, another)`) to judge whether one is following another?https://git.pleroma.social/pleroma/pleroma/-/issues/2801migrate_local doesn't work for config in database?2023-05-08T01:33:06Zshironekomigrate_local doesn't work for config in database?I first tried to setup S3 in database first using the admin webui, and run the migrate which didn't work because the uploads folder it got was wrong. So I set the uploader back to local, and run again, which fails also because it can't g...I first tried to setup S3 in database first using the admin webui, and run the migrate which didn't work because the uploads folder it got was wrong. So I set the uploader back to local, and run again, which fails also because it can't get S33 config. so I tried to put S3 config in config.exs, which gave this the following error.
```
Migrating files from local /srv/pleroma/uploads to Elixir.Pleroma.Uploaders.S3
Found 2844 uploads
** (EXIT from #PID<0.98.0>) an exception was raised:
** (FunctionClauseError) no function clause matching in IO.chardata_to_string/1
(elixir 1.10.3) lib/io.ex:572: IO.chardata_to_string(nil)
(elixir 1.10.3) lib/path.ex:520: Path.join/2
(elixir 1.10.3) lib/path.ex:491: Path.join/1
lib/pleroma/upload.ex:144: Pleroma.Upload.get_opts/1
lib/pleroma/upload.ex:79: Pleroma.Upload.store/2
lib/mix/tasks/pleroma/uploads.ex:78: anonymous fn/3 in Mix.Tasks.Pleroma.Uploads.run/1
(elixir 1.10.3) lib/task/supervised.ex:90: Task.Supervised.invoke_mfa/2
(elixir 1.10.3) lib/task/supervised.ex:35: Task.Supervised.reply/5
```https://git.pleroma.social/pleroma/pleroma/-/issues/2797Deploy custom libraries to Hex2023-05-08T01:30:28ZAlex GleasonDeploy custom libraries to HexThe following deps are pulled from Pleroma's GitLab:
```elixir
{:prometheus_ex,
git: "https://git.pleroma.social/pleroma/elixir-libraries/prometheus.ex.git",
ref: "a4e9beb3c1c479d14b352fd9d6dd7b1f6d7deee5",
{:prometheus_phx,
git: "ht...The following deps are pulled from Pleroma's GitLab:
```elixir
{:prometheus_ex,
git: "https://git.pleroma.social/pleroma/elixir-libraries/prometheus.ex.git",
ref: "a4e9beb3c1c479d14b352fd9d6dd7b1f6d7deee5",
{:prometheus_phx,
git: "https://git.pleroma.social/pleroma/elixir-libraries/prometheus-phx.git",
branch: "no-logging"},
{:concurrent_limiter,
git: "https://git.pleroma.social/pleroma/elixir-libraries/concurrent_limiter.git",
ref: "d81be41024569330f296fc472e24198d7499ba78"},
{:remote_ip,
git: "https://git.pleroma.social/pleroma/remote_ip.git",
ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"},
{:captcha,
git: "https://git.pleroma.social/pleroma/elixir-libraries/elixir-captcha.git",
ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"},
{:majic,
git: "https://git.pleroma.social/pleroma/elixir-libraries/majic.git",
ref: "289cda1b6d0d70ccb2ba508a2b0bd24638db2880"},
```
A few weeks ago Pleroma's GitLab went offline and **it broke Pleroma installations**, since `mix deps.get` could not succeed.
In my downstream repo, I copied over all the deps and switched them to gitlab.com: https://gitlab.com/soapbox-pub/soapbox/-/commit/d131247ff34168abfaff8206fefbf101a765f908
But this makes merging harder. Ideally we all pull this stuff from Hex.https://git.pleroma.social/pleroma/pleroma/-/issues/2795small fix for elixir 1.132023-05-08T01:33:19Zfaried nawazsmall fix for elixir 1.13### Environment
* Installation type (OTP or From Source): Source
* Pleroma version (could be found in the "Version" tab of settings in Pleroma-FE): 2.4.51-185-g613f55b0-develop
* Elixir version (`elixir -v` for from source installations...### Environment
* Installation type (OTP or From Source): Source
* Pleroma version (could be found in the "Version" tab of settings in Pleroma-FE): 2.4.51-185-g613f55b0-develop
* Elixir version (`elixir -v` for from source installations, N/A for OTP): Elixir 1.13.0 (compiled with Erlang/OTP 24) -- asdf
* Operating system: Ubuntu 20.04
* PostgreSQL version (`psql -V`): 13.5
### Bug description
Building with Elixir 1.13.0 fails with
```
warning: variable "result" does not exist and is being expanded to "result()", please use parentheses to remove the ambiguity or change the variable name
lib/pleroma/web/activity_pub/publisher.ex:82: Pleroma.Web.ActivityPub.Publisher.publish_one/1
warning: variable "result" is unused (if the variable is not meant to be used, prefix it with an underscore)
lib/pleroma/web/activity_pub/publisher.ex:67: Pleroma.Web.ActivityPub.Publisher.publish_one/1
== Compilation error in file lib/pleroma/web/activity_pub/publisher.ex ==
** (CompileError) lib/pleroma/web/activity_pub/publisher.ex:82: undefined function result/0 (expected Pleroma.Web.ActivityPub.Publisher to define such a function or for it to be imported, but none are available)
```
Fix:
```diff
--- a/lib/pleroma/web/activity_pub/publisher.ex
+++ b/lib/pleroma/web/activity_pub/publisher.ex
@@ -63,8 +63,7 @@ def publish_one(%{inbox: inbox, json: json, actor: %User{} = actor, id: id} = pa
date: date
})
- with {:ok, %{status: code}} when code in 200..299 <-
- result =
+ with {:ok, %{status: code} = result} when code in 200..299 <-
HTTP.post(
inbox,
json,
```https://git.pleroma.social/pleroma/pleroma/-/issues/2793Slow queries2024-02-15T01:07:49ZAlex GleasonSlow queriesUsing !3553 I'm finding some slow queries. Note that I have **omitted Oban queries**, so everything here is running as part of the request/response cycle pretty much.
Tracebacks are against this commit: https://gitlab.com/soapbox-pub/so...Using !3553 I'm finding some slow queries. Note that I have **omitted Oban queries**, so everything here is running as part of the request/response cycle pretty much.
Tracebacks are against this commit: https://gitlab.com/soapbox-pub/soapbox/-/tree/94eb61e8550c441afcfd293190b553373ae0b548
Home timeline:
```
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.429 request_id=Fr4zyQTR03rNmNkACO_j [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 353378.574ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT a0.\"id\", a0.\"data\", a0.\"local\", a0.\"actor\", a0.\"recipients\", a0.\"inserted_at\", a0.\"updated_at\", b2.\"id\", b2.\"user_id\", b2.\"activity_id\", b2.\"inserted_at\", b2.\"updated_at\", o1.\"id\", o1.\"data\", o1.\"inserted_at\", o1.\"updated_at\", NOT (t3.\"id\" IS NULL) FROM \"activities\" AS a0 INNER JOIN \"objects\" AS o1 ON (o1.\"data\"->>'id') = COALESCE(a0.\"data\"->'object'->>'id', a0.\"data\"->>'object') LEFT OUTER JOIN \"bookmarks\" AS b2 ON (b2.\"user_id\" = $1) AND (b2.\"activity_id\" = a0.\"id\") LEFT OUTER JOIN \"thread_mutes\" AS t3 ON (t3.\"user_id\" = $2) AND (t3.\"context\" = a0.\"data\"->>'context') WHERE ((($3 && a0.\"recipients\")) OR (a0.\"actor\" = $4)) AND (a0.\"data\"->>'type' = ANY($5)) AND (not (a0.\"actor\" = ANY($6))) AND (((not (a0.\"recipients\" && $7)) or a0.\"actor\" = $8)) AND ((recipients_contain_blocked_domains(a0.\"recipients\", $9) = false) or a0.\"actor\" = $10) AND (not (a0.\"data\"->>'type' = 'Announce' and a0.\"data\"->'to' ?| $11)) AND ((not (split_part(a0.\"actor\", '/', 3) = ANY($12))) or a0.\"actor\" = ANY($13)) AND ((not (split_part(o1.\"data\"->>'actor', '/', 3) = ANY($14))) or (o1.\"data\"->>'actor') = ANY($15)) AND (not (a0.\"actor\" = ANY($16))) AND (not (a0.\"data\"->>'type' = 'Announce' and a0.\"data\"->'to' ?| $17)) AND (not (a0.\"actor\" = ANY($18))) AND (not (a0.\"data\"->'to' ?| $19) or a0.\"actor\" = $20) AND (t3.\"user_id\" IS NULL) AND (not ( a0.\"data\"->>'type' = 'Announce' and a0.\"actor\" = ANY($21))) AND (a0.\"data\"->>'type' != 'Announce' or o1.\"data\"->>'actor' != $22) AND (NOT (a0.\"actor\" = ANY($23))) AND (not(o1.\"data\"->>'type' = 'Answer')) AND (not(o1.\"data\"->>'type' = 'ChatMessage')) AND (NOT (a0.\"actor\" = ANY($24))) ORDER BY a0.\"id\" desc nulls last LIMIT $25"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Pagination, :fetch_paginated, 4,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/pagination.ex', line: 40]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.ActivityPub, :fetch_activities, 3,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/activity_pub.ex', line: 492]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :home, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 56
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :action, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :phoenix_controller_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :plug_builder_call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
Home timeline again? This time in StatusView:
```
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.451 request_id=Fr4zyQTR03rNmNkACO_j [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 6723.929ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT a0.\"id\", a0.\"data\", a0.\"local\", a0.\"actor\", a0.\"recipients\", a0.\"inserted_at\", a0.\"updated_at\", o1.\"id\", o1.\"data\", o1.\"inserted_at\", o1.\"updated_at\" FROM \"activities\" AS a0 INNER JOIN \"objects\" AS o1 ON (o1.\"data\"->>'id') = COALESCE(a0.\"data\"->'object'->>'id', a0.\"data\"->>'object') WHERE (coalesce((a0.\"data\")->'object'->>'id', (a0.\"data\")->>'object') = ANY($1)) AND ((a0.\"data\")->>'type' = $2)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :get_replied_to_activities, 1,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 55]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :render, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 93]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :action, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :phoenix_controller_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :plug_builder_call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
More stuff in StatusView...
```
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 8229.138ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT a0.\"id\", a0.\"data\", a0.\"local\", a0.\"actor\", a0.\"recipients\", a0.\"inserted_at\", a0.\"updated_at\", b2.\"id\", b2.\"user_id\", b2.\
"activity_id\", b2.\"inserted_at\", b2.\"updated_at\", o1.\"id\", o1.\"data\", o1.\"inserted_at\", o1.\"updated_at\", NOT (t3.\"id\" IS NULL) FROM \"activities\" AS a0 LEFT OUTER JOIN \"obje
cts\" AS o1 ON (o1.\"data\"->>'id') = COALESCE(a0.\"data\"->'object'->>'id', a0.\"data\"->>'object') LEFT OUTER JOIN \"bookmarks\" AS b2 ON (b2.\"user_id\" = $1) AND (b2.\"activity_id\" = a0
.\"id\") LEFT OUTER JOIN \"thread_mutes\" AS t3 ON (t3.\"user_id\" = $2) AND (t3.\"context\" = a0.\"data\"->>'context') WHERE (coalesce((a0.\"data\")->'object'->>'id', (a0.\"data\")->>'objec
t') = ANY($3)) AND ((a0.\"data\")->>'type' = $4)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :render, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 103]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :action, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :phoenix_controller_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :plug_builder_call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
Oh look, StatusView.
```
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 4183.351ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT u0.\"relationship_type\", u0.\"source_id\", u0.\"target_id\" FROM \"user_relationships\" AS u0 WHERE ((source_id = ANY($1) AND target_id = ANY($2) AND relationship_type = ANY($3)) OR (source_id = ANY($4) AND target_id = ANY($5) AND relationship_type = ANY($6)))"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.UserRelationship, :view_relationships_option, 3,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/user_relationship.ex', line: 170]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :render, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 120]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :action, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :phoenix_controller_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :plug_builder_call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Endpoint, :call, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/endpoint.ex', line: 5]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
Apparently instance favicons are very slow @lanodan
```
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.489 [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 16620.625ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT a0.\"id\", a0.\"data\", a0.\"local\", a0.\"actor\", a0.\"recipients\", a0.\"inserted_at\", a0.\"updated_at\", o1.\"id\", o1.\"data\", o1.\"inserted_at\", o1.\"updated_at\" FROM \"activities\" AS a0 LEFT OUTER JOIN \"objects\" AS o1 ON (o1.\"data\"->>'id') = COALESCE(a0.\"data\"->'object'->>'id', a0.\"data\"->>'object') WHERE ((a0.\"data\")->>'id' = $1)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Federator, :perform, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/federator.ex', line: 81]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.494 request_id=Fr4zyQTR03rNmNkACO_j [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 1814.651ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT i0.\"id\", i0.\"host\", i0.\"unreachable_since\", i0.\"favicon\", i0.\"favicon_updated_at\", i0.\"inserted_at\", i0.\"updated_at\" FROM \"instances\" AS i0 WHERE (i0.\"host\" = $1)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Instances.Instance, :get_or_update_favicon, 1,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/instances/instance.ex', line: 142]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.AccountView, :do_render, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/account_view.ex', line: 230]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :render, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 343]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :safe_render, 3,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 6]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :safe_render_many, 4,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 6]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
StatusView & FollowingRelationship again:
```
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.502 request_id=Fr4zyQTR03rNmNkACO_j [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 4029.287ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT u1.\"follower_address\" FROM \"following_relationships\" AS f0 INNER JOIN \"users\" AS u1 ON f0.\"following_id\" = u1.\"id\" WHERE (f0.\"follower_id\" = $1) AND (f0.\"state\" = $2)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.FollowingRelationship, :following, 1,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/following_relationship.ex', line: 183]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Visibility, :visible_for_user?, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/visibility.ex', line: 85]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :render, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 382]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :safe_render, 3,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 6]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :safe_render_many, 4,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 6]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.TimelineController, :action, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: file: 'lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex',
Dec 06 15:24:13 gleasonator mix[171487]: line: 5
Dec 06 15:24:13 gleasonator mix[171487]: ]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
SideEffects:
```
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.504 [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 1943.692ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT o0.\"id\", o0.\"data\", o0.\"inserted_at\", o0.\"updated_at\" FROM \"objects\" AS o0 WHERE ((o0.\"data\")->>'id' = $1)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.SideEffects, :handle, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/side_effects.ex', line: 269]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Pipeline, :do_common_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/pipeline.ex', line: 50]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Pipeline, :common_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/pipeline.ex', line: 28]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Transmogrifier, :handle_incoming, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 476]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Federator, :perform, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/federator.ex', line: 84]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
Notifications:
```
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 4561.205ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT u0.\"id\", u0.\"bio\", u0.\"raw_bio\", u0.\"email\", u0.\"name\", u0.\"nickname\", u0.\"password_hash\", u0.\"keys\", u0.\"public_key\", u0.\"ap_id\", u0.\"avatar\", u0.\"local\", u0.\"follower_address\", u0.\"following_address\", u0.\"featured_address\", u0.\"tags\", u0.\"last_refreshed_at\", u0.\"last_digest_emailed_at\", u0.\"banner\", u0.\"background\", u0.\"note_count\", u0.\"follower_count\", u0.\"following_count\", u0.\"is_locked\", u0.\"is_confirmed\", u0.\"password_reset_pending\", u0.\"is_approved\", u0.\"registration_reason\", u0.\"confirmation_token\", u0.\"default_scope\", u0.\"domain_blocks\", u0.\"is_active\", u0.\"no_rich_text\", u0.\"ap_enabled\", u0.\"is_moderator\", u0.\"is_admin\", u0.\"show_role\", u0.\"mastofe_settings\", u0.\"uri\", u0.\"hide_followers_count\", u0.\"hide_follows_count\", u0.\"hide_followers\", u0.\"hide_follows\", u0.\"hide_favorites\", u0.\"email_notifications\", u0.\"mascot\", u0.\"emoji\", u0.\"pleroma_settings_store\", u0.\"fields\", u0.\"raw_fields\", u0.\"is_discoverable\", u0.\"invisible\", u0.\"allow_following_move\", u0.\"skip_thread_containment\", u0.\"actor_type\", u0.\"also_known_as\", u0.\"inbox\", u0.\"shared_inbox\", u0.\"accepts_chat_messages\", u0.\"last_active_at\", u0.\"disclose_client\", u0.\"accepts_email_list\", u0.\"pinned_objects\", u0.\"is_suggested\", u0.\"notification_settings\", u0.\"blocks\", u0.\"mutes\", u0.\"muted_reblogs\", u0.\"muted_notifications\", u0.\"subscribers\", u0.\"multi_factor_authentication_settings\", u0.\"inserted_at\", u0.\"updated_at\" FROM \"users\" AS u0 WHERE (u0.\"ap_id\" = ANY($1)) AND (NOT (u0.\"nickname\" IS NULL)) AND (NOT (u0.\"nickname\" LIKE 'internal.%')) AND (u0.\"local\" = $2)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Notification, :get_notified_from_activity, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/notification.ex', line: 512]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Notification, :do_create_notifications, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/notification.ex', line: 389]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.SideEffects, :handle, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/side_effects.ex', line: 272]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Pipeline, :do_common_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/pipeline.ex', line: 50]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Pipeline, :common_pipeline, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/pipeline.ex', line: 28]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Transmogrifier, :handle_incoming, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 476]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Federator, :perform, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/federator.ex', line: 84]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
Did somebody say StatusView?
```
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.605 request_id=Fr4zyQTR03rNmNkACO_j [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 4256.109ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT u0.\"id\", u0.\"bio\", u0.\"raw_bio\", u0.\"email\", u0.\"name\", u0.\"nickname\", u0.\"password_hash\", u0.\"keys\", u0.\"public_key\", u0.\"ap_id\", u0.\"avatar\", u0.\"local\", u0.\"follower_address\", u0.\"following_address\", u0.\"featured_address\", u0.\"tags\", u0.\"last_refreshed_at\", u0.\"last_digest_emailed_at\", u0.\"banner\", u0.\"background\", u0.\"note_count\", u0.\"follower_count\", u0.\"following_count\", u0.\"is_locked\", u0.\"is_confirmed\", u0.\"password_reset_pending\", u0.\"is_approved\", u0.\"registration_reason\", u0.\"confirmation_token\", u0.\"default_scope\", u0.\"domain_blocks\", u0.\"is_active\", u0.\"no_rich_text\", u0.\"ap_enabled\", u0.\"is_moderator\", u0.\"is_admin\", u0.\"show_role\", u0.\"mastofe_settings\", u0.\"uri\", u0.\"hide_followers_count\", u0.\"hide_follows_count\", u0.\"hide_followers\", u0.\"hide_follows\", u0.\"hide_favorites\", u0.\"email_notifications\", u0.\"mascot\", u0.\"emoji\", u0.\"pleroma_settings_store\", u0.\"fields\", u0.\"raw_fields\", u0.\"is_discoverable\", u0.\"invisible\", u0.\"allow_following_move\", u0.\"skip_thread_containment\", u0.\"actor_type\", u0.\"also_known_as\", u0.\"inbox\", u0.\"shared_inbox\", u0.\"accepts_chat_messages\", u0.\"last_active_at\", u0.\"disclose_client\", u0.\"accepts_email_list\", u0.\"pinned_objects\", u0.\"is_suggested\", u0.\"notification_settings\", u0.\"blocks\", u0.\"mutes\", u0.\"muted_reblogs\", u0.\"muted_notifications\", u0.\"subscribers\", u0.\"multi_factor_authentication_settings\", u0.\"inserted_at\", u0.\"updated_at\" FROM \"users\" AS u0 WHERE (u0.\"ap_id\" = $1)"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.User, :get_cached_by_ap_id, 1,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/user.ex', line: 1126]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :render, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 162]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :safe_render, 3,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 6]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.MastodonAPI.StatusView, :safe_render_many, 4,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/mastodon_api/views/status_view.ex', line: 6]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
Ah, here is the query mentioned in #2792, !3554 ... WTF??? Over 1 minute...
```
Dec 06 15:24:13 gleasonator mix[171487]: 15:24:13.817 [warn] Query took longer than 500ms!
Dec 06 15:24:13 gleasonator mix[171487]: Total time: 77559.285ms
Dec 06 15:24:13 gleasonator mix[171487]: "SELECT u0.\"ap_id\" FROM \"users\" AS u0 WHERE (u0.\"is_active\" = FALSE) AND (NOT (u0.\"nickname\" IS NULL)) AND (NOT (u0.\"nickname\" LIKE 'internal.%'))"
Dec 06 15:24:13 gleasonator mix[171487]: [
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Activity, :restrict_deactivated_users, 1,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/activity.ex', line: 367]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Activity, :get_create_by_object_ap_id, 1,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/activity.ex', line: 255]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Transmogrifier, :fix_in_reply_to, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 153]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.ActivityPub.Transmogrifier, :handle_incoming, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/activity_pub/transmogrifier.ex', line: 457]},
Dec 06 15:24:13 gleasonator mix[171487]: {Pleroma.Web.Federator, :perform, 2,
Dec 06 15:24:13 gleasonator mix[171487]: [file: 'lib/pleroma/web/federator.ex', line: 84]}
Dec 06 15:24:13 gleasonator mix[171487]: ]
```
I'm still identifying, but I would say we should probably look into StatusView.https://git.pleroma.social/pleroma/pleroma/-/issues/2787"MovePinnedActivitiesIntoPinnedObjects" migration takes 15 minutes2023-05-08T01:33:27ZAlex Gleason"MovePinnedActivitiesIntoPinnedObjects" migration takes 15 minutesAdded in: !3312
```
01:29:39.545 [info] == Running 20210205145000 Pleroma.Repo.Migrations.MovePinnedActivitiesIntoPinnedObjects.up/0 forward
01:44:39.583 [info] == Migrated 20210205145000 in 900.0s
```
900s aka 15 minutes is unreaso...Added in: !3312
```
01:29:39.545 [info] == Running 20210205145000 Pleroma.Repo.Migrations.MovePinnedActivitiesIntoPinnedObjects.up/0 forward
01:44:39.583 [info] == Migrated 20210205145000 in 900.0s
```
900s aka 15 minutes is unreasonably slowhttps://git.pleroma.social/pleroma/pleroma/-/issues/2786Offset pagination for timelines2023-05-08T01:04:29ZtusooaOffset pagination for timelinesSo that we can ask to show "the 99th page with 20 posts per page." (`GET /api/v1/timelines/home?limit=20&offset=1960`, etc.) Useful if we want to dig directly into what happened in the past. And allow FEs to implement good old forum-styl...So that we can ask to show "the 99th page with 20 posts per page." (`GET /api/v1/timelines/home?limit=20&offset=1960`, etc.) Useful if we want to dig directly into what happened in the past. And allow FEs to implement good old forum-style pagination, instead of infinite scrolling.https://git.pleroma.social/pleroma/pleroma/-/issues/2785Consider using my blurhash library2023-05-08T01:33:39Zrinpatchrin+pleroma@patch.cxConsider using my blurhash libraryA while ago I wrote a pure Elixir [implementation](https://github.com/rinpatch/blurhash) of the Blurhash algorithm. And I think there are several reasons why it should replace the currently used `eblurhash` library in Pleroma.
Pros:
1. ...A while ago I wrote a pure Elixir [implementation](https://github.com/rinpatch/blurhash) of the Blurhash algorithm. And I think there are several reasons why it should replace the currently used `eblurhash` library in Pleroma.
Pros:
1. There is no need for an external C program to handle the encoding. `eblurhash` uses a C program in a subprocess which also includes a 10k line image processing header library, which does make it less reliable in theory. By contrast, my library doesn't use anything except imagemagick, also used by `eblurhash`.
2. It's faster. I am not particularly sure of the reason for that, but my library appears to be 4 times faster judging from multiple Benchee runs. That is despite the fact my libary downscales images to 32 pixels in width before running the algorithm, whereas `eblurhash` downscales it to 20.
```
iex(6)> Benchee.run(%{"elixir blurhash" => fn -> Blurhash.downscale_and_encode("avatar.jpg", 4, 4) end, "eblurhash" => fn -> :eblurhash.magick("avatar.jpg") end}, memory_time: 4)
Operating System: Linux
CPU Information: AMD Ryzen 9 3950X 16-Core Processor
Number of Available Cores: 32
Available memory: 31.32 GB
Elixir 1.12.2
Erlang 24.1.2
Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 4 s
parallel: 1
inputs: none specified
Estimated total run time: 22 s
Benchmarking eblurhash...
Benchmarking elixir blurhash...
Name ips average deviation median 99th %
elixir blurhash 27.47 36.40 ms ±6.72% 36.89 ms 41.24 ms
eblurhash 6.13 163.15 ms ±2.12% 162.53 ms 178.31 ms
Comparison:
elixir blurhash 27.47
eblurhash 6.13 - 4.48x slower +126.75 ms
```
3. It's almost a drop-in replacement. Just replace `:eblurhash.magick(file)` with `Blurhash.downscale_and_encode(file, 4, 4)` after adding the dependency.
Cons:
1. It potentially uses more memory. The part I left out from the benchmark above:
```
Memory usage statistics:
Name average deviation median 99th %
elixir blurhash 5.78 MB ±0.00% 5.78 MB 5.78 MB
eblurhash 0.0723 MB ±0.52% 0.0725 MB 0.0725 MB
Comparison:
elixir blurhash 5.78 MB
eblurhash 0.0723 MB - 0.01x memory usage -5.70750 MB
```
Now, this is unfrair because `eblurhash` does all of it's work in a C subprocess. So let's measure memory usage of that:
```
~/s/pleroma % /usr/bin/time -v ./deps/eblurhash/priv/blurhash 4 4 avatar_thumb.gif
UVIN2gkV0Ljc9bNGxuofMxW.-ps:-=xaIUR*
[...]
Maximum resident set size (kbytes): 1400
[...]
```
Note that this is still not a completely fair comparison, but let's assume that in the worst case the Elixir library uses 4 times more memory.
2. It doesn't calculate blurhash components based on width and height like `eblurhash` does. I do not think this is an issue since Mastodon actually hardcodes 4x4 components, but if for some reason this behavior is something we want to keep, this will need to be implemented.
cc @alexgleason since he implemented blurhash in Pleromahttps://git.pleroma.social/pleroma/pleroma/-/issues/2783Discussion: How should quotes look like in Pleroma AP-wise?2023-05-08T01:00:08ZIljaDiscussion: How should quotes look like in Pleroma AP-wise?Several instances have quotes in some form, and there's also https://git.pleroma.social/pleroma/pleroma-meta/-/issues/23 Quotes, however, aren't defined in AP, so the question becomes; What are they and how should they look from an AP pe...Several instances have quotes in some form, and there's also https://git.pleroma.social/pleroma/pleroma-meta/-/issues/23 Quotes, however, aren't defined in AP, so the question becomes; What are they and how should they look from an AP perspective according to Pleroma?
### Software that has quotes
* Misskey
* Friendica
* Zap
* fedibird.com (Mastodon fork, they do it in the same way Misskey does them)
* Other?
### How they do it
fedibird.com does it the same way as Misskey does. A quote is just a Note with an extra field `quoteUrl`, which has the id of the post that's being quoted. Note that a quote can also be a reply to another thread by filling in the `inReplyTo` field. The `content` field also ends with `RE: </span><a href=\"https://mk.toast.cafe/notes/8rqc16lyeu\">`.
I haven't been able to test Friendica, nor did I find an example, so I haven't looked into that further, but from what I can tell, it's technically possible to quote multiple other posts by adding BBCode tags.
Zap allows you to "Share" a post (or a reply). It's just a regular Note, but it has BBCode tags for sharing. You can add several quotes in one post. All the information is in the content of the Note.
I have examples in the "Examples from other software" section below.
### How should Pleroma do it?
A first idea was that a quote is a thing on it's own. The idea was to fill in the `inReplyTo` field instead of `quoteUrl` and if Pleroma ever federates them, to make it their own object. This isn't compatible with any of the other implementations because Misskey quotes can also be replies, and in Zap (and I think also Friendica) multiple quotes are possible. In the latter case, it also seems possible to choose where the quotes are shown the content.
Sometimes people also talk about a Quote-boost, which could make it a new activity, or maybe an Announce activity with a `content` field in the activity. (EmojiReact is an example of an activity that has a content field.) The problem here is that you can only quote one post at a time and you can't say where the quote should be shown. This is incompatible with Zap (because only one quote at a time) and with Misskey (because replies aren't possible).
The idea of Zap quotes are a bit like quotes in news articles imo. They aren't per sé things on there own, but part of a bigger thing (in this case a Note). They are compatible with Misskey in the sense that you can still fill in the inReplyTo field. The exact way Zap does it, is probably not what we want because they add a whole bunch of stuff that doesn't feel like it belongs in the content field (like the link to the avatar and the text "wrote the following post..."). Having the quotes in the content and making it clear what posts they are quoting, does seem like a viable option. It turns out we already have a similar thing with Hashtags, Emojis, Mentions... which are added to the `tag` field. So maybe quotes could be added to the ´tag´ field? That would make it something like
```json
{
"content": "<p><span>Me too, that's why I used Arch for so long </span>:nkoLul:<span><br><br>RE: </span><a href=\"https://mk.toast.cafe/notes/8rqc16lyeu\">",
"tag": [{
"href": "https://mk.toast.cafe/notes/8rqc16lyeu",
"type": "Quote"
}],
"type": "Note",
...
}
```
What do you think? Does that sound like a good idea? (If not, why?) Are there other (maybe better) ideas? ...?
### Examples from other software
Misskey:
```json
{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1",
{
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
"sensitive": "as:sensitive",
"Hashtag": "as:Hashtag",
"quoteUrl": "as:quoteUrl",
"toot": "http://joinmastodon.org/ns#",
"Emoji": "toot:Emoji",
"featured": "toot:featured",
"discoverable": "toot:discoverable",
"schema": "http://schema.org#",
"PropertyValue": "schema:PropertyValue",
"value": "schema:value",
"misskey": "https://mk.paritybit.ca/ns#",
"_misskey_content": "misskey:_misskey_content",
"_misskey_quote": "misskey:_misskey_quote",
"_misskey_reaction": "misskey:_misskey_reaction",
"_misskey_votes": "misskey:_misskey_votes",
"_misskey_talk": "misskey:_misskey_talk",
"isCat": "misskey:isCat",
"vcard": "http://www.w3.org/2006/vcard/ns#"
}
],
"id": "https://mk.paritybit.ca/notes/8rqc3oihe7",
"type": "Note",
"attributedTo": "https://mk.paritybit.ca/users/8ox0cb71q7",
"summary": null,
"content": "<p><span>Me too, that's why I used Arch for so long </span>:nkoLul:<span><br><br>RE: </span><a href=\"https://mk.toast.cafe/notes/8rqc16lyeu\">"
"_misskey_content": "Me too, that's why I used Arch for so long :nkoLul:",
"_misskey_quote": "https://mk.toast.cafe/notes/8rqc16lyeu",
"quoteUrl": "https://mk.toast.cafe/notes/8rqc16lyeu",
"published": "2021-10-11T14:48:03.545Z",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://mk.paritybit.ca/users/8ox0cb71q7/followers"
],
"inReplyTo": null,
"attachment": [],
"sensitive": false,
"tag": [
{
"id": "https://mk.paritybit.ca/emojis/nkoLul",
"type": "Emoji",
"name": ":nkoLul:",
"updated": "2021-09-14T15:13:30.897Z",
"icon": {
"type": "Image",
"mediaType": "image/apng",
"url": "https://mk.paritybit.ca/files/06db0b13-5850-487b-b4bf-f5b844ccb5e5"
}
}
]
}
```
Zap
One quote:
```json
{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1",
{
"zot": "https://test.ilja.space/apschema#",
"toot": "http://joinmastodon.org/ns#",
"ostatus": "http://ostatus.org#",
"schema": "http://schema.org#",
"litepub": "http://litepub.social/ns#",
"sm": "http://smithereen.software/ns#",
"conversation": "ostatus:conversation",
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
"oauthRegistrationEndpoint": "litepub:oauthRegistrationEndpoint",
"sensitive": "as:sensitive",
"movedTo": "as:movedTo",
"copiedTo": "as:copiedTo",
"alsoKnownAs": "as:alsoKnownAs",
"EmojiReact": "as:EmojiReact",
"commentPolicy": "zot:commentPolicy",
"topicalCollection": "zot:topicalCollection",
"eventRepeat": "zot:eventRepeat",
"emojiReaction": "zot:emojiReaction",
"expires": "zot:expires",
"directMessage": "zot:directMessage",
"Category": "zot:Category",
"replyTo": "zot:replyTo",
"PropertyValue": "schema:PropertyValue",
"value": "schema:value",
"discoverable": "toot:discoverable",
"wall": "sm:wall",
"capabilities": "litepub:capabilities",
"acceptsJoins": "litepub:acceptsJoins"
}
],
"type": "Create",
"id": "https://test.ilja.space/activity/86d130e7-cc9b-4256-8b48-17602eccf531",
"published": "2021-11-13T09:44:04Z",
"context": "https://test.ilja.space/conversation/86d130e7-cc9b-4256-8b48-17602eccf531",
"conversation": "https://test.ilja.space/conversation/86d130e7-cc9b-4256-8b48-17602eccf531",
"actor": "https://test.ilja.space/channel/ilja",
"replyTo": "https://test.ilja.space/channel/ilja",
"url": "https://test.ilja.space/activity/86d130e7-cc9b-4256-8b48-17602eccf531",
"object": {
"type": "Note",
"id": "https://test.ilja.space/item/86d130e7-cc9b-4256-8b48-17602eccf531",
"published": "2021-11-13T09:44:04Z",
"commentPolicy": "contacts",
"attributedTo": "https://test.ilja.space/channel/ilja",
"context": "https://test.ilja.space/conversation/86d130e7-cc9b-4256-8b48-17602eccf531",
"conversation": "https://test.ilja.space/conversation/86d130e7-cc9b-4256-8b48-17602eccf531",
"content": "<div class=\"shared_container\"> <div class=\"shared_header\"><a href=\"https://test.ilja.space/channel/ilja\" ><img src=\"https://test.ilja.space/photo/profile/s/2\" alt=\"my_test_case\" height=\"32\" width=\"32\" /></a><span><a href=\"https://test.ilja.space/channel/ilja\" ><bdi>my_test_case</bdi></a> wrote the following <a href=\"https://test.ilja.space/item/93255381-2eaf-4d44-b526-6a1c0c17d217\" >post</a> <span class=\"autotime\" title=\"2021-11-13T01:43:29-08:00\" >Sat, 13 Nov 2021 01:43:29 -0800</span></span></div><div class=\"reshared-content\">This is a post</div></div>I'm sharing a post",
"source": {
"content": "[share author='my_test_case' profile='https://test.ilja.space/channel/ilja' portable_id='MlauVWqT6inrxqhDxYDiIRVDxjQsMNh-EKWcMlDQxIao1sOCNTYDPKFNSQthDaq32l_cfsAbCOiMEi6Xw23DPw' avatar='https://test.ilja.space/photo/profile/s/2' link='https://test.ilja.space/item/93255381-2eaf-4d44-b526-6a1c0c17d217' auth='false' posted='2021-11-13 09:43:29' message_id='https://test.ilja.space/item/93255381-2eaf-4d44-b526-6a1c0c17d217']This is a post[/share]I'm sharing a post",
"mediaType": "text/bbcode"
},
"replyTo": "https://test.ilja.space/channel/ilja",
"url": "https://test.ilja.space/item/86d130e7-cc9b-4256-8b48-17602eccf531",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://test.ilja.space/followers/ilja"
]
},
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://test.ilja.space/followers/ilja"
],
"signature": {
"type": "RsaSignature2017",
"nonce": "e2d03faa46192fe73e7434e14926473d6c83a1338df80cebf8ad84eb2e8d9b0c",
"creator": "https://test.ilja.space/channel/ilja",
"created": "2021-11-13T09:44:04Z",
"signatureValue": "bq8xvNL+aw53W3iKrbYzcw3FYyu87Fd1zmzIs5BFcH+p6QU6w9dxYP6b/qGTKCru3bQe6Bbk5RrlZ6A6S3pJYm6gfUMkR7LknvtbRDKh/6JuPhYzOqGdIjx8nounhlC3pgfZR5SMbCX4tQVS770C92aDefgJzMfvrjB0nlPYKd9CbWBX+iGpJcUUuZiLfjp2EnWowEo5MzgUz602kunWKkPK6bp4BsfYfLsU+sCrBLvOH0c48UawbEXVV2Rz9/cPhLMX2Cymrm1ybyk6uFRnBjIBRiKWaQJsVhY2F9LRXl+3bgSbpcsyuglWmTnOtLKkv4DSOWS9K4M5enKPXSX7OiF9AHR5wOh81PDcn7ZrHKllOgcmeC9MbF1DfjJi/gaZmBvZSNQUFXceJXFMbWwo0WbPe0/t0KmXzl+wRKeMTpBk0UfeaTNpzys4mLkXpTfdUZVEAbgIFyHLjukxsywU2mF4PrL++4aktj5adxBQUJz4FQ+HmvPGnp6eM9HBYxmu9t0fwIF4pZSWaXAMhYS6MsekJN9kNaYbe0Gp0DaNLEydiuLGXPF6+CRkG5Yoz7M89m4mU+99PACyIp2Hw1ijFV0AgV0Io8O2ulA5XwLv5W+eJQDt2HKnq2vPRX9s6wYN3+nD7+r44K67gJFo7+WEM++jxRqSdYdrdUvQzEWEWBI="
}
}
```
Two quotes:
```json
{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1",
{
"zot": "https://test.ilja.space/apschema#",
"toot": "http://joinmastodon.org/ns#",
"ostatus": "http://ostatus.org#",
"schema": "http://schema.org#",
"litepub": "http://litepub.social/ns#",
"sm": "http://smithereen.software/ns#",
"conversation": "ostatus:conversation",
"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
"oauthRegistrationEndpoint": "litepub:oauthRegistrationEndpoint",
"sensitive": "as:sensitive",
"movedTo": "as:movedTo",
"copiedTo": "as:copiedTo",
"alsoKnownAs": "as:alsoKnownAs",
"EmojiReact": "as:EmojiReact",
"commentPolicy": "zot:commentPolicy",
"topicalCollection": "zot:topicalCollection",
"eventRepeat": "zot:eventRepeat",
"emojiReaction": "zot:emojiReaction",
"expires": "zot:expires",
"directMessage": "zot:directMessage",
"Category": "zot:Category",
"replyTo": "zot:replyTo",
"PropertyValue": "schema:PropertyValue",
"value": "schema:value",
"discoverable": "toot:discoverable",
"wall": "sm:wall",
"capabilities": "litepub:capabilities",
"acceptsJoins": "litepub:acceptsJoins"
}
],
"type": "Create",
"id": "https://test.ilja.space/activity/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"published": "2021-11-13T09:46:38Z",
"context": "https://test.ilja.space/conversation/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"conversation": "https://test.ilja.space/conversation/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"actor": "https://test.ilja.space/channel/ilja",
"replyTo": "https://test.ilja.space/channel/ilja",
"url": "https://test.ilja.space/activity/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"object": {
"type": "Note",
"id": "https://test.ilja.space/item/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"published": "2021-11-13T09:46:38Z",
"commentPolicy": "contacts",
"attributedTo": "https://test.ilja.space/channel/ilja",
"context": "https://test.ilja.space/conversation/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"conversation": "https://test.ilja.space/conversation/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"content": "<div class=\"shared_container\"> <div class=\"shared_header\"><a href=\"https://test.ilja.space/channel/ilja\" ><img src=\"https://test.ilja.space/photo/profile/s/2\" alt=\"my_test_case\" height=\"32\" width=\"32\" /></a><span><a href=\"https://test.ilja.space/channel/ilja\" ><bdi>my_test_case</bdi></a> wrote the following <a href=\"https://test.ilja.space/item/93255381-2eaf-4d44-b526-6a1c0c17d217\" >post</a> <span class=\"autotime\" title=\"2021-11-13T01:43:29-08:00\" >Sat, 13 Nov 2021 01:43:29 -0800</span></span></div><div class=\"reshared-content\">This is a post</div></div>This is a post I'm sharing<br><div class=\"shared_container\"> <div class=\"shared_header\"><a href=\"https://test.ilja.space/channel/ilja\" ><img src=\"https://test.ilja.space/photo/profile/s/2\" alt=\"my_test_case\" height=\"32\" width=\"32\" /></a><span><a href=\"https://test.ilja.space/channel/ilja\" ><bdi>my_test_case</bdi></a> wrote the following <a href=\"https://test.ilja.space/item/096a9de6-6837-4d94-a134-00875988b517\" >post</a> <span class=\"autotime\" title=\"2021-11-13T01:43:40-08:00\" >Sat, 13 Nov 2021 01:43:40 -0800</span></span></div><div class=\"reshared-content\">This is another post</div></div> This is another post I'm sharing",
"source": {
"content": "[share author='my_test_case' profile='https://test.ilja.space/channel/ilja' portable_id='MlauVWqT6inrxqhDxYDiIRVDxjQsMNh-EKWcMlDQxIao1sOCNTYDPKFNSQthDaq32l_cfsAbCOiMEi6Xw23DPw' avatar='https://test.ilja.space/photo/profile/s/2' link='https://test.ilja.space/item/93255381-2eaf-4d44-b526-6a1c0c17d217' auth='false' posted='2021-11-13 09:43:29' message_id='https://test.ilja.space/item/93255381-2eaf-4d44-b526-6a1c0c17d217']This is a post[/share]This is a post I'm sharing\r\n[share author='my_test_case' profile='https://test.ilja.space/channel/ilja' portable_id='MlauVWqT6inrxqhDxYDiIRVDxjQsMNh-EKWcMlDQxIao1sOCNTYDPKFNSQthDaq32l_cfsAbCOiMEi6Xw23DPw' avatar='https://test.ilja.space/photo/profile/s/2' link='https://test.ilja.space/item/096a9de6-6837-4d94-a134-00875988b517' auth='false' posted='2021-11-13 09:43:40' message_id='https://test.ilja.space/item/096a9de6-6837-4d94-a134-00875988b517']This is another post[/share] This is another post I'm sharing",
"mediaType": "text/bbcode"
},
"replyTo": "https://test.ilja.space/channel/ilja",
"url": "https://test.ilja.space/item/bc684cea-0c2d-4baf-8c83-40abb6a8e928",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://test.ilja.space/followers/ilja"
]
},
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://test.ilja.space/followers/ilja"
],
"signature": {
"type": "RsaSignature2017",
"nonce": "534976107761dd2df325284e4cb21a05437456ca62c8d91661073fc37dae125a",
"creator": "https://test.ilja.space/channel/ilja",
"created": "2021-11-13T09:46:39Z",
"signatureValue": "GH5rcET7XHVTHMTADsJ4QyQZ/njn7514lOiVhz2aAwFZDIBfwPGLVhh1hih1gPJrdubG/P29W9wbtEc2ZiywVchNk5/vCnrMld/bcYSaIzyqtxpbHMHf5w6wKV7ppg3RbDyeC/g9NasaSwsV+B/bwBdUv552xeK61PYcvv6NyoCEP9FLYcprcLmLT7fjhmZYMNsrcZwbq/ljN3P9Apx1dcrhSUR0ReB2Zy9QxBLkuqJG0kMdXlFSASVF9wlz+nxXA3lj8CKJ6wezHizjouLxQtSnj3z0hVZhp/ISZOV82C5BK9fTSPo7lDhNT08dCTjNAgVxLPPTJ2kPGVHw2mLOuES0NGLmsrSBqo8/ulCsowPzpRXtZBbYmE5ZZbXsIYhBh8aic+ZX6WOo4MF1DYUxjB/s3V2J0nnBBtfGeSNgdjNr0RywPG6w8K7e29i0b37gy33lsUaH5ivFRebAXgS56SPZeJKry6CBDDgAk3GtTHSvcxp9eKeEPhkUFRWVcyuLQI3asDS78n3W44gLwzDBnJUzU86lOTtkusfccg4G4v9EHFs5US9x1RGs6tNh7tPSUYUNNqo8zBpYej75Gol8iWknyg/1TpIJ3l8xK5W/Sv6EgHLrmAP7lwzYOkTfbgMwqs5EZGHcoylbzBpCZ3KgUZRRtkjro0BgqamUZrgelMs="
}
}
```https://git.pleroma.social/pleroma/pleroma/-/issues/2781Feature request: mix task to migrate an instance to a new domain2023-05-08T01:33:47ZYour New SJW WaifuFeature request: mix task to migrate an instance to a new domainA mix task that will move followers, update the database, and send out update activities for everything to allow instances to change domains would be nice.A mix task that will move followers, update the database, and send out update activities for everything to allow instances to change domains would be nice.https://git.pleroma.social/pleroma/pleroma/-/issues/2780Add image descriptions to the metadata of a picture2023-05-08T01:06:49ZIljaAdd image descriptions to the metadata of a pictureImage descriptions on the fediverse are widely used (and that's a good thing), but they have to be filled in each time again and when someone downloads the image to upload later (or possibly somewhere else), the image description is gone...Image descriptions on the fediverse are widely used (and that's a good thing), but they have to be filled in each time again and when someone downloads the image to upload later (or possibly somewhere else), the image description is gone.
An idea I've seen passing by on fedi on a regular basis is to add the image description to the EXIF data of the image and use that to already prefill the description field in the FE after uploading an image.
Basically:
1. Upload a picture
2. Pleroma-be checks if the EXIF data already has an image description
3. Pleroma-fe automatically pre-fills the image description field with what Pleroma-be found in the EXIF data
4. People can change the description in the fe if they want
5. When posting, the EXIF data in the picture is also updated to the newest description
* [X] Fe part: https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/1399
* [X] Read EXIF data when uploaded: https://git.pleroma.social/pleroma/pleroma/-/merge_requests/3535
* [ ] Update EXIF data when post is madehttps://git.pleroma.social/pleroma/pleroma/-/issues/2779installation page mistake2023-05-08T01:34:56ZSnowinstallation page mistakehttps://docs-develop.pleroma.social/backend/installation/debian_based_en/
After install the ngnix , you are not able to get the cert.
![cross](/uploads/d464a4e66f420750149e4018f1f9f01d/cross.png)![right](/uploads/39e3ce129694279d1afc3...https://docs-develop.pleroma.social/backend/installation/debian_based_en/
After install the ngnix , you are not able to get the cert.
![cross](/uploads/d464a4e66f420750149e4018f1f9f01d/cross.png)![right](/uploads/39e3ce129694279d1afc3150da4a66a0/right.png)https://git.pleroma.social/pleroma/pleroma/-/issues/2778Feature Request: Ability to add additional variables to CSP headers2023-05-08T01:35:30ZYour New SJW WaifuFeature Request: Ability to add additional variables to CSP headersThis would be very useful for admins to be able to make customisations like embedding a PeerTube video on their about page or something like an off-site uptime tracker in their sidebar.
It can also cause issues with attachments if you...This would be very useful for admins to be able to make customisations like embedding a PeerTube video on their about page or something like an off-site uptime tracker in their sidebar.
It can also cause issues with attachments if you still have some legacy stuff served on a different domain than you do now.
Right now the only workaround is for admins to disable CSP in Pleroma and implement them in Nginx themselves.
However, because CSP headers aren't really documented and changes to them aren't communicated in the changelog it can be unwieldy and cause security issues.
Ideally, this is something that could be set in the config file and admin-fe.https://git.pleroma.social/pleroma/pleroma/-/issues/2774MRF to reject misskey animations?2023-05-08T01:35:09ZpiggoMRF to reject misskey animations?Something to add to the MRF wishlist.
I'm now blocking Misskey MFM and LaTeX with these keywords, but it's far from reliable.
(alternatively pleroma-fe could implement it :thinking:)
![Screenshot_20211019_102426](/uploads/aa88ba4867e03...Something to add to the MRF wishlist.
I'm now blocking Misskey MFM and LaTeX with these keywords, but it's far from reliable.
(alternatively pleroma-fe could implement it :thinking:)
![Screenshot_20211019_102426](/uploads/aa88ba4867e0364e1a572f95cd2be242/Screenshot_20211019_102426.png)