\n"
From 91d9d750c021044b1c7c9a6c09255fd28dd084d5 Mon Sep 17 00:00:00 2001
From: Weblate
Date: Mon, 22 Apr 2024 23:54:58 +0000
Subject: [PATCH 070/153] Update translation files
Updated by "Squash Git commits" hook in Weblate.
Translation: Pleroma fe/Akkoma Backend (Static pages)
Translate-URL: http://translate.akkoma.dev/projects/akkoma/akkoma-backend-static-pages/
---
priv/gettext/ca/LC_MESSAGES/errors.po | 32 +-
.../pt/LC_MESSAGES/config_descriptions.po | 6449 +++++++++++++++++
priv/gettext/pt/LC_MESSAGES/errors.po | 657 ++
priv/gettext/pt/LC_MESSAGES/posix_errors.po | 163 +
4 files changed, 7286 insertions(+), 15 deletions(-)
create mode 100644 priv/gettext/pt/LC_MESSAGES/config_descriptions.po
create mode 100644 priv/gettext/pt/LC_MESSAGES/errors.po
create mode 100644 priv/gettext/pt/LC_MESSAGES/posix_errors.po
diff --git a/priv/gettext/ca/LC_MESSAGES/errors.po b/priv/gettext/ca/LC_MESSAGES/errors.po
index 098635493..c92edc093 100644
--- a/priv/gettext/ca/LC_MESSAGES/errors.po
+++ b/priv/gettext/ca/LC_MESSAGES/errors.po
@@ -3,14 +3,16 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-29 11:37+0000\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Automatically generated\n"
-"Language-Team: none\n"
+"PO-Revision-Date: 2024-04-13 22:55+0000\n"
+"Last-Translator: fadelkon \n"
+"Language-Team: Catalan \n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Translate Toolkit 3.7.1\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.18.2\n"
# # This file is a PO Template file.
# #
@@ -610,46 +612,46 @@ msgstr "El teu compte espera aprovació."
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:262
#, elixir-autogen, elixir-format
msgid "File is too large"
-msgstr ""
+msgstr "L'arxiu és massa gran"
#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:37
#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:48
#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:59
-#, elixir-autogen, elixir-format, fuzzy
+#, elixir-autogen, elixir-format
msgid "Hashtag not found"
-msgstr "Llista no trobada"
+msgstr "No s'ha trobat l'etiqueta"
#: lib/pleroma/web/common_api/activity_draft.ex:144
#, elixir-autogen, elixir-format
msgid "Invalid language"
-msgstr ""
+msgstr "Llengua incompatible"
#: lib/pleroma/web/o_auth/o_auth_controller.ex:218
-#, elixir-autogen, elixir-format, fuzzy
+#, elixir-autogen, elixir-format
msgid "This action is outside of authorized scopes"
msgstr "Aquesta acció és fora dels àmbits autoritzats"
#: lib/pleroma/web/common_api/activity_draft.ex:129
#, elixir-autogen, elixir-format
msgid "You can only quote public or unlisted statuses"
-msgstr ""
+msgstr "Només pots citar publicacions desllistades o públiques"
#: lib/pleroma/web/common_api/activity_draft.ex:126
#, elixir-autogen, elixir-format
msgid "You can't quote a status that doesn't exist"
-msgstr ""
+msgstr "No pots citar una publicació que no existeix"
#: lib/pleroma/web/embed_controller.ex:35
#, elixir-autogen, elixir-format
msgid "Federated posts cannot be embedded"
-msgstr ""
+msgstr "No es poden incrustar publicacions federades"
#: lib/pleroma/web/embed_controller.ex:38
#, elixir-autogen, elixir-format
msgid "Not authorized to view this post"
-msgstr ""
+msgstr "No tens permís per veure aquesta publicació"
#: lib/pleroma/web/embed_controller.ex:32
-#, elixir-autogen, elixir-format, fuzzy
+#, elixir-autogen, elixir-format
msgid "Post not found"
-msgstr "Llista no trobada"
+msgstr "No s'ha trobat la publicació"
diff --git a/priv/gettext/pt/LC_MESSAGES/config_descriptions.po b/priv/gettext/pt/LC_MESSAGES/config_descriptions.po
new file mode 100644
index 000000000..f4cca250a
--- /dev/null
+++ b/priv/gettext/pt/LC_MESSAGES/config_descriptions.po
@@ -0,0 +1,6449 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-03-19 01:09+0000\n"
+"PO-Revision-Date: 2024-03-21 02:39+0000\n"
+"Last-Translator: Jammer Lammer \n"
+"Language-Team: Portuguese \n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.18.2\n"
+
+## This file is a PO Template file.
+##
+## "msgid"s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run "mix gettext.extract" to bring this file up to
+## date. Leave "msgstr"s empty as changing them here has no
+## effect: edit them in PO (.po) files instead.
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :logger"
+msgid "Logger-related settings"
+msgstr "Configurações relacionadas ao registrador (logger)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :mime"
+msgid "Mime Types settings"
+msgstr "Configurações dos Tipos Mime"
+
+#: 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 ""
+"Permite configurar um token que pode ser usado para autenticar requisições "
+"com privilégios de administrador sem um token de usuário comum. Anexe um "
+"parâmetro `admin_token`na requisição para utilizá-la. (Por favor, considere "
+"usar um autenticação HTTP básica ou uma autenticação OAuth se possível)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma"
+msgid "Authenticator"
+msgstr "Autenticador"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config label at :cors_plug"
+msgid "CORS plug config"
+msgstr "configuração do plug CORS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config label at :logger"
+msgid "Logger"
+msgstr "Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config label at :mime"
+msgid "Mime Types"
+msgstr "Tipos Mime"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config label at :pleroma"
+msgid "Pleroma Admin Token"
+msgstr "Token de Administrador Akkoma"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config label at :pleroma"
+msgid "Pleroma Authenticator"
+msgstr "Autenticador Akkoma"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :logger-:console"
+msgid "Console logger settings"
+msgstr "Configurações do console do logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :logger-:ex_syslogger"
+msgid "ExSyslogger-related settings"
+msgstr "Configurações relacionadas ao ExSyslogger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:activitypub"
+msgid "ActivityPub-related settings"
+msgstr "Configurações relacionadas ao ActivityPub"
+
+#: 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 ""
+"Essa seção configura recursos que podem ser usados com vários frontends. No "
+"momento a única opção está relacionada a mascotes do frontend do Mastodon"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:auth"
+msgid "Authentication / authorization settings"
+msgstr "Autenticação / configurações de autorização"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:email_notifications"
+msgid "Email notifications settings"
+msgstr "Configurações de notificação por email"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:features"
+msgid "Customizable features"
+msgstr "Recursos customizáveis"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:feed"
+msgid "Configure feed rendering"
+msgstr "Configurar renderização do feed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:frontends"
+msgid "Installed frontends management"
+msgstr "Gerenciador de frontends instalados"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:http"
+msgid "HTTP settings"
+msgstr "Configurações do HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:http_security"
+msgid "HTTP security settings"
+msgstr "Configurações de segurança do HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:instance"
+msgid "Instance-related settings"
+msgstr "Configurações relacionadas à instância"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:instances_favicons"
+msgid "Control favicons for instances"
+msgstr "Controle de favicons por instâncias"
+
+#: 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 ""
+"Use LDAP para autenticação de usuários. Quando um usuário inicia uma sessão "
+"em uma instância do Akkoma, o nome e a senha serão verificados ao tentar se "
+"autenticar (ligar) a um servidor LDAP. Se um usuário existe no diretório "
+"LDAP, mas ainda não há uma conta com o mesmo nome na instância do Akkoma, "
+"então uma nova conta Akkoma será criada com o mesmo nome do usuário no "
+"servidor LDAP."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:majic_pool"
+msgid "Majic/libmagic configuration"
+msgstr "Configurações do majic/libmagic"
+
+#: 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 ""
+"Esse seção descreve valores específicos da instância do manifesto PWA. No "
+"momento essa opção refere-se apenas ao MastoFE."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Proxy de pré-visualização de mídia."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Proxy de Mídia"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:modules"
+msgid "Custom Runtime Modules"
+msgstr "Módulos Customizados de tempo de execução"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
+msgctxt "config description at :pleroma-:mrf"
+msgid "General MRF settings"
+msgstr "Configurações gerais do MRF"
+
+#: 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 "Adiciona automaticamente validade para todas as atividades locais"
+
+#: 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 "Automaticamente segue contas recentemente descobertas."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Reject, TWKN-remove or Set-Sensitive messsages with specific hashtags ("
+"without the leading #)\n"
+"\n"
+"Note: This MRF Policy is always enabled, if you want to disable it you have "
+"to set empty lists.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hellthread"
+msgid "Block messages with excessive user mentions"
+msgstr "Block messages with excessive user mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Reject or Word-Replace messages matching a keyword or [Regex](https://hexdocs"
+".pm/elixir/Regex.html)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention"
+msgid "Block messages which mention a specific user"
+msgstr "Block messages which mention a specific user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_normalize_markup"
+msgid "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+msgstr "MRF NormalizeMarkup settings. Scrub configured hypertext markup."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age"
+msgid "Rejects or delists posts based on their timestamp deviance from your server's clock."
+msgstr ""
+"Rejects or delists posts based on their timestamp deviance from your "
+"server's clock."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic"
+msgid "RejectNonPublic drops posts with non-public visibility settings."
+msgstr "RejectNonPublic drops posts with non-public visibility settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple"
+msgid "Simple ingress policies"
+msgstr "Simple ingress policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji"
+msgid "Steals emojis from selected instances when it sees them."
+msgstr "Steals emojis from selected instances when it sees them."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary"
+msgid "Filter messages which belong to certain activity vocabularies"
+msgstr "Filter messages which belong to certain activity vocabularies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2"
+msgid "Configure OAuth 2 provider capabilities"
+msgstr "Configure OAuth 2 provider capabilities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:populate_hashtags_table"
+msgid "`populate_hashtags_table` background migration settings"
+msgstr "`populate_hashtags_table` background migration settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit"
+msgid "Rate limit settings. This is an advanced feature enabled only for :authentication by default."
+msgstr ""
+"Rate limit settings. This is an advanced feature enabled only for :"
+"authentication by default."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media"
+msgid "If enabled the instance will parse metadata from attached links to generate link previews"
+msgstr ""
+"If enabled the instance will parse metadata from attached links to generate "
+"link previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:static_fe"
+msgid "Render profiles and posts using server-generated HTML that is viewable without using JavaScript"
+msgstr ""
+"Render profiles and posts using server-generated HTML that is viewable "
+"without using JavaScript"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer"
+msgid "Settings for notifications streamer"
+msgstr "Settings for notifications streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes"
+msgid "URI schemes related settings"
+msgstr "URI schemes related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The expiration time for the web responses cache. Values should be in "
+"milliseconds or `nil` to disable expiration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome"
+msgid "Welcome messages settings"
+msgstr "Welcome messages settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:workers"
+msgid "Includes custom worker options not interpretable directly by `Oban`"
+msgstr "Includes custom worker options not interpretable directly by `Oban`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter"
+msgid "Limits configuration for background tasks."
+msgstr "Limits configuration for background tasks."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban"
+msgid "[Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration."
+msgstr ""
+"[Oban](https://github.com/sorentwo/oban) asynchronous job processor "
+"configuration."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha"
+msgid "Captcha-related settings"
+msgstr "Captcha-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer"
+msgid "Mailer-related settings"
+msgstr "Mailer-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "New users admin email digest"
+msgstr "New users admin email digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Email template settings"
+msgstr "Email template settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter"
+msgid "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs."
+msgstr ""
+"Configuration for Pleroma's link formatter which parses mentions, hashtags, "
+"and URLs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity"
+msgid "Scheduled activities settings"
+msgstr "Scheduled activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload"
+msgid "Upload general settings"
+msgstr "Upload general settings"
+
+#: 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 "Filtro troca o nome do arquivo de upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Uploads mogrify filter settings"
+msgstr "Uploads mogrify filter settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local"
+msgid "Local uploader-related settings"
+msgstr "Local uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3"
+msgid "S3 uploader-related settings"
+msgstr "S3 uploader-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup"
+msgid "Account Backup"
+msgstr "Account Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "HTTP invalidate settings"
+msgstr "HTTP invalidate settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Invalidation script settings"
+msgstr "Invalidation script settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata"
+msgid "Metadata-related settings"
+msgstr "Metadata-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"`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"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload"
+msgid "Preload-related settings"
+msgstr "Preload-related settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Expired activities settings"
+msgstr "Expired activities settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Web Push Notifications configuration. You can use the mix task mix "
+"web_push.gen.keypair to generate it."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3"
+msgid "S3"
+msgstr "S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console"
+msgid "Console Logger"
+msgstr "Console Logger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger"
+msgid "ExSyslogger"
+msgstr "ExSyslogger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub"
+msgid "ActivityPub"
+msgstr "ActivityPub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets"
+msgid "Assets"
+msgstr "Assets"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth"
+msgid "Auth"
+msgstr "Auth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications"
+msgid "Email notifications"
+msgstr "Email notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji"
+msgid "Emoji"
+msgstr "Emoji"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:features"
+msgid "Features"
+msgstr "Features"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed"
+msgid "Feed"
+msgstr "Feed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations"
+msgid "Frontend configurations"
+msgstr "Frontend configurations"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends"
+msgid "Frontends"
+msgstr "Frontends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http"
+msgid "HTTP"
+msgstr "HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security"
+msgid "HTTP security"
+msgstr "HTTP security"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance"
+msgid "Instance"
+msgstr "Instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons"
+msgid "Instances favicons"
+msgstr "Instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap"
+msgid "LDAP"
+msgstr "LDAP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:majic_pool"
+msgid "Majic pool"
+msgstr "Majic pool"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest"
+msgid "Manifest"
+msgstr "Manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup"
+msgid "Markup Settings"
+msgstr "Markup Settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy"
+msgid "Media preview proxy"
+msgstr "Media preview proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy"
+msgid "Media proxy"
+msgstr "Media proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:modules"
+msgid "Modules"
+msgstr "Modules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf"
+msgid "MRF"
+msgstr "MRF"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration"
+msgid "MRF Activity Expiration Policy"
+msgstr "MRF Activity Expiration Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot"
+msgid "MRF FollowBot Policy"
+msgstr "MRF FollowBot Policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag"
+msgid "MRF Hashtag"
+msgstr "MRF Hashtag"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread"
+msgid "MRF Hellthread"
+msgstr "MRF Hellthread"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword"
+msgid "MRF Keyword"
+msgstr "MRF Keyword"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention"
+msgid "MRF Mention"
+msgstr "MRF Mention"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup"
+msgid "MRF Normalize Markup"
+msgstr "MRF Normalize Markup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age"
+msgid "MRF Object Age"
+msgstr "MRF Object Age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic"
+msgid "MRF Reject Non Public"
+msgstr "MRF Reject Non Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple"
+msgid "MRF Simple"
+msgstr "MRF Simple"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji"
+msgid "MRF Emojis"
+msgstr "MRF Emojis"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain"
+msgid "MRF Subchain"
+msgstr "MRF Subchain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary"
+msgid "MRF Vocabulary"
+msgstr "MRF Vocabulary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2"
+msgid "OAuth2"
+msgstr "OAuth2"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table"
+msgid "Populate hashtags table"
+msgstr "Populate hashtags table"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit"
+msgid "Rate limit"
+msgstr "Rate limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated"
+msgid "Restrict Unauthenticated"
+msgstr "Restrict Unauthenticated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media"
+msgid "Rich media"
+msgstr "Rich media"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:static_fe"
+msgid "Static FE"
+msgstr "Static FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer"
+msgid "Streamer"
+msgstr "Streamer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes"
+msgid "URI Schemes"
+msgstr "URI Schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:user"
+msgid "User"
+msgstr "User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl"
+msgid "Web cache TTL"
+msgstr "Web cache TTL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome"
+msgid "Welcome"
+msgstr "Welcome"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter"
+msgid "ConcurrentLimiter"
+msgstr "ConcurrentLimiter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban"
+msgid "Oban"
+msgstr "Oban"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha"
+msgid "Pleroma.Captcha"
+msgstr "Pleroma.Captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha"
+msgid "Pleroma.Captcha.Kocaptcha"
+msgstr "Pleroma.Captcha.Kocaptcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer"
+msgid "Pleroma.Emails.Mailer"
+msgstr "Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail"
+msgid "Pleroma.Emails.NewUsersDigestEmail"
+msgstr "Pleroma.Emails.NewUsersDigestEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail"
+msgid "Pleroma.Emails.UserEmail"
+msgstr "Pleroma.Emails.UserEmail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter"
+msgid "Linkify"
+msgstr "Linkify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity"
+msgid "Pleroma.ScheduledActivity"
+msgstr "Pleroma.ScheduledActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload"
+msgid "Pleroma.Upload"
+msgstr "Pleroma.Upload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename"
+msgid "Pleroma.Upload.Filter.AnonymizeFilename"
+msgstr "Pleroma.Upload.Filter.AnonymizeFilename"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify"
+msgid "Pleroma.Upload.Filter.Mogrify"
+msgstr "Pleroma.Upload.Filter.Mogrify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local"
+msgid "Pleroma.Uploaders.Local"
+msgstr "Pleroma.Uploaders.Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3"
+msgid "Pleroma.Uploaders.S3"
+msgstr "Pleroma.Uploaders.S3"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User"
+msgid "Pleroma.User"
+msgstr "Pleroma.User"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup"
+msgid "Pleroma.User.Backup"
+msgstr "Pleroma.User.Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate"
+msgid "Pleroma.Web.ApiSpec.CastAndValidate"
+msgstr "Pleroma.Web.ApiSpec.CastAndValidate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Http"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Http"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script"
+msgid "Pleroma.Web.MediaProxy.Invalidation.Script"
+msgstr "Pleroma.Web.MediaProxy.Invalidation.Script"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata"
+msgid "Pleroma.Web.Metadata"
+msgstr "Pleroma.Web.Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp"
+msgid "Pleroma.Web.Plugs.RemoteIp"
+msgstr "Pleroma.Web.Plugs.RemoteIp"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload"
+msgid "Pleroma.Web.Preload"
+msgstr "Pleroma.Web.Preload"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity"
+msgid "Pleroma.Workers.PurgeExpiredActivity"
+msgstr "Pleroma.Workers.PurgeExpiredActivity"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details"
+msgid "Vapid Details"
+msgstr "Vapid Details"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :access_key_id"
+msgid "S3 access key ID"
+msgstr "S3 access key ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :host"
+msgid "S3 host"
+msgstr "S3 host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :region"
+msgid "S3 region (for AWS)"
+msgstr "S3 region (for AWS)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :"
+"ex_syslogger } - to syslog, Quack.Logger - to Slack."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:console > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :format"
+msgid "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+msgstr "Default: \"$date $time [$level] $levelpad$node $metadata $message\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"A string that's prepended to every message, and is typically set to the app "
+"name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :logger-:ex_syslogger > :level"
+msgid "Log level"
+msgstr "Log level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :blockers_visible"
+msgid "Whether a user can see someone who has blocked them"
+msgstr "Whether a user can see someone who has blocked them"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Following handshake timeout"
+msgstr "Following handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The number of Note replies' URIs to be included with outgoing federation (`5`"
+" to match Mastodon hardcoded value, `0` to disable the output)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Whether to federate blocks to other instances"
+msgstr "Whether to federate blocks to other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches with HTTP signatures"
+msgstr "Sign object fetches with HTTP signatures"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Whether blocks result in people getting unfollowed"
+msgstr "Whether blocks result in people getting unfollowed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_mascot"
+msgid "This will be used as the default mascot on MastoFE. Default: `:pleroma_fox_tan`"
+msgstr ""
+"This will be used as the default mascot on MastoFE. Default: "
+"`:pleroma_fox_tan`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :default_user_avatar"
+msgid "URL of the default user avatar"
+msgstr "URL of the default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:assets > :mascots"
+msgid "Keyword of mascots, each element must contain both an URL and a mime_type key"
+msgstr ""
+"Keyword of mascots, each element must contain both an URL and a mime_type key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Authentication form template. By default it's `show.html` which corresponds "
+"to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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_)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"emails of \"what you've missed\" for users who have been inactive for a while"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :active"
+msgid "Globally enable or disable digest emails"
+msgstr "Globally enable or disable digest emails"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Minimum user inactivity threshold"
+msgstr "Minimum user inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:email_notifications > :digest > :interval"
+msgid "Minimum interval between digest emails to one user"
+msgstr "Minimum interval between digest emails to one user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"When to send digest email, in crontab format. \"0 0 0\" is the default, "
+"meaning \"once a week at midnight on Sunday morning\"."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"A list of file extensions for emojis, when no emoji.txt for a pack is present"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:emoji > :shortcode_globs"
+msgid "Location of custom emoji files. * can be used as a wildcard."
+msgstr "Location of custom emoji files. * can be used as a wildcard."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title"
+msgid "Configure title rendering"
+msgstr "Configure title rendering"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :max_length"
+msgid "Maximum number of characters before truncating title"
+msgstr "Maximum number of characters before truncating title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:feed > :post_title > :omission"
+msgid "Replacement which will be used after truncating string"
+msgstr "Replacement which will be used after truncating string"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Settings for Pleroma FE"
+msgstr "Settings for Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "When disabled, auto-hide the subject field if it's empty"
+msgstr "When disabled, auto-hide the subject field if it's empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"URL of the background, unless viewing a user profile with a background that "
+"is set"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"When a message has a subject (aka Content Warning), collapse it by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Enables green text on lines prefixed with the > character"
+msgstr "Enables green text on lines prefixed with the > character"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hides filtered statuses from timelines"
+msgstr "Hides filtered statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hides muted statuses from timelines"
+msgstr "Hides muted statuses from timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide notices statistics (repeats, favorites, ...)"
+msgstr "Hide notices statistics (repeats, favorites, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide profile statistics (posts, posts per day, followers, followings, ...)"
+msgstr ""
+"Hide profile statistics (posts, posts per day, followers, followings, ...)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "URL of the logo, defaults to Pleroma's logo"
+msgstr "URL of the logo, defaults to Pleroma's logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"URL of the image to use for hiding NSFW media attachments in the timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Default post formatting option"
+msgstr "Default post formatting option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 "Relative URL which indicates where to redirect when a user is logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Relative URL which indicates where to redirect when a user isn't logged in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Copy the scope (private/unlisted/public) in replies to posts by default"
+msgstr "Copy the scope (private/unlisted/public) in replies to posts by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Enables panel displaying functionality of the instance on the About page"
+msgstr ""
+"Enables panel displaying functionality of the instance on the About page"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Whether to show the instance's custom panel"
+msgstr "Whether to show the instance's custom panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Change alignment of sidebar and panels to the right"
+msgstr "Change alignment of sidebar and panels to the right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Which theme to use. Available themes are defined in styles.json"
+msgstr "Which theme to use. Available themes are defined in styles.json"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin"
+msgid "Admin frontend"
+msgstr "Admin frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :admin > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available"
+msgid "A map containing available frontends and parameters for their installation."
+msgstr ""
+"A map containing available frontends and parameters for their installation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > build_dir"
+msgid "The directory inside the zip file "
+msgstr "The directory inside the zip file "
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > custom-http-headers"
+msgid "The custom HTTP headers for the frontend"
+msgstr "The custom HTTP headers for the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > git"
+msgid "URL of the git repository of the frontend"
+msgstr "URL of the git repository of the frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > name"
+msgid "Name of the frontend."
+msgstr "Name of the frontend."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :available > ref"
+msgid "Reference of the frontend to be used."
+msgstr "Reference of the frontend to be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary"
+msgid "Primary frontend, the one that is served for all pages by default"
+msgstr "Primary frontend, the one that is served for all pages by default"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :primary > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter"
+msgid "Adapter specific options"
+msgstr "Adapter specific options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL options for HTTP adapter"
+msgstr "SSL options for HTTP adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "List of TLS version to use"
+msgstr "List of TLS version to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"What user agent to use. Must be a string or an atom `:default`. Default "
+"value is `:default`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :enabled"
+msgid "Whether the managed content security policy is enabled"
+msgstr "Whether the managed content security policy is enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :referrer_policy"
+msgid "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+msgstr "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 "Adds the specified URL to report-uri and report-to group in CSP header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts"
+msgid "Whether to additionally send a Strict-Transport-Security header"
+msgstr "Whether to additionally send a Strict-Transport-Security header"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http_security > :sts_max_age"
+msgid "The maximum age for the Strict-Transport-Security header if sent"
+msgstr "The maximum age for the Strict-Transport-Security header if sent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_activation_required"
+msgid "Require users to confirm their emails before signing in"
+msgstr "Require users to confirm their emails before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_approval_required"
+msgid "Require users to be manually approved by an admin before signing in"
+msgstr "Require users to be manually approved by an admin before signing in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_field_name_length"
+msgid "An account field name maximum length. Default: 512."
+msgstr "An account field name maximum length. Default: 512."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :account_field_value_length"
+msgid "An account field value maximum length. Default: 2048."
+msgstr "An account field value maximum length. Default: 2048."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Permits remote instances to subscribe to all public posts of your instance. "
+"(Important!) This may increase the visibility of your instance."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :allowed_post_formats"
+msgid "MIME-type list of formats allowed to be posted (transformed into HTML)"
+msgstr "MIME-type list of formats allowed to be posted (transformed into HTML)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :attachment_links"
+msgid "Enable to automatically add attachment link text to statuses"
+msgstr "Enable to automatically add attachment link text to statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Set to nicknames of (local) users that every new user should automatically follow"
+msgstr ""
+"Set to nicknames of (local) users that every new user should automatically "
+"follow"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Set to nicknames of (local) users that automatically follows every newly registered user"
+msgstr ""
+"Set to nicknames of (local) users that automatically follows every newly "
+"registered user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :avatar_upload_limit"
+msgid "File size limit of user's profile avatars"
+msgstr "File size limit of user's profile avatars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :background_upload_limit"
+msgid "File size limit of user's profile backgrounds"
+msgstr "File size limit of user's profile backgrounds"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :banner_upload_limit"
+msgid "File size limit of user's profile banners"
+msgstr "File size limit of user's profile banners"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Enable to remove associated attachments when status is removed.\n"
+"This will not affect duplicates and attachments without status.\n"
+"Enabling this will increase load to database when deleting statuses on "
+"larger instances.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :description"
+msgid "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+msgstr ""
+"The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :email"
+msgid "Email used to reach an Administrator/Moderator of the instance"
+msgstr "Email used to reach an Administrator/Moderator of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Enable to use extended local nicknames format (allows underscores/dashes). "
+"This will break federation with older software for theses nicknames."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :external_user_synchronization"
+msgid "Enabling following/followers counters synchronization for external users"
+msgstr ""
+"Enabling following/followers counters synchronization for external users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federating"
+msgid "Enable federation with other instances"
+msgstr "Enable federation with other instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Timeout (in days) of each external federation target being unreachable prior "
+"to pausing federating to it"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :invites_enabled"
+msgid "Enable user invitations for admins (depends on `registrations_open` being disabled)"
+msgstr ""
+"Enable user invitations for admins (depends on `registrations_open` being "
+"disabled)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :limit"
+msgid "Posts character limit (CW/Subject included in the counter)"
+msgstr "Posts character limit (CW/Subject included in the counter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Limit unauthenticated users to search for local statutes and users only. "
+"Default: `:unauthenticated`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_account_fields"
+msgid "The maximum number of custom fields in the user profile. Default: 10."
+msgstr "The maximum number of custom fields in the user profile. Default: 10."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_pinned_statuses"
+msgid "The maximum number of pinned statuses. 0 will disable the feature."
+msgstr "The maximum number of pinned statuses. 0 will disable the feature."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The maximum number of custom fields in the remote user profile. Default: 20."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :max_report_comment_size"
+msgid "The maximum size of the report comment. Default: 1000."
+msgstr "The maximum size of the report comment. Default: 1000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi-factor authentication settings"
+msgstr "Multi-factor authentication settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "MFA backup codes settings"
+msgstr "MFA backup codes settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Determines the length of backup one-time pass-codes, in characters. Defaults "
+"to 16 characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number of backup codes to generate."
+msgstr "Number of backup codes to generate."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Determines the length of a one-time pass-code, in characters. Defaults to 6 "
+"characters."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"A period for which the TOTP code will be valid, in seconds. Defaults to 30 "
+"seconds."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :name"
+msgid "Name of the instance"
+msgstr "Name of the instance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :notify_email"
+msgid "Envelope FROM address for mail sent via Pleroma"
+msgstr "Envelope FROM address for mail sent via Pleroma"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits"
+msgid "A map with poll limits for local polls"
+msgstr "A map with poll limits for local polls"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Maximum expiration time (in seconds)"
+msgstr "Maximum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Maximum number of characters per option"
+msgstr "Maximum number of characters per option"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Maximum number of options"
+msgstr "Maximum number of options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Minimum expiration time (in seconds)"
+msgstr "Minimum expiration time (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :profile_directory"
+msgid "Enable profile directory."
+msgstr "Enable profile directory."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :registration_reason_length"
+msgid "Maximum registration reason length. Default: 500."
+msgstr "Maximum registration reason length. Default: 500."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :registrations_open"
+msgid "Enable registrations for anyone. Invitations require this setting to be disabled."
+msgstr ""
+"Enable registrations for anyone. Invitations require this setting to be "
+"disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :remote_limit"
+msgid "Hard character limit beyond which remote posts will be dropped"
+msgstr "Hard character limit beyond which remote posts will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The default amount of days to retain remote posts when pruning the database"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :show_reactions"
+msgid "Let favourites and emoji reactions be viewed through the API."
+msgstr "Let favourites and emoji reactions be viewed through the API."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip filtering out broken threads. Default: enabled."
+msgstr "Skip filtering out broken threads. Default: enabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :static_dir"
+msgid "Instance static directory"
+msgstr "Instance static directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :upload_limit"
+msgid "File size limit of uploads (except for avatar, background, banner)"
+msgstr "File size limit of uploads (except for avatar, background, banner)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_bio_length"
+msgid "A user bio maximum length. Default: 5000."
+msgstr "A user bio maximum length. Default: 5000."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :user_name_length"
+msgid "A user name maximum length. Default: 100."
+msgstr "A user name maximum length. Default: 100."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instances_favicons > :enabled"
+msgid "Allow/disallow displaying and getting instances favicons"
+msgstr "Allow/disallow displaying and getting instances favicons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :base"
+msgid "LDAP base, e.g. \"dc=example,dc=com\""
+msgstr "LDAP base, e.g. \"dc=example,dc=com\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :enabled"
+msgid "Enables LDAP authentication"
+msgstr "Enables LDAP authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :host"
+msgid "LDAP server hostname"
+msgstr "LDAP server hostname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :port"
+msgid "LDAP port, e.g. 389 or 636"
+msgstr "LDAP port, e.g. 389 or 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :ssl"
+msgid "Enable to use SSL, usually implies the port 636"
+msgstr "Enable to use SSL, usually implies the port 636"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts"
+msgid "Additional SSL options"
+msgstr "Additional SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :sslopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tls"
+msgid "Enable to use STARTTLS, usually implies the port 389"
+msgstr "Enable to use STARTTLS, usually implies the port 389"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts"
+msgid "Additional TLS options"
+msgstr "Additional TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Path to file with PEM encoded cacerts"
+msgstr "Path to file with PEM encoded cacerts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Type of cert verification"
+msgstr "Type of cert verification"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter "
+"will be \"cn=username,base\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:majic_pool > :size"
+msgid "Number of majic workers to start."
+msgstr "Number of majic workers to start."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :icons"
+msgid "Describe the icons of the app"
+msgstr "Describe the icons of the app"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Module names are shortened (removed leading `Pleroma.HTML.` part), but on "
+"adding custom module you need to use full name."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Enables proxying of remote media preview to the instance's proxy. Requires "
+"enabled media proxy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Min content length (in bytes) to perform preview. Media smaller in size will "
+"be served without thumbnailing."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Max height of preview thumbnail for images (video preview always has "
+"original dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Max width of preview thumbnail for images (video preview always has original "
+"dimensions)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The base URL to access a user-uploaded file. Useful when you want to proxy "
+"the media files via another host/CDN fronts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :enabled"
+msgid "Enables proxying of remote media via the instance's proxy"
+msgstr "Enables proxying of remote media via the instance's proxy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enables media cache object invalidation."
+msgstr "Enables media cache object invalidation."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Module which will be used to purge objects from the cache."
+msgstr "Module which will be used to purge objects from the cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts"
+msgid "Internal Pleroma.ReverseProxy settings"
+msgstr "Internal Pleroma.ReverseProxy settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Timeout (in milliseconds) of GET request to the remote URI."
+msgstr "Timeout (in milliseconds) of GET request to the remote URI."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Redirects the client to the origin server upon encountering HTTP errors.\n"
+"\n"
+"Note 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"
+"\n"
+"IP addresses of your users to the other servers, bypassing the MediaProxy.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:modules > :runtime_dir"
+msgid "A path to custom Elixir modules (such as MRF policies)."
+msgstr "A path to custom Elixir modules (such as MRF policies)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency"
+msgid "Make the content of your Message Rewrite Facility settings public (via nodeinfo)"
+msgstr ""
+"Make the content of your Message Rewrite Facility settings public (via "
+"nodeinfo)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_activity_expiration > :days"
+msgid "Default global expiration time for all local activities (in days)"
+msgstr "Default global expiration time for all local activities (in days)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The name of the bot account to use for following newly discovered users."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"A list of hashtags which result in message being removed from federated "
+"timelines (a.k.a unlisted)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_hashtag > :reject"
+msgid "A list of hashtags which result in message being rejected."
+msgstr "A list of hashtags which result in message being rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"A list of hashtags which result in message being set as sensitive (a.k.a "
+"NSFW/R-18)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Number of mentioned users after which the message gets removed from "
+"timelines anddisables notifications. Set to 0 to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Number of mentioned users after which the messaged gets rejected. Set to 0 "
+"to disable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+" 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"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+" 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"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+" **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"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_mention > :actors"
+msgid "A list of actors for which any post mentioning them will be dropped"
+msgstr "A list of actors for which any post mentioning them will be dropped"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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; `:reject` rejects the message entirely"
+msgstr ""
+"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; `:reject` "
+"rejects the message entirely"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_object_age > :threshold"
+msgid "Required age (in seconds) of a post before actions are taken."
+msgstr "Required age (in seconds) of a post before actions are taken."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Whether to allow direct messages"
+msgstr "Whether to allow direct messages"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Whether to allow followers-only posts"
+msgstr "Whether to allow followers-only posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"List of instances to only accept activities from (except deletes) and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :avatar_removal"
+msgid "List of instances to strip avatars from and the reason for doing so"
+msgstr "List of instances to strip avatars from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :banner_removal"
+msgid "List of instances to strip banners from and the reason for doing so"
+msgstr "List of instances to strip banners from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"List of instances to remove from the Federated (aka The Whole Known Network) "
+"Timeline and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Force posts from the given instances to be visible by followers only and the "
+"reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"List of instances to tag all media as NSFW (sensitive) from and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"List of instances to strip media attachments from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"List of instances to reject activities from (except deletes) and the reason "
+"for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :reject_deletes"
+msgid "List of instances to reject deletions from and the reason for doing so"
+msgstr "List of instances to reject deletions from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :report_removal"
+msgid "List of instances to reject reports from and the reason for doing so"
+msgstr "List of instances to reject reports from and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "List of hosts to steal emojis from"
+msgstr "List of hosts to steal emojis from"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+" 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"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"File size limit (in bytes), checked before an emoji is saved to the disk"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_subchain > :match_actor"
+msgid "Matches a series of regular expressions against the actor field"
+msgstr "Matches a series of regular expressions against the actor field"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :accept"
+msgid "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted."
+msgstr ""
+"A list of ActivityStreams terms to accept. If empty, all supported messages "
+"are accepted."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_vocabulary > :reject"
+msgid "A list of ActivityStreams terms to reject. If empty, no messages are rejected."
+msgstr ""
+"A list of ActivityStreams terms to reject. If empty, no messages are "
+"rejected."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Enable a background job to clean expired OAuth tokens. Default: disabled."
+msgstr ""
+"Enable a background job to clean expired OAuth tokens. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Keeps old refresh token or generate new refresh token when to obtain an "
+"access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:oauth2 > :token_expires_in"
+msgid "The lifetime in seconds of the access token"
+msgstr "The lifetime in seconds of the access token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :app_account_creation"
+msgid "For registering user accounts from the same IP address"
+msgstr "For registering user accounts from the same IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :authentication"
+msgid "For authentication create / password check / user existence check requests"
+msgstr ""
+"For authentication create / password check / user existence check requests"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relation_id_action"
+msgid "For actions on relation with a specific user (follow, unfollow)"
+msgstr "For actions on relation with a specific user (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :relations_actions"
+msgid "For actions on relationships with all users (follow, unfollow)"
+msgstr "For actions on relationships with all users (follow, unfollow)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :search"
+msgid "For the search requests (account & status search etc.)"
+msgstr "For the search requests (account & status search etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"For fav / unfav or reblog / unreblog actions on the same status by the same "
+"user"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :statuses_actions"
+msgid "For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+msgstr ""
+"For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rate_limit > :timeline"
+msgid "For requests to timelines (each timeline has it's own limiter)"
+msgstr "For requests to timelines (each timeline has it's own limiter)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Settings for user profiles."
+msgstr "Settings for user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Settings for public and federated timelines."
+msgstr "Settings for public and federated timelines."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :enabled"
+msgid "Enables RichMedia parsing of URLs"
+msgstr "Enables RichMedia parsing of URLs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Amount of milliseconds after request failure, during which the request will "
+"not be retried."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_hosts"
+msgid "List of hosts which will be ignored by the metadata parser"
+msgstr "List of hosts which will be ignored by the metadata parser"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:rich_media > :ignore_tld"
+msgid "List TLDs (top-level domains) which will ignore for parse metadata"
+msgstr "List TLDs (top-level domains) which will ignore for parse metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:static_fe > :enabled"
+msgid "Enables the rendering of static HTML. Default: disabled."
+msgstr "Enables the rendering of static HTML. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer > :overflow_workers"
+msgid "Maximum number of workers created if pool is empty"
+msgstr "Maximum number of workers created if pool is empty"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:streamer > :workers"
+msgid "Number of workers to send notifications"
+msgstr "Number of workers to send notifications"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:uri_schemes > :valid_schemes"
+msgid "List of the scheme part that is considered valid to be an URL"
+msgstr "List of the scheme part that is considered valid to be an URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub routes (except question activities). Default: `nil` (no expiration)."
+msgstr ""
+"Activity pub routes (except question activities). Default: `nil` (no "
+"expiration)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+msgstr ""
+"Activity pub routes (question activities). Default: `30_000` (30 seconds)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enables sending a direct message to newly registered users"
+msgstr "Enables sending a direct message to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :message"
+msgid "A message that will be sent to newly registered users"
+msgstr "A message that will be sent to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "The nickname of the local user that sends a welcome message"
+msgstr "The nickname of the local user that sends a welcome message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :enabled"
+msgid "Enables sending an email to newly registered users"
+msgstr "Enables sending an email to newly registered users"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"HTML content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:welcome > :email > :sender"
+msgid "Email address and/or nickname that will be used to send the welcome email."
+msgstr ""
+"Email address and/or nickname that will be used to send the welcome email."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Subject of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Text content of the welcome email. EEX template with user and instance_name "
+"variables can be used."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:workers > :retries"
+msgid "Max retry attempts for failed jobs, per `Oban` queue"
+msgstr "Max retry attempts for failed jobs, per `Oban` queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Concurrent limits configuration for MediaProxyWarmingPolicy."
+msgstr "Concurrent limits configuration for MediaProxyWarmingPolicy."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Concurrent limits configuration for getting RichMedia for activities."
+msgstr "Concurrent limits configuration for getting RichMedia for activities."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running concurrently jobs."
+msgstr "Max running concurrently jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting jobs."
+msgstr "Max waiting jobs."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :crontab"
+msgid "Settings for cron background jobs"
+msgstr "Settings for cron background jobs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :log"
+msgid "Logs verbose mode"
+msgstr "Logs verbose mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues"
+msgid "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+msgstr ""
+"Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration queue"
+msgstr "Activity expiration queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachment deletion queue"
+msgstr "Attachment deletion queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :background"
+msgid "Background queue"
+msgstr "Background queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :backup"
+msgid "Backup queue"
+msgstr "Backup queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Incoming federation queue"
+msgstr "Incoming federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Outgoing federation queue"
+msgstr "Outgoing federation queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :mailer"
+msgid "Email sender queue, see Pleroma.Emails.Mailer"
+msgstr "Email sender queue, see Pleroma.Emails.Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities queue, see Pleroma.ScheduledActivities"
+msgstr "Scheduled activities queue, see Pleroma.ScheduledActivities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier queue"
+msgstr "Transmogrifier queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Oban > :queues > :web_push"
+msgid "Web push notifications queue"
+msgstr "Web push notifications queue"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Whether the captcha should be shown on registration"
+msgstr "Whether the captcha should be shown on registration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :method"
+msgid "The method/service to use for captcha"
+msgstr "The method/service to use for captcha"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "The time in seconds for which the captcha is valid"
+msgstr "The time in seconds for which the captcha is valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "The kocaptcha endpoint to use"
+msgstr "The kocaptcha endpoint to use"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/"
+"swoosh/Swoosh.html#module-adapters)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "SMTP AUTH enforcement mode"
+msgstr "SMTP AUTH enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "SMTP AUTH password"
+msgstr "SMTP AUTH password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "SMTP port"
+msgstr "SMTP port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Hostname or IP address"
+msgstr "Hostname or IP address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "SMTP temporary (4xx) error retries"
+msgstr "SMTP temporary (4xx) error retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use Implicit SSL/TLS. e.g. port 465"
+msgstr "Use Implicit SSL/TLS. e.g. port 465"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "Explicit TLS (STARTTLS) enforcement mode"
+msgstr "Explicit TLS (STARTTLS) enforcement mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "SMTP AUTH username"
+msgstr "SMTP AUTH username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enables new users admin digest email when `true`"
+msgstr "Enables new users admin digest email when `true`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "A map with color settings for email templates."
+msgstr "A map with color settings for email templates."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :class"
+msgid "Specify the class to be added to the generated link. Disable to clear."
+msgstr "Specify the class to be added to the generated link. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :extra"
+msgid "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+msgstr "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :new_window"
+msgid "Link URLs will open in a new window/tab."
+msgstr "Link URLs will open in a new window/tab."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :rel"
+msgid "Override the rel attribute. Disable to clear."
+msgstr "Override the rel attribute. Disable to clear."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip the scheme prefix."
+msgstr "Strip the scheme prefix."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Set to a number to truncate URLs longer than the number. Truncated URLs will "
+"end in `...`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The number of scheduled activities a user is allowed to create in a single "
+"day. Default: 25."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Whether scheduled activities are sent to the job queue to be executed"
+msgstr "Whether scheduled activities are sent to the job queue to be executed"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"The number of scheduled activities a user is allowed to create in total. "
+"Default: 300."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Base URL for the uploads. Required if you use a CDN or host attachments "
+"under a different domain."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 "Set max length of a filename to display. 0 = no limit. Default: 30"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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`."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"Proxy requests to the remote uploader.\n"
+"\n"
+"Useful if media upload endpoint is not internet accessible.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Upload > :uploader"
+msgid "Module which will be used for uploads"
+msgstr "Module which will be used for uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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}."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Path where user's uploads will be saved"
+msgstr "Path where user's uploads will be saved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "S3 bucket"
+msgstr "S3 bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "S3 bucket namespace"
+msgstr "S3 bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :email_blacklist"
+msgid "List of email domains users may not register with."
+msgstr "List of email domains users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "List of nicknames users may not register with."
+msgstr "List of nicknames users may not register with."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit user to export not more often than once per N days"
+msgstr "Limit user to export not more often than once per N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Remove backup achives after N days"
+msgstr "Remove backup achives after N days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Enables strict input validation (useful in development, not recommended in production)"
+msgstr ""
+"Enables strict input validation (useful in development, not recommended in "
+"production)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "HTTP headers of request"
+msgstr "HTTP headers of request"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "HTTP method of request. Default: :purge"
+msgstr "HTTP method of request. Default: :purge"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Request options"
+msgstr "Request options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Path to executable script which will purge cached items."
+msgstr "Path to executable script which will purge cached items."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "Optional URL format preprocessing. Only required for Apache's htcacheclean."
+msgstr ""
+"Optional URL format preprocessing. Only required for Apache's htcacheclean."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "List of metadata providers to enable"
+msgstr "List of metadata providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "When enabled NSFW attachments will be shown in previews"
+msgstr "When enabled NSFW attachments will be shown in previews"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enable/disable the plug. Default: disabled."
+msgstr "Enable/disable the plug. Default: disabled."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+" A list of strings naming the HTTP headers to use when deriving the true "
+"client IP. Default: `[\"x-forwarded-for\"]`.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+" 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"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "List of preload providers to enable"
+msgstr "List of preload providers to enable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enables expired activities addition & deletion"
+msgstr "Enables expired activities addition & deletion"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Minimum lifetime for ephemeral activity (in seconds)"
+msgstr "Minimum lifetime for ephemeral activity (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :private_key"
+msgid "VAPID private key"
+msgstr "VAPID private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :web_push_encryption-:vapid_details > :public_key"
+msgid "VAPID public key"
+msgstr "VAPID public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 ""
+"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."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :credentials"
+msgid "Credentials"
+msgstr "Credentials"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :expose"
+msgid "Expose"
+msgstr "Expose"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :max_age"
+msgid "Max age"
+msgstr "Max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :cors_plug > :methods"
+msgid "Methods"
+msgstr "Methods"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :access_key_id"
+msgid "Access key"
+msgstr "Access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :region"
+msgid "Region"
+msgstr "Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :ex_aws-:s3 > :secret_access_key"
+msgid "Secret access key"
+msgstr "Secret access key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger > :backends"
+msgid "Backends"
+msgstr "Backends"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:console > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :format"
+msgid "Format"
+msgstr "Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :ident"
+msgid "Ident"
+msgstr "Ident"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :level"
+msgid "Level"
+msgstr "Level"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :logger-:ex_syslogger > :metadata"
+msgid "Metadata"
+msgstr "Metadata"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types"
+msgid "Types"
+msgstr "Types"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/activity+json"
+msgid "\"application/activity+json\""
+msgstr "\"application/activity+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/jrd+json"
+msgid "\"application/jrd+json\""
+msgstr "\"application/jrd+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/ld+json"
+msgid "\"application/ld+json\""
+msgstr "\"application/ld+json\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/xml"
+msgid "\"application/xml\""
+msgstr "\"application/xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :mime > :types > application/xrd+xml"
+msgid "\"application/xrd+xml\""
+msgstr "\"application/xrd+xml\""
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma > :admin_token"
+msgid "Admin token"
+msgstr "Admin token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma > Pleroma.Web.Auth.Authenticator"
+msgid "Pleroma.Web.Auth.Authenticator"
+msgstr "Pleroma.Web.Auth.Authenticator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :blockers_visible"
+msgid "Blockers visible"
+msgstr "Blockers visible"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :follow_handshake_timeout"
+msgid "Follow handshake timeout"
+msgstr "Follow handshake timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :note_replies_output_limit"
+msgid "Note replies output limit"
+msgstr "Note replies output limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :outgoing_blocks"
+msgid "Outgoing blocks"
+msgstr "Outgoing blocks"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :sign_object_fetches"
+msgid "Sign object fetches"
+msgstr "Sign object fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :unfollow_blocked"
+msgid "Unfollow blocked"
+msgstr "Unfollow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_mascot"
+msgid "Default mascot"
+msgstr "Default mascot"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :default_user_avatar"
+msgid "Default user avatar"
+msgstr "Default user avatar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:assets > :mascots"
+msgid "Mascots"
+msgstr "Mascots"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :auth_template"
+msgid "Auth template"
+msgstr "Auth template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
+msgid "Enforce OAuth admin scope usage"
+msgstr "Enforce OAuth admin scope usage"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_strategies"
+msgid "OAuth consumer strategies"
+msgstr "OAuth consumer strategies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:auth > :oauth_consumer_template"
+msgid "OAuth consumer template"
+msgstr "OAuth consumer template"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest"
+msgid "Digest"
+msgstr "Digest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :active"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :inactivity_threshold"
+msgid "Inactivity threshold"
+msgstr "Inactivity threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :interval"
+msgid "Interval"
+msgstr "Interval"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:email_notifications > :digest > :schedule"
+msgid "Schedule"
+msgstr "Schedule"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :default_manifest"
+msgid "Default manifest"
+msgstr "Default manifest"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :groups"
+msgid "Groups"
+msgstr "Groups"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :pack_extensions"
+msgid "Pack extensions"
+msgstr "Pack extensions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shared_pack_cache_seconds_per_file"
+msgid "Shared pack cache s/file"
+msgstr "Shared pack cache s/file"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:emoji > :shortcode_globs"
+msgid "Shortcode globs"
+msgstr "Shortcode globs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:features > :improved_hashtag_timeline"
+msgid "Improved hashtag timeline"
+msgstr "Improved hashtag timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title"
+msgid "Post title"
+msgstr "Post title"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :max_length"
+msgid "Max length"
+msgstr "Max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:feed > :post_title > :omission"
+msgid "Omission"
+msgstr "Omission"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe"
+msgid "Pleroma FE"
+msgstr "Pleroma FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
+msgid "Always show subject input"
+msgstr "Always show subject input"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
+msgid "Collapse message with subject"
+msgstr "Collapse message with subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
+msgid "Greentext"
+msgstr "Greentext"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
+msgid "Hide Filtered Statuses"
+msgstr "Hide Filtered Statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
+msgid "Hide Muted Posts"
+msgstr "Hide Muted Posts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
+msgid "Hide post stats"
+msgstr "Hide post stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
+msgid "Hide user stats"
+msgstr "Hide user stats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
+msgid "Logo margin"
+msgstr "Logo margin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
+msgid "Logo mask"
+msgstr "Logo mask"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
+msgid "NSFW Censor Image"
+msgstr "NSFW Censor Image"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
+msgid "Post Content Type"
+msgstr "Post Content Type"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
+msgid "Redirect root login"
+msgstr "Redirect root login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
+msgid "Redirect root no login"
+msgstr "Redirect root no login"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
+msgid "Scope copy"
+msgstr "Scope copy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
+msgid "Show instance features panel"
+msgstr "Show instance features panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
+msgid "Show instance specific panel"
+msgstr "Show instance specific panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
+msgid "Sidebar on Right"
+msgstr "Sidebar on Right"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
+msgid "Subject line behavior"
+msgstr "Subject line behavior"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
+msgid "Theme"
+msgstr "Theme"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin"
+msgid "Admin"
+msgstr "Admin"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :admin > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available"
+msgid "Available"
+msgstr "Available"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_dir"
+msgid "Build directory"
+msgstr "Build directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > build_url"
+msgid "Build URL"
+msgstr "Build URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > custom-http-headers"
+msgid "Custom HTTP headers"
+msgstr "Custom HTTP headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > git"
+msgid "Git Repository URL"
+msgstr "Git Repository URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :available > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary"
+msgid "Primary"
+msgstr "Primary"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :primary > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options"
+msgid "SSL Options"
+msgstr "SSL Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :adapter > :ssl_options > :versions"
+msgid "Versions"
+msgstr "Versions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :proxy_url"
+msgid "Proxy URL"
+msgstr "Proxy URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :user_agent"
+msgid "User agent"
+msgstr "User agent"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :referrer_policy"
+msgid "Referrer policy"
+msgstr "Referrer policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :report_uri"
+msgid "Report URI"
+msgstr "Report URI"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts"
+msgid "STS"
+msgstr "STS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http_security > :sts_max_age"
+msgid "STS max age"
+msgstr "STS max age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_activation_required"
+msgid "Account activation required"
+msgstr "Account activation required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_approval_required"
+msgid "Account approval required"
+msgstr "Account approval required"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_name_length"
+msgid "Account field name length"
+msgstr "Account field name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :account_field_value_length"
+msgid "Account field value length"
+msgstr "Account field value length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :allow_relay"
+msgid "Allow relay"
+msgstr "Allow relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :allowed_post_formats"
+msgid "Allowed post formats"
+msgstr "Allowed post formats"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :attachment_links"
+msgid "Attachment links"
+msgstr "Attachment links"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowed_nicknames"
+msgid "Autofollowed nicknames"
+msgstr "Autofollowed nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :autofollowing_nicknames"
+msgid "Autofollowing nicknames"
+msgstr "Autofollowing nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :avatar_upload_limit"
+msgid "Avatar upload limit"
+msgstr "Avatar upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :background_upload_limit"
+msgid "Background upload limit"
+msgstr "Background upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :banner_upload_limit"
+msgid "Banner upload limit"
+msgstr "Banner upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :cleanup_attachments"
+msgid "Cleanup attachments"
+msgstr "Cleanup attachments"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :description"
+msgid "Description"
+msgstr "Description"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :email"
+msgid "Admin Email Address"
+msgstr "Admin Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :extended_nickname_format"
+msgid "Extended nickname format"
+msgstr "Extended nickname format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :external_user_synchronization"
+msgid "External user synchronization"
+msgstr "External user synchronization"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federating"
+msgid "Federating"
+msgstr "Federating"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federation_incoming_replies_max_depth"
+msgid "Fed. incoming replies max depth"
+msgstr "Fed. incoming replies max depth"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federation_reachability_timeout_days"
+msgid "Fed. reachability timeout days"
+msgstr "Fed. reachability timeout days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :healthcheck"
+msgid "Healthcheck"
+msgstr "Healthcheck"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :instance_thumbnail"
+msgid "Instance thumbnail"
+msgstr "Instance thumbnail"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :invites_enabled"
+msgid "Invites enabled"
+msgstr "Invites enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit"
+msgid "Limit"
+msgstr "Limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :limit_to_local_content"
+msgid "Limit to local content"
+msgstr "Limit to local content"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_account_fields"
+msgid "Max account fields"
+msgstr "Max account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_pinned_statuses"
+msgid "Max pinned statuses"
+msgstr "Max pinned statuses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_remote_account_fields"
+msgid "Max remote account fields"
+msgstr "Max remote account fields"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :max_report_comment_size"
+msgid "Max report comment size"
+msgstr "Max report comment size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication"
+msgid "Multi factor authentication"
+msgstr "Multi factor authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
+msgid "Backup codes"
+msgstr "Backup codes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
+msgid "Length"
+msgstr "Length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
+msgid "Number"
+msgstr "Number"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp"
+msgid "TOTP settings"
+msgstr "TOTP settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
+msgid "Digits"
+msgstr "Digits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
+msgid "Period"
+msgstr "Period"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :notify_email"
+msgid "Sender Email Address"
+msgstr "Sender Email Address"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits"
+msgid "Poll limits"
+msgstr "Poll limits"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_expiration"
+msgid "Max expiration"
+msgstr "Max expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_option_chars"
+msgid "Max option chars"
+msgstr "Max option chars"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :max_options"
+msgid "Max options"
+msgstr "Max options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :poll_limits > :min_expiration"
+msgid "Min expiration"
+msgstr "Min expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :privileged_staff"
+msgid "Privileged staff"
+msgstr "Privileged staff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :profile_directory"
+msgid "Profile directory"
+msgstr "Profile directory"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :public"
+msgid "Public"
+msgstr "Public"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :quarantined_instances"
+msgid "Quarantined instances"
+msgstr "Quarantined instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :registration_reason_length"
+msgid "Registration reason length"
+msgstr "Registration reason length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :registrations_open"
+msgid "Registrations open"
+msgstr "Registrations open"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_limit"
+msgid "Remote limit"
+msgstr "Remote limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :remote_post_retention_days"
+msgid "Remote post retention days"
+msgstr "Remote post retention days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :safe_dm_mentions"
+msgid "Safe DM mentions"
+msgstr "Safe DM mentions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :show_reactions"
+msgid "Show reactions"
+msgstr "Show reactions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :skip_thread_containment"
+msgid "Skip thread containment"
+msgstr "Skip thread containment"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :static_dir"
+msgid "Static dir"
+msgstr "Static dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :upload_limit"
+msgid "Upload limit"
+msgstr "Upload limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_bio_length"
+msgid "User bio length"
+msgstr "User bio length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :user_name_length"
+msgid "User name length"
+msgstr "User name length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_favicons > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :base"
+msgid "Base"
+msgstr "Base"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :host"
+msgid "Host"
+msgstr "Host"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :ssl"
+msgid "SSL"
+msgstr "SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts"
+msgid "SSL options"
+msgstr "SSL options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :sslopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tls"
+msgid "TLS"
+msgstr "TLS"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts"
+msgid "TLS options"
+msgstr "TLS options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :cacertfile"
+msgid "Cacertfile"
+msgstr "Cacertfile"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :tlsopts > :verify"
+msgid "Verify"
+msgstr "Verify"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:ldap > :uid"
+msgid "UID"
+msgstr "UID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:majic_pool > :size"
+msgid "Size"
+msgstr "Size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :icons"
+msgid "Icons"
+msgstr "Icons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:manifest > :theme_color"
+msgid "Theme color"
+msgstr "Theme color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_fonts"
+msgid "Allow fonts"
+msgstr "Allow fonts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_headings"
+msgid "Allow headings"
+msgstr "Allow headings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_inline_images"
+msgid "Allow inline images"
+msgstr "Allow inline images"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :allow_tables"
+msgid "Allow tables"
+msgstr "Allow tables"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :image_quality"
+msgid "Image quality"
+msgstr "Image quality"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :min_content_length"
+msgid "Min content length"
+msgstr "Min content length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_height"
+msgid "Thumbnail max height"
+msgstr "Thumbnail max height"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_width"
+msgid "Thumbnail max width"
+msgstr "Thumbnail max width"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation"
+msgid "Invalidation"
+msgstr "Invalidation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :invalidation > :provider"
+msgid "Provider"
+msgstr "Provider"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts"
+msgid "Advanced MediaProxy Options"
+msgstr "Advanced MediaProxy Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
+msgid "Max body length"
+msgstr "Max body length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
+msgid "Max read duration"
+msgstr "Max read duration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
+msgid "Redirect on failure"
+msgstr "Redirect on failure"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :whitelist"
+msgid "Whitelist"
+msgstr "Whitelist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:modules > :runtime_dir"
+msgid "Runtime dir"
+msgstr "Runtime dir"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :policies"
+msgid "Policies"
+msgstr "Policies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency"
+msgid "MRF transparency"
+msgstr "MRF transparency"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency_exclusions"
+msgid "MRF transparency exclusions"
+msgstr "MRF transparency exclusions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_activity_expiration > :days"
+msgid "Days"
+msgstr "Days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_follow_bot > :follower_nickname"
+msgid "Follower nickname"
+msgstr "Follower nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hashtag > :sensitive"
+msgid "Sensitive"
+msgstr "Sensitive"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :delist_threshold"
+msgid "Delist threshold"
+msgstr "Delist threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_hellthread > :reject_threshold"
+msgid "Reject threshold"
+msgstr "Reject threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_keyword > :replace"
+msgid "Replace"
+msgstr "Replace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_mention > :actors"
+msgid "Actors"
+msgstr "Actors"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_normalize_markup > :scrub_policy"
+msgid "Scrub policy"
+msgstr "Scrub policy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :actions"
+msgid "Actions"
+msgstr "Actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_object_age > :threshold"
+msgid "Threshold"
+msgstr "Threshold"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_direct"
+msgid "Allow direct"
+msgstr "Allow direct"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
+msgid "Allow followers-only"
+msgstr "Allow followers-only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :avatar_removal"
+msgid "Avatar removal"
+msgstr "Avatar removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :banner_removal"
+msgid "Banner removal"
+msgstr "Banner removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :federated_timeline_removal"
+msgid "Federated timeline removal"
+msgstr "Federated timeline removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :followers_only"
+msgid "Followers only"
+msgstr "Followers only"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_nsfw"
+msgid "Media NSFW"
+msgstr "Media NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :media_removal"
+msgid "Media removal"
+msgstr "Media removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :reject_deletes"
+msgid "Reject deletes"
+msgstr "Reject deletes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :report_removal"
+msgid "Report removal"
+msgstr "Report removal"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :hosts"
+msgid "Hosts"
+msgstr "Hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
+msgid "Rejected shortcodes"
+msgstr "Rejected shortcodes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_steal_emoji > :size_limit"
+msgid "Size limit"
+msgstr "Size limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_subchain > :match_actor"
+msgid "Match actor"
+msgstr "Match actor"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :accept"
+msgid "Accept"
+msgstr "Accept"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_vocabulary > :reject"
+msgid "Reject"
+msgstr "Reject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :clean_expired_tokens"
+msgid "Clean expired tokens"
+msgstr "Clean expired tokens"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :issue_new_refresh_token"
+msgid "Issue new refresh token"
+msgstr "Issue new refresh token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:oauth2 > :token_expires_in"
+msgid "Token expires in"
+msgstr "Token expires in"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
+msgid "Fault rate allowance"
+msgstr "Fault rate allowance"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
+msgid "Sleep interval ms"
+msgstr "Sleep interval ms"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :app_account_creation"
+msgid "App account creation"
+msgstr "App account creation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :authentication"
+msgid "Authentication"
+msgstr "Authentication"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relation_id_action"
+msgid "Relation ID action"
+msgstr "Relation ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :relations_actions"
+msgid "Relations actions"
+msgstr "Relations actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :search"
+msgid "Search"
+msgstr "Search"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :status_id_action"
+msgid "Status ID action"
+msgstr "Status ID action"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :statuses_actions"
+msgid "Statuses actions"
+msgstr "Statuses actions"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rate_limit > :timeline"
+msgid "Timeline"
+msgstr "Timeline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Activities"
+msgstr "Activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles"
+msgid "Profiles"
+msgstr "Profiles"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Remote"
+msgstr "Remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines"
+msgid "Timelines"
+msgstr "Timelines"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Federated"
+msgstr "Federated"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Local"
+msgstr "Local"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :failure_backoff"
+msgid "Failure backoff"
+msgstr "Failure backoff"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_hosts"
+msgid "Ignore hosts"
+msgstr "Ignore hosts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ignore_tld"
+msgid "Ignore TLD"
+msgstr "Ignore TLD"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :parsers"
+msgid "Parsers"
+msgstr "Parsers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:rich_media > :ttl_setters"
+msgid "TTL setters"
+msgstr "TTL setters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:static_fe > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer > :overflow_workers"
+msgid "Overflow workers"
+msgstr "Overflow workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:streamer > :workers"
+msgid "Workers"
+msgstr "Workers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:uri_schemes > :valid_schemes"
+msgid "Valid schemes"
+msgstr "Valid schemes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:user > :deny_follow_blocked"
+msgid "Deny follow blocked"
+msgstr "Deny follow blocked"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub"
+msgid "Activity pub"
+msgstr "Activity pub"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub_question"
+msgid "Activity pub question"
+msgstr "Activity pub question"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message"
+msgid "Direct message"
+msgstr "Direct message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :message"
+msgid "Message"
+msgstr "Message"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :direct_message > :sender_nickname"
+msgid "Sender nickname"
+msgstr "Sender nickname"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email"
+msgid "Email"
+msgstr "Email"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :html"
+msgid "Html"
+msgstr "Html"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :sender"
+msgid "Sender"
+msgstr "Sender"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:welcome > :email > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:workers > :retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgid "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+msgstr "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
+msgid "Pleroma.Web.RichMedia.Helpers"
+msgstr "Pleroma.Web.RichMedia.Helpers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
+msgid "Max running"
+msgstr "Max running"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
+msgid "Max waiting"
+msgstr "Max waiting"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :crontab"
+msgid "Crontab"
+msgstr "Crontab"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :log"
+msgid "Log"
+msgstr "Log"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues"
+msgid "Queues"
+msgstr "Queues"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :activity_expiration"
+msgid "Activity expiration"
+msgstr "Activity expiration"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :attachments_cleanup"
+msgid "Attachments cleanup"
+msgstr "Attachments cleanup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :background"
+msgid "Background"
+msgstr "Background"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :backup"
+msgid "Backup"
+msgstr "Backup"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_incoming"
+msgid "Federator incoming"
+msgstr "Federator incoming"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :federator_outgoing"
+msgid "Federator outgoing"
+msgstr "Federator outgoing"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :mailer"
+msgid "Mailer"
+msgstr "Mailer"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :scheduled_activities"
+msgid "Scheduled activities"
+msgstr "Scheduled activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :transmogrifier"
+msgid "Transmogrifier"
+msgstr "Transmogrifier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Oban > :queues > :web_push"
+msgid "Web push"
+msgstr "Web push"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha > :seconds_valid"
+msgid "Seconds valid"
+msgstr "Seconds valid"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :adapter"
+msgid "Adapter"
+msgstr "Adapter"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :enabled"
+msgid "Mailer Enabled"
+msgstr "Mailer Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:access_key"
+msgid "AWS Access Key"
+msgstr "AWS Access Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:region"
+msgid "AWS Region"
+msgstr "AWS Region"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:secret"
+msgid "AWS Secret Key"
+msgstr "AWS Secret Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Dyn-:api_key"
+msgid "Dyn API Key"
+msgstr "Dyn API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Gmail-:access_token"
+msgid "GMail API Access Token"
+msgstr "GMail API Access Token"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:api_key"
+msgid "Mailgun API Key"
+msgstr "Mailgun API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:domain"
+msgid "Domain"
+msgstr "Domain"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:api_key"
+msgid "MailJet Public API Key"
+msgstr "MailJet Public API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:secret"
+msgid "MailJet Private API Key"
+msgstr "MailJet Private API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mandrill-:api_key"
+msgid "Mandrill API Key"
+msgstr "Mandrill API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Postmark-:api_key"
+msgid "Postmark API Key"
+msgstr "Postmark API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
+msgid "AUTH Mode"
+msgstr "AUTH Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
+msgid "Password"
+msgstr "Password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
+msgid "Port"
+msgstr "Port"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
+msgid "Relay"
+msgstr "Relay"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
+msgid "Retries"
+msgstr "Retries"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
+msgid "Use SSL"
+msgstr "Use SSL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
+msgid "STARTTLS Mode"
+msgstr "STARTTLS Mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
+msgid "Username"
+msgstr "Username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendgrid-:api_key"
+msgid "SendGrid API Key"
+msgstr "SendGrid API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_args"
+msgid "Cmd args"
+msgstr "Cmd args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_path"
+msgid "Cmd path"
+msgstr "Cmd path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:qmail"
+msgid "Qmail compat mode"
+msgstr "Qmail compat mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:api_key"
+msgid "SocketLabs API Key"
+msgstr "SocketLabs API Key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:server_id"
+msgid "Server ID"
+msgstr "Server ID"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:api_key"
+msgid "SparkPost API key"
+msgstr "SparkPost API key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:endpoint"
+msgid "Endpoint"
+msgstr "Endpoint"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :logo"
+msgid "Logo"
+msgstr "Logo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling"
+msgid "Styling"
+msgstr "Styling"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :background_color"
+msgid "Background color"
+msgstr "Background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :content_background_color"
+msgid "Content background color"
+msgstr "Content background color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :header_color"
+msgid "Header color"
+msgstr "Header color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :link_color"
+msgid "Link color"
+msgstr "Link color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_color"
+msgid "Text color"
+msgstr "Text color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_muted_color"
+msgid "Text muted color"
+msgstr "Text muted color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :class"
+msgid "Class"
+msgstr "Class"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :extra"
+msgid "Extra"
+msgstr "Extra"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :new_window"
+msgid "New window"
+msgstr "New window"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :rel"
+msgid "Rel"
+msgstr "Rel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :strip_prefix"
+msgid "Strip prefix"
+msgstr "Strip prefix"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :truncate"
+msgid "Truncate"
+msgstr "Truncate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Formatter > :validate_tld"
+msgid "Validate tld"
+msgstr "Validate tld"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
+msgid "Daily user limit"
+msgstr "Daily user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
+msgid "Total user limit"
+msgstr "Total user limit"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :base_url"
+msgid "Base URL"
+msgstr "Base URL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :filename_display_max_length"
+msgid "Filename display max length"
+msgstr "Filename display max length"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :filters"
+msgid "Filters"
+msgstr "Filters"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :link_name"
+msgid "Link name"
+msgstr "Link name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :proxy_remote"
+msgid "Proxy remote"
+msgstr "Proxy remote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload > :uploader"
+msgid "Uploader"
+msgstr "Uploader"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
+msgid "Text"
+msgstr "Text"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
+msgid "Args"
+msgstr "Args"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.Local > :uploads"
+msgid "Uploads"
+msgstr "Uploads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket"
+msgid "Bucket"
+msgstr "Bucket"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
+msgid "Bucket namespace"
+msgstr "Bucket namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
+msgid "Streaming enabled"
+msgstr "Streaming enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
+msgid "Truncated namespace"
+msgstr "Truncated namespace"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :email_blacklist"
+msgid "Email blacklist"
+msgstr "Email blacklist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User > :restricted_nicknames"
+msgid "Restricted nicknames"
+msgstr "Restricted nicknames"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :limit_days"
+msgid "Limit days"
+msgstr "Limit days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.User.Backup > :purge_after_days"
+msgid "Purge after days"
+msgstr "Purge after days"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
+msgid "Strict"
+msgstr "Strict"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
+msgid "Method"
+msgstr "Method"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
+msgid "Options"
+msgstr "Options"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options > :params"
+msgid "Params"
+msgstr "Params"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
+msgid "Script path"
+msgstr "Script path"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
+msgid "URL Format"
+msgstr "URL Format"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
+msgid "Unfurl NSFW"
+msgstr "Unfurl NSFW"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
+msgid "Headers"
+msgstr "Headers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
+msgid "Proxies"
+msgstr "Proxies"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
+msgid "Reserved"
+msgstr "Reserved"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Preload > :providers"
+msgid "Providers"
+msgstr "Providers"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
+msgid "Min lifetime"
+msgstr "Min lifetime"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :private_key"
+msgid "Private key"
+msgstr "Private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :public_key"
+msgid "Public key"
+msgstr "Public key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :web_push_encryption-:vapid_details > :subject"
+msgid "Subject"
+msgstr "Subject"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Authorized fetch mode"
+msgstr "Authorized fetch mode"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :authorized_fetch_mode"
+msgid "Require HTTP signatures on AP fetches"
+msgstr "Require HTTP signatures on AP fetches"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:activitypub > :max_collection_objects"
+msgid "The maximum number of items to fetch from a remote collections. Setting this too low can lead to only getting partial collections, but too high and you can end up fetching far too many objects."
+msgstr ""
+"The maximum number of items to fetch from a remote collections. Setting this "
+"too low can lead to only getting partial collections, but too high and you "
+"can end up fetching far too many objects."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:argos_translate"
+msgid "ArgosTranslate Settings."
+msgstr "ArgosTranslate Settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:argos_translate > :command_argos_translate"
+msgid "command for `argos-translate`. Can be the command if it's in your PATH, or the full path to the file."
+msgstr ""
+"command for `argos-translate`. Can be the command if it's in your PATH, or "
+"the full path to the file."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:argos_translate > :command_argospm"
+msgid "command for `argospm`. Can be the command if it's in your PATH, or the full path to the file."
+msgstr ""
+"command for `argospm`. Can be the command if it's in your PATH, or the full "
+"path to the file."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:argos_translate > :strip_html"
+msgid "Strip html from the post before translating it."
+msgstr "Strip html from the post before translating it."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:deepl"
+msgid "DeepL Settings."
+msgstr "DeepL Settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:deepl > :api_key"
+msgid "API key for DeepL"
+msgstr "API key for DeepL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:deepl > :tier"
+msgid "API Tier"
+msgstr "API Tier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+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 and masto_fe are configured. If you want to add your own configuration your settings all fields must be complete."
+msgstr ""
+"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 and masto_fe are configured. If you want to add your own "
+"configuration your settings all fields must be complete."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :masto_fe"
+msgid "Settings for Masto FE"
+msgstr "Settings for Masto FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :masto_fe > :showInstanceSpecificPanel"
+msgid "Whenether to show the instance's specific panel"
+msgstr "Whenether to show the instance's specific panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :conversationDisplay"
+msgid "How to display conversations (linear or tree)"
+msgstr "How to display conversations (linear or tree)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideSiteFavicon"
+msgid "Whether to hide the instance favicon from the navbar"
+msgstr "Whether to hide the instance favicon from the navbar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideSiteName"
+msgid "Whether to hide the site name from the navbar"
+msgstr "Whether to hide the site name from the navbar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :renderMisskeyMarkdown"
+msgid "Whether to render Misskey-flavoured markdown"
+msgstr "Whether to render Misskey-flavoured markdown"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showNavShortcuts"
+msgid "Whether to put extra navigation options on the navbar"
+msgstr "Whether to put extra navigation options on the navbar"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showPanelNavShortcuts"
+msgid "Whether to put timeline nav tabs on the top of the panel"
+msgstr "Whether to put timeline nav tabs on the top of the panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showWiderShortcuts"
+msgid "Whether to add extra space between navbar icons"
+msgstr "Whether to add extra space between navbar icons"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :stopGifs"
+msgid "Whether to pause animated images until they're hovered on"
+msgstr "Whether to pause animated images until they're hovered on"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :mastodon"
+msgid "Mastodon frontend"
+msgstr "Mastodon frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :mastodon > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :mastodon > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :swagger"
+msgid "Swagger API reference frontend"
+msgstr "Swagger API reference frontend"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :swagger > enabled"
+msgid "Whether to have this enabled at all"
+msgstr "Whether to have this enabled at all"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :swagger > name"
+msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Name of the installed frontend. Valid config must include both `Name` and "
+"`Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :swagger > ref"
+msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
+msgstr ""
+"Reference of the installed frontend to be used. Valid config must include "
+"both `Name` and `Reference` values."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :pool_size"
+msgid "Number of concurrent outbound HTTP requests to allow. Default 50."
+msgstr "Number of concurrent outbound HTTP requests to allow. Default 50."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :pool_timeout"
+msgid "Timeout for initiating HTTP requests (in ms, default 5000)"
+msgstr "Timeout for initiating HTTP requests (in ms, default 5000)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :proxy_url"
+msgid "Proxy URL - of the format http://host:port. Advise setting in .exs instead of admin-fe due to this being set at boot-time."
+msgstr ""
+"Proxy URL - of the format http://host:port. Advise setting in .exs instead "
+"of admin-fe due to this being set at boot-time."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:http > :receive_timeout"
+msgid "Timeout for waiting on remote servers to respond to HTTP requests (in ms, default 15000)"
+msgstr ""
+"Timeout for waiting on remote servers to respond to HTTP requests (in ms, "
+"default 15000)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :export_prometheus_metrics"
+msgid "Enable prometheus metrics (at /api/v1/akkoma/metrics)"
+msgstr "Enable prometheus metrics (at /api/v1/akkoma/metrics)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :languages"
+msgid "Languages the instance uses"
+msgstr "Languages the instance uses"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :local_bubble"
+msgid "List of instances that make up your local bubble (closely-related instances). Used to populate the 'bubble' timeline (domain only)."
+msgstr ""
+"List of instances that make up your local bubble (closely-related instances)"
+". Used to populate the 'bubble' timeline (domain only)."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :privileged_staff"
+msgid "Let moderators access sensitive data (e.g. updating user credentials, get password reset token, delete users, index and read private statuses)"
+msgstr ""
+"Let moderators access sensitive data (e.g. updating user credentials, get "
+"password reset token, delete users, index and read private statuses)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :public"
+msgid "Switching this on will allow unauthenticated users access to all public resources on your instance Switching it off is useful for disabling the Local Timeline and The Whole Known Network. Note: when setting to `false`, please also check `:restrict_unauthenticated` setting."
+msgstr ""
+"Switching this on will allow unauthenticated users access to all public "
+"resources on your instance Switching it off is useful for disabling the "
+"Local Timeline and The Whole Known Network. Note: when setting to `false`, "
+"please also check `:restrict_unauthenticated` setting."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :quarantined_instances"
+msgid "(Deprecated, will be removed in next release) List of ActivityPub instances where activities will not be sent, and the reason for doing so"
+msgstr ""
+"(Deprecated, will be removed in next release) List of ActivityPub instances "
+"where activities will not be sent, and the reason for doing so"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instances_nodeinfo"
+msgid "Control favicons for instances"
+msgstr "Control favicons for instances"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instances_nodeinfo > :enabled"
+msgid "Allow/disallow getting instance nodeinfo"
+msgstr "Allow/disallow getting instance nodeinfo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:libre_translate"
+msgid "LibreTranslate Settings."
+msgstr "LibreTranslate Settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:libre_translate > :api_key"
+msgid "API key for libretranslate"
+msgstr "API key for libretranslate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:libre_translate > :url"
+msgid "URL for libretranslate"
+msgstr "URL for libretranslate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :background_color"
+msgid "Describe the background color of the app - this is only used for mastodon-fe"
+msgstr ""
+"Describe the background color of the app - this is only used for mastodon-fe"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:manifest > :theme_color"
+msgid "Describe the theme color of the app - this is only used for mastodon-fe"
+msgstr "Describe the theme color of the app - this is only used for mastodon-fe"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf > :transparency_obfuscate_domains"
+msgid "Obfuscate domains in MRF transparency. This is useful if the domain you're blocking contains words you don't want displayed, but still want to disclose the MRF settings."
+msgstr ""
+"Obfuscate domains in MRF transparency. This is useful if the domain you're "
+"blocking contains words you don't want displayed, but still want to disclose "
+"the MRF settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_inline_quote"
+msgid "Force quote post URLs inline"
+msgstr "Force quote post URLs inline"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_inline_quote > :prefix"
+msgid "Prefix before the link"
+msgstr "Prefix before the link"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_simple > :handle_threads"
+msgid "Enable to filter replies to threads based from their originating instance, using the reject and accept rules"
+msgstr ""
+"Enable to filter replies to threads based from their originating instance, "
+"using the reject and accept rules"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated"
+msgid "Disallow unauthenticated viewing of timelines, user profiles and statuses."
+msgstr ""
+"Disallow unauthenticated viewing of timelines, user profiles and statuses."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities"
+msgid "Settings for posts."
+msgstr "Settings for posts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :local"
+msgid "Disallow viewing local posts."
+msgstr "Disallow viewing local posts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :remote"
+msgid "Disallow viewing remote posts."
+msgstr "Disallow viewing remote posts."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :local"
+msgid "Disallow viewing local user profiles."
+msgstr "Disallow viewing local user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :remote"
+msgid "Disallow viewing remote user profiles."
+msgstr "Disallow viewing remote user profiles."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :federated"
+msgid "Disallow viewing the whole known network timeline."
+msgstr "Disallow viewing the whole known network timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :local"
+msgid "Disallow viewing the public timeline."
+msgstr "Disallow viewing the public timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:translator"
+msgid "Translation Settings"
+msgstr "Translation Settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:translator > :enabled"
+msgid "Is translation enabled?"
+msgstr "Is translation enabled?"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:translator > :module"
+msgid "Translation module."
+msgstr "Translation module."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:workers > :timeout"
+msgid "Timeout for jobs, per `Oban` queue, in ms"
+msgstr "Timeout for jobs, per `Oban` queue, in ms"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search"
+msgid "General search settings."
+msgstr "General search settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search > :module"
+msgid "Selected search module."
+msgstr "Selected search module."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster"
+msgid "Elasticsearch settings."
+msgstr "Elasticsearch settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :api"
+msgid "The API module used by Elasticsearch. Should always be Elasticsearch.API.HTTP"
+msgstr ""
+"The API module used by Elasticsearch. Should always be Elasticsearch.API.HTTP"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes"
+msgid "The indices to set up in Elasticsearch"
+msgstr "The indices to set up in Elasticsearch"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities"
+msgid "Config for the index to use for activities"
+msgstr "Config for the index to use for activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :bulk_page_size"
+msgid "Size for bulk put requests, mostly used on building the index"
+msgstr "Size for bulk put requests, mostly used on building the index"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :bulk_wait_interval"
+msgid "Time to wait between bulk put requests (in ms)"
+msgstr "Time to wait between bulk put requests (in ms)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :settings"
+msgid "Path to the file containing index settings for the activities index. Should contain a mapping."
+msgstr ""
+"Path to the file containing index settings for the activities index. Should "
+"contain a mapping."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :sources"
+msgid "The internal types to use for this index"
+msgstr "The internal types to use for this index"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :store"
+msgid "The internal store module"
+msgstr "The internal store module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :json_library"
+msgid "The JSON module used to encode/decode when communicating with Elasticsearch"
+msgstr ""
+"The JSON module used to encode/decode when communicating with Elasticsearch"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :password"
+msgid "Password to connect to ES. Set to nil if your cluster is unauthenticated."
+msgstr ""
+"Password to connect to ES. Set to nil if your cluster is unauthenticated."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :url"
+msgid "Elasticsearch URL."
+msgstr "Elasticsearch URL."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :username"
+msgid "Username to connect to ES. Set to nil if your cluster is unauthenticated."
+msgstr ""
+"Username to connect to ES. Set to nil if your cluster is unauthenticated."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Meilisearch"
+msgid "Meilisearch settings."
+msgstr "Meilisearch settings."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Meilisearch > :initial_indexing_chunk_size"
+msgid "Amount of posts in a batch when running the initial indexing operation. Should probably not be more than 100000 since there's a limit on maximum insert size"
+msgstr ""
+"Amount of posts in a batch when running the initial indexing operation. "
+"Should probably not be more than 100000 since there's a limit on maximum "
+"insert size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Meilisearch > :private_key"
+msgid "Private key for meilisearch authentication, or `nil` to disable private key authentication."
+msgstr ""
+"Private key for meilisearch authentication, or `nil` to disable private key "
+"authentication."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Search.Meilisearch > :url"
+msgid "Meilisearch URL."
+msgstr "Meilisearch URL."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata.Providers.Theme"
+msgid "Specific provider to hand out themes to instances that scrape index.html"
+msgstr ""
+"Specific provider to hand out themes to instances that scrape index.html"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-Pleroma.Web.Metadata.Providers.Theme > :theme_color"
+msgid "The 'accent color' of the instance, used in places like misskey's instance ticker"
+msgstr ""
+"The 'accent color' of the instance, used in places like misskey's instance "
+"ticker"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:activitypub > :max_collection_objects"
+msgid "Max collection objects"
+msgstr "Max collection objects"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:argos_translate"
+msgid "Argos translate"
+msgstr "Argos translate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:argos_translate > :command_argos_translate"
+msgid "Command argos translate"
+msgstr "Command argos translate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:argos_translate > :command_argospm"
+msgid "Command argospm"
+msgstr "Command argospm"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:argos_translate > :strip_html"
+msgid "Strip html"
+msgstr "Strip html"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:deepl"
+msgid "DeepL"
+msgstr "DeepL"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:deepl > :api_key"
+msgid "Api key"
+msgstr "Api key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:deepl > :tier"
+msgid "Tier"
+msgstr "Tier"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :masto_fe"
+msgid "Masto FE"
+msgstr "Masto FE"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :masto_fe > :showInstanceSpecificPanel"
+msgid "Show instance specific panel"
+msgstr "Show instance specific panel"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :conversationDisplay"
+msgid "Conversation display style"
+msgstr "Conversation display style"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideSiteFavicon"
+msgid "Hide site favicon"
+msgstr "Hide site favicon"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideSiteName"
+msgid "Hide site name"
+msgstr "Hide site name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :renderMisskeyMarkdown"
+msgid "Render misskey markdown"
+msgstr "Render misskey markdown"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showNavShortcuts"
+msgid "Show navbar shortcuts"
+msgstr "Show navbar shortcuts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showPanelNavShortcuts"
+msgid "Show timeline panel nav shortcuts"
+msgstr "Show timeline panel nav shortcuts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showWiderShortcuts"
+msgid "Increase navbar shortcut spacing"
+msgstr "Increase navbar shortcut spacing"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :stopGifs"
+msgid "Stop Gifs"
+msgstr "Stop Gifs"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :mastodon"
+msgid "Mastodon"
+msgstr "Mastodon"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :mastodon > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :mastodon > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :swagger"
+msgid "Swagger"
+msgstr "Swagger"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :swagger > enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :swagger > name"
+msgid "Name"
+msgstr "Name"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :swagger > ref"
+msgid "Reference"
+msgstr "Reference"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :pool_size"
+msgid "Pool size"
+msgstr "Pool size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :pool_timeout"
+msgid "HTTP Pool Request Timeout"
+msgstr "HTTP Pool Request Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:http > :receive_timeout"
+msgid "HTTP Receive Timeout"
+msgstr "HTTP Receive Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :export_prometheus_metrics"
+msgid "Export prometheus metrics"
+msgstr "Export prometheus metrics"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :languages"
+msgid "Languages"
+msgstr "Languages"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :local_bubble"
+msgid "Local bubble"
+msgstr "Local bubble"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_nodeinfo"
+msgid "Instances nodeinfo"
+msgstr "Instances nodeinfo"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instances_nodeinfo > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:libre_translate"
+msgid "Libre translate"
+msgstr "Libre translate"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:libre_translate > :api_key"
+msgid "Api key"
+msgstr "Api key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:libre_translate > :url"
+msgid "Url"
+msgstr "Url"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf > :transparency_obfuscate_domains"
+msgid "MRF domain obfuscation"
+msgstr "MRF domain obfuscation"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_inline_quote"
+msgid "MRF Inline Quote"
+msgstr "MRF Inline Quote"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_inline_quote > :prefix"
+msgid "Prefix"
+msgstr "Prefix"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_simple > :handle_threads"
+msgid "Apply to entire threads"
+msgstr "Apply to entire threads"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:translator"
+msgid "Translator"
+msgstr "Translator"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:translator > :enabled"
+msgid "Enabled"
+msgstr "Enabled"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:translator > :module"
+msgid "Module"
+msgstr "Module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:workers > :timeout"
+msgid "Timeout"
+msgstr "Timeout"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search"
+msgid "Search"
+msgstr "Search"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search > :module"
+msgid "Module"
+msgstr "Module"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster"
+msgid "Elasticsearch"
+msgstr "Elasticsearch"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :api"
+msgid "Api"
+msgstr "Api"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes"
+msgid "Indexes"
+msgstr "Indexes"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities"
+msgid "Activities"
+msgstr "Activities"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :bulk_page_size"
+msgid "Bulk page size"
+msgstr "Bulk page size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :bulk_wait_interval"
+msgid "Bulk wait interval"
+msgstr "Bulk wait interval"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :settings"
+msgid "Settings"
+msgstr "Settings"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :sources"
+msgid "Sources"
+msgstr "Sources"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :indexes > :activities > :store"
+msgid "Store"
+msgstr "Store"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :json_library"
+msgid "Json library"
+msgstr "Json library"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :password"
+msgid "Password"
+msgstr "Password"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :url"
+msgid "Url"
+msgstr "Url"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Elasticsearch.Cluster > :username"
+msgid "Username"
+msgstr "Username"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Meilisearch"
+msgid "Pleroma.Search.Meilisearch"
+msgstr "Pleroma.Search.Meilisearch"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Meilisearch > :initial_indexing_chunk_size"
+msgid "Initial indexing chunk size"
+msgstr "Initial indexing chunk size"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Meilisearch > :private_key"
+msgid "Private key"
+msgstr "Private key"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Search.Meilisearch > :url"
+msgid "Url"
+msgstr "Url"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata.Providers.Theme"
+msgid "Pleroma.Web.Metadata.Providers.Theme"
+msgstr "Pleroma.Web.Metadata.Providers.Theme"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-Pleroma.Web.Metadata.Providers.Theme > :theme_color"
+msgid "Theme color"
+msgstr "Theme color"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :healthcheck"
+msgid "If enabled, system data will be shown on `/api/v1/pleroma/healthcheck`"
+msgstr "If enabled, system data will be shown on `/api/v1/pleroma/healthcheck`"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:frontends > :pickable"
+msgid "A list containing all frontends users can pick as their preference, format is :name/:ref, e.g pleroma-fe/stable."
+msgstr ""
+"A list containing all frontends users can pick as their preference, format "
+"is :name/:ref, e.g pleroma-fe/stable."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:instance > :federated_timeline_available"
+msgid "Let people view the 'firehose' feed of all public statuses from all instances."
+msgstr ""
+"Let people view the 'firehose' feed of all public statuses from all "
+"instances."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :blocklist"
+msgid "List of hosts with scheme which will not go through the MediaProxy, and will not be explicitly allowed by the Content-Security-Policy.\nThis is to be used for instances where you do not want their media to go through your server or to be accessed by clients.\n"
+msgstr ""
+"List of hosts with scheme which will not go through the MediaProxy, and will "
+"not be explicitly allowed by the Content-Security-Policy.\n"
+"This is to be used for instances where you do not want their media to go "
+"through your server or to be accessed by clients.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:media_proxy > :whitelist"
+msgid "List of hosts with scheme to bypass the MediaProxy.\n\nThe media will be fetched by the client, directly from the remote server.\n\nTo allow this, it will Content-Security-Policy exceptions for each instance listed.\n\nThis is to be used for instances you trust and do not want to cache media for.\n"
+msgstr ""
+"List of hosts with scheme to bypass the MediaProxy.\n"
+"\n"
+"The media will be fetched by the client, directly from the remote server.\n"
+"\n"
+"To allow this, it will Content-Security-Policy exceptions for each instance "
+"listed.\n"
+"\n"
+"This is to be used for instances you trust and do not want to cache media "
+"for.\n"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_reject_newly_created_account_notes"
+msgid "Reject notes from accounts created too recently"
+msgstr "Reject notes from accounts created too recently"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:mrf_reject_newly_created_account_notes > :age"
+msgid "Time below which to reject (in seconds)"
+msgstr "Time below which to reject (in seconds)"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :bubble"
+msgid "Disallow viewing the bubble timeline."
+msgstr "Disallow viewing the bubble timeline."
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:frontends > :pickable"
+msgid "Pickable"
+msgstr "Pickable"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:instance > :federated_timeline_available"
+msgid "Federated timeline available"
+msgstr "Federated timeline available"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:media_proxy > :blocklist"
+msgid "Blocklist"
+msgstr "Blocklist"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_reject_newly_created_account_notes"
+msgid "MRF Reject New Accounts"
+msgstr "MRF Reject New Accounts"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:mrf_reject_newly_created_account_notes > :age"
+msgid "Age"
+msgstr "Age"
+
+#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format, fuzzy
+msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :bubble"
+msgid "Bubble"
+msgstr "Bubble"
diff --git a/priv/gettext/pt/LC_MESSAGES/errors.po b/priv/gettext/pt/LC_MESSAGES/errors.po
new file mode 100644
index 000000000..b38ed04cd
--- /dev/null
+++ b/priv/gettext/pt/LC_MESSAGES/errors.po
@@ -0,0 +1,657 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-03-18 12:55+0000\n"
+"PO-Revision-Date: 2024-03-19 01:10+0000\n"
+"Last-Translator: Jammer Lammer \n"
+"Language-Team: Portuguese \n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.18.2\n"
+
+## This file is a PO Template file.
+##
+## `msgid`s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run `mix gettext.extract` to bring this file up to
+## date. Leave `msgstr`s empty as changing them here as no
+## effect: edit them in PO (`.po`) files instead.
+## From Ecto.Changeset.cast/4
+msgid "can't be blank"
+msgstr "não pode estar em branco"
+
+## From Ecto.Changeset.unique_constraint/3
+msgid "has already been taken"
+msgstr "já está em uso"
+
+## From Ecto.Changeset.put_change/3
+msgid "is invalid"
+msgstr "é inválido"
+
+## From Ecto.Changeset.validate_format/3
+msgid "has invalid format"
+msgstr "tem um formato inválido"
+
+## From Ecto.Changeset.validate_subset/3
+msgid "has an invalid entry"
+msgstr "tem uma entrada inválida"
+
+## From Ecto.Changeset.validate_exclusion/3
+msgid "is reserved"
+msgstr "está reservado"
+
+## From Ecto.Changeset.validate_confirmation/3
+msgid "does not match confirmation"
+msgstr "a confirmação não coincide"
+
+## From Ecto.Changeset.no_assoc_constraint/3
+msgid "is still associated with this entry"
+msgstr "ainda está associado com essa entrada"
+
+msgid "are still associated with this entry"
+msgstr "ainda estão associados com essa entrada"
+
+## From Ecto.Changeset.validate_length/3
+msgid "should be %{count} character(s)"
+msgid_plural "should be %{count} character(s)"
+msgstr[0] "deve ser %{count} caractere"
+msgstr[1] "deve ser %{count} caracteres"
+
+msgid "should have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] "deve ter %{count} item"
+msgstr[1] "deve ter %{count} itens"
+
+msgid "should be at least %{count} character(s)"
+msgid_plural "should be at least %{count} character(s)"
+msgstr[0] "deve ter pelo menos %{count} caractere"
+msgstr[1] "deve ter pelo menos %{count} caracteres"
+
+msgid "should have at least %{count} item(s)"
+msgid_plural "should have at least %{count} item(s)"
+msgstr[0] "deve ter pelo menos %{count} item"
+msgstr[1] "deve ter pelo menos %{count} itens"
+
+msgid "should be at most %{count} character(s)"
+msgid_plural "should be at most %{count} character(s)"
+msgstr[0] "deve ter no máximo %{count} caractere"
+msgstr[1] "deve ter no máximo %{count} caracteres"
+
+msgid "should have at most %{count} item(s)"
+msgid_plural "should have at most %{count} item(s)"
+msgstr[0] "deve ter no máximo %{count} item"
+msgstr[1] "deve ter no máximo %{count} itens"
+
+## From Ecto.Changeset.validate_number/3
+msgid "must be less than %{number}"
+msgstr "deve ser menor que %{number}"
+
+msgid "must be greater than %{number}"
+msgstr "deve ser maior que %{number}"
+
+msgid "must be less than or equal to %{number}"
+msgstr "deve ser menor ou igual a %{number}"
+
+msgid "must be greater than or equal to %{number}"
+msgstr "deve ser maior ou igual a %{number}"
+
+msgid "must be equal to %{number}"
+msgstr "deve ser igual a %{number}"
+
+#: lib/pleroma/web/common_api.ex:503
+#, elixir-autogen, elixir-format
+msgid "Account not found"
+msgstr "Conta não encontrada"
+
+#: lib/pleroma/web/common_api.ex:263
+#, elixir-autogen, elixir-format
+msgid "Already voted"
+msgstr "Já votado"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:427
+#, elixir-autogen, elixir-format
+msgid "Bad request"
+msgstr "Má requisição"
+
+#: lib/pleroma/web/controller_helper.ex:105
+#, elixir-autogen, elixir-format
+msgid "Can't display this activity"
+msgstr "Não é possível mostrar essa atividade"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:335
+#, elixir-autogen, elixir-format
+msgid "Can't find user"
+msgstr "Não é possível encontrar o usuário"
+
+#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:61
+#, elixir-autogen, elixir-format
+msgid "Can't get favorites"
+msgstr "Não é possível obter os favoritos"
+
+#: lib/pleroma/web/common_api/utils.ex:480
+#, elixir-autogen, elixir-format
+msgid "Cannot post an empty status without attachments"
+msgstr "Não é possível publicar um status vazio sem anexos"
+
+#: lib/pleroma/web/common_api/utils.ex:468
+#, elixir-autogen, elixir-format
+msgid "Comment must be up to %{max_size} characters"
+msgstr "Comentários devem ter no máximo %{max_size} caracteres"
+
+#: lib/pleroma/config_db.ex:199
+#, elixir-autogen, elixir-format
+msgid "Config with params %{params} not found"
+msgstr "Configuração com parâmetros %{params} não encontrada"
+
+#: lib/pleroma/web/common_api.ex:114
+#: lib/pleroma/web/common_api.ex:118
+#, elixir-autogen, elixir-format
+msgid "Could not delete"
+msgstr "Não foi possível apagar"
+
+#: lib/pleroma/web/common_api.ex:164
+#, elixir-autogen, elixir-format
+msgid "Could not favorite"
+msgstr "Não foi possível favoritar"
+
+#: lib/pleroma/web/common_api.ex:201
+#, elixir-autogen, elixir-format
+msgid "Could not unfavorite"
+msgstr "Não foi possível eliminar favorito"
+
+#: lib/pleroma/web/common_api.ex:149
+#, elixir-autogen, elixir-format
+msgid "Could not unrepeat"
+msgstr "Não foi possível republicar"
+
+#: lib/pleroma/web/common_api.ex:510
+#: lib/pleroma/web/common_api.ex:519
+#, elixir-autogen, elixir-format
+msgid "Could not update state"
+msgstr "Não foi possível atualizar estado"
+
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:278
+#, elixir-autogen, elixir-format
+msgid "Error."
+msgstr "Erro."
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:104
+#, elixir-autogen, elixir-format
+msgid "Invalid CAPTCHA"
+msgstr "CAPTCHA inválido"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:143
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:660
+#, elixir-autogen, elixir-format
+msgid "Invalid credentials"
+msgstr "Credenciais inválidas"
+
+#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:42
+#, elixir-autogen, elixir-format
+msgid "Invalid credentials."
+msgstr "Credenciais inválidas."
+
+#: lib/pleroma/web/common_api.ex:284
+#, elixir-autogen, elixir-format
+msgid "Invalid indices"
+msgstr "Índices inválidos"
+
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:29
+#, elixir-autogen, elixir-format
+msgid "Invalid parameters"
+msgstr "Parâmetros inválidos"
+
+#: lib/pleroma/web/common_api/utils.ex:376
+#, elixir-autogen, elixir-format
+msgid "Invalid password."
+msgstr "Senha inválida."
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:265
+#, elixir-autogen, elixir-format
+msgid "Invalid request"
+msgstr "Requisição inválida"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:107
+#, elixir-autogen, elixir-format
+msgid "Kocaptcha service unavailable"
+msgstr "Serviço de Kocaptcha indisponível"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:139
+#, elixir-autogen, elixir-format
+msgid "Missing parameters"
+msgstr "Parâmetros faltando"
+
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:151
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:177
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:219
+#, elixir-autogen, elixir-format
+msgid "No such permission_group"
+msgstr "Não a tal permission_group"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:480
+#: 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:70
+#: lib/pleroma/web/o_status/o_status_controller.ex:135
+#: lib/pleroma/web/plugs/uploaded_media.ex:83
+#, elixir-autogen, elixir-format
+msgid "Not found"
+msgstr "Não encontrado"
+
+#: lib/pleroma/web/common_api.ex:255
+#, elixir-autogen, elixir-format
+msgid "Poll's author can't vote"
+msgstr "Autor da enquete não pode votar"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:478
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:39
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:51
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:52
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71
+#, elixir-autogen, elixir-format
+msgid "Record not found"
+msgstr "Registro não encontrado"
+
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:35
+#: lib/pleroma/web/feed/user_controller.ex:79
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:42
+#: lib/pleroma/web/o_status/o_status_controller.ex:141
+#, elixir-autogen, elixir-format
+msgid "Something went wrong"
+msgstr "Algo deu errado"
+
+#: lib/pleroma/web/common_api/activity_draft.ex:156
+#, elixir-autogen, elixir-format
+msgid "The message visibility must be direct"
+msgstr "A visibilidade da mensagem deve ser direta"
+
+#: lib/pleroma/web/common_api/utils.ex:490
+#, elixir-autogen, elixir-format
+msgid "The status is over the character limit"
+msgstr "O status está acima do limite de caracteres"
+
+#: lib/pleroma/web/plugs/ensure_public_or_authenticated_plug.ex:36
+#, elixir-autogen, elixir-format
+msgid "This resource requires authentication."
+msgstr "Esse recurso requer autenticação."
+
+#: lib/pleroma/web/plugs/rate_limiter.ex:214
+#, elixir-autogen, elixir-format
+msgid "Throttled"
+msgstr "Limitado"
+
+#: lib/pleroma/web/common_api.ex:285
+#, elixir-autogen, elixir-format
+msgid "Too many choices"
+msgstr "Muitas opções"
+
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:248
+#, elixir-autogen, elixir-format
+msgid "You can't revoke your own admin status."
+msgstr "Você não pode revogar seu próprio status de administrador."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:267
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:358
+#, elixir-autogen, elixir-format
+msgid "Your account is currently disabled"
+msgstr "Sua conta está atualmente desativada"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:229
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:381
+#, elixir-autogen, elixir-format
+msgid "Your login is missing a confirmed e-mail address"
+msgstr "Sua conta não possui uma endereço de email confirmado"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:368
+#, elixir-autogen, elixir-format
+msgid "can't read inbox of %{nickname} as %{as_nickname}"
+msgstr "não é possível ler o inbox de %{nickname} como %{as_nickname}"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:467
+#, elixir-autogen, elixir-format
+msgid "can't update outbox of %{nickname} as %{as_nickname}"
+msgstr "não é possível atualizar o inbox de %{nickname} como %{nickname}"
+
+#: lib/pleroma/web/common_api.ex:455
+#, elixir-autogen, elixir-format
+msgid "conversation is already muted"
+msgstr "a conversa já está silenciada"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:486
+#, elixir-autogen, elixir-format
+msgid "error"
+msgstr "erro"
+
+#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:34
+#, elixir-autogen, elixir-format
+msgid "mascots can only be images"
+msgstr "mascotes só podem ser imagens"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:62
+#, elixir-autogen, elixir-format
+msgid "not found"
+msgstr "não encontrado"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:462
+#, elixir-autogen, elixir-format
+msgid "Bad OAuth request."
+msgstr "Requisição de OAuth inválida."
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:113
+#, elixir-autogen, elixir-format
+msgid "CAPTCHA already used"
+msgstr "CAPTCHA já está em uso"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:110
+#, elixir-autogen, elixir-format
+msgid "CAPTCHA expired"
+msgstr "CAPTCHA expirado"
+
+#: lib/pleroma/web/plugs/uploaded_media.ex:56
+#, elixir-autogen, elixir-format
+msgid "Failed"
+msgstr "Falhou"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:478
+#, elixir-autogen, elixir-format
+msgid "Failed to authenticate: %{message}."
+msgstr "Falha ao autenticar: %{message}."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:509
+#, elixir-autogen, elixir-format
+msgid "Failed to set up user account."
+msgstr "Falha ao definir conta de usuário."
+
+#: lib/pleroma/web/plugs/o_auth_scopes_plug.ex:37
+#, elixir-autogen, elixir-format
+msgid "Insufficient permissions: %{permissions}."
+msgstr "Permissões insuficientes: %{permissions}."
+
+#: lib/pleroma/web/plugs/uploaded_media.ex:98
+#, elixir-autogen, elixir-format
+msgid "Internal Error"
+msgstr "Erro Interno"
+
+#: 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 "Usuário/Senha Inválidos"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:116
+#, elixir-autogen, elixir-format
+msgid "Invalid answer data"
+msgstr "dado de resposta inválido"
+
+#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:40
+#, elixir-autogen, elixir-format
+msgid "Nodeinfo schema version not handled"
+msgstr "Esquema de versão do Nodeinfo não tratado"
+
+#: lib/pleroma/web/o_auth/fallback_controller.ex:14
+#, elixir-autogen, elixir-format
+msgid "Unknown error, please check the details and try again."
+msgstr "Erro desconhecido. Por favor, cheque os detalhes e tente novamente."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:158
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:204
+#, elixir-autogen, elixir-format
+msgid "Unlisted redirect_uri."
+msgstr "redirect_uri Não listada."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:458
+#, elixir-autogen, elixir-format
+msgid "Unsupported OAuth provider: %{provider}."
+msgstr "Provedor de OAuth não suportado: %{provider}."
+
+#: lib/pleroma/uploaders/uploader.ex:74
+#, elixir-autogen, elixir-format
+msgid "Uploader callback timeout"
+msgstr "Tempo esgotado para callback do uploader"
+
+#: lib/pleroma/web/uploader_controller.ex:23
+#, elixir-autogen, elixir-format
+msgid "bad request"
+msgstr "má requisição"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:101
+#, elixir-autogen, elixir-format
+msgid "CAPTCHA Error"
+msgstr "Erro no CAPTCHA"
+
+#: lib/pleroma/web/common_api.ex:213
+#, elixir-autogen, elixir-format
+msgid "Could not add reaction emoji"
+msgstr "Não foi possível adicionar emoji de reação"
+
+#: lib/pleroma/web/common_api.ex:224
+#, elixir-autogen, elixir-format
+msgid "Could not remove reaction emoji"
+msgstr "Não foi possível remover emoji de reação"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:127
+#, elixir-autogen, elixir-format
+msgid "Invalid CAPTCHA (Missing parameter: %{name})"
+msgstr "CAPTCHA inválido (Parâmetro faltando: %{name})"
+
+#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:96
+#, elixir-autogen, elixir-format
+msgid "List not found"
+msgstr "Lista não encontrada"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:150
+#, elixir-autogen, elixir-format
+msgid "Missing parameter: %{name}"
+msgstr "Parâmetro faltando: %{name}"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:256
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:371
+#, elixir-autogen, elixir-format
+msgid "Password reset is required"
+msgstr "Redefinição de senha é necessária"
+
+#: 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
+#: lib/pleroma/web/admin_api/controllers/announcement_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/config_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/frontend_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/instance_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/instance_document_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/invite_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/o_auth_app_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/relay_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/status_controller.ex:6
+#: lib/pleroma/web/admin_api/controllers/user_controller.ex:6
+#: lib/pleroma/web/akkoma_api/controllers/frontend_settings_controller.ex:2
+#: lib/pleroma/web/akkoma_api/controllers/frontend_switcher.ex:2
+#: lib/pleroma/web/akkoma_api/controllers/metrics_controller.ex:2
+#: lib/pleroma/web/akkoma_api/controllers/translation_controller.ex:2
+#: lib/pleroma/web/controller_helper.ex:6
+#: lib/pleroma/web/embed_controller.ex:6
+#: lib/pleroma/web/fallback/redirect_controller.ex:6
+#: lib/pleroma/web/feed/tag_controller.ex:6
+#: lib/pleroma/web/feed/user_controller.ex:6
+#: lib/pleroma/web/mailer/subscription_controller.ex:6
+#: lib/pleroma/web/manifest_controller.ex:6
+#: lib/pleroma/web/masto_fe_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/app_controller.ex:11
+#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/directory_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14
+#: lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7
+#: lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:3
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6
+#: lib/pleroma/web/media_proxy/media_proxy_controller.ex:6
+#: lib/pleroma/web/mongoose_im/mongoose_im_controller.ex:6
+#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6
+#: lib/pleroma/web/o_auth/fallback_controller.ex:6
+#: lib/pleroma/web/o_auth/mfa_controller.ex:10
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:6
+#: lib/pleroma/web/o_status/o_status_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/app_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/backup_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/instances_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/notification_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/report_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7
+#: lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex:6
+#: lib/pleroma/web/static_fe/static_fe_controller.ex:6
+#: lib/pleroma/web/twitter_api/controller.ex:6
+#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10
+#: lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6
+#: 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 ""
+"Violação de segurança: Verificação do escopo do OAuth tanto não lidou quanto "
+"não explicitamente pulou."
+
+#: 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 ""
+"Autenticação de dois-fatores ativada, você deve usar um token de acesso."
+
+#: 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 "Inscrição de web push está desativada nessa instância do Akkoma"
+
+#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:214
+#, elixir-autogen, elixir-format
+msgid "You can't revoke your own admin/moderator status."
+msgstr "Você não pode revogar o seu próprio status de admin/moderador."
+
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:202
+#, elixir-autogen, elixir-format
+msgid "authorization required for timeline view"
+msgstr "autorização necessária para visualização da linha do tempo"
+
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:24
+#, elixir-autogen, elixir-format
+msgid "Access denied"
+msgstr "Acesso negado"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:332
+#, elixir-autogen, elixir-format
+msgid "This API requires an authenticated user"
+msgstr "Essa API necessita de um usuário autentica"
+
+#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:26
+#: lib/pleroma/web/plugs/user_is_admin_plug.ex:21
+#, elixir-autogen, elixir-format
+msgid "User is not an admin."
+msgstr "Usuário não é um administrador."
+
+#: 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] "Última exportação foi a menos de um dia atrás"
+msgstr[1] "Última exportação foi a menos de %{days} atrás"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:399
+#, elixir-autogen, elixir-format
+msgid "Character limit (%{limit} characters) exceeded, contains %{length} characters"
+msgstr ""
+"Limite de caracteres (%{limit} caracteres) excedido, pois contém %{length} "
+"caracteres"
+
+#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:33
+#: lib/pleroma/web/plugs/user_is_staff_plug.ex:20
+#, elixir-autogen, elixir-format
+msgid "User is not a staff member."
+msgstr "Usuário não é um membro da staff."
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:391
+#, elixir-autogen, elixir-format
+msgid "Your account is awaiting approval."
+msgstr "Sua conta aguarda aprovação."
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:256
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:259
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:262
+#, elixir-autogen, elixir-format
+msgid "File is too large"
+msgstr "Arquivo muito grande"
+
+#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:37
+#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:48
+#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:59
+#, elixir-autogen, elixir-format
+msgid "Hashtag not found"
+msgstr "Hashtag não encontrada"
+
+#: lib/pleroma/web/common_api/activity_draft.ex:144
+#, elixir-autogen, elixir-format
+msgid "Invalid language"
+msgstr "Idioma inválido"
+
+#: lib/pleroma/web/o_auth/o_auth_controller.ex:218
+#, elixir-autogen, elixir-format
+msgid "This action is outside of authorized scopes"
+msgstr "Essa ação está fora do escopo autorizado"
+
+#: lib/pleroma/web/common_api/activity_draft.ex:129
+#, elixir-autogen, elixir-format
+msgid "You can only quote public or unlisted statuses"
+msgstr "Você pode apenas citar status públicos ou não-listados"
+
+#: lib/pleroma/web/common_api/activity_draft.ex:126
+#, elixir-autogen, elixir-format
+msgid "You can't quote a status that doesn't exist"
+msgstr "Você não pode citar um status que não existe"
+
+#: lib/pleroma/web/embed_controller.ex:35
+#, elixir-autogen, elixir-format
+msgid "Federated posts cannot be embedded"
+msgstr "Publicações federadas não podem ser embutidas"
+
+#: lib/pleroma/web/embed_controller.ex:38
+#, elixir-autogen, elixir-format
+msgid "Not authorized to view this post"
+msgstr "Não autorizado a ver essa publicação"
+
+#: lib/pleroma/web/embed_controller.ex:32
+#, elixir-autogen, elixir-format
+msgid "Post not found"
+msgstr "Publicação não encontrada"
diff --git a/priv/gettext/pt/LC_MESSAGES/posix_errors.po b/priv/gettext/pt/LC_MESSAGES/posix_errors.po
new file mode 100644
index 000000000..3e11a9987
--- /dev/null
+++ b/priv/gettext/pt/LC_MESSAGES/posix_errors.po
@@ -0,0 +1,163 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2024-03-17 22:50+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Translate Toolkit 3.9.2\n"
+
+## This file is a PO Template file.
+##
+## `msgid`s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run `mix gettext.extract` to bring this file up to
+## date. Leave `msgstr`s empty as changing them here as no
+## effect: edit them in PO (`.po`) files instead.
+msgid "eperm"
+msgstr ""
+
+msgid "eacces"
+msgstr ""
+
+msgid "eagain"
+msgstr ""
+
+msgid "ebadf"
+msgstr ""
+
+msgid "ebadmsg"
+msgstr ""
+
+msgid "ebusy"
+msgstr ""
+
+msgid "edeadlk"
+msgstr ""
+
+msgid "edeadlock"
+msgstr ""
+
+msgid "edquot"
+msgstr ""
+
+msgid "eexist"
+msgstr ""
+
+msgid "efault"
+msgstr ""
+
+msgid "efbig"
+msgstr ""
+
+msgid "eftype"
+msgstr ""
+
+msgid "eintr"
+msgstr ""
+
+msgid "einval"
+msgstr ""
+
+msgid "eio"
+msgstr ""
+
+msgid "eisdir"
+msgstr ""
+
+msgid "eloop"
+msgstr ""
+
+msgid "emfile"
+msgstr ""
+
+msgid "emlink"
+msgstr ""
+
+msgid "emultihop"
+msgstr ""
+
+msgid "enametoolong"
+msgstr ""
+
+msgid "enfile"
+msgstr ""
+
+msgid "enobufs"
+msgstr ""
+
+msgid "enodev"
+msgstr ""
+
+msgid "enolck"
+msgstr ""
+
+msgid "enolink"
+msgstr ""
+
+msgid "enoent"
+msgstr ""
+
+msgid "enomem"
+msgstr ""
+
+msgid "enospc"
+msgstr ""
+
+msgid "enosr"
+msgstr ""
+
+msgid "enostr"
+msgstr ""
+
+msgid "enosys"
+msgstr ""
+
+msgid "enotblk"
+msgstr ""
+
+msgid "enotdir"
+msgstr ""
+
+msgid "enotsup"
+msgstr ""
+
+msgid "enxio"
+msgstr ""
+
+msgid "eopnotsupp"
+msgstr ""
+
+msgid "eoverflow"
+msgstr ""
+
+msgid "epipe"
+msgstr ""
+
+msgid "erange"
+msgstr ""
+
+msgid "erofs"
+msgstr ""
+
+msgid "espipe"
+msgstr ""
+
+msgid "esrch"
+msgstr ""
+
+msgid "estale"
+msgstr ""
+
+msgid "etxtbsy"
+msgstr ""
+
+msgid "exdev"
+msgstr ""
From ad7dcf38a854ac762c812eae1ea5f8ba6b707cd6 Mon Sep 17 00:00:00 2001
From: FloatingGhost
Date: Fri, 15 Dec 2023 17:12:45 +0000
Subject: [PATCH 071/153] Add HTTP backoff cache to respect 429s
---
lib/pleroma/application.ex | 3 +-
lib/pleroma/http/backoff.ex | 57 +++++++++++++++++++++++++++++++++++
lib/pleroma/object/fetcher.ex | 2 +-
lib/pleroma/web/web_finger.ex | 5 +--
4 files changed, 63 insertions(+), 4 deletions(-)
create mode 100644 lib/pleroma/http/backoff.ex
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 28a86d0aa..25fb11660 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -179,7 +179,8 @@ defp cachex_children do
build_cachex("translations", default_ttl: :timer.hours(24 * 30), limit: 2500),
build_cachex("instances", default_ttl: :timer.hours(24), ttl_interval: 1000, limit: 2500),
build_cachex("request_signatures", default_ttl: :timer.hours(24 * 30), limit: 3000),
- build_cachex("rel_me", default_ttl: :timer.hours(24 * 30), limit: 300)
+ build_cachex("rel_me", default_ttl: :timer.hours(24 * 30), limit: 300),
+ build_cachex("http_backoff", default_ttl: :timer.hours(24 * 30), limit: 10000)
]
end
diff --git a/lib/pleroma/http/backoff.ex b/lib/pleroma/http/backoff.ex
new file mode 100644
index 000000000..d51c0547a
--- /dev/null
+++ b/lib/pleroma/http/backoff.ex
@@ -0,0 +1,57 @@
+defmodule Pleroma.HTTP.Backoff do
+ alias Pleroma.HTTP
+ require Logger
+
+ @cachex Pleroma.Config.get([:cachex, :provider], Cachex)
+ @backoff_cache :http_backoff_cache
+
+ defp next_backoff_timestamp(%{headers: headers}) when is_list(headers) do
+ # figure out from the 429 response when we can make the next request
+ # mastodon uses the x-ratelimit-reset header, so we will use that!
+ # other servers may not, so we'll default to 5 minutes from now if we can't find it
+ case Enum.find_value(headers, fn {"x-ratelimit-reset", value} -> value end) do
+ nil ->
+ DateTime.utc_now()
+ |> Timex.shift(seconds: 5 * 60)
+
+ value ->
+ {:ok, stamp} = DateTime.from_iso8601(value)
+ stamp
+ end
+ end
+
+ defp next_backoff_timestamp(_), do: DateTime.utc_now() |> Timex.shift(seconds: 5 * 60)
+
+ def get(url, headers \\ [], options \\ []) do
+ # this acts as a single throughput for all GET requests
+ # we will check if the host is in the cache, and if it is, we will automatically fail the request
+ # this ensures that we don't hammer the server with requests, and instead wait for the backoff to expire
+ # this is a very simple implementation, and can be improved upon!
+ %{host: host} = URI.parse(url)
+
+ case @cachex.get(@backoff_cache, host) do
+ {:ok, nil} ->
+ case HTTP.get(url, headers, options) do
+ {:ok, env} ->
+ case env.status do
+ 429 ->
+ Logger.error("Rate limited on #{host}! Backing off...")
+ timestamp = next_backoff_timestamp(env)
+ ttl = Timex.diff(timestamp, DateTime.utc_now(), :seconds)
+ # we will cache the host for 5 minutes
+ @cachex.put(@backoff_cache, host, true, ttl)
+ {:error, :ratelimit}
+
+ _ ->
+ {:ok, env}
+ end
+
+ {:error, env} ->
+ {:error, env}
+ end
+
+ _ ->
+ {:error, :ratelimit}
+ end
+ end
+end
diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex
index b9d8dbaaa..937026e04 100644
--- a/lib/pleroma/object/fetcher.ex
+++ b/lib/pleroma/object/fetcher.ex
@@ -354,7 +354,7 @@ def get_object(id) do
with {:ok, %{body: body, status: code, headers: headers, url: final_url}}
when code in 200..299 <-
- HTTP.get(id, headers),
+ HTTP.Backoff.get(id, headers),
remote_host <-
URI.parse(final_url).host,
{:cross_domain_redirect, false} <-
diff --git a/lib/pleroma/web/web_finger.ex b/lib/pleroma/web/web_finger.ex
index 9d5efbb3e..280ed236e 100644
--- a/lib/pleroma/web/web_finger.ex
+++ b/lib/pleroma/web/web_finger.ex
@@ -160,7 +160,8 @@ def find_lrdd_template(domain) do
# WebFinger is restricted to HTTPS - https://tools.ietf.org/html/rfc7033#section-9.1
meta_url = "https://#{domain}/.well-known/host-meta"
- with {:ok, %{status: status, body: body}} when status in 200..299 <- HTTP.get(meta_url) do
+ with {:ok, %{status: status, body: body}} when status in 200..299 <-
+ HTTP.Backoff.get(meta_url) do
get_template_from_xml(body)
else
error ->
@@ -197,7 +198,7 @@ def finger(account) do
with address when is_binary(address) <- get_address_from_domain(domain, encoded_account),
{:ok, %{status: status, body: body, headers: headers}} when status in 200..299 <-
- HTTP.get(
+ HTTP.Backoff.get(
address,
[{"accept", "application/xrd+xml,application/jrd+json"}]
) do
From 2437a3e9ba191c20ef5231fa5a97bab99a8955a0 Mon Sep 17 00:00:00 2001
From: FloatingGhost
Date: Fri, 15 Dec 2023 17:29:02 +0000
Subject: [PATCH 072/153] add test for backoff
---
lib/pleroma/http/backoff.ex | 3 +--
test/pleroma/http/backoff_test.exs | 34 ++++++++++++++++++++++++++++++
2 files changed, 35 insertions(+), 2 deletions(-)
create mode 100644 test/pleroma/http/backoff_test.exs
diff --git a/lib/pleroma/http/backoff.ex b/lib/pleroma/http/backoff.ex
index d51c0547a..d47d2ea6b 100644
--- a/lib/pleroma/http/backoff.ex
+++ b/lib/pleroma/http/backoff.ex
@@ -28,8 +28,7 @@ def get(url, headers \\ [], options \\ []) do
# this ensures that we don't hammer the server with requests, and instead wait for the backoff to expire
# this is a very simple implementation, and can be improved upon!
%{host: host} = URI.parse(url)
-
- case @cachex.get(@backoff_cache, host) do
+ case @cachex.get(@backoff_cache, host) do
{:ok, nil} ->
case HTTP.get(url, headers, options) do
{:ok, env} ->
diff --git a/test/pleroma/http/backoff_test.exs b/test/pleroma/http/backoff_test.exs
new file mode 100644
index 000000000..e8a571e87
--- /dev/null
+++ b/test/pleroma/http/backoff_test.exs
@@ -0,0 +1,34 @@
+defmodule Pleroma.HTTP.BackoffTest do
+ @backoff_cache :http_backoff_cache
+ use Pleroma.DataCase, async: false
+ alias Pleroma.HTTP.Backoff
+
+ describe "get/3" do
+ test "should return {:ok, env} when not rate limited" do
+ Tesla.Mock.mock_global(fn
+ %Tesla.Env{url: "https://akkoma.dev/api/v1/instance"} ->
+ {:ok, %Tesla.Env{status: 200, body: "ok"}}
+ end)
+ assert {:ok, env} = Backoff.get("https://akkoma.dev/api/v1/instance")
+ assert env.status == 200
+ end
+
+ test "should return {:error, env} when rate limited" do
+ # Shove a value into the cache to simulate a rate limit
+ Cachex.put(@backoff_cache, "akkoma.dev", true)
+ assert {:error, env} = Backoff.get("https://akkoma.dev/api/v1/instance")
+ assert env.status == 429
+ end
+
+ test "should insert a value into the cache when rate limited" do
+ Tesla.Mock.mock_global(fn
+ %Tesla.Env{url: "https://ratelimited.dev/api/v1/instance"} ->
+ {:ok, %Tesla.Env{status: 429, body: "Rate limited"}}
+ end)
+
+ assert {:error, env} = Backoff.get("https://ratelimited.dev/api/v1/instance")
+ assert env.status == 429
+ assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
+ end
+ end
+end
From 3c384c1b7617f00a5222733e22e7b6cf7550c7fa Mon Sep 17 00:00:00 2001
From: FloatingGhost
Date: Wed, 20 Dec 2023 16:45:35 +0000
Subject: [PATCH 073/153] Add ratelimit backoff to HTTP get
---
lib/pleroma/http/backoff.ex | 21 ++++++++++++++++-----
test/pleroma/http/backoff_test.exs | 22 +++++++++++++++++++++-
2 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/lib/pleroma/http/backoff.ex b/lib/pleroma/http/backoff.ex
index d47d2ea6b..cba6c0c17 100644
--- a/lib/pleroma/http/backoff.ex
+++ b/lib/pleroma/http/backoff.ex
@@ -9,14 +9,24 @@ defp next_backoff_timestamp(%{headers: headers}) when is_list(headers) do
# figure out from the 429 response when we can make the next request
# mastodon uses the x-ratelimit-reset header, so we will use that!
# other servers may not, so we'll default to 5 minutes from now if we can't find it
+ default_5_minute_backoff =
+ DateTime.utc_now()
+ |> Timex.shift(seconds: 5 * 60)
+
case Enum.find_value(headers, fn {"x-ratelimit-reset", value} -> value end) do
nil ->
- DateTime.utc_now()
- |> Timex.shift(seconds: 5 * 60)
+ Logger.error("Rate limited, but couldn't find timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}")
+ default_5_minute_backoff
value ->
- {:ok, stamp} = DateTime.from_iso8601(value)
- stamp
+ with {:ok, stamp, _} <- DateTime.from_iso8601(value) do
+ Logger.error("Rate limited until #{stamp}")
+ stamp
+ else
+ _ ->
+ Logger.error("Rate limited, but couldn't parse timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}")
+ default_5_minute_backoff
+ end
end
end
@@ -28,7 +38,8 @@ def get(url, headers \\ [], options \\ []) do
# this ensures that we don't hammer the server with requests, and instead wait for the backoff to expire
# this is a very simple implementation, and can be improved upon!
%{host: host} = URI.parse(url)
- case @cachex.get(@backoff_cache, host) do
+
+ case @cachex.get(@backoff_cache, host) do
{:ok, nil} ->
case HTTP.get(url, headers, options) do
{:ok, env} ->
diff --git a/test/pleroma/http/backoff_test.exs b/test/pleroma/http/backoff_test.exs
index e8a571e87..b50a4c458 100644
--- a/test/pleroma/http/backoff_test.exs
+++ b/test/pleroma/http/backoff_test.exs
@@ -9,6 +9,7 @@ test "should return {:ok, env} when not rate limited" do
%Tesla.Env{url: "https://akkoma.dev/api/v1/instance"} ->
{:ok, %Tesla.Env{status: 200, body: "ok"}}
end)
+
assert {:ok, env} = Backoff.get("https://akkoma.dev/api/v1/instance")
assert env.status == 200
end
@@ -29,6 +30,25 @@ test "should insert a value into the cache when rate limited" do
assert {:error, env} = Backoff.get("https://ratelimited.dev/api/v1/instance")
assert env.status == 429
assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
- end
+ end
+
+ test "should parse the value of x-ratelimit-reset, if present" do
+ ten_minutes_from_now =
+ DateTime.utc_now() |> Timex.shift(minutes: 10) |> DateTime.to_iso8601()
+
+ Tesla.Mock.mock_global(fn
+ %Tesla.Env{url: "https://ratelimited.dev/api/v1/instance"} ->
+ {:ok,
+ %Tesla.Env{
+ status: 429,
+ body: "Rate limited",
+ headers: [{"x-ratelimit-reset", ten_minutes_from_now}]
+ }}
+ end)
+
+ assert {:error, env} = Backoff.get("https://ratelimited.dev/api/v1/instance")
+ assert env.status == 429
+ assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
+ end
end
end
From ec7e9da734590622d180cb72dfc34ba3ab6bcfea Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Fri, 26 Apr 2024 19:05:12 +0100
Subject: [PATCH 074/153] Correct ttl syntax for new cachex
---
lib/pleroma/http/backoff.ex | 2 +-
test/pleroma/http/backoff_test.exs | 9 +++------
2 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/lib/pleroma/http/backoff.ex b/lib/pleroma/http/backoff.ex
index cba6c0c17..5fb37205e 100644
--- a/lib/pleroma/http/backoff.ex
+++ b/lib/pleroma/http/backoff.ex
@@ -49,7 +49,7 @@ def get(url, headers \\ [], options \\ []) do
timestamp = next_backoff_timestamp(env)
ttl = Timex.diff(timestamp, DateTime.utc_now(), :seconds)
# we will cache the host for 5 minutes
- @cachex.put(@backoff_cache, host, true, ttl)
+ @cachex.put(@backoff_cache, host, true, ttl: ttl)
{:error, :ratelimit}
_ ->
diff --git a/test/pleroma/http/backoff_test.exs b/test/pleroma/http/backoff_test.exs
index b50a4c458..62419eb5c 100644
--- a/test/pleroma/http/backoff_test.exs
+++ b/test/pleroma/http/backoff_test.exs
@@ -17,8 +17,7 @@ test "should return {:ok, env} when not rate limited" do
test "should return {:error, env} when rate limited" do
# Shove a value into the cache to simulate a rate limit
Cachex.put(@backoff_cache, "akkoma.dev", true)
- assert {:error, env} = Backoff.get("https://akkoma.dev/api/v1/instance")
- assert env.status == 429
+ assert {:error, :ratelimit} = Backoff.get("https://akkoma.dev/api/v1/instance")
end
test "should insert a value into the cache when rate limited" do
@@ -27,8 +26,7 @@ test "should insert a value into the cache when rate limited" do
{:ok, %Tesla.Env{status: 429, body: "Rate limited"}}
end)
- assert {:error, env} = Backoff.get("https://ratelimited.dev/api/v1/instance")
- assert env.status == 429
+ assert {:error, :ratelimit} = Backoff.get("https://ratelimited.dev/api/v1/instance")
assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
end
@@ -46,8 +44,7 @@ test "should parse the value of x-ratelimit-reset, if present" do
}}
end)
- assert {:error, env} = Backoff.get("https://ratelimited.dev/api/v1/instance")
- assert env.status == 429
+ assert {:error, :ratelimit} = Backoff.get("https://ratelimited.dev/api/v1/instance")
assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
end
end
From 9671cdecdf9a8bf968a7b1a87091b57c9490924a Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Fri, 26 Apr 2024 19:10:17 +0100
Subject: [PATCH 075/153] changelog entry
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2facbd84d..257dc4adb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Issue leading to Mastodon bot accounts being rejected
- Scope misdetection of remote posts resulting from not recognising
JSON-LD-compacted forms of public scope; affected e.g. federation with bovine
+- Ratelimits encountered when fetching objects are now respected; 429 responses will cause a backoff when we get one.
## Removed
- ActivityPub Client-To-Server write API endpoints have been disabled;
From 010e8c7bb26d537acf2b1d969adcc6ba42abe9a9 Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Fri, 26 Apr 2024 19:28:01 +0100
Subject: [PATCH 076/153] where were you when lint fail
---
lib/pleroma/http/backoff.ex | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/lib/pleroma/http/backoff.ex b/lib/pleroma/http/backoff.ex
index 5fb37205e..dac05c971 100644
--- a/lib/pleroma/http/backoff.ex
+++ b/lib/pleroma/http/backoff.ex
@@ -15,7 +15,10 @@ defp next_backoff_timestamp(%{headers: headers}) when is_list(headers) do
case Enum.find_value(headers, fn {"x-ratelimit-reset", value} -> value end) do
nil ->
- Logger.error("Rate limited, but couldn't find timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}")
+ Logger.error(
+ "Rate limited, but couldn't find timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}"
+ )
+
default_5_minute_backoff
value ->
@@ -24,7 +27,10 @@ defp next_backoff_timestamp(%{headers: headers}) when is_list(headers) do
stamp
else
_ ->
- Logger.error("Rate limited, but couldn't parse timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}")
+ Logger.error(
+ "Rate limited, but couldn't parse timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}"
+ )
+
default_5_minute_backoff
end
end
From 549d58005411a0846448dd7445210898caca0b56 Mon Sep 17 00:00:00 2001
From: Norm
Date: Fri, 26 Apr 2024 15:21:58 -0400
Subject: [PATCH 077/153] Add Enafore to clients list
---
docs/docs/clients.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/docs/docs/clients.md b/docs/docs/clients.md
index 064f23866..b5ec500c9 100644
--- a/docs/docs/clients.md
+++ b/docs/docs/clients.md
@@ -55,11 +55,11 @@ This is a list of clients that are known to work with Akkoma.
- Features: MastoAPI, Editing, Emoji Reactions (including custom emoji)
## Alternative Web Interfaces
-### Pinafore
-- Note: Pinafore is unmaintained (See [the author's original article](https://nolanlawson.com/2023/01/09/retiring-pinafore/) for details)
-- Homepage:
-- Source Code:
-- Contact: [@pinafore@mastodon.technology](https://mastodon.technology/users/pinafore)
+### Enafore
+- An actively developed fork of Pinafore with improved Akkoma support
+- Homepage:
+- Source Code:
+- Contact: [@enfore@enafore.social](https://meta.enafore.social/@enafore)
- Features: MastoAPI, No Streaming
### Sengi
From 7038b60ab5cec31c4d7663ea9a0235f2b4aebf7c Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Sat, 27 Apr 2024 15:08:21 +0100
Subject: [PATCH 078/153] bump version
---
CHANGELOG.md | 2 ++
mix.exs | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2facbd84d..8649d65c8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
+## 2024.04
+
## Added
- Support for [FEP-fffd](https://codeberg.org/fediverse/fep/src/branch/main/fep/fffd/fep-fffd.md) (proxy objects)
- Verified support for elixir 1.16
diff --git a/mix.exs b/mix.exs
index 237503f84..3581ac40e 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("3.12.2"),
+ version: version("3.13.0"),
elixir: "~> 1.14",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: Mix.compilers(),
From 21a81e111165bd29ef953d5e51c682f3dd94dfb4 Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Sat, 27 Apr 2024 15:10:52 +0100
Subject: [PATCH 079/153] version bump with translations
---
mix.exs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mix.exs b/mix.exs
index 3581ac40e..4d58821bc 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("3.13.0"),
+ version: version("3.13.1"),
elixir: "~> 1.14",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: Mix.compilers(),
From 8ae54b260ae438d69397b91fad8f0b52c485c3ff Mon Sep 17 00:00:00 2001
From: Norm
Date: Mon, 29 Apr 2024 13:45:58 -0400
Subject: [PATCH 080/153] Remove remaining Dokku files
---
.buildpacks | 1 -
config/dokku.exs | 25 -------------------------
2 files changed, 26 deletions(-)
delete mode 100644 .buildpacks
delete mode 100644 config/dokku.exs
diff --git a/.buildpacks b/.buildpacks
deleted file mode 100644
index 31dd57096..000000000
--- a/.buildpacks
+++ /dev/null
@@ -1 +0,0 @@
-https://github.com/hashnuke/heroku-buildpack-elixir
diff --git a/config/dokku.exs b/config/dokku.exs
deleted file mode 100644
index 1cc396c3d..000000000
--- a/config/dokku.exs
+++ /dev/null
@@ -1,25 +0,0 @@
-import Config
-
-config :pleroma, Pleroma.Web.Endpoint,
- http: [
- port: String.to_integer(System.get_env("PORT") || "4000"),
- protocol_options: [max_request_line_length: 8192, max_header_value_length: 8192]
- ],
- protocol: "http",
- secure_cookie_flag: false,
- url: [host: System.get_env("APP_HOST"), scheme: "https", port: 443],
- secret_key_base: "+S+ULgf7+N37c/lc9K66SMphnjQIRGklTu0BRr2vLm2ZzvK0Z6OH/PE77wlUNtvP"
-
-database_url =
- System.get_env("DATABASE_URL") ||
- raise """
- environment variable DATABASE_URL is missing.
- For example: ecto://USER:PASS@HOST/DATABASE
- """
-
-config :pleroma, Pleroma.Repo,
- # ssl: true,
- url: database_url,
- pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10")
-
-config :pleroma, :instance, name: "#{System.get_env("APP_NAME")} CI Instance"
From b7e3d44756bc0f192f37befcfb75991d7a287816 Mon Sep 17 00:00:00 2001
From: Oneric
Date: Wed, 1 May 2024 23:01:28 +0200
Subject: [PATCH 081/153] Drop unused indices
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This promotes and expands our existing optional migration.
Based on usage statistics from several instances, see:
https://akkoma.dev/AkkomaGang/akkoma/issues/764
activities_hosts is now retained after all since it’s essential
for the "instance" query parameter of *oma’s public timeline to
reliably work in a reasonable amount of time. (Although akkoma-fe has
no support for this feature and apparently barely anyone uses it.)
activities_actor_index was already dropped before in
20221211234352_remove_unused_indices; no need to drop it again.
Birthday indices were introduced in pleroma starting with
20220116183110_add_birthday_to_users which is past the
last common migration 20210416051708.
---
.../20240501190000_drop_unused_indexes.exs | 64 ++++++++++++++++
.../20230422154018_drop_unused_indexes.exs | 74 -------------------
2 files changed, 64 insertions(+), 74 deletions(-)
create mode 100644 priv/repo/migrations/20240501190000_drop_unused_indexes.exs
delete mode 100644 priv/repo/optional_migrations/20230422154018_drop_unused_indexes.exs
diff --git a/priv/repo/migrations/20240501190000_drop_unused_indexes.exs b/priv/repo/migrations/20240501190000_drop_unused_indexes.exs
new file mode 100644
index 000000000..fa5a5767b
--- /dev/null
+++ b/priv/repo/migrations/20240501190000_drop_unused_indexes.exs
@@ -0,0 +1,64 @@
+defmodule Pleroma.Repo.Migrations.DropUnusedIndexes do
+ use Ecto.Migration
+
+ def up do
+ # Leftovers from a late Pleroma migration (will not be restored on rollback)
+ drop_i(:users, [:show_birthday], :users_show_birthday_index)
+
+ drop_i(
+ :users,
+ ["date_part('month', birthday)", "date_part('day', birthday)"],
+ :users_birthday_month_day_index
+ )
+
+ # Unused
+ drop_i(:activities, ["(data->'cc')"], :activities_cc_index)
+ drop_i(:activities, ["(data->'object'->>'inReplyTo')"], :activities_in_reply_to)
+ drop_i(:activities, ["(data #> '{\"object\",\"likes\"}')"], :activities_likes)
+ drop_i(:activities, ["(data->'to')"], :activities_to_index)
+
+ drop_i(:objects, ["(data->'likes')"], :objects_likes)
+
+ drop_i(:users, [:featured_address], :users_featured_address_index)
+ drop_i(:users, [:following_address], :users_following_address_index)
+ drop_i(:users, [:invisible], :users_invisible_index)
+ drop_i(:users, [:last_status_at], :users_last_status_at_index)
+ drop_i(:users, [:tags], :users_tags_index)
+
+ drop_i(:apps, [:client_id, :client_secret], :apps_client_id_client_secret_index)
+ drop_i(:apps, [:user_id], :apps_user_id_index)
+
+ # Duplicate of primary key index (will not be restored on rollback)
+ drop_i(
+ :user_frontend_setting_profiles,
+ [:user_id, :frontend_name, :profile_name],
+ :user_frontend_setting_profiles_user_id_frontend_name_profile_name_index
+ )
+ end
+
+ def down do
+ create_i(:activities, ["(data->'cc')"], :activities_cc_index, :gin)
+ create_i(:activities, ["(data->'object'->>'inReplyTo')"], :activities_in_reply_to)
+ create_i(:activities, ["(data #> '{\"object\",\"likes\"}')"], :activities_likes, :gin)
+ create_i(:activities, ["(data->'to')"], :activities_to_index, :gin)
+
+ create_i(:objects, ["(data->'likes')"], :objects_likes, :gin)
+
+ create_i(:users, [:featured_address], :users_featured_address_index)
+ create_i(:users, [:following_address], :users_following_address_index)
+ create_i(:users, [:invisible], :users_invisible_index)
+ create_i(:users, [:last_status_at], :users_last_status_at_index)
+ create_i(:users, [:tags], :users_tags_index, :gin)
+
+ create_i(:apps, [:client_id, :client_secret], :apps_client_id_client_secret_index)
+ create_i(:apps, [:user_id], :apps_user_id_index)
+ end
+
+ defp drop_i(table, fields, name) do
+ drop_if_exists(index(table, fields, name: name))
+ end
+
+ defp create_i(table, fields, name, type \\ :btree) do
+ create_if_not_exists(index(table, fields, name: name, using: type))
+ end
+end
diff --git a/priv/repo/optional_migrations/20230422154018_drop_unused_indexes.exs b/priv/repo/optional_migrations/20230422154018_drop_unused_indexes.exs
deleted file mode 100644
index d8acb1034..000000000
--- a/priv/repo/optional_migrations/20230422154018_drop_unused_indexes.exs
+++ /dev/null
@@ -1,74 +0,0 @@
-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)
- )
- 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
- )
- )
- end
-end
From 5256678901f0c6558b505eedbf861a1d423d5ab9 Mon Sep 17 00:00:00 2001
From: Oneric
Date: Sat, 27 Apr 2024 19:07:31 +0200
Subject: [PATCH 082/153] Fix Exiftool migration id
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Applying works fine with a 20220220135625 version, but it won’t be
rolled back in the right order. Fortunately this action is idempotent
so we can just rename and reapply it with a new id.
To also not break large-scale rollbacks past 2022 for anyone
who already applied it with the old id, keep a stub migration.
---
...er_exiftool_to_exiftool_strip_location.exs | 39 +++----------------
...iftool_to_exiftool_strip_location_real.exs | 37 ++++++++++++++++++
2 files changed, 43 insertions(+), 33 deletions(-)
create mode 100644 priv/repo/migrations/20240425120000_upload_filter_exiftool_to_exiftool_strip_location_real.exs
diff --git a/priv/repo/migrations/20220220135625_upload_filter_exiftool_to_exiftool_strip_location.exs b/priv/repo/migrations/20220220135625_upload_filter_exiftool_to_exiftool_strip_location.exs
index 0d68a0787..86e02df01 100644
--- a/priv/repo/migrations/20220220135625_upload_filter_exiftool_to_exiftool_strip_location.exs
+++ b/priv/repo/migrations/20220220135625_upload_filter_exiftool_to_exiftool_strip_location.exs
@@ -1,37 +1,10 @@
defmodule Pleroma.Repo.Migrations.UploadFilterExiftoolToExiftoolStripMetadata do
use Ecto.Migration
- alias Pleroma.ConfigDB
-
- def up,
- do:
- ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.Upload})
- |> update_filtername(
- Pleroma.Upload.Filter.Exiftool,
- Pleroma.Upload.Filter.Exiftool.StripMetadata
- )
-
- def down,
- do:
- ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.Upload})
- |> update_filtername(
- Pleroma.Upload.Filter.Exiftool.StripMetadata,
- Pleroma.Upload.Filter.Exiftool
- )
-
- defp update_filtername(%{value: value}, from_filtername, to_filtername) do
- new_value =
- value
- |> Keyword.update(:filters, [], fn filters ->
- filters
- |> Enum.map(fn
- ^from_filtername -> to_filtername
- filter -> filter
- end)
- end)
-
- ConfigDB.update_or_create(%{group: :pleroma, key: Pleroma.Upload, value: new_value})
- end
-
- defp update_filtername(_, _, _), do: nil
+ # 20240425120000_upload_filter_exiftool_to_exiftool_strip_location.exs
+ # was originally committed with the id used in this file, but this breaks
+ # rollback order. Thus it was moved to 20240425120000 and this stub just prevents
+ # errors during large-scale rollbacks for anyone who already applied the old id
+ def up, do: :ok
+ def down, do: :ok
end
diff --git a/priv/repo/migrations/20240425120000_upload_filter_exiftool_to_exiftool_strip_location_real.exs b/priv/repo/migrations/20240425120000_upload_filter_exiftool_to_exiftool_strip_location_real.exs
new file mode 100644
index 000000000..5d2b880db
--- /dev/null
+++ b/priv/repo/migrations/20240425120000_upload_filter_exiftool_to_exiftool_strip_location_real.exs
@@ -0,0 +1,37 @@
+defmodule Pleroma.Repo.Migrations.UploadFilterExiftoolToExiftoolStripMetadataReal do
+ use Ecto.Migration
+
+ alias Pleroma.ConfigDB
+
+ def up,
+ do:
+ ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.Upload})
+ |> update_filtername(
+ Pleroma.Upload.Filter.Exiftool,
+ Pleroma.Upload.Filter.Exiftool.StripMetadata
+ )
+
+ def down,
+ do:
+ ConfigDB.get_by_params(%{group: :pleroma, key: Pleroma.Upload})
+ |> update_filtername(
+ Pleroma.Upload.Filter.Exiftool.StripMetadata,
+ Pleroma.Upload.Filter.Exiftool
+ )
+
+ defp update_filtername(%{value: value}, from_filtername, to_filtername) do
+ new_value =
+ value
+ |> Keyword.update(:filters, [], fn filters ->
+ filters
+ |> Enum.map(fn
+ ^from_filtername -> to_filtername
+ filter -> filter
+ end)
+ end)
+
+ ConfigDB.update_or_create(%{group: :pleroma, key: Pleroma.Upload, value: new_value})
+ end
+
+ defp update_filtername(_, _, _), do: nil
+end
From bd74693db63925a4469c618989dcc7c05aa81591 Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Mon, 6 May 2024 23:34:48 +0100
Subject: [PATCH 083/153] additionally support retry-after values
---
lib/pleroma/http/backoff.ex | 136 +++++++++++++++++++----------
test/pleroma/http/backoff_test.exs | 44 ++++++++++
2 files changed, 136 insertions(+), 44 deletions(-)
diff --git a/lib/pleroma/http/backoff.ex b/lib/pleroma/http/backoff.ex
index dac05c971..b3f734a92 100644
--- a/lib/pleroma/http/backoff.ex
+++ b/lib/pleroma/http/backoff.ex
@@ -5,66 +5,114 @@ defmodule Pleroma.HTTP.Backoff do
@cachex Pleroma.Config.get([:cachex, :provider], Cachex)
@backoff_cache :http_backoff_cache
+ # attempt to parse a timestamp from a header
+ # returns nil if it can't parse the timestamp
+ @spec timestamp_or_nil(binary) :: DateTime.t() | nil
+ defp timestamp_or_nil(header) do
+ case DateTime.from_iso8601(header) do
+ {:ok, stamp, _} ->
+ stamp
+
+ _ ->
+ nil
+ end
+ end
+
+ # attempt to parse the x-ratelimit-reset header from the headers
+ @spec x_ratelimit_reset(headers :: list) :: DateTime.t() | nil
+ defp x_ratelimit_reset(headers) do
+ with {_header, value} <- List.keyfind(headers, "x-ratelimit-reset", 0),
+ true <- is_binary(value) do
+ timestamp_or_nil(value)
+ else
+ _ ->
+ nil
+ end
+ end
+
+ # attempt to parse the Retry-After header from the headers
+ # this can be either a timestamp _or_ a number of seconds to wait!
+ # we'll return a datetime if we can parse it, or nil if we can't
+ @spec retry_after(headers :: list) :: DateTime.t() | nil
+ defp retry_after(headers) do
+ with {_header, value} <- List.keyfind(headers, "retry-after", 0),
+ true <- is_binary(value) do
+ # first, see if it's an integer
+ case Integer.parse(value) do
+ {seconds, ""} ->
+ Logger.debug("Parsed Retry-After header: #{seconds} seconds")
+ DateTime.utc_now() |> Timex.shift(seconds: seconds)
+
+ _ ->
+ # if it's not an integer, try to parse it as a timestamp
+ timestamp_or_nil(value)
+ end
+ else
+ _ ->
+ nil
+ end
+ end
+
+ # given a set of headers, will attempt to find the next backoff timestamp
+ # if it can't find one, it will default to 5 minutes from now
+ @spec next_backoff_timestamp(%{headers: list}) :: DateTime.t()
defp next_backoff_timestamp(%{headers: headers}) when is_list(headers) do
- # figure out from the 429 response when we can make the next request
- # mastodon uses the x-ratelimit-reset header, so we will use that!
- # other servers may not, so we'll default to 5 minutes from now if we can't find it
default_5_minute_backoff =
DateTime.utc_now()
|> Timex.shift(seconds: 5 * 60)
- case Enum.find_value(headers, fn {"x-ratelimit-reset", value} -> value end) do
- nil ->
- Logger.error(
- "Rate limited, but couldn't find timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}"
- )
+ backoff =
+ [&x_ratelimit_reset/1, &retry_after/1]
+ |> Enum.map(& &1.(headers))
+ |> Enum.find(&(&1 != nil))
- default_5_minute_backoff
-
- value ->
- with {:ok, stamp, _} <- DateTime.from_iso8601(value) do
- Logger.error("Rate limited until #{stamp}")
- stamp
- else
- _ ->
- Logger.error(
- "Rate limited, but couldn't parse timestamp! Using default 5 minute backoff until #{default_5_minute_backoff}"
- )
-
- default_5_minute_backoff
- end
+ if is_nil(backoff) do
+ Logger.debug("No backoff headers found, defaulting to 5 minutes from now")
+ default_5_minute_backoff
+ else
+ Logger.debug("Found backoff header, will back off until: #{backoff}")
+ backoff
end
end
defp next_backoff_timestamp(_), do: DateTime.utc_now() |> Timex.shift(seconds: 5 * 60)
+ # utility function to check the HTTP response for potential backoff headers
+ # will check if we get a 429 or 503 response, and if we do, will back off for a bit
+ @spec check_backoff({:ok | :error, HTTP.Env.t()}, binary()) ::
+ {:ok | :error, HTTP.Env.t()} | {:error, :ratelimit}
+ defp check_backoff({:ok, env}, host) do
+ case env.status do
+ status when status in [429, 503] ->
+ Logger.error("Rate limited on #{host}! Backing off...")
+ timestamp = next_backoff_timestamp(env)
+ ttl = Timex.diff(timestamp, DateTime.utc_now(), :seconds)
+ # we will cache the host for 5 minutes
+ @cachex.put(@backoff_cache, host, true, ttl: ttl)
+ {:error, :ratelimit}
+
+ _ ->
+ {:ok, env}
+ end
+ end
+
+ defp check_backoff(env, _), do: env
+
+ @doc """
+ this acts as a single throughput for all GET requests
+ we will check if the host is in the cache, and if it is, we will automatically fail the request
+ this ensures that we don't hammer the server with requests, and instead wait for the backoff to expire
+ this is a very simple implementation, and can be improved upon!
+ """
+ @spec get(binary, list, list) :: {:ok | :error, HTTP.Env.t()} | {:error, :ratelimit}
def get(url, headers \\ [], options \\ []) do
- # this acts as a single throughput for all GET requests
- # we will check if the host is in the cache, and if it is, we will automatically fail the request
- # this ensures that we don't hammer the server with requests, and instead wait for the backoff to expire
- # this is a very simple implementation, and can be improved upon!
%{host: host} = URI.parse(url)
case @cachex.get(@backoff_cache, host) do
{:ok, nil} ->
- case HTTP.get(url, headers, options) do
- {:ok, env} ->
- case env.status do
- 429 ->
- Logger.error("Rate limited on #{host}! Backing off...")
- timestamp = next_backoff_timestamp(env)
- ttl = Timex.diff(timestamp, DateTime.utc_now(), :seconds)
- # we will cache the host for 5 minutes
- @cachex.put(@backoff_cache, host, true, ttl: ttl)
- {:error, :ratelimit}
-
- _ ->
- {:ok, env}
- end
-
- {:error, env} ->
- {:error, env}
- end
+ url
+ |> HTTP.get(headers, options)
+ |> check_backoff(host)
_ ->
{:error, :ratelimit}
diff --git a/test/pleroma/http/backoff_test.exs b/test/pleroma/http/backoff_test.exs
index 62419eb5c..33a4fd22f 100644
--- a/test/pleroma/http/backoff_test.exs
+++ b/test/pleroma/http/backoff_test.exs
@@ -3,6 +3,10 @@ defmodule Pleroma.HTTP.BackoffTest do
use Pleroma.DataCase, async: false
alias Pleroma.HTTP.Backoff
+ defp within_tolerance?(ttl, expected) do
+ ttl > expected - 10 and ttl < expected + 10
+ end
+
describe "get/3" do
test "should return {:ok, env} when not rate limited" do
Tesla.Mock.mock_global(fn
@@ -46,6 +50,46 @@ test "should parse the value of x-ratelimit-reset, if present" do
assert {:error, :ratelimit} = Backoff.get("https://ratelimited.dev/api/v1/instance")
assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
+ {:ok, ttl} = Cachex.ttl(@backoff_cache, "ratelimited.dev")
+ assert within_tolerance?(ttl, 600)
+ end
+
+ test "should parse the value of retry-after when it's a timestamp" do
+ ten_minutes_from_now =
+ DateTime.utc_now() |> Timex.shift(minutes: 10) |> DateTime.to_iso8601()
+
+ Tesla.Mock.mock_global(fn
+ %Tesla.Env{url: "https://ratelimited.dev/api/v1/instance"} ->
+ {:ok,
+ %Tesla.Env{
+ status: 429,
+ body: "Rate limited",
+ headers: [{"retry-after", ten_minutes_from_now}]
+ }}
+ end)
+
+ assert {:error, :ratelimit} = Backoff.get("https://ratelimited.dev/api/v1/instance")
+ assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
+ {:ok, ttl} = Cachex.ttl(@backoff_cache, "ratelimited.dev")
+ assert within_tolerance?(ttl, 600)
+ end
+
+ test "should parse the value of retry-after when it's a number of seconds" do
+ Tesla.Mock.mock_global(fn
+ %Tesla.Env{url: "https://ratelimited.dev/api/v1/instance"} ->
+ {:ok,
+ %Tesla.Env{
+ status: 429,
+ body: "Rate limited",
+ headers: [{"retry-after", "600"}]
+ }}
+ end)
+
+ assert {:error, :ratelimit} = Backoff.get("https://ratelimited.dev/api/v1/instance")
+ assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
+ # assert that the value is 10 minutes from now
+ {:ok, ttl} = Cachex.ttl(@backoff_cache, "ratelimited.dev")
+ assert within_tolerance?(ttl, 600)
end
end
end
From ea6bc8a7c587c636793875c4d8d7ed534288336e Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Mon, 6 May 2024 23:36:00 +0100
Subject: [PATCH 084/153] add a test for 503-rate-limiting
---
test/pleroma/http/backoff_test.exs | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/test/pleroma/http/backoff_test.exs b/test/pleroma/http/backoff_test.exs
index 33a4fd22f..f1b27f5b5 100644
--- a/test/pleroma/http/backoff_test.exs
+++ b/test/pleroma/http/backoff_test.exs
@@ -34,6 +34,16 @@ test "should insert a value into the cache when rate limited" do
assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
end
+ test "should insert a value into the cache when rate limited with a 503 response" do
+ Tesla.Mock.mock_global(fn
+ %Tesla.Env{url: "https://ratelimited.dev/api/v1/instance"} ->
+ {:ok, %Tesla.Env{status: 503, body: "Rate limited"}}
+ end)
+
+ assert {:error, :ratelimit} = Backoff.get("https://ratelimited.dev/api/v1/instance")
+ assert {:ok, true} = Cachex.get(@backoff_cache, "ratelimited.dev")
+ end
+
test "should parse the value of x-ratelimit-reset, if present" do
ten_minutes_from_now =
DateTime.utc_now() |> Timex.shift(minutes: 10) |> DateTime.to_iso8601()
From 4457928e325cf370a0d2e028232dbd0a542547e0 Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Sat, 11 May 2024 05:30:18 +0100
Subject: [PATCH 085/153] duct-tape fix for #438
we really need to make this less manual
---
lib/pleroma/signature.ex | 2 +-
test/pleroma/signature_test.exs | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/signature.ex b/lib/pleroma/signature.ex
index 3d33fcd62..c4ac2c87e 100644
--- a/lib/pleroma/signature.ex
+++ b/lib/pleroma/signature.ex
@@ -10,7 +10,7 @@ defmodule Pleroma.Signature do
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
- @known_suffixes ["/publickey", "/main-key"]
+ @known_suffixes ["/publickey", "/main-key", "#key"]
def key_id_to_actor_id(key_id) do
uri =
diff --git a/test/pleroma/signature_test.exs b/test/pleroma/signature_test.exs
index e2d02fe4c..c946da9ef 100644
--- a/test/pleroma/signature_test.exs
+++ b/test/pleroma/signature_test.exs
@@ -153,6 +153,11 @@ test "it deduces the actor ID for streams" do
{:ok, "https://example.com/users/1234"}
end
+ test "it deduces the actor ID for bridgy" do
+ assert Signature.key_id_to_actor_id("https://example.com/1234#key") ==
+ {:ok, "https://example.com/1234"}
+ end
+
test "it calls webfinger for 'acct:' accounts" do
with_mock(Pleroma.Web.WebFinger,
finger: fn _ -> {:ok, %{"ap_id" => "https://gensokyo.2hu/users/raymoo"}} end
From 7e709768c33785a8cddee7f5ff515357a8971f96 Mon Sep 17 00:00:00 2001
From: Norm
Date: Wed, 15 May 2024 16:58:58 -0400
Subject: [PATCH 086/153] Use /var/tmp for media cache path in apache/nginx
configs
The /var/tmp directory is not mounted as tmpfs unlike /tmp which is
mounted as such on some distros like Fedora or Arch. Since there isn't
really a benefit to having the cache on tmpfs, this change should allow
for a larger cache if needed without worrying about running out of RAM.
---
installation/apache/akkoma-apache.conf | 2 +-
installation/apache/apache-cache-purge.sh.example | 2 +-
installation/nginx/akkoma.nginx | 2 +-
installation/nginx/nginx-cache-purge.sh.example | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/installation/apache/akkoma-apache.conf b/installation/apache/akkoma-apache.conf
index 65bbf15e1..76357789e 100644
--- a/installation/apache/akkoma-apache.conf
+++ b/installation/apache/akkoma-apache.conf
@@ -60,7 +60,7 @@ ServerTokens Prod
Include /etc/letsencrypt/options-ssl-apache.conf
# Uncomment the following to enable MediaProxy caching on disk
- #CacheRoot /tmp/akkoma-media-cache/
+ #CacheRoot /var/tmp/akkoma-media-cache/
#CacheDirLevels 1
#CacheDirLength 2
#CacheEnable disk /proxy
diff --git a/installation/apache/apache-cache-purge.sh.example b/installation/apache/apache-cache-purge.sh.example
index 65df9cc11..59c2a5ed0 100755
--- a/installation/apache/apache-cache-purge.sh.example
+++ b/installation/apache/apache-cache-purge.sh.example
@@ -16,7 +16,7 @@
SCRIPTNAME=${0##*/}
# mod_disk_cache directory
-CACHE_DIRECTORY="/tmp/akkoma-media-cache"
+CACHE_DIRECTORY="/var/tmp/akkoma-media-cache"
## Removes an item via the htcacheclean utility
## $1 - the filename, can be a pattern .
diff --git a/installation/nginx/akkoma.nginx b/installation/nginx/akkoma.nginx
index bfb1fffb3..bdd5d0f8b 100644
--- a/installation/nginx/akkoma.nginx
+++ b/installation/nginx/akkoma.nginx
@@ -3,7 +3,7 @@
# See the documentation at docs.akkoma.dev for your particular distro/OS for
# installation instructions.
-proxy_cache_path /tmp/akkoma-media-cache levels=1:2 keys_zone=akkoma_media_cache:10m max_size=1g
+proxy_cache_path /var/tmp/akkoma-media-cache levels=1:2 keys_zone=akkoma_media_cache:10m max_size=1g
inactive=720m use_temp_path=off;
# this is explicitly IPv4 since Pleroma.Web.Endpoint binds on IPv4 only
diff --git a/installation/nginx/nginx-cache-purge.sh.example b/installation/nginx/nginx-cache-purge.sh.example
index 6cd01d1e7..be5f186e4 100755
--- a/installation/nginx/nginx-cache-purge.sh.example
+++ b/installation/nginx/nginx-cache-purge.sh.example
@@ -5,7 +5,7 @@
SCRIPTNAME=${0##*/}
# NGINX cache directory
-CACHE_DIRECTORY="/tmp/akkoma-media-cache"
+CACHE_DIRECTORY="/var/tmp/akkoma-media-cache"
## Return the files where the items are cached.
## $1 - the filename, can be a pattern .
From bc46f3da4ce2a389dd9f968930072cb50e9445ce Mon Sep 17 00:00:00 2001
From: Norm
Date: Thu, 16 May 2024 19:05:06 -0400
Subject: [PATCH 087/153] Update mediaproxy howto
Since the configuration options on the nginx side already exist in the
sample config, there's no need to tell users to copy-paste those
settings in again.
---
docs/docs/configuration/howto_mediaproxy.md | 28 +++------------------
1 file changed, 4 insertions(+), 24 deletions(-)
diff --git a/docs/docs/configuration/howto_mediaproxy.md b/docs/docs/configuration/howto_mediaproxy.md
index 223ad7eed..1544a563e 100644
--- a/docs/docs/configuration/howto_mediaproxy.md
+++ b/docs/docs/configuration/howto_mediaproxy.md
@@ -6,37 +6,17 @@ With the `mediaproxy` function you can use nginx to cache this content, so users
## Activate it
-* Edit your nginx config and add the following location to your main server block:
-```
-location /proxy {
- return 404;
-}
-```
-
* Set up a subdomain for the proxy with its nginx config on the same machine
- *(the latter is not strictly required, but for simplicity we’ll assume so)*
-* In this subdomain’s server block add
-```
-location /proxy {
- proxy_cache akkoma_media_cache;
- proxy_cache_lock on;
- proxy_pass http://localhost:4000;
-}
-```
-Also add the following on top of the configuration, outside of the `server` block:
-```
-proxy_cache_path /tmp/akkoma-media-cache levels=1:2 keys_zone=akkoma_media_cache:10m max_size=10g inactive=720m use_temp_path=off;
-```
-If you came here from one of the installation guides, take a look at the example configuration `/installation/nginx/akkoma.nginx`, where this part is already included.
-
+* Edit the nginx config for the upload/MediaProxy subdomain to point to the subdomain that has been set up
* Append the following to your `prod.secret.exs` or `dev.secret.exs` (depends on which mode your instance is running):
-```
+```elixir
+# Replace media.example.td with the subdomain you set up earlier
config :pleroma, :media_proxy,
enabled: true,
proxy_opts: [
redirect_on_failure: true
],
- base_url: "https://cache.akkoma.social"
+ base_url: "https://media.example.tld"
```
You **really** should use a subdomain to serve proxied files; while we will fix bugs resulting from this, serving arbitrary remote content on your main domain namespace is a significant attack surface.
From bb29c5bed210403807dff743f2773eb4feb0ccc9 Mon Sep 17 00:00:00 2001
From: Norm
Date: Thu, 16 May 2024 19:08:02 -0400
Subject: [PATCH 088/153] Update tor/i2p guide
Direct users to add in the appropriate headers and update the listening
port instead of copy/pasting a config that's already outdated and
probably would otherwise have to be synced with the main example nginx
config.
---
docs/docs/configuration/i2p.md | 59 +++++----------------
docs/docs/configuration/onion_federation.md | 55 ++++---------------
2 files changed, 24 insertions(+), 90 deletions(-)
diff --git a/docs/docs/configuration/i2p.md b/docs/docs/configuration/i2p.md
index ec6266ab7..1fb18d1c0 100644
--- a/docs/docs/configuration/i2p.md
+++ b/docs/docs/configuration/i2p.md
@@ -130,59 +130,26 @@ config :pleroma, :http_security,
enabled: false
```
-Use this as the Nginx config:
-```
-proxy_cache_path /tmp/akkoma-media-cache levels=1:2 keys_zone=akkoma_media_cache:10m max_size=10g inactive=720m use_temp_path=off;
-# The above already exists in a clearnet instance's config.
-# If not, add it.
-
-server {
- listen 127.0.0.1:14447;
- server_name youri2paddress;
-
- # Comment to enable logs
- access_log /dev/null;
- error_log /dev/null;
-
- 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;
-
- client_max_body_size 16m;
-
- location / {
-
+In the Nginx config, add the following into the `location /` block:
+```nginx
add_header X-XSS-Protection "0";
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy same-origin;
-
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
- proxy_set_header Host $http_host;
-
- proxy_pass http://localhost:4000;
-
- client_max_body_size 16m;
- }
-
- location /proxy {
- proxy_cache akkoma_media_cache;
- proxy_cache_lock on;
- proxy_ignore_client_abort on;
- proxy_pass http://localhost:4000;
- }
-}
```
-reload Nginx:
+
+Change the `listen` directive to the following:
+```nginx
+listen 127.0.0.1:14447;
```
-systemctl stop i2pd.service --no-block
-systemctl start i2pd.service
+
+Set `server_name` to your i2p address.
+
+Reload Nginx:
+```
+systemctl restart i2pd.service --no-block
+systemctl reload nginx.service
```
*Notice:* The stop command initiates a graceful shutdown process, i2pd stops after finishing to route transit tunnels (maximum 10 minutes).
diff --git a/docs/docs/configuration/onion_federation.md b/docs/docs/configuration/onion_federation.md
index e4ae15fd2..26efbae42 100644
--- a/docs/docs/configuration/onion_federation.md
+++ b/docs/docs/configuration/onion_federation.md
@@ -74,56 +74,23 @@ config :pleroma, :http_security,
enabled: false
```
-Use this as the Nginx config:
-```
-proxy_cache_path /tmp/akkoma-media-cache levels=1:2 keys_zone=akkoma_media_cache:10m max_size=10g inactive=720m use_temp_path=off;
-# The above already exists in a clearnet instance's config.
-# If not, add it.
-
-server {
- listen 127.0.0.1:8099;
- server_name youronionaddress;
-
- # Comment to enable logs
- access_log /dev/null;
- error_log /dev/null;
-
- 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;
-
- client_max_body_size 16m;
-
- location / {
-
+In the Nginx config, add the following into the `location /` block:
+```nginx
add_header X-XSS-Protection "0";
add_header X-Permitted-Cross-Domain-Policies none;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy same-origin;
-
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
- proxy_set_header Host $http_host;
-
- proxy_pass http://localhost:4000;
-
- client_max_body_size 16m;
- }
-
- location /proxy {
- proxy_cache akkoma_media_cache;
- proxy_cache_lock on;
- proxy_ignore_client_abort on;
- proxy_pass http://localhost:4000;
- }
-}
```
-reload Nginx:
+
+Change the `listen` directive to the following:
+```nginx
+listen 127.0.0.1:8099;
+```
+
+Set the `server_name` to your onion address.
+
+Reload Nginx:
```
systemctl reload nginx
```
From a953b1d9279a4c87d0a26885477a65f939892df9 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Wed, 22 May 2024 19:08:37 +0100
Subject: [PATCH 089/153] Prevent spoofing webfinger
---
lib/pleroma/web/web_finger.ex | 18 +++++++++
test/fixtures/tesla_mock/bad.com_host_meta | 3 ++
test/fixtures/tesla_mock/webfinger_spoof.json | 28 +++++++++++++
test/pleroma/web/web_finger_test.exs | 39 ++++++++++++-------
4 files changed, 73 insertions(+), 15 deletions(-)
create mode 100644 test/fixtures/tesla_mock/bad.com_host_meta
create mode 100644 test/fixtures/tesla_mock/webfinger_spoof.json
diff --git a/lib/pleroma/web/web_finger.ex b/lib/pleroma/web/web_finger.ex
index 9d5efbb3e..eeb186ce7 100644
--- a/lib/pleroma/web/web_finger.ex
+++ b/lib/pleroma/web/web_finger.ex
@@ -217,10 +217,28 @@ def finger(account) do
_ ->
{:error, {:content_type, nil}}
end
+ |> case do
+ {:ok, data} -> validate_webfinger(address, data)
+ error -> error
+ end
+
else
error ->
Logger.debug("Couldn't finger #{account}: #{inspect(error)}")
error
end
end
+
+ defp validate_webfinger(url, %{"subject" => "acct:" <> acct} = data) do
+ with %URI{host: request_host} <- URI.parse(url),
+ [_name, acct_host] <- String.split(acct, "@"),
+ {_, true} <- {:hosts_match, acct_host == request_host} do
+ {:ok, data}
+ else
+ _ -> {:error, {:webfinger_invalid, url, data}}
+ end
+ end
+
+ defp validate_webfinger(url, data), do: {:error, {:webfinger_invalid, url, data}}
+
end
diff --git a/test/fixtures/tesla_mock/bad.com_host_meta b/test/fixtures/tesla_mock/bad.com_host_meta
new file mode 100644
index 000000000..14cf3fa24
--- /dev/null
+++ b/test/fixtures/tesla_mock/bad.com_host_meta
@@ -0,0 +1,3 @@
+
+
+
diff --git a/test/fixtures/tesla_mock/webfinger_spoof.json b/test/fixtures/tesla_mock/webfinger_spoof.json
new file mode 100644
index 000000000..ebe2958ce
--- /dev/null
+++ b/test/fixtures/tesla_mock/webfinger_spoof.json
@@ -0,0 +1,28 @@
+{
+ "aliases": [
+ "https://bad.com/users/meanie",
+ "https://anotherbad.social/users/meanie"
+ ],
+ "links": [
+ {
+ "href": "https://bad.com/users/meanie",
+ "rel": "http://webfinger.net/rel/profile-page",
+ "type": "text/html"
+ },
+ {
+ "href": "https://bad.com/users/meanie",
+ "rel": "self",
+ "type": "application/activity+json"
+ },
+ {
+ "href": "https://bad.com/users/meanie",
+ "rel": "self",
+ "type": "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\""
+ },
+ {
+ "rel": "http://ostatus.org/schema/1.0/subscribe",
+ "template": "https://bad.com/ostatus_subscribe?acct={uri}"
+ }
+ ],
+ "subject": "acct:oopsie@notwhereitshouldbe.org"
+}
diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs
index b47eabe80..141bb9d6a 100644
--- a/test/pleroma/web/web_finger_test.exs
+++ b/test/pleroma/web/web_finger_test.exs
@@ -76,15 +76,6 @@ test "returns the ActivityPub actor URI for an ActivityPub user" do
{:ok, _data} = WebFinger.finger(user)
end
- test "returns the ActivityPub actor URI and subscribe address for an ActivityPub user with the ld+json mimetype" do
- user = "kaniini@gerzilla.de"
-
- {:ok, data} = WebFinger.finger(user)
-
- assert data["ap_id"] == "https://gerzilla.de/channel/kaniini"
- assert data["subscribe_address"] == "https://gerzilla.de/follow?f=&url={uri}"
- end
-
test "it work for AP-only user" do
user = "kpherox@mstdn.jp"
@@ -99,12 +90,6 @@ test "it work for AP-only user" do
assert data["subscribe_address"] == "https://mstdn.jp/authorize_interaction?acct={uri}"
end
- test "it works for friendica" do
- user = "lain@squeet.me"
-
- {:ok, _data} = WebFinger.finger(user)
- end
-
test "it gets the xrd endpoint" do
{:ok, template} = WebFinger.find_lrdd_template("social.heldscal.la")
@@ -180,5 +165,29 @@ test "respects xml content-type" do
{:ok, _data} = WebFinger.finger("pekorino@pawoo.net")
end
+
+ test "prevents spoofing" do
+ Tesla.Mock.mock(fn
+ %{
+ url: "https://bad.com/.well-known/webfinger?resource=acct:meanie@bad.com"
+ } ->
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/webfinger_spoof.json"),
+ headers: [{"content-type", "application/jrd+json"}]
+ }}
+
+ %{url: "https://bad.com/.well-known/host-meta"} ->
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/bad.com_host_meta")
+ }}
+ end)
+
+ {:error, _data} = WebFinger.finger("meanie@bad.com")
+ end
+
end
end
From 50403351f48d44f575724c0f6893c21dc8f8f4f4 Mon Sep 17 00:00:00 2001
From: lain
Date: Wed, 22 May 2024 19:17:34 +0100
Subject: [PATCH 090/153] add impostor test for webfinger
---
.../webfinger/imposter-webfinger.json | 41 +++++++++++++++++++
test/pleroma/web/web_finger_test.exs | 16 ++++++++
2 files changed, 57 insertions(+)
create mode 100644 test/fixtures/webfinger/imposter-webfinger.json
diff --git a/test/fixtures/webfinger/imposter-webfinger.json b/test/fixtures/webfinger/imposter-webfinger.json
new file mode 100644
index 000000000..e3d21a083
--- /dev/null
+++ b/test/fixtures/webfinger/imposter-webfinger.json
@@ -0,0 +1,41 @@
+{
+ "subject": "acct:oopsie@notwhereitshouldbe.com",
+ "aliases": [
+ "https://bad.com/webfingertest"
+ ],
+ "links": [
+ {
+ "rel": "http://webfinger.net/rel/profile-page",
+ "type": "text/html",
+ "href": "https://bad.com/webfingertest"
+ },
+ {
+ "rel": "self",
+ "type": "application/activity+json",
+ "href": "https://bad.com/webfingertest"
+ },
+ {
+ "rel": "http://ostatus.org/schema/1.0/subscribe",
+ "template": "https://bad.com/contact/follow?url={uri}"
+ },
+ {
+ "rel": "http://schemas.google.com/g/2010#updates-from",
+ "type": "application/atom+xml",
+ "href": ""
+ },
+ {
+ "rel": "salmon",
+ "href": "https://bad.com/salmon/friendica"
+ },
+ {
+ "rel": "http://microformats.org/profile/hcard",
+ "type": "text/html",
+ "href": "https://bad.com/hcard/friendica"
+ },
+ {
+ "rel": "http://joindiaspora.com/seed_location",
+ "type": "text/html",
+ "href": "https://bad.com"
+ }
+ ]
+}
diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs
index 141bb9d6a..5c46d6988 100644
--- a/test/pleroma/web/web_finger_test.exs
+++ b/test/pleroma/web/web_finger_test.exs
@@ -190,4 +190,20 @@ test "prevents spoofing" do
end
end
+
+ @tag capture_log: true
+ test "prevents forgeries" do
+ Tesla.Mock.mock(fn
+ %{url: "https://bad.com/.well-known/webfinger?resource=acct:meanie@bad.com"} ->
+ fake_webfinger =
+ File.read!("test/fixtures/webfinger/imposter-webfinger.json") |> Jason.decode!()
+
+ Tesla.Mock.json(fake_webfinger)
+
+ %{url: "https://bad.com/.well-known/host-meta"} ->
+ {:ok, %Tesla.Env{status: 404}}
+ end)
+
+ assert {:error, {:webfinger_invalid, _, _}} = WebFinger.finger("meanie@bad.com")
+ end
end
From 34a48cb87f263b246f060b7f7a6178a9194af64d Mon Sep 17 00:00:00 2001
From: Oneric
Date: Tue, 23 Apr 2024 23:09:41 +0200
Subject: [PATCH 091/153] scheduled_activity: mark private functions as private
And remove unused due_activities/1
---
lib/pleroma/scheduled_activity.ex | 24 +++++++-----------------
1 file changed, 7 insertions(+), 17 deletions(-)
diff --git a/lib/pleroma/scheduled_activity.ex b/lib/pleroma/scheduled_activity.ex
index 2b156341f..3e1c51abb 100644
--- a/lib/pleroma/scheduled_activity.ex
+++ b/lib/pleroma/scheduled_activity.ex
@@ -28,7 +28,7 @@ defmodule Pleroma.ScheduledActivity do
timestamps()
end
- def changeset(%ScheduledActivity{} = scheduled_activity, attrs) do
+ defp changeset(%ScheduledActivity{} = scheduled_activity, attrs) do
scheduled_activity
|> cast(attrs, [:scheduled_at, :params])
|> validate_required([:scheduled_at, :params])
@@ -52,14 +52,14 @@ defp with_media_attachments(
defp with_media_attachments(changeset), do: changeset
- def update_changeset(%ScheduledActivity{} = scheduled_activity, attrs) do
+ defp update_changeset(%ScheduledActivity{} = scheduled_activity, attrs) do
scheduled_activity
|> cast(attrs, [:scheduled_at])
|> validate_required([:scheduled_at])
|> validate_scheduled_at()
end
- def validate_scheduled_at(changeset) do
+ defp validate_scheduled_at(changeset) do
validate_change(changeset, :scheduled_at, fn _, scheduled_at ->
cond do
not far_enough?(scheduled_at) ->
@@ -77,7 +77,7 @@ def validate_scheduled_at(changeset) do
end)
end
- def exceeds_daily_user_limit?(user_id, scheduled_at) do
+ defp exceeds_daily_user_limit?(user_id, scheduled_at) do
ScheduledActivity
|> where(user_id: ^user_id)
|> where([sa], type(sa.scheduled_at, :date) == type(^scheduled_at, :date))
@@ -86,7 +86,7 @@ def exceeds_daily_user_limit?(user_id, scheduled_at) do
|> Kernel.>=(Config.get([ScheduledActivity, :daily_user_limit]))
end
- def exceeds_total_user_limit?(user_id) do
+ defp exceeds_total_user_limit?(user_id) do
ScheduledActivity
|> where(user_id: ^user_id)
|> select([sa], count(sa.id))
@@ -108,7 +108,7 @@ def far_enough?(scheduled_at) do
diff > @min_offset
end
- def new(%User{} = user, attrs) do
+ defp new(%User{} = user, attrs) do
changeset(%ScheduledActivity{user_id: user.id}, attrs)
end
@@ -187,17 +187,7 @@ def for_user_query(%User{} = user) do
|> where(user_id: ^user.id)
end
- def due_activities(offset \\ 0) do
- naive_datetime =
- NaiveDateTime.utc_now()
- |> NaiveDateTime.add(offset, :millisecond)
-
- ScheduledActivity
- |> where([sa], sa.scheduled_at < ^naive_datetime)
- |> Repo.all()
- end
-
- def job_query(scheduled_activity_id) do
+ defp job_query(scheduled_activity_id) do
from(j in Oban.Job,
where: j.queue == "scheduled_activities",
where: fragment("args ->> 'activity_id' = ?::text", ^to_string(scheduled_activity_id))
From 873aa9da1cbb26eb25bac93e7ed8e95b2d47c4ad Mon Sep 17 00:00:00 2001
From: Oneric
Date: Tue, 23 Apr 2024 23:12:39 +0200
Subject: [PATCH 092/153] activity_draft: mark new/2 as private
---
lib/pleroma/web/common_api/activity_draft.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index ced6371d6..4555efd61 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -41,7 +41,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
preview?: false,
changes: %{}
- def new(user, params) do
+ defp new(user, params) do
%__MODULE__{user: user}
|> put_params(params)
end
From 94e9c8f48a20e5cdd77854d40106acc7af10e16f Mon Sep 17 00:00:00 2001
From: Oneric
Date: Tue, 23 Apr 2024 23:59:42 +0200
Subject: [PATCH 093/153] Purge unused media description update on post
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In MastoAPI media descriptions are updated via the
media update API not upon post creation or post update.
This functionality was originally added about 6 years ago in
ba93396649f65a1f32eeedfd9ccd32cf308e7210 which was part of
https://git.pleroma.social/pleroma/pleroma/-/merge_requests/626 and
https://git.pleroma.social/pleroma/pleroma-fe/-/merge_requests/450.
They introduced image descriptions to the front- and backend,
but predate adoption of Mastodon API.
For a while adding an `descriptions` array on post creation might have
continued to work as an undocumented Pleroma extension to Masto API, but
at latest when OpenAPI specs were added for those endpoints four years
ago in 7803a85d2ced092fbd8e0f1bde0944bd27f8d649, these codepaths ceased
to be used. The API specs don’t list a `descriptions` parameter and
any unknown parameters are stripped out.
The attachments_from_ids function is only called from
ScheduledActivity and ActivityDraft.create with the latter
only being called by CommonAPI.{post,update} whihc in turn
are only called from ScheduledActivity again, MastoAPI controller
and without any attachment or description parameter WelcomeMessage.
Therefore no codepath can contain a descriptions parameter.
---
lib/pleroma/web/common_api/utils.ex | 25 ++++----------------
test/pleroma/web/common_api/utils_test.exs | 27 ----------------------
2 files changed, 4 insertions(+), 48 deletions(-)
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index e79b12fc9..d80109a98 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -22,19 +22,13 @@ defmodule Pleroma.Web.CommonAPI.Utils do
require Logger
require Pleroma.Constants
- def attachments_from_ids(%{media_ids: ids, descriptions: desc}) do
- attachments_from_ids_descs(ids, desc)
- end
-
def attachments_from_ids(%{media_ids: ids}) do
- attachments_from_ids_no_descs(ids)
+ attachments_from_ids(ids)
end
- def attachments_from_ids(_), do: []
+ def attachments_from_ids([]), do: []
- def attachments_from_ids_no_descs([]), do: []
-
- def attachments_from_ids_no_descs(ids) do
+ def attachments_from_ids(ids) when is_list(ids) do
Enum.map(ids, fn media_id ->
case get_attachment(media_id) do
%Object{data: data} -> data
@@ -44,18 +38,7 @@ def attachments_from_ids_no_descs(ids) do
|> Enum.reject(&is_nil/1)
end
- def attachments_from_ids_descs([], _), do: []
-
- def attachments_from_ids_descs(ids, descs_str) do
- {_, descs} = Jason.decode(descs_str)
-
- Enum.map(ids, fn media_id ->
- with %Object{data: data} <- get_attachment(media_id) do
- Map.put(data, "name", descs[media_id])
- end
- end)
- |> Enum.reject(&is_nil/1)
- end
+ def attachments_from_ids(_), do: []
defp get_attachment(media_id) do
Repo.get(Object, media_id)
diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs
index f56d21c70..d98eb76ad 100644
--- a/test/pleroma/web/common_api/utils_test.exs
+++ b/test/pleroma/web/common_api/utils_test.exs
@@ -590,34 +590,7 @@ test "returns recipients when object not found" do
end
end
- describe "attachments_from_ids_descs/2" do
- test "returns [] when attachment ids is empty" do
- assert Utils.attachments_from_ids_descs([], "{}") == []
- end
-
- test "returns list attachments with desc" do
- object = insert(:note)
- desc = Jason.encode!(%{object.id => "test-desc"})
-
- assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc) == [
- Map.merge(object.data, %{"name" => "test-desc"})
- ]
- end
- end
-
describe "attachments_from_ids/1" do
- test "returns attachments with descs" do
- object = insert(:note)
- desc = Jason.encode!(%{object.id => "test-desc"})
-
- assert Utils.attachments_from_ids(%{
- media_ids: ["#{object.id}"],
- descriptions: desc
- }) == [
- Map.merge(object.data, %{"name" => "test-desc"})
- ]
- end
-
test "returns attachments without descs" do
object = insert(:note)
assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == [object.data]
From 6ef6b2a289f4165dee4e8ba800d7cb2e3b9285a1 Mon Sep 17 00:00:00 2001
From: Oneric
Date: Wed, 24 Apr 2024 20:03:30 +0200
Subject: [PATCH 094/153] Apply rate limits to status updates
---
lib/pleroma/web/mastodon_api/controllers/status_controller.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex
index 338a35052..acb5f15a0 100644
--- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex
@@ -87,7 +87,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do
%{scopes: ["write:bookmarks"]} when action in [:bookmark, :unbookmark]
)
- @rate_limited_status_actions ~w(reblog unreblog favourite unfavourite create delete)a
+ @rate_limited_status_actions ~w(reblog unreblog favourite unfavourite create delete update)a
plug(
RateLimiter,
From 0d6623720582105f2e8cddedb471a0f6066338d0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?marcin=20miko=C5=82ajczak?=
Date: Thu, 24 Aug 2023 00:37:39 +0200
Subject: [PATCH 095/153] Fix validate_webfinger when running a different
domain for Webfinger
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: marcin mikołajczak
---
lib/pleroma/application.ex | 3 ++-
lib/pleroma/web/web_finger.ex | 30 ++++++++++++++++++++++--------
test/pleroma/user_test.exs | 4 ++--
3 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 28a86d0aa..07f3e8577 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -179,7 +179,8 @@ defp cachex_children do
build_cachex("translations", default_ttl: :timer.hours(24 * 30), limit: 2500),
build_cachex("instances", default_ttl: :timer.hours(24), ttl_interval: 1000, limit: 2500),
build_cachex("request_signatures", default_ttl: :timer.hours(24 * 30), limit: 3000),
- build_cachex("rel_me", default_ttl: :timer.hours(24 * 30), limit: 300)
+ build_cachex("rel_me", default_ttl: :timer.hours(24 * 30), limit: 300),
+ build_cachex("host_meta", default_ttl: :timer.minutes(120), limit: 5000)
]
end
diff --git a/lib/pleroma/web/web_finger.ex b/lib/pleroma/web/web_finger.ex
index eeb186ce7..7afbf856a 100644
--- a/lib/pleroma/web/web_finger.ex
+++ b/lib/pleroma/web/web_finger.ex
@@ -156,7 +156,16 @@ def get_template_from_xml(body) do
end
end
+ @cachex Pleroma.Config.get([:cachex, :provider], Cachex)
def find_lrdd_template(domain) do
+ @cachex.fetch!(:host_meta_cache, domain, fn _ ->
+ {:commit, fetch_lrdd_template(domain)}
+ end)
+ rescue
+ e -> {:error, "Cachex error: #{inspect(e)}"}
+ end
+
+ defp fetch_lrdd_template(domain) do
# WebFinger is restricted to HTTPS - https://tools.ietf.org/html/rfc7033#section-9.1
meta_url = "https://#{domain}/.well-known/host-meta"
@@ -169,7 +178,7 @@ def find_lrdd_template(domain) do
end
end
- defp get_address_from_domain(domain, encoded_account) when is_binary(domain) do
+ defp get_address_from_domain(domain, "acct:" <> _ = encoded_account) when is_binary(domain) do
case find_lrdd_template(domain) do
{:ok, template} ->
String.replace(template, "{uri}", encoded_account)
@@ -179,6 +188,11 @@ defp get_address_from_domain(domain, encoded_account) when is_binary(domain) do
end
end
+ defp get_address_from_domain(domain, account) when is_binary(domain) do
+ encoded_account = URI.encode("acct:#{account}")
+ get_address_from_domain(domain, encoded_account)
+ end
+
defp get_address_from_domain(_, _), do: {:error, :webfinger_no_domain}
@spec finger(String.t()) :: {:ok, map()} | {:error, any()}
@@ -193,9 +207,7 @@ def finger(account) do
URI.parse(account).host
end
- encoded_account = URI.encode("acct:#{account}")
-
- with address when is_binary(address) <- get_address_from_domain(domain, encoded_account),
+ with address when is_binary(address) <- get_address_from_domain(domain, account),
{:ok, %{status: status, body: body, headers: headers}} when status in 200..299 <-
HTTP.get(
address,
@@ -229,13 +241,15 @@ def finger(account) do
end
end
- defp validate_webfinger(url, %{"subject" => "acct:" <> acct} = data) do
- with %URI{host: request_host} <- URI.parse(url),
- [_name, acct_host] <- String.split(acct, "@"),
+ defp validate_webfinger(request_url, %{"subject" => "acct:" <> acct = subject} = data) do
+ with [_name, acct_host] <- String.split(acct, "@"),
+ {_, url} <- {:address, get_address_from_domain(acct_host, subject)},
+ %URI{host: request_host} <- URI.parse(request_url),
+ %URI{host: acct_host} <- URI.parse(url),
{_, true} <- {:hosts_match, acct_host == request_host} do
{:ok, data}
else
- _ -> {:error, {:webfinger_invalid, url, data}}
+ _ -> {:error, {:webfinger_invalid, request_url, data}}
end
end
diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs
index 96ca8d0fd..3beaeaac8 100644
--- a/test/pleroma/user_test.exs
+++ b/test/pleroma/user_test.exs
@@ -765,7 +765,7 @@ test "gets an existing user by nickname starting with http" do
setup do: clear_config([Pleroma.Web.WebFinger, :update_nickname_on_user_fetch], true)
test "for mastodon" do
- Tesla.Mock.mock(fn
+ Tesla.Mock.mock_global(fn
%{url: "https://example.com/.well-known/host-meta"} ->
%Tesla.Env{
status: 302,
@@ -823,7 +823,7 @@ test "for mastodon" do
end
test "for pleroma" do
- Tesla.Mock.mock(fn
+ Tesla.Mock.mock_global(fn
%{url: "https://example.com/.well-known/host-meta"} ->
%Tesla.Env{
status: 302,
From 3a21293970b9727d79b11ecc2534aa4a1d029b76 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?marcin=20miko=C5=82ajczak?=
Date: Thu, 24 Aug 2023 01:09:00 +0200
Subject: [PATCH 096/153] Fix tests
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: marcin mikołajczak
---
lib/pleroma/web/web_finger.ex | 2 -
test/pleroma/signature_test.exs | 2 +-
test/pleroma/user_test.exs | 102 +---------
.../web_finger/web_finger_controller_test.exs | 2 +-
test/pleroma/web/web_finger_test.exs | 1 -
test/support/http_request_mock.ex | 180 ++++++++++++++++++
6 files changed, 188 insertions(+), 101 deletions(-)
diff --git a/lib/pleroma/web/web_finger.ex b/lib/pleroma/web/web_finger.ex
index 7afbf856a..42539f0e2 100644
--- a/lib/pleroma/web/web_finger.ex
+++ b/lib/pleroma/web/web_finger.ex
@@ -233,7 +233,6 @@ def finger(account) do
{:ok, data} -> validate_webfinger(address, data)
error -> error
end
-
else
error ->
Logger.debug("Couldn't finger #{account}: #{inspect(error)}")
@@ -254,5 +253,4 @@ defp validate_webfinger(request_url, %{"subject" => "acct:" <> acct = subject} =
end
defp validate_webfinger(url, data), do: {:error, {:webfinger_invalid, url, data}}
-
end
diff --git a/test/pleroma/signature_test.exs b/test/pleroma/signature_test.exs
index c946da9ef..b7c9bbb62 100644
--- a/test/pleroma/signature_test.exs
+++ b/test/pleroma/signature_test.exs
@@ -155,7 +155,7 @@ test "it deduces the actor ID for streams" do
test "it deduces the actor ID for bridgy" do
assert Signature.key_id_to_actor_id("https://example.com/1234#key") ==
- {:ok, "https://example.com/1234"}
+ {:ok, "https://example.com/1234"}
end
test "it calls webfinger for 'acct:' accounts" do
diff --git a/test/pleroma/user_test.exs b/test/pleroma/user_test.exs
index 3beaeaac8..de71f4b95 100644
--- a/test/pleroma/user_test.exs
+++ b/test/pleroma/user_test.exs
@@ -765,109 +765,19 @@ test "gets an existing user by nickname starting with http" do
setup do: clear_config([Pleroma.Web.WebFinger, :update_nickname_on_user_fetch], true)
test "for mastodon" do
- Tesla.Mock.mock_global(fn
- %{url: "https://example.com/.well-known/host-meta"} ->
- %Tesla.Env{
- status: 302,
- headers: [{"location", "https://sub.example.com/.well-known/host-meta"}]
- }
-
- %{url: "https://sub.example.com/.well-known/host-meta"} ->
- %Tesla.Env{
- status: 200,
- body:
- "test/fixtures/webfinger/masto-host-meta.xml"
- |> File.read!()
- |> String.replace("{{domain}}", "sub.example.com")
- }
-
- %{url: "https://sub.example.com/.well-known/webfinger?resource=acct:a@example.com"} ->
- %Tesla.Env{
- status: 200,
- body:
- "test/fixtures/webfinger/masto-webfinger.json"
- |> File.read!()
- |> String.replace("{{nickname}}", "a")
- |> String.replace("{{domain}}", "example.com")
- |> String.replace("{{subdomain}}", "sub.example.com"),
- headers: [{"content-type", "application/jrd+json"}]
- }
-
- %{url: "https://sub.example.com/users/a"} ->
- %Tesla.Env{
- status: 200,
- body:
- "test/fixtures/webfinger/masto-user.json"
- |> File.read!()
- |> String.replace("{{nickname}}", "a")
- |> String.replace("{{domain}}", "sub.example.com"),
- headers: [{"content-type", "application/activity+json"}]
- }
-
- %{url: "https://sub.example.com/users/a/collections/featured"} ->
- %Tesla.Env{
- status: 200,
- body:
- File.read!("test/fixtures/users_mock/masto_featured.json")
- |> String.replace("{{domain}}", "sub.example.com")
- |> String.replace("{{nickname}}", "a"),
- headers: [{"content-type", "application/activity+json"}]
- }
- end)
-
- ap_id = "a@example.com"
+ ap_id = "a@mastodon.example"
{:ok, fetched_user} = User.get_or_fetch(ap_id)
- assert fetched_user.ap_id == "https://sub.example.com/users/a"
- assert fetched_user.nickname == "a@example.com"
+ assert fetched_user.ap_id == "https://sub.mastodon.example/users/a"
+ assert fetched_user.nickname == "a@mastodon.example"
end
test "for pleroma" do
- Tesla.Mock.mock_global(fn
- %{url: "https://example.com/.well-known/host-meta"} ->
- %Tesla.Env{
- status: 302,
- headers: [{"location", "https://sub.example.com/.well-known/host-meta"}]
- }
-
- %{url: "https://sub.example.com/.well-known/host-meta"} ->
- %Tesla.Env{
- status: 200,
- body:
- "test/fixtures/webfinger/pleroma-host-meta.xml"
- |> File.read!()
- |> String.replace("{{domain}}", "sub.example.com")
- }
-
- %{url: "https://sub.example.com/.well-known/webfinger?resource=acct:a@example.com"} ->
- %Tesla.Env{
- status: 200,
- body:
- "test/fixtures/webfinger/pleroma-webfinger.json"
- |> File.read!()
- |> String.replace("{{nickname}}", "a")
- |> String.replace("{{domain}}", "example.com")
- |> String.replace("{{subdomain}}", "sub.example.com"),
- headers: [{"content-type", "application/jrd+json"}]
- }
-
- %{url: "https://sub.example.com/users/a"} ->
- %Tesla.Env{
- status: 200,
- body:
- "test/fixtures/webfinger/pleroma-user.json"
- |> File.read!()
- |> String.replace("{{nickname}}", "a")
- |> String.replace("{{domain}}", "sub.example.com"),
- headers: [{"content-type", "application/activity+json"}]
- }
- end)
-
- ap_id = "a@example.com"
+ ap_id = "a@pleroma.example"
{:ok, fetched_user} = User.get_or_fetch(ap_id)
- assert fetched_user.ap_id == "https://sub.example.com/users/a"
- assert fetched_user.nickname == "a@example.com"
+ assert fetched_user.ap_id == "https://sub.pleroma.example/users/a"
+ assert fetched_user.nickname == "a@pleroma.example"
end
end
diff --git a/test/pleroma/web/web_finger/web_finger_controller_test.exs b/test/pleroma/web/web_finger/web_finger_controller_test.exs
index f792f20e6..6982094ae 100644
--- a/test/pleroma/web/web_finger/web_finger_controller_test.exs
+++ b/test/pleroma/web/web_finger/web_finger_controller_test.exs
@@ -50,7 +50,7 @@ test "Webfinger JRD" do
]
end
- test "reach user on tld, while pleroma is runned on subdomain" do
+ test "reach user on tld, while pleroma is running on subdomain" do
Pleroma.Web.Endpoint.config_change(
[{Pleroma.Web.Endpoint, url: [host: "sub.example.com"]}],
[]
diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs
index 5c46d6988..68c3c7754 100644
--- a/test/pleroma/web/web_finger_test.exs
+++ b/test/pleroma/web/web_finger_test.exs
@@ -188,7 +188,6 @@ test "prevents spoofing" do
{:error, _data} = WebFinger.finger("meanie@bad.com")
end
-
end
@tag capture_log: true
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index 042e4110e..f8cc2b69f 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -1464,6 +1464,186 @@ def get("https://p.helene.moe/objects/fd5910ac-d9dc-412e-8d1d-914b203296c4", _,
}}
end
+ def get("https://misskey.io/notes/8vs6wxufd0", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
+ def get("https://google.com/", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/google.html")}}
+ end
+
+ def get("https://yahoo.com/", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/yahoo.html")}}
+ end
+
+ def get("https://example.com/error", _, _, _), do: {:error, :overload}
+
+ def get("https://example.com/ogp-missing-title", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/rich_media/ogp-missing-title.html")
+ }}
+ end
+
+ def get("https://example.com/oembed", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/oembed.html")}}
+ end
+
+ def get("https://example.com/oembed.json", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/oembed.json")}}
+ end
+
+ def get("https://example.com/twitter-card", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/twitter_card.html")}}
+ end
+
+ def get("https://example.com/non-ogp", _, _, _) do
+ {:ok,
+ %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/non_ogp_embed.html")}}
+ end
+
+ def get("https://example.com/empty", _, _, _) do
+ {:ok, %Tesla.Env{status: 200, body: "hello"}}
+ end
+
+ def get("https://friends.grishka.me/posts/54642", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/smithereen_non_anonymous_poll.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
+ def get("https://friends.grishka.me/users/1", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/smithereen_user.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
+ def get("https://mastodon.example/.well-known/host-meta", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 302,
+ headers: [{"location", "https://sub.mastodon.example/.well-known/host-meta"}]
+ }}
+ end
+
+ def get("https://sub.mastodon.example/.well-known/host-meta", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/masto-host-meta.xml"
+ |> File.read!()
+ |> String.replace("{{domain}}", "sub.mastodon.example")
+ }}
+ end
+
+ def get(
+ "https://sub.mastodon.example/.well-known/webfinger?resource=acct:a@mastodon.example",
+ _,
+ _,
+ _
+ ) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/masto-webfinger.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "mastodon.example")
+ |> String.replace("{{subdomain}}", "sub.mastodon.example"),
+ headers: [{"content-type", "application/jrd+json"}]
+ }}
+ end
+
+ def get("https://sub.mastodon.example/users/a", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/masto-user.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "sub.mastodon.example"),
+ headers: [{"content-type", "application/activity+json"}]
+ }}
+ end
+
+ def get("https://sub.mastodon.example/users/a/collections/featured", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body:
+ File.read!("test/fixtures/users_mock/masto_featured.json")
+ |> String.replace("{{domain}}", "sub.mastodon.example")
+ |> String.replace("{{nickname}}", "a"),
+ headers: [{"content-type", "application/activity+json"}]
+ }}
+ end
+
+ def get("https://pleroma.example/.well-known/host-meta", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 302,
+ headers: [{"location", "https://sub.pleroma.example/.well-known/host-meta"}]
+ }}
+ end
+
+ def get("https://sub.pleroma.example/.well-known/host-meta", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/pleroma-host-meta.xml"
+ |> File.read!()
+ |> String.replace("{{domain}}", "sub.pleroma.example")
+ }}
+ end
+
+ def get(
+ "https://sub.pleroma.example/.well-known/webfinger?resource=acct:a@pleroma.example",
+ _,
+ _,
+ _
+ ) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/pleroma-webfinger.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "pleroma.example")
+ |> String.replace("{{subdomain}}", "sub.pleroma.example"),
+ headers: [{"content-type", "application/jrd+json"}]
+ }}
+ end
+
+ def get("https://sub.pleroma.example/users/a", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body:
+ "test/fixtures/webfinger/pleroma-user.json"
+ |> File.read!()
+ |> String.replace("{{nickname}}", "a")
+ |> String.replace("{{domain}}", "sub.pleroma.example"),
+ headers: [{"content-type", "application/activity+json"}]
+ }}
+ end
+
def get(url, query, body, headers) do
{:error,
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}
From 3e1f5e5372e6c74589dad9f952015e317911b57e Mon Sep 17 00:00:00 2001
From: Lain Soykaf
Date: Wed, 22 May 2024 18:45:34 +0400
Subject: [PATCH 097/153] WebFingerControllerTest: Restore host after test.
---
test/pleroma/web/web_finger/web_finger_controller_test.exs | 5 -----
1 file changed, 5 deletions(-)
diff --git a/test/pleroma/web/web_finger/web_finger_controller_test.exs b/test/pleroma/web/web_finger/web_finger_controller_test.exs
index 6982094ae..afb4ce92d 100644
--- a/test/pleroma/web/web_finger/web_finger_controller_test.exs
+++ b/test/pleroma/web/web_finger/web_finger_controller_test.exs
@@ -51,11 +51,6 @@ test "Webfinger JRD" do
end
test "reach user on tld, while pleroma is running on subdomain" do
- Pleroma.Web.Endpoint.config_change(
- [{Pleroma.Web.Endpoint, url: [host: "sub.example.com"]}],
- []
- )
-
clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")
clear_config([Pleroma.Web.WebFinger, :domain], "example.com")
From 842cac2a502ec77cd148a82e9044ddd6507d407d Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Wed, 22 May 2024 19:30:03 +0100
Subject: [PATCH 098/153] ensure we mock_global
---
test/pleroma/web/web_finger_test.exs | 2 +-
test/support/http_request_mock.ex | 9 ---------
2 files changed, 1 insertion(+), 10 deletions(-)
diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs
index 68c3c7754..2af084090 100644
--- a/test/pleroma/web/web_finger_test.exs
+++ b/test/pleroma/web/web_finger_test.exs
@@ -9,7 +9,7 @@ defmodule Pleroma.Web.WebFingerTest do
import Tesla.Mock
setup do
- mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+ mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
:ok
end
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index f8cc2b69f..7bfcfaa0e 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -1464,15 +1464,6 @@ def get("https://p.helene.moe/objects/fd5910ac-d9dc-412e-8d1d-914b203296c4", _,
}}
end
- def get("https://misskey.io/notes/8vs6wxufd0", _, _, _) do
- {:ok,
- %Tesla.Env{
- status: 200,
- body: File.read!("test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json"),
- headers: activitypub_object_headers()
- }}
- end
-
def get("https://google.com/", _, _, _) do
{:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/google.html")}}
end
From 0c2b33458d1cccabfc4b5f0db53f963ea673ecb9 Mon Sep 17 00:00:00 2001
From: Oneric
Date: Wed, 24 Apr 2024 17:46:18 +0200
Subject: [PATCH 099/153] Restrict media usage to owners
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In Mastodon media can only be used by owners and only be associated with
a single post. We currently allow media to be associated with several
posts and until now did not limit their usage in posts to media owners.
However, media update and GET lookup was already limited to owners.
(In accordance with allowing media reuse, we also still allow GET
lookups of media already used in a post unlike Mastodon)
Allowing reuse isn’t problematic per se, but allowing use by non-owners
can be problematic if media ids of private-scoped posts can be guessed
since creating a new post with this media id will reveal the uploaded
file content and alt text.
Given media ids are currently just part of a sequentieal series shared
with some other objects, guessing media ids is with some persistence
indeed feasible.
E.g. sampline some public media ids from a real-world
instance with 112 total and 61 monthly-active users:
17.465.096 at t0
17.472.673 at t1 = t0 + 4h
17.473.248 at t2 = t1 + 20min
This gives about 30 new ids per minute of which most won't be
local media but remote and local posts, poll answers etc.
Assuming the default ratelimit of 15 post actions per 10s, scraping all
media for the 4h interval takes about 84 minutes and scraping the 20min
range mere 6.3 minutes. (Until the preceding commit, post updates were
not rate limited at all, allowing even faster scraping.)
If an attacker can infer (e.g. via reply to a follower-only post not
accessbile to the attacker) some sensitive information was uploaded
during a specific time interval and has some pointers regarding the
nature of the information, identifying the specific upload out of all
scraped media for this timerange is not impossible.
Thus restrict media usage to owners.
Checking ownership just in ActivitDraft would already be sufficient,
since when a scheduled status actually gets posted it goes through
ActivityDraft again, but would erroneously return a success status
when scheduling an illegal post.
Independently discovered and fixed by mint in Pleroma
https://git.pleroma.social/pleroma/pleroma/-/commit/1afde067b12ad0062c1820091ea9b0a680819281
---
CHANGELOG.md | 3 +
lib/pleroma/scheduled_activity.ex | 43 +++++++++----
lib/pleroma/web/common_api/activity_draft.ex | 11 +++-
lib/pleroma/web/common_api/utils.ex | 26 ++++----
test/pleroma/web/common_api/utils_test.exs | 8 ++-
.../controllers/status_controller_test.exs | 64 +++++++++++++++++++
.../views/scheduled_activity_view_test.exs | 3 +-
7 files changed, 125 insertions(+), 33 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2284f5c8d..48e487bf1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
+## Fixed
+- Issue allowing non-owners to use media objects in posts
+
## 2024.04
## Added
diff --git a/lib/pleroma/scheduled_activity.ex b/lib/pleroma/scheduled_activity.ex
index 3e1c51abb..5292b1491 100644
--- a/lib/pleroma/scheduled_activity.ex
+++ b/lib/pleroma/scheduled_activity.ex
@@ -40,19 +40,29 @@ defp with_media_attachments(
%{changes: %{params: %{"media_ids" => media_ids} = params}} = changeset
)
when is_list(media_ids) do
- media_attachments = Utils.attachments_from_ids(%{media_ids: media_ids})
+ user = User.get_by_id(changeset.data.user_id)
- params =
- params
- |> Map.put("media_attachments", media_attachments)
- |> Map.put("media_ids", media_ids)
+ case Utils.attachments_from_ids(user, %{media_ids: media_ids}) do
+ media_attachments when is_list(media_attachments) ->
+ params =
+ params
+ |> Map.put("media_attachments", media_attachments)
+ |> Map.put("media_ids", media_ids)
- put_change(changeset, :params, params)
+ put_change(changeset, :params, params)
+
+ {:error, _} = e ->
+ e
+
+ e ->
+ {:error, e}
+ end
end
defp with_media_attachments(changeset), do: changeset
defp update_changeset(%ScheduledActivity{} = scheduled_activity, attrs) do
+ # note: should this ever allow swapping media attachments, make sure ownership is checked
scheduled_activity
|> cast(attrs, [:scheduled_at])
|> validate_required([:scheduled_at])
@@ -115,13 +125,22 @@ defp new(%User{} = user, attrs) do
@doc """
Creates ScheduledActivity and add to queue to perform at scheduled_at date
"""
- @spec create(User.t(), map()) :: {:ok, ScheduledActivity.t()} | {:error, Ecto.Changeset.t()}
+ @spec create(User.t(), map()) :: {:ok, ScheduledActivity.t()} | {:error, any()}
def create(%User{} = user, attrs) do
- Multi.new()
- |> Multi.insert(:scheduled_activity, new(user, attrs))
- |> maybe_add_jobs(Config.get([ScheduledActivity, :enabled]))
- |> Repo.transaction()
- |> transaction_response
+ case new(user, attrs) do
+ %Ecto.Changeset{} = sched_data ->
+ Multi.new()
+ |> Multi.insert(:scheduled_activity, sched_data)
+ |> maybe_add_jobs(Config.get([ScheduledActivity, :enabled]))
+ |> Repo.transaction()
+ |> transaction_response
+
+ {:error, _} = e ->
+ e
+
+ e ->
+ {:error, e}
+ end
end
defp maybe_add_jobs(multi, true) do
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 4555efd61..2d24edec4 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -92,9 +92,14 @@ defp full_payload(%{status: status, summary: summary} = draft) do
end
end
- defp attachments(%{params: params} = draft) do
- attachments = Utils.attachments_from_ids(params)
- %__MODULE__{draft | attachments: attachments}
+ defp attachments(%{params: params, user: user} = draft) do
+ case Utils.attachments_from_ids(user, params) do
+ attachments when is_list(attachments) ->
+ %__MODULE__{draft | attachments: attachments}
+
+ {:error, reason} ->
+ add_error(draft, reason)
+ end
end
defp in_reply_to(%{params: %{in_reply_to_status_id: ""}} = draft), do: draft
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index d80109a98..6d2113100 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -22,24 +22,24 @@ defmodule Pleroma.Web.CommonAPI.Utils do
require Logger
require Pleroma.Constants
- def attachments_from_ids(%{media_ids: ids}) do
- attachments_from_ids(ids)
+ def attachments_from_ids(user, %{media_ids: ids}) do
+ attachments_from_ids(user, ids, [])
end
- def attachments_from_ids([]), do: []
+ def attachments_from_ids(_, _), do: []
- def attachments_from_ids(ids) when is_list(ids) do
- Enum.map(ids, fn media_id ->
- case get_attachment(media_id) do
- %Object{data: data} -> data
- _ -> nil
- end
- end)
- |> Enum.reject(&is_nil/1)
+ defp attachments_from_ids(_user, [], acc), do: Enum.reverse(acc)
+
+ defp attachments_from_ids(user, [media_id | ids], acc) do
+ with {_, %Object{} = object} <- {:get, get_attachment(media_id)},
+ :ok <- Object.authorize_access(object, user) do
+ attachments_from_ids(user, ids, [object.data | acc])
+ else
+ {:get, _} -> attachments_from_ids(user, ids, acc)
+ {:error, reason} -> {:error, reason}
+ end
end
- def attachments_from_ids(_), do: []
-
defp get_attachment(media_id) do
Repo.get(Object, media_id)
end
diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs
index d98eb76ad..10abb89e5 100644
--- a/test/pleroma/web/common_api/utils_test.exs
+++ b/test/pleroma/web/common_api/utils_test.exs
@@ -592,12 +592,14 @@ test "returns recipients when object not found" do
describe "attachments_from_ids/1" do
test "returns attachments without descs" do
- object = insert(:note)
- assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == [object.data]
+ user = insert(:user)
+ object = insert(:note, user: user)
+ assert Utils.attachments_from_ids(user, %{media_ids: ["#{object.id}"]}) == [object.data]
end
test "returns [] when not pass media_ids" do
- assert Utils.attachments_from_ids(%{}) == []
+ user = insert(:user)
+ assert Utils.attachments_from_ids(user, %{}) == []
end
end
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 f58045640..a15fd42fc 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -220,6 +220,28 @@ test "posting an undefined status with an attachment", %{user: user, conn: conn}
assert json_response_and_validate_schema(conn, 200)
end
+ test "refuses to post non-owned media", %{conn: conn} do
+ other_user = insert(:user)
+
+ file = %Plug.Upload{
+ content_type: "image/jpeg",
+ path: Path.absname("test/fixtures/image.jpg"),
+ filename: "an_image.jpg"
+ }
+
+ {:ok, upload} = ActivityPub.upload(file, actor: other_user.ap_id)
+
+ conn =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "mew",
+ "media_ids" => [to_string(upload.id)]
+ })
+
+ assert json_response(conn, 422) == %{"error" => "forbidden"}
+ end
+
test "posting a status with an invalid language", %{conn: conn} do
conn =
conn
@@ -569,6 +591,29 @@ test "creates a scheduled activity with a media attachment", %{user: user, conn:
assert %{"type" => "image"} = media_attachment
end
+ test "refuses to schedule post with non-owned media", %{conn: conn} do
+ other_user = insert(:user)
+
+ file = %Plug.Upload{
+ content_type: "image/jpeg",
+ path: Path.absname("test/fixtures/image.jpg"),
+ filename: "an_image.jpg"
+ }
+
+ {:ok, upload} = ActivityPub.upload(file, actor: other_user.ap_id)
+
+ conn =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "mew",
+ "scheduled_at" => DateTime.add(DateTime.utc_now(), 6, :minute),
+ "media_ids" => [to_string(upload.id)]
+ })
+
+ assert json_response(conn, 403) == %{"error" => "Access denied"}
+ end
+
test "skips the scheduling and creates the activity if scheduled_at is earlier than 5 minutes from now",
%{conn: conn} do
scheduled_at =
@@ -2406,6 +2451,25 @@ test "it updates the attachments", %{conn: conn, user: user} do
assert [%{"id" => ^attachment_id}] = response["media_attachments"]
end
+ test "it does not update to non-owned attachments", %{conn: conn, user: user} do
+ other_user = insert(:user)
+ attachment = insert(:attachment, user: other_user)
+ attachment_id = to_string(attachment.id)
+
+ {:ok, activity} = CommonAPI.post(user, %{status: "mew mew #abc", spoiler_text: "#def"})
+
+ conn =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> put("/api/v1/statuses/#{activity.id}", %{
+ "status" => "mew mew #abc",
+ "spoiler_text" => "#def",
+ "media_ids" => [attachment_id]
+ })
+
+ assert json_response(conn, 400) == %{"error" => "internal_server_error"}
+ end
+
test "it does not update visibility", %{conn: conn, user: user} do
{:ok, activity} =
CommonAPI.post(user, %{
diff --git a/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs b/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs
index e323f3a1f..cc893f94e 100644
--- a/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/scheduled_activity_view_test.exs
@@ -47,8 +47,7 @@ test "A scheduled activity with a media attachment" do
expected = %{
id: to_string(scheduled_activity.id),
media_attachments:
- %{media_ids: [upload.id]}
- |> Utils.attachments_from_ids()
+ Utils.attachments_from_ids(user, %{media_ids: [upload.id]})
|> Enum.map(&StatusView.render("attachment.json", %{attachment: &1})),
params: %{
in_reply_to_id: to_string(activity.id),
From fbd961c7474e5176fc26f850f8e6d3334e0aac27 Mon Sep 17 00:00:00 2001
From: Oneric
Date: Thu, 25 Apr 2024 18:10:34 +0200
Subject: [PATCH 100/153] Drop activity_type override for uploads
Afaict this was never used, but keeping this (in theory) possible
hinders detecting which objects are actually media uploads and
which proper ActivityPub objects.
It was originally added as part of upload support itself in
02d3dc6869f388388ea744ea4ee3b54279d55e86 without being used
and `git log -S:activity_type` and `git log -Sactivity_type:`
don't find any other commits using this.
---
lib/pleroma/upload.ex | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex
index ad5c2c655..426fe9f1b 100644
--- a/lib/pleroma/upload.ex
+++ b/lib/pleroma/upload.ex
@@ -13,7 +13,6 @@ defmodule Pleroma.Upload do
* `:uploader`: override uploader
* `:filters`: override filters
* `:size_limit`: override size limit
- * `:activity_type`: override activity type
The `%Pleroma.Upload{}` struct: all documented fields are meant to be overwritten in filters:
@@ -48,7 +47,6 @@ defmodule Pleroma.Upload do
@type option ::
{:type, :avatar | :banner | :background}
| {:description, String.t()}
- | {:activity_type, String.t()}
| {:size_limit, nil | non_neg_integer()}
| {:uploader, module()}
| {:filters, [module()]}
@@ -143,7 +141,7 @@ defp get_opts(opts) do
end
%{
- activity_type: Keyword.get(opts, :activity_type, activity_type),
+ activity_type: activity_type,
size_limit: Keyword.get(opts, :size_limit, size_limit),
uploader: Keyword.get(opts, :uploader, Pleroma.Config.get([__MODULE__, :uploader])),
filters:
From 9a91299f96c4c405cfdb8b8f78d0906b1cf98001 Mon Sep 17 00:00:00 2001
From: Oneric
Date: Thu, 25 Apr 2024 18:16:21 +0200
Subject: [PATCH 101/153] Don't try to handle non-media objects as media
Trying to display non-media as media crashed the renderer,
but when posting a status with a valid, non-media object id
the post was still created, but then crashed e.g. timeline rendering.
It also crashed C2S inbox reads, so this could not be used to leak
private posts.
---
CHANGELOG.md | 1 +
lib/pleroma/constants.ex | 3 +++
lib/pleroma/web/common_api/utils.ex | 9 +++++--
.../controllers/media_controller.ex | 11 +++++++--
test/pleroma/web/common_api/utils_test.exs | 8 ++++++-
.../controllers/media_controller_test.exs | 24 +++++++++++++++++++
6 files changed, 51 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 48e487bf1..edd51b74b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Fixed
- Issue allowing non-owners to use media objects in posts
+- Issue allowing use of non-media objects as attachments and crashing timeline rendering
## 2024.04
diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex
index 94608a99b..2681d7671 100644
--- a/lib/pleroma/constants.ex
+++ b/lib/pleroma/constants.ex
@@ -64,4 +64,7 @@ defmodule Pleroma.Constants do
"Service"
]
)
+
+ # Internally used as top-level types for media attachments and user images
+ const(attachment_types, do: ["Document", "Image"])
end
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index 6d2113100..635143621 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -40,8 +40,13 @@ defp attachments_from_ids(user, [media_id | ids], acc) do
end
end
- defp get_attachment(media_id) do
- Repo.get(Object, media_id)
+ def get_attachment(media_id) do
+ with %Object{} = object <- Repo.get(Object, media_id),
+ true <- object.data["type"] in Pleroma.Constants.attachment_types() do
+ object
+ else
+ _ -> nil
+ end
end
@spec get_to_and_cc(ActivityDraft.t()) :: {list(String.t()), list(String.t())}
diff --git a/lib/pleroma/web/mastodon_api/controllers/media_controller.ex b/lib/pleroma/web/mastodon_api/controllers/media_controller.ex
index 5918b288d..3e5a64b51 100644
--- a/lib/pleroma/web/mastodon_api/controllers/media_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/media_controller.ex
@@ -8,6 +8,7 @@ defmodule Pleroma.Web.MastodonAPI.MediaController do
alias Pleroma.Object
alias Pleroma.User
alias Pleroma.Web.ActivityPub.ActivityPub
+ alias Pleroma.Web.CommonAPI.Utils
alias Pleroma.Web.Plugs.OAuthScopesPlug
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
@@ -55,12 +56,15 @@ def create2(_conn, _data), do: {:error, :bad_request}
@doc "PUT /api/v1/media/:id"
def update(%{assigns: %{user: user}, body_params: %{description: description}} = conn, %{id: id}) do
- with %Object{} = object <- Object.get_by_id(id),
+ with {_, %Object{} = object} <- {:get, Utils.get_attachment(id)},
:ok <- Object.authorize_access(object, user),
{:ok, %Object{data: data}} <- Object.update_data(object, %{"name" => description}) do
attachment_data = Map.put(data, "id", object.id)
render(conn, "attachment.json", %{attachment: attachment_data})
+ else
+ {:get, _} -> {:error, :not_found}
+ e -> e
end
end
@@ -68,11 +72,14 @@ def update(conn, data), do: show(conn, data)
@doc "GET /api/v1/media/:id"
def show(%{assigns: %{user: user}} = conn, %{id: id}) do
- with %Object{data: data, id: object_id} = object <- Object.get_by_id(id),
+ with {_, %Object{data: data, id: object_id} = object} <- {:get, Utils.get_attachment(id)},
:ok <- Object.authorize_access(object, user) do
attachment_data = Map.put(data, "id", object_id)
render(conn, "attachment.json", %{attachment: attachment_data})
+ else
+ {:get, _} -> {:error, :not_found}
+ e -> e
end
end
diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs
index 10abb89e5..3d639d389 100644
--- a/test/pleroma/web/common_api/utils_test.exs
+++ b/test/pleroma/web/common_api/utils_test.exs
@@ -593,10 +593,16 @@ test "returns recipients when object not found" do
describe "attachments_from_ids/1" do
test "returns attachments without descs" do
user = insert(:user)
- object = insert(:note, user: user)
+ object = insert(:attachment, user: user)
assert Utils.attachments_from_ids(user, %{media_ids: ["#{object.id}"]}) == [object.data]
end
+ test "returns [] when passed non-media object ids" do
+ user = insert(:user)
+ object = insert(:note, user: user)
+ assert Utils.attachments_from_ids(user, %{media_ids: ["#{object.id}"]}) == []
+ end
+
test "returns [] when not pass media_ids" do
user = insert(:user)
assert Utils.attachments_from_ids(user, %{}) == []
diff --git a/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs
index 7b5f5850d..a224f063b 100644
--- a/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/media_controller_test.exs
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do
use Pleroma.Web.ConnCase, async: false
import ExUnit.CaptureLog
+ import Pleroma.Factory
alias Pleroma.Object
alias Pleroma.User
@@ -174,6 +175,18 @@ test "/api/v1/media/:id good request", %{conn: conn, object: object} do
assert media["description"] == "test-media"
assert refresh_record(object).data["name"] == "test-media"
end
+
+ test "won't update non-media", %{conn: conn, user: user} do
+ object = insert(:note, user: user)
+
+ response =
+ conn
+ |> put_req_header("content-type", "multipart/form-data")
+ |> put("/api/v1/media/#{object.id}", %{"description" => "test-media"})
+ |> json_response(404)
+
+ assert response == %{"error" => "Record not found"}
+ end
end
describe "Get media by id (/api/v1/media/:id)" do
@@ -207,6 +220,17 @@ test "it returns media object when requested by owner", %{conn: conn, object: ob
assert media["id"]
end
+ test "it returns 404 when requesting non-media object", %{conn: conn, user: user} do
+ object = insert(:note, user: user)
+
+ response =
+ conn
+ |> get("/api/v1/media/#{object.id}")
+ |> json_response(404)
+
+ assert response == %{"error" => "Record not found"}
+ end
+
test "it returns 403 if media object requested by non-owner", %{object: object, user: user} do
%{conn: conn, user: other_user} = oauth_access(["read:media"])
From 5e92f955acb8e7e859897958292c5818cfbc268d Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Wed, 22 May 2024 19:42:25 +0100
Subject: [PATCH 102/153] bump version
---
CHANGELOG.md | 3 ++-
mix.exs | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index edd51b74b..3e317c96b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,11 +4,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
-## Unreleased
+## 2024.04.1 (Security)
## Fixed
- Issue allowing non-owners to use media objects in posts
- Issue allowing use of non-media objects as attachments and crashing timeline rendering
+- Issue allowing webfinger spoofing in certain situations
## 2024.04
diff --git a/mix.exs b/mix.exs
index 4d58821bc..872174174 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("3.13.1"),
+ version: version("3.13.2"),
elixir: "~> 1.14",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: Mix.compilers(),
From c2d3221be30fe1a6fef04a83f7144d247fd82e5d Mon Sep 17 00:00:00 2001
From: Norm
Date: Thu, 23 May 2024 14:40:25 -0400
Subject: [PATCH 103/153] Fix Exiftool stderr being read as an image
description
Fixes: https://akkoma.dev/AkkomaGang/akkoma/issues/773
---
lib/pleroma/upload/filter/exiftool/read_description.ex | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lib/pleroma/upload/filter/exiftool/read_description.ex b/lib/pleroma/upload/filter/exiftool/read_description.ex
index 5dfe60cd8..372907076 100644
--- a/lib/pleroma/upload/filter/exiftool/read_description.ex
+++ b/lib/pleroma/upload/filter/exiftool/read_description.ex
@@ -33,8 +33,7 @@ defp read_when_empty(current_description, _, _) when is_binary(current_descripti
defp read_when_empty(_, file, tag) do
try do
{tag_content, 0} =
- System.cmd("exiftool", ["-b", "-s3", tag, file],
- stderr_to_stdout: true,
+ System.cmd("exiftool", ["-b", "-s3", "-ignoreMinorErrors", "-q", "-q", tag, file],
parallelism: true
)
From da67e69af522d0c31cb9b2ce9fc6bafca5d990dc Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Sun, 26 May 2024 17:09:26 +0100
Subject: [PATCH 104/153] Allow for attachment to be a single object in user
data
---
lib/pleroma/web/activity_pub/activity_pub.ex | 5 ++
test/fixtures/users_mock/takahe_user.json | 53 +++++++++++++++++++
.../web/activity_pub/activity_pub_test.exs | 23 ++++++++
3 files changed, 81 insertions(+)
create mode 100644 test/fixtures/users_mock/takahe_user.json
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 505fa7462..73828c27f 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -1545,10 +1545,15 @@ defp normalize_also_known_as(aka) when is_list(aka), do: aka
defp normalize_also_known_as(aka) when is_binary(aka), do: [aka]
defp normalize_also_known_as(nil), do: []
+ defp normalize_attachment(%{} = attachment), do: [attachment]
+ defp normalize_attachment(attachment) when is_list(attachment), do: attachment
+ defp normalize_attachment(_), do: []
+
defp object_to_user_data(data, additional) do
fields =
data
|> Map.get("attachment", [])
+ |> normalize_attachment()
|> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end)
|> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end)
diff --git a/test/fixtures/users_mock/takahe_user.json b/test/fixtures/users_mock/takahe_user.json
new file mode 100644
index 000000000..247cf2052
--- /dev/null
+++ b/test/fixtures/users_mock/takahe_user.json
@@ -0,0 +1,53 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "blurhash": "toot:blurhash",
+ "Emoji": "toot:Emoji",
+ "focalPoint": {
+ "@container": "@list",
+ "@id": "toot:focalPoint"
+ },
+ "Hashtag": "as:Hashtag",
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "featured": {
+ "@id": "toot:featured",
+ "@type": "@id"
+ }
+ },
+ "https://w3id.org/security/v1"
+ ],
+ "id": "https://fedi.vision/@vote@fedi.vision/",
+ "type": "Person",
+ "toot:discoverable": true,
+ "inbox": "https://fedi.vision/@vote@fedi.vision/inbox/",
+ "publicKey": {
+ "id": "https://fedi.vision/@vote@fedi.vision/#main-key",
+ "owner": "https://fedi.vision/@vote@fedi.vision/",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj2f+uQtdoBO9X/u2Qso4\nxHYdfy8zB24m9Gg982/ts88DAMLxZUzX0JsBWT7coL0Ipf4NSbVaqS6nKrr2P8Qs\nf97wMhowyuYxK22BMPcbpfZkFj3tVT/JkDx2iujBJJ5ZBO5KRlupjDTqV4rOAY7F\n58ad0jK9PsJNJMsJ/b8+0t3Q/K+RqCGVmtK+iPSigOYoiKoquyRzHLTfP+mpOlDa\n3f+uyAbFya7CpcgBx1zz0PALWA+oh/zhZK4yT6719Esa8SDcoJ0ws70zMxWekq1A\n3ia88/Io6SY2qFNBpzzXGO3JK8OFRFtmPV8ZfAh5Pv6y52iuTJ21kxjAG7ZTP/fY\nBQIDAQAB\n-----END PUBLIC KEY-----\n"
+ },
+ "attachment": {
+ "type": "PropertyValue",
+ "value": "https://fedivision.party/vote",
+ "name": "More details"
+ },
+ "endpoints": {
+ "sharedInbox": "https://fedi.vision/inbox/"
+ },
+ "followers": "https://fedi.vision/@vote@fedi.vision/followers/",
+ "following": "https://fedi.vision/@vote@fedi.vision/following/",
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/webp",
+ "url": "https://eu-central-1.linodeobjects.com:443/st4/profile_images/2024/5/9/RwqTbeYx16gauXPXvt-CaysOnGw.webp"
+ },
+ "name": "FediVision Vote Bot",
+ "outbox": "https://fedi.vision/@vote@fedi.vision/outbox/",
+ "preferredUsername": "vote",
+ "published": "2024-05-09T09:04:04Z",
+ "summary": "
New in 2024, this is the bot that will count your #Fedivision vote! Accept no substitutes!
Send this account a toot in the form vote ABCD EFGH IJKL substituting the (up to) three codes for the songs you want to win. Punctuation ignored, case insensitive, order is unimportant. Only your latest toot counts, so change your vote with a new toot.
",
+ "url": "https://fedi.vision/@vote/"
+}
diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs
index 5ad6d4716..6d73f777c 100644
--- a/test/pleroma/web/activity_pub/activity_pub_test.exs
+++ b/test/pleroma/web/activity_pub/activity_pub_test.exs
@@ -233,6 +233,29 @@ test "works for bridgy actors" do
}
end
+ test "works for takahe actors" do
+ user_id = "https://fedi.vision/@vote@fedi.vision/"
+
+ Tesla.Mock.mock(fn
+ %{method: :get, url: ^user_id} ->
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/users_mock/takahe_user.json"),
+ headers: [{"content-type", "application/activity+json"}]
+ }
+ end)
+
+ {:ok, user} = ActivityPub.make_user_from_ap_id(user_id)
+
+ assert user.actor_type == "Person"
+
+ assert [
+ %{
+ "name" => "More details"
+ }
+ ] = user.fields
+ end
+
test "fetches user featured collection" do
ap_id = "https://example.com/users/lain"
From 05eda169fe88f712c21f61daed1ae025cc1091e7 Mon Sep 17 00:00:00 2001
From: Oneric
Date: Thu, 16 May 2024 21:05:01 +0200
Subject: [PATCH 105/153] Document AP and nodeinfo extensions
And while add it point to this via a top-level
FEDERATION.md document as standardised by FEP-67ff.
Also add a few missing descriptions to the config cheatsheet
and move the recently removed C2S extension into an appropiate
subsection.
---
CHANGELOG.md | 3 +
FEDERATION.md | 42 +++
docs/docs/configuration/cheatsheet.md | 2 +
docs/docs/development/ap_extensions.md | 279 ++++++++++++++++++-
docs/docs/development/nodeinfo_extensions.md | 141 ++++++++++
5 files changed, 463 insertions(+), 4 deletions(-)
create mode 100644 FEDERATION.md
create mode 100644 docs/docs/development/nodeinfo_extensions.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3e317c96b..2d3034464 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Issue allowing use of non-media objects as attachments and crashing timeline rendering
- Issue allowing webfinger spoofing in certain situations
+## Added
+- Implement [FEP-67ff](https://codeberg.org/fediverse/fep/src/branch/main/fep/67ff/fep-67ff.md) (federation documentation)
+
## 2024.04
## Added
diff --git a/FEDERATION.md b/FEDERATION.md
new file mode 100644
index 000000000..4524ec4e2
--- /dev/null
+++ b/FEDERATION.md
@@ -0,0 +1,42 @@
+# Federation
+
+## Supported federation protocols and standards
+
+- [ActivityPub](https://www.w3.org/TR/activitypub/) (Server-to-Server)
+- [WebFinger](https://webfinger.net/)
+- [Http Signatures](https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures)
+- [NodeInfo](https://nodeinfo.diaspora.software/)
+
+## Supported FEPs
+
+- [FEP-67ff: FEDERATION](https://codeberg.org/fediverse/fep/src/branch/main/fep/67ff/fep-67ff.md)
+- [FEP-f1d5: NodeInfo in Fediverse Software](https://codeberg.org/fediverse/fep/src/branch/main/fep/f1d5/fep-f1d5.md)
+- [FEP-fffd: Proxy Objects](https://codeberg.org/fediverse/fep/src/branch/main/fep/fffd/fep-fffd.md)
+
+## ActivityPub
+
+Akkoma mostly follows the server-to-server parts of the ActivityPub standard,
+but implements quirks for Mastodon compatibility as well as Mastodon-specific
+and custom extensions.
+
+See our documentation and Mastodon’s federation information
+linked further below for details on these quirks and extensions.
+
+Akkoma does not perform JSON-LD processing.
+
+### Required extensions
+
+#### HTTP Signatures
+All AP S2S POST requests to Akkoma instances MUST be signed.
+Depending on instance configuration the same may be true for GET requests.
+
+## Nodeinfo
+
+Akkoma provides many additional entries in its nodeinfo response,
+see the documentation linked below for details.
+
+## Additional documentation
+
+- [Akkoma’s ActivityPub extensions](https://docs.akkoma.dev/develop/development/ap_extensions/)
+- [Akkoma’s nodeinfo extensions](https://docs.akkoma.dev/develop/development/nodeinfo_extensions/)
+- [Mastodon’s federation requirements](https://github.com/mastodon/mastodon/blob/main/FEDERATION.md)
diff --git a/docs/docs/configuration/cheatsheet.md b/docs/docs/configuration/cheatsheet.md
index 3b5dfa41e..3591d2459 100644
--- a/docs/docs/configuration/cheatsheet.md
+++ b/docs/docs/configuration/cheatsheet.md
@@ -63,6 +63,8 @@ To add configuration to your config file, you can copy it from the base config.
* `local_bubble`: Array of domains representing instances closely related to yours. Used to populate the `bubble` timeline. e.g `["example.com"]`, (default: `[]`)
* `languages`: List of Language Codes used by the instance. This is used to try and set a default language from the frontend. It will try and find the first match between the languages set here and the user's browser languages. It will default to the first language in this setting if there is no match.. (default `["en"]`)
* `export_prometheus_metrics`: Enable prometheus metrics, served at `/api/v1/akkoma/metrics`, requiring the `admin:metrics` oauth scope.
+* `privileged_staff`: Set to `true` to give moderators access to a few higher responsibility actions.
+* `federated_timeline_available`: Set to `false` to remove access to the federated timeline for all users.
## :database
* `improved_hashtag_timeline`: Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes).
diff --git a/docs/docs/development/ap_extensions.md b/docs/docs/development/ap_extensions.md
index bf9420272..a5e3d0186 100644
--- a/docs/docs/development/ap_extensions.md
+++ b/docs/docs/development/ap_extensions.md
@@ -4,7 +4,6 @@
The following endpoints are additionally present into our actors.
- `oauthRegistrationEndpoint` (`http://litepub.social/ns#oauthRegistrationEndpoint`)
-- `uploadMedia` (`https://www.w3.org/ns/activitystreams#uploadMedia`)
### oauthRegistrationEndpoint
@@ -12,6 +11,279 @@ Points to MastodonAPI `/api/v1/apps` for now.
See
+## Emoji reactions
+
+Emoji reactions are implemented as a new activity type `EmojiReact`.
+A single user is allowed to react multiple times with different emoji to the
+same post. However, they may only react at most once with the same emoji.
+Repeated reaction from the same user with the same emoji are to be ignored.
+Emoji reactions are also distinct from `Like` activities and a user may both
+`Like` and react to a post.
+
+!!! note
+ Misskey also supports emoji reactions, but the implementations differs.
+ It equates likes and reactions and only allows a single reaction per post.
+
+The emoji is placed in the `content` field of the activity
+and the `object` property points to the note reacting to.
+
+Emoji can either be any Unicode emoji sequence or a custom emoji.
+The latter must place their shortcode, including enclosing colons,
+into `content` and put the emoji object inside the `tag` property.
+The `tag` property MAY be omitted for Unicode emoji.
+
+An example reaction with a Unicode emoji:
+```json
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://example.org/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "type": "EmojiReact",
+ "id": "https://example.org/activities/23143872a0346141",
+ "actor": "https://example.org/users/akko",
+ "nickname": "akko",
+ "to": ["https://remote.example/users/diana", "https://example.org/users/akko/followers"],
+ "cc": ["https://www.w3.org/ns/activitystreams#Public"],
+ "content": "🧡",
+ "object": "https://remote.example/objects/9f0e93499d8314a9"
+}
+```
+
+An example reaction with a custom emoji:
+```json
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://example.org/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "type": "EmojiReact",
+ "id": "https://example.org/activities/d75586dec0541650",
+ "actor": "https://example.org/users/akko",
+ "nickname": "akko",
+ "to": ["https://remote.example/users/diana", "https://example.org/users/akko/followers"],
+ "cc": ["https://www.w3.org/ns/activitystreams#Public"],
+ "content": ":mouse:",
+ "object": "https://remote.example/objects/9f0e93499d8314a9",
+ "tag": [{
+ "type": "Emoji",
+ "id": null,
+ "name": "mouse",
+ "icon": {
+ "type": "Image",
+ "url": "https://example.org/emoji/mouse/mouse.png"
+ }
+ }]
+}
+```
+
+!!! note
+ Although an emoji reaction can only contain a single emoji,
+ for compatibility with older versions of Pleroma and Akkoma,
+ it is recommended to wrap the emoji object in a single-element array.
+
+When reacting with a remote custom emoji do not include the remote domain in `content`’s shortcode
+*(unlike in our REST API which needs the domain)*:
+```json
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://example.org/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "type": "EmojiReact",
+ "id": "https://example.org/activities/7993dcae98d8d5ec",
+ "actor": "https://example.org/users/akko",
+ "nickname": "akko",
+ "to": ["https://remote.example/users/diana", "https://example.org/users/akko/followers"],
+ "cc": ["https://www.w3.org/ns/activitystreams#Public"],
+ "content": ":hug:",
+ "object": "https://remote.example/objects/9f0e93499d8314a9",
+ "tag": [{
+ "type": "Emoji",
+ "id": "https://other.example/emojis/hug",
+ "name": "hug",
+ "icon": {
+ "type": "Image",
+ "url": "https://other.example/files/b71cea432b3fad67.webp"
+ }
+ }]
+}
+```
+
+Emoji reactions can be retracted using a standard `Undo` activity:
+```json
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "http://example.org/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "type": "Undo",
+ "id": "http://example.org/activities/4685792e-efb6-4309-b508-ae4f355dd695",
+ "actor": "https://example.org/users/akko",
+ "to": ["https://remote.example/users/diana", "https://example.org/users/akko/followers"],
+ "cc": ["https://www.w3.org/ns/activitystreams#Public"],
+ "object": "https://example.org/activities/23143872a0346141"
+}
+```
+
+## User profile backgrounds
+
+Akkoma federates user profile backgrounds the same way as Sharkey.
+
+An actors ActivityPub representation contains an additional
+`backgroundUrl` property containing an `Image` object. This property
+belongs to the `"sharkey": "https://joinsharkey.org/ns#"` namespace.
+
+## Quote Posts
+
+Akkoma allows referencing a single other note as a quote,
+which will be prominently displayed in the interface.
+
+The quoted post is referenced by its ActivityPub id in the `quoteUri` property.
+
+!!! note
+ Old Misskey only understood and modern Misskey still prefers
+ the `_misskey_quote` property for this. Similar some other older
+ software used `quoteUrl` or `quoteURL`.
+ All current implementations with quote support understand `quoteUri`.
+
+Example:
+```json
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://example.org/schemas/litepub-0.1.jsonld",
+ {
+ "@language": "und"
+ }
+ ],
+ "type": "Note",
+ "id": "https://example.org/activities/85717e587f95d5c0",
+ "actor": "https://example.org/users/akko",
+ "to": ["https://remote.example/users/diana", "https://example.org/users/akko/followers"],
+ "cc": ["https://www.w3.org/ns/activitystreams#Public"],
+ "context": "https://example.org/contexts/1",
+ "content": "Look at that!",
+ "quoteUri": "http://remote.example/status/85717e587f95d5c0",
+ "contentMap": {
+ "en": "Look at that!"
+ },
+ "source": {
+ "content": "Look at that!",
+ "mediaType": "text/plain"
+ },
+ "published": "2024-04-06T23:40:28Z",
+ "updated": "2024-04-06T23:40:28Z",
+ "attachemnt": [],
+ "tag": []
+}
+```
+
+## Threads
+
+Akkoma assigns all posts of the same thread the same `context`. This is a
+standard ActivityPub property but its meaning is left vague. Akkoma will
+always treat posts with identical `context` as part of the same thread.
+
+`context` must not be assumed to hold any meaning or be dereferencable.
+
+Incoming posts without `context` will be assigned a new context.
+
+!!! note
+ Mastodon uses the non-standard `conversation` property for the same purpose
+ *(named after an older OStatus property)*. For incoming posts without
+ `context` but with `converstions` Akkoma will use the value from
+ `conversations` to fill in `context`.
+ For outgoing posts Akkoma will duplicate the context into `conversation`.
+
+## Post Source
+
+Unlike Mastodon, Akkoma supports drafting posts in multiple source formats
+besides plaintext, like Markdown or MFM. The original input is preserved
+in the standard ActivityPub `source` property *(not supported by Mastodon)*.
+Still, `content` will always be present and contain the prerendered HTML form.
+
+Supported `mediaType` include:
+- `text/plain`
+- `text/markdown`
+- `text/bbcode`
+- `text/x.misskeymarkdown`
+
+## Post Language
+
+!!! note
+ This is also supported in and compatible with Mastodon, but since
+ joinmastodon.org doesn’t document it yet it is included here.
+ [GoToSocial](https://docs.gotosocial.org/en/latest/federation/federating_with_gotosocial/#content-contentmap-and-language)
+ has a more refined version of this which can correctly deal with multiple language entries.
+
+A post can indicate its language by including a `contentMap` object
+which contains a sub key named after the language’s ISO 639-1 code
+and it’s content identical to the post’s `content` field.
+
+Currently Akkoma, just like Mastodon, only properly supports a single language entry,
+in case of multiple entries a random language will be picked.
+Furthermore, Akkoma currently only reads the `content` field
+and never the value from `contentMap`.
+
+## Local post scope
+
+Post using this scope will never federate to other servers
+but for the sake of completeness it is listed here.
+
+In addition to the usual scopes *(public, unlisted, followers-only, direct)*
+Akkoma supports an “unlisted” post scope. Such posts will not federate to
+other instances and only be shown to logged-in users on the same instance.
+It is included into the local timeline.
+This may be useful to discuss or announce instance-specific policies and topics.
+
+A post is addressed to the local scope by including `/#Public`
+in its `to` field. E.g. if the instance is on `https://example.org` it would use
+`https://example.org/#Public`.
+
+An implementation creating a new post MUST NOT address both the local and
+general public scope `as:Public` at the same time. A post addressing the local
+scope MUST NOT be sent to other instances or be possible to fetch by other
+instances regardless of potential other listed addressees.
+
+When receiving a remote post addressing both the public scope and what appears
+to be a local-scope identifier, the post SHOULD be treated without assigning any
+special meaning to the potential local-scope identifier.
+
+!!! note
+ Misskey-derivatives have a similar concept of non-federated posts,
+ however those are also shown publicly on the local web interface
+ and are thus visible to non-members.
+
+## List post scope
+
+Messages originally addressed to a custom list will contain
+a `listMessage` field with an unresolvable pseudo ActivityPub id.
+
+# Deprecated and Removed Extensions
+
+The following extensions were used in the past but have been dropped.
+Documentation is retained here as a reference and since old objects might
+still contains related fields.
+
+## Actor endpoints
+
+The following endpoints used to be present:
+
+- `uploadMedia` (`https://www.w3.org/ns/activitystreams#uploadMedia`)
+
### uploadMedia
Inspired by , it is part of the ActivityStreams namespace because it used to be part of the ActivityPub specification and got removed from it.
@@ -20,9 +292,8 @@ Content-Type: multipart/form-data
Parameters:
- (required) `file`: The file being uploaded
-- (optionnal) `description`: A plain-text description of the media, for accessibility purposes.
+- (optional) `description`: A plain-text description of the media, for accessibility purposes.
Response: HTTP 201 Created with the object into the body, no `Location` header provided as it doesn't have an `id`
-The object given in the reponse should then be inserted into an Object's `attachment` field.
-
+The object given in the response should then be inserted into an Object's `attachment` field.
diff --git a/docs/docs/development/nodeinfo_extensions.md b/docs/docs/development/nodeinfo_extensions.md
new file mode 100644
index 000000000..3edc31524
--- /dev/null
+++ b/docs/docs/development/nodeinfo_extensions.md
@@ -0,0 +1,141 @@
+# Nodeinfo Extensions
+
+Akkoma currently implements version 2.0 and 2.1 of nodeinfo spec,
+but provides the following additional fields.
+
+## metadata
+
+The spec leaves the content of `metadata` up to implementations
+and indeed Akkoma adds many fields here apart from the commonly
+found `nodeName` and `nodeDescription` fields.
+
+### accountActivationRequired
+Whether or not users need to confirm their email before completing registration.
+*(boolean)*
+
+!!! note
+ Not to be confused with account approval, where each registration needs to
+ be manually approved by an admin. Account approval has no nodeinfo entry.
+
+### features
+
+Array of strings denoting supported server features. E.g. a server supporting
+quote posts should include a `"quote_posting"` entry here.
+
+A non-exhaustive list of possible features:
+- `polls`
+- `quote_posting`
+- `editing`
+- `bubble_timeline`
+- `pleroma_emoji_reactions` *(Unicode emoji)*
+- `custom_emoji_reactions`
+- `akkoma_api`
+- `akkoma:machine_translation`
+- `mastodon_api`
+- `pleroma_api`
+
+### federatedTimelineAvailable
+Whether or not the “federated timeline”, i.e. a timeline containing posts from
+the entire known network, is made available.
+*(boolean)*
+
+### federation
+This section is optional and can contain various custom keys describing federation policies.
+The following are required to be presented:
+- `enabled` *(boolean)* whether the server federates at all
+
+A non-exhaustive list of optional keys:
+- `exclusions` *(boolean)* whether some federation policies are withheld
+- `mrf_simple` *(object)* describes how the Simple MRF policy is configured
+
+### fieldsLimits
+A JSON object documenting restriction for user account info fields.
+All properties are integers.
+
+- `maxFields` maximum number of account info fields local users can create
+- `maxRemoteFields` maximum number of account info fields remote users can have
+ before the user gets rejected or fields truncated
+- `nameLength` maximum length of a field’s name
+- `valueLength` maximum length of a field’s value
+
+### invitesEnabled
+Whether or not signing up via invite codes is possible.
+*(boolean)*
+
+### localBubbleInstances
+Array of domains (as strings) of other instances chosen
+by the admin which are shown in the bubble timeline.
+
+### mailerEnabled
+Whether or not the instance can send out emails.
+*(boolean)*
+
+### nodeDescription
+Human-friendly description of this instance
+*(string)*
+
+### nodeName
+Human-friendly name of this instance
+*(string)*
+
+### pollLimits
+JSON object containing limits for polls created by local users.
+All values are integers.
+- `max_options` maximum number of poll options
+- `max_option_chars` maximum characters per poll option
+- `min_expiration` minimum time in seconds a poll must be open for
+- `max_expiration` maximum time a poll is allowed to be open for
+
+### postFormats
+Array of strings containing media types for supported post source formats.
+A non-exhaustive list of possible values:
+- `text/plain`
+- `text/markdown`
+- `text/bbcode`
+- `text/x.misskeymarkdown`
+
+### private
+Whether or not unauthenticated API access is permitted.
+*(boolean)*
+
+### privilegedStaff
+Whether or not moderators are trusted to perform some
+additional tasks like e.g. issuing password reset emails.
+
+### publicTimelineVisibility
+JSON object containing boolean-valued keys reporting
+if a given timeline can be viewed without login.
+- `local`
+- `federated`
+- `bubble`
+
+### restrictedNicknames
+Array of strings listing nicknames forbidden to be used during signup.
+
+### skipThreadContainment
+Whether broken threads are filtered out
+*(boolean)*
+
+### staffAccounts
+Array containing ActivityPub IDs of local accounts
+with some form of elevated privilege on the instance.
+
+### suggestions
+JSON object containing info on whether the interaction-based
+Mastodon `/api/v1/suggestions` feature is enabled and optionally
+additional implementation-defined fields with more details
+on e.g. how suggested users are selected.
+
+!!! note
+ This has no relation to the newer /api/v2/suggestions API
+ which also (or exclusively) contains staff-curated entries.
+
+- `enabled` *(boolean)* whether or not user recommendations are enabled
+
+### uploadLimits
+JSON object documenting various upload-related size limits.
+All values are integers and in bytes.
+- `avatar` maximum size of uploaded user avatars
+- `banner` maximum size of uploaded user profile banners
+- `background` maximum size of uploaded user profile backgrounds
+- `general` maximum size for all other kinds of uploads
From f15eded3e1e7ea1342c66a210147b0d5e9df5a75 Mon Sep 17 00:00:00 2001
From: Floatingghost
Date: Mon, 27 May 2024 02:09:48 +0100
Subject: [PATCH 106/153] Add extra test case for nonsense field, increase
timeouts
---
lib/pleroma/web/activity_pub/activity_pub.ex | 5 +-
.../users_mock/nonsense_attachment_user.json | 51 +++++++++++++++++++
test/mix/tasks/pleroma/app_test.exs | 6 +--
test/pleroma/http/backoff_test.exs | 2 +-
.../web/activity_pub/activity_pub_test.exs | 19 +++++++
5 files changed, 78 insertions(+), 5 deletions(-)
create mode 100644 test/fixtures/users_mock/nonsense_attachment_user.json
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 73828c27f..4512393f3 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -1554,7 +1554,10 @@ defp object_to_user_data(data, additional) do
data
|> Map.get("attachment", [])
|> normalize_attachment()
- |> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end)
+ |> Enum.filter(fn
+ %{"type" => t} -> t == "PropertyValue"
+ _ -> false
+ end)
|> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end)
emojis =
diff --git a/test/fixtures/users_mock/nonsense_attachment_user.json b/test/fixtures/users_mock/nonsense_attachment_user.json
new file mode 100644
index 000000000..68042e76e
--- /dev/null
+++ b/test/fixtures/users_mock/nonsense_attachment_user.json
@@ -0,0 +1,51 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "blurhash": "toot:blurhash",
+ "Emoji": "toot:Emoji",
+ "focalPoint": {
+ "@container": "@list",
+ "@id": "toot:focalPoint"
+ },
+ "Hashtag": "as:Hashtag",
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "featured": {
+ "@id": "toot:featured",
+ "@type": "@id"
+ }
+ },
+ "https://w3id.org/security/v1"
+ ],
+ "id": "https://fedi.vision/@vote@fedi.vision/",
+ "type": "Person",
+ "toot:discoverable": true,
+ "inbox": "https://fedi.vision/@vote@fedi.vision/inbox/",
+ "publicKey": {
+ "id": "https://fedi.vision/@vote@fedi.vision/#main-key",
+ "owner": "https://fedi.vision/@vote@fedi.vision/",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj2f+uQtdoBO9X/u2Qso4\nxHYdfy8zB24m9Gg982/ts88DAMLxZUzX0JsBWT7coL0Ipf4NSbVaqS6nKrr2P8Qs\nf97wMhowyuYxK22BMPcbpfZkFj3tVT/JkDx2iujBJJ5ZBO5KRlupjDTqV4rOAY7F\n58ad0jK9PsJNJMsJ/b8+0t3Q/K+RqCGVmtK+iPSigOYoiKoquyRzHLTfP+mpOlDa\n3f+uyAbFya7CpcgBx1zz0PALWA+oh/zhZK4yT6719Esa8SDcoJ0ws70zMxWekq1A\n3ia88/Io6SY2qFNBpzzXGO3JK8OFRFtmPV8ZfAh5Pv6y52iuTJ21kxjAG7ZTP/fY\nBQIDAQAB\n-----END PUBLIC KEY-----\n"
+ },
+ "attachment": {
+ "haha": "you expected a proper object, but it was me, random nonsense"
+ },
+ "endpoints": {
+ "sharedInbox": "https://fedi.vision/inbox/"
+ },
+ "followers": "https://fedi.vision/@vote@fedi.vision/followers/",
+ "following": "https://fedi.vision/@vote@fedi.vision/following/",
+ "icon": {
+ "type": "Image",
+ "mediaType": "image/webp",
+ "url": "https://eu-central-1.linodeobjects.com:443/st4/profile_images/2024/5/9/RwqTbeYx16gauXPXvt-CaysOnGw.webp"
+ },
+ "name": "FediVision Vote Bot",
+ "outbox": "https://fedi.vision/@vote@fedi.vision/outbox/",
+ "preferredUsername": "vote",
+ "published": "2024-05-09T09:04:04Z",
+ "summary": "
New in 2024, this is the bot that will count your #Fedivision vote! Accept no substitutes!
Send this account a toot in the form vote ABCD EFGH IJKL substituting the (up to) three codes for the songs you want to win. Punctuation ignored, case insensitive, order is unimportant. Only your latest toot counts, so change your vote with a new toot.
Want to add to the discussion?
Post a comment!