From e4ac2a7cd69aa5e87d9dc277c0271e15466e3215 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 16 Dec 2022 02:56:32 -0500 Subject: [PATCH 01/82] Detail backup states --- lib/pleroma/ecto_enums.ex | 8 ++ lib/pleroma/user/backup.ex | 116 ++++++++++++++---- lib/pleroma/workers/backup_worker.ex | 2 +- .../20221216052127_add_state_to_backups.exs | 21 ++++ test/pleroma/user/backup_test.exs | 48 +++++++- 5 files changed, 166 insertions(+), 29 deletions(-) create mode 100644 priv/repo/migrations/20221216052127_add_state_to_backups.exs diff --git a/lib/pleroma/ecto_enums.ex b/lib/pleroma/ecto_enums.ex index a4890b489a..b346b39d6e 100644 --- a/lib/pleroma/ecto_enums.ex +++ b/lib/pleroma/ecto_enums.ex @@ -27,3 +27,11 @@ failed: 4, manual: 5 ) + +defenum(Pleroma.User.Backup.State, + pending: 1, + running: 2, + complete: 3, + failed: 4, + invalid: 5 +) diff --git a/lib/pleroma/user/backup.ex b/lib/pleroma/user/backup.ex index 9df0106057..74001f9c3a 100644 --- a/lib/pleroma/user/backup.ex +++ b/lib/pleroma/user/backup.ex @@ -15,6 +15,7 @@ defmodule Pleroma.User.Backup do alias Pleroma.Bookmark alias Pleroma.Repo alias Pleroma.User + alias Pleroma.User.Backup.State alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.ActivityPub.UserView @@ -25,12 +26,16 @@ defmodule Pleroma.User.Backup do field(:file_name, :string) field(:file_size, :integer, default: 0) field(:processed, :boolean, default: false) + field(:state, State, default: :invalid) + field(:processed_number, :integer, default: 0) belongs_to(:user, User, type: FlakeId.Ecto.CompatType) timestamps() end + @report_every 100 + def create(user, admin_id \\ nil) do with :ok <- validate_limit(user, admin_id), {:ok, backup} <- user |> new() |> Repo.insert() do @@ -46,7 +51,8 @@ def new(user) do %__MODULE__{ user_id: user.id, content_type: "application/zip", - file_name: name + file_name: name, + state: :pending } end @@ -109,27 +115,75 @@ def remove_outdated(%__MODULE__{id: latest_id, user_id: user_id}) do def get(id), do: Repo.get(__MODULE__, id) + defp set_state(backup, state, processed_number \\ nil) do + struct = + %{state: state} + |> Pleroma.Maps.put_if_present(:processed_number, processed_number) + + backup + |> cast(struct, [:state, :processed_number]) + |> Repo.update() + end + def process(%__MODULE__{} = backup) do - with {:ok, zip_file} <- export(backup), - {:ok, %{size: size}} <- File.stat(zip_file), - {:ok, _upload} <- upload(backup, zip_file) do - backup - |> cast(%{file_size: size, processed: true}, [:file_size, :processed]) - |> Repo.update() + set_state(backup, :running, 0) + + current_pid = self() + + Task.Supervisor.async_nolink( + Pleroma.TaskSupervisor, + fn -> + with {:ok, zip_file} <- export(backup, current_pid), + {:ok, %{size: size}} <- File.stat(zip_file), + {:ok, _upload} <- upload(backup, zip_file) do + backup + |> cast( + %{ + file_size: size, + processed: true, + state: :complete + }, + [:file_size, :processed, :state] + ) + |> Repo.update() + + send(current_pid, :completed) + end + end + ) + + wait_backup(backup, backup.processed_number) + end + + defp wait_backup(backup, current_processed) do + receive do + {:progress, new_processed} -> + total_processed = current_processed + new_processed + + with {:ok, updated_backup} <- set_state(backup, :running, total_processed) do + wait_backup(updated_backup, total_processed) + else + _ -> wait_backup(backup, total_processed) + end + + :completed -> + {:ok, get(backup.id)} + after + 30_000 -> set_state(backup, :failed) end end @files ['actor.json', 'outbox.json', 'likes.json', 'bookmarks.json'] - def export(%__MODULE__{} = backup) do + def export(%__MODULE__{} = backup, caller_pid \\ nil) do backup = Repo.preload(backup, :user) name = String.trim_trailing(backup.file_name, ".zip") dir = dir(name) with :ok <- File.mkdir(dir), - :ok <- actor(dir, backup.user), - :ok <- statuses(dir, backup.user), - :ok <- likes(dir, backup.user), - :ok <- bookmarks(dir, backup.user), + :ok <- actor(dir, backup.user, caller_pid), + :ok <- statuses(dir, backup.user, caller_pid), + :ok <- likes(dir, backup.user, caller_pid), + :ok <- bookmarks(dir, backup.user, caller_pid), {:ok, zip_path} <- :zip.create(String.to_charlist(dir <> ".zip"), @files, cwd: dir), {:ok, _} <- File.rm_rf(dir) do {:ok, to_string(zip_path)} @@ -157,11 +211,12 @@ def upload(%__MODULE__{} = backup, zip_path) do end end - defp actor(dir, user) do + defp actor(dir, user, caller_pid) do with {:ok, json} <- UserView.render("user.json", %{user: user}) |> Map.merge(%{"likes" => "likes.json", "bookmarks" => "bookmarks.json"}) |> Jason.encode() do + send(caller_pid, {:progress, 1}) File.write(Path.join(dir, "actor.json"), json) end end @@ -180,7 +235,9 @@ defp write_header(file, name) do ) end - defp write(query, dir, name, fun) do + defp should_report?(num), do: rem(num, @report_every) == 0 + + defp write(query, dir, name, fun, caller_pid) do path = Path.join(dir, "#{name}.json") with {:ok, file} <- File.open(path, [:write, :utf8]), @@ -192,35 +249,41 @@ defp write(query, dir, name, fun) do with {:ok, data} <- fun.(i), {:ok, str} <- Jason.encode(data), :ok <- IO.write(file, str <> ",\n") do + if should_report?(acc + 1) do + send(caller_pid, {:progress, @report_every}) + end + acc + 1 else _ -> acc end end) + send(caller_pid, {:progress, rem(total, @report_every)}) + with :ok <- :file.pwrite(file, {:eof, -2}, "\n],\n \"totalItems\": #{total}}") do File.close(file) end end end - defp bookmarks(dir, %{id: user_id} = _user) do + defp bookmarks(dir, %{id: user_id} = _user, caller_pid) do Bookmark |> where(user_id: ^user_id) |> join(:inner, [b], activity in assoc(b, :activity)) |> select([b, a], %{id: b.id, object: fragment("(?)->>'object'", a.data)}) - |> write(dir, "bookmarks", fn a -> {:ok, a.object} end) + |> write(dir, "bookmarks", fn a -> {:ok, a.object} end, caller_pid) end - defp likes(dir, user) do + defp likes(dir, user, caller_pid) do user.ap_id |> Activity.Queries.by_actor() |> Activity.Queries.by_type("Like") |> select([like], %{id: like.id, object: fragment("(?)->>'object'", like.data)}) - |> write(dir, "likes", fn a -> {:ok, a.object} end) + |> write(dir, "likes", fn a -> {:ok, a.object} end, caller_pid) end - defp statuses(dir, user) do + defp statuses(dir, user, caller_pid) do opts = %{} |> Map.put(:type, ["Create", "Announce"]) @@ -233,10 +296,15 @@ defp statuses(dir, user) do ] |> Enum.concat() |> ActivityPub.fetch_activities_query(opts) - |> write(dir, "outbox", fn a -> - with {:ok, activity} <- Transmogrifier.prepare_outgoing(a.data) do - {:ok, Map.delete(activity, "@context")} - end - end) + |> write( + dir, + "outbox", + fn a -> + with {:ok, activity} <- Transmogrifier.prepare_outgoing(a.data) do + {:ok, Map.delete(activity, "@context")} + end + end, + caller_pid + ) end end diff --git a/lib/pleroma/workers/backup_worker.ex b/lib/pleroma/workers/backup_worker.ex index 12ee70f00b..a485ddb4b4 100644 --- a/lib/pleroma/workers/backup_worker.ex +++ b/lib/pleroma/workers/backup_worker.ex @@ -51,7 +51,7 @@ def perform(%Job{args: %{"op" => "delete", "backup_id" => backup_id}}) do end @impl Oban.Worker - def timeout(_job), do: :timer.seconds(900) + def timeout(_job), do: :infinity defp has_email?(user) do not is_nil(user.email) and user.email != "" diff --git a/priv/repo/migrations/20221216052127_add_state_to_backups.exs b/priv/repo/migrations/20221216052127_add_state_to_backups.exs new file mode 100644 index 0000000000..73b30fc358 --- /dev/null +++ b/priv/repo/migrations/20221216052127_add_state_to_backups.exs @@ -0,0 +1,21 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2022 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Repo.Migrations.AddStateToBackups do + use Ecto.Migration + + def up do + alter table(:backups) do + add(:state, :integer, default: 5) + add(:processed_number, :integer, default: 0) + end + end + + def down do + alter table(:backups) do + remove(:state) + remove(:processed_number) + end + end +end diff --git a/test/pleroma/user/backup_test.exs b/test/pleroma/user/backup_test.exs index 5c9b940007..a536b4a4a8 100644 --- a/test/pleroma/user/backup_test.exs +++ b/test/pleroma/user/backup_test.exs @@ -39,7 +39,7 @@ test "it creates a backup record and an Oban job" do assert_enqueued(worker: BackupWorker, args: args) backup = Backup.get(args["backup_id"]) - assert %Backup{user_id: ^user_id, processed: false, file_size: 0} = backup + assert %Backup{user_id: ^user_id, processed: false, file_size: 0, state: :pending} = backup end test "it return an error if the export limit is over" do @@ -59,7 +59,30 @@ test "it process a backup record" do assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) assert {:ok, backup} = perform_job(BackupWorker, args) assert backup.file_size > 0 - assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id} = backup + assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id, state: :complete} = backup + + delete_job_args = %{"op" => "delete", "backup_id" => backup_id} + + assert_enqueued(worker: BackupWorker, args: delete_job_args) + assert {:ok, backup} = perform_job(BackupWorker, delete_job_args) + refute Backup.get(backup_id) + + email = Pleroma.Emails.UserEmail.backup_is_ready_email(backup) + + assert_email_sent( + to: {user.name, user.email}, + html_body: email.html_body + ) + end + + test "it updates states of the backup" do + clear_config([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) + %{id: user_id} = user = insert(:user) + + assert {:ok, %Oban.Job{args: %{"backup_id" => backup_id} = args}} = Backup.create(user) + assert {:ok, backup} = perform_job(BackupWorker, args) + assert backup.file_size > 0 + assert %Backup{id: ^backup_id, processed: true, user_id: ^user_id, state: :complete} = backup delete_job_args = %{"op" => "delete", "backup_id" => backup_id} @@ -148,7 +171,7 @@ test "it creates a zip archive with user data" do Bookmark.create(user.id, status3.id) assert {:ok, backup} = user |> Backup.new() |> Repo.insert() - assert {:ok, path} = Backup.export(backup) + assert {:ok, path} = Backup.export(backup, self()) assert {:ok, zipfile} = :zip.zip_open(String.to_charlist(path), [:memory]) assert {:ok, {'actor.json', json}} = :zip.zip_get('actor.json', zipfile) @@ -230,6 +253,23 @@ test "it creates a zip archive with user data" do File.rm!(path) end + test "it counts the correct number processed" do + user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) + + Enum.map(1..120, fn i -> + {:ok, status} = CommonAPI.post(user, %{status: "status #{i}"}) + CommonAPI.favorite(user, status.id) + Bookmark.create(user.id, status.id) + end) + + assert {:ok, backup} = user |> Backup.new() |> Repo.insert() + {:ok, backup} = Backup.process(backup) + + assert backup.processed_number == 1 + 120 + 120 + 120 + + Backup.delete(backup) + end + describe "it uploads and deletes a backup archive" do setup do clear_config([Pleroma.Upload, :base_url], "https://s3.amazonaws.com") @@ -246,7 +286,7 @@ test "it creates a zip archive with user data" do Bookmark.create(user.id, status3.id) assert {:ok, backup} = user |> Backup.new() |> Repo.insert() - assert {:ok, path} = Backup.export(backup) + assert {:ok, path} = Backup.export(backup, self()) [path: path, backup: backup] end From bdd63d2a3a5fe76f8a8ac1f71cb8698be85bfef4 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 16 Dec 2022 14:10:48 -0500 Subject: [PATCH 02/82] Expose backup status via Pleroma API --- .../operations/pleroma_backup_operation.ex | 8 +++- .../web/pleroma_api/views/backup_view.ex | 10 +++++ .../pleroma_api/views/backup_view_test.exs | 39 +++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex index 45fa2b0582..5655527e02 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex @@ -64,7 +64,9 @@ defp backup do content_type: %Schema{type: :string}, file_name: %Schema{type: :string}, file_size: %Schema{type: :integer}, - processed: %Schema{type: :boolean} + processed: %Schema{type: :boolean, description: "whether this backup has succeeded"}, + state: %Schema{type: :string, description: "the state of the backup", enum: ["pending", "running", "complete", "failed"]}, + processed_number: %Schema{type: :integer, description: "the number of records processed"} }, example: %{ "content_type" => "application/zip", @@ -72,7 +74,9 @@ defp backup do "https://cofe.fe:4000/media/backups/archive-foobar-20200908T164207-Yr7vuT5Wycv-sN3kSN2iJ0k-9pMo60j9qmvRCdDqIew.zip", "file_size" => 4105, "inserted_at" => "2020-09-08T16:42:07.000Z", - "processed" => true + "processed" => true, + "state" => "complete", + "processed_number": 20 } } end diff --git a/lib/pleroma/web/pleroma_api/views/backup_view.ex b/lib/pleroma/web/pleroma_api/views/backup_view.ex index d778590f02..02d8917913 100644 --- a/lib/pleroma/web/pleroma_api/views/backup_view.ex +++ b/lib/pleroma/web/pleroma_api/views/backup_view.ex @@ -9,12 +9,22 @@ defmodule Pleroma.Web.PleromaAPI.BackupView do alias Pleroma.Web.CommonAPI.Utils def render("show.json", %{backup: %Backup{} = backup}) do + # To deal with records before the migration + state = + if backup.state == :invalid do + if backup.processed, do: :complete, else: :failed + else + backup.state + end + %{ id: backup.id, content_type: backup.content_type, url: download_url(backup), file_size: backup.file_size, processed: backup.processed, + state: to_string(state), + processed_number: backup.processed_number, inserted_at: Utils.to_masto_date(backup.inserted_at) } end diff --git a/test/pleroma/web/pleroma_api/views/backup_view_test.exs b/test/pleroma/web/pleroma_api/views/backup_view_test.exs index a86688bc43..6908463d6a 100644 --- a/test/pleroma/web/pleroma_api/views/backup_view_test.exs +++ b/test/pleroma/web/pleroma_api/views/backup_view_test.exs @@ -15,4 +15,43 @@ test "it renders the ID" do result = BackupView.render("show.json", backup: backup) assert result.id == backup.id end + + test "it renders the state and processed_number" do + user = insert(:user) + backup = Backup.new(user) + + result = BackupView.render("show.json", backup: backup) + assert result.state == to_string(backup.state) + assert result.processed_number == backup.processed_number + end + + test "it renders failed state with legacy records" do + backup = %Backup{ + id: 0, + content_type: "application/zip", + file_name: "dummy", + file_size: 1, + state: :invalid, + processed: true, + processed_number: 1, + inserted_at: NaiveDateTime.utc_now() + } + + result = BackupView.render("show.json", backup: backup) + assert result.state == "complete" + + backup = %Backup{ + id: 0, + content_type: "application/zip", + file_name: "dummy", + file_size: 1, + state: :invalid, + processed: false, + processed_number: 1, + inserted_at: NaiveDateTime.utc_now() + } + + result = BackupView.render("show.json", backup: backup) + assert result.state == "failed" + end end From 46ab97d72145a122cc0e0ada3cd9f0af5449bdf3 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 16 Dec 2022 14:13:46 -0500 Subject: [PATCH 03/82] Simplify backup update clause --- lib/pleroma/user/backup.ex | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/user/backup.ex b/lib/pleroma/user/backup.ex index 74001f9c3a..97b8718c1b 100644 --- a/lib/pleroma/user/backup.ex +++ b/lib/pleroma/user/backup.ex @@ -160,11 +160,8 @@ defp wait_backup(backup, current_processed) do {:progress, new_processed} -> total_processed = current_processed + new_processed - with {:ok, updated_backup} <- set_state(backup, :running, total_processed) do - wait_backup(updated_backup, total_processed) - else - _ -> wait_backup(backup, total_processed) - end + set_state(backup, :running, total_processed) + wait_backup(backup, total_processed) :completed -> {:ok, get(backup.id)} From a1b95922c5c4a4351b52c0f7a484a96efed08be9 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 16 Dec 2022 14:16:07 -0500 Subject: [PATCH 04/82] Fix compile error --- lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex index 5655527e02..ea3fc230a6 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex @@ -76,7 +76,7 @@ defp backup do "inserted_at" => "2020-09-08T16:42:07.000Z", "processed" => true, "state" => "complete", - "processed_number": 20 + "processed_number" => 20 } } end From 070fbb89e1bc51669b03555b72c6852a769f1e15 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 16 Dec 2022 14:29:21 -0500 Subject: [PATCH 05/82] Lint --- .../api_spec/operations/pleroma_backup_operation.ex | 6 +++++- lib/pleroma/web/pleroma_api/views/backup_view.ex | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex index ea3fc230a6..400f3825d8 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_backup_operation.ex @@ -65,7 +65,11 @@ defp backup do file_name: %Schema{type: :string}, file_size: %Schema{type: :integer}, processed: %Schema{type: :boolean, description: "whether this backup has succeeded"}, - state: %Schema{type: :string, description: "the state of the backup", enum: ["pending", "running", "complete", "failed"]}, + state: %Schema{ + type: :string, + description: "the state of the backup", + enum: ["pending", "running", "complete", "failed"] + }, processed_number: %Schema{type: :integer, description: "the number of records processed"} }, example: %{ diff --git a/lib/pleroma/web/pleroma_api/views/backup_view.ex b/lib/pleroma/web/pleroma_api/views/backup_view.ex index 02d8917913..20403aeee4 100644 --- a/lib/pleroma/web/pleroma_api/views/backup_view.ex +++ b/lib/pleroma/web/pleroma_api/views/backup_view.ex @@ -11,11 +11,11 @@ defmodule Pleroma.Web.PleromaAPI.BackupView do def render("show.json", %{backup: %Backup{} = backup}) do # To deal with records before the migration state = - if backup.state == :invalid do - if backup.processed, do: :complete, else: :failed - else - backup.state - end + if backup.state == :invalid do + if backup.processed, do: :complete, else: :failed + else + backup.state + end %{ id: backup.id, From 7d3e4eaeb94a5381d56a3281e5813b7e0c63c8dd Mon Sep 17 00:00:00 2001 From: tusooa Date: Sun, 18 Dec 2022 15:55:52 -0500 Subject: [PATCH 06/82] Log errors more extensively --- lib/pleroma/user/backup.ex | 105 +++++++++++++++++++++--------- test/pleroma/user/backup_test.exs | 50 ++++++++++++++ 2 files changed, 125 insertions(+), 30 deletions(-) diff --git a/lib/pleroma/user/backup.ex b/lib/pleroma/user/backup.ex index 97b8718c1b..cb9a40ba12 100644 --- a/lib/pleroma/user/backup.ex +++ b/lib/pleroma/user/backup.ex @@ -9,6 +9,7 @@ defmodule Pleroma.User.Backup do import Ecto.Query import Pleroma.Web.Gettext + require Logger require Pleroma.Constants alias Pleroma.Activity @@ -130,48 +131,79 @@ def process(%__MODULE__{} = backup) do current_pid = self() - Task.Supervisor.async_nolink( - Pleroma.TaskSupervisor, - fn -> - with {:ok, zip_file} <- export(backup, current_pid), - {:ok, %{size: size}} <- File.stat(zip_file), - {:ok, _upload} <- upload(backup, zip_file) do - backup - |> cast( - %{ - file_size: size, - processed: true, - state: :complete - }, - [:file_size, :processed, :state] - ) - |> Repo.update() + task = + Task.Supervisor.async_nolink( + Pleroma.TaskSupervisor, + __MODULE__, + :do_process, + [backup, current_pid] + ) - send(current_pid, :completed) - end - end - ) - - wait_backup(backup, backup.processed_number) + wait_backup(backup, backup.processed_number, task) end - defp wait_backup(backup, current_processed) do + def do_process(backup, current_pid) do + with {:ok, zip_file} <- export(backup, current_pid), + {:ok, %{size: size}} <- File.stat(zip_file), + {:ok, _upload} <- upload(backup, zip_file) do + backup + |> cast( + %{ + file_size: size, + processed: true, + state: :complete + }, + [:file_size, :processed, :state] + ) + |> Repo.update() + end + end + + defp wait_backup(backup, current_processed, task) do receive do {:progress, new_processed} -> total_processed = current_processed + new_processed set_state(backup, :running, total_processed) - wait_backup(backup, total_processed) + wait_backup(backup, total_processed, task) - :completed -> - {:ok, get(backup.id)} + {:DOWN, _ref, _proc, _pid, reason} -> + backup = get(backup.id) + + if reason != :normal do + Logger.error("Backup #{backup.id} process ended abnormally: #{inspect(reason)}") + + {:ok, backup} = set_state(backup, :failed) + + {:error, + %{ + backup: backup, + reason: :exit, + details: reason + }} + else + {:ok, backup} + end after - 30_000 -> set_state(backup, :failed) + 30_000 -> + Logger.error( + "Backup #{backup.id} timed out after no response for 30 seconds, terminating" + ) + + Task.Supervisor.terminate_child(Pleroma.TaskSupervisor, task.pid) + + {:ok, backup} = set_state(backup, :failed) + + {:error, + %{ + backup: backup, + reason: :timeout + }} end end @files ['actor.json', 'outbox.json', 'likes.json', 'bookmarks.json'] - def export(%__MODULE__{} = backup, caller_pid \\ nil) do + def export(%__MODULE__{} = backup, caller_pid) do backup = Repo.preload(backup, :user) name = String.trim_trailing(backup.file_name, ".zip") dir = dir(name) @@ -243,7 +275,12 @@ defp write(query, dir, name, fun, caller_pid) do query |> Pleroma.Repo.chunk_stream(100) |> Enum.reduce(0, fn i, acc -> - with {:ok, data} <- fun.(i), + with {:ok, data} <- + (try do + fun.(i) + rescue + e -> {:error, e} + end), {:ok, str} <- Jason.encode(data), :ok <- IO.write(file, str <> ",\n") do if should_report?(acc + 1) do @@ -252,7 +289,15 @@ defp write(query, dir, name, fun, caller_pid) do acc + 1 else - _ -> acc + {:error, e} -> + Logger.warn( + "Error processing backup item: #{inspect(e)}\n The item is: #{inspect(i)}" + ) + + acc + + _ -> + acc end end) diff --git a/test/pleroma/user/backup_test.exs b/test/pleroma/user/backup_test.exs index a536b4a4a8..066bf6ba82 100644 --- a/test/pleroma/user/backup_test.exs +++ b/test/pleroma/user/backup_test.exs @@ -270,6 +270,56 @@ test "it counts the correct number processed" do Backup.delete(backup) end + test "it handles errors" do + user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) + + Enum.map(1..120, fn i -> + {:ok, _status} = CommonAPI.post(user, %{status: "status #{i}"}) + end) + + assert {:ok, backup} = user |> Backup.new() |> Repo.insert() + + with_mock Pleroma.Web.ActivityPub.Transmogrifier, + [:passthrough], + prepare_outgoing: fn data -> + object = + data["object"] + |> Pleroma.Object.normalize(fetch: false) + |> Map.get(:data) + + data = data |> Map.put("object", object) + + if String.contains?(data["object"]["content"], "119"), + do: raise(%Postgrex.Error{}), + else: {:ok, data} + end do + {:ok, backup} = Backup.process(backup) + assert backup.processed + assert backup.state == :complete + assert backup.processed_number == 1 + 119 + + Backup.delete(backup) + end + end + + test "it handles unrecoverable exceptions" do + user = insert(:user, %{nickname: "cofe", name: "Cofe", ap_id: "http://cofe.io/users/cofe"}) + + assert {:ok, backup} = user |> Backup.new() |> Repo.insert() + + with_mock Backup, [:passthrough], do_process: fn _, _ -> raise "mock exception" end do + {:error, %{backup: backup, reason: :exit}} = Backup.process(backup) + + assert backup.state == :failed + end + + with_mock Backup, [:passthrough], do_process: fn _, _ -> Process.sleep(:timer.seconds(32)) end do + {:error, %{backup: backup, reason: :timeout}} = Backup.process(backup) + + assert backup.state == :failed + end + end + describe "it uploads and deletes a backup archive" do setup do clear_config([Pleroma.Upload, :base_url], "https://s3.amazonaws.com") From 179efd94677d1d30bdbbbbaafc899c8c908181d2 Mon Sep 17 00:00:00 2001 From: tusooa Date: Sat, 24 Dec 2022 00:17:17 -0500 Subject: [PATCH 07/82] Make backup parameters configurable --- config/config.exs | 4 +++- config/description.exs | 15 +++++++++++++++ lib/pleroma/user/backup.ex | 37 ++++++++++++++++++++++++++----------- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/config/config.exs b/config/config.exs index e41ec2f919..ecb592b9c9 100644 --- a/config/config.exs +++ b/config/config.exs @@ -874,7 +874,9 @@ config :pleroma, Pleroma.User.Backup, purge_after_days: 30, limit_days: 7, - dir: nil + dir: nil, + process_wait_time: 30_000, + process_chunk_size: 100 config :pleroma, ConcurrentLimiter, [ {Pleroma.Web.RichMedia.Helpers, [max_running: 5, max_waiting: 5]}, diff --git a/config/description.exs b/config/description.exs index bf4734426f..996267558f 100644 --- a/config/description.exs +++ b/config/description.exs @@ -3394,6 +3394,21 @@ type: :integer, description: "Limit user to export not more often than once per N days", suggestions: [7] + }, + %{ + key: :process_wait_time, + type: :integer, + label: "Process Wait Time", + description: + "The amount of time to wait for backup to report progress, in milliseconds. If no progress is received from the backup job for that much time, terminate it and deem it failed.", + suggestions: [30_000] + }, + %{ + key: :process_chunk_size, + type: :integer, + label: "Process Chunk Size", + description: "The number of activities to fetch in the backup job for each chunk.", + suggestions: [100] } ] }, diff --git a/lib/pleroma/user/backup.ex b/lib/pleroma/user/backup.ex index cb9a40ba12..447fca2a19 100644 --- a/lib/pleroma/user/backup.ex +++ b/lib/pleroma/user/backup.ex @@ -35,8 +35,6 @@ defmodule Pleroma.User.Backup do timestamps() end - @report_every 100 - def create(user, admin_id \\ nil) do with :ok <- validate_limit(user, admin_id), {:ok, backup} <- user |> new() |> Repo.insert() do @@ -160,6 +158,8 @@ def do_process(backup, current_pid) do end defp wait_backup(backup, current_processed, task) do + wait_time = Pleroma.Config.get([__MODULE__, :process_wait_time]) + receive do {:progress, new_processed} -> total_processed = current_processed + new_processed @@ -175,6 +175,8 @@ defp wait_backup(backup, current_processed, task) do {:ok, backup} = set_state(backup, :failed) + cleanup(backup) + {:error, %{ backup: backup, @@ -185,15 +187,17 @@ defp wait_backup(backup, current_processed, task) do {:ok, backup} end after - 30_000 -> + wait_time -> Logger.error( - "Backup #{backup.id} timed out after no response for 30 seconds, terminating" + "Backup #{backup.id} timed out after no response for #{wait_time}ms, terminating" ) Task.Supervisor.terminate_child(Pleroma.TaskSupervisor, task.pid) {:ok, backup} = set_state(backup, :failed) + cleanup(backup) + {:error, %{ backup: backup, @@ -205,8 +209,7 @@ defp wait_backup(backup, current_processed, task) do @files ['actor.json', 'outbox.json', 'likes.json', 'bookmarks.json'] def export(%__MODULE__{} = backup, caller_pid) do backup = Repo.preload(backup, :user) - name = String.trim_trailing(backup.file_name, ".zip") - dir = dir(name) + dir = backup_tempdir(backup) with :ok <- File.mkdir(dir), :ok <- actor(dir, backup.user, caller_pid), @@ -264,16 +267,28 @@ defp write_header(file, name) do ) end - defp should_report?(num), do: rem(num, @report_every) == 0 + defp should_report?(num, chunk_size), do: rem(num, chunk_size) == 0 + + defp backup_tempdir(backup) do + name = String.trim_trailing(backup.file_name, ".zip") + dir(name) + end + + defp cleanup(backup) do + dir = backup_tempdir(backup) + File.rm_rf(dir) + end defp write(query, dir, name, fun, caller_pid) do path = Path.join(dir, "#{name}.json") + chunk_size = Pleroma.Config.get([__MODULE__, :process_chunk_size]) + with {:ok, file} <- File.open(path, [:write, :utf8]), :ok <- write_header(file, name) do total = query - |> Pleroma.Repo.chunk_stream(100) + |> Pleroma.Repo.chunk_stream(chunk_size, _returns_as = :one, timeout: :infinity) |> Enum.reduce(0, fn i, acc -> with {:ok, data} <- (try do @@ -283,8 +298,8 @@ defp write(query, dir, name, fun, caller_pid) do end), {:ok, str} <- Jason.encode(data), :ok <- IO.write(file, str <> ",\n") do - if should_report?(acc + 1) do - send(caller_pid, {:progress, @report_every}) + if should_report?(acc + 1, chunk_size) do + send(caller_pid, {:progress, chunk_size}) end acc + 1 @@ -301,7 +316,7 @@ defp write(query, dir, name, fun, caller_pid) do end end) - send(caller_pid, {:progress, rem(total, @report_every)}) + send(caller_pid, {:progress, rem(total, chunk_size)}) with :ok <- :file.pwrite(file, {:eof, -2}, "\n],\n \"totalItems\": #{total}}") do File.close(file) From 9a2523a09a2d9ccf5db12ef648444c51a98ab113 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Mon, 6 Mar 2023 21:16:34 +0100 Subject: [PATCH 08/82] instances: Store some metadata based on NodeInfo --- lib/pleroma/instances/instance.ex | 100 +++++++++++++++++- .../20230306112859_instances_add_metadata.exs | 14 +++ test/fixtures/mastodon-nodeinfo20.json | 1 + .../mastodon-well-known-nodeinfo.json | 1 + test/fixtures/wildebeest-nodeinfo21.json | 1 + .../wildebeest-well-known-nodeinfo.json | 1 + test/pleroma/instances/instance_test.exs | 60 +++++++++++ 7 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 priv/repo/migrations/20230306112859_instances_add_metadata.exs create mode 100644 test/fixtures/mastodon-nodeinfo20.json create mode 100644 test/fixtures/mastodon-well-known-nodeinfo.json create mode 100644 test/fixtures/wildebeest-nodeinfo21.json create mode 100644 test/fixtures/wildebeest-well-known-nodeinfo.json diff --git a/lib/pleroma/instances/instance.ex b/lib/pleroma/instances/instance.ex index a5529ad44d..9756c66dc3 100644 --- a/lib/pleroma/instances/instance.ex +++ b/lib/pleroma/instances/instance.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Instances.Instance do alias Pleroma.Instances alias Pleroma.Instances.Instance + alias Pleroma.Maps alias Pleroma.Repo alias Pleroma.User alias Pleroma.Workers.BackgroundWorker @@ -24,6 +25,14 @@ defmodule Pleroma.Instances.Instance do field(:favicon, :string) field(:favicon_updated_at, :naive_datetime) + embeds_one :metadata, Pleroma.Instances.Metadata, primary_key: false do + field(:software_name, :string) + field(:software_version, :string) + field(:software_repository, :string) + end + + field(:metadata_updated_at, :utc_datetime) + timestamps() end @@ -31,11 +40,17 @@ defmodule Pleroma.Instances.Instance do def changeset(struct, params \\ %{}) do struct - |> cast(params, [:host, :unreachable_since, :favicon, :favicon_updated_at]) + |> cast(params, __schema__(:fields) -- [:metadata]) + |> cast_embed(:metadata, with: &metadata_changeset/2) |> validate_required([:host]) |> unique_constraint(:host) end + def metadata_changeset(struct, params \\ %{}) do + struct + |> cast(params, [:software_name, :software_version, :software_repository]) + end + def filter_reachable([]), do: %{} def filter_reachable(urls_or_hosts) when is_list(urls_or_hosts) do @@ -198,6 +213,89 @@ defp scrape_favicon(%URI{} = instance_uri) do end end + def get_or_update_metadata(%URI{host: host} = instance_uri) do + existing_record = Repo.get_by(Instance, %{host: host}) + now = NaiveDateTime.utc_now() + + if existing_record && existing_record.metadata_updated_at && + NaiveDateTime.diff(now, existing_record.metadata_updated_at) < 86_400 do + existing_record.metadata + else + metadata = scrape_metadata(instance_uri) + + if existing_record do + existing_record + |> changeset(%{metadata: metadata, metadata_updated_at: now}) + |> Repo.update() + else + %Instance{} + |> changeset(%{host: host, metadata: metadata, metadata_updated_at: now}) + |> Repo.insert() + end + + metadata + end + end + + defp get_nodeinfo_uri(well_known) do + links = Map.get(well_known, "links", []) + + nodeinfo21 = + Enum.find(links, &(&1["rel"] == "http://nodeinfo.diaspora.software/ns/schema/2.1"))["href"] + + nodeinfo20 = + Enum.find(links, &(&1["rel"] == "http://nodeinfo.diaspora.software/ns/schema/2.0"))["href"] + + cond do + is_binary(nodeinfo21) -> {:ok, nodeinfo21} + is_binary(nodeinfo20) -> {:ok, nodeinfo20} + true -> {:error, :no_links} + end + end + + defp scrape_metadata(%URI{} = instance_uri) do + try do + with {_, true} <- {:reachable, reachable?(instance_uri.host)}, + {:ok, %Tesla.Env{body: well_known_body}} <- + instance_uri + |> URI.merge("/.well-known/nodeinfo") + |> to_string() + |> Pleroma.HTTP.get([{"accept", "application/json"}]), + {:ok, well_known_json} <- Jason.decode(well_known_body), + {:ok, nodeinfo_uri} <- get_nodeinfo_uri(well_known_json), + {:ok, %Tesla.Env{body: nodeinfo_body}} <- + Pleroma.HTTP.get(nodeinfo_uri, [{"accept", "application/json"}]), + {:ok, nodeinfo} <- Jason.decode(nodeinfo_body) do + # Can extract more metadata from NodeInfo but need to be careful about it's size, + # can't just dump the entire thing + software = Map.get(nodeinfo, "software", %{}) + + %{ + software_name: software["name"], + software_version: software["version"] + } + |> Maps.put_if_present(:software_repository, software["repository"]) + else + {:reachable, false} -> + Logger.debug( + "Instance.scrape_metadata(\"#{to_string(instance_uri)}\") ignored unreachable host" + ) + + nil + + _ -> + nil + end + rescue + e -> + Logger.warn( + "Instance.scrape_metadata(\"#{to_string(instance_uri)}\") error: #{inspect(e)}" + ) + + nil + end + end + @doc """ Deletes all users from an instance in a background task, thus also deleting all of those users' activities and notifications. diff --git a/priv/repo/migrations/20230306112859_instances_add_metadata.exs b/priv/repo/migrations/20230306112859_instances_add_metadata.exs new file mode 100644 index 0000000000..898f5220e0 --- /dev/null +++ b/priv/repo/migrations/20230306112859_instances_add_metadata.exs @@ -0,0 +1,14 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Repo.Migrations.InstancesAddMetadata do + use Ecto.Migration + + def change do + alter table(:instances) do + add(:metadata, :map) + add(:metadata_updated_at, :utc_datetime) + end + end +end diff --git a/test/fixtures/mastodon-nodeinfo20.json b/test/fixtures/mastodon-nodeinfo20.json new file mode 100644 index 0000000000..35010fdf01 --- /dev/null +++ b/test/fixtures/mastodon-nodeinfo20.json @@ -0,0 +1 @@ +{"version":"2.0","software":{"name":"mastodon","version":"4.1.0"},"protocols":["activitypub"],"services":{"outbound":[],"inbound":[]},"usage":{"users":{"total":971090,"activeMonth":167218,"activeHalfyear":384808},"localPosts":52071541},"openRegistrations":true,"metadata":{}} \ No newline at end of file diff --git a/test/fixtures/mastodon-well-known-nodeinfo.json b/test/fixtures/mastodon-well-known-nodeinfo.json new file mode 100644 index 0000000000..237d5462ab --- /dev/null +++ b/test/fixtures/mastodon-well-known-nodeinfo.json @@ -0,0 +1 @@ +{"links":[{"rel":"http://nodeinfo.diaspora.software/ns/schema/2.0","href":"https://mastodon.example.org/nodeinfo/2.0"}]} \ No newline at end of file diff --git a/test/fixtures/wildebeest-nodeinfo21.json b/test/fixtures/wildebeest-nodeinfo21.json new file mode 100644 index 0000000000..c6af474bff --- /dev/null +++ b/test/fixtures/wildebeest-nodeinfo21.json @@ -0,0 +1 @@ +{"version":"2.1","software":{"name":"wildebeest","version":"0.0.1","repository":"https://github.com/cloudflare/wildebeest"},"protocols":["activitypub"],"usage":{"users":{"total":1,"activeMonth":1,"activeHalfyear":1}},"openRegistrations":false,"metadata":{"upstream":{"name":"mastodon","version":"3.5.1"}}} \ No newline at end of file diff --git a/test/fixtures/wildebeest-well-known-nodeinfo.json b/test/fixtures/wildebeest-well-known-nodeinfo.json new file mode 100644 index 0000000000..c7ddb43aff --- /dev/null +++ b/test/fixtures/wildebeest-well-known-nodeinfo.json @@ -0,0 +1 @@ +{"links":[{"rel":"http://nodeinfo.diaspora.software/ns/schema/2.0","href":"https://wildebeest.example.org/nodeinfo/2.0"},{"rel":"http://nodeinfo.diaspora.software/ns/schema/2.1","href":"https://wildebeest.example.org/nodeinfo/2.1"}]} \ No newline at end of file diff --git a/test/pleroma/instances/instance_test.exs b/test/pleroma/instances/instance_test.exs index 861519bcea..a769f93629 100644 --- a/test/pleroma/instances/instance_test.exs +++ b/test/pleroma/instances/instance_test.exs @@ -161,6 +161,66 @@ test "Doesn't scrapes unreachable instances" do end end + describe "get_or_update_metadata/1" do + test "Scrapes Wildebeest NodeInfo" do + Tesla.Mock.mock(fn + %{url: "https://wildebeest.example.org/.well-known/nodeinfo"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/wildebeest-well-known-nodeinfo.json") + } + + %{url: "https://wildebeest.example.org/nodeinfo/2.1"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/wildebeest-nodeinfo21.json") + } + end) + + expected = %{ + software_name: "wildebeest", + software_repository: "https://github.com/cloudflare/wildebeest", + software_version: "0.0.1" + } + + assert expected == + Instance.get_or_update_metadata(URI.parse("https://wildebeest.example.org/")) + + expected = %Pleroma.Instances.Instance.Pleroma.Instances.Metadata{ + software_name: "wildebeest", + software_repository: "https://github.com/cloudflare/wildebeest", + software_version: "0.0.1" + } + + assert expected == + Repo.get_by(Pleroma.Instances.Instance, %{host: "wildebeest.example.org"}).metadata + end + + test "Scrapes Mastodon NodeInfo" do + Tesla.Mock.mock(fn + %{url: "https://mastodon.example.org/.well-known/nodeinfo"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/mastodon-well-known-nodeinfo.json") + } + + %{url: "https://mastodon.example.org/nodeinfo/2.0"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/mastodon-nodeinfo20.json") + } + end) + + expected = %{ + software_name: "mastodon", + software_version: "4.1.0" + } + + assert expected == + Instance.get_or_update_metadata(URI.parse("https://mastodon.example.org/")) + end + end + test "delete_users_and_activities/1 deletes remote instance users and activities" do [mario, luigi, _peach, wario] = users = [ From e444832bb5d0a02ca1a0988c3490d72b99758899 Mon Sep 17 00:00:00 2001 From: Duponin Date: Mon, 10 Apr 2023 20:17:30 +0000 Subject: [PATCH 09/82] fix OTP install documentation 'su pleroma' will never work if 'pleroma' user has no password, which is better for security purpose. If admin has no 'sudo' binary, I'm expecting them to be skilled enough to make their way on their own. --- docs/installation/otp_en.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index 13f9636f30..e7dec90397 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -111,13 +111,13 @@ adduser --system --shell /bin/false --home /opt/pleroma pleroma export FLAVOUR="amd64-musl" # Clone the release build into a temporary directory and unpack it -su pleroma -s $SHELL -lc " +sudo -u pleroma -s $SHELL -lc " curl 'https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=$FLAVOUR' -o /tmp/pleroma.zip unzip /tmp/pleroma.zip -d /tmp/ " # Move the release to the home directory and delete temporary files -su pleroma -s $SHELL -lc " +sudo -u pleroma -s $SHELL -lc " mv /tmp/release/* /opt/pleroma rmdir /tmp/release rm /tmp/pleroma.zip @@ -138,25 +138,25 @@ mkdir -p /etc/pleroma chown -R pleroma /etc/pleroma # Run the config generator -su pleroma -s $SHELL -lc "./bin/pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql" +sudo -u pleroma -s $SHELL -lc "./bin/pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql" # Create the postgres database -su postgres -s $SHELL -lc "psql -f /tmp/setup_db.psql" +sudo -u postgres -s $SHELL -lc "psql -f /tmp/setup_db.psql" # Create the database schema -su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate" +sudo -u pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate" # If you have installed RUM indexes uncommend and run -# su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/" +# sudo -u pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/" # Start the instance to verify that everything is working as expected -su pleroma -s $SHELL -lc "./bin/pleroma daemon" +sudo -u pleroma -s $SHELL -lc "./bin/pleroma daemon" # Wait for about 20 seconds and query the instance endpoint, if it shows your uri, name and email correctly, you are configured correctly sleep 20 && curl http://localhost:4000/api/v1/instance # Stop the instance -su pleroma -s $SHELL -lc "./bin/pleroma stop" +sudo -u pleroma -s $SHELL -lc "./bin/pleroma stop" ``` ### Setting up nginx and getting Let's Encrypt SSL certificaties From 7944271c1bdf4a4240b682249c068deb1b2acab0 Mon Sep 17 00:00:00 2001 From: Duponin Date: Sat, 15 Apr 2023 19:03:51 +0000 Subject: [PATCH 10/82] Unify install guides using sudo to use `sudo -Hu` --- docs/installation/migrating_from_source_otp_en.md | 8 ++++---- docs/installation/otp_en.md | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/installation/migrating_from_source_otp_en.md b/docs/installation/migrating_from_source_otp_en.md index d303a6daf4..64d3353314 100644 --- a/docs/installation/migrating_from_source_otp_en.md +++ b/docs/installation/migrating_from_source_otp_en.md @@ -85,26 +85,26 @@ export FLAVOUR="amd64-musl" # Clone the release build into a temporary directory and unpack it # Replace `stable` with `unstable` if you want to run the unstable branch -su pleroma -s $SHELL -lc " +sudo -Hu pleroma " curl 'https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=$FLAVOUR' -o /tmp/pleroma.zip unzip /tmp/pleroma.zip -d /tmp/ " # Move the release to the home directory and delete temporary files -su pleroma -s $SHELL -lc " +sudo -Hu pleroma " mv /tmp/release/* ~pleroma/ rmdir /tmp/release rm /tmp/pleroma.zip " # Start the instance to verify that everything is working as expected -su pleroma -s $SHELL -lc "./bin/pleroma daemon" +sudo -Hu pleroma "./bin/pleroma daemon" # Wait for about 20 seconds and query the instance endpoint, if it shows your uri, name and email correctly, you are configured correctly sleep 20 && curl http://localhost:4000/api/v1/instance # Stop the instance -su pleroma -s $SHELL -lc "./bin/pleroma stop" +sudo -Hu pleroma "./bin/pleroma stop" ``` ## Setting up a system service diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index e7dec90397..12078cb20d 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -111,13 +111,13 @@ adduser --system --shell /bin/false --home /opt/pleroma pleroma export FLAVOUR="amd64-musl" # Clone the release build into a temporary directory and unpack it -sudo -u pleroma -s $SHELL -lc " +sudo -Hu pleroma " curl 'https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=$FLAVOUR' -o /tmp/pleroma.zip unzip /tmp/pleroma.zip -d /tmp/ " # Move the release to the home directory and delete temporary files -sudo -u pleroma -s $SHELL -lc " +sudo -Hu pleroma " mv /tmp/release/* /opt/pleroma rmdir /tmp/release rm /tmp/pleroma.zip @@ -138,25 +138,25 @@ mkdir -p /etc/pleroma chown -R pleroma /etc/pleroma # Run the config generator -sudo -u pleroma -s $SHELL -lc "./bin/pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql" +sudo -Hu pleroma "./bin/pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql" # Create the postgres database sudo -u postgres -s $SHELL -lc "psql -f /tmp/setup_db.psql" # Create the database schema -sudo -u pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate" +sudo -Hu pleroma "./bin/pleroma_ctl migrate" # If you have installed RUM indexes uncommend and run -# sudo -u pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/" +# sudo -Hu pleroma "./bin/pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/" # Start the instance to verify that everything is working as expected -sudo -u pleroma -s $SHELL -lc "./bin/pleroma daemon" +sudo -Hu pleroma "./bin/pleroma daemon" # Wait for about 20 seconds and query the instance endpoint, if it shows your uri, name and email correctly, you are configured correctly sleep 20 && curl http://localhost:4000/api/v1/instance # Stop the instance -sudo -u pleroma -s $SHELL -lc "./bin/pleroma stop" +sudo -Hu pleroma "./bin/pleroma stop" ``` ### Setting up nginx and getting Let's Encrypt SSL certificaties From d91a823836f416dc0bdf0fe8527695d372dcb347 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Sat, 22 Apr 2023 16:14:56 +0000 Subject: [PATCH 11/82] Remove unused indexes These indexes were always listed as unused and several grow quite large. The most significant impact is the activities_visibility_index which takes many hours to rebuild when restoring the server from backup even on fast hardware. --- .../20230422154018_drop_unused_indexes.exs | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 priv/repo/migrations/20230422154018_drop_unused_indexes.exs diff --git a/priv/repo/migrations/20230422154018_drop_unused_indexes.exs b/priv/repo/migrations/20230422154018_drop_unused_indexes.exs new file mode 100644 index 0000000000..f2ba6b8df1 --- /dev/null +++ b/priv/repo/migrations/20230422154018_drop_unused_indexes.exs @@ -0,0 +1,88 @@ +defmodule Pleroma.Repo.Migrations.DropUnusedIndexes do + use Ecto.Migration + + @disable_ddl_transaction true + @disable_migration_lock true + + def up do + drop_if_exists( + index(:activities, ["(data->>'actor')", "inserted_at desc"], name: :activities_actor_index) + ) + + drop_if_exists(index(:activities, ["(data->'to')"], name: :activities_to_index)) + + drop_if_exists(index(:activities, ["(data->'cc')"], name: :activities_cc_index)) + + drop_if_exists(index(:activities, ["(split_part(actor, '/', 3))"], name: :activities_hosts)) + + drop_if_exists( + index(:activities, ["(data->'object'->>'inReplyTo')"], name: :activities_in_reply_to) + ) + + drop_if_exists( + index(:activities, ["((data #> '{\"object\",\"likes\"}'))"], name: :activities_likes) + ) + + drop_if_exists( + index(:activities, ["activity_visibility(actor, recipients, data)", "id DESC NULLS LAST"], + name: :activities_visibility_index, + where: "data->>'type' = 'Create'" + ) + ) + end + + def down do + create_if_not_exists( + index(:activities, ["(data->>'actor')", "inserted_at desc"], + name: :activities_actor_index, + concurrently: true + ) + ) + + create_if_not_exists( + index(:activities, ["(data->'to')"], + name: :activities_to_index, + using: :gin, + concurrently: true + ) + ) + + create_if_not_exists( + index(:activities, ["(data->'cc')"], + name: :activities_cc_index, + using: :gin, + concurrently: true + ) + ) + + create_if_not_exists( + index(:activities, ["(split_part(actor, '/', 3))"], + name: :activities_hosts, + concurrently: true + ) + ) + + create_if_not_exists( + index(:activities, ["(data->'object'->>'inReplyTo')"], + name: :activities_in_reply_to, + concurrently: true + ) + ) + + create_if_not_exists( + index(:activities, ["((data #> '{\"object\",\"likes\"}'))"], + name: :activities_likes, + using: :gin, + concurrently: true + ) + ) + + create_if_not_exists( + index(:activities, ["activity_visibility(actor, recipients, data)", "id DESC NULLS LAST"], + name: :activities_visibility_index, + where: "data->>'type' = 'Create'", + concurrently: true + ) + ) + end +end From 4fd96b24aef831095ac8b3494fe4c59d8c9de333 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 10:53:09 +0200 Subject: [PATCH 12/82] AddRemoveValidator: Use User.fetch_by_ap_id instead of upgrade_user_from_ap_id --- .../web/activity_pub/object_validators/add_remove_validator.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/add_remove_validator.ex b/lib/pleroma/web/activity_pub/object_validators/add_remove_validator.ex index 5202db7f15..db3259550c 100644 --- a/lib/pleroma/web/activity_pub/object_validators/add_remove_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/add_remove_validator.ex @@ -73,6 +73,7 @@ defp maybe_refetch_user(%User{featured_address: address} = user) when is_binary( end defp maybe_refetch_user(%User{ap_id: ap_id}) do - Pleroma.Web.ActivityPub.Transmogrifier.upgrade_user_from_ap_id(ap_id) + # Maybe it could use User.get_or_fetch_by_ap_id to avoid refreshing too often + User.fetch_by_ap_id(ap_id) end end From 0903c416456d137fa40bef231c31f038c8c20e9f Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 10:54:16 +0200 Subject: [PATCH 13/82] User: Stop relying on ap_enabled --- lib/pleroma/user.ex | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index f6e30555cb..2a0faed77a 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1061,11 +1061,7 @@ def maybe_direct_follow(%User{} = follower, %User{local: true} = followed) do end def maybe_direct_follow(%User{} = follower, %User{} = followed) do - if not ap_enabled?(followed) do - follow(follower, followed) - else - {:ok, follower, followed} - end + {:ok, follower, followed} end @doc "A mass follow for local users. Respects blocks in both directions but does not create activities." From 606f78f5e5781a59cb9d083e8085144cca326cc6 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 10:55:08 +0200 Subject: [PATCH 14/82] ActivityPub: Stop relying on ap_enabled and upgrade_user_from_ap_id --- lib/pleroma/web/activity_pub/activity_pub.ex | 28 +++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index f22756015e..2fae98fad1 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1751,24 +1751,20 @@ def pinned_fetch_task(%{pinned_objects: pins}) do def make_user_from_ap_id(ap_id, additional \\ []) do user = User.get_cached_by_ap_id(ap_id) - if user && !User.ap_enabled?(user) do - Transmogrifier.upgrade_user_from_ap_id(ap_id) - else - with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id, additional) do - {:ok, _pid} = Task.start(fn -> pinned_fetch_task(data) end) + with {:ok, data} <- fetch_and_prepare_user_from_ap_id(ap_id, additional) do + {:ok, _pid} = Task.start(fn -> pinned_fetch_task(data) end) - if user do - user - |> User.remote_user_changeset(data) - |> User.update_and_set_cache() - else - maybe_handle_clashing_nickname(data) + if user do + user + |> User.remote_user_changeset(data) + |> User.update_and_set_cache() + else + maybe_handle_clashing_nickname(data) - data - |> User.remote_user_changeset() - |> Repo.insert() - |> User.set_cache() - end + data + |> User.remote_user_changeset() + |> Repo.insert() + |> User.set_cache() end end end From 3962253cf16d19237b00b5e01573aed10fb596bd Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 10:55:46 +0200 Subject: [PATCH 15/82] Publisher: Stop filtering via ap_enabled?/1 --- lib/pleroma/web/activity_pub/publisher.ex | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index 6c1ba76a3c..af6aa0781e 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -199,7 +199,6 @@ def publish(%User{} = actor, %{data: %{"bcc" => bcc}} = activity) inboxes = recipients - |> Enum.filter(&User.ap_enabled?/1) |> Enum.map(fn actor -> actor.inbox end) |> Enum.filter(fn inbox -> should_federate?(inbox, public) end) |> Instances.filter_reachable() @@ -241,7 +240,6 @@ def publish(%User{} = actor, %Activity{} = activity) do json = Jason.encode!(data) recipients(actor, activity) - |> Enum.filter(fn user -> User.ap_enabled?(user) end) |> Enum.map(fn %User{} = user -> determine_inbox(activity, user) end) From 2ee483ba41eb4f01c3ca763c30dcaa07d3b258f9 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 11:00:40 +0200 Subject: [PATCH 16/82] Transmogrifier: Remove upgrade_user_from_ap_id --- .../web/activity_pub/transmogrifier.ex | 20 ------ .../web/activity_pub/transmogrifier_test.exs | 64 ------------------- 2 files changed, 84 deletions(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 3141f84378..ea7a6a8105 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -20,7 +20,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.Federator - alias Pleroma.Workers.TransmogrifierWorker import Ecto.Query @@ -968,25 +967,6 @@ def perform(:user_upgrade, user) do |> Repo.update_all([]) end - def upgrade_user_from_ap_id(ap_id) do - with %User{local: false} = user <- User.get_cached_by_ap_id(ap_id), - {:ok, data} <- ActivityPub.fetch_and_prepare_user_from_ap_id(ap_id), - {:ok, user} <- update_user(user, data) do - {:ok, _pid} = Task.start(fn -> ActivityPub.pinned_fetch_task(user) end) - TransmogrifierWorker.enqueue("user_upgrade", %{"user_id" => user.id}) - {:ok, user} - else - %User{} = user -> {:ok, user} - e -> e - end - end - - defp update_user(user, data) do - user - |> User.remote_user_changeset(data) - |> User.update_and_set_cache() - end - def maybe_fix_user_url(%{"url" => url} = data) when is_map(url) do Map.put(data, "url", url["href"]) end diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs index 6b4636d227..588f462965 100644 --- a/test/pleroma/web/activity_pub/transmogrifier_test.exs +++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do alias Pleroma.Activity alias Pleroma.Object - alias Pleroma.Tests.ObanHelpers alias Pleroma.User alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.ActivityPub.Utils @@ -339,69 +338,6 @@ test "Updates of Notes are handled" do end end - describe "user upgrade" do - test "it upgrades a user to activitypub" do - user = - insert(:user, %{ - nickname: "rye@niu.moe", - local: false, - ap_id: "https://niu.moe/users/rye", - follower_address: User.ap_followers(%User{nickname: "rye@niu.moe"}) - }) - - user_two = insert(:user) - Pleroma.FollowingRelationship.follow(user_two, user, :follow_accept) - - {:ok, activity} = CommonAPI.post(user, %{status: "test"}) - {:ok, unrelated_activity} = CommonAPI.post(user_two, %{status: "test"}) - assert "http://localhost:4001/users/rye@niu.moe/followers" in activity.recipients - - user = User.get_cached_by_id(user.id) - assert user.note_count == 1 - - {:ok, user} = Transmogrifier.upgrade_user_from_ap_id("https://niu.moe/users/rye") - ObanHelpers.perform_all() - - assert user.ap_enabled - assert user.note_count == 1 - assert user.follower_address == "https://niu.moe/users/rye/followers" - assert user.following_address == "https://niu.moe/users/rye/following" - - user = User.get_cached_by_id(user.id) - assert user.note_count == 1 - - activity = Activity.get_by_id(activity.id) - assert user.follower_address in activity.recipients - - assert %{ - "url" => [ - %{ - "href" => - "https://cdn.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg" - } - ] - } = user.avatar - - assert %{ - "url" => [ - %{ - "href" => - "https://cdn.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" - } - ] - } = user.banner - - refute "..." in activity.recipients - - unrelated_activity = Activity.get_by_id(unrelated_activity.id) - refute user.follower_address in unrelated_activity.recipients - - user_two = User.get_cached_by_id(user_two.id) - assert User.following?(user_two, user) - refute "..." in User.following(user_two) - end - end - describe "actor rewriting" do test "it fixes the actor URL property to be a proper URI" do data = %{ From e17265a7a248db7514b091d47ae79d1a2de5b440 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 11:01:29 +0200 Subject: [PATCH 17/82] TransmogrifierWorker: Remove obsolete worker --- .../web/activity_pub/transmogrifier.ex | 22 ------------------- lib/pleroma/workers/transmogrifier_worker.ex | 18 --------------- 2 files changed, 40 deletions(-) delete mode 100644 lib/pleroma/workers/transmogrifier_worker.ex diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index ea7a6a8105..0e6c429f97 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -945,28 +945,6 @@ defp strip_internal_tags(%{"tag" => tags} = object) do defp strip_internal_tags(object), do: object - def perform(:user_upgrade, user) do - # we pass a fake user so that the followers collection is stripped away - old_follower_address = User.ap_followers(%User{nickname: user.nickname}) - - from( - a in Activity, - where: ^old_follower_address in a.recipients, - update: [ - set: [ - recipients: - fragment( - "array_replace(?,?,?)", - a.recipients, - ^old_follower_address, - ^user.follower_address - ) - ] - ] - ) - |> Repo.update_all([]) - end - def maybe_fix_user_url(%{"url" => url} = data) when is_map(url) do Map.put(data, "url", url["href"]) end diff --git a/lib/pleroma/workers/transmogrifier_worker.ex b/lib/pleroma/workers/transmogrifier_worker.ex deleted file mode 100644 index 1f3f5385ec..0000000000 --- a/lib/pleroma/workers/transmogrifier_worker.ex +++ /dev/null @@ -1,18 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2022 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Workers.TransmogrifierWorker do - alias Pleroma.User - - use Pleroma.Workers.WorkerHelper, queue: "transmogrifier" - - @impl Oban.Worker - def perform(%Job{args: %{"op" => "user_upgrade", "user_id" => user_id}}) do - user = User.get_cached_by_id(user_id) - Pleroma.Web.ActivityPub.Transmogrifier.perform(:user_upgrade, user) - end - - @impl Oban.Worker - def timeout(_job), do: :timer.seconds(5) -end From 8181be89a28ec293cb36fccc2324bc78cc118d3a Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 11:02:58 +0200 Subject: [PATCH 18/82] Federator: Stop using ap_enabled?/1 --- lib/pleroma/web/federator.ex | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/lib/pleroma/web/federator.ex b/lib/pleroma/web/federator.ex index 318b6cb11a..84b77cda16 100644 --- a/lib/pleroma/web/federator.ex +++ b/lib/pleroma/web/federator.ex @@ -6,7 +6,6 @@ defmodule Pleroma.Web.Federator do alias Pleroma.Activity alias Pleroma.Object.Containment alias Pleroma.User - alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Transmogrifier alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.Federator.Publisher @@ -80,7 +79,7 @@ def perform(:incoming_ap_doc, params) do # NOTE: we use the actor ID to do the containment, this is fine because an # actor shouldn't be acting on objects outside their own AP server. - with {_, {:ok, _user}} <- {:actor, ap_enabled_actor(actor)}, + with {_, {:ok, _user}} <- {:actor, User.get_or_fetch_by_ap_id(actor)}, nil <- Activity.normalize(params["id"]), {_, :ok} <- {:correct_origin?, Containment.contain_origin_from_id(actor, params)}, @@ -110,14 +109,4 @@ def perform(:incoming_ap_doc, params) do {:error, e} end end - - def ap_enabled_actor(id) do - user = User.get_cached_by_ap_id(id) - - if User.ap_enabled?(user) do - {:ok, user} - else - ActivityPub.make_user_from_ap_id(id) - end - end end From 9dfa1c4be0d9c37222a299c212607407f93d6596 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 11:07:18 +0200 Subject: [PATCH 19/82] ActivityPub: Mark fetch_and_prepare_user_from_ap_id/1 as private --- lib/pleroma/web/activity_pub/activity_pub.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 2fae98fad1..9175e9e13d 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1668,7 +1668,7 @@ def user_data_from_user_object(data, additional \\ []) do end end - def fetch_and_prepare_user_from_ap_id(ap_id, additional \\ []) do + defp fetch_and_prepare_user_from_ap_id(ap_id, additional) do with {:ok, data} <- Fetcher.fetch_and_contain_remote_object_from_id(ap_id), {:ok, data} <- user_data_from_user_object(data, additional) do {:ok, maybe_update_follow_information(data)} From 238edc30dec2cb48b3a6eca48397d5202060726e Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 11:08:26 +0200 Subject: [PATCH 20/82] User: Remove ap_enabled?/1 --- lib/pleroma/user.ex | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 2a0faed77a..eff82afd9f 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -2147,10 +2147,6 @@ def get_public_key_for_ap_id(ap_id) do end end - def ap_enabled?(%User{local: true}), do: true - def ap_enabled?(%User{ap_enabled: ap_enabled}), do: ap_enabled - def ap_enabled?(_), do: false - @doc "Gets or fetch a user by uri or nickname." @spec get_or_fetch(String.t()) :: {:ok, User.t()} | {:error, String.t()} def get_or_fetch("http://" <> _host = uri), do: get_or_fetch_by_ap_id(uri) From fcd49e3985d34bd3b783791e12e638f66cab0a9b Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 11:09:15 +0200 Subject: [PATCH 21/82] User: Remove ap_enabled field --- lib/pleroma/user.ex | 3 --- lib/pleroma/web/activity_pub/activity_pub.ex | 1 - .../20230504173400_remove_user_ap_enabled.exs | 13 +++++++++++++ test/pleroma/user_test.exs | 11 +++-------- .../activity_pub/activity_pub_controller_test.exs | 1 - .../web/activity_pub/activity_pub_test.exs | 1 - test/pleroma/web/activity_pub/publisher_test.exs | 15 +++++---------- test/pleroma/web/common_api_test.exs | 2 +- test/pleroma/web/federator_test.exs | 6 ++---- test/support/factory.ex | 1 - 10 files changed, 24 insertions(+), 30 deletions(-) create mode 100644 priv/repo/migrations/20230504173400_remove_user_ap_enabled.exs diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index eff82afd9f..ce125d6081 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -124,7 +124,6 @@ defmodule Pleroma.User do field(:domain_blocks, {:array, :string}, default: []) field(:is_active, :boolean, default: true) field(:no_rich_text, :boolean, default: false) - field(:ap_enabled, :boolean, default: false) field(:is_moderator, :boolean, default: false) field(:is_admin, :boolean, default: false) field(:show_role, :boolean, default: true) @@ -488,7 +487,6 @@ def remote_user_changeset(struct \\ %User{local: false}, params) do :nickname, :public_key, :avatar, - :ap_enabled, :banner, :is_locked, :last_refreshed_at, @@ -1894,7 +1892,6 @@ def purge_user_changeset(user) do confirmation_token: nil, domain_blocks: [], is_active: false, - ap_enabled: false, is_moderator: false, is_admin: false, mascot: nil, diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 9175e9e13d..1a10aef1db 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1547,7 +1547,6 @@ defp object_to_user_data(data, additional) do %{ ap_id: data["id"], uri: get_actor_url(data["url"]), - ap_enabled: true, banner: normalize_image(data["image"]), fields: fields, emoji: emojis, diff --git a/priv/repo/migrations/20230504173400_remove_user_ap_enabled.exs b/priv/repo/migrations/20230504173400_remove_user_ap_enabled.exs new file mode 100644 index 0000000000..0aea41324b --- /dev/null +++ b/priv/repo/migrations/20230504173400_remove_user_ap_enabled.exs @@ -0,0 +1,13 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Repo.Migrations.RemoveUserApEnabled do + use Ecto.Migration + + def change do + alter table(:users) do + remove(:ap_enabled, :boolean, default: false, null: false) + end + end +end diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs index c16312a658..7f60b959af 100644 --- a/test/pleroma/user_test.exs +++ b/test/pleroma/user_test.exs @@ -1844,7 +1844,6 @@ test "delete/1 purges a user when they wouldn't be fully deleted" do confirmation_token: "qqqq", domain_blocks: ["lain.com"], is_active: false, - ap_enabled: true, is_moderator: true, is_admin: true, mascot: %{"a" => "b"}, @@ -1885,7 +1884,6 @@ test "delete/1 purges a user when they wouldn't be fully deleted" do confirmation_token: nil, domain_blocks: [], is_active: false, - ap_enabled: false, is_moderator: false, is_admin: false, mascot: nil, @@ -2473,8 +2471,7 @@ test "updates the counters normally on following/getting a follow when disabled" insert(:user, local: false, follower_address: "http://localhost:4001/users/masto_closed/followers", - following_address: "http://localhost:4001/users/masto_closed/following", - ap_enabled: true + following_address: "http://localhost:4001/users/masto_closed/following" ) assert other_user.following_count == 0 @@ -2495,8 +2492,7 @@ test "synchronizes the counters with the remote instance for the followed when e insert(:user, local: false, follower_address: "http://localhost:4001/users/masto_closed/followers", - following_address: "http://localhost:4001/users/masto_closed/following", - ap_enabled: true + following_address: "http://localhost:4001/users/masto_closed/following" ) assert other_user.following_count == 0 @@ -2517,8 +2513,7 @@ test "synchronizes the counters with the remote instance for the follower when e insert(:user, local: false, follower_address: "http://localhost:4001/users/masto_closed/followers", - following_address: "http://localhost:4001/users/masto_closed/following", - ap_enabled: true + following_address: "http://localhost:4001/users/masto_closed/following" ) assert other_user.following_count == 0 diff --git a/test/pleroma/web/activity_pub/activity_pub_controller_test.exs b/test/pleroma/web/activity_pub/activity_pub_controller_test.exs index ef91066c10..62eb9b5a32 100644 --- a/test/pleroma/web/activity_pub/activity_pub_controller_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_controller_test.exs @@ -575,7 +575,6 @@ test "it inserts an incoming activity into the database" <> user = insert(:user, ap_id: "https://mastodon.example.org/users/raymoo", - ap_enabled: true, local: false, last_refreshed_at: nil ) diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs index a6f8b6152e..54fc6ef0a6 100644 --- a/test/pleroma/web/activity_pub/activity_pub_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -174,7 +174,6 @@ test "it returns a user" do {:ok, user} = ActivityPub.make_user_from_ap_id(user_id) assert user.ap_id == user_id assert user.nickname == "admin@mastodon.example.org" - assert user.ap_enabled assert user.follower_address == "http://mastodon.example.org/users/admin/followers" end diff --git a/test/pleroma/web/activity_pub/publisher_test.exs b/test/pleroma/web/activity_pub/publisher_test.exs index e2db3d5754..c5137cbb75 100644 --- a/test/pleroma/web/activity_pub/publisher_test.exs +++ b/test/pleroma/web/activity_pub/publisher_test.exs @@ -276,8 +276,7 @@ test "publish to url with with different ports" do follower = insert(:user, %{ local: false, - inbox: "https://domain.com/users/nick1/inbox", - ap_enabled: true + inbox: "https://domain.com/users/nick1/inbox" }) actor = insert(:user, follower_address: follower.ap_id) @@ -313,8 +312,7 @@ test "publish to url with with different ports" do follower = insert(:user, %{ local: false, - inbox: "https://domain.com/users/nick1/inbox", - ap_enabled: true + inbox: "https://domain.com/users/nick1/inbox" }) actor = insert(:user, follower_address: follower.ap_id) @@ -348,8 +346,7 @@ test "publish to url with with different ports" do follower = insert(:user, %{ local: false, - inbox: "https://domain.com/users/nick1/inbox", - ap_enabled: true + inbox: "https://domain.com/users/nick1/inbox" }) actor = insert(:user, follower_address: follower.ap_id) @@ -382,15 +379,13 @@ test "publish to url with with different ports" do fetcher = insert(:user, local: false, - inbox: "https://domain.com/users/nick1/inbox", - ap_enabled: true + inbox: "https://domain.com/users/nick1/inbox" ) another_fetcher = insert(:user, local: false, - inbox: "https://domain2.com/users/nick1/inbox", - ap_enabled: true + inbox: "https://domain2.com/users/nick1/inbox" ) actor = insert(:user) diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs index 5c9103e9fc..5bd0df0b2a 100644 --- a/test/pleroma/web/common_api_test.exs +++ b/test/pleroma/web/common_api_test.exs @@ -1328,7 +1328,7 @@ test "cancels a pending follow for a local user" do test "cancels a pending follow for a remote user" do follower = insert(:user) - followed = insert(:user, is_locked: true, local: false, ap_enabled: true) + followed = insert(:user, is_locked: true, local: false) assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = CommonAPI.follow(follower, followed) diff --git a/test/pleroma/web/federator_test.exs b/test/pleroma/web/federator_test.exs index 1ffe6aae15..6826e6c2f6 100644 --- a/test/pleroma/web/federator_test.exs +++ b/test/pleroma/web/federator_test.exs @@ -78,16 +78,14 @@ test "it federates only to reachable instances via AP" do local: false, nickname: "nick1@domain.com", ap_id: "https://domain.com/users/nick1", - inbox: inbox1, - ap_enabled: true + inbox: inbox1 }) insert(:user, %{ local: false, nickname: "nick2@domain2.com", ap_id: "https://domain2.com/users/nick2", - inbox: inbox2, - ap_enabled: true + inbox: inbox2 }) dt = NaiveDateTime.utc_now() diff --git a/test/support/factory.ex b/test/support/factory.ex index 09f02458cf..d945447170 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -50,7 +50,6 @@ def user_factory(attrs \\ %{}) do last_refreshed_at: NaiveDateTime.utc_now(), notification_settings: %Pleroma.User.NotificationSetting{}, multi_factor_authentication_settings: %Pleroma.MFA.Settings{}, - ap_enabled: true, keys: pem } From c63bf6a040ffd982da43e980209a7d96e87e4d7f Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 5 May 2023 11:13:50 +0200 Subject: [PATCH 22/82] Add changelog for !3880 --- changelog.d/3880.remove | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/3880.remove diff --git a/changelog.d/3880.remove b/changelog.d/3880.remove new file mode 100644 index 0000000000..113c76c856 --- /dev/null +++ b/changelog.d/3880.remove @@ -0,0 +1 @@ +Cleanup OStatus-era user upgrades and ap_enabled indicator \ No newline at end of file From fb3335ffe287205274167d73a3124d2f811f2b6b Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Wed, 17 May 2023 17:12:21 +0200 Subject: [PATCH 23/82] EctoType: Add BareUri --- .../object_validators/bare_uri.ex | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 lib/pleroma/ecto_type/activity_pub/object_validators/bare_uri.ex diff --git a/lib/pleroma/ecto_type/activity_pub/object_validators/bare_uri.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/bare_uri.ex new file mode 100644 index 0000000000..1038296e7e --- /dev/null +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/bare_uri.ex @@ -0,0 +1,23 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.BareUri do + use Ecto.Type + + def type, do: :string + + def cast(uri) when is_binary(uri) do + case URI.parse(uri) do + %URI{scheme: nil} -> :error + %URI{} -> {:ok, uri} + _ -> :error + end + end + + def cast(_), do: :error + + def dump(data), do: {:ok, data} + + def load(data), do: {:ok, data} +end From a5066bb0789e15d808e99e8676c16ad74290419c Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Wed, 17 May 2023 17:13:26 +0200 Subject: [PATCH 24/82] CommonFields: Use BareUri for :url Closes: https://git.pleroma.social/pleroma/pleroma/-/issues/3121 --- changelog.d/3884.fix | 1 + .../object_validators/common_fields.ex | 2 +- .../object_validators/bare_uri_test.ex | 25 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 changelog.d/3884.fix create mode 100644 test/pleroma/ecto_type/activity_pub/object_validators/bare_uri_test.ex diff --git a/changelog.d/3884.fix b/changelog.d/3884.fix new file mode 100644 index 0000000000..f8dbb2bbf4 --- /dev/null +++ b/changelog.d/3884.fix @@ -0,0 +1 @@ +Allow non-HTTP(s) URIs in "url" fields for compatibility with "FEP-fffd: Proxy Objects" \ No newline at end of file diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex index 7b60c139ad..d580208df6 100644 --- a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex +++ b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex @@ -58,7 +58,7 @@ defmacro status_object_fields do field(:like_count, :integer, default: 0) field(:announcement_count, :integer, default: 0) field(:inReplyTo, ObjectValidators.ObjectID) - field(:url, ObjectValidators.Uri) + field(:url, ObjectValidators.BareUri) field(:likes, {:array, ObjectValidators.ObjectID}, default: []) field(:announcements, {:array, ObjectValidators.ObjectID}, default: []) diff --git a/test/pleroma/ecto_type/activity_pub/object_validators/bare_uri_test.ex b/test/pleroma/ecto_type/activity_pub/object_validators/bare_uri_test.ex new file mode 100644 index 0000000000..226383c3c5 --- /dev/null +++ b/test/pleroma/ecto_type/activity_pub/object_validators/bare_uri_test.ex @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.BareUriTest do + use Pleroma.DataCase, async: true + + alias Pleroma.EctoType.ActivityPub.ObjectValidators.BareUri + + test "diaspora://" do + text = "diaspora://alice@fediverse.example/post/deadbeefdeadbeefdeadbeefdeadbeef" + assert {:ok, text} = BareUri.cast(text) + end + + test "nostr:" do + text = "nostr:note1gwdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef" + assert {:ok, text} = BareUri.cast(text) + end + + test "errors for non-URIs" do + assert :error == SafeText.cast(1) + assert :error == SafeText.cast("foo") + assert :error == SafeText.cast("foo bar") + end +end From 2c66f584b53efe834e359b6829f5a73ad067dce2 Mon Sep 17 00:00:00 2001 From: tusooa Date: Sun, 21 May 2023 09:11:43 -0400 Subject: [PATCH 25/82] Show more informative errors when profile exceeds char limits --- .../update-credentials-limit-error.fix | 1 + .../controllers/account_controller.ex | 12 +++++ .../mastodon_api/update_credentials_test.exs | 48 ++++++++++++++++--- 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 changelog.d/update-credentials-limit-error.fix diff --git a/changelog.d/update-credentials-limit-error.fix b/changelog.d/update-credentials-limit-error.fix new file mode 100644 index 0000000000..7682f958ec --- /dev/null +++ b/changelog.d/update-credentials-limit-error.fix @@ -0,0 +1 @@ +Show more informative errors when profile exceeds char limits diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index c313a0e97a..9a4b563014 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -263,6 +263,18 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p {:error, %Ecto.Changeset{errors: [background: {"file is too large", _}]}} -> render_error(conn, :request_entity_too_large, "File is too large") + {:error, %Ecto.Changeset{errors: [{:bio, {_, _}} | _]}} -> + render_error(conn, :request_entity_too_large, "Bio is too long") + + {:error, %Ecto.Changeset{errors: [{:name, {_, _}} | _]}} -> + render_error(conn, :request_entity_too_large, "Name is too long") + + {:error, %Ecto.Changeset{errors: [{:fields, {"invalid", _}} | _]}} -> + render_error(conn, :request_entity_too_large, "One or more field entries are too long") + + {:error, %Ecto.Changeset{errors: [{:fields, {_, _}} | _]}} -> + render_error(conn, :request_entity_too_large, "Too many field entries") + _e -> render_error(conn, :forbidden, "Invalid request") end diff --git a/test/pleroma/web/mastodon_api/update_credentials_test.exs b/test/pleroma/web/mastodon_api/update_credentials_test.exs index 6c63d53c2f..45412bb34c 100644 --- a/test/pleroma/web/mastodon_api/update_credentials_test.exs +++ b/test/pleroma/web/mastodon_api/update_credentials_test.exs @@ -97,6 +97,42 @@ test "updates the user's bio", %{conn: conn} do assert user.raw_bio == raw_bio end + test "updating bio honours bio limit", %{conn: conn} do + bio_limit = Config.get([:instance, :user_bio_length], 5000) + + raw_bio = String.duplicate(".", bio_limit + 1) + + conn = patch(conn, "/api/v1/accounts/update_credentials", %{"note" => raw_bio}) + + assert %{"error" => "Bio is too long"} = json_response_and_validate_schema(conn, 413) + end + + test "updating name honours name limit", %{conn: conn} do + name_limit = Config.get([:instance, :user_name_length], 100) + + name = String.duplicate(".", name_limit + 1) + + conn = patch(conn, "/api/v1/accounts/update_credentials", %{"display_name" => name}) + + assert %{"error" => "Name is too long"} = json_response_and_validate_schema(conn, 413) + end + + test "when both name and bio exceeds the limit, display name error", %{conn: conn} do + name_limit = Config.get([:instance, :user_name_length], 100) + bio_limit = Config.get([:instance, :user_bio_length], 5000) + + name = String.duplicate(".", name_limit + 1) + raw_bio = String.duplicate(".", bio_limit + 1) + + conn = + patch(conn, "/api/v1/accounts/update_credentials", %{ + "display_name" => name, + "note" => raw_bio + }) + + assert %{"error" => "Name is too long"} = json_response_and_validate_schema(conn, 413) + end + test "updates the user's locking status", %{conn: conn} do conn = patch(conn, "/api/v1/accounts/update_credentials", %{locked: "true"}) @@ -595,17 +631,17 @@ test "update fields when invalid request", %{conn: conn} do fields = [%{"name" => "foo", "value" => long_value}] - assert %{"error" => "Invalid request"} == + assert %{"error" => "One or more field entries are too long"} == conn |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response_and_validate_schema(403) + |> json_response_and_validate_schema(413) fields = [%{"name" => long_name, "value" => "bar"}] - assert %{"error" => "Invalid request"} == + assert %{"error" => "One or more field entries are too long"} == conn |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response_and_validate_schema(403) + |> json_response_and_validate_schema(413) clear_config([:instance, :max_account_fields], 1) @@ -614,10 +650,10 @@ test "update fields when invalid request", %{conn: conn} do %{"name" => "link", "value" => "cofe.io"} ] - assert %{"error" => "Invalid request"} == + assert %{"error" => "Too many field entries"} == conn |> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) - |> json_response_and_validate_schema(403) + |> json_response_and_validate_schema(413) end end From 1fa196d8f7abfeccfcd911c74190866ad0950ca0 Mon Sep 17 00:00:00 2001 From: tusooa Date: Thu, 25 May 2023 18:40:38 -0400 Subject: [PATCH 26/82] Fix deleting banned users' statuses --- changelog.d/delete-status-of-banned-user.fix | 1 + lib/pleroma/web/common_api.ex | 2 +- test/pleroma/web/common_api_test.exs | 14 +++++++++++++ .../controllers/status_controller_test.exs | 21 +++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 changelog.d/delete-status-of-banned-user.fix diff --git a/changelog.d/delete-status-of-banned-user.fix b/changelog.d/delete-status-of-banned-user.fix new file mode 100644 index 0000000000..1fa6a29d8a --- /dev/null +++ b/changelog.d/delete-status-of-banned-user.fix @@ -0,0 +1 @@ +Fix error 404 when deleting status of a banned user diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex index 89cc0d6fe8..65d08de493 100644 --- a/lib/pleroma/web/common_api.ex +++ b/lib/pleroma/web/common_api.ex @@ -142,7 +142,7 @@ def reject_follow_request(follower, followed) do def delete(activity_id, user) do with {_, %Activity{data: %{"object" => _, "type" => "Create"}} = activity} <- - {:find_activity, Activity.get_by_id(activity_id)}, + {:find_activity, Activity.get_by_id(activity_id, filter: [])}, {_, %Object{} = object, _} <- {:find_object, Object.normalize(activity, fetch: false), activity}, true <- User.privileged?(user, :messages_delete) || user.ap_id == object.data["actor"], diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs index 968d826a2d..9f4739a1f8 100644 --- a/test/pleroma/web/common_api_test.exs +++ b/test/pleroma/web/common_api_test.exs @@ -393,6 +393,20 @@ test "privileged users deleting non-local posts won't federate the delete" do refute Activity.get_by_id(post.id) end + + test "it allows privileged users to delete banned user's posts" do + clear_config([:instance, :moderator_privileges], [:messages_delete]) + user = insert(:user) + moderator = insert(:user, is_moderator: true) + + {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + User.set_activation(user, false) + + assert {:ok, delete} = CommonAPI.delete(post.id, moderator) + assert delete.local + + refute Activity.get_by_id(post.id) + end end test "favoriting race condition" do diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs index 1e89791277..4f434cb69c 100644 --- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs @@ -1018,6 +1018,27 @@ test "when you're privileged to", %{conn: conn} do refute Activity.get_by_id(activity.id) end + + test "when you're privileged and the user is banned", %{conn: conn} do + clear_config([:instance, :moderator_privileges], [:messages_delete]) + posting_user = insert(:user, is_active: false) + refute posting_user.is_active + activity = insert(:note_activity, user: posting_user) + user = insert(:user, is_moderator: true) + + res_conn = + conn + |> assign(:user, user) + |> assign(:token, insert(:oauth_token, user: user, scopes: ["write:statuses"])) + |> delete("/api/v1/statuses/#{activity.id}") + + assert %{} = json_response_and_validate_schema(res_conn, 200) + + assert ModerationLog |> Repo.one() |> ModerationLog.get_log_entry_message() == + "@#{user.nickname} deleted status ##{activity.id}" + + refute Activity.get_by_id(activity.id) + end end describe "reblogging" do From 279fd47b486ccfda4537d7a64d553ac261a6fdd8 Mon Sep 17 00:00:00 2001 From: Zero Date: Thu, 25 May 2023 12:36:05 -0400 Subject: [PATCH 27/82] ForceMentionsInContent: fix double mentions for Mastodon/Misskey posts The code checked for duplicates using "ap_id", but in Mastodon and Misskey the look like that: Mastodon: https://mastodon.example.com/users/roger Misskey: https:///misskey.example.com/users/104ab42f11 The fix is to also check for "uri", which is what will be in the "explicitly_mentioned_uris" list: Mastodon: https://mastodon.example.com/@roger Misskey: https://misskey.example.com/@roger --- changelog.d/3888.fix | 1 + .../mrf/force_mentions_in_content.ex | 6 +-- .../mrf/force_mentions_in_content_test.exs | 51 +++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 changelog.d/3888.fix diff --git a/changelog.d/3888.fix b/changelog.d/3888.fix new file mode 100644 index 0000000000..886aa7b398 --- /dev/null +++ b/changelog.d/3888.fix @@ -0,0 +1 @@ +ForceMentionsInContent: fix double mentions for Mastodon/Misskey posts \ No newline at end of file diff --git a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex index 70224561c5..b9b175cc3f 100644 --- a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex +++ b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex @@ -1,5 +1,5 @@ # Pleroma: A lightweight social networking server -# Copyright © 2017-2022 Pleroma Authors +# Copyright © 2017-2023 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent do @@ -98,8 +98,8 @@ def filter( explicitly_mentioned_uris = extract_mention_uris_from_content(content) added_mentions = - Enum.reduce(mention_users, "", fn %User{ap_id: uri} = user, acc -> - unless uri in explicitly_mentioned_uris do + Enum.reduce(mention_users, "", fn %User{ap_id: api_id, uri: uri} = user, acc -> + unless Enum.any?([api_id, uri], fn u -> u in explicitly_mentioned_uris end) do acc <> Formatter.mention_from_user(user, %{mentions_format: :compact}) <> " " else acc diff --git a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs index b349a4bb75..5ebd972a61 100644 --- a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs +++ b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs @@ -256,4 +256,55 @@ test "works with Updates" do } }} = MRF.filter_one(ForceMentionsInContent, activity) end + + test "don't add duplicate mentions for mastodon or misskey posts" do + [zero, rogerick, greg] = [ + insert(:user, + ap_id: "https://pleroma.example.com/users/zero", + uri: "https://pleroma.example.com/users/zero", + nickname: "zero@pleroma.example.com", + local: false + ), + insert(:user, + ap_id: "https://misskey.example.com/users/104ab42f11", + uri: "https://misskey.example.com/@rogerick", + nickname: "rogerick@misskey.example.com", + local: false + ), + insert(:user, + ap_id: "https://mastodon.example.com/users/greg", + uri: "https://mastodon.example.com/@greg", + nickname: "greg@mastodon.example.com", + local: false + ) + ] + + {:ok, post} = CommonAPI.post(rogerick, %{status: "eugh"}) + + inline_mentions = [ + "@rogerick", + "@greg" + ] + + activity = %{ + "type" => "Create", + "actor" => zero.ap_id, + "object" => %{ + "type" => "Note", + "actor" => zero.ap_id, + "content" => "#{Enum.at(inline_mentions, 0)} #{Enum.at(inline_mentions, 1)} erm", + "to" => [ + rogerick.ap_id, + greg.ap_id, + Constants.as_public() + ], + "inReplyTo" => Object.normalize(post).data["id"] + } + } + + {:ok, %{"object" => %{"content" => filtered}}} = ForceMentionsInContent.filter(activity) + + assert filtered == + "#{Enum.at(inline_mentions, 0)} #{Enum.at(inline_mentions, 1)} erm" + end end From f970091c6a58d06a42594e2c4a0baa5a86617652 Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 26 May 2023 17:17:13 -0400 Subject: [PATCH 28/82] Add instructions to serve media on another domain --- docs/configuration/hardening.md | 14 ++++ installation/pleroma-mediaproxy.nginx | 97 +++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 installation/pleroma-mediaproxy.nginx diff --git a/docs/configuration/hardening.md b/docs/configuration/hardening.md index d3bfc4e4a6..4f40873e6b 100644 --- a/docs/configuration/hardening.md +++ b/docs/configuration/hardening.md @@ -62,6 +62,20 @@ An additional “Expect-CT” header will be sent with the configured `ct_max_ag If you click on a link, your browser’s request to the other site will include from where it is coming from. The “Referrer policy” header tells the browser how and if it should send this information. (see [Referrer policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy)) +### Uploaded media and media proxy + +It is STRONGLY RECOMMENDED to serve both the locally-uploaded media and the media proxy from another domain than the domain that Pleroma runs on, if applicable. + +```elixir +config :pleroma, :media_proxy, + base_url: "https://some.other.domain" + +config :pleroma, Pleroma.Upload, + base_url: "https://some.other.domain" +``` + +See `installation/pleroma-mediaproxy.nginx` for examples on how to configure your media proxy. + ## systemd A systemd unit example is provided at `installation/pleroma.service`. diff --git a/installation/pleroma-mediaproxy.nginx b/installation/pleroma-mediaproxy.nginx new file mode 100644 index 0000000000..6f2edf212c --- /dev/null +++ b/installation/pleroma-mediaproxy.nginx @@ -0,0 +1,97 @@ +# This file is for those who want to serve uploaded media and media proxy over +# another domain. This is STRONGLY RECOMMENDED. +# This is meant to be used ALONG WITH `pleroma.nginx`. + +# If this is a new instance, replace the `location ~ ^/(media|proxy)` section in +# `pleroma.nginx` with the following to completely disable access to media from the main domain: +# location ~ ^/(media|proxy) { +# return 404; +# } +# +# If you are configuring an existing instance to use another domain +# for media, you will want to keep redirecting all existing local media to the new domain +# so already-uploaded media will not break. +# Replace the `location ~ ^/(media|proxy)` section in `pleroma.nginx` with the following: +# +# location /media { +# return 301 https://some.other.domain$request_uri; +# } +# +# location /proxy { +# return 404; +# } + +server { + server_name some.other.domain; + + listen 80; + listen [::]:80; + + # Uncomment this if you need to use the 'webroot' method with certbot. Make sure + # that the directory exists and that it is accessible by the webserver. If you followed + # the guide, you already ran 'mkdir -p /var/lib/letsencrypt' to create the folder. + # You may need to load this file with the ssl server block commented out, run certbot + # to get the certificate, and then uncomment it. + # + # location ~ /\.well-known/acme-challenge { + # root /var/lib/letsencrypt/; + # } + location / { + return 301 https://$server_name$request_uri; + } +} + +server { + server_name some.other.domain; + + listen 443 ssl http2; + listen [::]:443 ssl http2; + ssl_session_timeout 1d; + ssl_session_cache shared:MozSSL:10m; # about 40000 sessions + ssl_session_tickets off; + + ssl_trusted_certificate /etc/letsencrypt/live/some.other.domain/chain.pem; + ssl_certificate /etc/letsencrypt/live/some.other.domain/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/some.other.domain/privkey.pem; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; + ssl_prefer_server_ciphers off; + # In case of an old server with an OpenSSL version of 1.0.2 or below, + # leave only prime256v1 or comment out the following line. + ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; + ssl_stapling on; + ssl_stapling_verify on; + + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/activity+json application/atom+xml; + + # the nginx default is 1m, not enough for large media uploads + client_max_body_size 16m; + ignore_invalid_headers off; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + location / { return 404; } + + location ~ ^/(media|proxy) { + proxy_cache pleroma_media_cache; + slice 1m; + proxy_cache_key $host$uri$is_args$args$slice_range; + proxy_set_header Range $slice_range; + proxy_cache_valid 200 206 301 304 1h; + proxy_cache_lock on; + proxy_ignore_client_abort on; + proxy_buffering on; + chunked_transfer_encoding on; + proxy_pass http://phoenix; + } +} From 85902ad1ae5cfcc5d4c92cdb364a83d1edbbad3d Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 26 May 2023 17:27:35 -0400 Subject: [PATCH 29/82] Recommend users to serve media on another domain in guide --- docs/installation/otp_en.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index f2812346b1..ed52e57eb5 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -198,6 +198,10 @@ $EDITOR path-to-nginx-config # Verify that the config is valid nginx -t ``` +#### (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. + #### Start nginx === "Alpine" From 408ea697aa685bb860deddfc63cd755a3b64c39a Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 26 May 2023 17:28:41 -0400 Subject: [PATCH 30/82] Add changelog --- changelog.d/media-altdomain.skip | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 changelog.d/media-altdomain.skip diff --git a/changelog.d/media-altdomain.skip b/changelog.d/media-altdomain.skip new file mode 100644 index 0000000000..e69de29bb2 From e92eb5f4823fbb6c01218ec72ad8d41fb12e20a1 Mon Sep 17 00:00:00 2001 From: tusooa Date: Sat, 27 May 2023 00:57:22 +0000 Subject: [PATCH 31/82] Add instructions to other distro's guides --- docs/installation/alpine_linux_en.md | 3 +++ docs/installation/arch_linux_en.md | 5 +++++ docs/installation/debian_based_en.md | 5 +++++ docs/installation/freebsd_en.md | 4 ++++ docs/installation/gentoo_en.md | 4 ++++ docs/installation/netbsd_en.md | 4 ++++ docs/installation/openbsd_en.md | 4 ++++ 7 files changed, 29 insertions(+) diff --git a/docs/installation/alpine_linux_en.md b/docs/installation/alpine_linux_en.md index c37ff0c636..7154bca48f 100644 --- a/docs/installation/alpine_linux_en.md +++ b/docs/installation/alpine_linux_en.md @@ -183,6 +183,9 @@ server { ... } ``` +* (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. * Enable and start nginx: diff --git a/docs/installation/arch_linux_en.md b/docs/installation/arch_linux_en.md index 285743d564..f7d722ef93 100644 --- a/docs/installation/arch_linux_en.md +++ b/docs/installation/arch_linux_en.md @@ -173,6 +173,11 @@ sudo ln -s /etc/nginx/sites-available/pleroma.nginx /etc/nginx/sites-enabled/ple ``` * Before starting nginx edit the configuration and change it to your needs (e.g. change servername, change cert paths) + +* (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. + * Enable and start nginx: ```shell diff --git a/docs/installation/debian_based_en.md b/docs/installation/debian_based_en.md index 4e52b2155b..fe85a05bf2 100644 --- a/docs/installation/debian_based_en.md +++ b/docs/installation/debian_based_en.md @@ -136,6 +136,11 @@ sudo ln -s /etc/nginx/sites-available/pleroma.nginx /etc/nginx/sites-enabled/ple ``` * Before starting nginx edit the configuration and change it to your needs (e.g. change servername, change cert paths) + +* (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. + * Enable and start nginx: ```shell diff --git a/docs/installation/freebsd_en.md b/docs/installation/freebsd_en.md index 9cbe0f2030..50ed30d740 100644 --- a/docs/installation/freebsd_en.md +++ b/docs/installation/freebsd_en.md @@ -173,6 +173,10 @@ Edit the defaults of `/usr/local/etc/nginx/sites-available/pleroma.nginx`: * Change `ssl_certificate_key` to `/var/db/acme/certs/example.tld/example.tld.key`. * Change all references of `example.tld` to your instance's domain name. +#### (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. + ## Creating a startup script for Pleroma Pleroma will need to compile when it initially starts, which typically takes a longer diff --git a/docs/installation/gentoo_en.md b/docs/installation/gentoo_en.md index 36882c8c86..693f838256 100644 --- a/docs/installation/gentoo_en.md +++ b/docs/installation/gentoo_en.md @@ -227,6 +227,10 @@ Replace all instances of `example.tld` with your instance's public URL. If for w Pay special attention to the line that begins with `ssl_ecdh_curve`. It is stongly advised to comment that line out so that OpenSSL will use its full capabilities, and it is also possible you are running OpenSSL 1.0.2 necessitating that you do this. +* (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. + * Enable and start nginx: ```shell diff --git a/docs/installation/netbsd_en.md b/docs/installation/netbsd_en.md index 41b3b00722..2ade7df985 100644 --- a/docs/installation/netbsd_en.md +++ b/docs/installation/netbsd_en.md @@ -123,6 +123,10 @@ Edit the defaults: * Change `ssl_certificate_key` to `/etc/nginx/tls/key`. * Change `example.tld` to your instance's domain name. +### (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. + ## Configuring acme.sh We'll be using acme.sh in Stateless Mode for TLS certificate renewal. diff --git a/docs/installation/openbsd_en.md b/docs/installation/openbsd_en.md index c80c8f6784..9e7e040f5a 100644 --- a/docs/installation/openbsd_en.md +++ b/docs/installation/openbsd_en.md @@ -195,6 +195,10 @@ rcctl enable relayd rcctl start relayd ``` +##### (Strongly recommended) serve media on another domain + +Refer to the [Hardening your instance](../configuration/hardening.md) document on how to serve media on another domain. We STRONGLY RECOMMEND you to do this to minimize attack vectors. + #### pf Enabling and configuring pf is highly recommended. In /etc/pf.conf, insert the following configuration: From b6b7de20100e980849404a9e7384617a15df1e43 Mon Sep 17 00:00:00 2001 From: faried nawaz Date: Thu, 18 May 2023 02:12:20 +0500 Subject: [PATCH 32/82] add url to Metadata.build_tags call If static_fe is enabled, going to https://pleroma/notice/some-id results in With this fix, it is Additionally, Pleroma.Web.Metadata.Providers.OpenGraph now generates meta tags for attachments in the post. --- lib/pleroma/web/static_fe/static_fe_controller.ex | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/static_fe/static_fe_controller.ex b/lib/pleroma/web/static_fe/static_fe_controller.ex index 97c41c6f9c..8019a218a3 100644 --- a/lib/pleroma/web/static_fe/static_fe_controller.ex +++ b/lib/pleroma/web/static_fe/static_fe_controller.ex @@ -25,7 +25,15 @@ def show(%{assigns: %{notice_id: notice_id}} = conn, _params) do true <- Visibility.is_public?(activity.object), {_, true} <- {:visible?, Visibility.visible_for_user?(activity, _reading_user = nil)}, %User{} = user <- User.get_by_ap_id(activity.object.data["actor"]) do - meta = Metadata.build_tags(%{activity_id: notice_id, object: activity.object, user: user}) + url = Helpers.url(conn) <> conn.request_path + + meta = + Metadata.build_tags(%{ + activity_id: notice_id, + object: activity.object, + user: user, + url: url + }) timeline = activity.object.data["context"] From 52368e670222c2add5f5677d864dd64c9376c553 Mon Sep 17 00:00:00 2001 From: faried nawaz Date: Thu, 18 May 2023 02:17:29 +0500 Subject: [PATCH 33/82] fix meta tag for twitter cards and image attachments The name of the tag should be twitter:image, not twitter:player. Also, add twitter:image:alt meta tags. --- lib/pleroma/web/metadata/providers/twitter_card.ex | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/metadata/providers/twitter_card.ex b/lib/pleroma/web/metadata/providers/twitter_card.ex index 2dac22ee2a..fbd4fd5a7e 100644 --- a/lib/pleroma/web/metadata/providers/twitter_card.ex +++ b/lib/pleroma/web/metadata/providers/twitter_card.ex @@ -76,9 +76,11 @@ defp build_attachments(id, %{data: %{"attachment" => attachments}}) do {:meta, [name: "twitter:card", content: "summary_large_image"], []}, {:meta, [ - name: "twitter:player", + name: "twitter:image", content: MediaProxy.url(url["href"]) - ], []} + ], []}, + {:meta, [property: "twitter:image:alt", content: truncate(attachment["name"])], + []} | acc ] |> maybe_add_dimensions(url) @@ -130,4 +132,10 @@ defp maybe_add_dimensions(metadata, url) do metadata end end + + defp truncate(text) do + # truncate to 420 characters + # see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup + Pleroma.Formatter.truncate(text, 420) + end end From a1af122499d3558d9fa6d5606c394e01f36e95e4 Mon Sep 17 00:00:00 2001 From: faried nawaz Date: Thu, 18 May 2023 02:28:50 +0500 Subject: [PATCH 34/82] changelog entry --- changelog.d/3885.fix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/3885.fix diff --git a/changelog.d/3885.fix b/changelog.d/3885.fix new file mode 100644 index 0000000000..c5fbb0ed4a --- /dev/null +++ b/changelog.d/3885.fix @@ -0,0 +1 @@ +Fix opengraph and twitter card meta tags From 8b390d27dce0c1827ed4c8c959612b6126624c9a Mon Sep 17 00:00:00 2001 From: faried nawaz Date: Thu, 18 May 2023 03:20:44 +0500 Subject: [PATCH 35/82] twitter card: handle case where image has no alt text --- lib/pleroma/web/metadata/providers/twitter_card.ex | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/metadata/providers/twitter_card.ex b/lib/pleroma/web/metadata/providers/twitter_card.ex index fbd4fd5a7e..426022c65e 100644 --- a/lib/pleroma/web/metadata/providers/twitter_card.ex +++ b/lib/pleroma/web/metadata/providers/twitter_card.ex @@ -79,8 +79,7 @@ defp build_attachments(id, %{data: %{"attachment" => attachments}}) do name: "twitter:image", content: MediaProxy.url(url["href"]) ], []}, - {:meta, [property: "twitter:image:alt", content: truncate(attachment["name"])], - []} + {:meta, [name: "twitter:image:alt", content: truncate(attachment["name"])], []} | acc ] |> maybe_add_dimensions(url) @@ -133,6 +132,8 @@ defp maybe_add_dimensions(metadata, url) do end end + defp truncate(nil), do: "" + defp truncate(text) do # truncate to 420 characters # see https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup From 4c91c0d1baa5bdfdcbfc6ff54859be7e9db91a37 Mon Sep 17 00:00:00 2001 From: faried nawaz Date: Thu, 18 May 2023 03:21:14 +0500 Subject: [PATCH 36/82] oops, forgot the test cases --- test/pleroma/web/metadata/providers/twitter_card_test.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/pleroma/web/metadata/providers/twitter_card_test.exs b/test/pleroma/web/metadata/providers/twitter_card_test.exs index be4cfbe7b2..f8d01c5c81 100644 --- a/test/pleroma/web/metadata/providers/twitter_card_test.exs +++ b/test/pleroma/web/metadata/providers/twitter_card_test.exs @@ -182,7 +182,8 @@ test "it renders supported types of attachments and skips unknown types" do {:meta, [name: "twitter:title", content: Utils.user_name_string(user)], []}, {:meta, [name: "twitter:description", content: "pleroma in a nutshell"], []}, {:meta, [name: "twitter:card", content: "summary_large_image"], []}, - {:meta, [name: "twitter:player", content: "https://pleroma.gov/tenshi.png"], []}, + {:meta, [name: "twitter:image", content: "https://pleroma.gov/tenshi.png"], []}, + {:meta, [name: "twitter:image:alt", content: ""], []}, {:meta, [name: "twitter:player:width", content: "1280"], []}, {:meta, [name: "twitter:player:height", content: "1024"], []}, {:meta, [name: "twitter:card", content: "player"], []}, From 8336519f300e2e12087126564a155c292915daed Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Wed, 31 May 2023 08:26:21 +0200 Subject: [PATCH 37/82] installation/debian_based_en: Elixir 1.11 means Debian 12+ and Ubuntu 22.04+ --- docs/installation/debian_based_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/debian_based_en.md b/docs/installation/debian_based_en.md index 4e52b2155b..575b8a7ab7 100644 --- a/docs/installation/debian_based_en.md +++ b/docs/installation/debian_based_en.md @@ -4,7 +4,7 @@ ## Installation -This guide will assume you are on Debian 11 (“bullseye”) or later. This guide should also work with Ubuntu 18.04 (“Bionic Beaver”) and later. It also assumes that you have administrative rights, either as root or a user with [sudo permissions](https://www.digitalocean.com/community/tutorials/how-to-add-delete-and-grant-sudo-privileges-to-users-on-a-debian-vps). If you want to run this guide with root, ignore the `sudo` at the beginning of the lines, unless it calls a user like `sudo -Hu pleroma`; in this case, use `su -s $SHELL -c 'command'` instead. +This guide will assume you are on Debian 12 (“bookworm”) or later. This guide should also work with Ubuntu 22.04 (“jammy”) and later. It also assumes that you have administrative rights, either as root or a user with [sudo permissions](https://www.digitalocean.com/community/tutorials/how-to-add-delete-and-grant-sudo-privileges-to-users-on-a-debian-vps). If you want to run this guide with root, ignore the `sudo` at the beginning of the lines, unless it calls a user like `sudo -Hu pleroma`; in this case, use `su -s $SHELL -c 'command'` instead. {! backend/installation/generic_dependencies.include !} From 737e45c1022172b316671110468a03a22a23e809 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Wed, 31 May 2023 08:28:28 +0200 Subject: [PATCH 38/82] installation/debian_based_jp: Elixir 1.11 means Debian 12+ and Ubuntu 22.04+ I checked for what each part of the debian&ubuntu sentences meant with the help of Jisho.org, should be safe but it did make me notice that this guide hasn't been updated in years --- changelog.d/distro-docs-elixir-1.11.skip | 0 docs/installation/debian_based_jp.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 changelog.d/distro-docs-elixir-1.11.skip diff --git a/changelog.d/distro-docs-elixir-1.11.skip b/changelog.d/distro-docs-elixir-1.11.skip new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/installation/debian_based_jp.md b/docs/installation/debian_based_jp.md index 3736e857fa..695e7bb7d3 100644 --- a/docs/installation/debian_based_jp.md +++ b/docs/installation/debian_based_jp.md @@ -5,7 +5,7 @@ ## インストール -このガイドはDebian Stretchを利用することを想定しています。Ubuntu 16.04や18.04でもおそらく動作します。また、ユーザはrootもしくはsudoにより管理者権限を持っていることを前提とします。もし、以下の操作をrootユーザで行う場合は、 `sudo` を無視してください。ただし、`sudo -Hu pleroma` のようにユーザを指定している場合には `su -s $SHELL -c 'command'` を代わりに使ってください。 +このガイドはDebian Bookwormを利用することを想定しています。Ubuntu 22.04でもおそらく動作します。また、ユーザはrootもしくはsudoにより管理者権限を持っていることを前提とします。もし、以下の操作をrootユーザで行う場合は、 `sudo` を無視してください。ただし、`sudo -Hu pleroma` のようにユーザを指定している場合には `su -s $SHELL -c 'command'` を代わりに使ってください。 ### 必要なソフトウェア From a2bbd7c9dadad42c995e7627a559673f04c2618b Mon Sep 17 00:00:00 2001 From: Sean King Date: Wed, 31 May 2023 12:22:13 -0600 Subject: [PATCH 39/82] Fix base media and proxy URL in instructions to serve media on another domain --- docs/configuration/hardening.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/configuration/hardening.md b/docs/configuration/hardening.md index 4f40873e6b..493ba608c2 100644 --- a/docs/configuration/hardening.md +++ b/docs/configuration/hardening.md @@ -68,10 +68,10 @@ It is STRONGLY RECOMMENDED to serve both the locally-uploaded media and the medi ```elixir config :pleroma, :media_proxy, - base_url: "https://some.other.domain" + base_url: "https://some.other.domain/proxy" config :pleroma, Pleroma.Upload, - base_url: "https://some.other.domain" + base_url: "https://some.other.domain/media" ``` See `installation/pleroma-mediaproxy.nginx` for examples on how to configure your media proxy. From c9cb90ff4fac5bf645720c7e7ef0bf4b6acf8afa Mon Sep 17 00:00:00 2001 From: Sean King Date: Wed, 31 May 2023 17:49:06 -0600 Subject: [PATCH 40/82] Media proxy base URL doesn't need /proxy --- docs/configuration/hardening.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/hardening.md b/docs/configuration/hardening.md index 493ba608c2..cc46d1ff9e 100644 --- a/docs/configuration/hardening.md +++ b/docs/configuration/hardening.md @@ -68,7 +68,7 @@ It is STRONGLY RECOMMENDED to serve both the locally-uploaded media and the medi ```elixir config :pleroma, :media_proxy, - base_url: "https://some.other.domain/proxy" + base_url: "https://some.other.domain" config :pleroma, Pleroma.Upload, base_url: "https://some.other.domain/media" From cbc5b8cebd9255e0c49e8fb02daed4680be1d336 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Fri, 2 Jun 2023 17:03:21 +0400 Subject: [PATCH 41/82] B Preload: Make sure that the preloaded json is html safe --- lib/pleroma/web/preload.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/preload.ex b/lib/pleroma/web/preload.ex index 4485383f93..6a4a8885ec 100644 --- a/lib/pleroma/web/preload.ex +++ b/lib/pleroma/web/preload.ex @@ -11,7 +11,7 @@ def build_tags(_conn, params) do terms = params |> parser.generate_terms() - |> Enum.map(fn {k, v} -> {k, Base.encode64(Jason.encode!(v))} end) + |> Enum.map(fn {k, v} -> {k, Base.encode64(Jason.encode!(v, escape: :html_safe))} end) |> Enum.into(%{}) Map.merge(acc, terms) @@ -19,7 +19,7 @@ def build_tags(_conn, params) do rendered_html = preload_data - |> Jason.encode!() + |> Jason.encode!(escape: :html_safe) |> build_script_tag() |> HTML.safe_to_string() From 40d40d67a3cee4d57f9200d0980df1b21d08a834 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Fri, 2 Jun 2023 17:09:23 +0400 Subject: [PATCH 42/82] Add changelog. --- changelog.d/3901.security | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/3901.security diff --git a/changelog.d/3901.security b/changelog.d/3901.security new file mode 100644 index 0000000000..a3d8bd01f9 --- /dev/null +++ b/changelog.d/3901.security @@ -0,0 +1 @@ +Preload: Make generated JSON html-safe. It already was html safe because it only consists of config data that is base64 encoded, but this will keep it safe it that ever changes. From fadcd7f1a9e41ec9b54f251cf782688bf3d36889 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 7 Jun 2023 09:19:22 -0400 Subject: [PATCH 43/82] Revert MediaProxy Host header validation Something is going wrong here even though the tests are correct. --- changelog.d/3896.add | 2 +- .../web/media_proxy/media_proxy_controller.ex | 25 ---------------- .../media_proxy_controller_test.exs | 29 ------------------- test/support/conn_case.ex | 5 +--- 4 files changed, 2 insertions(+), 59 deletions(-) diff --git a/changelog.d/3896.add b/changelog.d/3896.add index 36d8286ff0..e8fde4c8a0 100644 --- a/changelog.d/3896.add +++ b/changelog.d/3896.add @@ -1 +1 @@ -Validate Host header for MediaProxy and Uploads and return a 302 if the base_url has changed +Validate Host header for Uploads and return a 302 if the base_url has changed diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 20f3a34389..bda5b36edc 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -12,7 +12,6 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do alias Pleroma.Web.MediaProxy alias Plug.Conn - plug(:validate_host) plug(:sandbox) def remote(conn, %{"sig" => sig64, "url" => url64}) do @@ -206,30 +205,6 @@ defp media_proxy_opts do Config.get([:media_proxy, :proxy_opts], []) end - defp validate_host(conn, _params) do - %{scheme: proxy_scheme, host: proxy_host, port: proxy_port} = - MediaProxy.base_url() |> URI.parse() - - if match?(^proxy_host, conn.host) do - conn - else - redirect_url = - %URI{ - scheme: proxy_scheme, - host: proxy_host, - port: proxy_port, - path: conn.request_path, - query: conn.query_string - } - |> URI.to_string() - |> String.trim_trailing("?") - - conn - |> Phoenix.Controller.redirect(external: redirect_url) - |> halt() - end - end - defp sandbox(conn, _params) do conn |> merge_resp_headers([{"content-security-policy", "sandbox;"}]) diff --git a/test/pleroma/web/media_proxy/media_proxy_controller_test.exs b/test/pleroma/web/media_proxy/media_proxy_controller_test.exs index deb407709a..9ce092fd8f 100644 --- a/test/pleroma/web/media_proxy/media_proxy_controller_test.exs +++ b/test/pleroma/web/media_proxy/media_proxy_controller_test.exs @@ -54,35 +54,6 @@ test "it returns 403 for invalid signature", %{conn: conn, url: url} do } = get(conn, "/proxy/hhgfh/eeee/fff") end - test "it returns a 302 for invalid host", %{conn: conn} do - new_proxy_base = "http://mp.localhost/" - - %{scheme: new_proxy_scheme, host: new_proxy_host, port: new_proxy_port} = - URI.parse(new_proxy_base) - - clear_config([:media_proxy, :base_url], new_proxy_base) - - proxy_url = - MediaProxy.encode_url("https://pleroma.social/logo.jpeg") - |> URI.parse() - |> Map.put(:host, "wronghost") - |> URI.to_string() - - expected_url = - URI.parse(proxy_url) - |> Map.put(:host, new_proxy_host) - |> Map.put(:port, new_proxy_port) - |> Map.put(:scheme, new_proxy_scheme) - |> URI.to_string() - - with_mock Pleroma.ReverseProxy, - call: fn _conn, _url, _opts -> %Conn{status: :success} end do - conn = get(conn, proxy_url) - - assert redirected_to(conn, 302) == expected_url - end - end - test "redirects to valid url when filename is invalidated", %{conn: conn, url: url} do invalid_url = String.replace(url, "test.png", "test-file.png") response = get(conn, invalid_url) diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index c1cb0295ba..f010fec332 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -120,9 +120,6 @@ defp json_response_and_validate_schema(conn, _status) do Mox.verify_on_exit!() - {:ok, - conn: - Phoenix.ConnTest.build_conn() - |> Map.put(:host, Pleroma.Web.Endpoint.host())} + {:ok, conn: Phoenix.ConnTest.build_conn()} end end From 1ca1b4b32f2cba5f78a2d55645b8d2814bbfc593 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 7 Jun 2023 09:25:57 -0400 Subject: [PATCH 44/82] changelog.d --- changelog.d/3902.skip | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 changelog.d/3902.skip diff --git a/changelog.d/3902.skip b/changelog.d/3902.skip new file mode 100644 index 0000000000..e69de29bb2 From 10dfa107d5d5d3b6fa7c13eb005c4cd5b6b94661 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Sun, 11 Jun 2023 16:22:03 +0400 Subject: [PATCH 45/82] Update changelog --- changelog.d/3874.remove | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/3874.remove diff --git a/changelog.d/3874.remove b/changelog.d/3874.remove new file mode 100644 index 0000000000..a81f744bf0 --- /dev/null +++ b/changelog.d/3874.remove @@ -0,0 +1 @@ +Remove a few unused indexes. From 22878cf84afd3f8b844c66e99f37022318c4c55e Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Sun, 11 Jun 2023 16:22:16 +0400 Subject: [PATCH 46/82] B Migrations: Don't remove activity_visibility_index for now. --- .../20230422154018_drop_unused_indexes.exs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/priv/repo/migrations/20230422154018_drop_unused_indexes.exs b/priv/repo/migrations/20230422154018_drop_unused_indexes.exs index f2ba6b8df1..0d877a7984 100644 --- a/priv/repo/migrations/20230422154018_drop_unused_indexes.exs +++ b/priv/repo/migrations/20230422154018_drop_unused_indexes.exs @@ -22,13 +22,6 @@ def up do drop_if_exists( index(:activities, ["((data #> '{\"object\",\"likes\"}'))"], name: :activities_likes) ) - - drop_if_exists( - index(:activities, ["activity_visibility(actor, recipients, data)", "id DESC NULLS LAST"], - name: :activities_visibility_index, - where: "data->>'type' = 'Create'" - ) - ) end def down do @@ -76,13 +69,5 @@ def down do concurrently: true ) ) - - create_if_not_exists( - index(:activities, ["activity_visibility(actor, recipients, data)", "id DESC NULLS LAST"], - name: :activities_visibility_index, - where: "data->>'type' = 'Create'", - concurrently: true - ) - ) end end From 6611c6ce4ef3fe76bc9a5eb53677d3b6cde22793 Mon Sep 17 00:00:00 2001 From: Lain Soykaf Date: Sun, 11 Jun 2023 16:45:31 +0400 Subject: [PATCH 47/82] B ForceMentionsInContent: Fix test, refactor. --- .../web/activity_pub/mrf/force_mentions_in_content.ex | 8 +++++--- .../activity_pub/mrf/force_mentions_in_content_test.exs | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex index b9b175cc3f..5532093cb7 100644 --- a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex +++ b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex @@ -95,11 +95,13 @@ def filter( |> Enum.reject(&is_nil/1) |> sort_replied_user(replied_to_user) - explicitly_mentioned_uris = extract_mention_uris_from_content(content) + explicitly_mentioned_uris = + extract_mention_uris_from_content(content) + |> MapSet.new() added_mentions = - Enum.reduce(mention_users, "", fn %User{ap_id: api_id, uri: uri} = user, acc -> - unless Enum.any?([api_id, uri], fn u -> u in explicitly_mentioned_uris end) do + Enum.reduce(mention_users, "", fn %User{ap_id: ap_id, uri: uri} = user, acc -> + if MapSet.disjoint?(MapSet.new([ap_id, uri]), explicitly_mentioned_uris) do acc <> Formatter.mention_from_user(user, %{mentions_format: :compact}) <> " " else acc diff --git a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs index 5ebd972a61..811ef105cd 100644 --- a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs +++ b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs @@ -282,7 +282,7 @@ test "don't add duplicate mentions for mastodon or misskey posts" do {:ok, post} = CommonAPI.post(rogerick, %{status: "eugh"}) inline_mentions = [ - "@rogerick", + "@rogerick", "@greg" ] From a663b73634ddf355827051cc139c0159f8eb794b Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 13 Jun 2023 12:45:18 +0200 Subject: [PATCH 48/82] Add no_new_privs to OpenRC service files --- changelog.d/no_new_privs.add | 1 + installation/init.d/pleroma | 1 + rel/files/installation/init.d/pleroma | 1 + 3 files changed, 3 insertions(+) create mode 100644 changelog.d/no_new_privs.add diff --git a/changelog.d/no_new_privs.add b/changelog.d/no_new_privs.add new file mode 100644 index 0000000000..b67396a4bf --- /dev/null +++ b/changelog.d/no_new_privs.add @@ -0,0 +1 @@ +(hardening) Add no_new_privs=yes to OpenRC service files diff --git a/installation/init.d/pleroma b/installation/init.d/pleroma index 384536f7e9..cb6635a0bc 100755 --- a/installation/init.d/pleroma +++ b/installation/init.d/pleroma @@ -8,6 +8,7 @@ pidfile="/var/run/pleroma.pid" directory=/opt/pleroma healthcheck_delay=60 healthcheck_timer=30 +no_new_privs="yes" : ${pleroma_port:-4000} diff --git a/rel/files/installation/init.d/pleroma b/rel/files/installation/init.d/pleroma index dea1db26c8..ca5b842e11 100755 --- a/rel/files/installation/init.d/pleroma +++ b/rel/files/installation/init.d/pleroma @@ -9,6 +9,7 @@ command=/opt/pleroma/bin/pleroma command_args="start" command_user=pleroma command_background=1 +no_new_privs="yes" # Ask process to terminate within 30 seconds, otherwise kill it retry="SIGTERM/30/SIGKILL/5" From d5a7079f42228980471b6210aaaea69fcaa4c9ed Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 13 Jun 2023 15:39:20 +0200 Subject: [PATCH 49/82] media_graphics_packages.md: Fix markdown syntax --- .../optional/media_graphics_packages.md | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/installation/optional/media_graphics_packages.md b/docs/installation/optional/media_graphics_packages.md index de402d1c47..ad01d47d19 100644 --- a/docs/installation/optional/media_graphics_packages.md +++ b/docs/installation/optional/media_graphics_packages.md @@ -1,9 +1,10 @@ # Optional software packages needed for specific functionality For specific Pleroma functionality (which is disabled by default) some or all of the below packages are required: - * `ImageMagic` - * `ffmpeg` - * `exiftool` + +* `ImageMagic` +* `ffmpeg` +* `exiftool` Please refer to documentation in `docs/installation` on how to install them on specific OS. @@ -14,20 +15,23 @@ Note: the packages are not required with the current default settings of Pleroma `ImageMagick` is a set of tools to create, edit, compose, or convert bitmap images. It is required for the following Pleroma features: - * `Pleroma.Upload.Filters.Mogrify`, `Pleroma.Upload.Filters.Mogrifun` upload filters (related config: `Plaroma.Upload/filters` in `config/config.exs`) - * Media preview proxy for still images (related config: `media_preview_proxy/enabled` in `config/config.exs`) + +* `Pleroma.Upload.Filters.Mogrify`, `Pleroma.Upload.Filters.Mogrifun` upload filters (related config: `Plaroma.Upload/filters` in `config/config.exs`) +* Media preview proxy for still images (related config: `media_preview_proxy/enabled` in `config/config.exs`) ## `ffmpeg` `ffmpeg` is software to record, convert and stream audio and video. It is required for the following Pleroma features: - * Media preview proxy for videos (related config: `media_preview_proxy/enabled` in `config/config.exs`) + +* Media preview proxy for videos (related config: `media_preview_proxy/enabled` in `config/config.exs`) ## `exiftool` `exiftool` is media files metadata reader/writer. It is required for the following Pleroma features: - * `Pleroma.Upload.Filters.Exiftool.StripLocation` upload filter (related config: `Plaroma.Upload/filters` in `config/config.exs`) - * `Pleroma.Upload.Filters.Exiftool.ReadDescription` upload filter (related config: `Plaroma.Upload/filters` in `config/config.exs`) + +* `Pleroma.Upload.Filters.Exiftool.StripLocation` upload filter (related config: `Plaroma.Upload/filters` in `config/config.exs`) +* `Pleroma.Upload.Filters.Exiftool.ReadDescription` upload filter (related config: `Plaroma.Upload/filters` in `config/config.exs`) From 4392fff212b42204990569f396a69e74b053e5ca Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 13 Jun 2023 15:40:12 +0200 Subject: [PATCH 50/82] otp_vs_from_source*: Acknowledge distro packages --- docs/installation/otp_vs_from_source.include | 9 +++++++-- docs/installation/otp_vs_from_source_source.include | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/installation/otp_vs_from_source.include b/docs/installation/otp_vs_from_source.include index 63e837a530..6c78202756 100644 --- a/docs/installation/otp_vs_from_source.include +++ b/docs/installation/otp_vs_from_source.include @@ -1,3 +1,8 @@ -## OTP releases vs from-source installations +## Packaged (OTP) installation vs Manual (from-source) installations -There are two ways to install Pleroma. You can use OTP releases or do a from-source installation. OTP releases are as close as you can get to binary releases with Erlang/Elixir. The release is self-contained, and provides everything needed to boot it, it is easily administered via the provided shell script to open up a remote console, start/stop/restart the release, start in the background, send remote commands, and more. With from source installations you install Pleroma from source, meaning you have to install certain dependencies like Erlang+Elixir and compile Pleroma yourself. +There is multiple ways to install Pleroma. +
+
Distro-provided packages
This is the recommended method, where you can get the strongest compatibility guarantees and the best dependency-management
+
Pleroma-provided OTP binaries
Intended as fallback for Alpine/Debian-compatible systems lacking a proper Pleroma package, they are heavier than proper distro packages as they also contain Erlang/Elixir and can break after system updates
+
Manual from-source installation
Needs build-dependencies to be installed and manual updates+rebuilds. Allows for easier source-customisations.
+
diff --git a/docs/installation/otp_vs_from_source_source.include b/docs/installation/otp_vs_from_source_source.include index 63482b69d0..9f71342293 100644 --- a/docs/installation/otp_vs_from_source_source.include +++ b/docs/installation/otp_vs_from_source_source.include @@ -1,3 +1,3 @@ {! backend/installation/otp_vs_from_source.include !} -This guide covers a from-source installation. To install using OTP releases, please check out [the OTP guide](./otp_en.md). +This guide covers a manual from-source installation. To install using OTP releases, please check for the presence of a distro package, failing that you can use [Pleroma-provided OTP binaries](./otp_en.md). From fb19f0d844eae80ff06015419119f7a709e5095f Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 13 Jun 2023 15:40:48 +0200 Subject: [PATCH 51/82] gentoo_otp_en: Add packaged installation documentation --- docs/installation/gentoo_otp_en.md | 207 +++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 docs/installation/gentoo_otp_en.md diff --git a/docs/installation/gentoo_otp_en.md b/docs/installation/gentoo_otp_en.md new file mode 100644 index 0000000000..5dcfe0b7ba --- /dev/null +++ b/docs/installation/gentoo_otp_en.md @@ -0,0 +1,207 @@ +# Packaged install on Gentoo Linux + +{! backend/installation/otp_vs_from_source.include !} + +A [manual installation guide for gentoo](./gentoo_en.md) is also available. + +## Installation + +This guide will assume that you have administrative rights, either as root or a user with [sudo permissions](https://wiki.gentoo.org/wiki/Sudo). Lines that begin with `#` indicate that they should be run as the superuser. Lines using `$` should be run as the indicated user, e.g. `pleroma$` should be run as the `pleroma` user. + +{! backend/installation/generic_dependencies.include !} + +### Installing a cron daemon + +Gentoo quite pointedly does not come with a cron daemon installed, and as such it is recommended you install one to automate certbot renewals and to allow other system administration tasks to be run automatically. Gentoo has [a whole wide world of cron options](https://wiki.gentoo.org/wiki/Cron) but if you just want A Cron That Works, `emerge --ask virtual/cron` will install the default cron implementation (probably cronie) which will work just fine. For the purpouses of this guide, we will be doing just that. + +### Required ebuilds + +* `www-apps/pleroma` + +#### Optional ebuilds used in this guide + +* `www-servers/nginx` (preferred, example configs for other reverse proxies can be found in the repo) +* `app-crypt/certbot` (or any other ACME client for Let’s Encrypt certificates) +* `app-crypt/certbot-nginx` (nginx certbot plugin that allows use of the all-powerful `--nginx` flag on certbot) +* `media-gfx/imagemagick` +* `media-video/ffmpeg` +* `media-libs/exiftool` + +### Prepare the system + +* If you haven't yet done so, add the [Gentoo User Repository (GURU)](https://wiki.gentoo.org/wiki/Project:GURU), where the `www-apps/pleroma` ebuild currently lives at: +```shell + # eselect repository enable guru +``` + +* Ensure that you have the latest copy of the Gentoo and GURU ebuilds if you have not synced them yet: + +```shell + # emaint sync -a +``` + + +* Emerge all required the required and suggested software in one go: + +```shell + # emerge --ask www-apps/pleroma www-servers/nginx app-crypt/certbot app-crypt/certbot-nginx +``` + +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. + +### Setup PostgreSQL + +[Gentoo Wiki article](https://wiki.gentoo.org/wiki/PostgreSQL) as well as [PostgreSQL QuickStart](https://wiki.gentoo.org/wiki/PostgreSQL/QuickStart) might be worth a quick glance, as the way Gentoo handles postgres is slightly unusual, with built in capability to have two different databases running for testing and live or whatever other purpouse. While it is still straightforward to install, it does mean that the version numbers used in this guide might change for future updates, so keep an eye out for the output you get from `emerge` to ensure you are using the correct ones. + +* Initialize the database cluster + +The output from emerging postgresql should give you a command for initializing the postgres database. The default slot should be indicated in this command, ensure that it matches the command below. + +```shell + # emerge --config dev-db/postgresql:11 +``` + +### Install media / graphics packages (optional) + +See [Optional software packages needed for specific functionality](docs/installation/optional/media_graphics_packages.md) for details. + +```shell +# emerge --ask media-video/ffmpeg media-gfx/imagemagick media-libs/exiftool +``` + +### Setup PleromaBE + +* Generate the configuration: + +```shell + # pleroma_ctl instance gen --output /etc/pleroma/config.exs --output-psql /tmp/setup_db.psql" +``` + +* Create the PostgreSQL database + +```shell + # sudo -u postgres -s $SHELL -lc "psql -f /tmp/setup_db.psql" +``` + +* Now run the database migration: + +```shell + # pleroma_ctl migrate +``` + +* Optional: If you have installed RUM indexes (`dev-db/rum`) you also need to run: +``` + # sudo -Hu pleroma "pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/" +``` + +* Now you can start Pleroma already and add it in the default runlevel + +```shell + # rc-service pleroma start + # rc-update add pleroma default +``` + +It probably won't work over the public internet quite yet, however, as we still need to set up a web server to proxy to the pleroma application, as well as configure SSL. + +### Finalize installation + +Assuming you want to open your newly installed federated social network to, well, the federation, you should run nginx or some other webserver/proxy in front of Pleroma. It is also a good idea to set up Pleroma to run as a system service. + +#### Nginx + +* Install nginx, if not already done: + +```shell + # emerge --ask www-servers/nginx +``` + +* Create directories for available and enabled sites: + +```shell + # mkdir -p /etc/nginx/sites-{available,enabled} +``` + +* Append the following line at the end of the `http` block in `/etc/nginx/nginx.conf`: + +```Nginx +include sites-enabled/*; +``` + +* Setup your SSL cert, using your method of choice or certbot. If using certbot, install it if you haven't already: + +```shell + # emerge --ask app-crypt/certbot app-crypt/certbot-nginx +``` + +and then set it up: + +```shell + # mkdir -p /var/lib/letsencrypt/ + # certbot certonly --email -d --standalone +``` + +If that doesn't work the first time, add `--dry-run` to further attempts to avoid being ratelimited as you identify the issue, and do not remove it until the dry run succeeds. If that doesn’t work, make sure, that nginx is not already running. If it still doesn’t work, try setting up nginx first (change ssl “on” to “off” and try again). Often the answer to issues with certbot is to use the `--nginx` flag once you have nginx up and running. + +If you are using any additional subdomains, such as for a media proxy, you can re-run the same command with the subdomain in question. When it comes time to renew later, you will not need to run multiple times for each domain, one renew will handle it. + +--- + +* Copy the example nginx configuration and activate it: + +```shell + # cp /opt/pleroma/installation/pleroma.nginx /etc/nginx/sites-available/ + # ln -s /etc/nginx/sites-available/pleroma.nginx /etc/nginx/sites-enabled/pleroma.nginx +``` + +* Take some time to ensure that your nginx config is correct + +Replace all instances of `example.tld` with your instance's public URL. If for whatever reason you made changes to the port that your pleroma app runs on, be sure that is reflected in your configuration. + +Pay special attention to the line that begins with `ssl_ecdh_curve`. It is stongly advised to comment that line out so that OpenSSL will use its full capabilities, and it is also possible you are running OpenSSL 1.0.2 necessitating that you do this. + +* Enable and start nginx: + +```shell + # rc-update add nginx default + # /etc/init.d/nginx start +``` + +If you are using certbot, it is HIGHLY recommend you set up a cron job that renews your certificate, and that you install the suggested `certbot-nginx` plugin. If you don't do these things, you only have yourself to blame when your instance breaks suddenly because you forgot about it. + +First, ensure that the command you will be installing into your crontab works. + +```shell + # /usr/bin/certbot renew --nginx +``` + +Assuming not much time has passed since you got certbot working a few steps ago, you should get a message for all domains you installed certificates for saying `Cert not yet due for renewal`. + +Now, run crontab as a superuser with `crontab -e` or `sudo crontab -e` as appropriate, and add the following line to your cron: + +```cron +0 0 1 * * /usr/bin/certbot renew --nginx +``` + +This will run certbot on the first of the month at midnight. If you'd rather run more frequently, it's not a bad idea, feel free to go for it. + +#### Other webserver/proxies + +If you would like to use other webservers or proxies, there are example configurations for some popular alternatives in `/opt/pleroma/installation/`. You can, of course, check out [the Gentoo wiki](https://wiki.gentoo.org) for more information on installing and configuring said alternatives. + +#### Create your first user + +If your instance is up and running, you can create your first user with administrative rights with the following task: + +```shell +pleroma$ pleroma_ctl user new --admin +``` + +#### Further reading + +{! backend/installation/further_reading.include !} + +## Questions + +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. From eddfd41c1f2fb15f5a28b5474a64bed7b86d62d7 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 13 Jun 2023 15:41:09 +0200 Subject: [PATCH 52/82] gentoo_en: Reference packaged installation --- docs/installation/gentoo_en.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/installation/gentoo_en.md b/docs/installation/gentoo_en.md index 36882c8c86..02a3c709b8 100644 --- a/docs/installation/gentoo_en.md +++ b/docs/installation/gentoo_en.md @@ -1,6 +1,8 @@ -# Installing on Gentoo GNU/Linux +# Manual install on Gentoo GNU/Linux -{! backend/installation/otp_vs_from_source_source.include !} +{! backend/installation/otp_vs_from_source.include !} + +This guide covers a manual from-source installation. To use the gentoo package, please check the [packaged installation guide for gentoo](./gentoo.en.md). ## Installation From 937fa36ec4ed8f8aa6e2e608003260bc7c5d8d57 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 13 Jun 2023 15:47:48 +0200 Subject: [PATCH 53/82] changelog.d/gentoo_otp.skip: Doc-only MR --- changelog.d/gentoo_otp.skip | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 changelog.d/gentoo_otp.skip diff --git a/changelog.d/gentoo_otp.skip b/changelog.d/gentoo_otp.skip new file mode 100644 index 0000000000..e69de29bb2 From 8fa435f370cd1a85a37eae011d9db604256fbef1 Mon Sep 17 00:00:00 2001 From: tusooa Date: Wed, 14 Jun 2023 21:48:10 +0000 Subject: [PATCH 54/82] Add "potentially outdated" notice in non-English versions --- docs/installation/debian_based_jp.md | 3 +++ docs/installation/openbsd_fi.md | 2 ++ 2 files changed, 5 insertions(+) diff --git a/docs/installation/debian_based_jp.md b/docs/installation/debian_based_jp.md index 3736e857fa..2489e34738 100644 --- a/docs/installation/debian_based_jp.md +++ b/docs/installation/debian_based_jp.md @@ -1,4 +1,7 @@ # Pleromaの入れ方 + +Note: This article is potentially outdated because at this time we may not have people who can speak this language well enough to update it. To see the up-to-date version, which may have significant differences or important caveats of the installation process, look up the English version. + ## 日本語訳について この記事は [Installing on Debian based distributions](Installing on Debian based distributions) の日本語訳です。何かがおかしいと思ったら、原文を見てください。 diff --git a/docs/installation/openbsd_fi.md b/docs/installation/openbsd_fi.md index 3c40b2d1a2..73aca3a6ff 100644 --- a/docs/installation/openbsd_fi.md +++ b/docs/installation/openbsd_fi.md @@ -1,5 +1,7 @@ # Pleroman asennus OpenBSD:llä +Note: This article is potentially outdated because at this time we may not have people who can speak this language well enough to update it. To see the up-to-date version, which may have significant differences or important caveats of the installation process, look up the English version. + Tarvitset: * Oman domainin * OpenBSD 6.3 -serverin From a5a354a36e144c19ce3f9e79cb898227fc7ef723 Mon Sep 17 00:00:00 2001 From: Sean King Date: Wed, 21 Jun 2023 23:10:56 -0600 Subject: [PATCH 55/82] Prevent bypassing authorized fetch mode with a json file --- lib/pleroma/web/plugs/http_signature_plug.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/plugs/http_signature_plug.ex b/lib/pleroma/web/plugs/http_signature_plug.ex index 4bf3252180..e814efc2cb 100644 --- a/lib/pleroma/web/plugs/http_signature_plug.ex +++ b/lib/pleroma/web/plugs/http_signature_plug.ex @@ -16,7 +16,7 @@ def call(%{assigns: %{valid_signature: true}} = conn, _opts) do end def call(conn, _opts) do - if get_format(conn) == "activity+json" do + if get_format(conn) in ["json", "activity+json"] do conn |> maybe_assign_valid_signature() |> maybe_require_signature() From 994bfc4c095fae07cd1c61b0f91c80ec60080138 Mon Sep 17 00:00:00 2001 From: Sean King Date: Wed, 21 Jun 2023 23:13:16 -0600 Subject: [PATCH 56/82] Add changelog entry --- changelog.d/prevent-bypassing-authorized-fetch-mode.fix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/prevent-bypassing-authorized-fetch-mode.fix diff --git a/changelog.d/prevent-bypassing-authorized-fetch-mode.fix b/changelog.d/prevent-bypassing-authorized-fetch-mode.fix new file mode 100644 index 0000000000..12f7260d72 --- /dev/null +++ b/changelog.d/prevent-bypassing-authorized-fetch-mode.fix @@ -0,0 +1 @@ +Prevent using the .json format to bypass authorized fetch mode \ No newline at end of file From 8bf8906045d15254dd536b97bdaf04bc772e6fa6 Mon Sep 17 00:00:00 2001 From: weblate-extractor Date: Thu, 22 Jun 2023 06:09:47 +0000 Subject: [PATCH 57/82] Extract translatable strings --- priv/gettext/config_descriptions.pot | 2052 +++++++++++++------------- priv/gettext/default.pot | 68 +- priv/gettext/errors.pot | 166 +-- priv/gettext/oauth_scopes.pot | 108 +- priv/gettext/static_pages.pot | 182 +-- 5 files changed, 1232 insertions(+), 1344 deletions(-) diff --git a/priv/gettext/config_descriptions.pot b/priv/gettext/config_descriptions.pot index 53b81fa414..4f60e1c854 100644 --- a/priv/gettext/config_descriptions.pot +++ b/priv/gettext/config_descriptions.pot @@ -10,6038 +10,5966 @@ msgid "" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 -msgctxt "config description at :esshd" -msgid "Before enabling this you must add :esshd to mix.exs as one of the extra_applications and generate host keys in your priv dir with ssh-keygen -m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 msgctxt "config description at :logger" msgid "Logger-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :mime" msgid "Mime Types settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma" msgid "Allows setting a token that can be used to authenticate requests with admin privileges without a normal user account token. Append the `admin_token` parameter to requests to utilize it. (Please reconsider using HTTP Basic Auth or OAuth-based authentication if possible)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma" msgid "Authenticator" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :cors_plug" msgid "CORS plug config" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 -msgctxt "config label at :esshd" -msgid "ESSHD" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 msgctxt "config label at :logger" msgid "Logger" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :mime" msgid "Mime Types" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma" msgid "Pleroma Admin Token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma" msgid "Pleroma Authenticator" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger-:console" msgid "Console logger settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger-:ex_syslogger" msgid "ExSyslogger-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub" msgid "ActivityPub-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:assets" msgid "This section configures assets to be used with various frontends. Currently the only option relates to mascots on the mastodon frontend" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:auth" msgid "Authentication / authorization settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:connections_pool" msgid "Advanced settings for `Gun` connections pool" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:email_notifications" msgid "Email notifications settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:features" msgid "Customizable features" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:feed" msgid "Configure feed rendering" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations" msgid "This form can be used to configure a keyword list that keeps the configuration data for any kind of frontend. By default, settings for pleroma_fe are configured. If you want to add your own configuration your settings all fields must be complete." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends" msgid "Installed frontends management" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:gopher" msgid "Gopher settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools" msgid "Advanced settings for `Hackney` connections pools" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http" msgid "HTTP settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http_security" msgid "HTTP security settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance" msgid "Instance-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instances_favicons" msgid "Control favicons for instances" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap" msgid "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password will be verified by trying to authenticate (bind) to a LDAP server. If a user exists in the LDAP directory but there is no account with the same name yet on the Pleroma instance then a new Pleroma account will be created with the same name as the LDAP user name." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:majic_pool" msgid "Majic/libmagic configuration" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:manifest" msgid "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_preview_proxy" msgid "Media preview proxy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy" msgid "Media proxy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:modules" msgid "Custom Runtime Modules" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf" msgid "General MRF settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_activity_expiration" msgid "Adds automatic expiration to all local activities" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_follow_bot" msgid "Automatically follows newly discovered accounts." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_hashtag" msgid "Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags (without the leading #)\n\nNote: This MRF Policy is always enabled, if you want to disable it you have to set empty lists.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_hellthread" msgid "Block messages with excessive user mentions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_keyword" msgid "Reject or Word-Replace messages matching a keyword or [Regex](https://hexdocs.pm/elixir/Regex.html)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_mention" msgid "Block messages which mention a specific user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_normalize_markup" msgid "MRF NormalizeMarkup settings. Scrub configured hypertext markup." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_object_age" msgid "Rejects or delists posts based on their timestamp deviance from your server's clock." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_rejectnonpublic" msgid "RejectNonPublic drops posts with non-public visibility settings." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple" msgid "Simple ingress policies" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_steal_emoji" msgid "Steals emojis from selected instances when it sees them." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_subchain" msgid "This policy processes messages through an alternate pipeline when a given message matches certain criteria. All criteria are configured as a map of regular expressions to lists of policy modules." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_vocabulary" msgid "Filter messages which belong to certain activity vocabularies" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:oauth2" msgid "Configure OAuth 2 provider capabilities" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools" msgid "Advanced settings for `Gun` workers pools" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:populate_hashtags_table" msgid "`populate_hashtags_table` background migration settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit" msgid "Rate limit settings. This is an advanced feature enabled only for :authentication by default." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated" msgid "Disallow viewing timelines, user profiles and statuses for unauthenticated users." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rich_media" msgid "If enabled the instance will parse metadata from attached links to generate link previews" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:shout" msgid "Pleroma shout settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:static_fe" msgid "Render profiles and posts using server-generated HTML that is viewable without using JavaScript" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:streamer" msgid "Settings for notifications streamer" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:uri_schemes" msgid "URI schemes related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:web_cache_ttl" msgid "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome" msgid "Welcome messages settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:workers" msgid "Includes custom worker options not interpretable directly by `Oban`" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-ConcurrentLimiter" msgid "Limits configuration for background tasks." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban" msgid "[Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Captcha" msgid "Captcha-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha" msgid "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is here: https://github.com/koto-bank/kocaptcha. The default endpoint (https://captcha.kotobank.ch) is hosted by the developer." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer" msgid "Mailer-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail" msgid "New users admin email digest" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail" msgid "Email template settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter" msgid "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.ScheduledActivity" msgid "Scheduled activities settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload" msgid "Upload general settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename" msgid "Filter replaces the filename of the upload" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify" msgid "Uploads mogrify filter settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Uploaders.Local" msgid "Local uploader-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Uploaders.S3" msgid "S3 uploader-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.User.Backup" msgid "Account Backup" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http" msgid "HTTP invalidate settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script" msgid "Invalidation script settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Metadata" msgid "Metadata-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp" msgid "`Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.\n**If your instance is not behind at least one reverse proxy, you should not enable this plug.**\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Preload" msgid "Preload-related settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity" msgid "Expired activities settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter" msgid "Prometheus app metrics endpoint configuration" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :web_push_encryption-:vapid_details" msgid "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :ex_aws-:s3" msgid "S3" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:console" msgid "Console Logger" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:ex_syslogger" msgid "ExSyslogger" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub" msgid "ActivityPub" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:assets" msgid "Assets" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:auth" msgid "Auth" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:connections_pool" msgid "Connections pool" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:email_notifications" msgid "Email notifications" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:emoji" msgid "Emoji" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:features" msgid "Features" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:feed" msgid "Feed" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations" msgid "Frontend configurations" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends" msgid "Frontends" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:gopher" msgid "Gopher" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools" msgid "Hackney pools" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http" msgid "HTTP" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http_security" msgid "HTTP security" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance" msgid "Instance" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instances_favicons" msgid "Instances favicons" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap" msgid "LDAP" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:majic_pool" msgid "Majic pool" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:manifest" msgid "Manifest" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:markup" msgid "Markup Settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_preview_proxy" msgid "Media preview proxy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy" msgid "Media proxy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:modules" msgid "Modules" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf" msgid "MRF" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_activity_expiration" msgid "MRF Activity Expiration Policy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_follow_bot" msgid "MRF FollowBot Policy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_hashtag" msgid "MRF Hashtag" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_hellthread" msgid "MRF Hellthread" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_keyword" msgid "MRF Keyword" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_mention" msgid "MRF Mention" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_normalize_markup" msgid "MRF Normalize Markup" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_object_age" msgid "MRF Object Age" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_rejectnonpublic" msgid "MRF Reject Non Public" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple" msgid "MRF Simple" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_steal_emoji" msgid "MRF Emojis" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_subchain" msgid "MRF Subchain" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_vocabulary" msgid "MRF Vocabulary" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:oauth2" msgid "OAuth2" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools" msgid "Pools" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:populate_hashtags_table" msgid "Populate hashtags table" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit" msgid "Rate limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated" msgid "Restrict Unauthenticated" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rich_media" msgid "Rich media" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:shout" msgid "Shout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:static_fe" msgid "Static FE" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:streamer" msgid "Streamer" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:uri_schemes" msgid "URI Schemes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:user" msgid "User" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:web_cache_ttl" msgid "Web cache TTL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome" msgid "Welcome" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:workers" msgid "Workers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-ConcurrentLimiter" msgid "ConcurrentLimiter" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban" msgid "Oban" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Captcha" msgid "Pleroma.Captcha" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha" msgid "Pleroma.Captcha.Kocaptcha" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer" msgid "Pleroma.Emails.Mailer" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail" msgid "Pleroma.Emails.NewUsersDigestEmail" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail" msgid "Pleroma.Emails.UserEmail" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter" msgid "Linkify" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.ScheduledActivity" msgid "Pleroma.ScheduledActivity" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload" msgid "Pleroma.Upload" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename" msgid "Pleroma.Upload.Filter.AnonymizeFilename" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify" msgid "Pleroma.Upload.Filter.Mogrify" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Uploaders.Local" msgid "Pleroma.Uploaders.Local" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Uploaders.S3" msgid "Pleroma.Uploaders.S3" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.User" msgid "Pleroma.User" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.User.Backup" msgid "Pleroma.User.Backup" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate" msgid "Pleroma.Web.ApiSpec.CastAndValidate" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http" msgid "Pleroma.Web.MediaProxy.Invalidation.Http" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script" msgid "Pleroma.Web.MediaProxy.Invalidation.Script" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Metadata" msgid "Pleroma.Web.Metadata" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp" msgid "Pleroma.Web.Plugs.RemoteIp" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Preload" msgid "Pleroma.Web.Preload" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity" msgid "Pleroma.Workers.PurgeExpiredActivity" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter" msgid "Pleroma.Web.Endpoint.MetricsExporter" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :web_push_encryption-:vapid_details" msgid "Vapid Details" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 -msgctxt "config description at :esshd > :enabled" -msgid "Enables SSH" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config description at :esshd > :handler" -msgid "Handler module" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config description at :esshd > :password_authenticator" -msgid "Authenticator module" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config description at :esshd > :port" -msgid "Port to connect" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config description at :esshd > :priv_dir" -msgid "Dir with SSH keys" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 msgctxt "config description at :ex_aws-:s3 > :access_key_id" msgid "S3 access key ID" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :ex_aws-:s3 > :host" msgid "S3 host" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :ex_aws-:s3 > :region" msgid "S3 region (for AWS)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :ex_aws-:s3 > :secret_access_key" msgid "Secret access key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger > :backends" msgid "Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :ex_syslogger } - to syslog, Quack.Logger - to Slack." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger-:console > :format" msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger-:console > :level" msgid "Log level" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger-:ex_syslogger > :format" msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger-:ex_syslogger > :ident" msgid "A string that's prepended to every message, and is typically set to the app name" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :logger-:ex_syslogger > :level" msgid "Log level" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma > :admin_token" msgid "Admin token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub > :blockers_visible" msgid "Whether a user can see someone who has blocked them" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub > :follow_handshake_timeout" msgid "Following handshake timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub > :note_replies_output_limit" msgid "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub > :outgoing_blocks" msgid "Whether to federate blocks to other instances" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub > :sign_object_fetches" msgid "Sign object fetches with HTTP signatures" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub > :unfollow_blocked" msgid "Whether blocks result in people getting unfollowed" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:assets > :default_mascot" msgid "This will be used as the default mascot on MastoFE. Default: `:pleroma_fox_tan`" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:assets > :default_user_avatar" msgid "URL of the default user avatar" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:assets > :mascots" msgid "Keyword of mascots, each element must contain both an URL and a mime_type key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:auth > :auth_template" msgid "Authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:auth > :enforce_oauth_admin_scope_usage" msgid "OAuth admin scope requirement toggle. If enabled, admin actions explicitly demand admin OAuth scope(s) presence in OAuth token (client app must support admin scopes). If disabled and token doesn't have admin scope(s), `is_admin` user flag grants access to admin-specific actions." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:auth > :oauth_consumer_strategies" msgid "The list of enabled OAuth consumer strategies. By default it's set by OAUTH_CONSUMER_STRATEGIES environment variable. Each entry in this space-delimited string should be of format \"strategy\" or \"strategy:dependency\" (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:auth > :oauth_consumer_template" msgid "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:connections_pool > :connect_timeout" msgid "Timeout while `gun` will wait until connection is up. Default: 5000ms." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_retries" msgid "Number of attempts to acquire the connection from the pool if it is overloaded. Default: 5" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_wait" msgid "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:connections_pool > :max_connections" msgid "Maximum number of connections in the pool. Default: 250 connections." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:connections_pool > :reclaim_multiplier" msgid "Multiplier for the number of idle connection to be reclaimed if the pool is full. For example if the pool maxes out at 250 connections and this setting is set to 0.3, the pool will reclaim at most 75 idle connections if it's overloaded. Default: 0.1" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:email_notifications > :digest" msgid "emails of \"what you've missed\" for users who have been inactive for a while" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:email_notifications > :digest > :active" msgid "Globally enable or disable digest emails" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:email_notifications > :digest > :inactivity_threshold" msgid "Minimum user inactivity threshold" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:email_notifications > :digest > :interval" msgid "Minimum interval between digest emails to one user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:email_notifications > :digest > :schedule" msgid "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\"." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:emoji > :default_manifest" msgid "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download. Currently only one manifest can be added (no arrays)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:emoji > :groups" msgid "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the group name and the value is the location or array of locations. * can be used as a wildcard." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:emoji > :pack_extensions" msgid "A list of file extensions for emojis, when no emoji.txt for a pack is present" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:emoji > :shortcode_globs" msgid "Location of custom emoji files. * can be used as a wildcard." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:features > :improved_hashtag_timeline" msgid "Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:feed > :post_title" msgid "Configure title rendering" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:feed > :post_title > :max_length" msgid "Maximum number of characters before truncating title" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:feed > :post_title > :omission" msgid "Replacement which will be used after truncating string" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe" msgid "Settings for Pleroma FE" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput" msgid "When disabled, auto-hide the subject field if it's empty" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :background" msgid "URL of the background, unless viewing a user profile with a background that is set" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject" msgid "When a message has a subject (aka Content Warning), collapse it by default" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :greentext" msgid "Enables green text on lines prefixed with the > character" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses" msgid "Hides filtered statuses from timelines" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts" msgid "Hides muted statuses from timelines" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats" msgid "Hide notices statistics (repeats, favorites, ...)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename" msgid "Hides instance name from PleromaFE banner" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats" msgid "Hide profile statistics (posts, posts per day, followers, followings, ...)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logo" msgid "URL of the logo, defaults to Pleroma's logo" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin" msgid "Allows you to adjust vertical margins between logo boundary and navbar borders. The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask" msgid "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. If you want a colorful logo you must disable logoMask." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode" msgid "Limit scope selection to Direct, User default, and Scope of post replying to. Also prevents replying to a DM with a public post from PleromaFE." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage" msgid "URL of the image to use for hiding NSFW media attachments in the timeline" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType" msgid "Default post formatting option" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin" msgid "Relative URL which indicates where to redirect when a user is logged in" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin" msgid "Relative URL which indicates where to redirect when a user isn't logged in" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy" msgid "Copy the scope (private/unlisted/public) in replies to posts by default" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel" msgid "Enables panel displaying functionality of the instance on the About page" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel" msgid "Whether to show the instance's custom panel" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight" msgid "Change alignment of sidebar and panels to the right" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior" msgid "Allows changing the default behaviour of subject lines in replies.\n `email`: copy and preprend re:, as in email,\n `masto`: copy verbatim, as in Mastodon,\n `noop`: don't copy the subject." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :theme" msgid "Which theme to use. Available themes are defined in styles.json" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :admin" msgid "Admin frontend" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :admin > name" msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :admin > ref" msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :available" msgid "A map containing available frontends and parameters for their installation." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :available > build_dir" msgid "The directory inside the zip file " msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :available > build_url" msgid "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :available > custom-http-headers" msgid "The custom HTTP headers for the frontend" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :available > git" msgid "URL of the git repository of the frontend" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :available > name" msgid "Name of the frontend." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :available > ref" msgid "Reference of the frontend to be used." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :primary" msgid "Primary frontend, the one that is served for all pages by default" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :primary > name" msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:frontends > :primary > ref" msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:gopher > :dstport" msgid "Port advertised in URLs (optional, defaults to port)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:gopher > :enabled" msgid "Enables the gopher interface" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:gopher > :ip" msgid "IP address to bind to" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:gopher > :port" msgid "Port to bind to" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :federation" msgid "Settings for federation pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :federation > :max_connections" msgid "Number workers in the pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :federation > :timeout" msgid "Timeout while `hackney` will wait for response." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :media" msgid "Settings for media pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :media > :max_connections" msgid "Number workers in the pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :media > :timeout" msgid "Timeout while `hackney` will wait for response." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :upload" msgid "Settings for upload pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :upload > :max_connections" msgid "Number workers in the pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:hackney_pools > :upload > :timeout" msgid "Timeout while `hackney` will wait for response." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http > :adapter" msgid "Adapter specific options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http > :adapter > :ssl_options" msgid "SSL options for HTTP adapter" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http > :adapter > :ssl_options > :versions" msgid "List of TLS version to use" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http > :proxy_url" msgid "Proxy URL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http > :user_agent" msgid "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http_security > :ct_max_age" msgid "The maximum age for the Expect-CT header if sent" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http_security > :enabled" msgid "Whether the managed content security policy is enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http_security > :referrer_policy" msgid "The referrer policy to use, either \"same-origin\" or \"no-referrer\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http_security > :report_uri" msgid "Adds the specified URL to report-uri and report-to group in CSP header" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http_security > :sts" msgid "Whether to additionally send a Strict-Transport-Security header" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:http_security > :sts_max_age" msgid "The maximum age for the Strict-Transport-Security header if sent" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :account_activation_required" msgid "Require users to confirm their emails before signing in" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :account_approval_required" msgid "Require users to be manually approved by an admin before signing in" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :account_field_name_length" msgid "An account field name maximum length. Default: 512." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :account_field_value_length" msgid "An account field value maximum length. Default: 2048." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :allow_relay" msgid "Permits remote instances to subscribe to all public posts of your instance. (Important!) This may increase the visibility of your instance." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :allowed_post_formats" msgid "MIME-type list of formats allowed to be posted (transformed into HTML)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :attachment_links" msgid "Enable to automatically add attachment link text to statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :autofollowed_nicknames" msgid "Set to nicknames of (local) users that every new user should automatically follow" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :autofollowing_nicknames" msgid "Set to nicknames of (local) users that automatically follows every newly registered user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :avatar_upload_limit" msgid "File size limit of user's profile avatars" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :background_upload_limit" msgid "File size limit of user's profile backgrounds" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :banner_upload_limit" msgid "File size limit of user's profile banners" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :birthday_required" msgid "Require users to enter their birthday." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :cleanup_attachments" msgid "Enable to remove associated attachments when status is removed.\nThis will not affect duplicates and attachments without status.\nEnabling this will increase load to database when deleting statuses on larger instances.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :description" msgid "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :email" msgid "Email used to reach an Administrator/Moderator of the instance" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :extended_nickname_format" msgid "Enable to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :external_user_synchronization" msgid "Enabling following/followers counters synchronization for external users" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :federating" msgid "Enable federation with other instances" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :federation_incoming_replies_max_depth" msgid "Max. depth of reply-to and reply activities fetching on incoming federation, to prevent out-of-memory situations while fetching very long threads. If set to `nil`, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :federation_reachability_timeout_days" msgid "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :healthcheck" msgid "If enabled, system data will be shown on `/api/pleroma/healthcheck`" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :instance_thumbnail" msgid "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :invites_enabled" msgid "Enable user invitations for admins (depends on `registrations_open` being disabled)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :limit" msgid "Posts character limit (CW/Subject included in the counter)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :limit_to_local_content" msgid "Limit unauthenticated users to search for local statutes and users only. Default: `:unauthenticated`." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :max_account_fields" msgid "The maximum number of custom fields in the user profile. Default: 10." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :max_endorsed_users" msgid "The maximum number of recommended accounts. 0 will disable the feature." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :max_media_attachments" msgid "Maximum number of post media attachments" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :max_pinned_statuses" msgid "The maximum number of pinned statuses. 0 will disable the feature." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :max_remote_account_fields" msgid "The maximum number of custom fields in the remote user profile. Default: 20." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :max_report_comment_size" msgid "The maximum size of the report comment. Default: 1000." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :multi_factor_authentication" msgid "Multi-factor authentication settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes" msgid "MFA backup codes settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length" msgid "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number" msgid "Number of backup codes to generate." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp" msgid "TOTP settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :digits" msgid "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :period" msgid "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :name" msgid "Name of the instance" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :notify_email" msgid "Envelope FROM address for mail sent via Pleroma" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :poll_limits" msgid "A map with poll limits for local polls" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :poll_limits > :max_expiration" msgid "Maximum expiration time (in seconds)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :poll_limits > :max_option_chars" msgid "Maximum number of characters per option" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :poll_limits > :max_options" msgid "Maximum number of options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :poll_limits > :min_expiration" msgid "Minimum expiration time (in seconds)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :profile_directory" msgid "Enable profile directory." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :public" msgid "Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note: when setting to `false`, please also check `:restrict_unauthenticated` setting." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :quarantined_instances" msgid "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :registration_reason_length" msgid "Maximum registration reason length. Default: 500." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :registrations_open" msgid "Enable registrations for anyone. Invitations require this setting to be disabled." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :remote_limit" msgid "Hard character limit beyond which remote posts will be dropped" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :remote_post_retention_days" msgid "The default amount of days to retain remote posts when pruning the database" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :safe_dm_mentions" msgid "If enabled, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. \"@admin please keep an eye on @bad_actor\"). Default: disabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :show_reactions" msgid "Let favourites and emoji reactions be viewed through the API." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :skip_thread_containment" msgid "Skip filtering out broken threads. Default: enabled." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :static_dir" msgid "Instance static directory" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :upload_limit" msgid "File size limit of uploads (except for avatar, background, banner)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :user_bio_length" msgid "A user bio maximum length. Default: 5000." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :user_name_length" msgid "A user name maximum length. Default: 100." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instances_favicons > :enabled" msgid "Allow/disallow displaying and getting instances favicons" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :base" msgid "LDAP base, e.g. \"dc=example,dc=com\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :enabled" msgid "Enables LDAP authentication" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :host" msgid "LDAP server hostname" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :port" msgid "LDAP port, e.g. 389 or 636" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :ssl" msgid "Enable to use SSL, usually implies the port 636" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :sslopts" msgid "Additional SSL options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :sslopts > :cacertfile" msgid "Path to file with PEM encoded cacerts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :sslopts > :verify" msgid "Type of cert verification" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :tls" msgid "Enable to use STARTTLS, usually implies the port 389" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :tlsopts" msgid "Additional TLS options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :tlsopts > :cacertfile" msgid "Path to file with PEM encoded cacerts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :tlsopts > :verify" msgid "Type of cert verification" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:ldap > :uid" msgid "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:majic_pool > :size" msgid "Number of majic workers to start." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:manifest > :background_color" msgid "Describe the background color of the app" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:manifest > :icons" msgid "Describe the icons of the app" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:manifest > :theme_color" msgid "Describe the theme color of the app" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:markup > :scrub_policy" msgid "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_preview_proxy > :enabled" msgid "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_preview_proxy > :image_quality" msgid "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_preview_proxy > :min_content_length" msgid "Min content length (in bytes) to perform preview. Media smaller in size will be served without thumbnailing." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_height" msgid "Max height of preview thumbnail for images (video preview always has original dimensions)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_width" msgid "Max width of preview thumbnail for images (video preview always has original dimensions)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :base_url" msgid "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :enabled" msgid "Enables proxying of remote media via the instance's proxy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :invalidation > :enabled" msgid "Enables media cache object invalidation." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :invalidation > :provider" msgid "Module which will be used to purge objects from the cache." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :proxy_opts" msgid "Internal Pleroma.ReverseProxy settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_body_length" msgid "Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_read_duration" msgid "Timeout (in milliseconds) of GET request to the remote URI." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure" msgid "Redirects the client to the origin server upon encountering HTTP errors.\n\nNote that files larger than Max Body Length will trigger an error. (e.g., Peertube videos)\n\n\n**WARNING:** This setting will allow larger files to be accessed, but exposes the\n\nIP addresses of your users to the other servers, bypassing the MediaProxy.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:media_proxy > :whitelist" msgid "List of hosts with scheme to bypass the MediaProxy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:modules > :runtime_dir" msgid "A path to custom Elixir modules (such as MRF policies)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf > :policies" msgid "A list of MRF policies enabled. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf > :transparency" msgid "Make the content of your Message Rewrite Facility settings public (via nodeinfo)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf > :transparency_exclusions" msgid "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. You can also provide a reason for excluding these instance names. The instances and reasons won't be publicly disclosed." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_activity_expiration > :days" msgid "Default global expiration time for all local activities (in days)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_follow_bot > :follower_nickname" msgid "The name of the bot account to use for following newly discovered users." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_hashtag > :federated_timeline_removal" msgid "A list of hashtags which result in message being removed from federated timelines (a.k.a unlisted)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_hashtag > :reject" msgid "A list of hashtags which result in message being rejected." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_hashtag > :sensitive" msgid "A list of hashtags which result in message being set as sensitive (a.k.a NSFW/R-18)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_hellthread > :delist_threshold" msgid "Number of mentioned users after which the message gets removed from timelines anddisables notifications. Set to 0 to disable." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_hellthread > :reject_threshold" msgid "Number of mentioned users after which the messaged gets rejected. Set to 0 to disable." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_keyword > :federated_timeline_removal" msgid " A list of patterns which result in message being removed from federated timelines (a.k.a unlisted).\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_keyword > :reject" msgid " A list of patterns which result in message being rejected.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_keyword > :replace" msgid " **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n\n **Replacement**: a string. Leaving the field empty is permitted.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_mention > :actors" msgid "A list of actors for which any post mentioning them will be dropped" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_object_age > :threshold" msgid "Required age (in seconds) of a post before actions are taken." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_direct" msgid "Whether to allow direct messages" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_followersonly" msgid "Whether to allow followers-only posts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :accept" msgid "List of instances to only accept activities from (except deletes) and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :avatar_removal" msgid "List of instances to strip avatars from and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :banner_removal" msgid "List of instances to strip banners from and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :federated_timeline_removal" msgid "List of instances to remove from the Federated (aka The Whole Known Network) Timeline and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :followers_only" msgid "Force posts from the given instances to be visible by followers only and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :media_nsfw" msgid "List of instances to tag all media as NSFW (sensitive) from and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :media_removal" msgid "List of instances to strip media attachments from and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :reject" msgid "List of instances to reject activities from (except deletes) and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :reject_deletes" msgid "List of instances to reject deletions from and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_simple > :report_removal" msgid "List of instances to reject reports from and the reason for doing so" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_steal_emoji > :hosts" msgid "List of hosts to steal emojis from" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_steal_emoji > :rejected_shortcodes" msgid " A list of patterns or matches to reject shortcodes with.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_steal_emoji > :size_limit" msgid "File size limit (in bytes), checked before an emoji is saved to the disk" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_subchain > :match_actor" msgid "Matches a series of regular expressions against the actor field" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_vocabulary > :accept" msgid "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_vocabulary > :reject" msgid "A list of ActivityStreams terms to reject. If empty, no messages are rejected." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:oauth2 > :clean_expired_tokens" msgid "Enable a background job to clean expired OAuth tokens. Default: disabled." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:oauth2 > :issue_new_refresh_token" msgid "Keeps old refresh token or generate new refresh token when to obtain an access token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:oauth2 > :token_expires_in" msgid "The lifetime in seconds of the access token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :default" msgid "Settings for default pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :default > :max_waiting" msgid "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" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :default > :recv_timeout" msgid "Timeout for the pool while gun will wait for response" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :default > :size" msgid "Maximum number of concurrent requests in the pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :federation" msgid "Settings for federation pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :federation > :max_waiting" msgid "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" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :federation > :recv_timeout" msgid "Timeout for the pool while gun will wait for response" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :federation > :size" msgid "Maximum number of concurrent requests in the pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :media" msgid "Settings for media pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :media > :max_waiting" msgid "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" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :media > :recv_timeout" msgid "Timeout for the pool while gun will wait for response" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :media > :size" msgid "Maximum number of concurrent requests in the pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :upload" msgid "Settings for upload pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :upload > :max_waiting" msgid "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" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :upload > :recv_timeout" msgid "Timeout for the pool while gun will wait for response" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:pools > :upload > :size" msgid "Maximum number of concurrent requests in the pool." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:populate_hashtags_table > :fault_rate_allowance" msgid "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if hashtags transfer failed for all records." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:populate_hashtags_table > :sleep_interval_ms" msgid "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :app_account_creation" msgid "For registering user accounts from the same IP address" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :authentication" msgid "For authentication create / password check / user existence check requests" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :relation_id_action" msgid "For actions on relation with a specific user (follow, unfollow)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :relations_actions" msgid "For actions on relationships with all users (follow, unfollow)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :search" msgid "For the search requests (account & status search etc.)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :status_id_action" msgid "For fav / unfav or reblog / unreblog actions on the same status by the same user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :statuses_actions" msgid "For create / delete / fav / unfav / reblog / unreblog actions on any statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rate_limit > :timeline" msgid "For requests to timelines (each timeline has it's own limiter)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities" msgid "Settings for statuses." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :local" msgid "Disallow view local statuses." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :remote" msgid "Disallow view remote statuses." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles" msgid "Settings for user profiles." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :local" msgid "Disallow view local user profiles." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :remote" msgid "Disallow view remote user profiles." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines" msgid "Settings for public and federated timelines." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :federated" msgid "Disallow view federated timeline." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :local" msgid "Disallow view public timeline." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rich_media > :enabled" msgid "Enables RichMedia parsing of URLs" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rich_media > :failure_backoff" msgid "Amount of milliseconds after request failure, during which the request will not be retried." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rich_media > :ignore_hosts" msgid "List of hosts which will be ignored by the metadata parser" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rich_media > :ignore_tld" msgid "List TLDs (top-level domains) which will ignore for parse metadata" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rich_media > :parsers" msgid "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:rich_media > :ttl_setters" msgid "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:shout > :enabled" msgid "Enables the backend Shoutbox chat feature." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:shout > :limit" msgid "Shout message character limit." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:static_fe > :enabled" msgid "Enables the rendering of static HTML. Default: disabled." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:streamer > :overflow_workers" msgid "Maximum number of workers created if pool is empty" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:streamer > :workers" msgid "Number of workers to send notifications" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:uri_schemes > :valid_schemes" msgid "List of the scheme part that is considered valid to be an URL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub" msgid "Activity pub routes (except question activities). Default: `nil` (no expiration)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub_question" msgid "Activity pub routes (question activities). Default: `30_000` (30 seconds)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :chat_message > :enabled" msgid "Enables sending a chat message to newly registered users" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :chat_message > :message" msgid "A message that will be sent to newly registered users as a chat message" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :chat_message > :sender_nickname" msgid "The nickname of the local user that sends a welcome chat message" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :direct_message > :enabled" msgid "Enables sending a direct message to newly registered users" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :direct_message > :message" msgid "A message that will be sent to newly registered users" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :direct_message > :sender_nickname" msgid "The nickname of the local user that sends a welcome message" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :email > :enabled" msgid "Enables sending an email to newly registered users" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :email > :html" msgid "HTML content of the welcome email. EEX template with user and instance_name variables can be used." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :email > :sender" msgid "Email address and/or nickname that will be used to send the welcome email." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :email > :subject" msgid "Subject of the welcome email. EEX template with user and instance_name variables can be used." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:welcome > :email > :text" msgid "Text content of the welcome email. EEX template with user and instance_name variables can be used." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:workers > :retries" msgid "Max retry attempts for failed jobs, per `Oban` queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy" msgid "Concurrent limits configuration for MediaProxyWarmingPolicy." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running" msgid "Max running concurrently jobs." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting" msgid "Max waiting jobs." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers" msgid "Concurrent limits configuration for getting RichMedia for activities." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running" msgid "Max running concurrently jobs." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting" msgid "Max waiting jobs." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :crontab" msgid "Settings for cron background jobs" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :log" msgid "Logs verbose mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues" msgid "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :activity_expiration" msgid "Activity expiration queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :attachments_cleanup" msgid "Attachment deletion queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :background" msgid "Background queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :backup" msgid "Backup queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :federator_incoming" msgid "Incoming federation queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :federator_outgoing" msgid "Outgoing federation queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :mailer" msgid "Email sender queue, see Pleroma.Emails.Mailer" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :scheduled_activities" msgid "Scheduled activities queue, see Pleroma.ScheduledActivities" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :transmogrifier" msgid "Transmogrifier queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Oban > :queues > :web_push" msgid "Web push notifications queue" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Captcha > :enabled" msgid "Whether the captcha should be shown on registration" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Captcha > :method" msgid "The method/service to use for captcha" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Captcha > :seconds_valid" msgid "The time in seconds for which the captcha is valid" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint" msgid "The kocaptcha endpoint to use" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > :adapter" msgid "One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/swoosh/Swoosh.html#module-adapters)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth" msgid "SMTP AUTH enforcement mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password" msgid "SMTP AUTH password" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port" msgid "SMTP port" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay" msgid "Hostname or IP address" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries" msgid "SMTP temporary (4xx) error retries" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl" msgid "Use Implicit SSL/TLS. e.g. port 465" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls" msgid "Explicit TLS (STARTTLS) enforcement mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username" msgid "SMTP AUTH username" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled" msgid "Enables new users admin digest email when `true`" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :logo" msgid "A path to a custom logo. Set it to `nil` to use the default Pleroma logo." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :styling" msgid "A map with color settings for email templates." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter > :class" msgid "Specify the class to be added to the generated link. Disable to clear." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter > :extra" msgid "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter > :new_window" msgid "Link URLs will open in a new window/tab." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter > :rel" msgid "Override the rel attribute. Disable to clear." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter > :strip_prefix" msgid "Strip the scheme prefix." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter > :truncate" msgid "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Formatter > :validate_tld" msgid "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit" msgid "The number of scheduled activities a user is allowed to create in a single day. Default: 25." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :enabled" msgid "Whether scheduled activities are sent to the job queue to be executed" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :total_user_limit" msgid "The number of scheduled activities a user is allowed to create in total. Default: 300." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload > :base_url" msgid "Base URL for the uploads. Required if you use a CDN or host attachments under a different domain." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload > :filename_display_max_length" msgid "Set max length of a filename to display. 0 = no limit. Default: 30" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload > :filters" msgid "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload > :link_name" msgid "If enabled, a name parameter will be added to the URL of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload > :proxy_remote" msgid "Proxy requests to the remote uploader.\n\nUseful if media upload endpoint is not internet accessible.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload > :uploader" msgid "Module which will be used for uploads" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text" msgid "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original filename extension by using {extension}, for example custom-file-name.{extension}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify > :args" msgid "List of actions for the mogrify command. It's possible to add self-written settings as string. For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Uploaders.Local > :uploads" msgid "Path where user's uploads will be saved" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket" msgid "S3 bucket" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace" msgid "S3 bucket namespace" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled" msgid "Enable streaming uploads, when enabled the file will be sent to the server in chunks as it's being read. This may be unsupported by some providers, try disabling this if you have upload problems." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace" msgid "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc. For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in Upload base_url." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.User > :email_blacklist" msgid "List of email domains users may not register with." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.User > :restricted_nicknames" msgid "List of nicknames users may not register with." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.User.Backup > :limit_days" msgid "Limit user to export not more often than once per N days" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.User.Backup > :purge_after_days" msgid "Remove backup achives after N days" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict" msgid "Enables strict input validation (useful in development, not recommended in production)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers" msgid "HTTP headers of request" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method" msgid "HTTP method of request. Default: :purge" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options" msgid "Request options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path" msgid "Path to executable script which will purge cached items." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format" msgid "Optional URL format preprocessing. Only required for Apache's htcacheclean." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :providers" msgid "List of metadata providers to enable" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw" msgid "When enabled NSFW attachments will be shown in previews" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled" msgid "Enable/disable the plug. Default: disabled." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers" msgid " A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `[\"x-forwarded-for\"]`.\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies" msgid "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved" msgid " A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", \"fc00::/7\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Web.Preload > :providers" msgid "List of preload providers to enable" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled" msgid "Enables expired activities addition & deletion" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime" msgid "Minimum lifetime for ephemeral activity (in seconds)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth" msgid "Enables HTTP Basic Auth for app metrics endpoint." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled" msgid "[Pleroma extension] Enables app metrics endpoint." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format" msgid "App metrics endpoint output format." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist" msgid "Restrict access of app metrics endpoint to the specified IP addresses." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path" msgid "App metrics endpoint URI path." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :web_push_encryption-:vapid_details > :private_key" msgid "VAPID private key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :web_push_encryption-:vapid_details > :public_key" msgid "VAPID public key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :web_push_encryption-:vapid_details > :subject" msgid "A mailto link for the administrative contact. It's best if this email is not a personal email address, but rather a group email to the instance moderation team." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :cors_plug > :credentials" msgid "Credentials" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :cors_plug > :expose" msgid "Expose" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :cors_plug > :headers" msgid "Headers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :cors_plug > :max_age" msgid "Max age" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :cors_plug > :methods" msgid "Methods" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 -msgctxt "config label at :esshd > :enabled" -msgid "Enabled" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config label at :esshd > :handler" -msgid "Handler" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config label at :esshd > :password_authenticator" -msgid "Password authenticator" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config label at :esshd > :port" -msgid "Port" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 -msgctxt "config label at :esshd > :priv_dir" -msgid "Priv dir" -msgstr "" - -#, elixir-autogen, elixir-format -#: lib/pleroma/docs/translator.ex:5 msgctxt "config label at :ex_aws-:s3 > :access_key_id" msgid "Access key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :ex_aws-:s3 > :host" msgid "Host" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :ex_aws-:s3 > :region" msgid "Region" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :ex_aws-:s3 > :secret_access_key" msgid "Secret access key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger > :backends" msgid "Backends" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:console > :format" msgid "Format" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:console > :level" msgid "Level" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:console > :metadata" msgid "Metadata" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:ex_syslogger > :format" msgid "Format" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:ex_syslogger > :ident" msgid "Ident" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:ex_syslogger > :level" msgid "Level" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :logger-:ex_syslogger > :metadata" msgid "Metadata" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :mime > :types" msgid "Types" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :mime > :types > application/activity+json" msgid "\"application/activity+json\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :mime > :types > application/jrd+json" msgid "\"application/jrd+json\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :mime > :types > application/ld+json" msgid "\"application/ld+json\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :mime > :types > application/xml" msgid "\"application/xml\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :mime > :types > application/xrd+xml" msgid "\"application/xrd+xml\"" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma > :admin_token" msgid "Admin token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma > Pleroma.Web.Auth.Authenticator" msgid "Pleroma.Web.Auth.Authenticator" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub > :blockers_visible" msgid "Blockers visible" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub > :follow_handshake_timeout" msgid "Follow handshake timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub > :note_replies_output_limit" msgid "Note replies output limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub > :outgoing_blocks" msgid "Outgoing blocks" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub > :sign_object_fetches" msgid "Sign object fetches" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub > :unfollow_blocked" msgid "Unfollow blocked" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:assets > :default_mascot" msgid "Default mascot" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:assets > :default_user_avatar" msgid "Default user avatar" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:assets > :mascots" msgid "Mascots" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:auth > :auth_template" msgid "Auth template" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:auth > :enforce_oauth_admin_scope_usage" msgid "Enforce OAuth admin scope usage" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:auth > :oauth_consumer_strategies" msgid "OAuth consumer strategies" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:auth > :oauth_consumer_template" msgid "OAuth consumer template" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:connections_pool > :connect_timeout" msgid "Connect timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_retries" msgid "Connection acquisition retries" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_wait" msgid "Connection acquisition wait" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:connections_pool > :max_connections" msgid "Max connections" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:connections_pool > :reclaim_multiplier" msgid "Reclaim multiplier" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:email_notifications > :digest" msgid "Digest" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:email_notifications > :digest > :active" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:email_notifications > :digest > :inactivity_threshold" msgid "Inactivity threshold" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:email_notifications > :digest > :interval" msgid "Interval" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:email_notifications > :digest > :schedule" msgid "Schedule" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:emoji > :default_manifest" msgid "Default manifest" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:emoji > :groups" msgid "Groups" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:emoji > :pack_extensions" msgid "Pack extensions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:emoji > :shared_pack_cache_seconds_per_file" msgid "Shared pack cache s/file" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:emoji > :shortcode_globs" msgid "Shortcode globs" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:features > :improved_hashtag_timeline" msgid "Improved hashtag timeline" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:feed > :post_title" msgid "Post title" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:feed > :post_title > :max_length" msgid "Max length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:feed > :post_title > :omission" msgid "Omission" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe" msgid "Pleroma FE" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput" msgid "Always show subject input" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :background" msgid "Background" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject" msgid "Collapse message with subject" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :greentext" msgid "Greentext" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses" msgid "Hide Filtered Statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts" msgid "Hide Muted Posts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats" msgid "Hide post stats" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename" msgid "Hide Sitename" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats" msgid "Hide user stats" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logo" msgid "Logo" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin" msgid "Logo margin" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask" msgid "Logo mask" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode" msgid "Minimal scopes mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage" msgid "NSFW Censor Image" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType" msgid "Post Content Type" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin" msgid "Redirect root login" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin" msgid "Redirect root no login" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy" msgid "Scope copy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel" msgid "Show instance features panel" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel" msgid "Show instance specific panel" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight" msgid "Sidebar on Right" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior" msgid "Subject line behavior" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :theme" msgid "Theme" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :admin" msgid "Admin" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :admin > name" msgid "Name" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :admin > ref" msgid "Reference" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :available" msgid "Available" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :available > build_dir" msgid "Build directory" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :available > build_url" msgid "Build URL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :available > custom-http-headers" msgid "Custom HTTP headers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :available > git" msgid "Git Repository URL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :available > name" msgid "Name" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :available > ref" msgid "Reference" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :primary" msgid "Primary" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :primary > name" msgid "Name" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:frontends > :primary > ref" msgid "Reference" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:gopher > :dstport" msgid "Dstport" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:gopher > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:gopher > :ip" msgid "IP" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:gopher > :port" msgid "Port" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :federation" msgid "Federation" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :federation > :max_connections" msgid "Max connections" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :federation > :timeout" msgid "Timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :media" msgid "Media" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :media > :max_connections" msgid "Max connections" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :media > :timeout" msgid "Timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :upload" msgid "Upload" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :upload > :max_connections" msgid "Max connections" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:hackney_pools > :upload > :timeout" msgid "Timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http > :adapter" msgid "Adapter" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http > :adapter > :ssl_options" msgid "SSL Options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http > :adapter > :ssl_options > :versions" msgid "Versions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http > :proxy_url" msgid "Proxy URL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http > :send_user_agent" msgid "Send user agent" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http > :user_agent" msgid "User agent" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http_security > :ct_max_age" msgid "CT max age" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http_security > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http_security > :referrer_policy" msgid "Referrer policy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http_security > :report_uri" msgid "Report URI" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http_security > :sts" msgid "STS" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:http_security > :sts_max_age" msgid "STS max age" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :account_activation_required" msgid "Account activation required" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :account_approval_required" msgid "Account approval required" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :account_field_name_length" msgid "Account field name length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :account_field_value_length" msgid "Account field value length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :allow_relay" msgid "Allow relay" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :allowed_post_formats" msgid "Allowed post formats" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :attachment_links" msgid "Attachment links" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :autofollowed_nicknames" msgid "Autofollowed nicknames" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :autofollowing_nicknames" msgid "Autofollowing nicknames" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :avatar_upload_limit" msgid "Avatar upload limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :background_upload_limit" msgid "Background upload limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :banner_upload_limit" msgid "Banner upload limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :birthday_min_age" msgid "Birthday min age" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :birthday_required" msgid "Birthday required" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :cleanup_attachments" msgid "Cleanup attachments" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :description" msgid "Description" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :email" msgid "Admin Email Address" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :extended_nickname_format" msgid "Extended nickname format" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :external_user_synchronization" msgid "External user synchronization" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :federating" msgid "Federating" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :federation_incoming_replies_max_depth" msgid "Fed. incoming replies max depth" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :federation_reachability_timeout_days" msgid "Fed. reachability timeout days" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :healthcheck" msgid "Healthcheck" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :instance_thumbnail" msgid "Instance thumbnail" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :invites_enabled" msgid "Invites enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :limit" msgid "Limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :limit_to_local_content" msgid "Limit to local content" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :max_account_fields" msgid "Max account fields" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :max_endorsed_users" msgid "Max endorsed users" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :max_media_attachments" msgid "Max media attachments" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :max_pinned_statuses" msgid "Max pinned statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :max_remote_account_fields" msgid "Max remote account fields" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :max_report_comment_size" msgid "Max report comment size" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :multi_factor_authentication" msgid "Multi factor authentication" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes" msgid "Backup codes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length" msgid "Length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number" msgid "Number" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp" msgid "TOTP settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :digits" msgid "Digits" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :period" msgid "Period" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :name" msgid "Name" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :notify_email" msgid "Sender Email Address" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :poll_limits" msgid "Poll limits" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :poll_limits > :max_expiration" msgid "Max expiration" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :poll_limits > :max_option_chars" msgid "Max option chars" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :poll_limits > :max_options" msgid "Max options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :poll_limits > :min_expiration" msgid "Min expiration" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :profile_directory" msgid "Profile directory" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :public" msgid "Public" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :quarantined_instances" msgid "Quarantined instances" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :registration_reason_length" msgid "Registration reason length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :registrations_open" msgid "Registrations open" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :remote_limit" msgid "Remote limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :remote_post_retention_days" msgid "Remote post retention days" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :safe_dm_mentions" msgid "Safe DM mentions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :show_reactions" msgid "Show reactions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :skip_thread_containment" msgid "Skip thread containment" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :static_dir" msgid "Static dir" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :upload_limit" msgid "Upload limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :user_bio_length" msgid "User bio length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :user_name_length" msgid "User name length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instances_favicons > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :base" msgid "Base" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :host" msgid "Host" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :port" msgid "Port" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :ssl" msgid "SSL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :sslopts" msgid "SSL options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :sslopts > :cacertfile" msgid "Cacertfile" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :sslopts > :verify" msgid "Verify" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :tls" msgid "TLS" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :tlsopts" msgid "TLS options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :tlsopts > :cacertfile" msgid "Cacertfile" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :tlsopts > :verify" msgid "Verify" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:ldap > :uid" msgid "UID" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:majic_pool > :size" msgid "Size" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:manifest > :background_color" msgid "Background color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:manifest > :icons" msgid "Icons" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:manifest > :theme_color" msgid "Theme color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:markup > :allow_fonts" msgid "Allow fonts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:markup > :allow_headings" msgid "Allow headings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:markup > :allow_inline_images" msgid "Allow inline images" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:markup > :allow_tables" msgid "Allow tables" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:markup > :scrub_policy" msgid "Scrub policy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_preview_proxy > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_preview_proxy > :image_quality" msgid "Image quality" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_preview_proxy > :min_content_length" msgid "Min content length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_height" msgid "Thumbnail max height" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_width" msgid "Thumbnail max width" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :base_url" msgid "Base URL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :invalidation" msgid "Invalidation" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :invalidation > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :invalidation > :provider" msgid "Provider" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :proxy_opts" msgid "Advanced MediaProxy Options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_body_length" msgid "Max body length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_read_duration" msgid "Max read duration" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure" msgid "Redirect on failure" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:media_proxy > :whitelist" msgid "Whitelist" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:modules > :runtime_dir" msgid "Runtime dir" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf > :policies" msgid "Policies" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf > :transparency" msgid "MRF transparency" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf > :transparency_exclusions" msgid "MRF transparency exclusions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_activity_expiration > :days" msgid "Days" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_follow_bot > :follower_nickname" msgid "Follower nickname" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_hashtag > :federated_timeline_removal" msgid "Federated timeline removal" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_hashtag > :reject" msgid "Reject" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_hashtag > :sensitive" msgid "Sensitive" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_hellthread > :delist_threshold" msgid "Delist threshold" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_hellthread > :reject_threshold" msgid "Reject threshold" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_keyword > :federated_timeline_removal" msgid "Federated timeline removal" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_keyword > :reject" msgid "Reject" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_keyword > :replace" msgid "Replace" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_mention > :actors" msgid "Actors" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_normalize_markup > :scrub_policy" msgid "Scrub policy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_object_age > :actions" msgid "Actions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_object_age > :threshold" msgid "Threshold" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_direct" msgid "Allow direct" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_followersonly" msgid "Allow followers-only" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :accept" msgid "Accept" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :avatar_removal" msgid "Avatar removal" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :banner_removal" msgid "Banner removal" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :federated_timeline_removal" msgid "Federated timeline removal" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :followers_only" msgid "Followers only" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :media_nsfw" msgid "Media NSFW" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :media_removal" msgid "Media removal" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :reject" msgid "Reject" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :reject_deletes" msgid "Reject deletes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_simple > :report_removal" msgid "Report removal" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_steal_emoji > :hosts" msgid "Hosts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_steal_emoji > :rejected_shortcodes" msgid "Rejected shortcodes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_steal_emoji > :size_limit" msgid "Size limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_subchain > :match_actor" msgid "Match actor" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_vocabulary > :accept" msgid "Accept" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:mrf_vocabulary > :reject" msgid "Reject" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:oauth2 > :clean_expired_tokens" msgid "Clean expired tokens" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:oauth2 > :issue_new_refresh_token" msgid "Issue new refresh token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:oauth2 > :token_expires_in" msgid "Token expires in" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :default" msgid "Default" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :default > :max_waiting" msgid "Max waiting" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :default > :recv_timeout" msgid "Recv timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :default > :size" msgid "Size" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :federation" msgid "Federation" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :federation > :max_waiting" msgid "Max waiting" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :federation > :recv_timeout" msgid "Recv timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :federation > :size" msgid "Size" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :media" msgid "Media" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :media > :max_waiting" msgid "Max waiting" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :media > :recv_timeout" msgid "Recv timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :media > :size" msgid "Size" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :upload" msgid "Upload" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :upload > :max_waiting" msgid "Max waiting" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :upload > :recv_timeout" msgid "Recv timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:pools > :upload > :size" msgid "Size" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:populate_hashtags_table > :fault_rate_allowance" msgid "Fault rate allowance" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:populate_hashtags_table > :sleep_interval_ms" msgid "Sleep interval ms" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :app_account_creation" msgid "App account creation" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :authentication" msgid "Authentication" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :relation_id_action" msgid "Relation ID action" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :relations_actions" msgid "Relations actions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :search" msgid "Search" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :status_id_action" msgid "Status ID action" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :statuses_actions" msgid "Statuses actions" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rate_limit > :timeline" msgid "Timeline" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities" msgid "Activities" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :local" msgid "Local" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :remote" msgid "Remote" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles" msgid "Profiles" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :local" msgid "Local" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :remote" msgid "Remote" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines" msgid "Timelines" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :federated" msgid "Federated" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :local" msgid "Local" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rich_media > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rich_media > :failure_backoff" msgid "Failure backoff" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rich_media > :ignore_hosts" msgid "Ignore hosts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rich_media > :ignore_tld" msgid "Ignore TLD" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rich_media > :parsers" msgid "Parsers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:rich_media > :ttl_setters" msgid "TTL setters" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:shout > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:shout > :limit" msgid "Limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:static_fe > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:streamer > :overflow_workers" msgid "Overflow workers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:streamer > :workers" msgid "Workers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:uri_schemes > :valid_schemes" msgid "Valid schemes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:user > :deny_follow_blocked" msgid "Deny follow blocked" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub" msgid "Activity pub" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub_question" msgid "Activity pub question" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :chat_message" msgid "Chat message" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :chat_message > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :chat_message > :message" msgid "Message" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :chat_message > :sender_nickname" msgid "Sender nickname" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :direct_message" msgid "Direct message" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :direct_message > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :direct_message > :message" msgid "Message" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :direct_message > :sender_nickname" msgid "Sender nickname" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :email" msgid "Email" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :email > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :email > :html" msgid "Html" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :email > :sender" msgid "Sender" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :email > :subject" msgid "Subject" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:welcome > :email > :text" msgid "Text" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:workers > :retries" msgid "Retries" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy" msgid "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running" msgid "Max running" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting" msgid "Max waiting" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers" msgid "Pleroma.Web.RichMedia.Helpers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running" msgid "Max running" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting" msgid "Max waiting" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :crontab" msgid "Crontab" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :log" msgid "Log" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues" msgid "Queues" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :activity_expiration" msgid "Activity expiration" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :attachments_cleanup" msgid "Attachments cleanup" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :background" msgid "Background" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :backup" msgid "Backup" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :federator_incoming" msgid "Federator incoming" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :federator_outgoing" msgid "Federator outgoing" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :mailer" msgid "Mailer" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :scheduled_activities" msgid "Scheduled activities" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :transmogrifier" msgid "Transmogrifier" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Oban > :queues > :web_push" msgid "Web push" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Captcha > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Captcha > :method" msgid "Method" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Captcha > :seconds_valid" msgid "Seconds valid" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint" msgid "Endpoint" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :adapter" msgid "Adapter" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :enabled" msgid "Mailer Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:access_key" msgid "AWS Access Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:region" msgid "AWS Region" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:secret" msgid "AWS Secret Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Dyn-:api_key" msgid "Dyn API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Gmail-:access_token" msgid "GMail API Access Token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:api_key" msgid "Mailgun API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:domain" msgid "Domain" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:api_key" msgid "MailJet Public API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:secret" msgid "MailJet Private API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mandrill-:api_key" msgid "Mandrill API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Postmark-:api_key" msgid "Postmark API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth" msgid "AUTH Mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password" msgid "Password" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port" msgid "Port" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay" msgid "Relay" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries" msgid "Retries" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl" msgid "Use SSL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls" msgid "STARTTLS Mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username" msgid "Username" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendgrid-:api_key" msgid "SendGrid API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_args" msgid "Cmd args" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_path" msgid "Cmd path" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:qmail" msgid "Qmail compat mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:api_key" msgid "SocketLabs API Key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:server_id" msgid "Server ID" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:api_key" msgid "SparkPost API key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:endpoint" msgid "Endpoint" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :logo" msgid "Logo" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling" msgid "Styling" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :background_color" msgid "Background color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :content_background_color" msgid "Content background color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :header_color" msgid "Header color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :link_color" msgid "Link color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_color" msgid "Text color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_muted_color" msgid "Text muted color" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter > :class" msgid "Class" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter > :extra" msgid "Extra" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter > :new_window" msgid "New window" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter > :rel" msgid "Rel" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter > :strip_prefix" msgid "Strip prefix" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter > :truncate" msgid "Truncate" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Formatter > :validate_tld" msgid "Validate tld" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit" msgid "Daily user limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :total_user_limit" msgid "Total user limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload > :base_url" msgid "Base URL" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload > :filename_display_max_length" msgid "Filename display max length" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload > :filters" msgid "Filters" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload > :link_name" msgid "Link name" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload > :proxy_remote" msgid "Proxy remote" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload > :uploader" msgid "Uploader" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text" msgid "Text" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify > :args" msgid "Args" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Uploaders.Local > :uploads" msgid "Uploads" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket" msgid "Bucket" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace" msgid "Bucket namespace" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled" msgid "Streaming enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace" msgid "Truncated namespace" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.User > :email_blacklist" msgid "Email blacklist" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.User > :restricted_nicknames" msgid "Restricted nicknames" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.User.Backup > :limit_days" msgid "Limit days" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.User.Backup > :purge_after_days" msgid "Purge after days" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict" msgid "Strict" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers" msgid "Headers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method" msgid "Method" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options" msgid "Options" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options > :params" msgid "Params" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path" msgid "Script path" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format" msgid "URL Format" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :providers" msgid "Providers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw" msgid "Unfurl NSFW" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers" msgid "Headers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies" msgid "Proxies" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved" msgid "Reserved" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Web.Preload > :providers" msgid "Providers" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime" msgid "Min lifetime" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth" msgid "Auth" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled" msgid "Enabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format" msgid "Format" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist" msgid "IP Whitelist" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path" msgid "Path" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :web_push_encryption-:vapid_details > :private_key" msgid "Private key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :web_push_encryption-:vapid_details > :public_key" msgid "Public key" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :web_push_encryption-:vapid_details > :subject" msgid "Subject" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:activitypub > :authorized_fetch_mode" msgid "Require HTTP signatures for AP fetches" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :short_description" msgid "Shorter version of instance description. It can be seen on `/api/v1/instance`" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:activitypub > :authorized_fetch_mode" msgid "Authorized fetch mode" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :short_description" msgid "Short description" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:delete_context_objects" msgid "`delete_context_objects` background migration settings" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:delete_context_objects > :fault_rate_allowance" msgid "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if context object deletion failed for all records." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:delete_context_objects > :sleep_interval_ms" msgid "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :birthday_min_age" msgid "Minimum required age (in days) for users to create account. Only used if birthday is required." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:delete_context_objects" msgid "Delete context objects" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:delete_context_objects > :fault_rate_allowance" msgid "Fault rate allowance" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:delete_context_objects > :sleep_interval_ms" msgid "Sleep interval ms" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :report_strip_status" msgid "Strip associated statuses in reports to ids when closed/resolved, otherwise keep a copy" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:mrf_object_age > :actions" msgid "A list of actions to apply to the post. `:delist` removes the post from public timelines; `:strip_followers` removes followers from the ActivityPub recipient list ensuring they won't be delivered to home timelines, additionally for followers-only it degrades to a direct message; `:reject` rejects the message entirely" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :report_strip_status" msgid "Report strip status" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :admin_privileges" msgid "What extra privileges to allow admins (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :moderator_privileges" msgid "What extra privileges to allow moderators (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :admin_privileges" msgid "Admin privileges" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :moderator_privileges" msgid "Moderator privileges" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config description at :pleroma-:instance > :languages" msgid "Languages to be exposed in /api/v1/instance. Should be in the format of BCP47 language codes." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/docs/translator.ex:5 +#, elixir-autogen, elixir-format msgctxt "config label at :pleroma-:instance > :languages" msgid "Languages" msgstr "" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 10a62d2a86..4819162b71 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -10,176 +10,176 @@ msgid "" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:122 +#, elixir-autogen, elixir-format msgid "%{name} - %{count} is not a multiple of %{multiple}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:131 +#, elixir-autogen, elixir-format msgid "%{name} - %{value} is larger than exclusive maximum %{max}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:140 +#, elixir-autogen, elixir-format msgid "%{name} - %{value} is larger than inclusive maximum %{max}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:149 +#, elixir-autogen, elixir-format msgid "%{name} - %{value} is smaller than exclusive minimum %{min}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:158 +#, elixir-autogen, elixir-format msgid "%{name} - %{value} is smaller than inclusive minimum %{min}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:102 +#, elixir-autogen, elixir-format msgid "%{name} - Array items must be unique." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:114 +#, elixir-autogen, elixir-format msgid "%{name} - Array length %{length} is larger than maxItems: %{}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:106 +#, elixir-autogen, elixir-format msgid "%{name} - Array length %{length} is smaller than minItems: %{min}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:166 +#, elixir-autogen, elixir-format msgid "%{name} - Invalid %{type}. Got: %{value}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:174 +#, elixir-autogen, elixir-format msgid "%{name} - Invalid format. Expected %{format}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:51 +#, elixir-autogen, elixir-format msgid "%{name} - Invalid schema.type. Got: %{type}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:178 +#, elixir-autogen, elixir-format msgid "%{name} - Invalid value for enum." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:95 +#, elixir-autogen, elixir-format msgid "%{name} - String length is larger than maxLength: %{length}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:88 +#, elixir-autogen, elixir-format msgid "%{name} - String length is smaller than minLength: %{length}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:63 +#, elixir-autogen, elixir-format msgid "%{name} - null value where %{type} expected." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:60 +#, elixir-autogen, elixir-format msgid "%{name} - null value." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:182 +#, elixir-autogen, elixir-format msgid "Failed to cast to any schema in %{polymorphic_type}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:71 +#, elixir-autogen, elixir-format msgid "Failed to cast value as %{invalid_schema}. Value must be castable using `allOf` schemas listed." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:84 +#, elixir-autogen, elixir-format msgid "Failed to cast value to one of: %{failed_schemas}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:78 +#, elixir-autogen, elixir-format msgid "Failed to cast value using any of: %{failed_schemas}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:212 +#, elixir-autogen, elixir-format msgid "Invalid value for header: %{name}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:204 +#, elixir-autogen, elixir-format msgid "Missing field: %{name}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:208 +#, elixir-autogen, elixir-format msgid "Missing header: %{name}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:196 +#, elixir-autogen, elixir-format msgid "No value provided for required discriminator `%{field}`." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:216 +#, elixir-autogen, elixir-format msgid "Object property count %{property_count} is greater than maxProperties: %{max_properties}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:224 +#, elixir-autogen, elixir-format msgid "Object property count %{property_count} is less than minProperties: %{min_properties}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/static_fe/static_fe/error.html.eex:2 +#, elixir-autogen, elixir-format msgid "Oops" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:188 +#, elixir-autogen, elixir-format msgid "Unexpected field: %{name}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:200 +#, elixir-autogen, elixir-format msgid "Unknown schema: %{name}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/render_error.ex:192 +#, elixir-autogen, elixir-format msgid "Value used as discriminator for `%{field}` matches no schemas." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/embed/show.html.eex:43 #: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:37 +#, elixir-autogen, elixir-format msgid "announces" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/embed/show.html.eex:44 #: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:38 +#, elixir-autogen, elixir-format msgid "likes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/embed/show.html.eex:42 #: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:36 +#, elixir-autogen, elixir-format msgid "replies" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/embed/show.html.eex:27 #: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:22 +#, elixir-autogen, elixir-format msgid "sensitive media" msgstr "" diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot index fa61d509e7..d320ee1bdd 100644 --- a/priv/gettext/errors.pot +++ b/priv/gettext/errors.pot @@ -89,153 +89,152 @@ msgstr "" msgid "must be equal to %{number}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:574 +#, elixir-autogen, elixir-format msgid "Account not found" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:332 +#, elixir-autogen, elixir-format msgid "Already voted" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:402 +#, elixir-autogen, elixir-format msgid "Bad request" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/controller_helper.ex:97 #: lib/pleroma/web/controller_helper.ex:103 +#, elixir-autogen, elixir-format msgid "Can't display this activity" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:334 +#, elixir-autogen, elixir-format msgid "Can't find user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:80 +#, elixir-autogen, elixir-format msgid "Can't get favorites" msgstr "" +#: lib/pleroma/web/common_api/utils.ex:464 #, elixir-autogen, elixir-format -#: lib/pleroma/web/common_api/utils.ex:457 msgid "Cannot post an empty status without attachments" msgstr "" +#: lib/pleroma/web/common_api/utils.ex:452 #, elixir-autogen, elixir-format -#: lib/pleroma/web/common_api/utils.ex:445 msgid "Comment must be up to %{max_size} characters" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/config_db.ex:199 +#, elixir-autogen, elixir-format msgid "Config with params %{params} not found" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:183 #: lib/pleroma/web/common_api.ex:187 +#, elixir-autogen, elixir-format msgid "Could not delete" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:233 +#, elixir-autogen, elixir-format msgid "Could not favorite" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:270 +#, elixir-autogen, elixir-format msgid "Could not unfavorite" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:218 +#, elixir-autogen, elixir-format msgid "Could not unrepeat" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:581 #: lib/pleroma/web/common_api.ex:590 +#, elixir-autogen, elixir-format msgid "Could not update state" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:207 +#, elixir-autogen, elixir-format msgid "Error." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/twitter_api.ex:105 +#, elixir-autogen, elixir-format msgid "Invalid CAPTCHA" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:146 #: lib/pleroma/web/o_auth/o_auth_controller.ex:631 +#, elixir-autogen, elixir-format msgid "Invalid credentials" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:42 +#, elixir-autogen, elixir-format msgid "Invalid credentials." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:353 +#, elixir-autogen, elixir-format msgid "Invalid indices" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:29 +#, elixir-autogen, elixir-format msgid "Invalid parameters" msgstr "" +#: lib/pleroma/web/common_api/utils.ex:360 #, elixir-autogen, elixir-format -#: lib/pleroma/web/common_api/utils.ex:353 msgid "Invalid password." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:267 +#, elixir-autogen, elixir-format msgid "Invalid request" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/twitter_api.ex:108 +#, elixir-autogen, elixir-format msgid "Kocaptcha service unavailable" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:142 +#, elixir-autogen, elixir-format msgid "Missing parameters" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:171 #: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:197 #: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:239 +#, elixir-autogen, elixir-format msgid "No such permission_group" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:502 #: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:11 #: lib/pleroma/web/feed/tag_controller.ex:16 #: lib/pleroma/web/feed/user_controller.ex:69 #: lib/pleroma/web/o_status/o_status_controller.ex:132 -#: lib/pleroma/web/plugs/uploaded_media.ex:84 +#: lib/pleroma/web/plugs/uploaded_media.ex:104 +#, elixir-autogen, elixir-format msgid "Not found" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:324 +#, elixir-autogen, elixir-format msgid "Poll's author can't vote" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:499 #: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20 #: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:39 @@ -243,213 +242,213 @@ msgstr "" #: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:52 #: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:382 #: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71 +#, elixir-autogen, elixir-format msgid "Record not found" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:35 #: lib/pleroma/web/feed/user_controller.ex:78 #: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:42 #: lib/pleroma/web/o_status/o_status_controller.ex:138 +#, elixir-autogen, elixir-format msgid "Something went wrong" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api/activity_draft.ex:143 +#, elixir-autogen, elixir-format msgid "The message visibility must be direct" msgstr "" +#: lib/pleroma/web/common_api/utils.ex:474 #, elixir-autogen, elixir-format -#: lib/pleroma/web/common_api/utils.ex:467 msgid "The status is over the character limit" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/ensure_public_or_authenticated_plug.ex:36 +#, elixir-autogen, elixir-format msgid "This resource requires authentication." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/rate_limiter.ex:208 +#, elixir-autogen, elixir-format msgid "Throttled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:354 +#, elixir-autogen, elixir-format msgid "Too many choices" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:268 +#, elixir-autogen, elixir-format msgid "You can't revoke your own admin status." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:243 #: lib/pleroma/web/o_auth/o_auth_controller.ex:333 +#, elixir-autogen, elixir-format msgid "Your account is currently disabled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:205 #: lib/pleroma/web/o_auth/o_auth_controller.ex:356 +#, elixir-autogen, elixir-format msgid "Your login is missing a confirmed e-mail address" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:390 +#, elixir-autogen, elixir-format msgid "can't read inbox of %{nickname} as %{as_nickname}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:489 +#, elixir-autogen, elixir-format msgid "can't update outbox of %{nickname} as %{as_nickname}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:526 +#, elixir-autogen, elixir-format msgid "conversation is already muted" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:508 +#, elixir-autogen, elixir-format msgid "error" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:34 +#, elixir-autogen, elixir-format msgid "mascots can only be images" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:63 +#, elixir-autogen, elixir-format msgid "not found" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:437 +#, elixir-autogen, elixir-format msgid "Bad OAuth request." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/twitter_api.ex:114 +#, elixir-autogen, elixir-format msgid "CAPTCHA already used" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/twitter_api.ex:111 +#, elixir-autogen, elixir-format msgid "CAPTCHA expired" msgstr "" +#: lib/pleroma/web/plugs/uploaded_media.ex:77 #, elixir-autogen, elixir-format -#: lib/pleroma/web/plugs/uploaded_media.ex:57 msgid "Failed" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:453 +#, elixir-autogen, elixir-format msgid "Failed to authenticate: %{message}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:484 +#, elixir-autogen, elixir-format msgid "Failed to set up user account." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/o_auth_scopes_plug.ex:37 +#, elixir-autogen, elixir-format msgid "Insufficient permissions: %{permissions}." msgstr "" +#: lib/pleroma/web/plugs/uploaded_media.ex:131 #, elixir-autogen, elixir-format -#: lib/pleroma/web/plugs/uploaded_media.ex:111 msgid "Internal Error" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/fallback_controller.ex:22 #: lib/pleroma/web/o_auth/fallback_controller.ex:29 +#, elixir-autogen, elixir-format msgid "Invalid Username/Password" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/twitter_api.ex:117 +#, elixir-autogen, elixir-format msgid "Invalid answer data" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:33 +#, elixir-autogen, elixir-format msgid "Nodeinfo schema version not handled" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:194 +#, elixir-autogen, elixir-format msgid "This action is outside the authorized scopes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/fallback_controller.ex:14 +#, elixir-autogen, elixir-format msgid "Unknown error, please check the details and try again." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:136 #: lib/pleroma/web/o_auth/o_auth_controller.ex:180 +#, elixir-autogen, elixir-format msgid "Unlisted redirect_uri." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:433 +#, elixir-autogen, elixir-format msgid "Unsupported OAuth provider: %{provider}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/uploaders/uploader.ex:74 +#, elixir-autogen, elixir-format msgid "Uploader callback timeout" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/uploader_controller.ex:23 +#, elixir-autogen, elixir-format msgid "bad request" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/twitter_api.ex:102 +#, elixir-autogen, elixir-format msgid "CAPTCHA Error" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:282 +#, elixir-autogen, elixir-format msgid "Could not add reaction emoji" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/common_api.ex:293 +#, elixir-autogen, elixir-format msgid "Could not remove reaction emoji" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/twitter_api.ex:128 +#, elixir-autogen, elixir-format msgid "Invalid CAPTCHA (Missing parameter: %{name})" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:96 +#, elixir-autogen, elixir-format msgid "List not found" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:153 +#, elixir-autogen, elixir-format msgid "Missing parameter: %{name}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:232 #: lib/pleroma/web/o_auth/o_auth_controller.ex:346 +#, elixir-autogen, elixir-format msgid "Password reset is required" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/tests/auth_test_controller.ex:9 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 #: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:6 @@ -529,81 +528,82 @@ msgstr "" #: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 #: lib/pleroma/web/uploader_controller.ex:6 #: lib/pleroma/web/web_finger/web_finger_controller.ex:6 +#, elixir-autogen, elixir-format msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:32 +#, elixir-autogen, elixir-format msgid "Two-factor authentication enabled, you must use a access token." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61 +#, elixir-autogen, elixir-format msgid "Web push subscription is disabled on this Pleroma instance" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:234 +#, elixir-autogen, elixir-format msgid "You can't revoke your own admin/moderator status." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:131 +#, elixir-autogen, elixir-format msgid "authorization required for timeline view" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:24 +#, elixir-autogen, elixir-format msgid "Access denied" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:331 +#, elixir-autogen, elixir-format msgid "This API requires an authenticated user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/user_is_admin_plug.ex:21 +#, elixir-autogen, elixir-format msgid "User is not an admin." msgstr "" -#, elixir-format #: lib/pleroma/user/backup.ex:73 +#, elixir-format msgid "Last export was less than a day ago" msgid_plural "Last export was less than %{days} days ago" msgstr[0] "" msgstr[1] "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:421 +#, elixir-autogen, elixir-format msgid "Character limit (%{limit} characters) exceeded, contains %{length} characters" msgstr "" +#: lib/pleroma/web/common_api/utils.ex:489 #, elixir-autogen, elixir-format -#: lib/pleroma/web/common_api/utils.ex:482 msgid "Too many attachments" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/user_is_staff_plug.ex:20 +#, elixir-autogen, elixir-format msgid "User is not a staff member." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/o_auth/o_auth_controller.ex:366 +#, elixir-autogen, elixir-format msgid "Your account is awaiting approval." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:258 #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:261 #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:264 +#, elixir-autogen, elixir-format msgid "File is too large" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/plugs/ensure_privileged_plug.ex:21 #: lib/pleroma/web/plugs/ensure_privileged_plug.ex:34 #: lib/pleroma/web/plugs/ensure_privileged_plug.ex:41 +#, elixir-autogen, elixir-format msgid "User isn't privileged." msgstr "" diff --git a/priv/gettext/oauth_scopes.pot b/priv/gettext/oauth_scopes.pot index 5f7b425f3e..50ad0dd9ed 100644 --- a/priv/gettext/oauth_scopes.pot +++ b/priv/gettext/oauth_scopes.pot @@ -10,252 +10,212 @@ msgid "" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:read" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "follow" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "push" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "read" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "read:accounts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "read:backups" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "read:blocks" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "read:bookmarks" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "read:chats" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "read:favourites" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "read:filters" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "read:follows" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "read:lists" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "read:notifications" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "read:reports" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "read:search" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "read:statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:accounts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:blocks" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:bookmarks" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "write:chats" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "write:conversations" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:favourites" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:filters" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "write:follow" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "write:follows" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:lists" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:media" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:mutes" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "write:notifications" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "write:reports" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "write:statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:read:accounts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:read:chats" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:read:invites" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:read:media_proxy_caches" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:read:reports" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:read:statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write:accounts" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write:chats" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write:follows" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write:invites" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write:media_proxy_caches" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write:reports" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 +#, elixir-autogen, elixir-format msgid "admin:write:statuses" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/api_spec/scopes/translator.ex:5 -msgid "read:media" -msgstr "" - #, elixir-autogen, elixir-format -#: lib/pleroma/web/api_spec/scopes/translator.ex:5 msgid "read:mutes" msgstr "" diff --git a/priv/gettext/static_pages.pot b/priv/gettext/static_pages.pot index 4c372ac4d5..2085282396 100644 --- a/priv/gettext/static_pages.pot +++ b/priv/gettext/static_pages.pot @@ -10,553 +10,553 @@ msgid "" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:9 +#, elixir-autogen, elixir-format msgctxt "remote follow authorization button" msgid "Authorize" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:2 +#, elixir-autogen, elixir-format msgctxt "remote follow error" msgid "Error fetching user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "remote follow header" msgid "Remote follow" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "placeholder text for auth code entry" msgid "Authentication code" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:10 +#, elixir-autogen, elixir-format msgctxt "placeholder text for password entry" msgid "Password" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "placeholder text for username entry" msgid "Username" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:13 +#, elixir-autogen, elixir-format msgctxt "remote follow authorization button for login" msgid "Authorize" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:12 +#, elixir-autogen, elixir-format msgctxt "remote follow authorization button for mfa" msgid "Authorize" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:2 +#, elixir-autogen, elixir-format msgctxt "remote follow error" msgid "Error following account" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "remote follow header, need login" msgid "Log in to follow" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "remote follow mfa header" msgid "Two-factor authentication" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "remote follow success" msgid "Account followed!" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:7 #: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:7 +#, elixir-autogen, elixir-format msgctxt "placeholder text for account id" msgid "Your account ID, e.g. lain@quitter.se" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "remote follow authorization button for following with a remote account" msgid "Follow" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:2 +#, elixir-autogen, elixir-format msgctxt "remote follow error" msgid "Error: %{error}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "remote follow header" msgid "Remotely follow %{nickname}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:12 +#, elixir-autogen, elixir-format msgctxt "password reset button" msgid "Reset" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "password reset failed homepage link" msgid "Homepage" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "password reset failed message" msgid "Password reset failed" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "password reset form confirm password prompt" msgid "Confirmation" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "password reset form password prompt" msgid "Password" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/invalid_token.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "password reset invalid token message" msgid "Invalid Token" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:2 +#, elixir-autogen, elixir-format msgctxt "password reset successful homepage link" msgid "Homepage" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "password reset successful message" msgid "Password changed!" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/feed/feed/tag.atom.eex:12 #: lib/pleroma/web/templates/feed/feed/tag.rss.eex:8 +#, elixir-autogen, elixir-format msgctxt "tag feed description" msgid "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "oauth authorization exists page title" msgid "Authorization exists" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:32 +#, elixir-autogen, elixir-format msgctxt "oauth authorize approve button" msgid "Approve" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:30 +#, elixir-autogen, elixir-format msgctxt "oauth authorize cancel button" msgid "Cancel" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:23 +#, elixir-autogen, elixir-format msgctxt "oauth authorize message" msgid "Application %{client_name} is requesting access to your account." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "oauth authorized page title" msgid "Successfully authorized" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "oauth external provider page title" msgid "Sign in with external provider" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:13 +#, elixir-autogen, elixir-format msgctxt "oauth external provider sign in button" msgid "Sign in with %{strategy}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:54 +#, elixir-autogen, elixir-format msgctxt "oauth login button" msgid "Log In" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:51 +#, elixir-autogen, elixir-format msgctxt "oauth login password prompt" msgid "Password" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:47 +#, elixir-autogen, elixir-format msgctxt "oauth login username prompt" msgid "Username" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:39 +#, elixir-autogen, elixir-format msgctxt "oauth register nickname prompt" msgid "Pleroma Handle" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:37 +#, elixir-autogen, elixir-format msgctxt "oauth register nickname unchangeable warning" msgid "Choose carefully! You won't be able to change this later. You will be able to change your display name, though." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:18 +#, elixir-autogen, elixir-format msgctxt "oauth register page email prompt" msgid "Email" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:10 +#, elixir-autogen, elixir-format msgctxt "oauth register page fill form prompt" msgid "If you'd like to register a new account, please provide the details below." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:35 +#, elixir-autogen, elixir-format msgctxt "oauth register page login button" msgid "Proceed as existing user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:31 +#, elixir-autogen, elixir-format msgctxt "oauth register page login password prompt" msgid "Password" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:24 +#, elixir-autogen, elixir-format msgctxt "oauth register page login prompt" msgid "Alternatively, sign in to connect to existing account." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:27 +#, elixir-autogen, elixir-format msgctxt "oauth register page login username prompt" msgid "Name or email" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:14 +#, elixir-autogen, elixir-format msgctxt "oauth register page nickname prompt" msgid "Nickname" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:22 +#, elixir-autogen, elixir-format msgctxt "oauth register page register button" msgid "Proceed as new user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "oauth register page title" msgid "Registration Details" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:36 +#, elixir-autogen, elixir-format msgctxt "oauth register page title" msgid "This is the first time you visit! Please enter your Pleroma handle." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex:2 +#, elixir-autogen, elixir-format msgctxt "oauth scopes message" msgid "The following permissions will be granted" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:2 #: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:2 +#, elixir-autogen, elixir-format msgctxt "oauth token code message" msgid "Token code is
%{token}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:12 +#, elixir-autogen, elixir-format msgctxt "mfa auth code prompt" msgid "Authentication code" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "mfa auth page title" msgid "Two-factor authentication" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:23 +#, elixir-autogen, elixir-format msgctxt "mfa auth page use recovery code link" msgid "Enter a two-factor recovery code" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:20 +#, elixir-autogen, elixir-format msgctxt "mfa auth verify code button" msgid "Verify" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "mfa recover page title" msgid "Two-factor recovery" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:12 +#, elixir-autogen, elixir-format msgctxt "mfa recover recovery code prompt" msgid "Recovery code" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:23 +#, elixir-autogen, elixir-format msgctxt "mfa recover use 2fa code link" msgid "Enter a two-factor code" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:20 +#, elixir-autogen, elixir-format msgctxt "mfa recover verify recovery code button" msgid "Verify" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "static fe profile page remote follow button" msgid "Remote follow" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/email/digest.html.eex:163 +#, elixir-autogen, elixir-format msgctxt "digest email header line" msgid "Hey %{nickname}, here is what you've missed!" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/email/digest.html.eex:544 +#, elixir-autogen, elixir-format msgctxt "digest email receiver address" msgid "The email address you are subscribed as is %{email}. " msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/email/digest.html.eex:538 +#, elixir-autogen, elixir-format msgctxt "digest email sending reason" msgid "You have received this email because you have signed up to receive digest emails from %{instance} Pleroma instance." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/email/digest.html.eex:547 +#, elixir-autogen, elixir-format msgctxt "digest email unsubscribe action" msgid "To unsubscribe, please go %{here}." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/email/digest.html.eex:547 +#, elixir-autogen, elixir-format msgctxt "digest email unsubscribe action link text" msgid "here" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/mailer/subscription/unsubscribe_failure.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "mailer unsubscribe failed message" msgid "UNSUBSCRIBE FAILURE" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/mailer/subscription/unsubscribe_success.html.eex:1 +#, elixir-autogen, elixir-format msgctxt "mailer unsubscribe successful message" msgid "UNSUBSCRIBE SUCCESSFUL" msgstr "" -#, elixir-format #: lib/pleroma/web/templates/email/digest.html.eex:385 +#, elixir-format msgctxt "new followers count header" msgid "%{count} New Follower" msgid_plural "%{count} New Followers" msgstr[0] "" msgstr[1] "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:356 +#, elixir-autogen, elixir-format msgctxt "account archive email body - self-requested" msgid "

You requested a full backup of your Pleroma account. It's ready for download:

\n

%{download_url}

\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:384 +#, elixir-autogen, elixir-format msgctxt "account archive email subject" msgid "Your account archive is ready" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:188 +#, elixir-autogen, elixir-format msgctxt "approval pending email body" msgid "

Awaiting Approval

\n

Your account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.

\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:202 +#, elixir-autogen, elixir-format msgctxt "approval pending email subject" msgid "Your account is awaiting approval" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:158 +#, elixir-autogen, elixir-format msgctxt "confirmation email body" msgid "

Thank you for registering on %{instance_name}

\n

Email confirmation is required to activate the account.

\n

Please click the following link to activate your account.

\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:174 +#, elixir-autogen, elixir-format msgctxt "confirmation email subject" msgid "%{instance_name} account confirmation" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:310 +#, elixir-autogen, elixir-format msgctxt "digest email subject" msgid "Your digest from %{instance_name}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:81 +#, elixir-autogen, elixir-format msgctxt "password reset email body" msgid "

Reset your password at %{instance_name}

\n

Someone has requested password change for your account at %{instance_name}.

\n

If it was you, visit the following link to proceed: reset password.

\n

If it was someone else, nothing to worry about: your data is secure and your password has not been changed.

\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:98 +#, elixir-autogen, elixir-format msgctxt "password reset email subject" msgid "Password reset" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:215 +#, elixir-autogen, elixir-format msgctxt "successful registration email body" msgid "

Hello @%{nickname},

\n

Your account at %{instance_name} has been registered successfully.

\n

No further action is required to activate your account.

\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:231 +#, elixir-autogen, elixir-format msgctxt "successful registration email subject" msgid "Account registered on %{instance_name}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:119 +#, elixir-autogen, elixir-format msgctxt "user invitation email body" msgid "

You are invited to %{instance_name}

\n

%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.

\n

Click the following link to register: accept invitation.

\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:136 +#, elixir-autogen, elixir-format msgctxt "user invitation email subject" msgid "Invitation to %{instance_name}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:53 +#, elixir-autogen, elixir-format msgctxt "welcome email html body" msgid "Welcome to %{instance_name}!" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:41 +#, elixir-autogen, elixir-format msgctxt "welcome email subject" msgid "Welcome to %{instance_name}!" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:65 +#, elixir-autogen, elixir-format msgctxt "welcome email text body" msgid "Welcome to %{instance_name}!" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/emails/user_email.ex:368 +#, elixir-autogen, elixir-format msgctxt "account archive email body - admin requested" msgid "

Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:

\n

%{download_url}

\n" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/controllers/util_controller.ex:123 +#, elixir-autogen, elixir-format msgctxt "remote follow error message - unknown error" msgid "Something went wrong." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/controllers/util_controller.ex:67 +#, elixir-autogen, elixir-format msgctxt "remote follow error message - user not found" msgid "Could not find user" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:8 +#, elixir-autogen, elixir-format msgctxt "status interact authorization button" msgid "Interact" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:2 +#, elixir-autogen, elixir-format msgctxt "status interact error" msgid "Error: %{error}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/controllers/util_controller.ex:95 +#, elixir-autogen, elixir-format msgctxt "status interact error message - status not found" msgid "Could not find status" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/twitter_api/controllers/util_controller.ex:144 +#, elixir-autogen, elixir-format msgctxt "status interact error message - unknown error" msgid "Something went wrong." msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "status interact header" msgid "Interacting with %{nickname}'s %{status_link}" msgstr "" -#, elixir-autogen, elixir-format #: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:4 +#, elixir-autogen, elixir-format msgctxt "status interact header - status link text" msgid "status" msgstr "" From dd9f8150fce34cc9a30a92a7e3de9560d5146871 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 22 Jun 2023 21:24:58 +0200 Subject: [PATCH 58/82] Merge Revert "Merge branch 'validate-host' into 'develop'" This reverts commit d998a114e26033e98e87778e5ca659aff91831bf, reversing changes made to da6b4003acad84b0f60ad8da6d08cfe13564b058. --- changelog.d/3896.add | 1 - changelog.d/3909.skip | 0 lib/pleroma/web/plugs/uploaded_media.ex | 22 +--------------- .../web/plugs/uploaded_media_plug_test.exs | 26 ------------------- 4 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 changelog.d/3896.add create mode 100644 changelog.d/3909.skip diff --git a/changelog.d/3896.add b/changelog.d/3896.add deleted file mode 100644 index e8fde4c8a0..0000000000 --- a/changelog.d/3896.add +++ /dev/null @@ -1 +0,0 @@ -Validate Host header for Uploads and return a 302 if the base_url has changed diff --git a/changelog.d/3909.skip b/changelog.d/3909.skip new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/pleroma/web/plugs/uploaded_media.ex b/lib/pleroma/web/plugs/uploaded_media.ex index 9dd5eb2398..8b3bc9acbd 100644 --- a/lib/pleroma/web/plugs/uploaded_media.ex +++ b/lib/pleroma/web/plugs/uploaded_media.ex @@ -46,32 +46,12 @@ def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) do config = Pleroma.Config.get(Pleroma.Upload) - %{scheme: media_scheme, host: media_host, port: media_port} = - Pleroma.Upload.base_url() |> URI.parse() - - with {:valid_host, true} <- {:valid_host, match?(^media_host, conn.host)}, - uploader <- Keyword.fetch!(config, :uploader), + with uploader <- Keyword.fetch!(config, :uploader), proxy_remote = Keyword.get(config, :proxy_remote, false), {:ok, get_method} <- uploader.get_file(file), false <- media_is_banned(conn, get_method) do get_media(conn, get_method, proxy_remote, opts) else - {:valid_host, false} -> - redirect_url = - %URI{ - scheme: media_scheme, - host: media_host, - port: media_port, - path: conn.request_path, - query: conn.query_string - } - |> URI.to_string() - |> String.trim_trailing("?") - - conn - |> Phoenix.Controller.redirect(external: redirect_url) - |> halt() - _ -> conn |> send_resp(:internal_server_error, dgettext("errors", "Failed")) diff --git a/test/pleroma/web/plugs/uploaded_media_plug_test.exs b/test/pleroma/web/plugs/uploaded_media_plug_test.exs index dbf8ca5ec4..8323ff6aba 100644 --- a/test/pleroma/web/plugs/uploaded_media_plug_test.exs +++ b/test/pleroma/web/plugs/uploaded_media_plug_test.exs @@ -40,30 +40,4 @@ test "sends Content-Disposition header when name param is set", %{ &(&1 == {"content-disposition", ~s[inline; filename="\\"cofe\\".gif"]}) ) end - - test "denies access to media if wrong Host", %{ - attachment_url: attachment_url - } do - conn = get(build_conn(), attachment_url) - - assert conn.status == 200 - - new_media_base = "http://media.localhost:8080" - - %{scheme: new_media_scheme, host: new_media_host, port: new_media_port} = - URI.parse(new_media_base) - - clear_config([Pleroma.Upload, :base_url], new_media_base) - - conn = get(build_conn(), attachment_url) - - expected_url = - URI.parse(attachment_url) - |> Map.put(:host, new_media_host) - |> Map.put(:port, new_media_port) - |> Map.put(:scheme, new_media_scheme) - |> URI.to_string() - - assert redirected_to(conn, 302) == expected_url - end end From 8bc51288be21f3b04d74504dc0c7d5a7ac6aa0e3 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 27 Jun 2023 00:06:58 +0200 Subject: [PATCH 59/82] release_runtime_provider_test: Explicitely use non-existant config file --- changelog.d/testfix-system-config-use.skip | 0 test/pleroma/config/release_runtime_provider_test.exs | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 changelog.d/testfix-system-config-use.skip diff --git a/changelog.d/testfix-system-config-use.skip b/changelog.d/testfix-system-config-use.skip new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/pleroma/config/release_runtime_provider_test.exs b/test/pleroma/config/release_runtime_provider_test.exs index 4e0d4c838a..e6d10b13e5 100644 --- a/test/pleroma/config/release_runtime_provider_test.exs +++ b/test/pleroma/config/release_runtime_provider_test.exs @@ -10,7 +10,7 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do describe "load/2" do test "loads release defaults config and warns about non-existent runtime config" do ExUnit.CaptureIO.capture_io(fn -> - merged = ReleaseRuntimeProvider.load([], []) + merged = ReleaseRuntimeProvider.load([], config_path: "/var/empty/config.exs") assert merged == Pleroma.Config.Holder.release_defaults() end) =~ "!!! Config path is not declared! Please ensure it exists and that PLEROMA_CONFIG_PATH is unset or points to an existing file" From aa4c4ab2a0fd2e3ed3abd7ea455463f3f65a5083 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 27 Jun 2023 00:23:21 +0200 Subject: [PATCH 60/82] mix: 2023-06 deps update this fixes compatibility with Erlang OTP 26 Related: https://git.pleroma.social/pleroma/pleroma/-/issues/2913 --- changelog.d/2023-06-deps-update.skip | 0 mix.exs | 3 ++- mix.lock | 38 ++++++++++++++-------------- 3 files changed, 21 insertions(+), 20 deletions(-) create mode 100644 changelog.d/2023-06-deps-update.skip diff --git a/changelog.d/2023-06-deps-update.skip b/changelog.d/2023-06-deps-update.skip new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mix.exs b/mix.exs index 62ac1c1a08..fa72a85a96 100644 --- a/mix.exs +++ b/mix.exs @@ -150,7 +150,8 @@ defp deps do {:bbcode_pleroma, "~> 0.2.0"}, {:cors_plug, "~> 2.0"}, {:web_push_encryption, "~> 0.3.1"}, - {:swoosh, "~> 1.0"}, + # swoosh 1.11.2+ requires Elixir 1.12+ + {:swoosh, "~> 1.10.0"}, {:phoenix_swoosh, "~> 1.1"}, {:gen_smtp, "~> 0.13"}, {:ex_syslogger, "~> 1.4"}, diff --git a/mix.lock b/mix.lock index b6938f44b4..fc1266570c 100644 --- a/mix.lock +++ b/mix.lock @@ -15,23 +15,23 @@ "concurrent_limiter": {:hex, :concurrent_limiter, "0.1.1", "43ae1dc23edda1ab03dd66febc739c4ff710d047bb4d735754909f9a474ae01c", [:mix], [{:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "53968ff238c0fbb4d7ed76ddb1af0be6f3b2f77909f6796e249e737c505a16eb"}, "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, "cors_plug": {:hex, :cors_plug, "2.0.3", "316f806d10316e6d10f09473f19052d20ba0a0ce2a1d910ddf57d663dac402ae", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ee4ae1418e6ce117fc42c2ba3e6cbdca4e95ecd2fe59a05ec6884ca16d469aea"}, - "covertool": {:hex, :covertool, "2.0.4", "54acff6cddd88d28dea663cd2e1fe20dd32fcf5f5d3aff7d59031ce44ce39efa", [:rebar3], [], "hexpm", "5c9568ba4308fda2082172737c80c31d991ea83961eb10791f06106a870d0cdc"}, - "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, + "covertool": {:hex, :covertool, "2.0.6", "4a291b4e3449025b0595d8f44c8d7635d4f48f033be2ce88d22a329f36f94a91", [:rebar3], [], "hexpm", "5db3fcd82180d8ea4ad857d4d1ab21a8d31b5aee0d60d2f6c0f9e25a411d1e21"}, + "cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, "cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"}, "credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"}, "crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"}, "custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"}, - "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"}, - "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, + "db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"}, + "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, "earmark": {:hex, :earmark, "1.4.22", "ea3e45c6359446dc308be0a64ce82a03260d973de7d0625a762e6d352ff57958", [:mix], [{:earmark_parser, "~> 1.4.23", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "1caf5145665a42fd76d5317286b0c171861fb1c04f86ab103dde76868814fdfb"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.32", "fa739a0ecfa34493de19426681b23f6814573faee95dfd4b4aafe15a7b5b32c6", [:mix], [], "hexpm", "b8b0dd77d60373e77a3d7e8afa598f325e49e8663a51bcc2b88ef41838cca755"}, "eblurhash": {:hex, :eblurhash, "1.2.2", "7da4255aaea984b31bb71155f673257353b0e0554d0d30dcf859547e74602582", [:rebar3], [], "hexpm", "8c20ca00904de023a835a9dcb7b7762fed32264c85a80c3cafa85288e405044c"}, - "ecto": {:hex, :ecto, "3.9.5", "9f0aa7ae44a1577b651c98791c6988cd1b69b21bc724e3fd67090b97f7604263", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d4f3115d8cbacdc0bfa4b742865459fb1371d0715515842a1fb17fe31920b74c"}, + "ecto": {:hex, :ecto, "3.10.2", "6b887160281a61aa16843e47735b8a266caa437f80588c3ab80a8a960e6abe37", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6a895778f0d7648a4b34b486af59a1c8009041fbdf2b17f1ac215eb829c60235"}, "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"}, - "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.10", "e14d400930f401ca9f541b3349212634e44027d7f919bbb71224d7ac0d0e8acd", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "505e8cd81e4f17c090be0f99e92b1b3f0fd915f98e76965130b8ccfb891e7088"}, - "ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"}, + "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.11", "6e20144c1446dcccfcdb4c142c9d8b7992a90a569b1d5958cbea5458550b25f0", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0 or ~> 0.17.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "def61f1f92d4f40d51c80bbae2157212d6c0a459eb604be446e47369cbd40b23"}, + "ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"}, "eimp": {:hex, :eimp, "1.0.14", "fc297f0c7e2700457a95a60c7010a5f1dcb768a083b6d53f49cd94ab95a28f22", [:rebar3], [{:p1_utils, "1.0.18", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "501133f3112079b92d9e22da8b88bf4f0e13d4d67ae9c15c42c30bd25ceb83b6"}, "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"}, "esbuild": {:hex, :esbuild, "0.5.0", "d5bb08ff049d7880ee3609ed5c4b864bd2f46445ea40b16b4acead724fb4c4a3", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "f183a0b332d963c4cfaf585477695ea59eef9a6f2204fdd0efa00e099694ffe5"}, @@ -48,10 +48,10 @@ "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, "finch": {:hex, :finch, "0.10.2", "9ad27d68270d879f73f26604bb2e573d40f29bf0e907064a9a337f90a16a0312", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dd8b11b282072cec2ef30852283949c248bd5d2820c88d8acc89402b81db7550"}, "flake_id": {:hex, :flake_id, "0.1.0", "7716b086d2e405d09b647121a166498a0d93d1a623bead243e1f74216079ccb3", [:mix], [{:base62, "~> 1.2", [hex: :base62, repo: "hexpm", optional: false]}, {:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "31fc8090fde1acd267c07c36ea7365b8604055f897d3a53dd967658c691bd827"}, - "floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"}, + "floki": {:hex, :floki, "0.34.3", "5e2dcaec5d7c228ce5b1d3501502e308b2d79eb655e4191751a1fe491c37feac", [:mix], [], "hexpm", "9577440eea5b97924b4bf3c7ea55f7b8b6dce589f9b28b096cc294a8dc342341"}, "gen_smtp": {:hex, :gen_smtp, "0.15.0", "9f51960c17769b26833b50df0b96123605a8024738b62db747fece14eb2fbfcc", [:rebar3], [], "hexpm", "29bd14a88030980849c7ed2447b8db6d6c9278a28b11a44cafe41b791205440f"}, "gettext": {:hex, :gettext, "0.22.2", "6bfca374de34ecc913a28ba391ca184d88d77810a3e427afa8454a71a51341ac", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "8a2d389673aea82d7eae387e6a2ccc12660610080ae7beb19452cfdc1ec30f60"}, - "gun": {:hex, :gun, "2.0.0", "2326bc0fd6d9cf628419708270d6fe8b02b8d002cf992e4165a77d997b1defd0", [:make, :rebar3], [{:cowlib, "2.12.0", [hex: :cowlib, repo: "hexpm", optional: false]}], "hexpm", "6613cb7c62930dc8d58263c44dda72f8556346ba88358fc929dcbc5f76d04569"}, + "gun": {:hex, :gun, "2.0.1", "160a9a5394800fcba41bc7e6d421295cf9a7894c2252c0678244948e3336ad73", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}], "hexpm", "a10bc8d6096b9502205022334f719cc9a08d9adcfbfc0dbee9ef31b56274a20b"}, "hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~>2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"}, "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, @@ -67,31 +67,31 @@ "majic": {:hex, :majic, "1.0.0", "37e50648db5f5c2ff0c9fb46454d034d11596c03683807b9fb3850676ffdaab3", [:make, :mix], [{:elixir_make, "~> 0.6.1", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "7905858f76650d49695f14ea55cd9aaaee0c6654fa391671d4cf305c275a0a9e"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, "makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, + "makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"}, "meck": {:hex, :meck, "0.9.2", "85ccbab053f1db86c7ca240e9fc718170ee5bda03810a6292b5306bf31bae5f5", [:rebar3], [], "hexpm", "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, "mint": {:hex, :mint, "1.5.1", "8db5239e56738552d85af398798c80648db0e90f343c8469f6c6d8898944fb6f", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "4a63e1e76a7c3956abd2c72f370a0d0aecddc3976dea5c27eccbecfa5e7d5b1e"}, "mochiweb": {:hex, :mochiweb, "2.18.0", "eb55f1db3e6e960fac4e6db4e2db9ec3602cc9f30b86cd1481d56545c3145d2e", [:rebar3], [], "hexpm"}, - "mock": {:hex, :mock, "0.3.7", "75b3bbf1466d7e486ea2052a73c6e062c6256fb429d6797999ab02fa32f29e03", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "4da49a4609e41fd99b7836945c26f373623ea968cfb6282742bcb94440cf7e5c"}, - "mogrify": {:hex, :mogrify, "0.9.2", "b360984adea7dd6a55f18028e6327973c58de7f548fdb86c9859848aa904d5b0", [:mix], [], "hexpm", "c18d10fd70ca20e2585301616c89f6e4f7159d92efc9cc8ee579e00c886f699d"}, + "mock": {:hex, :mock, "0.3.8", "7046a306b71db2488ef54395eeb74df0a7f335a7caca4a3d3875d1fc81c884dd", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "7fa82364c97617d79bb7d15571193fc0c4fe5afd0c932cef09426b3ee6fe2022"}, + "mogrify": {:hex, :mogrify, "0.9.3", "238c782f00271dace01369ad35ae2e9dd020feee3443b9299ea5ea6bed559841", [:mix], [], "hexpm", "0189b1e1de27455f2b9ae8cf88239cefd23d38de9276eb5add7159aea51731e6"}, "mox": {:hex, :mox, "1.0.2", "dc2057289ac478b35760ba74165b4b3f402f68803dd5aecd3bfd19c183815d64", [:mix], [], "hexpm", "f9864921b3aaf763c8741b5b8e6f908f44566f1e427b2630e89e9a73b981fef2"}, "nimble_options": {:hex, :nimble_options, "0.4.0", "c89babbab52221a24b8d1ff9e7d838be70f0d871be823165c94dd3418eea728f", [:mix], [], "hexpm", "e6701c1af326a11eea9634a3b1c62b475339ace9456c1a23ec3bc9a847bca02d"}, "nimble_parsec": {:hex, :nimble_parsec, "0.6.0", "32111b3bf39137144abd7ba1cce0914533b2d16ef35e8abc5ec8be6122944263", [:mix], [], "hexpm", "27eac315a94909d4dc68bc07a4a83e06c8379237c5ea528a9acff4ca1c873c52"}, "nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"}, "nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]}, "oban": {:hex, :oban, "2.13.6", "a0cb1bce3bd393770512231fb5a3695fa19fd3af10d7575bf73f837aee7abf43", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c1c5eb16f377b3cbbf2ea14be24d20e3d91285af9d1ac86260b7c2af5464887"}, - "open_api_spex": {:hex, :open_api_spex, "3.16.1", "8137c338129d63060b4b04947c6c57429f86267045c479c703a38a6d3f98dee1", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:ymlr, "~> 2.0 or ~> 3.0", [hex: :ymlr, repo: "hexpm", optional: true]}], "hexpm", "ef6fd778ac121af866b48b75ad4ad256b6ff33949113ea4aa1629af8bfdfdbfb"}, + "open_api_spex": {:hex, :open_api_spex, "3.17.3", "ada8e352eb786050dd639db2439d3316e92f3798eb2abd051f55bb9af825b37e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:ymlr, "~> 2.0 or ~> 3.0", [hex: :ymlr, repo: "hexpm", optional: true]}], "hexpm", "165db21a85ca83cffc8e7c8890f35b354eddda8255de7404a2848ed652b9f0fe"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "1.2.1", "9cbe354b58121075bd20eb83076900a3832324b7dd171a6895fab57b6bb2752c", [:mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}], "hexpm", "d3b40a4a4630f0b442f19eca891fcfeeee4c40871936fed2f68e1c4faa30481f"}, "phoenix": {:hex, :phoenix, "1.6.16", "e5bdd18c7a06da5852a25c7befb72246de4ddc289182285f8685a40b7b5f5451", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e15989ff34f670a96b95ef6d1d25bad0d9c50df5df40b671d8f4a669e050ac39"}, - "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"}, + "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.2", "b21bd01fdeffcfe2fab49e4942aa938b6d3e89e93a480d4aee58085560a0bc0d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "70242edd4601d50b69273b057ecf7b684644c19ee750989fd555625ae4ce8f5d"}, "phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.6.5", "1495bb014be12c9a9252eca04b9af54246f6b5c1e4cd1f30210cd00ec540cf8e", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.3", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.17.7", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "ef4fa50dd78364409039c99cf6f98ab5209b4c5f8796c17f4db118324f0db852"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.3", "3a53772a6118d5679bf50fc1670505a290e32a1d195df9e069d8c53ab040c054", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "766796676e5f558dbae5d1bdb066849673e956005e3730dfd5affd7a6da4abac"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.17.14", "5ec615d4d61bf9d4755f158bd6c80372b715533fe6d6219e12d74fb5eedbeac1", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.0 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "afeb6ba43ce329a6f7fc1c9acdfc6d3039995345f025febb7f409a92f6faebd3"}, - "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"}, + "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"}, "phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"}, "phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"}, @@ -101,7 +101,7 @@ "plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, - "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"}, + "postgrex": {:hex, :postgrex, "0.17.1", "01c29fd1205940ee55f7addb8f1dc25618ca63a8817e56fac4f6846fc2cddcbe", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "14b057b488e73be2beee508fb1955d8db90d6485c6466428fe9ccf1d6692a555"}, "pot": {:hex, :pot, "1.0.2", "13abb849139fdc04ab8154986abbcb63bdee5de6ed2ba7e1713527e33df923dd", [:rebar3], [], "hexpm", "78fe127f5a4f5f919d6ea5a2a671827bd53eb9d37e5b4128c0ad3df99856c2e0"}, "prom_ex": {:hex, :prom_ex, "1.7.1", "39331ee3fe6f9a8587d8208bf9274a253bb80281700e127dd18786cda5e08c37", [:mix], [{:absinthe, ">= 1.6.0", [hex: :absinthe, repo: "hexpm", optional: true]}, {:broadway, ">= 1.0.2", [hex: :broadway, repo: "hexpm", optional: true]}, {:ecto, ">= 3.5.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:finch, "~> 0.10.2", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}, {:oban, ">= 2.4.0", [hex: :oban, repo: "hexpm", optional: true]}, {:phoenix, ">= 1.5.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, ">= 0.14.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, ">= 1.12.1", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.5.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.1", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0.2", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}, {:telemetry_poller, "~> 1.0.0", [hex: :telemetry_poller, repo: "hexpm", optional: false]}], "hexpm", "4c978872b88a929833925a0f4d0561824804c671fdd04581e765509ed0a6ed08"}, "prometheus": {:hex, :prometheus, "4.10.0", "792adbf0130ff61b5fa8826f013772af24b6e57b984445c8d602c8a0355704a1", [:mix, :rebar3], [{:quantile_estimator, "~> 0.2.1", [hex: :quantile_estimator, repo: "hexpm", optional: false]}], "hexpm", "2a99bb6dce85e238c7236fde6b0064f9834dc420ddbd962aac4ea2a3c3d59384"}, @@ -115,10 +115,10 @@ "recon": {:hex, :recon, "2.5.3", "739107b9050ea683c30e96de050bc59248fd27ec147696f79a8797ff9fa17153", [:mix, :rebar3], [], "hexpm", "6c6683f46fd4a1dfd98404b9f78dcabc7fcd8826613a89dcb984727a8c3099d7"}, "remote_ip": {:git, "https://git.pleroma.social/pleroma/remote_ip.git", "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8", [ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"]}, "sleeplocks": {:hex, :sleeplocks, "1.1.2", "d45aa1c5513da48c888715e3381211c859af34bee9b8290490e10c90bb6ff0ca", [:rebar3], [], "hexpm", "9fe5d048c5b781d6305c1a3a0f40bb3dfc06f49bf40571f3d2d0c57eaa7f59a5"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, "sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"}, - "swoosh": {:hex, :swoosh, "1.9.1", "0a5d7bf9954eb41d7e55525bc0940379982b090abbaef67cd8e1fd2ed7f8ca1a", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76dffff3ffcab80f249d5937a592eaef7cc49ac6f4cdd27e622868326ed6371e"}, + "swoosh": {:hex, :swoosh, "1.10.3", "32f1531ee3fe4e82da8175c597bf3692938f8152eb981e0cbf57107b6c5924c1", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8b7167d93047bac6e1a1c367bf7d899cf2e4fea0592ee04a70673548ef6091b9"}, "syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"}, "table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"}, "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, From 9e69adf76fcd8c13581dcd1abc68520f3f0e25d8 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 27 Jun 2023 01:52:40 +0200 Subject: [PATCH 61/82] mix: Remove override on plug --- mix.exs | 3 --- mix.lock | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/mix.exs b/mix.exs index fa72a85a96..fc4e87ee3b 100644 --- a/mix.exs +++ b/mix.exs @@ -194,9 +194,6 @@ defp deps do {:open_api_spex, "~> 3.16"}, {:ecto_psql_extras, "~> 0.6"}, - # indirect dependency version override - {:plug, "~> 1.10.4", override: true}, - ## dev & test {:ex_doc, "~> 0.22", only: :dev, runtime: false}, {:ex_machina, "~> 2.4", only: :test}, diff --git a/mix.lock b/mix.lock index fc1266570c..da187ac5c9 100644 --- a/mix.lock +++ b/mix.lock @@ -95,7 +95,7 @@ "phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"}, "phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"}, "phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"}, - "plug": {:hex, :plug, "1.10.4", "41eba7d1a2d671faaf531fa867645bd5a3dce0957d8e2a3f398ccff7d2ef017f", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad1e233fe73d2eec56616568d260777b67f53148a999dc2d048f4eb9778fe4a0"}, + "plug": {:hex, :plug, "1.14.2", "cff7d4ec45b4ae176a227acd94a7ab536d9b37b942c8e8fa6dfc0fff98ff4d80", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "842fc50187e13cf4ac3b253d47d9474ed6c296a8732752835ce4a86acdf68d13"}, "plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"}, "plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"}, "plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"}, From 3a67b8f28728d3071c9a64d9b8c07ab91919676f Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 27 Jun 2023 02:08:49 +0200 Subject: [PATCH 62/82] endpoint: Use custom Multipart module for dynamic configuration --- lib/pleroma/web/endpoint.ex | 7 ++----- lib/pleroma/web/multipart.ex | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 lib/pleroma/web/multipart.ex diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index d8d40cceb6..574f3ab635 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -101,13 +101,10 @@ defmodule Pleroma.Web.Endpoint do plug(Plug.Logger, log: :debug) plug(Plug.Parsers, - parsers: [ - :urlencoded, - {:multipart, length: {Config, :get, [[:instance, :upload_limit]]}}, - :json - ], + parsers: [:urlencoded, Pleroma.Web.Multipart, :json], pass: ["*/*"], json_decoder: Jason, + # Note: this is compile-time only, won't work for database-config length: Config.get([:instance, :upload_limit]), body_reader: {Pleroma.Web.Plugs.DigestPlug, :read_body, []} ) diff --git a/lib/pleroma/web/multipart.ex b/lib/pleroma/web/multipart.ex new file mode 100644 index 0000000000..e24bb14c2b --- /dev/null +++ b/lib/pleroma/web/multipart.ex @@ -0,0 +1,22 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +# +defmodule Pleroma.Web.Multipart do + @multipart Plug.Parsers.MULTIPART + + def init(opts) do + opts + end + + def parse(conn, "multipart", subtype, headers, opts) do + length = Pleroma.Config.get([:instance, :upload_limit]) + opts = @multipart.init([length: length] ++ opts) + @multipart.parse(conn, "multipart", subtype, headers, opts) + end + + def parse(conn, _type, _subtype, _headers, _opts) do + {:next, conn} + end +end From d7e049d5e833cebb0a67c771943d33c532f8923a Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 27 Jun 2023 02:48:50 +0200 Subject: [PATCH 63/82] router: Fix usage of globs warning: doing a prefix match with globs is deprecated, invalid segment "pleroma*path". You can either replace by a single segment match: /foo/bar-:var Or by mixing single segment match with globs: /foo/bar-:var/*rest --- lib/pleroma/web/router.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c1a690e28a..6b9e158a3f 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -996,8 +996,8 @@ defmodule Pleroma.Web.Router do scope "/", Pleroma.Web.Fallback do get("/registration/:token", RedirectController, :registration_page) get("/:maybe_nickname_or_id", RedirectController, :redirector_with_meta) - match(:*, "/api/pleroma*path", LegacyPleromaApiRerouterPlug, []) - get("/api*path", RedirectController, :api_not_implemented) + match(:*, "/api/pleroma/*path", LegacyPleromaApiRerouterPlug, []) + get("/api/*path", RedirectController, :api_not_implemented) get("/*path", RedirectController, :redirector_with_preload) options("/*path", RedirectController, :empty) From bf2b4b9400a44bfec02db9210a4ebc6d2d0f8553 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 27 Jun 2023 21:08:47 +0200 Subject: [PATCH 64/82] README.md: Update packaging state (GURU, AUR) --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 62f8fdc64a..2837b6ef8d 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,8 @@ If your platform is not supported, or you just want to be able to edit the sourc - [OpenBSD (fi)](https://docs-develop.pleroma.social/backend/installation/openbsd_fi/) ### OS/Distro packages -Currently Pleroma is packaged for [YunoHost](https://yunohost.org) and [NixOS](https://nixos.org). If you want to package Pleroma for any OS/Distros, we can guide you through the process on our [community channels](#community-channels). If you want to change default options in your Pleroma package, please **discuss it with us first**. +Currently Pleroma is packaged for [YunoHost](https://yunohost.org), [NixOS](https://nixos.org), [Gentoo through GURU](https://gentoo.org/) and [Archlinux through AUR](https://aur.archlinux.org/packages/pleroma). You may find more at . +If you want to package Pleroma for any OS/Distros, we can guide you through the process on our [community channels](#community-channels). If you want to change default options in your Pleroma package, please **discuss it with us first**. ### Docker While we don’t provide docker files, other people have written very good ones. Take a look at or . From 63b9f767824b47d52e615d14353d5b9a7e71929a Mon Sep 17 00:00:00 2001 From: tusooa Date: Sat, 1 Jul 2023 23:25:04 -0400 Subject: [PATCH 65/82] Force the use of amd64 runners for jobs using ci-base --- .gitlab-ci.yml | 28 +++++++++++++++++++++++----- changelog.d/amd64-runner.skip | 0 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 changelog.d/amd64-runner.skip diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8daa9f434e..148cbe4055 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -65,13 +65,21 @@ check-changelog: - "**/*.exs" - "mix.lock" +.using-ci-base: + tags: + - amd64 + build: - extends: .build_changes_policy + extends: + - .build_changes_policy + - .using-ci-base stage: build script: - mix compile --force spec-build: + extends: + - .using-ci-base stage: test rules: - changes: @@ -85,6 +93,8 @@ spec-build: - mix pleroma.openapi_spec spec.json benchmark: + extends: + - .using-ci-base stage: benchmark when: manual variables: @@ -99,7 +109,9 @@ benchmark: - mix pleroma.load_testing unit-testing: - extends: .build_changes_policy + extends: + - .build_changes_policy + - .using-ci-base stage: test cache: &testing_cache_policy <<: *global_cache_policy @@ -121,7 +133,9 @@ unit-testing: path: coverage.xml unit-testing-erratic: - extends: .build_changes_policy + extends: + - .build_changes_policy + - .using-ci-base stage: test retry: 2 allow_failure: true @@ -155,7 +169,9 @@ unit-testing-erratic: # - mix test --trace --only federated unit-testing-rum: - extends: .build_changes_policy + extends: + - .build_changes_policy + - .using-ci-base stage: test cache: *testing_cache_policy services: @@ -186,7 +202,9 @@ lint: - mix format --check-formatted analysis: - extends: .build_changes_policy + extends: + - .build_changes_policy + - .using-ci-base stage: test cache: *testing_cache_policy script: diff --git a/changelog.d/amd64-runner.skip b/changelog.d/amd64-runner.skip new file mode 100644 index 0000000000..e69de29bb2 From a1621839cc31a92e346cbd6065c4db6a8ebeb5a9 Mon Sep 17 00:00:00 2001 From: tusooa Date: Sun, 2 Jul 2023 11:03:09 -0400 Subject: [PATCH 66/82] Fix user fetch completely broken if featured collection is not in a supported form --- .../featured-collection-shouldnt-break-user-fetch.fix | 1 + lib/pleroma/web/activity_pub/activity_pub.ex | 5 +++++ test/pleroma/web/activity_pub/activity_pub_test.exs | 8 ++++++++ 3 files changed, 14 insertions(+) create mode 100644 changelog.d/featured-collection-shouldnt-break-user-fetch.fix diff --git a/changelog.d/featured-collection-shouldnt-break-user-fetch.fix b/changelog.d/featured-collection-shouldnt-break-user-fetch.fix new file mode 100644 index 0000000000..e8ce288cc5 --- /dev/null +++ b/changelog.d/featured-collection-shouldnt-break-user-fetch.fix @@ -0,0 +1 @@ +Fix user fetch completely broken if featured collection is not in a supported form diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 1a10aef1db..c93288b79b 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1720,6 +1720,11 @@ def pin_data_from_featured_collection(%{ end) end + def pin_data_from_featured_collection(obj) do + Logger.error("Could not parse featured collection #{inspect(obj)}") + %{} + end + def fetch_and_prepare_featured_from_ap_id(nil) do {:ok, %{}} end diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs index 54fc6ef0a6..1e8c140438 100644 --- a/test/pleroma/web/activity_pub/activity_pub_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -2652,4 +2652,12 @@ test "allow fetching of accounts with an empty string name field" do {:ok, user} = ActivityPub.make_user_from_ap_id("https://princess.cat/users/mewmew") assert user.name == " " end + + test "pin_data_from_featured_collection will ignore unsupported values" do + assert %{} == + ActivityPub.pin_data_from_featured_collection(%{ + "type" => "OrderedCollection", + "first" => "https://social.example/users/alice/collections/featured?page=true" + }) + end end From 6e4de2383f17810a35a32ccdfea8e9de0183dab4 Mon Sep 17 00:00:00 2001 From: tusooa Date: Sun, 2 Jul 2023 11:15:34 -0400 Subject: [PATCH 67/82] Fix handling report from a deactivated user --- .../handle-report-from-deactivated-user.fix | 1 + lib/pleroma/web/common_api.ex | 2 +- .../controllers/report_controller_test.exs | 21 +++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 changelog.d/handle-report-from-deactivated-user.fix diff --git a/changelog.d/handle-report-from-deactivated-user.fix b/changelog.d/handle-report-from-deactivated-user.fix new file mode 100644 index 0000000000..6692d1aa8c --- /dev/null +++ b/changelog.d/handle-report-from-deactivated-user.fix @@ -0,0 +1 @@ +Fix handling report from a deactivated user diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex index 65d08de493..77b3fa5d2b 100644 --- a/lib/pleroma/web/common_api.ex +++ b/lib/pleroma/web/common_api.ex @@ -583,7 +583,7 @@ def update_report_state(activity_ids, state) when is_list(activity_ids) do end def update_report_state(activity_id, state) do - with %Activity{} = activity <- Activity.get_by_id(activity_id) do + with %Activity{} = activity <- Activity.get_by_id(activity_id, filter: []) do Utils.update_report_state(activity, state) else nil -> {:error, :not_found} diff --git a/test/pleroma/web/admin_api/controllers/report_controller_test.exs b/test/pleroma/web/admin_api/controllers/report_controller_test.exs index c141cf69de..fb2579a3dd 100644 --- a/test/pleroma/web/admin_api/controllers/report_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/report_controller_test.exs @@ -123,6 +123,7 @@ test "returns 404 when report id is invalid", %{conn: conn} do }) %{ + reporter: reporter, id: report_id, second_report_id: second_report_id } @@ -266,6 +267,26 @@ test "updates state of multiple reports", %{ assert ModerationLog.get_log_entry_message(second_log_entry) == "@#{admin.nickname} updated report ##{second_report_id} (on user @#{second_activity.user_actor.nickname}) with 'closed' state" end + + test "works if reporter is deactivated", %{ + conn: conn, + id: id, + reporter: reporter + } do + Pleroma.User.set_activation(reporter, false) + + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [ + %{"state" => "resolved", "id" => id} + ] + }) + |> json_response_and_validate_schema(:no_content) + + activity = Activity.get_by_id_with_user_actor(id) + assert activity.data["state"] == "resolved" + end end describe "GET /api/pleroma/admin/reports" do From 10249d1e42fd809ab75880c891f00ca1f3318f80 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 4 Jul 2023 03:03:41 +0200 Subject: [PATCH 68/82] CI: Let curl return non-0 on http failure code Otherwise it silently fails --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 148cbe4055..81fd3d6824 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -230,7 +230,7 @@ docs-deploy: before_script: - apk add curl script: - - curl -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline + - curl --fail-with-body -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline review_app: image: alpine:3.9 stage: deploy @@ -271,7 +271,7 @@ spec-deploy: before_script: - apk add curl script: - - curl -X POST -F"token=$API_DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline + - curl --fail-with-body -X POST -F"token=$API_DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline stop_review_app: From 8c3363a5e778899fe137273c2d188ebd3b9224fb Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 4 Jul 2023 03:23:32 +0200 Subject: [PATCH 69/82] CI: Use CI_JOB_TOKEN for cross-repo pipeline triggers --- .gitlab-ci.yml | 4 ++-- changelog.d/pipeline-triggers.skip | 0 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 changelog.d/pipeline-triggers.skip diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 81fd3d6824..cd05618529 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -230,7 +230,7 @@ docs-deploy: before_script: - apk add curl script: - - curl --fail-with-body -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline + - curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline review_app: image: alpine:3.9 stage: deploy @@ -271,7 +271,7 @@ spec-deploy: before_script: - apk add curl script: - - curl --fail-with-body -X POST -F"token=$API_DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline + - curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline stop_review_app: diff --git a/changelog.d/pipeline-triggers.skip b/changelog.d/pipeline-triggers.skip new file mode 100644 index 0000000000..e69de29bb2 From 3d79ceb23a3dc9630d38807cf6e8a62a56f29d3b Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 4 Jul 2023 03:34:51 +0200 Subject: [PATCH 70/82] Deprecate audio scrobbling --- changelog.d/deprecate-scrobbles.remove | 1 + docs/development/API/pleroma_api.md | 6 ++++++ .../web/api_spec/operations/pleroma_scrobble_operation.ex | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 changelog.d/deprecate-scrobbles.remove diff --git a/changelog.d/deprecate-scrobbles.remove b/changelog.d/deprecate-scrobbles.remove new file mode 100644 index 0000000000..c453a97849 --- /dev/null +++ b/changelog.d/deprecate-scrobbles.remove @@ -0,0 +1 @@ +Deprecate Pleroma's audio scrobbling diff --git a/docs/development/API/pleroma_api.md b/docs/development/API/pleroma_api.md index 47fcb7479b..bd0e07f9e2 100644 --- a/docs/development/API/pleroma_api.md +++ b/docs/development/API/pleroma_api.md @@ -577,6 +577,9 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa 404 if the pack does not exist ## `GET /api/v1/pleroma/accounts/:id/scrobbles` + +Audio scrobbling in Pleroma is **deprecated**. + ### Requests a list of current and recent Listen activities for an account * Method `GET` * Authentication: not required @@ -598,6 +601,9 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa ``` ## `POST /api/v1/pleroma/scrobble` + +Audio scrobbling in Pleroma is **deprecated**. + ### Creates a new Listen activity for an account * Method `POST` * Authentication: required diff --git a/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex index b6273bfcfd..ca40da930a 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex @@ -22,6 +22,7 @@ def create_operation do summary: "Creates a new Listen activity for an account", security: [%{"oAuth" => ["write"]}], operationId: "PleromaAPI.ScrobbleController.create", + deprecated: true, requestBody: request_body("Parameters", create_request(), requried: true), responses: %{ 200 => Operation.response("Scrobble", "application/json", scrobble()) @@ -34,6 +35,7 @@ def index_operation do tags: ["Scrobbles"], summary: "Requests a list of current and recent Listen activities for an account", operationId: "PleromaAPI.ScrobbleController.index", + deprecated: true, parameters: [ %Reference{"$ref": "#/components/parameters/accountIdOrNickname"} | pagination_params() ], From 0c3709173fe7905c3d7e9d542d3b1007d8f97042 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 4 Jul 2023 04:19:25 +0200 Subject: [PATCH 71/82] docs: Fix broken links --- changelog.d/gentoo_otp_hotfix.skip | 0 docs/installation/gentoo_en.md | 2 +- docs/installation/gentoo_otp_en.md | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 changelog.d/gentoo_otp_hotfix.skip diff --git a/changelog.d/gentoo_otp_hotfix.skip b/changelog.d/gentoo_otp_hotfix.skip new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/installation/gentoo_en.md b/docs/installation/gentoo_en.md index 273e21d4bb..87128d6f6b 100644 --- a/docs/installation/gentoo_en.md +++ b/docs/installation/gentoo_en.md @@ -2,7 +2,7 @@ {! backend/installation/otp_vs_from_source.include !} -This guide covers a manual from-source installation. To use the gentoo package, please check the [packaged installation guide for gentoo](./gentoo.en.md). +This guide covers a manual from-source installation. To use the gentoo package, please check the [packaged installation guide for gentoo](./gentoo_otp_en.md). ## Installation diff --git a/docs/installation/gentoo_otp_en.md b/docs/installation/gentoo_otp_en.md index 5dcfe0b7ba..76968eb389 100644 --- a/docs/installation/gentoo_otp_en.md +++ b/docs/installation/gentoo_otp_en.md @@ -65,7 +65,7 @@ The output from emerging postgresql should give you a command for initializing t ### Install media / graphics packages (optional) -See [Optional software packages needed for specific functionality](docs/installation/optional/media_graphics_packages.md) for details. +See [Optional software packages needed for specific functionality](optional/media_graphics_packages.md) for details. ```shell # emerge --ask media-video/ffmpeg media-gfx/imagemagick media-libs/exiftool From 28ff828caaada329283a37feb3940b543ef260a3 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 28 Feb 2023 10:40:24 -0500 Subject: [PATCH 72/82] Add emoji policy to remove emojis matching certain urls https://git.pleroma.social/pleroma/pleroma/-/issues/2775 --- config/config.exs | 6 + lib/pleroma/web/activity_pub/emoji_policy.ex | 158 ++++++++++++++++++ .../activity_pub/mrf/emoji_policy_test.exs | 123 ++++++++++++++ 3 files changed, 287 insertions(+) create mode 100644 lib/pleroma/web/activity_pub/emoji_policy.ex create mode 100644 test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs diff --git a/config/config.exs b/config/config.exs index a92ab574b0..ebcbf8b498 100644 --- a/config/config.exs +++ b/config/config.exs @@ -408,6 +408,12 @@ federated_timeline_removal: [], replace: [] +config :pleroma, :mrf_emoji, + remove_url: [], + remove_shortcode: [], + federated_timeline_removal_url: [], + federated_timeline_removal_shortcode: [] + config :pleroma, :mrf_hashtag, sensitive: ["nsfw"], reject: [], diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/emoji_policy.ex new file mode 100644 index 0000000000..747e720b6e --- /dev/null +++ b/lib/pleroma/web/activity_pub/emoji_policy.ex @@ -0,0 +1,158 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do + require Pleroma.Constants + + @moduledoc "Reject or force-unlisted emojis with certain URLs or names" + + @behaviour Pleroma.Web.ActivityPub.MRF.Policy + + defp config_remove_url do + Pleroma.Config.get([:mrf_emoji, :remove_url], []) + end + + @impl Pleroma.Web.ActivityPub.MRF.Policy + def filter(%{"type" => type, "object" => %{} = object} = message) + when type in ["Create", "Update"] do + with object <- process_remove(object, :url, config_remove_url()) do + {:ok, Map.put(message, "object", object)} + end + end + + @impl Pleroma.Web.ActivityPub.MRF.Policy + def filter(%{"type" => type} = object) when type in Pleroma.Constants.actor_types() do + with object <- process_remove(object, :url, config_remove_url()) do + {:ok, object} + end + end + + @impl Pleroma.Web.ActivityPub.MRF.Policy + def filter(message) do + {:ok, message} + end + + defp match_string?(string, pattern) when is_binary(pattern) do + string == pattern + end + + defp match_string?(string, %Regex{} = pattern) do + String.match?(string, pattern) + end + + defp match_any?(string, patterns) do + Enum.any?(patterns, &match_string?(string, &1)) + end + + defp process_remove(object, :url, patterns) do + processed_tag = + Enum.filter( + object["tag"], + fn + %{"type" => "Emoji", "icon" => %{"url" => url}} when is_binary(url) -> + not match_any?(url, patterns) + + _ -> + true + end + ) + + processed_emoji = + if object["emoji"] do + object["emoji"] + |> Enum.reduce(%{}, fn {name, url}, acc -> + if not match_any?(url, patterns) do + Map.put(acc, name, url) + else + acc + end + end) + else + nil + end + + if processed_emoji do + object + |> Map.put("tag", processed_tag) + |> Map.put("emoji", processed_emoji) + else + object + |> Map.put("tag", processed_tag) + end + end + + @impl Pleroma.Web.ActivityPub.MRF.Policy + def describe do + # This horror is needed to convert regex sigils to strings + mrf_emoji = + Pleroma.Config.get(:mrf_emoji, []) + |> Enum.map(fn {key, value} -> + {key, + Enum.map(value, fn + pattern -> + if not is_binary(pattern) do + inspect(pattern) + else + pattern + end + end)} + end) + |> Enum.into(%{}) + + {:ok, %{mrf_emoji: mrf_emoji}} + end + + @impl Pleroma.Web.ActivityPub.MRF.Policy + def config_description do + %{ + key: :mrf_emoji, + related_policy: "Pleroma.Web.ActivityPub.MRF.EmojiPolicy", + label: "MRF Emoji", + description: + "Reject or force-unlisted emojis whose URLs or names match a keyword or [Regex](https://hexdocs.pm/elixir/Regex.html).", + children: [ + %{ + key: :remove_url, + type: {:list, :string}, + description: """ + A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles. + + Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. + """, + suggestions: ["foo", ~r/foo/iu] + }, + %{ + key: :remove_shortcode, + type: {:list, :string}, + description: """ + A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles. + + Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. + """, + suggestions: ["foo", ~r/foo/iu] + }, + %{ + key: :federated_timeline_removal_url, + type: {:list, :string}, + description: """ + A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. + + Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. + """, + suggestions: ["foo", ~r/foo/iu] + }, + %{ + key: :federated_timeline_removal_shortcode, + type: {:list, :string}, + description: """ + A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. + + Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. + """, + suggestions: ["foo", ~r/foo/iu] + } + ] + } + end +end diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs new file mode 100644 index 0000000000..fe1fb338e2 --- /dev/null +++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs @@ -0,0 +1,123 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do + use Pleroma.DataCase + + alias Pleroma.Web.ActivityPub.MRF + alias Pleroma.Web.ActivityPub.MRF.EmojiPolicy + + setup do: clear_config(:mrf_emoji) + + setup do + clear_config([:mrf_emoji], %{ + remove_url: [], + remove_shortcode: [], + federated_timeline_removal_url: [], + federated_timeline_removal_shortcode: [] + }) + end + + @emoji_tags [ + %{ + "icon" => %{ + "type" => "Image", + "url" => "https://example.org/emoji/biribiri/mikoto_smile2.png" + }, + "id" => "https://example.org/emoji/biribiri/mikoto_smile2.png", + "name" => ":mikoto_smile2:", + "type" => "Emoji", + "updated" => "1970-01-01T00:00:00Z" + }, + %{ + "icon" => %{ + "type" => "Image", + "url" => "https://example.org/emoji/biribiri/mikoto_smile3.png" + }, + "id" => "https://example.org/emoji/biribiri/mikoto_smile3.png", + "name" => ":mikoto_smile3:", + "type" => "Emoji", + "updated" => "1970-01-01T00:00:00Z" + }, + %{ + "icon" => %{ + "type" => "Image", + "url" => "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png" + }, + "id" => "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png", + "name" => ":nekomimi_girl_emoji_007:", + "type" => "Emoji", + "updated" => "1970-01-01T00:00:00Z" + }, + %{ + "icon" => %{ + "type" => "Image", + "url" => "https://example.org/test.png" + }, + "id" => "https://example.org/test.png", + "name" => ":test:", + "type" => "Emoji", + "updated" => "1970-01-01T00:00:00Z" + } + ] + + @misc_tags [%{"type" => "Placeholder"}] + + @user_data %{ + "type" => "Person", + "id" => "https://example.org/placeholder", + "name" => "lol", + "tag" => @emoji_tags ++ @misc_tags + } + + @status_data %{ + "type" => "Create", + "object" => %{ + "type" => "Note", + "id" => "https://example.org/placeholder", + "content" => "lol", + "tag" => @emoji_tags ++ @misc_tags, + "emoji" => %{ + "mikoto_smile2" => "https://example.org/emoji/biribiri/mikoto_smile2.png", + "mikoto_smile3" => "https://example.org/emoji/biribiri/mikoto_smile3.png", + "nekomimi_girl_emoji_007" => + "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png", + "test" => "https://example.org/test.png" + } + } + } + + describe "remove_url" do + setup do + clear_config([:mrf_emoji, :remove_url], [ + "https://example.org/test.png", + ~r{/biribiri/mikoto_smile[23]\.png}, + "nekomimi_girl_emoji" + ]) + + :ok + end + + test "processes user" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @user_data) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + assert %{"tag" => ^expected_tags} = filtered + end + + test "processes status" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + expected_emoji = %{ + "nekomimi_girl_emoji_007" => + "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png" + } + + assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered + end + end +end From 80ce6482f6eb85f4c1d172811affc4a17d24985a Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 28 Feb 2023 10:51:56 -0500 Subject: [PATCH 73/82] EmojiPolicy: implement remove by shortcode --- lib/pleroma/web/activity_pub/emoji_policy.ex | 48 ++++++++++++++++--- .../activity_pub/mrf/emoji_policy_test.exs | 33 +++++++++++++ 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/emoji_policy.ex index 747e720b6e..346b646996 100644 --- a/lib/pleroma/web/activity_pub/emoji_policy.ex +++ b/lib/pleroma/web/activity_pub/emoji_policy.ex @@ -13,17 +13,23 @@ defp config_remove_url do Pleroma.Config.get([:mrf_emoji, :remove_url], []) end + defp config_remove_shortcode do + Pleroma.Config.get([:mrf_emoji, :remove_shortcode], []) + end + @impl Pleroma.Web.ActivityPub.MRF.Policy def filter(%{"type" => type, "object" => %{} = object} = message) when type in ["Create", "Update"] do - with object <- process_remove(object, :url, config_remove_url()) do + with object <- process_remove(object, :url, config_remove_url()), + object <- process_remove(object, :shortcode, config_remove_shortcode()) do {:ok, Map.put(message, "object", object)} end end @impl Pleroma.Web.ActivityPub.MRF.Policy def filter(%{"type" => type} = object) when type in Pleroma.Constants.actor_types() do - with object <- process_remove(object, :url, config_remove_url()) do + with object <- process_remove(object, :url, config_remove_url()), + object <- process_remove(object, :shortcode, config_remove_shortcode()) do {:ok, object} end end @@ -46,12 +52,42 @@ defp match_any?(string, patterns) do end defp process_remove(object, :url, patterns) do + process_remove_impl( + object, + fn + %{"icon" => %{"url" => url}} -> url + _ -> nil + end, + fn {_name, url} -> url end, + patterns + ) + end + + defp process_remove(object, :shortcode, patterns) do + process_remove_impl( + object, + fn + %{"name" => name} when is_binary(name) -> String.trim(name, ":") + _ -> nil + end, + fn {name, _url} -> name end, + patterns + ) + end + + defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do processed_tag = Enum.filter( object["tag"], fn - %{"type" => "Emoji", "icon" => %{"url" => url}} when is_binary(url) -> - not match_any?(url, patterns) + %{"type" => "Emoji"} = tag -> + str = extract_from_tag.(tag) + + if is_binary(str) do + not match_any?(str, patterns) + else + true + end _ -> true @@ -61,8 +97,8 @@ defp process_remove(object, :url, patterns) do processed_emoji = if object["emoji"] do object["emoji"] - |> Enum.reduce(%{}, fn {name, url}, acc -> - if not match_any?(url, patterns) do + |> Enum.reduce(%{}, fn {name, url} = emoji, acc -> + if not match_any?(extract_from_emoji.(emoji), patterns) do Map.put(acc, name, url) else acc diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs index fe1fb338e2..6511f6532e 100644 --- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs @@ -120,4 +120,37 @@ test "processes status" do assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered end end + + describe "remove_shortcode" do + setup do + clear_config([:mrf_emoji, :remove_shortcode], [ + "test", + ~r{mikoto_s}, + "nekomimi_girl_emoji" + ]) + + :ok + end + + test "processes user" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @user_data) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + assert %{"tag" => ^expected_tags} = filtered + end + + test "processes status" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + expected_emoji = %{ + "nekomimi_girl_emoji_007" => + "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png" + } + + assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered + end + end end From 7eb8abf7bb50e6bf4c6587ea308e1a52d944375a Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 28 Feb 2023 11:47:53 -0500 Subject: [PATCH 74/82] EmojiPolicy: Implement delist --- lib/pleroma/web/activity_pub/emoji_policy.ex | 117 ++++++++++-- .../activity_pub/mrf/emoji_policy_test.exs | 180 +++++++++++++++++- 2 files changed, 274 insertions(+), 23 deletions(-) diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/emoji_policy.ex index 346b646996..df1566ec32 100644 --- a/lib/pleroma/web/activity_pub/emoji_policy.ex +++ b/lib/pleroma/web/activity_pub/emoji_policy.ex @@ -5,6 +5,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do require Pleroma.Constants + alias Pleroma.Object.Updater + @moduledoc "Reject or force-unlisted emojis with certain URLs or names" @behaviour Pleroma.Web.ActivityPub.MRF.Policy @@ -17,12 +19,31 @@ defp config_remove_shortcode do Pleroma.Config.get([:mrf_emoji, :remove_shortcode], []) end + defp config_unlist_url do + Pleroma.Config.get([:mrf_emoji, :federated_timeline_removal_url], []) + end + + defp config_unlist_shortcode do + Pleroma.Config.get([:mrf_emoji, :federated_timeline_removal_shortcode], []) + end + + @impl Pleroma.Web.ActivityPub.MRF.Policy + def history_awareness, do: :manual + @impl Pleroma.Web.ActivityPub.MRF.Policy def filter(%{"type" => type, "object" => %{} = object} = message) when type in ["Create", "Update"] do - with object <- process_remove(object, :url, config_remove_url()), - object <- process_remove(object, :shortcode, config_remove_shortcode()) do - {:ok, Map.put(message, "object", object)} + with {:ok, object} <- + Updater.do_with_history(object, fn object -> + {:ok, process_remove(object, :url, config_remove_url())} + end), + {:ok, object} <- + Updater.do_with_history(object, fn object -> + {:ok, process_remove(object, :shortcode, config_remove_shortcode())} + end), + activity <- Map.put(message, "object", object), + activity <- maybe_delist(activity) do + {:ok, activity} end end @@ -51,28 +72,22 @@ defp match_any?(string, patterns) do Enum.any?(patterns, &match_string?(string, &1)) end + defp url_from_tag(%{"icon" => %{"url" => url}}), do: url + defp url_from_tag(_), do: nil + + defp url_from_emoji({_name, url}), do: url + + defp shortcode_from_tag(%{"name" => name}) when is_binary(name), do: String.trim(name, ":") + defp shortcode_from_tag(_), do: nil + + defp shortcode_from_emoji({name, _url}), do: name + defp process_remove(object, :url, patterns) do - process_remove_impl( - object, - fn - %{"icon" => %{"url" => url}} -> url - _ -> nil - end, - fn {_name, url} -> url end, - patterns - ) + process_remove_impl(object, &url_from_tag/1, &url_from_emoji/1, patterns) end defp process_remove(object, :shortcode, patterns) do - process_remove_impl( - object, - fn - %{"name" => name} when is_binary(name) -> String.trim(name, ":") - _ -> nil - end, - fn {name, _url} -> name end, - patterns - ) + process_remove_impl(object, &shortcode_from_tag/1, &shortcode_from_emoji/1, patterns) end defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do @@ -118,6 +133,66 @@ defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) end end + defp maybe_delist(%{"object" => object, "to" => to, "type" => "Create"} = activity) do + check = fn object -> + if any_emoji_match?(object, &url_from_tag/1, &url_from_emoji/1, config_unlist_url()) or + any_emoji_match?( + object, + &shortcode_from_tag/1, + &shortcode_from_emoji/1, + config_unlist_shortcode() + ) do + {:should_delist, nil} + else + {:ok, %{}} + end + end + + should_delist? = fn object -> + with {:ok, _} <- Pleroma.Object.Updater.do_with_history(object, check) do + false + else + _ -> true + end + end + + if Pleroma.Constants.as_public() in to and should_delist?.(object) do + to = List.delete(to, Pleroma.Constants.as_public()) + cc = [Pleroma.Constants.as_public() | activity["cc"] || []] + + activity + |> Map.put("to", to) + |> Map.put("cc", cc) + else + activity + end + end + + defp maybe_delist(activity), do: activity + + defp any_emoji_match?(object, extract_from_tag, extract_from_emoji, patterns) do + Kernel.||( + Enum.any?( + object["tag"], + fn + %{"type" => "Emoji"} = tag -> + str = extract_from_tag.(tag) + + if is_binary(str) do + match_any?(str, patterns) + else + false + end + + _ -> + false + end + ), + object["emoji"] + |> Enum.any?(fn emoji -> match_any?(extract_from_emoji.(emoji), patterns) end) + ) + end + @impl Pleroma.Web.ActivityPub.MRF.Policy def describe do # This horror is needed to convert regex sigils to strings diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs index 6511f6532e..1e1b5c5787 100644 --- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs @@ -5,6 +5,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do use Pleroma.DataCase + require Pleroma.Constants + alias Pleroma.Web.ActivityPub.MRF alias Pleroma.Web.ActivityPub.MRF.EmojiPolicy @@ -84,8 +86,27 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do "nekomimi_girl_emoji_007" => "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png", "test" => "https://example.org/test.png" - } - } + }, + "to" => ["https://example.org/self", Pleroma.Constants.as_public()], + "cc" => ["https://example.org/someone"] + }, + "to" => ["https://example.org/self", Pleroma.Constants.as_public()], + "cc" => ["https://example.org/someone"] + } + + @status_data_with_history %{ + "type" => "Create", + "object" => + @status_data["object"] + |> Map.merge(%{ + "formerRepresentations" => %{ + "type" => "OrderedCollection", + "orderedItems" => [@status_data["object"] |> Map.put("content", "older")], + "totalItems" => 1 + } + }), + "to" => ["https://example.org/self", Pleroma.Constants.as_public()], + "cc" => ["https://example.org/someone"] } describe "remove_url" do @@ -119,6 +140,49 @@ test "processes status" do assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered end + + test "processes status with history" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data_with_history) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + expected_emoji = %{ + "nekomimi_girl_emoji_007" => + "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png" + } + + assert %{ + "object" => %{ + "tag" => ^expected_tags, + "emoji" => ^expected_emoji, + "formerRepresentations" => %{"orderedItems" => [item]} + } + } = filtered + + assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item + end + + test "processes updates" do + {:ok, filtered} = + MRF.filter_one(EmojiPolicy, @status_data_with_history |> Map.put("type", "Update")) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + expected_emoji = %{ + "nekomimi_girl_emoji_007" => + "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png" + } + + assert %{ + "object" => %{ + "tag" => ^expected_tags, + "emoji" => ^expected_emoji, + "formerRepresentations" => %{"orderedItems" => [item]} + } + } = filtered + + assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item + end end describe "remove_shortcode" do @@ -152,5 +216,117 @@ test "processes status" do assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered end + + test "processes status with history" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data_with_history) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + expected_emoji = %{ + "nekomimi_girl_emoji_007" => + "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png" + } + + assert %{ + "object" => %{ + "tag" => ^expected_tags, + "emoji" => ^expected_emoji, + "formerRepresentations" => %{"orderedItems" => [item]} + } + } = filtered + + assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item + end + + test "processes updates" do + {:ok, filtered} = + MRF.filter_one(EmojiPolicy, @status_data_with_history |> Map.put("type", "Update")) + + expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags + + expected_emoji = %{ + "nekomimi_girl_emoji_007" => + "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png" + } + + assert %{ + "object" => %{ + "tag" => ^expected_tags, + "emoji" => ^expected_emoji, + "formerRepresentations" => %{"orderedItems" => [item]} + } + } = filtered + + assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item + end + end + + describe "federated_timeline_removal_url" do + setup do + clear_config([:mrf_emoji, :federated_timeline_removal_url], [ + "https://example.org/test.png", + ~r{/biribiri/mikoto_smile[23]\.png}, + "nekomimi_girl_emoji" + ]) + + :ok + end + + test "processes status" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data) + + expected_tags = @status_data["object"]["tag"] + expected_emoji = @status_data["object"]["emoji"] + + expected_to = ["https://example.org/self"] + expected_cc = [Pleroma.Constants.as_public(), "https://example.org/someone"] + + assert %{ + "to" => ^expected_to, + "cc" => ^expected_cc, + "object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} + } = filtered + end + + test "ignore updates" do + {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data |> Map.put("type", "Update")) + + expected_tags = @status_data["object"]["tag"] + expected_emoji = @status_data["object"]["emoji"] + + expected_to = ["https://example.org/self", Pleroma.Constants.as_public()] + expected_cc = ["https://example.org/someone"] + + assert %{ + "to" => ^expected_to, + "cc" => ^expected_cc, + "object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} + } = filtered + end + + test "processes status with history" do + status = + @status_data_with_history + |> put_in(["object", "tag"], @misc_tags) + |> put_in(["object", "emoji"], %{}) + + {:ok, filtered} = MRF.filter_one(EmojiPolicy, status) + + expected_tags = @status_data["object"]["tag"] + expected_emoji = @status_data["object"]["emoji"] + + expected_to = ["https://example.org/self"] + expected_cc = [Pleroma.Constants.as_public(), "https://example.org/someone"] + + assert %{ + "to" => ^expected_to, + "cc" => ^expected_cc, + "object" => %{ + "formerRepresentations" => %{ + "orderedItems" => [%{"tag" => ^expected_tags, "emoji" => ^expected_emoji}] + } + } + } = filtered + end end end From f50422c3802cd2316cfa6312d5a88c018c722843 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 28 Feb 2023 11:48:34 -0500 Subject: [PATCH 75/82] Move emoji_policy.ex to the right place --- lib/pleroma/web/activity_pub/{ => mrf}/emoji_policy.ex | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename lib/pleroma/web/activity_pub/{ => mrf}/emoji_policy.ex (100%) diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex similarity index 100% rename from lib/pleroma/web/activity_pub/emoji_policy.ex rename to lib/pleroma/web/activity_pub/mrf/emoji_policy.ex From 18a8378beb01a7ee93afcddf16e2699c5fe6d35a Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 28 Feb 2023 12:05:54 -0500 Subject: [PATCH 76/82] Update config cheatsheet --- docs/configuration/cheatsheet.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 1e49a79d0e..696d10e74c 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -261,6 +261,11 @@ Notes: * `follower_nickname`: The name of the bot account to use for following newly discovered users. Using `followbot` or similar is strongly suggested. +#### :mrf_emoji +* `remove_url`: A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). +* `remove_shortcode`: A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). +* `federated_timeline_removal_url`: A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). +* `federated_timeline_removal_shortcode`: A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). ### :activitypub * `unfollow_blocked`: Whether blocks result in people getting unfollowed From 20d193c91da587372c618c53020a1f90eff20a7b Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 28 Feb 2023 12:14:48 -0500 Subject: [PATCH 77/82] Improve config examples for EmojiPolicy --- lib/pleroma/web/activity_pub/mrf/emoji_policy.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex index df1566ec32..9a2e8eaded 100644 --- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex @@ -231,7 +231,7 @@ def config_description do Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. """, - suggestions: ["foo", ~r/foo/iu] + suggestions: ["https://example.org/foo.png", ~r/example.org\/foo/iu] }, %{ key: :remove_shortcode, @@ -251,7 +251,7 @@ def config_description do Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. """, - suggestions: ["foo", ~r/foo/iu] + suggestions: ["https://example.org/foo.png", ~r/example.org\/foo/iu] }, %{ key: :federated_timeline_removal_shortcode, From ef8a6c539a98633d1a78fa42379952b93f847309 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 13 Jun 2023 14:53:20 -0400 Subject: [PATCH 78/82] Make EmojiPolicy aware of custom emoji reactions --- docs/configuration/cheatsheet.md | 4 +- .../web/activity_pub/mrf/emoji_policy.ex | 33 +++++++++---- .../activity_pub/mrf/emoji_policy_test.exs | 46 +++++++++++++++++++ 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 696d10e74c..f43cde1144 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -262,8 +262,8 @@ Notes: * `follower_nickname`: The name of the bot account to use for following newly discovered users. Using `followbot` or similar is strongly suggested. #### :mrf_emoji -* `remove_url`: A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). -* `remove_shortcode`: A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). +* `remove_url`: A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). +* `remove_shortcode`: A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). * `federated_timeline_removal_url`: A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). * `federated_timeline_removal_shortcode`: A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html). diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex index 9a2e8eaded..13201ac550 100644 --- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex @@ -55,6 +55,17 @@ def filter(%{"type" => type} = object) when type in Pleroma.Constants.actor_type end end + @impl Pleroma.Web.ActivityPub.MRF.Policy + def filter(%{"type" => "EmojiReact"} = object) do + with {:ok, _} <- + matched_emoji_checker(config_remove_url(), config_remove_shortcode()).(object) do + {:ok, object} + else + _ -> + {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} + end + end + @impl Pleroma.Web.ActivityPub.MRF.Policy def filter(message) do {:ok, message} @@ -133,20 +144,24 @@ defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) end end - defp maybe_delist(%{"object" => object, "to" => to, "type" => "Create"} = activity) do - check = fn object -> - if any_emoji_match?(object, &url_from_tag/1, &url_from_emoji/1, config_unlist_url()) or + defp matched_emoji_checker(urls, shortcodes) do + fn object -> + if any_emoji_match?(object, &url_from_tag/1, &url_from_emoji/1, urls) or any_emoji_match?( object, &shortcode_from_tag/1, &shortcode_from_emoji/1, - config_unlist_shortcode() + shortcodes ) do - {:should_delist, nil} + {:matched, nil} else {:ok, %{}} end end + end + + defp maybe_delist(%{"object" => object, "to" => to, "type" => "Create"} = activity) do + check = matched_emoji_checker(config_unlist_url(), config_unlist_shortcode()) should_delist? = fn object -> with {:ok, _} <- Pleroma.Object.Updater.do_with_history(object, check) do @@ -173,7 +188,7 @@ defp maybe_delist(activity), do: activity defp any_emoji_match?(object, extract_from_tag, extract_from_emoji, patterns) do Kernel.||( Enum.any?( - object["tag"], + object["tag"] || [], fn %{"type" => "Emoji"} = tag -> str = extract_from_tag.(tag) @@ -188,7 +203,7 @@ defp any_emoji_match?(object, extract_from_tag, extract_from_emoji, patterns) do false end ), - object["emoji"] + (object["emoji"] || []) |> Enum.any?(fn emoji -> match_any?(extract_from_emoji.(emoji), patterns) end) ) end @@ -227,7 +242,7 @@ def config_description do key: :remove_url, type: {:list, :string}, description: """ - A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles. + A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles. Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. """, @@ -237,7 +252,7 @@ def config_description do key: :remove_shortcode, type: {:list, :string}, description: """ - A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles. + A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles. Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`. """, diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs index 1e1b5c5787..ae4c44f1c3 100644 --- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs @@ -109,6 +109,30 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do "cc" => ["https://example.org/someone"] } + @emoji_react_data %{ + "type" => "EmojiReact", + "tag" => [@emoji_tags |> Enum.at(3)], + "object" => "https://example.org/someobject", + "to" => ["https://example.org/self"], + "cc" => ["https://example.org/someone"] + } + + @emoji_react_data_matching_regex %{ + "type" => "EmojiReact", + "tag" => [@emoji_tags |> Enum.at(1)], + "object" => "https://example.org/someobject", + "to" => ["https://example.org/self"], + "cc" => ["https://example.org/someone"] + } + + @emoji_react_data_matching_nothing %{ + "type" => "EmojiReact", + "tag" => [@emoji_tags |> Enum.at(2)], + "object" => "https://example.org/someobject", + "to" => ["https://example.org/self"], + "cc" => ["https://example.org/someone"] + } + describe "remove_url" do setup do clear_config([:mrf_emoji, :remove_url], [ @@ -183,6 +207,17 @@ test "processes updates" do assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item end + + test "processes EmojiReact" do + assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} == + MRF.filter_one(EmojiPolicy, @emoji_react_data) + + assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} == + MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_regex) + + assert {:ok, @emoji_react_data_matching_nothing} == + MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing) + end end describe "remove_shortcode" do @@ -259,6 +294,17 @@ test "processes updates" do assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item end + + test "processes EmojiReact" do + assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} == + MRF.filter_one(EmojiPolicy, @emoji_react_data) + + assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} == + MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_regex) + + assert {:ok, @emoji_react_data_matching_nothing} == + MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing) + end end describe "federated_timeline_removal_url" do From d670dbdbd3e675b7d29c97e8bfd5301dcf3c9de0 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 13 Jun 2023 14:55:27 -0400 Subject: [PATCH 79/82] Test that unicode emoji reactions are not affected --- .../web/activity_pub/mrf/emoji_policy_test.exs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs index ae4c44f1c3..121ee1ea04 100644 --- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs @@ -133,6 +133,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do "cc" => ["https://example.org/someone"] } + @emoji_react_data_unicode %{ + "type" => "EmojiReact", + "content" => "😍", + "object" => "https://example.org/someobject", + "to" => ["https://example.org/self"], + "cc" => ["https://example.org/someone"] + } + describe "remove_url" do setup do clear_config([:mrf_emoji, :remove_url], [ @@ -217,6 +225,9 @@ test "processes EmojiReact" do assert {:ok, @emoji_react_data_matching_nothing} == MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing) + + assert {:ok, @emoji_react_data_unicode} == + MRF.filter_one(EmojiPolicy, @emoji_react_data_unicode) end end @@ -304,6 +315,9 @@ test "processes EmojiReact" do assert {:ok, @emoji_react_data_matching_nothing} == MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing) + + assert {:ok, @emoji_react_data_unicode} == + MRF.filter_one(EmojiPolicy, @emoji_react_data_unicode) end end From 0d914e17bedb49a5efb8c0268d4a6df2e7ffdf96 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 13 Jun 2023 14:56:16 -0400 Subject: [PATCH 80/82] Add changelog --- changelog.d/emoji-policy.add | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/emoji-policy.add diff --git a/changelog.d/emoji-policy.add b/changelog.d/emoji-policy.add new file mode 100644 index 0000000000..45510c4f6b --- /dev/null +++ b/changelog.d/emoji-policy.add @@ -0,0 +1 @@ +Implement MRF policy to reject or delist according to emojis From ba3aa4f86da77ece8ac472c40da180ab1921c304 Mon Sep 17 00:00:00 2001 From: tusooa Date: Tue, 20 Jun 2023 10:14:01 -0400 Subject: [PATCH 81/82] Fix edge cases --- lib/pleroma/constants.ex | 12 +++ .../web/activity_pub/mrf/emoji_policy.ex | 79 ++++++++++--------- .../activity_pub/mrf/emoji_policy_test.exs | 33 ++++++++ 3 files changed, 87 insertions(+), 37 deletions(-) diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex index cfb4052180..7b4fd03b69 100644 --- a/lib/pleroma/constants.ex +++ b/lib/pleroma/constants.ex @@ -42,6 +42,18 @@ defmodule Pleroma.Constants do ] ) + const(status_object_types, + do: [ + "Note", + "Question", + "Audio", + "Video", + "Event", + "Article", + "Page" + ] + ) + const(updatable_object_types, do: [ "Note", diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex index 13201ac550..95d6a6d434 100644 --- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex @@ -31,8 +31,8 @@ defp config_unlist_shortcode do def history_awareness, do: :manual @impl Pleroma.Web.ActivityPub.MRF.Policy - def filter(%{"type" => type, "object" => %{} = object} = message) - when type in ["Create", "Update"] do + def filter(%{"type" => type, "object" => %{"type" => objtype} = object} = message) + when type in ["Create", "Update"] and objtype in Pleroma.Constants.status_object_types() do with {:ok, object} <- Updater.do_with_history(object, fn object -> {:ok, process_remove(object, :url, config_remove_url())} @@ -102,46 +102,51 @@ defp process_remove(object, :shortcode, patterns) do end defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do - processed_tag = - Enum.filter( - object["tag"], - fn - %{"type" => "Emoji"} = tag -> - str = extract_from_tag.(tag) + object = + if object["tag"] do + Map.put( + object, + "tag", + Enum.filter( + object["tag"], + fn + %{"type" => "Emoji"} = tag -> + str = extract_from_tag.(tag) - if is_binary(str) do - not match_any?(str, patterns) - else - true + if is_binary(str) do + not match_any?(str, patterns) + else + true + end + + _ -> + true end - - _ -> - true - end - ) - - processed_emoji = - if object["emoji"] do - object["emoji"] - |> Enum.reduce(%{}, fn {name, url} = emoji, acc -> - if not match_any?(extract_from_emoji.(emoji), patterns) do - Map.put(acc, name, url) - else - acc - end - end) + ) + ) else - nil + object end - if processed_emoji do - object - |> Map.put("tag", processed_tag) - |> Map.put("emoji", processed_emoji) - else - object - |> Map.put("tag", processed_tag) - end + object = + if object["emoji"] do + Map.put( + object, + "emoji", + object["emoji"] + |> Enum.reduce(%{}, fn {name, url} = emoji, acc -> + if not match_any?(extract_from_emoji.(emoji), patterns) do + Map.put(acc, name, url) + else + acc + end + end) + ) + else + object + end + + object end defp matched_emoji_checker(urls, shortcodes) do diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs index 121ee1ea04..7350800f0c 100644 --- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs +++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs @@ -389,4 +389,37 @@ test "processes status with history" do } = filtered end end + + describe "edge cases" do + setup do + clear_config([:mrf_emoji, :remove_url], [ + "https://example.org/test.png", + ~r{/biribiri/mikoto_smile[23]\.png}, + "nekomimi_girl_emoji" + ]) + + :ok + end + + test "non-statuses" do + answer = @status_data |> put_in(["object", "type"], "Answer") + {:ok, filtered} = MRF.filter_one(EmojiPolicy, answer) + + assert filtered == answer + end + + test "without tag" do + status = @status_data |> Map.put("object", Map.drop(@status_data["object"], ["tag"])) + {:ok, filtered} = MRF.filter_one(EmojiPolicy, status) + + refute Map.has_key?(filtered["object"], "tag") + end + + test "without emoji" do + status = @status_data |> Map.put("object", Map.drop(@status_data["object"], ["emoji"])) + {:ok, filtered} = MRF.filter_one(EmojiPolicy, status) + + refute Map.has_key?(filtered["object"], "emoji") + end + end end From 1459d64508b10725231d8f4256fbc68166c1b8ae Mon Sep 17 00:00:00 2001 From: tusooa Date: Fri, 7 Jul 2023 07:09:35 -0400 Subject: [PATCH 82/82] Make regex-to-string descriptor reusable --- .../web/activity_pub/mrf/emoji_policy.ex | 12 ++---------- .../web/activity_pub/mrf/keyword_policy.ex | 16 ++++------------ lib/pleroma/web/activity_pub/mrf/utils.ex | 15 +++++++++++++++ .../web/activity_pub/mrf/utils_test.exs | 19 +++++++++++++++++++ 4 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 lib/pleroma/web/activity_pub/mrf/utils.ex create mode 100644 test/pleroma/web/activity_pub/mrf/utils_test.exs diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex index 95d6a6d434..f884962b92 100644 --- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do require Pleroma.Constants alias Pleroma.Object.Updater + alias Pleroma.Web.ActivityPub.MRF.Utils @moduledoc "Reject or force-unlisted emojis with certain URLs or names" @@ -215,19 +216,10 @@ defp any_emoji_match?(object, extract_from_tag, extract_from_emoji, patterns) do @impl Pleroma.Web.ActivityPub.MRF.Policy def describe do - # This horror is needed to convert regex sigils to strings mrf_emoji = Pleroma.Config.get(:mrf_emoji, []) |> Enum.map(fn {key, value} -> - {key, - Enum.map(value, fn - pattern -> - if not is_binary(pattern) do - inspect(pattern) - else - pattern - end - end)} + {key, Enum.map(value, &Utils.describe_regex_or_string/1)} end) |> Enum.into(%{}) diff --git a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex index 687ec6c2fe..874fe9ab96 100644 --- a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex @@ -5,6 +5,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do require Pleroma.Constants + alias Pleroma.Web.ActivityPub.MRF.Utils + @moduledoc "Reject or Word-Replace messages with a keyword or regex" @behaviour Pleroma.Web.ActivityPub.MRF.Policy @@ -128,7 +130,6 @@ def filter(message), do: {:ok, message} @impl true def describe do - # This horror is needed to convert regex sigils to strings mrf_keyword = Pleroma.Config.get(:mrf_keyword, []) |> Enum.map(fn {key, value} -> @@ -136,21 +137,12 @@ def describe do Enum.map(value, fn {pattern, replacement} -> %{ - "pattern" => - if not is_binary(pattern) do - inspect(pattern) - else - pattern - end, + "pattern" => Utils.describe_regex_or_string(pattern), "replacement" => replacement } pattern -> - if not is_binary(pattern) do - inspect(pattern) - else - pattern - end + Utils.describe_regex_or_string(pattern) end)} end) |> Enum.into(%{}) diff --git a/lib/pleroma/web/activity_pub/mrf/utils.ex b/lib/pleroma/web/activity_pub/mrf/utils.ex new file mode 100644 index 0000000000..f2dc9eea91 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/utils.ex @@ -0,0 +1,15 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.Utils do + @spec describe_regex_or_string(String.t() | Regex.t()) :: String.t() + def describe_regex_or_string(pattern) do + # This horror is needed to convert regex sigils to strings + if not is_binary(pattern) do + inspect(pattern) + else + pattern + end + end +end diff --git a/test/pleroma/web/activity_pub/mrf/utils_test.exs b/test/pleroma/web/activity_pub/mrf/utils_test.exs new file mode 100644 index 0000000000..3bbc2cfd3e --- /dev/null +++ b/test/pleroma/web/activity_pub/mrf/utils_test.exs @@ -0,0 +1,19 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2023 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.UtilsTest do + use Pleroma.DataCase, async: true + + alias Pleroma.Web.ActivityPub.MRF.Utils + + describe "describe_regex_or_string/1" do + test "describes regex" do + assert "~r/foo/i" == Utils.describe_regex_or_string(~r/foo/i) + end + + test "returns string as-is" do + assert "foo" == Utils.describe_regex_or_string("foo") + end + end +end