)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:auth > :oauth_consumer_template"
msgid "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:connections_pool > :connect_timeout"
msgid "Timeout while `gun` will wait until connection is up. Default: 5000ms."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_retries"
msgid "Number of attempts to acquire the connection from the pool if it is overloaded. Default: 5"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:connections_pool > :connection_acquisition_wait"
msgid "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:connections_pool > :max_connections"
msgid "Maximum number of connections in the pool. Default: 250 connections."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:connections_pool > :reclaim_multiplier"
msgid "Multiplier for the number of idle connection to be reclaimed if the pool is full. For example if the pool maxes out at 250 connections and this setting is set to 0.3, the pool will reclaim at most 75 idle connections if it's overloaded. Default: 0.1"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:email_notifications > :digest"
msgid "emails of \"what you've missed\" for users who have been inactive for a while"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:email_notifications > :digest > :active"
msgid "Globally enable or disable digest emails"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:email_notifications > :digest > :inactivity_threshold"
msgid "Minimum user inactivity threshold"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:email_notifications > :digest > :interval"
msgid "Minimum interval between digest emails to one user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:email_notifications > :digest > :schedule"
msgid "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\"."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:emoji > :default_manifest"
msgid "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download. Currently only one manifest can be added (no arrays)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:emoji > :groups"
msgid "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the group name and the value is the location or array of locations. * can be used as a wildcard."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:emoji > :pack_extensions"
msgid "A list of file extensions for emojis, when no emoji.txt for a pack is present"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:emoji > :shortcode_globs"
msgid "Location of custom emoji files. * can be used as a wildcard."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:features > :improved_hashtag_timeline"
msgid "Setting to force toggle / force disable improved hashtags timeline. `:enabled` forces hashtags to be fetched from `hashtags` table for hashtags timeline. `:disabled` forces object-embedded hashtags to be used (slower). Keep it `:auto` for automatic behaviour (it is auto-set to `:enabled` [unless overridden] when HashtagsTableMigrator completes)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:feed > :post_title"
msgid "Configure title rendering"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:feed > :post_title > :max_length"
msgid "Maximum number of characters before truncating title"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:feed > :post_title > :omission"
msgid "Replacement which will be used after truncating string"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe"
msgid "Settings for Pleroma FE"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
msgid "When disabled, auto-hide the subject field if it's empty"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :background"
msgid "URL of the background, unless viewing a user profile with a background that is set"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
msgid "When a message has a subject (aka Content Warning), collapse it by default"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
msgid "Enables green text on lines prefixed with the > character"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
msgid "Hides filtered statuses from timelines"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
msgid "Hides muted statuses from timelines"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
msgid "Hide notices statistics (repeats, favorites, ...)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
msgid "Hides instance name from PleromaFE banner"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
msgid "Hide profile statistics (posts, posts per day, followers, followings, ...)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
msgid "URL of the logo, defaults to Pleroma's logo"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
msgid "Allows you to adjust vertical margins between logo boundary and navbar borders. The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
msgid "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. If you want a colorful logo you must disable logoMask."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
msgid "Limit scope selection to Direct, User default, and Scope of post replying to. Also prevents replying to a DM with a public post from PleromaFE."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
msgid "URL of the image to use for hiding NSFW media attachments in the timeline"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
msgid "Default post formatting option"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
msgid "Relative URL which indicates where to redirect when a user is logged in"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
msgid "Relative URL which indicates where to redirect when a user isn't logged in"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
msgid "Copy the scope (private/unlisted/public) in replies to posts by default"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
msgid "Enables panel displaying functionality of the instance on the About page"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
msgid "Whether to show the instance's custom panel"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
msgid "Change alignment of sidebar and panels to the right"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
msgid "Allows changing the default behaviour of subject lines in replies.\n `email`: copy and preprend re:, as in email,\n `masto`: copy verbatim, as in Mastodon,\n `noop`: don't copy the subject."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
msgid "Which theme to use. Available themes are defined in styles.json"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :admin"
msgid "Admin frontend"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :admin > name"
msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :admin > ref"
msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :available"
msgid "A map containing available frontends and parameters for their installation."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :available > build_dir"
msgid "The directory inside the zip file "
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :available > build_url"
msgid "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :available > custom-http-headers"
msgid "The custom HTTP headers for the frontend"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :available > git"
msgid "URL of the git repository of the frontend"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :available > name"
msgid "Name of the frontend."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :available > ref"
msgid "Reference of the frontend to be used."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :primary"
msgid "Primary frontend, the one that is served for all pages by default"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :primary > name"
msgid "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:frontends > :primary > ref"
msgid "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:gopher > :dstport"
msgid "Port advertised in URLs (optional, defaults to port)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:gopher > :enabled"
msgid "Enables the gopher interface"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:gopher > :ip"
msgid "IP address to bind to"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:gopher > :port"
msgid "Port to bind to"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :federation"
msgid "Settings for federation pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :federation > :max_connections"
msgid "Number workers in the pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :federation > :timeout"
msgid "Timeout while `hackney` will wait for response."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :media"
msgid "Settings for media pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :media > :max_connections"
msgid "Number workers in the pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :media > :timeout"
msgid "Timeout while `hackney` will wait for response."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :upload"
msgid "Settings for upload pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :upload > :max_connections"
msgid "Number workers in the pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:hackney_pools > :upload > :timeout"
msgid "Timeout while `hackney` will wait for response."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http > :adapter"
msgid "Adapter specific options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http > :adapter > :ssl_options"
msgid "SSL options for HTTP adapter"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http > :adapter > :ssl_options > :versions"
msgid "List of TLS version to use"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http > :proxy_url"
msgid "Proxy URL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http > :user_agent"
msgid "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http_security > :ct_max_age"
msgid "The maximum age for the Expect-CT header if sent"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http_security > :enabled"
msgid "Whether the managed content security policy is enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http_security > :referrer_policy"
msgid "The referrer policy to use, either \"same-origin\" or \"no-referrer\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http_security > :report_uri"
msgid "Adds the specified URL to report-uri and report-to group in CSP header"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http_security > :sts"
msgid "Whether to additionally send a Strict-Transport-Security header"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:http_security > :sts_max_age"
msgid "The maximum age for the Strict-Transport-Security header if sent"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :account_activation_required"
msgid "Require users to confirm their emails before signing in"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :account_approval_required"
msgid "Require users to be manually approved by an admin before signing in"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :account_field_name_length"
msgid "An account field name maximum length. Default: 512."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :account_field_value_length"
msgid "An account field value maximum length. Default: 2048."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :allow_relay"
msgid "Permits remote instances to subscribe to all public posts of your instance. (Important!) This may increase the visibility of your instance."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :allowed_post_formats"
msgid "MIME-type list of formats allowed to be posted (transformed into HTML)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :attachment_links"
msgid "Enable to automatically add attachment link text to statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :autofollowed_nicknames"
msgid "Set to nicknames of (local) users that every new user should automatically follow"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :autofollowing_nicknames"
msgid "Set to nicknames of (local) users that automatically follows every newly registered user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :avatar_upload_limit"
msgid "File size limit of user's profile avatars"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :background_upload_limit"
msgid "File size limit of user's profile backgrounds"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :banner_upload_limit"
msgid "File size limit of user's profile banners"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :birthday_required"
msgid "Require users to enter their birthday."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :cleanup_attachments"
msgid "Enable to remove associated attachments when status is removed.\nThis will not affect duplicates and attachments without status.\nEnabling this will increase load to database when deleting statuses on larger instances.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :description"
msgid "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :email"
msgid "Email used to reach an Administrator/Moderator of the instance"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :extended_nickname_format"
msgid "Enable to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :external_user_synchronization"
msgid "Enabling following/followers counters synchronization for external users"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :federating"
msgid "Enable federation with other instances"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :federation_incoming_replies_max_depth"
msgid "Max. depth of reply-to and reply activities fetching on incoming federation, to prevent out-of-memory situations while fetching very long threads. If set to `nil`, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :federation_reachability_timeout_days"
msgid "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :healthcheck"
msgid "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :instance_thumbnail"
msgid "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :invites_enabled"
msgid "Enable user invitations for admins (depends on `registrations_open` being disabled)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :limit"
msgid "Posts character limit (CW/Subject included in the counter)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :limit_to_local_content"
msgid "Limit unauthenticated users to search for local statutes and users only. Default: `:unauthenticated`."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :max_account_fields"
msgid "The maximum number of custom fields in the user profile. Default: 10."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :max_endorsed_users"
msgid "The maximum number of recommended accounts. 0 will disable the feature."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :max_media_attachments"
msgid "Maximum number of post media attachments"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :max_pinned_statuses"
msgid "The maximum number of pinned statuses. 0 will disable the feature."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :max_remote_account_fields"
msgid "The maximum number of custom fields in the remote user profile. Default: 20."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :max_report_comment_size"
msgid "The maximum size of the report comment. Default: 1000."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :multi_factor_authentication"
msgid "Multi-factor authentication settings"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
msgid "MFA backup codes settings"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
msgid "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
msgid "Number of backup codes to generate."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp"
msgid "TOTP settings"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
msgid "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
msgid "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :name"
msgid "Name of the instance"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :notify_email"
msgid "Envelope FROM address for mail sent via Pleroma"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :poll_limits"
msgid "A map with poll limits for local polls"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :poll_limits > :max_expiration"
msgid "Maximum expiration time (in seconds)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :poll_limits > :max_option_chars"
msgid "Maximum number of characters per option"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :poll_limits > :max_options"
msgid "Maximum number of options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :poll_limits > :min_expiration"
msgid "Minimum expiration time (in seconds)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :profile_directory"
msgid "Enable profile directory."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :public"
msgid "Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. Note: when setting to `false`, please also check `:restrict_unauthenticated` setting."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :quarantined_instances"
msgid "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :registration_reason_length"
msgid "Maximum registration reason length. Default: 500."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :registrations_open"
msgid "Enable registrations for anyone. Invitations require this setting to be disabled."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :remote_limit"
msgid "Hard character limit beyond which remote posts will be dropped"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :remote_post_retention_days"
msgid "The default amount of days to retain remote posts when pruning the database"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :safe_dm_mentions"
msgid "If enabled, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. \"@admin please keep an eye on @bad_actor\"). Default: disabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :show_reactions"
msgid "Let favourites and emoji reactions be viewed through the API."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :skip_thread_containment"
msgid "Skip filtering out broken threads. Default: enabled."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :static_dir"
msgid "Instance static directory"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :upload_limit"
msgid "File size limit of uploads (except for avatar, background, banner)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :user_bio_length"
msgid "A user bio maximum length. Default: 5000."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :user_name_length"
msgid "A user name maximum length. Default: 100."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instances_favicons > :enabled"
msgid "Allow/disallow displaying and getting instances favicons"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :base"
msgid "LDAP base, e.g. \"dc=example,dc=com\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :enabled"
msgid "Enables LDAP authentication"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :host"
msgid "LDAP server hostname"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :port"
msgid "LDAP port, e.g. 389 or 636"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :ssl"
msgid "Enable to use SSL, usually implies the port 636"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :sslopts"
msgid "Additional SSL options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :sslopts > :cacertfile"
msgid "Path to file with PEM encoded cacerts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :sslopts > :verify"
msgid "Type of cert verification"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :tls"
msgid "Enable to use STARTTLS, usually implies the port 389"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :tlsopts"
msgid "Additional TLS options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :tlsopts > :cacertfile"
msgid "Path to file with PEM encoded cacerts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :tlsopts > :verify"
msgid "Type of cert verification"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:ldap > :uid"
msgid "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:majic_pool > :size"
msgid "Number of majic workers to start."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:manifest > :background_color"
msgid "Describe the background color of the app"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:manifest > :icons"
msgid "Describe the icons of the app"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:manifest > :theme_color"
msgid "Describe the theme color of the app"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:markup > :scrub_policy"
msgid "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_preview_proxy > :enabled"
msgid "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_preview_proxy > :image_quality"
msgid "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_preview_proxy > :min_content_length"
msgid "Min content length (in bytes) to perform preview. Media smaller in size will be served without thumbnailing."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_height"
msgid "Max height of preview thumbnail for images (video preview always has original dimensions)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_preview_proxy > :thumbnail_max_width"
msgid "Max width of preview thumbnail for images (video preview always has original dimensions)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :base_url"
msgid "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :enabled"
msgid "Enables proxying of remote media via the instance's proxy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :invalidation > :enabled"
msgid "Enables media cache object invalidation."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :invalidation > :provider"
msgid "Module which will be used to purge objects from the cache."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :proxy_opts"
msgid "Internal Pleroma.ReverseProxy settings"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
msgid "Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
msgid "Timeout (in milliseconds) of GET request to the remote URI."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
msgid "Redirects the client to the origin server upon encountering HTTP errors.\n\nNote that files larger than Max Body Length will trigger an error. (e.g., Peertube videos)\n\n\n**WARNING:** This setting will allow larger files to be accessed, but exposes the\n\nIP addresses of your users to the other servers, bypassing the MediaProxy.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:media_proxy > :whitelist"
msgid "List of hosts with scheme to bypass the MediaProxy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:modules > :runtime_dir"
msgid "A path to custom Elixir modules (such as MRF policies)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf > :policies"
msgid "A list of MRF policies enabled. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf > :transparency"
msgid "Make the content of your Message Rewrite Facility settings public (via nodeinfo)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf > :transparency_exclusions"
msgid "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. You can also provide a reason for excluding these instance names. The instances and reasons won't be publicly disclosed."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_activity_expiration > :days"
msgid "Default global expiration time for all local activities (in days)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_follow_bot > :follower_nickname"
msgid "The name of the bot account to use for following newly discovered users."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_hashtag > :federated_timeline_removal"
msgid "A list of hashtags which result in message being removed from federated timelines (a.k.a unlisted)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_hashtag > :reject"
msgid "A list of hashtags which result in message being rejected."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_hashtag > :sensitive"
msgid "A list of hashtags which result in message being set as sensitive (a.k.a NSFW/R-18)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_hellthread > :delist_threshold"
msgid "Number of mentioned users after which the message gets removed from timelines anddisables notifications. Set to 0 to disable."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_hellthread > :reject_threshold"
msgid "Number of mentioned users after which the messaged gets rejected. Set to 0 to disable."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_keyword > :federated_timeline_removal"
msgid " A list of patterns which result in message being removed from federated timelines (a.k.a unlisted).\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_keyword > :reject"
msgid " A list of patterns which result in message being rejected.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_keyword > :replace"
msgid " **Pattern**: a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n\n **Replacement**: a string. Leaving the field empty is permitted.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_mention > :actors"
msgid "A list of actors for which any post mentioning them will be dropped"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_object_age > :threshold"
msgid "Required age (in seconds) of a post before actions are taken."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_direct"
msgid "Whether to allow direct messages"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
msgid "Whether to allow followers-only posts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :accept"
msgid "List of instances to only accept activities from (except deletes) and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :avatar_removal"
msgid "List of instances to strip avatars from and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :banner_removal"
msgid "List of instances to strip banners from and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :federated_timeline_removal"
msgid "List of instances to remove from the Federated (aka The Whole Known Network) Timeline and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :followers_only"
msgid "Force posts from the given instances to be visible by followers only and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :media_nsfw"
msgid "List of instances to tag all media as NSFW (sensitive) from and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :media_removal"
msgid "List of instances to strip media attachments from and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :reject"
msgid "List of instances to reject activities from (except deletes) and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :reject_deletes"
msgid "List of instances to reject deletions from and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_simple > :report_removal"
msgid "List of instances to reject reports from and the reason for doing so"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_steal_emoji > :hosts"
msgid "List of hosts to steal emojis from"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
msgid " A list of patterns or matches to reject shortcodes with.\n\n Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_steal_emoji > :size_limit"
msgid "File size limit (in bytes), checked before an emoji is saved to the disk"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_subchain > :match_actor"
msgid "Matches a series of regular expressions against the actor field"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_vocabulary > :accept"
msgid "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_vocabulary > :reject"
msgid "A list of ActivityStreams terms to reject. If empty, no messages are rejected."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:oauth2 > :clean_expired_tokens"
msgid "Enable a background job to clean expired OAuth tokens. Default: disabled."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:oauth2 > :issue_new_refresh_token"
msgid "Keeps old refresh token or generate new refresh token when to obtain an access token"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:oauth2 > :token_expires_in"
msgid "The lifetime in seconds of the access token"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :default"
msgid "Settings for default pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :default > :max_waiting"
msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :default > :recv_timeout"
msgid "Timeout for the pool while gun will wait for response"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :default > :size"
msgid "Maximum number of concurrent requests in the pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :federation"
msgid "Settings for federation pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :federation > :max_waiting"
msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :federation > :recv_timeout"
msgid "Timeout for the pool while gun will wait for response"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :federation > :size"
msgid "Maximum number of concurrent requests in the pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :media"
msgid "Settings for media pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :media > :max_waiting"
msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :media > :recv_timeout"
msgid "Timeout for the pool while gun will wait for response"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :media > :size"
msgid "Maximum number of concurrent requests in the pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :upload"
msgid "Settings for upload pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :upload > :max_waiting"
msgid "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :upload > :recv_timeout"
msgid "Timeout for the pool while gun will wait for response"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:pools > :upload > :size"
msgid "Maximum number of concurrent requests in the pool."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
msgid "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if hashtags transfer failed for all records."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
msgid "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :app_account_creation"
msgid "For registering user accounts from the same IP address"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :authentication"
msgid "For authentication create / password check / user existence check requests"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :relation_id_action"
msgid "For actions on relation with a specific user (follow, unfollow)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :relations_actions"
msgid "For actions on relationships with all users (follow, unfollow)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :search"
msgid "For the search requests (account & status search etc.)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :status_id_action"
msgid "For fav / unfav or reblog / unreblog actions on the same status by the same user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :statuses_actions"
msgid "For create / delete / fav / unfav / reblog / unreblog actions on any statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rate_limit > :timeline"
msgid "For requests to timelines (each timeline has it's own limiter)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities"
msgid "Settings for statuses."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :local"
msgid "Disallow view local statuses."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :activities > :remote"
msgid "Disallow view remote statuses."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles"
msgid "Settings for user profiles."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :local"
msgid "Disallow view local user profiles."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :profiles > :remote"
msgid "Disallow view remote user profiles."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines"
msgid "Settings for public and federated timelines."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :federated"
msgid "Disallow view federated timeline."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:restrict_unauthenticated > :timelines > :local"
msgid "Disallow view public timeline."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rich_media > :enabled"
msgid "Enables RichMedia parsing of URLs"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rich_media > :failure_backoff"
msgid "Amount of milliseconds after request failure, during which the request will not be retried."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rich_media > :ignore_hosts"
msgid "List of hosts which will be ignored by the metadata parser"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rich_media > :ignore_tld"
msgid "List TLDs (top-level domains) which will ignore for parse metadata"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rich_media > :parsers"
msgid "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:rich_media > :ttl_setters"
msgid "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:shout > :enabled"
msgid "Enables the backend Shoutbox chat feature."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:shout > :limit"
msgid "Shout message character limit."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:static_fe > :enabled"
msgid "Enables the rendering of static HTML. Default: disabled."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:streamer > :overflow_workers"
msgid "Maximum number of workers created if pool is empty"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:streamer > :workers"
msgid "Number of workers to send notifications"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:uri_schemes > :valid_schemes"
msgid "List of the scheme part that is considered valid to be an URL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub"
msgid "Activity pub routes (except question activities). Default: `nil` (no expiration)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:web_cache_ttl > :activity_pub_question"
msgid "Activity pub routes (question activities). Default: `30_000` (30 seconds)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :chat_message > :enabled"
msgid "Enables sending a chat message to newly registered users"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :chat_message > :message"
msgid "A message that will be sent to newly registered users as a chat message"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :chat_message > :sender_nickname"
msgid "The nickname of the local user that sends a welcome chat message"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :direct_message > :enabled"
msgid "Enables sending a direct message to newly registered users"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :direct_message > :message"
msgid "A message that will be sent to newly registered users"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :direct_message > :sender_nickname"
msgid "The nickname of the local user that sends a welcome message"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :email > :enabled"
msgid "Enables sending an email to newly registered users"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :email > :html"
msgid "HTML content of the welcome email. EEX template with user and instance_name variables can be used."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :email > :sender"
msgid "Email address and/or nickname that will be used to send the welcome email."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :email > :subject"
msgid "Subject of the welcome email. EEX template with user and instance_name variables can be used."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:welcome > :email > :text"
msgid "Text content of the welcome email. EEX template with user and instance_name variables can be used."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:workers > :retries"
msgid "Max retry attempts for failed jobs, per `Oban` queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
msgid "Concurrent limits configuration for MediaProxyWarmingPolicy."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
msgid "Max running concurrently jobs."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
msgid "Max waiting jobs."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
msgid "Concurrent limits configuration for getting RichMedia for activities."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
msgid "Max running concurrently jobs."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
msgid "Max waiting jobs."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :crontab"
msgid "Settings for cron background jobs"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :log"
msgid "Logs verbose mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues"
msgid "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :activity_expiration"
msgid "Activity expiration queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :attachments_cleanup"
msgid "Attachment deletion queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :background"
msgid "Background queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :backup"
msgid "Backup queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :federator_incoming"
msgid "Incoming federation queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :federator_outgoing"
msgid "Outgoing federation queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :mailer"
msgid "Email sender queue, see Pleroma.Emails.Mailer"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :scheduled_activities"
msgid "Scheduled activities queue, see Pleroma.ScheduledActivities"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :transmogrifier"
msgid "Transmogrifier queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Oban > :queues > :web_push"
msgid "Web push notifications queue"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Captcha > :enabled"
msgid "Whether the captcha should be shown on registration"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Captcha > :method"
msgid "The method/service to use for captcha"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Captcha > :seconds_valid"
msgid "The time in seconds for which the captcha is valid"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
msgid "The kocaptcha endpoint to use"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > :adapter"
msgid "One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/swoosh/Swoosh.html#module-adapters)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
msgid "SMTP AUTH enforcement mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
msgid "SMTP AUTH password"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
msgid "SMTP port"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
msgid "Hostname or IP address"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
msgid "SMTP temporary (4xx) error retries"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
msgid "Use Implicit SSL/TLS. e.g. port 465"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
msgid "Explicit TLS (STARTTLS) enforcement mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
msgid "SMTP AUTH username"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
msgid "Enables new users admin digest email when `true`"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :logo"
msgid "A path to a custom logo. Set it to `nil` to use the default Pleroma logo."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Emails.UserEmail > :styling"
msgid "A map with color settings for email templates."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Formatter > :class"
msgid "Specify the class to be added to the generated link. Disable to clear."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Formatter > :extra"
msgid "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Formatter > :new_window"
msgid "Link URLs will open in a new window/tab."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Formatter > :rel"
msgid "Override the rel attribute. Disable to clear."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Formatter > :strip_prefix"
msgid "Strip the scheme prefix."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Formatter > :truncate"
msgid "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Formatter > :validate_tld"
msgid "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
msgid "The number of scheduled activities a user is allowed to create in a single day. Default: 25."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :enabled"
msgid "Whether scheduled activities are sent to the job queue to be executed"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
msgid "The number of scheduled activities a user is allowed to create in total. Default: 300."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload > :base_url"
msgid "Base URL for the uploads. Required if you use a CDN or host attachments under a different domain."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload > :filename_display_max_length"
msgid "Set max length of a filename to display. 0 = no limit. Default: 30"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload > :filters"
msgid "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload > :link_name"
msgid "If enabled, a name parameter will be added to the URL of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload > :proxy_remote"
msgid "Proxy requests to the remote uploader.\n\nUseful if media upload endpoint is not internet accessible.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload > :uploader"
msgid "Module which will be used for uploads"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
msgid "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original filename extension by using {extension}, for example custom-file-name.{extension}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
msgid "List of actions for the mogrify command. It's possible to add self-written settings as string. For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Uploaders.Local > :uploads"
msgid "Path where user's uploads will be saved"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket"
msgid "S3 bucket"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
msgid "S3 bucket namespace"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
msgid "Enable streaming uploads, when enabled the file will be sent to the server in chunks as it's being read. This may be unsupported by some providers, try disabling this if you have upload problems."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
msgid "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc. For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in Upload base_url."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.User > :email_blacklist"
msgid "List of email domains users may not register with."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.User > :restricted_nicknames"
msgid "List of nicknames users may not register with."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.User.Backup > :limit_days"
msgid "Limit user to export not more often than once per N days"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.User.Backup > :purge_after_days"
msgid "Remove backup achives after N days"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
msgid "Enables strict input validation (useful in development, not recommended in production)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
msgid "HTTP headers of request"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
msgid "HTTP method of request. Default: :purge"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
msgid "Request options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
msgid "Path to executable script which will purge cached items."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
msgid "Optional URL format preprocessing. Only required for Apache's htcacheclean."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :providers"
msgid "List of metadata providers to enable"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
msgid "When enabled NSFW attachments will be shown in previews"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
msgid "Enable/disable the plug. Default: disabled."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
msgid " A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `[\"x-forwarded-for\"]`.\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
msgid "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
msgid " A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `[\"127.0.0.0/8\", \"::1/128\", \"fc00::/7\", \"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"]`\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Web.Preload > :providers"
msgid "List of preload providers to enable"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
msgid "Enables expired activities addition & deletion"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
msgid "Minimum lifetime for ephemeral activity (in seconds)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
msgid "Enables HTTP Basic Auth for app metrics endpoint."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
msgid "[Pleroma extension] Enables app metrics endpoint."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
msgid "App metrics endpoint output format."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
msgid "Restrict access of app metrics endpoint to the specified IP addresses."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
msgid "App metrics endpoint URI path."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :web_push_encryption-:vapid_details > :private_key"
msgid "VAPID private key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :web_push_encryption-:vapid_details > :public_key"
msgid "VAPID public key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :web_push_encryption-:vapid_details > :subject"
msgid "A mailto link for the administrative contact. It's best if this email is not a personal email address, but rather a group email to the instance moderation team."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :cors_plug > :credentials"
msgid "Credentials"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :cors_plug > :expose"
msgid "Expose"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :cors_plug > :headers"
msgid "Headers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :cors_plug > :max_age"
msgid "Max age"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :cors_plug > :methods"
msgid "Methods"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
-msgctxt "config label at :esshd > :enabled"
-msgid "Enabled"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/docs/translator.ex:5
-msgctxt "config label at :esshd > :handler"
-msgid "Handler"
-msgstr ""
-
-#, elixir-autogen, elixir-format
-#: lib/pleroma/docs/translator.ex:5
-msgctxt "config label at :esshd > :password_authenticator"
-msgid "Password authenticator"
-msgstr ""
-
-#, elixir-autogen, elixir-format
-#: lib/pleroma/docs/translator.ex:5
-msgctxt "config label at :esshd > :port"
-msgid "Port"
-msgstr ""
-
-#, elixir-autogen, elixir-format
-#: lib/pleroma/docs/translator.ex:5
-msgctxt "config label at :esshd > :priv_dir"
-msgid "Priv dir"
-msgstr ""
-
-#, elixir-autogen, elixir-format
-#: lib/pleroma/docs/translator.ex:5
msgctxt "config label at :ex_aws-:s3 > :access_key_id"
msgid "Access key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :ex_aws-:s3 > :host"
msgid "Host"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :ex_aws-:s3 > :region"
msgid "Region"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :ex_aws-:s3 > :secret_access_key"
msgid "Secret access key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger > :backends"
msgid "Backends"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger-:console > :format"
msgid "Format"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger-:console > :level"
msgid "Level"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger-:console > :metadata"
msgid "Metadata"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger-:ex_syslogger > :format"
msgid "Format"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger-:ex_syslogger > :ident"
msgid "Ident"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger-:ex_syslogger > :level"
msgid "Level"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :logger-:ex_syslogger > :metadata"
msgid "Metadata"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :mime > :types"
msgid "Types"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :mime > :types > application/activity+json"
msgid "\"application/activity+json\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :mime > :types > application/jrd+json"
msgid "\"application/jrd+json\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :mime > :types > application/ld+json"
msgid "\"application/ld+json\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :mime > :types > application/xml"
msgid "\"application/xml\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :mime > :types > application/xrd+xml"
msgid "\"application/xrd+xml\""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma > :admin_token"
msgid "Admin token"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma > Pleroma.Web.Auth.Authenticator"
msgid "Pleroma.Web.Auth.Authenticator"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:activitypub > :blockers_visible"
msgid "Blockers visible"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:activitypub > :follow_handshake_timeout"
msgid "Follow handshake timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:activitypub > :note_replies_output_limit"
msgid "Note replies output limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:activitypub > :outgoing_blocks"
msgid "Outgoing blocks"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:activitypub > :sign_object_fetches"
msgid "Sign object fetches"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:activitypub > :unfollow_blocked"
msgid "Unfollow blocked"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:assets > :default_mascot"
msgid "Default mascot"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:assets > :default_user_avatar"
msgid "Default user avatar"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:assets > :mascots"
msgid "Mascots"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:auth > :auth_template"
msgid "Auth template"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:auth > :enforce_oauth_admin_scope_usage"
msgid "Enforce OAuth admin scope usage"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:auth > :oauth_consumer_strategies"
msgid "OAuth consumer strategies"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:auth > :oauth_consumer_template"
msgid "OAuth consumer template"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:connections_pool > :connect_timeout"
msgid "Connect timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_retries"
msgid "Connection acquisition retries"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:connections_pool > :connection_acquisition_wait"
msgid "Connection acquisition wait"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:connections_pool > :max_connections"
msgid "Max connections"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:connections_pool > :reclaim_multiplier"
msgid "Reclaim multiplier"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:email_notifications > :digest"
msgid "Digest"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:email_notifications > :digest > :active"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:email_notifications > :digest > :inactivity_threshold"
msgid "Inactivity threshold"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:email_notifications > :digest > :interval"
msgid "Interval"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:email_notifications > :digest > :schedule"
msgid "Schedule"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:emoji > :default_manifest"
msgid "Default manifest"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:emoji > :groups"
msgid "Groups"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:emoji > :pack_extensions"
msgid "Pack extensions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:emoji > :shared_pack_cache_seconds_per_file"
msgid "Shared pack cache s/file"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:emoji > :shortcode_globs"
msgid "Shortcode globs"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:features > :improved_hashtag_timeline"
msgid "Improved hashtag timeline"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:feed > :post_title"
msgid "Post title"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:feed > :post_title > :max_length"
msgid "Max length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:feed > :post_title > :omission"
msgid "Omission"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe"
msgid "Pleroma FE"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :alwaysShowSubjectInput"
msgid "Always show subject input"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :background"
msgid "Background"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :collapseMessageWithSubject"
msgid "Collapse message with subject"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :greentext"
msgid "Greentext"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideFilteredStatuses"
msgid "Hide Filtered Statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideMutedPosts"
msgid "Hide Muted Posts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hidePostStats"
msgid "Hide post stats"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideSitename"
msgid "Hide Sitename"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :hideUserStats"
msgid "Hide user stats"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logo"
msgid "Logo"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMargin"
msgid "Logo margin"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :logoMask"
msgid "Logo mask"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :minimalScopesMode"
msgid "Minimal scopes mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :nsfwCensorImage"
msgid "NSFW Censor Image"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :postContentType"
msgid "Post Content Type"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootLogin"
msgid "Redirect root login"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :redirectRootNoLogin"
msgid "Redirect root no login"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :scopeCopy"
msgid "Scope copy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showFeaturesPanel"
msgid "Show instance features panel"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :showInstanceSpecificPanel"
msgid "Show instance specific panel"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :sidebarRight"
msgid "Sidebar on Right"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :subjectLineBehavior"
msgid "Subject line behavior"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontend_configurations > :pleroma_fe > :theme"
msgid "Theme"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :admin"
msgid "Admin"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :admin > name"
msgid "Name"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :admin > ref"
msgid "Reference"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :available"
msgid "Available"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :available > build_dir"
msgid "Build directory"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :available > build_url"
msgid "Build URL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :available > custom-http-headers"
msgid "Custom HTTP headers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :available > git"
msgid "Git Repository URL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :available > name"
msgid "Name"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :available > ref"
msgid "Reference"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :primary"
msgid "Primary"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :primary > name"
msgid "Name"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:frontends > :primary > ref"
msgid "Reference"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:gopher > :dstport"
msgid "Dstport"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:gopher > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:gopher > :ip"
msgid "IP"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:gopher > :port"
msgid "Port"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :federation"
msgid "Federation"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :federation > :max_connections"
msgid "Max connections"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :federation > :timeout"
msgid "Timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :media"
msgid "Media"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :media > :max_connections"
msgid "Max connections"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :media > :timeout"
msgid "Timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :upload"
msgid "Upload"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :upload > :max_connections"
msgid "Max connections"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:hackney_pools > :upload > :timeout"
msgid "Timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http > :adapter"
msgid "Adapter"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http > :adapter > :ssl_options"
msgid "SSL Options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http > :adapter > :ssl_options > :versions"
msgid "Versions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http > :proxy_url"
msgid "Proxy URL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http > :send_user_agent"
msgid "Send user agent"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http > :user_agent"
msgid "User agent"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http_security > :ct_max_age"
msgid "CT max age"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http_security > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http_security > :referrer_policy"
msgid "Referrer policy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http_security > :report_uri"
msgid "Report URI"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http_security > :sts"
msgid "STS"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:http_security > :sts_max_age"
msgid "STS max age"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :account_activation_required"
msgid "Account activation required"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :account_approval_required"
msgid "Account approval required"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :account_field_name_length"
msgid "Account field name length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :account_field_value_length"
msgid "Account field value length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :allow_relay"
msgid "Allow relay"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :allowed_post_formats"
msgid "Allowed post formats"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :attachment_links"
msgid "Attachment links"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :autofollowed_nicknames"
msgid "Autofollowed nicknames"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :autofollowing_nicknames"
msgid "Autofollowing nicknames"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :avatar_upload_limit"
msgid "Avatar upload limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :background_upload_limit"
msgid "Background upload limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :banner_upload_limit"
msgid "Banner upload limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :birthday_min_age"
msgid "Birthday min age"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :birthday_required"
msgid "Birthday required"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :cleanup_attachments"
msgid "Cleanup attachments"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :description"
msgid "Description"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :email"
msgid "Admin Email Address"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :extended_nickname_format"
msgid "Extended nickname format"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :external_user_synchronization"
msgid "External user synchronization"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :federating"
msgid "Federating"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :federation_incoming_replies_max_depth"
msgid "Fed. incoming replies max depth"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :federation_reachability_timeout_days"
msgid "Fed. reachability timeout days"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :healthcheck"
msgid "Healthcheck"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :instance_thumbnail"
msgid "Instance thumbnail"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :invites_enabled"
msgid "Invites enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :limit"
msgid "Limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :limit_to_local_content"
msgid "Limit to local content"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :max_account_fields"
msgid "Max account fields"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :max_endorsed_users"
msgid "Max endorsed users"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :max_media_attachments"
msgid "Max media attachments"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :max_pinned_statuses"
msgid "Max pinned statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :max_remote_account_fields"
msgid "Max remote account fields"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :max_report_comment_size"
msgid "Max report comment size"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :multi_factor_authentication"
msgid "Multi factor authentication"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes"
msgid "Backup codes"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :length"
msgid "Length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :backup_codes > :number"
msgid "Number"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp"
msgid "TOTP settings"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :digits"
msgid "Digits"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :multi_factor_authentication > :totp > :period"
msgid "Period"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :name"
msgid "Name"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :notify_email"
msgid "Sender Email Address"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :poll_limits"
msgid "Poll limits"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :poll_limits > :max_expiration"
msgid "Max expiration"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :poll_limits > :max_option_chars"
msgid "Max option chars"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :poll_limits > :max_options"
msgid "Max options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :poll_limits > :min_expiration"
msgid "Min expiration"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :profile_directory"
msgid "Profile directory"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :public"
msgid "Public"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :quarantined_instances"
msgid "Quarantined instances"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :registration_reason_length"
msgid "Registration reason length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :registrations_open"
msgid "Registrations open"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :remote_limit"
msgid "Remote limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :remote_post_retention_days"
msgid "Remote post retention days"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :safe_dm_mentions"
msgid "Safe DM mentions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :show_reactions"
msgid "Show reactions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :skip_thread_containment"
msgid "Skip thread containment"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :static_dir"
msgid "Static dir"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :upload_limit"
msgid "Upload limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :user_bio_length"
msgid "User bio length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :user_name_length"
msgid "User name length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instances_favicons > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :base"
msgid "Base"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :host"
msgid "Host"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :port"
msgid "Port"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :ssl"
msgid "SSL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :sslopts"
msgid "SSL options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :sslopts > :cacertfile"
msgid "Cacertfile"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :sslopts > :verify"
msgid "Verify"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :tls"
msgid "TLS"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :tlsopts"
msgid "TLS options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :tlsopts > :cacertfile"
msgid "Cacertfile"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :tlsopts > :verify"
msgid "Verify"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:ldap > :uid"
msgid "UID"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:majic_pool > :size"
msgid "Size"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:manifest > :background_color"
msgid "Background color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:manifest > :icons"
msgid "Icons"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:manifest > :theme_color"
msgid "Theme color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:markup > :allow_fonts"
msgid "Allow fonts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:markup > :allow_headings"
msgid "Allow headings"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:markup > :allow_inline_images"
msgid "Allow inline images"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:markup > :allow_tables"
msgid "Allow tables"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:markup > :scrub_policy"
msgid "Scrub policy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_preview_proxy > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_preview_proxy > :image_quality"
msgid "Image quality"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_preview_proxy > :min_content_length"
msgid "Min content length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_height"
msgid "Thumbnail max height"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_preview_proxy > :thumbnail_max_width"
msgid "Thumbnail max width"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :base_url"
msgid "Base URL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :invalidation"
msgid "Invalidation"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :invalidation > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :invalidation > :provider"
msgid "Provider"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :proxy_opts"
msgid "Advanced MediaProxy Options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_body_length"
msgid "Max body length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :max_read_duration"
msgid "Max read duration"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :proxy_opts > :redirect_on_failure"
msgid "Redirect on failure"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:media_proxy > :whitelist"
msgid "Whitelist"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:modules > :runtime_dir"
msgid "Runtime dir"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf > :policies"
msgid "Policies"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf > :transparency"
msgid "MRF transparency"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf > :transparency_exclusions"
msgid "MRF transparency exclusions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_activity_expiration > :days"
msgid "Days"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_follow_bot > :follower_nickname"
msgid "Follower nickname"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_hashtag > :federated_timeline_removal"
msgid "Federated timeline removal"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_hashtag > :reject"
msgid "Reject"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_hashtag > :sensitive"
msgid "Sensitive"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_hellthread > :delist_threshold"
msgid "Delist threshold"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_hellthread > :reject_threshold"
msgid "Reject threshold"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_keyword > :federated_timeline_removal"
msgid "Federated timeline removal"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_keyword > :reject"
msgid "Reject"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_keyword > :replace"
msgid "Replace"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_mention > :actors"
msgid "Actors"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_normalize_markup > :scrub_policy"
msgid "Scrub policy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_object_age > :actions"
msgid "Actions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_object_age > :threshold"
msgid "Threshold"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_direct"
msgid "Allow direct"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_rejectnonpublic > :allow_followersonly"
msgid "Allow followers-only"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :accept"
msgid "Accept"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :avatar_removal"
msgid "Avatar removal"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :banner_removal"
msgid "Banner removal"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :federated_timeline_removal"
msgid "Federated timeline removal"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :followers_only"
msgid "Followers only"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :media_nsfw"
msgid "Media NSFW"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :media_removal"
msgid "Media removal"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :reject"
msgid "Reject"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :reject_deletes"
msgid "Reject deletes"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_simple > :report_removal"
msgid "Report removal"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_steal_emoji > :hosts"
msgid "Hosts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_steal_emoji > :rejected_shortcodes"
msgid "Rejected shortcodes"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_steal_emoji > :size_limit"
msgid "Size limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_subchain > :match_actor"
msgid "Match actor"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_vocabulary > :accept"
msgid "Accept"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:mrf_vocabulary > :reject"
msgid "Reject"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:oauth2 > :clean_expired_tokens"
msgid "Clean expired tokens"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:oauth2 > :issue_new_refresh_token"
msgid "Issue new refresh token"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:oauth2 > :token_expires_in"
msgid "Token expires in"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :default"
msgid "Default"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :default > :max_waiting"
msgid "Max waiting"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :default > :recv_timeout"
msgid "Recv timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :default > :size"
msgid "Size"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :federation"
msgid "Federation"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :federation > :max_waiting"
msgid "Max waiting"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :federation > :recv_timeout"
msgid "Recv timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :federation > :size"
msgid "Size"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :media"
msgid "Media"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :media > :max_waiting"
msgid "Max waiting"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :media > :recv_timeout"
msgid "Recv timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :media > :size"
msgid "Size"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :upload"
msgid "Upload"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :upload > :max_waiting"
msgid "Max waiting"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :upload > :recv_timeout"
msgid "Recv timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:pools > :upload > :size"
msgid "Size"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:populate_hashtags_table > :fault_rate_allowance"
msgid "Fault rate allowance"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:populate_hashtags_table > :sleep_interval_ms"
msgid "Sleep interval ms"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :app_account_creation"
msgid "App account creation"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :authentication"
msgid "Authentication"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :relation_id_action"
msgid "Relation ID action"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :relations_actions"
msgid "Relations actions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :search"
msgid "Search"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :status_id_action"
msgid "Status ID action"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :statuses_actions"
msgid "Statuses actions"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rate_limit > :timeline"
msgid "Timeline"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities"
msgid "Activities"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :local"
msgid "Local"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :activities > :remote"
msgid "Remote"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles"
msgid "Profiles"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :local"
msgid "Local"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :profiles > :remote"
msgid "Remote"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines"
msgid "Timelines"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :federated"
msgid "Federated"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:restrict_unauthenticated > :timelines > :local"
msgid "Local"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rich_media > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rich_media > :failure_backoff"
msgid "Failure backoff"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rich_media > :ignore_hosts"
msgid "Ignore hosts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rich_media > :ignore_tld"
msgid "Ignore TLD"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rich_media > :parsers"
msgid "Parsers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:rich_media > :ttl_setters"
msgid "TTL setters"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:shout > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:shout > :limit"
msgid "Limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:static_fe > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:streamer > :overflow_workers"
msgid "Overflow workers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:streamer > :workers"
msgid "Workers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:uri_schemes > :valid_schemes"
msgid "Valid schemes"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:user > :deny_follow_blocked"
msgid "Deny follow blocked"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub"
msgid "Activity pub"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:web_cache_ttl > :activity_pub_question"
msgid "Activity pub question"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :chat_message"
msgid "Chat message"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :chat_message > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :chat_message > :message"
msgid "Message"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :chat_message > :sender_nickname"
msgid "Sender nickname"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :direct_message"
msgid "Direct message"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :direct_message > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :direct_message > :message"
msgid "Message"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :direct_message > :sender_nickname"
msgid "Sender nickname"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :email"
msgid "Email"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :email > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :email > :html"
msgid "Html"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :email > :sender"
msgid "Sender"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :email > :subject"
msgid "Subject"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:welcome > :email > :text"
msgid "Text"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:workers > :retries"
msgid "Retries"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
msgid "Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_running"
msgid "Max running"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy > :max_waiting"
msgid "Max waiting"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers"
msgid "Pleroma.Web.RichMedia.Helpers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_running"
msgid "Max running"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-ConcurrentLimiter > Pleroma.Web.RichMedia.Helpers > :max_waiting"
msgid "Max waiting"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :crontab"
msgid "Crontab"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :log"
msgid "Log"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues"
msgid "Queues"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :activity_expiration"
msgid "Activity expiration"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :attachments_cleanup"
msgid "Attachments cleanup"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :background"
msgid "Background"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :backup"
msgid "Backup"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :federator_incoming"
msgid "Federator incoming"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :federator_outgoing"
msgid "Federator outgoing"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :mailer"
msgid "Mailer"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :scheduled_activities"
msgid "Scheduled activities"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :transmogrifier"
msgid "Transmogrifier"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Oban > :queues > :web_push"
msgid "Web push"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Captcha > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Captcha > :method"
msgid "Method"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Captcha > :seconds_valid"
msgid "Seconds valid"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Captcha.Kocaptcha > :endpoint"
msgid "Endpoint"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :adapter"
msgid "Adapter"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > :enabled"
msgid "Mailer Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:access_key"
msgid "AWS Access Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:region"
msgid "AWS Region"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.AmazonSES-:secret"
msgid "AWS Secret Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Dyn-:api_key"
msgid "Dyn API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Gmail-:access_token"
msgid "GMail API Access Token"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:api_key"
msgid "Mailgun API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailgun-:domain"
msgid "Domain"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:api_key"
msgid "MailJet Public API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mailjet-:secret"
msgid "MailJet Private API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Mandrill-:api_key"
msgid "Mandrill API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Postmark-:api_key"
msgid "Postmark API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:auth"
msgid "AUTH Mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:password"
msgid "Password"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:port"
msgid "Port"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:relay"
msgid "Relay"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:retries"
msgid "Retries"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:ssl"
msgid "Use SSL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:tls"
msgid "STARTTLS Mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SMTP-:username"
msgid "Username"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendgrid-:api_key"
msgid "SendGrid API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_args"
msgid "Cmd args"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:cmd_path"
msgid "Cmd path"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.Sendmail-:qmail"
msgid "Qmail compat mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:api_key"
msgid "SocketLabs API Key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SocketLabs-:server_id"
msgid "Server ID"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:api_key"
msgid "SparkPost API key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.Mailer > Swoosh.Adapters.SparkPost-:endpoint"
msgid "Endpoint"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.NewUsersDigestEmail > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :logo"
msgid "Logo"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling"
msgid "Styling"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :background_color"
msgid "Background color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :content_background_color"
msgid "Content background color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :header_color"
msgid "Header color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :link_color"
msgid "Link color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_color"
msgid "Text color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Emails.UserEmail > :styling > :text_muted_color"
msgid "Text muted color"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Formatter > :class"
msgid "Class"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Formatter > :extra"
msgid "Extra"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Formatter > :new_window"
msgid "New window"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Formatter > :rel"
msgid "Rel"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Formatter > :strip_prefix"
msgid "Strip prefix"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Formatter > :truncate"
msgid "Truncate"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Formatter > :validate_tld"
msgid "Validate tld"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :daily_user_limit"
msgid "Daily user limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.ScheduledActivity > :total_user_limit"
msgid "Total user limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload > :base_url"
msgid "Base URL"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload > :filename_display_max_length"
msgid "Filename display max length"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload > :filters"
msgid "Filters"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload > :link_name"
msgid "Link name"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload > :proxy_remote"
msgid "Proxy remote"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload > :uploader"
msgid "Uploader"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload.Filter.AnonymizeFilename > :text"
msgid "Text"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Upload.Filter.Mogrify > :args"
msgid "Args"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Uploaders.Local > :uploads"
msgid "Uploads"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket"
msgid "Bucket"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :bucket_namespace"
msgid "Bucket namespace"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :streaming_enabled"
msgid "Streaming enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Uploaders.S3 > :truncated_namespace"
msgid "Truncated namespace"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.User > :email_blacklist"
msgid "Email blacklist"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.User > :restricted_nicknames"
msgid "Restricted nicknames"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.User.Backup > :limit_days"
msgid "Limit days"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.User.Backup > :purge_after_days"
msgid "Purge after days"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.ApiSpec.CastAndValidate > :strict"
msgid "Strict"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :headers"
msgid "Headers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :method"
msgid "Method"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options"
msgid "Options"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Http > :options > :params"
msgid "Params"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :script_path"
msgid "Script path"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.MediaProxy.Invalidation.Script > :url_format"
msgid "URL Format"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :providers"
msgid "Providers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.Metadata > :unfurl_nsfw"
msgid "Unfurl NSFW"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :headers"
msgid "Headers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :proxies"
msgid "Proxies"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.Plugs.RemoteIp > :reserved"
msgid "Reserved"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Web.Preload > :providers"
msgid "Providers"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-Pleroma.Workers.PurgeExpiredActivity > :min_lifetime"
msgid "Min lifetime"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :auth"
msgid "Auth"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :enabled"
msgid "Enabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :format"
msgid "Format"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :ip_whitelist"
msgid "IP Whitelist"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :prometheus-Pleroma.Web.Endpoint.MetricsExporter > :path"
msgid "Path"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :web_push_encryption-:vapid_details > :private_key"
msgid "Private key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :web_push_encryption-:vapid_details > :public_key"
msgid "Public key"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :web_push_encryption-:vapid_details > :subject"
msgid "Subject"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:activitypub > :authorized_fetch_mode"
msgid "Require HTTP signatures for AP fetches"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :short_description"
msgid "Shorter version of instance description. It can be seen on `/api/v1/instance`"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:activitypub > :authorized_fetch_mode"
msgid "Authorized fetch mode"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :short_description"
msgid "Short description"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:delete_context_objects"
msgid "`delete_context_objects` background migration settings"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:delete_context_objects > :fault_rate_allowance"
msgid "Max accepted rate of objects that failed in the migration. Any value from 0.0 which tolerates no errors to 1.0 which will enable the feature even if context object deletion failed for all records."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:delete_context_objects > :sleep_interval_ms"
msgid "Sleep interval between each chunk of processed records in order to decrease the load on the system (defaults to 0 and should be keep default on most instances)."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :birthday_min_age"
msgid "Minimum required age (in days) for users to create account. Only used if birthday is required."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:delete_context_objects"
msgid "Delete context objects"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:delete_context_objects > :fault_rate_allowance"
msgid "Fault rate allowance"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:delete_context_objects > :sleep_interval_ms"
msgid "Sleep interval ms"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :report_strip_status"
msgid "Strip associated statuses in reports to ids when closed/resolved, otherwise keep a copy"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:mrf_object_age > :actions"
msgid "A list of actions to apply to the post. `:delist` removes the post from public timelines; `:strip_followers` removes followers from the ActivityPub recipient list ensuring they won't be delivered to home timelines, additionally for followers-only it degrades to a direct message; `:reject` rejects the message entirely"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :report_strip_status"
msgid "Report strip status"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :admin_privileges"
msgid "What extra privileges to allow admins (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :moderator_privileges"
msgid "What extra privileges to allow moderators (e.g. updating user credentials, get password reset token, delete users, index and read private statuses and chats)"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :admin_privileges"
msgid "Admin privileges"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :moderator_privileges"
msgid "Moderator privileges"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config description at :pleroma-:instance > :languages"
msgid "Languages to be exposed in /api/v1/instance. Should be in the format of BCP47 language codes."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/docs/translator.ex:5
+#, elixir-autogen, elixir-format
msgctxt "config label at :pleroma-:instance > :languages"
msgid "Languages"
msgstr ""
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index 10a62d2a8..4819162b7 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -10,176 +10,176 @@
msgid ""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:122
+#, elixir-autogen, elixir-format
msgid "%{name} - %{count} is not a multiple of %{multiple}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:131
+#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is larger than exclusive maximum %{max}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:140
+#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is larger than inclusive maximum %{max}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:149
+#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is smaller than exclusive minimum %{min}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:158
+#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is smaller than inclusive minimum %{min}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:102
+#, elixir-autogen, elixir-format
msgid "%{name} - Array items must be unique."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:114
+#, elixir-autogen, elixir-format
msgid "%{name} - Array length %{length} is larger than maxItems: %{}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:106
+#, elixir-autogen, elixir-format
msgid "%{name} - Array length %{length} is smaller than minItems: %{min}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:166
+#, elixir-autogen, elixir-format
msgid "%{name} - Invalid %{type}. Got: %{value}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:174
+#, elixir-autogen, elixir-format
msgid "%{name} - Invalid format. Expected %{format}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:51
+#, elixir-autogen, elixir-format
msgid "%{name} - Invalid schema.type. Got: %{type}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:178
+#, elixir-autogen, elixir-format
msgid "%{name} - Invalid value for enum."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:95
+#, elixir-autogen, elixir-format
msgid "%{name} - String length is larger than maxLength: %{length}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:88
+#, elixir-autogen, elixir-format
msgid "%{name} - String length is smaller than minLength: %{length}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:63
+#, elixir-autogen, elixir-format
msgid "%{name} - null value where %{type} expected."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:60
+#, elixir-autogen, elixir-format
msgid "%{name} - null value."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:182
+#, elixir-autogen, elixir-format
msgid "Failed to cast to any schema in %{polymorphic_type}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:71
+#, elixir-autogen, elixir-format
msgid "Failed to cast value as %{invalid_schema}. Value must be castable using `allOf` schemas listed."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:84
+#, elixir-autogen, elixir-format
msgid "Failed to cast value to one of: %{failed_schemas}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:78
+#, elixir-autogen, elixir-format
msgid "Failed to cast value using any of: %{failed_schemas}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:212
+#, elixir-autogen, elixir-format
msgid "Invalid value for header: %{name}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:204
+#, elixir-autogen, elixir-format
msgid "Missing field: %{name}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:208
+#, elixir-autogen, elixir-format
msgid "Missing header: %{name}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:196
+#, elixir-autogen, elixir-format
msgid "No value provided for required discriminator `%{field}`."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:216
+#, elixir-autogen, elixir-format
msgid "Object property count %{property_count} is greater than maxProperties: %{max_properties}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:224
+#, elixir-autogen, elixir-format
msgid "Object property count %{property_count} is less than minProperties: %{min_properties}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/static_fe/static_fe/error.html.eex:2
+#, elixir-autogen, elixir-format
msgid "Oops"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:188
+#, elixir-autogen, elixir-format
msgid "Unexpected field: %{name}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:200
+#, elixir-autogen, elixir-format
msgid "Unknown schema: %{name}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:192
+#, elixir-autogen, elixir-format
msgid "Value used as discriminator for `%{field}` matches no schemas."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:43
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:37
+#, elixir-autogen, elixir-format
msgid "announces"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:44
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:38
+#, elixir-autogen, elixir-format
msgid "likes"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:42
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:36
+#, elixir-autogen, elixir-format
msgid "replies"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:27
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:22
+#, elixir-autogen, elixir-format
msgid "sensitive media"
msgstr ""
diff --git a/priv/gettext/errors.pot b/priv/gettext/errors.pot
index fa61d509e..d320ee1bd 100644
--- a/priv/gettext/errors.pot
+++ b/priv/gettext/errors.pot
@@ -89,153 +89,152 @@ msgstr ""
msgid "must be equal to %{number}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:574
+#, elixir-autogen, elixir-format
msgid "Account not found"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:332
+#, elixir-autogen, elixir-format
msgid "Already voted"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:402
+#, elixir-autogen, elixir-format
msgid "Bad request"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/controller_helper.ex:97
#: lib/pleroma/web/controller_helper.ex:103
+#, elixir-autogen, elixir-format
msgid "Can't display this activity"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:334
+#, elixir-autogen, elixir-format
msgid "Can't find user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:80
+#, elixir-autogen, elixir-format
msgid "Can't get favorites"
msgstr ""
+#: lib/pleroma/web/common_api/utils.ex:464
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/common_api/utils.ex:457
msgid "Cannot post an empty status without attachments"
msgstr ""
+#: lib/pleroma/web/common_api/utils.ex:452
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/common_api/utils.ex:445
msgid "Comment must be up to %{max_size} characters"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/config_db.ex:199
+#, elixir-autogen, elixir-format
msgid "Config with params %{params} not found"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:183
#: lib/pleroma/web/common_api.ex:187
+#, elixir-autogen, elixir-format
msgid "Could not delete"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:233
+#, elixir-autogen, elixir-format
msgid "Could not favorite"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:270
+#, elixir-autogen, elixir-format
msgid "Could not unfavorite"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:218
+#, elixir-autogen, elixir-format
msgid "Could not unrepeat"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:581
#: lib/pleroma/web/common_api.ex:590
+#, elixir-autogen, elixir-format
msgid "Could not update state"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:207
+#, elixir-autogen, elixir-format
msgid "Error."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:105
+#, elixir-autogen, elixir-format
msgid "Invalid CAPTCHA"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:146
#: lib/pleroma/web/o_auth/o_auth_controller.ex:631
+#, elixir-autogen, elixir-format
msgid "Invalid credentials"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:42
+#, elixir-autogen, elixir-format
msgid "Invalid credentials."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:353
+#, elixir-autogen, elixir-format
msgid "Invalid indices"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:29
+#, elixir-autogen, elixir-format
msgid "Invalid parameters"
msgstr ""
+#: lib/pleroma/web/common_api/utils.ex:360
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/common_api/utils.ex:353
msgid "Invalid password."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:267
+#, elixir-autogen, elixir-format
msgid "Invalid request"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:108
+#, elixir-autogen, elixir-format
msgid "Kocaptcha service unavailable"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:142
+#, elixir-autogen, elixir-format
msgid "Missing parameters"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:171
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:197
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:239
+#, elixir-autogen, elixir-format
msgid "No such permission_group"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:502
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:11
#: lib/pleroma/web/feed/tag_controller.ex:16
#: lib/pleroma/web/feed/user_controller.ex:69
#: lib/pleroma/web/o_status/o_status_controller.ex:132
-#: lib/pleroma/web/plugs/uploaded_media.ex:84
+#: lib/pleroma/web/plugs/uploaded_media.ex:104
+#, elixir-autogen, elixir-format
msgid "Not found"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:324
+#, elixir-autogen, elixir-format
msgid "Poll's author can't vote"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:499
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20
#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:39
@@ -243,213 +242,213 @@ msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:52
#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:382
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71
+#, elixir-autogen, elixir-format
msgid "Record not found"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:35
#: lib/pleroma/web/feed/user_controller.ex:78
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:42
#: lib/pleroma/web/o_status/o_status_controller.ex:138
+#, elixir-autogen, elixir-format
msgid "Something went wrong"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/activity_draft.ex:143
+#, elixir-autogen, elixir-format
msgid "The message visibility must be direct"
msgstr ""
+#: lib/pleroma/web/common_api/utils.ex:474
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/common_api/utils.ex:467
msgid "The status is over the character limit"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_public_or_authenticated_plug.ex:36
+#, elixir-autogen, elixir-format
msgid "This resource requires authentication."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/rate_limiter.ex:208
+#, elixir-autogen, elixir-format
msgid "Throttled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:354
+#, elixir-autogen, elixir-format
msgid "Too many choices"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:268
+#, elixir-autogen, elixir-format
msgid "You can't revoke your own admin status."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:243
#: lib/pleroma/web/o_auth/o_auth_controller.ex:333
+#, elixir-autogen, elixir-format
msgid "Your account is currently disabled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:205
#: lib/pleroma/web/o_auth/o_auth_controller.ex:356
+#, elixir-autogen, elixir-format
msgid "Your login is missing a confirmed e-mail address"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:390
+#, elixir-autogen, elixir-format
msgid "can't read inbox of %{nickname} as %{as_nickname}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:489
+#, elixir-autogen, elixir-format
msgid "can't update outbox of %{nickname} as %{as_nickname}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:526
+#, elixir-autogen, elixir-format
msgid "conversation is already muted"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:508
+#, elixir-autogen, elixir-format
msgid "error"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:34
+#, elixir-autogen, elixir-format
msgid "mascots can only be images"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:63
+#, elixir-autogen, elixir-format
msgid "not found"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:437
+#, elixir-autogen, elixir-format
msgid "Bad OAuth request."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:114
+#, elixir-autogen, elixir-format
msgid "CAPTCHA already used"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:111
+#, elixir-autogen, elixir-format
msgid "CAPTCHA expired"
msgstr ""
+#: lib/pleroma/web/plugs/uploaded_media.ex:77
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/plugs/uploaded_media.ex:57
msgid "Failed"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:453
+#, elixir-autogen, elixir-format
msgid "Failed to authenticate: %{message}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:484
+#, elixir-autogen, elixir-format
msgid "Failed to set up user account."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/o_auth_scopes_plug.ex:37
+#, elixir-autogen, elixir-format
msgid "Insufficient permissions: %{permissions}."
msgstr ""
+#: lib/pleroma/web/plugs/uploaded_media.ex:131
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/plugs/uploaded_media.ex:111
msgid "Internal Error"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/fallback_controller.ex:22
#: lib/pleroma/web/o_auth/fallback_controller.ex:29
+#, elixir-autogen, elixir-format
msgid "Invalid Username/Password"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:117
+#, elixir-autogen, elixir-format
msgid "Invalid answer data"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:33
+#, elixir-autogen, elixir-format
msgid "Nodeinfo schema version not handled"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:194
+#, elixir-autogen, elixir-format
msgid "This action is outside the authorized scopes"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/fallback_controller.ex:14
+#, elixir-autogen, elixir-format
msgid "Unknown error, please check the details and try again."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:136
#: lib/pleroma/web/o_auth/o_auth_controller.ex:180
+#, elixir-autogen, elixir-format
msgid "Unlisted redirect_uri."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:433
+#, elixir-autogen, elixir-format
msgid "Unsupported OAuth provider: %{provider}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/uploaders/uploader.ex:74
+#, elixir-autogen, elixir-format
msgid "Uploader callback timeout"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/uploader_controller.ex:23
+#, elixir-autogen, elixir-format
msgid "bad request"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:102
+#, elixir-autogen, elixir-format
msgid "CAPTCHA Error"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:282
+#, elixir-autogen, elixir-format
msgid "Could not add reaction emoji"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:293
+#, elixir-autogen, elixir-format
msgid "Could not remove reaction emoji"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:128
+#, elixir-autogen, elixir-format
msgid "Invalid CAPTCHA (Missing parameter: %{name})"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:96
+#, elixir-autogen, elixir-format
msgid "List not found"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:153
+#, elixir-autogen, elixir-format
msgid "Missing parameter: %{name}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:232
#: lib/pleroma/web/o_auth/o_auth_controller.ex:346
+#, elixir-autogen, elixir-format
msgid "Password reset is required"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/tests/auth_test_controller.ex:9
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:6
@@ -529,81 +528,82 @@ msgstr ""
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6
#: lib/pleroma/web/uploader_controller.ex:6
#: lib/pleroma/web/web_finger/web_finger_controller.ex:6
+#, elixir-autogen, elixir-format
msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:32
+#, elixir-autogen, elixir-format
msgid "Two-factor authentication enabled, you must use a access token."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61
+#, elixir-autogen, elixir-format
msgid "Web push subscription is disabled on this Pleroma instance"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:234
+#, elixir-autogen, elixir-format
msgid "You can't revoke your own admin/moderator status."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:131
+#, elixir-autogen, elixir-format
msgid "authorization required for timeline view"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:24
+#, elixir-autogen, elixir-format
msgid "Access denied"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:331
+#, elixir-autogen, elixir-format
msgid "This API requires an authenticated user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/user_is_admin_plug.ex:21
+#, elixir-autogen, elixir-format
msgid "User is not an admin."
msgstr ""
-#, elixir-format
#: lib/pleroma/user/backup.ex:73
+#, elixir-format
msgid "Last export was less than a day ago"
msgid_plural "Last export was less than %{days} days ago"
msgstr[0] ""
msgstr[1] ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:421
+#, elixir-autogen, elixir-format
msgid "Character limit (%{limit} characters) exceeded, contains %{length} characters"
msgstr ""
+#: lib/pleroma/web/common_api/utils.ex:489
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/common_api/utils.ex:482
msgid "Too many attachments"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/user_is_staff_plug.ex:20
+#, elixir-autogen, elixir-format
msgid "User is not a staff member."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:366
+#, elixir-autogen, elixir-format
msgid "Your account is awaiting approval."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:258
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:261
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:264
+#, elixir-autogen, elixir-format
msgid "File is too large"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_privileged_plug.ex:21
#: lib/pleroma/web/plugs/ensure_privileged_plug.ex:34
#: lib/pleroma/web/plugs/ensure_privileged_plug.ex:41
+#, elixir-autogen, elixir-format
msgid "User isn't privileged."
msgstr ""
diff --git a/priv/gettext/oauth_scopes.pot b/priv/gettext/oauth_scopes.pot
index 5f7b425f3..50ad0dd9e 100644
--- a/priv/gettext/oauth_scopes.pot
+++ b/priv/gettext/oauth_scopes.pot
@@ -10,252 +10,212 @@
msgid ""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:read"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "follow"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "push"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "read"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "read:accounts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "read:backups"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "read:blocks"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "read:bookmarks"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "read:chats"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "read:favourites"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "read:filters"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "read:follows"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "read:lists"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "read:notifications"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "read:reports"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "read:search"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "read:statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:accounts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:blocks"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:bookmarks"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "write:chats"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "write:conversations"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:favourites"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:filters"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "write:follow"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "write:follows"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:lists"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:media"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:mutes"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "write:notifications"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "write:reports"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "write:statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:read:accounts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:read:chats"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:read:invites"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:read:media_proxy_caches"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:read:reports"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:read:statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write:accounts"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write:chats"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write:follows"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write:invites"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write:media_proxy_caches"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write:reports"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
+#, elixir-autogen, elixir-format
msgid "admin:write:statuses"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/scopes/translator.ex:5
-msgid "read:media"
-msgstr ""
-
#, elixir-autogen, elixir-format
-#: lib/pleroma/web/api_spec/scopes/translator.ex:5
msgid "read:mutes"
msgstr ""
diff --git a/priv/gettext/static_pages.pot b/priv/gettext/static_pages.pot
index 4c372ac4d..208528239 100644
--- a/priv/gettext/static_pages.pot
+++ b/priv/gettext/static_pages.pot
@@ -10,553 +10,553 @@
msgid ""
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:9
+#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button"
msgid "Authorize"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:2
+#, elixir-autogen, elixir-format
msgctxt "remote follow error"
msgid "Error fetching user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "remote follow header"
msgid "Remote follow"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "placeholder text for auth code entry"
msgid "Authentication code"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:10
+#, elixir-autogen, elixir-format
msgctxt "placeholder text for password entry"
msgid "Password"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "placeholder text for username entry"
msgid "Username"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:13
+#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button for login"
msgid "Authorize"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:12
+#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button for mfa"
msgid "Authorize"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:2
+#, elixir-autogen, elixir-format
msgctxt "remote follow error"
msgid "Error following account"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "remote follow header, need login"
msgid "Log in to follow"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "remote follow mfa header"
msgid "Two-factor authentication"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "remote follow success"
msgid "Account followed!"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:7
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:7
+#, elixir-autogen, elixir-format
msgctxt "placeholder text for account id"
msgid "Your account ID, e.g. lain@quitter.se"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button for following with a remote account"
msgid "Follow"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:2
+#, elixir-autogen, elixir-format
msgctxt "remote follow error"
msgid "Error: %{error}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "remote follow header"
msgid "Remotely follow %{nickname}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:12
+#, elixir-autogen, elixir-format
msgctxt "password reset button"
msgid "Reset"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "password reset failed homepage link"
msgid "Homepage"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "password reset failed message"
msgid "Password reset failed"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "password reset form confirm password prompt"
msgid "Confirmation"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "password reset form password prompt"
msgid "Password"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/invalid_token.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "password reset invalid token message"
msgid "Invalid Token"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:2
+#, elixir-autogen, elixir-format
msgctxt "password reset successful homepage link"
msgid "Homepage"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "password reset successful message"
msgid "Password changed!"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/feed/feed/tag.atom.eex:12
#: lib/pleroma/web/templates/feed/feed/tag.rss.eex:8
+#, elixir-autogen, elixir-format
msgctxt "tag feed description"
msgid "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "oauth authorization exists page title"
msgid "Authorization exists"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:32
+#, elixir-autogen, elixir-format
msgctxt "oauth authorize approve button"
msgid "Approve"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:30
+#, elixir-autogen, elixir-format
msgctxt "oauth authorize cancel button"
msgid "Cancel"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:23
+#, elixir-autogen, elixir-format
msgctxt "oauth authorize message"
msgid "Application %{client_name} is requesting access to your account."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "oauth authorized page title"
msgid "Successfully authorized"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "oauth external provider page title"
msgid "Sign in with external provider"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:13
+#, elixir-autogen, elixir-format
msgctxt "oauth external provider sign in button"
msgid "Sign in with %{strategy}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:54
+#, elixir-autogen, elixir-format
msgctxt "oauth login button"
msgid "Log In"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:51
+#, elixir-autogen, elixir-format
msgctxt "oauth login password prompt"
msgid "Password"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:47
+#, elixir-autogen, elixir-format
msgctxt "oauth login username prompt"
msgid "Username"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:39
+#, elixir-autogen, elixir-format
msgctxt "oauth register nickname prompt"
msgid "Pleroma Handle"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:37
+#, elixir-autogen, elixir-format
msgctxt "oauth register nickname unchangeable warning"
msgid "Choose carefully! You won't be able to change this later. You will be able to change your display name, though."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:18
+#, elixir-autogen, elixir-format
msgctxt "oauth register page email prompt"
msgid "Email"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:10
+#, elixir-autogen, elixir-format
msgctxt "oauth register page fill form prompt"
msgid "If you'd like to register a new account, please provide the details below."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:35
+#, elixir-autogen, elixir-format
msgctxt "oauth register page login button"
msgid "Proceed as existing user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:31
+#, elixir-autogen, elixir-format
msgctxt "oauth register page login password prompt"
msgid "Password"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:24
+#, elixir-autogen, elixir-format
msgctxt "oauth register page login prompt"
msgid "Alternatively, sign in to connect to existing account."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:27
+#, elixir-autogen, elixir-format
msgctxt "oauth register page login username prompt"
msgid "Name or email"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:14
+#, elixir-autogen, elixir-format
msgctxt "oauth register page nickname prompt"
msgid "Nickname"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:22
+#, elixir-autogen, elixir-format
msgctxt "oauth register page register button"
msgid "Proceed as new user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "oauth register page title"
msgid "Registration Details"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:36
+#, elixir-autogen, elixir-format
msgctxt "oauth register page title"
msgid "This is the first time you visit! Please enter your Pleroma handle."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex:2
+#, elixir-autogen, elixir-format
msgctxt "oauth scopes message"
msgid "The following permissions will be granted"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:2
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:2
+#, elixir-autogen, elixir-format
msgctxt "oauth token code message"
msgid "Token code is
%{token}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:12
+#, elixir-autogen, elixir-format
msgctxt "mfa auth code prompt"
msgid "Authentication code"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "mfa auth page title"
msgid "Two-factor authentication"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:23
+#, elixir-autogen, elixir-format
msgctxt "mfa auth page use recovery code link"
msgid "Enter a two-factor recovery code"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:20
+#, elixir-autogen, elixir-format
msgctxt "mfa auth verify code button"
msgid "Verify"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "mfa recover page title"
msgid "Two-factor recovery"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:12
+#, elixir-autogen, elixir-format
msgctxt "mfa recover recovery code prompt"
msgid "Recovery code"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:23
+#, elixir-autogen, elixir-format
msgctxt "mfa recover use 2fa code link"
msgid "Enter a two-factor code"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:20
+#, elixir-autogen, elixir-format
msgctxt "mfa recover verify recovery code button"
msgid "Verify"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "static fe profile page remote follow button"
msgid "Remote follow"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:163
+#, elixir-autogen, elixir-format
msgctxt "digest email header line"
msgid "Hey %{nickname}, here is what you've missed!"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:544
+#, elixir-autogen, elixir-format
msgctxt "digest email receiver address"
msgid "The email address you are subscribed as is %{email}. "
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:538
+#, elixir-autogen, elixir-format
msgctxt "digest email sending reason"
msgid "You have received this email because you have signed up to receive digest emails from %{instance} Pleroma instance."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:547
+#, elixir-autogen, elixir-format
msgctxt "digest email unsubscribe action"
msgid "To unsubscribe, please go %{here}."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:547
+#, elixir-autogen, elixir-format
msgctxt "digest email unsubscribe action link text"
msgid "here"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_failure.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "mailer unsubscribe failed message"
msgid "UNSUBSCRIBE FAILURE"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_success.html.eex:1
+#, elixir-autogen, elixir-format
msgctxt "mailer unsubscribe successful message"
msgid "UNSUBSCRIBE SUCCESSFUL"
msgstr ""
-#, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:385
+#, elixir-format
msgctxt "new followers count header"
msgid "%{count} New Follower"
msgid_plural "%{count} New Followers"
msgstr[0] ""
msgstr[1] ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:356
+#, elixir-autogen, elixir-format
msgctxt "account archive email body - self-requested"
msgid "You requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:384
+#, elixir-autogen, elixir-format
msgctxt "account archive email subject"
msgid "Your account archive is ready"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:188
+#, elixir-autogen, elixir-format
msgctxt "approval pending email body"
msgid "Awaiting Approval
\nYour account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.
\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:202
+#, elixir-autogen, elixir-format
msgctxt "approval pending email subject"
msgid "Your account is awaiting approval"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:158
+#, elixir-autogen, elixir-format
msgctxt "confirmation email body"
msgid "Thank you for registering on %{instance_name}
\nEmail confirmation is required to activate the account.
\nPlease click the following link to activate your account.
\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:174
+#, elixir-autogen, elixir-format
msgctxt "confirmation email subject"
msgid "%{instance_name} account confirmation"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:310
+#, elixir-autogen, elixir-format
msgctxt "digest email subject"
msgid "Your digest from %{instance_name}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:81
+#, elixir-autogen, elixir-format
msgctxt "password reset email body"
msgid "Reset your password at %{instance_name}
\nSomeone has requested password change for your account at %{instance_name}.
\nIf it was you, visit the following link to proceed: reset password.
\nIf it was someone else, nothing to worry about: your data is secure and your password has not been changed.
\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:98
+#, elixir-autogen, elixir-format
msgctxt "password reset email subject"
msgid "Password reset"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:215
+#, elixir-autogen, elixir-format
msgctxt "successful registration email body"
msgid "Hello @%{nickname},
\nYour account at %{instance_name} has been registered successfully.
\nNo further action is required to activate your account.
\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:231
+#, elixir-autogen, elixir-format
msgctxt "successful registration email subject"
msgid "Account registered on %{instance_name}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:119
+#, elixir-autogen, elixir-format
msgctxt "user invitation email body"
msgid "You are invited to %{instance_name}
\n%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.
\nClick the following link to register: accept invitation.
\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:136
+#, elixir-autogen, elixir-format
msgctxt "user invitation email subject"
msgid "Invitation to %{instance_name}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:53
+#, elixir-autogen, elixir-format
msgctxt "welcome email html body"
msgid "Welcome to %{instance_name}!"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:41
+#, elixir-autogen, elixir-format
msgctxt "welcome email subject"
msgid "Welcome to %{instance_name}!"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:65
+#, elixir-autogen, elixir-format
msgctxt "welcome email text body"
msgid "Welcome to %{instance_name}!"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:368
+#, elixir-autogen, elixir-format
msgctxt "account archive email body - admin requested"
msgid "Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:
\n%{download_url}
\n"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:123
+#, elixir-autogen, elixir-format
msgctxt "remote follow error message - unknown error"
msgid "Something went wrong."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:67
+#, elixir-autogen, elixir-format
msgctxt "remote follow error message - user not found"
msgid "Could not find user"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:8
+#, elixir-autogen, elixir-format
msgctxt "status interact authorization button"
msgid "Interact"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:2
+#, elixir-autogen, elixir-format
msgctxt "status interact error"
msgid "Error: %{error}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:95
+#, elixir-autogen, elixir-format
msgctxt "status interact error message - status not found"
msgid "Could not find status"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:144
+#, elixir-autogen, elixir-format
msgctxt "status interact error message - unknown error"
msgid "Something went wrong."
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "status interact header"
msgid "Interacting with %{nickname}'s %{status_link}"
msgstr ""
-#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:4
+#, elixir-autogen, elixir-format
msgctxt "status interact header - status link text"
msgid "status"
msgstr ""
From dd9f8150fce34cc9a30a92a7e3de9560d5146871 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Thu, 22 Jun 2023 21:24:58 +0200
Subject: [PATCH 064/199] Merge Revert "Merge branch 'validate-host' into
'develop'"
This reverts commit d998a114e26033e98e87778e5ca659aff91831bf, reversing
changes made to da6b4003acad84b0f60ad8da6d08cfe13564b058.
---
changelog.d/3896.add | 1 -
changelog.d/3909.skip | 0
lib/pleroma/web/plugs/uploaded_media.ex | 22 +---------------
.../web/plugs/uploaded_media_plug_test.exs | 26 -------------------
4 files changed, 1 insertion(+), 48 deletions(-)
delete mode 100644 changelog.d/3896.add
create mode 100644 changelog.d/3909.skip
diff --git a/changelog.d/3896.add b/changelog.d/3896.add
deleted file mode 100644
index e8fde4c8a..000000000
--- a/changelog.d/3896.add
+++ /dev/null
@@ -1 +0,0 @@
-Validate Host header for Uploads and return a 302 if the base_url has changed
diff --git a/changelog.d/3909.skip b/changelog.d/3909.skip
new file mode 100644
index 000000000..e69de29bb
diff --git a/lib/pleroma/web/plugs/uploaded_media.ex b/lib/pleroma/web/plugs/uploaded_media.ex
index 9dd5eb239..8b3bc9acb 100644
--- a/lib/pleroma/web/plugs/uploaded_media.ex
+++ b/lib/pleroma/web/plugs/uploaded_media.ex
@@ -46,32 +46,12 @@ defmodule Pleroma.Web.Plugs.UploadedMedia do
config = Pleroma.Config.get(Pleroma.Upload)
- %{scheme: media_scheme, host: media_host, port: media_port} =
- Pleroma.Upload.base_url() |> URI.parse()
-
- with {:valid_host, true} <- {:valid_host, match?(^media_host, conn.host)},
- uploader <- Keyword.fetch!(config, :uploader),
+ with uploader <- Keyword.fetch!(config, :uploader),
proxy_remote = Keyword.get(config, :proxy_remote, false),
{:ok, get_method} <- uploader.get_file(file),
false <- media_is_banned(conn, get_method) do
get_media(conn, get_method, proxy_remote, opts)
else
- {:valid_host, false} ->
- redirect_url =
- %URI{
- scheme: media_scheme,
- host: media_host,
- port: media_port,
- path: conn.request_path,
- query: conn.query_string
- }
- |> URI.to_string()
- |> String.trim_trailing("?")
-
- conn
- |> Phoenix.Controller.redirect(external: redirect_url)
- |> halt()
-
_ ->
conn
|> send_resp(:internal_server_error, dgettext("errors", "Failed"))
diff --git a/test/pleroma/web/plugs/uploaded_media_plug_test.exs b/test/pleroma/web/plugs/uploaded_media_plug_test.exs
index dbf8ca5ec..8323ff6ab 100644
--- a/test/pleroma/web/plugs/uploaded_media_plug_test.exs
+++ b/test/pleroma/web/plugs/uploaded_media_plug_test.exs
@@ -40,30 +40,4 @@ defmodule Pleroma.Web.Plugs.UploadedMediaPlugTest do
&(&1 == {"content-disposition", ~s[inline; filename="\\"cofe\\".gif"]})
)
end
-
- test "denies access to media if wrong Host", %{
- attachment_url: attachment_url
- } do
- conn = get(build_conn(), attachment_url)
-
- assert conn.status == 200
-
- new_media_base = "http://media.localhost:8080"
-
- %{scheme: new_media_scheme, host: new_media_host, port: new_media_port} =
- URI.parse(new_media_base)
-
- clear_config([Pleroma.Upload, :base_url], new_media_base)
-
- conn = get(build_conn(), attachment_url)
-
- expected_url =
- URI.parse(attachment_url)
- |> Map.put(:host, new_media_host)
- |> Map.put(:port, new_media_port)
- |> Map.put(:scheme, new_media_scheme)
- |> URI.to_string()
-
- assert redirected_to(conn, 302) == expected_url
- end
end
From 8bc51288be21f3b04d74504dc0c7d5a7ac6aa0e3 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 27 Jun 2023 00:06:58 +0200
Subject: [PATCH 065/199] release_runtime_provider_test: Explicitely use
non-existant config file
---
changelog.d/testfix-system-config-use.skip | 0
test/pleroma/config/release_runtime_provider_test.exs | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 changelog.d/testfix-system-config-use.skip
diff --git a/changelog.d/testfix-system-config-use.skip b/changelog.d/testfix-system-config-use.skip
new file mode 100644
index 000000000..e69de29bb
diff --git a/test/pleroma/config/release_runtime_provider_test.exs b/test/pleroma/config/release_runtime_provider_test.exs
index 4e0d4c838..e6d10b13e 100644
--- a/test/pleroma/config/release_runtime_provider_test.exs
+++ b/test/pleroma/config/release_runtime_provider_test.exs
@@ -10,7 +10,7 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
describe "load/2" do
test "loads release defaults config and warns about non-existent runtime config" do
ExUnit.CaptureIO.capture_io(fn ->
- merged = ReleaseRuntimeProvider.load([], [])
+ merged = ReleaseRuntimeProvider.load([], config_path: "/var/empty/config.exs")
assert merged == Pleroma.Config.Holder.release_defaults()
end) =~
"!!! Config path is not declared! Please ensure it exists and that PLEROMA_CONFIG_PATH is unset or points to an existing file"
From aa4c4ab2a0fd2e3ed3abd7ea455463f3f65a5083 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 27 Jun 2023 00:23:21 +0200
Subject: [PATCH 066/199] mix: 2023-06 deps update
this fixes compatibility with Erlang OTP 26
Related: https://git.pleroma.social/pleroma/pleroma/-/issues/2913
---
changelog.d/2023-06-deps-update.skip | 0
mix.exs | 3 ++-
mix.lock | 38 ++++++++++++++--------------
3 files changed, 21 insertions(+), 20 deletions(-)
create mode 100644 changelog.d/2023-06-deps-update.skip
diff --git a/changelog.d/2023-06-deps-update.skip b/changelog.d/2023-06-deps-update.skip
new file mode 100644
index 000000000..e69de29bb
diff --git a/mix.exs b/mix.exs
index 62ac1c1a0..fa72a85a9 100644
--- a/mix.exs
+++ b/mix.exs
@@ -150,7 +150,8 @@ defmodule Pleroma.Mixfile do
{:bbcode_pleroma, "~> 0.2.0"},
{:cors_plug, "~> 2.0"},
{:web_push_encryption, "~> 0.3.1"},
- {:swoosh, "~> 1.0"},
+ # swoosh 1.11.2+ requires Elixir 1.12+
+ {:swoosh, "~> 1.10.0"},
{:phoenix_swoosh, "~> 1.1"},
{:gen_smtp, "~> 0.13"},
{:ex_syslogger, "~> 1.4"},
diff --git a/mix.lock b/mix.lock
index b6938f44b..fc1266570 100644
--- a/mix.lock
+++ b/mix.lock
@@ -15,23 +15,23 @@
"concurrent_limiter": {:hex, :concurrent_limiter, "0.1.1", "43ae1dc23edda1ab03dd66febc739c4ff710d047bb4d735754909f9a474ae01c", [:mix], [{:telemetry, "~> 0.3", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "53968ff238c0fbb4d7ed76ddb1af0be6f3b2f77909f6796e249e737c505a16eb"},
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
"cors_plug": {:hex, :cors_plug, "2.0.3", "316f806d10316e6d10f09473f19052d20ba0a0ce2a1d910ddf57d663dac402ae", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ee4ae1418e6ce117fc42c2ba3e6cbdca4e95ecd2fe59a05ec6884ca16d469aea"},
- "covertool": {:hex, :covertool, "2.0.4", "54acff6cddd88d28dea663cd2e1fe20dd32fcf5f5d3aff7d59031ce44ce39efa", [:rebar3], [], "hexpm", "5c9568ba4308fda2082172737c80c31d991ea83961eb10791f06106a870d0cdc"},
- "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
+ "covertool": {:hex, :covertool, "2.0.6", "4a291b4e3449025b0595d8f44c8d7635d4f48f033be2ce88d22a329f36f94a91", [:rebar3], [], "hexpm", "5db3fcd82180d8ea4ad857d4d1ab21a8d31b5aee0d60d2f6c0f9e25a411d1e21"},
+ "cowboy": {:hex, :cowboy, "2.10.0", "ff9ffeff91dae4ae270dd975642997afe2a1179d94b1887863e43f681a203e26", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "3afdccb7183cc6f143cb14d3cf51fa00e53db9ec80cdcd525482f5e99bc41d6b"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"},
"cowlib": {:hex, :cowlib, "2.12.1", "a9fa9a625f1d2025fe6b462cb865881329b5caff8f1854d1cbc9f9533f00e1e1", [:make, :rebar3], [], "hexpm", "163b73f6367a7341b33c794c4e88e7dbfe6498ac42dcd69ef44c5bc5507c8db0"},
"credo": {:hex, :credo, "1.7.0", "6119bee47272e85995598ee04f2ebbed3e947678dee048d10b5feca139435f75", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "6839fcf63d1f0d1c0f450abc8564a57c43d644077ab96f2934563e68b8a769d7"},
"crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"},
"custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"},
- "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"},
- "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
+ "db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"},
+ "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
"deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
"earmark": {:hex, :earmark, "1.4.22", "ea3e45c6359446dc308be0a64ce82a03260d973de7d0625a762e6d352ff57958", [:mix], [{:earmark_parser, "~> 1.4.23", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "1caf5145665a42fd76d5317286b0c171861fb1c04f86ab103dde76868814fdfb"},
- "earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"},
+ "earmark_parser": {:hex, :earmark_parser, "1.4.32", "fa739a0ecfa34493de19426681b23f6814573faee95dfd4b4aafe15a7b5b32c6", [:mix], [], "hexpm", "b8b0dd77d60373e77a3d7e8afa598f325e49e8663a51bcc2b88ef41838cca755"},
"eblurhash": {:hex, :eblurhash, "1.2.2", "7da4255aaea984b31bb71155f673257353b0e0554d0d30dcf859547e74602582", [:rebar3], [], "hexpm", "8c20ca00904de023a835a9dcb7b7762fed32264c85a80c3cafa85288e405044c"},
- "ecto": {:hex, :ecto, "3.9.5", "9f0aa7ae44a1577b651c98791c6988cd1b69b21bc724e3fd67090b97f7604263", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d4f3115d8cbacdc0bfa4b742865459fb1371d0715515842a1fb17fe31920b74c"},
+ "ecto": {:hex, :ecto, "3.10.2", "6b887160281a61aa16843e47735b8a266caa437f80588c3ab80a8a960e6abe37", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6a895778f0d7648a4b34b486af59a1c8009041fbdf2b17f1ac215eb829c60235"},
"ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"},
- "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.10", "e14d400930f401ca9f541b3349212634e44027d7f919bbb71224d7ac0d0e8acd", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "505e8cd81e4f17c090be0f99e92b1b3f0fd915f98e76965130b8ccfb891e7088"},
- "ecto_sql": {:hex, :ecto_sql, "3.9.2", "34227501abe92dba10d9c3495ab6770e75e79b836d114c41108a4bf2ce200ad5", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1eb5eeb4358fdbcd42eac11c1fbd87e3affd7904e639d77903c1358b2abd3f70"},
+ "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.7.11", "6e20144c1446dcccfcdb4c142c9d8b7992a90a569b1d5958cbea5458550b25f0", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15.7 or ~> 0.16.0 or ~> 0.17.0", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "def61f1f92d4f40d51c80bbae2157212d6c0a459eb604be446e47369cbd40b23"},
+ "ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.5 or ~> 2.4.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"},
"eimp": {:hex, :eimp, "1.0.14", "fc297f0c7e2700457a95a60c7010a5f1dcb768a083b6d53f49cd94ab95a28f22", [:rebar3], [{:p1_utils, "1.0.18", [hex: :p1_utils, repo: "hexpm", optional: false]}], "hexpm", "501133f3112079b92d9e22da8b88bf4f0e13d4d67ae9c15c42c30bd25ceb83b6"},
"elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
"esbuild": {:hex, :esbuild, "0.5.0", "d5bb08ff049d7880ee3609ed5c4b864bd2f46445ea40b16b4acead724fb4c4a3", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "f183a0b332d963c4cfaf585477695ea59eef9a6f2204fdd0efa00e099694ffe5"},
@@ -48,10 +48,10 @@
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"finch": {:hex, :finch, "0.10.2", "9ad27d68270d879f73f26604bb2e573d40f29bf0e907064a9a337f90a16a0312", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dd8b11b282072cec2ef30852283949c248bd5d2820c88d8acc89402b81db7550"},
"flake_id": {:hex, :flake_id, "0.1.0", "7716b086d2e405d09b647121a166498a0d93d1a623bead243e1f74216079ccb3", [:mix], [{:base62, "~> 1.2", [hex: :base62, repo: "hexpm", optional: false]}, {:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "31fc8090fde1acd267c07c36ea7365b8604055f897d3a53dd967658c691bd827"},
- "floki": {:hex, :floki, "0.34.2", "5fad07ef153b3b8ec110b6b155ec3780c4b2c4906297d0b4be1a7162d04a7e02", [:mix], [], "hexpm", "26b9d50f0f01796bc6be611ca815c5e0de034d2128e39cc9702eee6b66a4d1c8"},
+ "floki": {:hex, :floki, "0.34.3", "5e2dcaec5d7c228ce5b1d3501502e308b2d79eb655e4191751a1fe491c37feac", [:mix], [], "hexpm", "9577440eea5b97924b4bf3c7ea55f7b8b6dce589f9b28b096cc294a8dc342341"},
"gen_smtp": {:hex, :gen_smtp, "0.15.0", "9f51960c17769b26833b50df0b96123605a8024738b62db747fece14eb2fbfcc", [:rebar3], [], "hexpm", "29bd14a88030980849c7ed2447b8db6d6c9278a28b11a44cafe41b791205440f"},
"gettext": {:hex, :gettext, "0.22.2", "6bfca374de34ecc913a28ba391ca184d88d77810a3e427afa8454a71a51341ac", [:mix], [{:expo, "~> 0.4.0", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "8a2d389673aea82d7eae387e6a2ccc12660610080ae7beb19452cfdc1ec30f60"},
- "gun": {:hex, :gun, "2.0.0", "2326bc0fd6d9cf628419708270d6fe8b02b8d002cf992e4165a77d997b1defd0", [:make, :rebar3], [{:cowlib, "2.12.0", [hex: :cowlib, repo: "hexpm", optional: false]}], "hexpm", "6613cb7c62930dc8d58263c44dda72f8556346ba88358fc929dcbc5f76d04569"},
+ "gun": {:hex, :gun, "2.0.1", "160a9a5394800fcba41bc7e6d421295cf9a7894c2252c0678244948e3336ad73", [:make, :rebar3], [{:cowlib, "2.12.1", [hex: :cowlib, repo: "hexpm", optional: false]}], "hexpm", "a10bc8d6096b9502205022334f719cc9a08d9adcfbfc0dbee9ef31b56274a20b"},
"hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~>2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"},
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
@@ -67,31 +67,31 @@
"majic": {:hex, :majic, "1.0.0", "37e50648db5f5c2ff0c9fb46454d034d11596c03683807b9fb3850676ffdaab3", [:make, :mix], [{:elixir_make, "~> 0.6.1", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "7905858f76650d49695f14ea55cd9aaaee0c6654fa391671d4cf305c275a0a9e"},
"makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"},
"makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"},
- "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"},
+ "makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"},
"meck": {:hex, :meck, "0.9.2", "85ccbab053f1db86c7ca240e9fc718170ee5bda03810a6292b5306bf31bae5f5", [:rebar3], [], "hexpm", "81344f561357dc40a8344afa53767c32669153355b626ea9fcbc8da6b3045826"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
"mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
"mint": {:hex, :mint, "1.5.1", "8db5239e56738552d85af398798c80648db0e90f343c8469f6c6d8898944fb6f", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "4a63e1e76a7c3956abd2c72f370a0d0aecddc3976dea5c27eccbecfa5e7d5b1e"},
"mochiweb": {:hex, :mochiweb, "2.18.0", "eb55f1db3e6e960fac4e6db4e2db9ec3602cc9f30b86cd1481d56545c3145d2e", [:rebar3], [], "hexpm"},
- "mock": {:hex, :mock, "0.3.7", "75b3bbf1466d7e486ea2052a73c6e062c6256fb429d6797999ab02fa32f29e03", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "4da49a4609e41fd99b7836945c26f373623ea968cfb6282742bcb94440cf7e5c"},
- "mogrify": {:hex, :mogrify, "0.9.2", "b360984adea7dd6a55f18028e6327973c58de7f548fdb86c9859848aa904d5b0", [:mix], [], "hexpm", "c18d10fd70ca20e2585301616c89f6e4f7159d92efc9cc8ee579e00c886f699d"},
+ "mock": {:hex, :mock, "0.3.8", "7046a306b71db2488ef54395eeb74df0a7f335a7caca4a3d3875d1fc81c884dd", [:mix], [{:meck, "~> 0.9.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "7fa82364c97617d79bb7d15571193fc0c4fe5afd0c932cef09426b3ee6fe2022"},
+ "mogrify": {:hex, :mogrify, "0.9.3", "238c782f00271dace01369ad35ae2e9dd020feee3443b9299ea5ea6bed559841", [:mix], [], "hexpm", "0189b1e1de27455f2b9ae8cf88239cefd23d38de9276eb5add7159aea51731e6"},
"mox": {:hex, :mox, "1.0.2", "dc2057289ac478b35760ba74165b4b3f402f68803dd5aecd3bfd19c183815d64", [:mix], [], "hexpm", "f9864921b3aaf763c8741b5b8e6f908f44566f1e427b2630e89e9a73b981fef2"},
"nimble_options": {:hex, :nimble_options, "0.4.0", "c89babbab52221a24b8d1ff9e7d838be70f0d871be823165c94dd3418eea728f", [:mix], [], "hexpm", "e6701c1af326a11eea9634a3b1c62b475339ace9456c1a23ec3bc9a847bca02d"},
"nimble_parsec": {:hex, :nimble_parsec, "0.6.0", "32111b3bf39137144abd7ba1cce0914533b2d16ef35e8abc5ec8be6122944263", [:mix], [], "hexpm", "27eac315a94909d4dc68bc07a4a83e06c8379237c5ea528a9acff4ca1c873c52"},
"nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
"nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]},
"oban": {:hex, :oban, "2.13.6", "a0cb1bce3bd393770512231fb5a3695fa19fd3af10d7575bf73f837aee7abf43", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c1c5eb16f377b3cbbf2ea14be24d20e3d91285af9d1ac86260b7c2af5464887"},
- "open_api_spex": {:hex, :open_api_spex, "3.16.1", "8137c338129d63060b4b04947c6c57429f86267045c479c703a38a6d3f98dee1", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:ymlr, "~> 2.0 or ~> 3.0", [hex: :ymlr, repo: "hexpm", optional: true]}], "hexpm", "ef6fd778ac121af866b48b75ad4ad256b6ff33949113ea4aa1629af8bfdfdbfb"},
+ "open_api_spex": {:hex, :open_api_spex, "3.17.3", "ada8e352eb786050dd639db2439d3316e92f3798eb2abd051f55bb9af825b37e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:ymlr, "~> 2.0 or ~> 3.0", [hex: :ymlr, repo: "hexpm", optional: true]}], "hexpm", "165db21a85ca83cffc8e7c8890f35b354eddda8255de7404a2848ed652b9f0fe"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
"pbkdf2_elixir": {:hex, :pbkdf2_elixir, "1.2.1", "9cbe354b58121075bd20eb83076900a3832324b7dd171a6895fab57b6bb2752c", [:mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}], "hexpm", "d3b40a4a4630f0b442f19eca891fcfeeee4c40871936fed2f68e1c4faa30481f"},
"phoenix": {:hex, :phoenix, "1.6.16", "e5bdd18c7a06da5852a25c7befb72246de4ddc289182285f8685a40b7b5f5451", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e15989ff34f670a96b95ef6d1d25bad0d9c50df5df40b671d8f4a669e050ac39"},
- "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
+ "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.2", "b21bd01fdeffcfe2fab49e4942aa938b6d3e89e93a480d4aee58085560a0bc0d", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "70242edd4601d50b69273b057ecf7b684644c19ee750989fd555625ae4ce8f5d"},
"phoenix_html": {:hex, :phoenix_html, "3.3.1", "4788757e804a30baac6b3fc9695bf5562465dd3f1da8eb8460ad5b404d9a2178", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "bed1906edd4906a15fd7b412b85b05e521e1f67c9a85418c55999277e553d0d3"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.6.5", "1495bb014be12c9a9252eca04b9af54246f6b5c1e4cd1f30210cd00ec540cf8e", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.3", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.17.7", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "ef4fa50dd78364409039c99cf6f98ab5209b4c5f8796c17f4db118324f0db852"},
"phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.3", "3a53772a6118d5679bf50fc1670505a290e32a1d195df9e069d8c53ab040c054", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "766796676e5f558dbae5d1bdb066849673e956005e3730dfd5affd7a6da4abac"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.17.14", "5ec615d4d61bf9d4755f158bd6c80372b715533fe6d6219e12d74fb5eedbeac1", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.0 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "afeb6ba43ce329a6f7fc1c9acdfc6d3039995345f025febb7f409a92f6faebd3"},
- "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
+ "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"},
"phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"},
"phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
@@ -101,7 +101,7 @@
"plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"},
"poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"},
- "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"},
+ "postgrex": {:hex, :postgrex, "0.17.1", "01c29fd1205940ee55f7addb8f1dc25618ca63a8817e56fac4f6846fc2cddcbe", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "14b057b488e73be2beee508fb1955d8db90d6485c6466428fe9ccf1d6692a555"},
"pot": {:hex, :pot, "1.0.2", "13abb849139fdc04ab8154986abbcb63bdee5de6ed2ba7e1713527e33df923dd", [:rebar3], [], "hexpm", "78fe127f5a4f5f919d6ea5a2a671827bd53eb9d37e5b4128c0ad3df99856c2e0"},
"prom_ex": {:hex, :prom_ex, "1.7.1", "39331ee3fe6f9a8587d8208bf9274a253bb80281700e127dd18786cda5e08c37", [:mix], [{:absinthe, ">= 1.6.0", [hex: :absinthe, repo: "hexpm", optional: true]}, {:broadway, ">= 1.0.2", [hex: :broadway, repo: "hexpm", optional: true]}, {:ecto, ">= 3.5.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:finch, "~> 0.10.2", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}, {:oban, ">= 2.4.0", [hex: :oban, repo: "hexpm", optional: true]}, {:phoenix, ">= 1.5.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, ">= 0.14.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, ">= 1.12.1", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.5.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.1", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0.2", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}, {:telemetry_poller, "~> 1.0.0", [hex: :telemetry_poller, repo: "hexpm", optional: false]}], "hexpm", "4c978872b88a929833925a0f4d0561824804c671fdd04581e765509ed0a6ed08"},
"prometheus": {:hex, :prometheus, "4.10.0", "792adbf0130ff61b5fa8826f013772af24b6e57b984445c8d602c8a0355704a1", [:mix, :rebar3], [{:quantile_estimator, "~> 0.2.1", [hex: :quantile_estimator, repo: "hexpm", optional: false]}], "hexpm", "2a99bb6dce85e238c7236fde6b0064f9834dc420ddbd962aac4ea2a3c3d59384"},
@@ -115,10 +115,10 @@
"recon": {:hex, :recon, "2.5.3", "739107b9050ea683c30e96de050bc59248fd27ec147696f79a8797ff9fa17153", [:mix, :rebar3], [], "hexpm", "6c6683f46fd4a1dfd98404b9f78dcabc7fcd8826613a89dcb984727a8c3099d7"},
"remote_ip": {:git, "https://git.pleroma.social/pleroma/remote_ip.git", "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8", [ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"]},
"sleeplocks": {:hex, :sleeplocks, "1.1.2", "d45aa1c5513da48c888715e3381211c859af34bee9b8290490e10c90bb6ff0ca", [:rebar3], [], "hexpm", "9fe5d048c5b781d6305c1a3a0f40bb3dfc06f49bf40571f3d2d0c57eaa7f59a5"},
- "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
+ "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"},
"statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"},
"sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"},
- "swoosh": {:hex, :swoosh, "1.9.1", "0a5d7bf9954eb41d7e55525bc0940379982b090abbaef67cd8e1fd2ed7f8ca1a", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "76dffff3ffcab80f249d5937a592eaef7cc49ac6f4cdd27e622868326ed6371e"},
+ "swoosh": {:hex, :swoosh, "1.10.3", "32f1531ee3fe4e82da8175c597bf3692938f8152eb981e0cbf57107b6c5924c1", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "8b7167d93047bac6e1a1c367bf7d899cf2e4fea0592ee04a70673548ef6091b9"},
"syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"},
"table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"},
"telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"},
From 9e69adf76fcd8c13581dcd1abc68520f3f0e25d8 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 27 Jun 2023 01:52:40 +0200
Subject: [PATCH 067/199] mix: Remove override on plug
---
mix.exs | 3 ---
mix.lock | 2 +-
2 files changed, 1 insertion(+), 4 deletions(-)
diff --git a/mix.exs b/mix.exs
index fa72a85a9..fc4e87ee3 100644
--- a/mix.exs
+++ b/mix.exs
@@ -194,9 +194,6 @@ defmodule Pleroma.Mixfile do
{:open_api_spex, "~> 3.16"},
{:ecto_psql_extras, "~> 0.6"},
- # indirect dependency version override
- {:plug, "~> 1.10.4", override: true},
-
## dev & test
{:ex_doc, "~> 0.22", only: :dev, runtime: false},
{:ex_machina, "~> 2.4", only: :test},
diff --git a/mix.lock b/mix.lock
index fc1266570..da187ac5c 100644
--- a/mix.lock
+++ b/mix.lock
@@ -95,7 +95,7 @@
"phoenix_swoosh": {:hex, :phoenix_swoosh, "1.2.0", "a544d83fde4a767efb78f45404a74c9e37b2a9c5ea3339692e65a6966731f935", [:mix], [{:finch, "~> 0.8", [hex: :finch, repo: "hexpm", optional: true]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.5", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "e88d117251e89a16b92222415a6d87b99a96747ddf674fc5c7631de734811dba"},
"phoenix_template": {:hex, :phoenix_template, "1.0.1", "85f79e3ad1b0180abb43f9725973e3b8c2c3354a87245f91431eec60553ed3ef", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "157dc078f6226334c91cb32c1865bf3911686f8bcd6bcff86736f6253e6993ee"},
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
- "plug": {:hex, :plug, "1.10.4", "41eba7d1a2d671faaf531fa867645bd5a3dce0957d8e2a3f398ccff7d2ef017f", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad1e233fe73d2eec56616568d260777b67f53148a999dc2d048f4eb9778fe4a0"},
+ "plug": {:hex, :plug, "1.14.2", "cff7d4ec45b4ae176a227acd94a7ab536d9b37b942c8e8fa6dfc0fff98ff4d80", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "842fc50187e13cf4ac3b253d47d9474ed6c296a8732752835ce4a86acdf68d13"},
"plug_cowboy": {:hex, :plug_cowboy, "2.6.1", "9a3bbfceeb65eff5f39dab529e5cd79137ac36e913c02067dba3963a26efe9b2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "de36e1a21f451a18b790f37765db198075c25875c64834bcc82d90b309eb6613"},
"plug_crypto": {:hex, :plug_crypto, "1.2.5", "918772575e48e81e455818229bf719d4ab4181fcbf7f85b68a35620f78d89ced", [:mix], [], "hexpm", "26549a1d6345e2172eb1c233866756ae44a9609bd33ee6f99147ab3fd87fd842"},
"plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"},
From 3a67b8f28728d3071c9a64d9b8c07ab91919676f Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 27 Jun 2023 02:08:49 +0200
Subject: [PATCH 068/199] endpoint: Use custom Multipart module for dynamic
configuration
---
lib/pleroma/web/endpoint.ex | 7 ++-----
lib/pleroma/web/multipart.ex | 22 ++++++++++++++++++++++
2 files changed, 24 insertions(+), 5 deletions(-)
create mode 100644 lib/pleroma/web/multipart.ex
diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex
index d8d40cceb..574f3ab63 100644
--- a/lib/pleroma/web/endpoint.ex
+++ b/lib/pleroma/web/endpoint.ex
@@ -101,13 +101,10 @@ defmodule Pleroma.Web.Endpoint do
plug(Plug.Logger, log: :debug)
plug(Plug.Parsers,
- parsers: [
- :urlencoded,
- {:multipart, length: {Config, :get, [[:instance, :upload_limit]]}},
- :json
- ],
+ parsers: [:urlencoded, Pleroma.Web.Multipart, :json],
pass: ["*/*"],
json_decoder: Jason,
+ # Note: this is compile-time only, won't work for database-config
length: Config.get([:instance, :upload_limit]),
body_reader: {Pleroma.Web.Plugs.DigestPlug, :read_body, []}
)
diff --git a/lib/pleroma/web/multipart.ex b/lib/pleroma/web/multipart.ex
new file mode 100644
index 000000000..e24bb14c2
--- /dev/null
+++ b/lib/pleroma/web/multipart.ex
@@ -0,0 +1,22 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2023 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+#
+defmodule Pleroma.Web.Multipart do
+ @multipart Plug.Parsers.MULTIPART
+
+ def init(opts) do
+ opts
+ end
+
+ def parse(conn, "multipart", subtype, headers, opts) do
+ length = Pleroma.Config.get([:instance, :upload_limit])
+ opts = @multipart.init([length: length] ++ opts)
+ @multipart.parse(conn, "multipart", subtype, headers, opts)
+ end
+
+ def parse(conn, _type, _subtype, _headers, _opts) do
+ {:next, conn}
+ end
+end
From d7e049d5e833cebb0a67c771943d33c532f8923a Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 27 Jun 2023 02:48:50 +0200
Subject: [PATCH 069/199] router: Fix usage of globs
warning: doing a prefix match with globs is deprecated, invalid segment "pleroma*path".
You can either replace by a single segment match:
/foo/bar-:var
Or by mixing single segment match with globs:
/foo/bar-:var/*rest
---
lib/pleroma/web/router.ex | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index c1a690e28..6b9e158a3 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -996,8 +996,8 @@ defmodule Pleroma.Web.Router do
scope "/", Pleroma.Web.Fallback do
get("/registration/:token", RedirectController, :registration_page)
get("/:maybe_nickname_or_id", RedirectController, :redirector_with_meta)
- match(:*, "/api/pleroma*path", LegacyPleromaApiRerouterPlug, [])
- get("/api*path", RedirectController, :api_not_implemented)
+ match(:*, "/api/pleroma/*path", LegacyPleromaApiRerouterPlug, [])
+ get("/api/*path", RedirectController, :api_not_implemented)
get("/*path", RedirectController, :redirector_with_preload)
options("/*path", RedirectController, :empty)
From bf2b4b9400a44bfec02db9210a4ebc6d2d0f8553 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 27 Jun 2023 21:08:47 +0200
Subject: [PATCH 070/199] README.md: Update packaging state (GURU, AUR)
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 62f8fdc64..2837b6ef8 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,8 @@ If your platform is not supported, or you just want to be able to edit the sourc
- [OpenBSD (fi)](https://docs-develop.pleroma.social/backend/installation/openbsd_fi/)
### OS/Distro packages
-Currently Pleroma is packaged for [YunoHost](https://yunohost.org) and [NixOS](https://nixos.org). If you want to package Pleroma for any OS/Distros, we can guide you through the process on our [community channels](#community-channels). If you want to change default options in your Pleroma package, please **discuss it with us first**.
+Currently Pleroma is packaged for [YunoHost](https://yunohost.org), [NixOS](https://nixos.org), [Gentoo through GURU](https://gentoo.org/) and [Archlinux through AUR](https://aur.archlinux.org/packages/pleroma). You may find more at .
+If you want to package Pleroma for any OS/Distros, we can guide you through the process on our [community channels](#community-channels). If you want to change default options in your Pleroma package, please **discuss it with us first**.
### Docker
While we don’t provide docker files, other people have written very good ones. Take a look at or .
From 63b9f767824b47d52e615d14353d5b9a7e71929a Mon Sep 17 00:00:00 2001
From: tusooa
Date: Sat, 1 Jul 2023 23:25:04 -0400
Subject: [PATCH 071/199] Force the use of amd64 runners for jobs using ci-base
---
.gitlab-ci.yml | 28 +++++++++++++++++++++++-----
changelog.d/amd64-runner.skip | 0
2 files changed, 23 insertions(+), 5 deletions(-)
create mode 100644 changelog.d/amd64-runner.skip
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8daa9f434..148cbe405 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -65,13 +65,21 @@ check-changelog:
- "**/*.exs"
- "mix.lock"
+.using-ci-base:
+ tags:
+ - amd64
+
build:
- extends: .build_changes_policy
+ extends:
+ - .build_changes_policy
+ - .using-ci-base
stage: build
script:
- mix compile --force
spec-build:
+ extends:
+ - .using-ci-base
stage: test
rules:
- changes:
@@ -85,6 +93,8 @@ spec-build:
- mix pleroma.openapi_spec spec.json
benchmark:
+ extends:
+ - .using-ci-base
stage: benchmark
when: manual
variables:
@@ -99,7 +109,9 @@ benchmark:
- mix pleroma.load_testing
unit-testing:
- extends: .build_changes_policy
+ extends:
+ - .build_changes_policy
+ - .using-ci-base
stage: test
cache: &testing_cache_policy
<<: *global_cache_policy
@@ -121,7 +133,9 @@ unit-testing:
path: coverage.xml
unit-testing-erratic:
- extends: .build_changes_policy
+ extends:
+ - .build_changes_policy
+ - .using-ci-base
stage: test
retry: 2
allow_failure: true
@@ -155,7 +169,9 @@ unit-testing-erratic:
# - mix test --trace --only federated
unit-testing-rum:
- extends: .build_changes_policy
+ extends:
+ - .build_changes_policy
+ - .using-ci-base
stage: test
cache: *testing_cache_policy
services:
@@ -186,7 +202,9 @@ lint:
- mix format --check-formatted
analysis:
- extends: .build_changes_policy
+ extends:
+ - .build_changes_policy
+ - .using-ci-base
stage: test
cache: *testing_cache_policy
script:
diff --git a/changelog.d/amd64-runner.skip b/changelog.d/amd64-runner.skip
new file mode 100644
index 000000000..e69de29bb
From a1621839cc31a92e346cbd6065c4db6a8ebeb5a9 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Sun, 2 Jul 2023 11:03:09 -0400
Subject: [PATCH 072/199] Fix user fetch completely broken if featured
collection is not in a supported form
---
.../featured-collection-shouldnt-break-user-fetch.fix | 1 +
lib/pleroma/web/activity_pub/activity_pub.ex | 5 +++++
test/pleroma/web/activity_pub/activity_pub_test.exs | 8 ++++++++
3 files changed, 14 insertions(+)
create mode 100644 changelog.d/featured-collection-shouldnt-break-user-fetch.fix
diff --git a/changelog.d/featured-collection-shouldnt-break-user-fetch.fix b/changelog.d/featured-collection-shouldnt-break-user-fetch.fix
new file mode 100644
index 000000000..e8ce288cc
--- /dev/null
+++ b/changelog.d/featured-collection-shouldnt-break-user-fetch.fix
@@ -0,0 +1 @@
+Fix user fetch completely broken if featured collection is not in a supported form
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 1a10aef1d..c93288b79 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -1720,6 +1720,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
end)
end
+ def pin_data_from_featured_collection(obj) do
+ Logger.error("Could not parse featured collection #{inspect(obj)}")
+ %{}
+ end
+
def fetch_and_prepare_featured_from_ap_id(nil) do
{:ok, %{}}
end
diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs
index 54fc6ef0a..1e8c14043 100644
--- a/test/pleroma/web/activity_pub/activity_pub_test.exs
+++ b/test/pleroma/web/activity_pub/activity_pub_test.exs
@@ -2652,4 +2652,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
{:ok, user} = ActivityPub.make_user_from_ap_id("https://princess.cat/users/mewmew")
assert user.name == " "
end
+
+ test "pin_data_from_featured_collection will ignore unsupported values" do
+ assert %{} ==
+ ActivityPub.pin_data_from_featured_collection(%{
+ "type" => "OrderedCollection",
+ "first" => "https://social.example/users/alice/collections/featured?page=true"
+ })
+ end
end
From 6e4de2383f17810a35a32ccdfea8e9de0183dab4 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Sun, 2 Jul 2023 11:15:34 -0400
Subject: [PATCH 073/199] Fix handling report from a deactivated user
---
.../handle-report-from-deactivated-user.fix | 1 +
lib/pleroma/web/common_api.ex | 2 +-
.../controllers/report_controller_test.exs | 21 +++++++++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 changelog.d/handle-report-from-deactivated-user.fix
diff --git a/changelog.d/handle-report-from-deactivated-user.fix b/changelog.d/handle-report-from-deactivated-user.fix
new file mode 100644
index 000000000..6692d1aa8
--- /dev/null
+++ b/changelog.d/handle-report-from-deactivated-user.fix
@@ -0,0 +1 @@
+Fix handling report from a deactivated user
diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex
index 65d08de49..77b3fa5d2 100644
--- a/lib/pleroma/web/common_api.ex
+++ b/lib/pleroma/web/common_api.ex
@@ -583,7 +583,7 @@ defmodule Pleroma.Web.CommonAPI do
end
def update_report_state(activity_id, state) do
- with %Activity{} = activity <- Activity.get_by_id(activity_id) do
+ with %Activity{} = activity <- Activity.get_by_id(activity_id, filter: []) do
Utils.update_report_state(activity, state)
else
nil -> {:error, :not_found}
diff --git a/test/pleroma/web/admin_api/controllers/report_controller_test.exs b/test/pleroma/web/admin_api/controllers/report_controller_test.exs
index c141cf69d..fb2579a3d 100644
--- a/test/pleroma/web/admin_api/controllers/report_controller_test.exs
+++ b/test/pleroma/web/admin_api/controllers/report_controller_test.exs
@@ -123,6 +123,7 @@ defmodule Pleroma.Web.AdminAPI.ReportControllerTest do
})
%{
+ reporter: reporter,
id: report_id,
second_report_id: second_report_id
}
@@ -266,6 +267,26 @@ defmodule Pleroma.Web.AdminAPI.ReportControllerTest do
assert ModerationLog.get_log_entry_message(second_log_entry) ==
"@#{admin.nickname} updated report ##{second_report_id} (on user @#{second_activity.user_actor.nickname}) with 'closed' state"
end
+
+ test "works if reporter is deactivated", %{
+ conn: conn,
+ id: id,
+ reporter: reporter
+ } do
+ Pleroma.User.set_activation(reporter, false)
+
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> patch("/api/pleroma/admin/reports", %{
+ "reports" => [
+ %{"state" => "resolved", "id" => id}
+ ]
+ })
+ |> json_response_and_validate_schema(:no_content)
+
+ activity = Activity.get_by_id_with_user_actor(id)
+ assert activity.data["state"] == "resolved"
+ end
end
describe "GET /api/pleroma/admin/reports" do
From 10249d1e42fd809ab75880c891f00ca1f3318f80 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 4 Jul 2023 03:03:41 +0200
Subject: [PATCH 074/199] CI: Let curl return non-0 on http failure code
Otherwise it silently fails
---
.gitlab-ci.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 148cbe405..81fd3d682 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -230,7 +230,7 @@ docs-deploy:
before_script:
- apk add curl
script:
- - curl -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
+ - curl --fail-with-body -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
review_app:
image: alpine:3.9
stage: deploy
@@ -271,7 +271,7 @@ spec-deploy:
before_script:
- apk add curl
script:
- - curl -X POST -F"token=$API_DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline
+ - curl --fail-with-body -X POST -F"token=$API_DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline
stop_review_app:
From 8c3363a5e778899fe137273c2d188ebd3b9224fb Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 4 Jul 2023 03:23:32 +0200
Subject: [PATCH 075/199] CI: Use CI_JOB_TOKEN for cross-repo pipeline triggers
---
.gitlab-ci.yml | 4 ++--
changelog.d/pipeline-triggers.skip | 0
2 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 changelog.d/pipeline-triggers.skip
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 81fd3d682..cd0561852 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -230,7 +230,7 @@ docs-deploy:
before_script:
- apk add curl
script:
- - curl --fail-with-body -X POST -F"token=$DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
+ - curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" https://git.pleroma.social/api/v4/projects/673/trigger/pipeline
review_app:
image: alpine:3.9
stage: deploy
@@ -271,7 +271,7 @@ spec-deploy:
before_script:
- apk add curl
script:
- - curl --fail-with-body -X POST -F"token=$API_DOCS_PIPELINE_TRIGGER" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline
+ - curl --fail-with-body -X POST -F"token=$CI_JOB_TOKEN" -F'ref=master' -F"variables[BRANCH]=$CI_COMMIT_REF_NAME" -F"variables[JOB_REF]=$CI_JOB_ID" https://git.pleroma.social/api/v4/projects/1130/trigger/pipeline
stop_review_app:
diff --git a/changelog.d/pipeline-triggers.skip b/changelog.d/pipeline-triggers.skip
new file mode 100644
index 000000000..e69de29bb
From 3d79ceb23a3dc9630d38807cf6e8a62a56f29d3b Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 4 Jul 2023 03:34:51 +0200
Subject: [PATCH 076/199] Deprecate audio scrobbling
---
changelog.d/deprecate-scrobbles.remove | 1 +
docs/development/API/pleroma_api.md | 6 ++++++
.../web/api_spec/operations/pleroma_scrobble_operation.ex | 2 ++
3 files changed, 9 insertions(+)
create mode 100644 changelog.d/deprecate-scrobbles.remove
diff --git a/changelog.d/deprecate-scrobbles.remove b/changelog.d/deprecate-scrobbles.remove
new file mode 100644
index 000000000..c453a9784
--- /dev/null
+++ b/changelog.d/deprecate-scrobbles.remove
@@ -0,0 +1 @@
+Deprecate Pleroma's audio scrobbling
diff --git a/docs/development/API/pleroma_api.md b/docs/development/API/pleroma_api.md
index 47fcb7479..bd0e07f9e 100644
--- a/docs/development/API/pleroma_api.md
+++ b/docs/development/API/pleroma_api.md
@@ -577,6 +577,9 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
404 if the pack does not exist
## `GET /api/v1/pleroma/accounts/:id/scrobbles`
+
+Audio scrobbling in Pleroma is **deprecated**.
+
### Requests a list of current and recent Listen activities for an account
* Method `GET`
* Authentication: not required
@@ -598,6 +601,9 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
```
## `POST /api/v1/pleroma/scrobble`
+
+Audio scrobbling in Pleroma is **deprecated**.
+
### Creates a new Listen activity for an account
* Method `POST`
* Authentication: required
diff --git a/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex
index b6273bfcf..ca40da930 100644
--- a/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/pleroma_scrobble_operation.ex
@@ -22,6 +22,7 @@ defmodule Pleroma.Web.ApiSpec.PleromaScrobbleOperation do
summary: "Creates a new Listen activity for an account",
security: [%{"oAuth" => ["write"]}],
operationId: "PleromaAPI.ScrobbleController.create",
+ deprecated: true,
requestBody: request_body("Parameters", create_request(), requried: true),
responses: %{
200 => Operation.response("Scrobble", "application/json", scrobble())
@@ -34,6 +35,7 @@ defmodule Pleroma.Web.ApiSpec.PleromaScrobbleOperation do
tags: ["Scrobbles"],
summary: "Requests a list of current and recent Listen activities for an account",
operationId: "PleromaAPI.ScrobbleController.index",
+ deprecated: true,
parameters: [
%Reference{"$ref": "#/components/parameters/accountIdOrNickname"} | pagination_params()
],
From 0c3709173fe7905c3d7e9d542d3b1007d8f97042 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Tue, 4 Jul 2023 04:19:25 +0200
Subject: [PATCH 077/199] docs: Fix broken links
---
changelog.d/gentoo_otp_hotfix.skip | 0
docs/installation/gentoo_en.md | 2 +-
docs/installation/gentoo_otp_en.md | 2 +-
3 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 changelog.d/gentoo_otp_hotfix.skip
diff --git a/changelog.d/gentoo_otp_hotfix.skip b/changelog.d/gentoo_otp_hotfix.skip
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/installation/gentoo_en.md b/docs/installation/gentoo_en.md
index 273e21d4b..87128d6f6 100644
--- a/docs/installation/gentoo_en.md
+++ b/docs/installation/gentoo_en.md
@@ -2,7 +2,7 @@
{! backend/installation/otp_vs_from_source.include !}
-This guide covers a manual from-source installation. To use the gentoo package, please check the [packaged installation guide for gentoo](./gentoo.en.md).
+This guide covers a manual from-source installation. To use the gentoo package, please check the [packaged installation guide for gentoo](./gentoo_otp_en.md).
## Installation
diff --git a/docs/installation/gentoo_otp_en.md b/docs/installation/gentoo_otp_en.md
index 5dcfe0b7b..76968eb38 100644
--- a/docs/installation/gentoo_otp_en.md
+++ b/docs/installation/gentoo_otp_en.md
@@ -65,7 +65,7 @@ The output from emerging postgresql should give you a command for initializing t
### Install media / graphics packages (optional)
-See [Optional software packages needed for specific functionality](docs/installation/optional/media_graphics_packages.md) for details.
+See [Optional software packages needed for specific functionality](optional/media_graphics_packages.md) for details.
```shell
# emerge --ask media-video/ffmpeg media-gfx/imagemagick media-libs/exiftool
From 28ff828caaada329283a37feb3940b543ef260a3 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 28 Feb 2023 10:40:24 -0500
Subject: [PATCH 078/199] Add emoji policy to remove emojis matching certain
urls
https://git.pleroma.social/pleroma/pleroma/-/issues/2775
---
config/config.exs | 6 +
lib/pleroma/web/activity_pub/emoji_policy.ex | 158 ++++++++++++++++++
.../activity_pub/mrf/emoji_policy_test.exs | 123 ++++++++++++++
3 files changed, 287 insertions(+)
create mode 100644 lib/pleroma/web/activity_pub/emoji_policy.ex
create mode 100644 test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
diff --git a/config/config.exs b/config/config.exs
index a92ab574b..ebcbf8b49 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -408,6 +408,12 @@ config :pleroma, :mrf_keyword,
federated_timeline_removal: [],
replace: []
+config :pleroma, :mrf_emoji,
+ remove_url: [],
+ remove_shortcode: [],
+ federated_timeline_removal_url: [],
+ federated_timeline_removal_shortcode: []
+
config :pleroma, :mrf_hashtag,
sensitive: ["nsfw"],
reject: [],
diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/emoji_policy.ex
new file mode 100644
index 000000000..747e720b6
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/emoji_policy.ex
@@ -0,0 +1,158 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2023 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
+ require Pleroma.Constants
+
+ @moduledoc "Reject or force-unlisted emojis with certain URLs or names"
+
+ @behaviour Pleroma.Web.ActivityPub.MRF.Policy
+
+ defp config_remove_url do
+ Pleroma.Config.get([:mrf_emoji, :remove_url], [])
+ end
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def filter(%{"type" => type, "object" => %{} = object} = message)
+ when type in ["Create", "Update"] do
+ with object <- process_remove(object, :url, config_remove_url()) do
+ {:ok, Map.put(message, "object", object)}
+ end
+ end
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def filter(%{"type" => type} = object) when type in Pleroma.Constants.actor_types() do
+ with object <- process_remove(object, :url, config_remove_url()) do
+ {:ok, object}
+ end
+ end
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def filter(message) do
+ {:ok, message}
+ end
+
+ defp match_string?(string, pattern) when is_binary(pattern) do
+ string == pattern
+ end
+
+ defp match_string?(string, %Regex{} = pattern) do
+ String.match?(string, pattern)
+ end
+
+ defp match_any?(string, patterns) do
+ Enum.any?(patterns, &match_string?(string, &1))
+ end
+
+ defp process_remove(object, :url, patterns) do
+ processed_tag =
+ Enum.filter(
+ object["tag"],
+ fn
+ %{"type" => "Emoji", "icon" => %{"url" => url}} when is_binary(url) ->
+ not match_any?(url, patterns)
+
+ _ ->
+ true
+ end
+ )
+
+ processed_emoji =
+ if object["emoji"] do
+ object["emoji"]
+ |> Enum.reduce(%{}, fn {name, url}, acc ->
+ if not match_any?(url, patterns) do
+ Map.put(acc, name, url)
+ else
+ acc
+ end
+ end)
+ else
+ nil
+ end
+
+ if processed_emoji do
+ object
+ |> Map.put("tag", processed_tag)
+ |> Map.put("emoji", processed_emoji)
+ else
+ object
+ |> Map.put("tag", processed_tag)
+ end
+ end
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def describe do
+ # This horror is needed to convert regex sigils to strings
+ mrf_emoji =
+ Pleroma.Config.get(:mrf_emoji, [])
+ |> Enum.map(fn {key, value} ->
+ {key,
+ Enum.map(value, fn
+ pattern ->
+ if not is_binary(pattern) do
+ inspect(pattern)
+ else
+ pattern
+ end
+ end)}
+ end)
+ |> Enum.into(%{})
+
+ {:ok, %{mrf_emoji: mrf_emoji}}
+ end
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def config_description do
+ %{
+ key: :mrf_emoji,
+ related_policy: "Pleroma.Web.ActivityPub.MRF.EmojiPolicy",
+ label: "MRF Emoji",
+ description:
+ "Reject or force-unlisted emojis whose URLs or names match a keyword or [Regex](https://hexdocs.pm/elixir/Regex.html).",
+ children: [
+ %{
+ key: :remove_url,
+ type: {:list, :string},
+ description: """
+ A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles.
+
+ Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
+ """,
+ suggestions: ["foo", ~r/foo/iu]
+ },
+ %{
+ key: :remove_shortcode,
+ type: {:list, :string},
+ description: """
+ A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles.
+
+ Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
+ """,
+ suggestions: ["foo", ~r/foo/iu]
+ },
+ %{
+ key: :federated_timeline_removal_url,
+ type: {:list, :string},
+ description: """
+ A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses.
+
+ Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
+ """,
+ suggestions: ["foo", ~r/foo/iu]
+ },
+ %{
+ key: :federated_timeline_removal_shortcode,
+ type: {:list, :string},
+ description: """
+ A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses.
+
+ Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
+ """,
+ suggestions: ["foo", ~r/foo/iu]
+ }
+ ]
+ }
+ end
+end
diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
new file mode 100644
index 000000000..fe1fb338e
--- /dev/null
+++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
@@ -0,0 +1,123 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2023 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Web.ActivityPub.MRF
+ alias Pleroma.Web.ActivityPub.MRF.EmojiPolicy
+
+ setup do: clear_config(:mrf_emoji)
+
+ setup do
+ clear_config([:mrf_emoji], %{
+ remove_url: [],
+ remove_shortcode: [],
+ federated_timeline_removal_url: [],
+ federated_timeline_removal_shortcode: []
+ })
+ end
+
+ @emoji_tags [
+ %{
+ "icon" => %{
+ "type" => "Image",
+ "url" => "https://example.org/emoji/biribiri/mikoto_smile2.png"
+ },
+ "id" => "https://example.org/emoji/biribiri/mikoto_smile2.png",
+ "name" => ":mikoto_smile2:",
+ "type" => "Emoji",
+ "updated" => "1970-01-01T00:00:00Z"
+ },
+ %{
+ "icon" => %{
+ "type" => "Image",
+ "url" => "https://example.org/emoji/biribiri/mikoto_smile3.png"
+ },
+ "id" => "https://example.org/emoji/biribiri/mikoto_smile3.png",
+ "name" => ":mikoto_smile3:",
+ "type" => "Emoji",
+ "updated" => "1970-01-01T00:00:00Z"
+ },
+ %{
+ "icon" => %{
+ "type" => "Image",
+ "url" => "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png"
+ },
+ "id" => "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png",
+ "name" => ":nekomimi_girl_emoji_007:",
+ "type" => "Emoji",
+ "updated" => "1970-01-01T00:00:00Z"
+ },
+ %{
+ "icon" => %{
+ "type" => "Image",
+ "url" => "https://example.org/test.png"
+ },
+ "id" => "https://example.org/test.png",
+ "name" => ":test:",
+ "type" => "Emoji",
+ "updated" => "1970-01-01T00:00:00Z"
+ }
+ ]
+
+ @misc_tags [%{"type" => "Placeholder"}]
+
+ @user_data %{
+ "type" => "Person",
+ "id" => "https://example.org/placeholder",
+ "name" => "lol",
+ "tag" => @emoji_tags ++ @misc_tags
+ }
+
+ @status_data %{
+ "type" => "Create",
+ "object" => %{
+ "type" => "Note",
+ "id" => "https://example.org/placeholder",
+ "content" => "lol",
+ "tag" => @emoji_tags ++ @misc_tags,
+ "emoji" => %{
+ "mikoto_smile2" => "https://example.org/emoji/biribiri/mikoto_smile2.png",
+ "mikoto_smile3" => "https://example.org/emoji/biribiri/mikoto_smile3.png",
+ "nekomimi_girl_emoji_007" =>
+ "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png",
+ "test" => "https://example.org/test.png"
+ }
+ }
+ }
+
+ describe "remove_url" do
+ setup do
+ clear_config([:mrf_emoji, :remove_url], [
+ "https://example.org/test.png",
+ ~r{/biribiri/mikoto_smile[23]\.png},
+ "nekomimi_girl_emoji"
+ ])
+
+ :ok
+ end
+
+ test "processes user" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @user_data)
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ assert %{"tag" => ^expected_tags} = filtered
+ end
+
+ test "processes status" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data)
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ expected_emoji = %{
+ "nekomimi_girl_emoji_007" =>
+ "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png"
+ }
+
+ assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered
+ end
+ end
+end
From 80ce6482f6eb85f4c1d172811affc4a17d24985a Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 28 Feb 2023 10:51:56 -0500
Subject: [PATCH 079/199] EmojiPolicy: implement remove by shortcode
---
lib/pleroma/web/activity_pub/emoji_policy.ex | 48 ++++++++++++++++---
.../activity_pub/mrf/emoji_policy_test.exs | 33 +++++++++++++
2 files changed, 75 insertions(+), 6 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/emoji_policy.ex
index 747e720b6..346b64699 100644
--- a/lib/pleroma/web/activity_pub/emoji_policy.ex
+++ b/lib/pleroma/web/activity_pub/emoji_policy.ex
@@ -13,17 +13,23 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
Pleroma.Config.get([:mrf_emoji, :remove_url], [])
end
+ defp config_remove_shortcode do
+ Pleroma.Config.get([:mrf_emoji, :remove_shortcode], [])
+ end
+
@impl Pleroma.Web.ActivityPub.MRF.Policy
def filter(%{"type" => type, "object" => %{} = object} = message)
when type in ["Create", "Update"] do
- with object <- process_remove(object, :url, config_remove_url()) do
+ with object <- process_remove(object, :url, config_remove_url()),
+ object <- process_remove(object, :shortcode, config_remove_shortcode()) do
{:ok, Map.put(message, "object", object)}
end
end
@impl Pleroma.Web.ActivityPub.MRF.Policy
def filter(%{"type" => type} = object) when type in Pleroma.Constants.actor_types() do
- with object <- process_remove(object, :url, config_remove_url()) do
+ with object <- process_remove(object, :url, config_remove_url()),
+ object <- process_remove(object, :shortcode, config_remove_shortcode()) do
{:ok, object}
end
end
@@ -46,12 +52,42 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
end
defp process_remove(object, :url, patterns) do
+ process_remove_impl(
+ object,
+ fn
+ %{"icon" => %{"url" => url}} -> url
+ _ -> nil
+ end,
+ fn {_name, url} -> url end,
+ patterns
+ )
+ end
+
+ defp process_remove(object, :shortcode, patterns) do
+ process_remove_impl(
+ object,
+ fn
+ %{"name" => name} when is_binary(name) -> String.trim(name, ":")
+ _ -> nil
+ end,
+ fn {name, _url} -> name end,
+ patterns
+ )
+ end
+
+ defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do
processed_tag =
Enum.filter(
object["tag"],
fn
- %{"type" => "Emoji", "icon" => %{"url" => url}} when is_binary(url) ->
- not match_any?(url, patterns)
+ %{"type" => "Emoji"} = tag ->
+ str = extract_from_tag.(tag)
+
+ if is_binary(str) do
+ not match_any?(str, patterns)
+ else
+ true
+ end
_ ->
true
@@ -61,8 +97,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
processed_emoji =
if object["emoji"] do
object["emoji"]
- |> Enum.reduce(%{}, fn {name, url}, acc ->
- if not match_any?(url, patterns) do
+ |> Enum.reduce(%{}, fn {name, url} = emoji, acc ->
+ if not match_any?(extract_from_emoji.(emoji), patterns) do
Map.put(acc, name, url)
else
acc
diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
index fe1fb338e..6511f6532 100644
--- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
@@ -120,4 +120,37 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered
end
end
+
+ describe "remove_shortcode" do
+ setup do
+ clear_config([:mrf_emoji, :remove_shortcode], [
+ "test",
+ ~r{mikoto_s},
+ "nekomimi_girl_emoji"
+ ])
+
+ :ok
+ end
+
+ test "processes user" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @user_data)
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ assert %{"tag" => ^expected_tags} = filtered
+ end
+
+ test "processes status" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data)
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ expected_emoji = %{
+ "nekomimi_girl_emoji_007" =>
+ "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png"
+ }
+
+ assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered
+ end
+ end
end
From 7eb8abf7bb50e6bf4c6587ea308e1a52d944375a Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 28 Feb 2023 11:47:53 -0500
Subject: [PATCH 080/199] EmojiPolicy: Implement delist
---
lib/pleroma/web/activity_pub/emoji_policy.ex | 117 ++++++++++--
.../activity_pub/mrf/emoji_policy_test.exs | 180 +++++++++++++++++-
2 files changed, 274 insertions(+), 23 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/emoji_policy.ex
index 346b64699..df1566ec3 100644
--- a/lib/pleroma/web/activity_pub/emoji_policy.ex
+++ b/lib/pleroma/web/activity_pub/emoji_policy.ex
@@ -5,6 +5,8 @@
defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
require Pleroma.Constants
+ alias Pleroma.Object.Updater
+
@moduledoc "Reject or force-unlisted emojis with certain URLs or names"
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
@@ -17,12 +19,31 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
Pleroma.Config.get([:mrf_emoji, :remove_shortcode], [])
end
+ defp config_unlist_url do
+ Pleroma.Config.get([:mrf_emoji, :federated_timeline_removal_url], [])
+ end
+
+ defp config_unlist_shortcode do
+ Pleroma.Config.get([:mrf_emoji, :federated_timeline_removal_shortcode], [])
+ end
+
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def history_awareness, do: :manual
+
@impl Pleroma.Web.ActivityPub.MRF.Policy
def filter(%{"type" => type, "object" => %{} = object} = message)
when type in ["Create", "Update"] do
- with object <- process_remove(object, :url, config_remove_url()),
- object <- process_remove(object, :shortcode, config_remove_shortcode()) do
- {:ok, Map.put(message, "object", object)}
+ with {:ok, object} <-
+ Updater.do_with_history(object, fn object ->
+ {:ok, process_remove(object, :url, config_remove_url())}
+ end),
+ {:ok, object} <-
+ Updater.do_with_history(object, fn object ->
+ {:ok, process_remove(object, :shortcode, config_remove_shortcode())}
+ end),
+ activity <- Map.put(message, "object", object),
+ activity <- maybe_delist(activity) do
+ {:ok, activity}
end
end
@@ -51,28 +72,22 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
Enum.any?(patterns, &match_string?(string, &1))
end
+ defp url_from_tag(%{"icon" => %{"url" => url}}), do: url
+ defp url_from_tag(_), do: nil
+
+ defp url_from_emoji({_name, url}), do: url
+
+ defp shortcode_from_tag(%{"name" => name}) when is_binary(name), do: String.trim(name, ":")
+ defp shortcode_from_tag(_), do: nil
+
+ defp shortcode_from_emoji({name, _url}), do: name
+
defp process_remove(object, :url, patterns) do
- process_remove_impl(
- object,
- fn
- %{"icon" => %{"url" => url}} -> url
- _ -> nil
- end,
- fn {_name, url} -> url end,
- patterns
- )
+ process_remove_impl(object, &url_from_tag/1, &url_from_emoji/1, patterns)
end
defp process_remove(object, :shortcode, patterns) do
- process_remove_impl(
- object,
- fn
- %{"name" => name} when is_binary(name) -> String.trim(name, ":")
- _ -> nil
- end,
- fn {name, _url} -> name end,
- patterns
- )
+ process_remove_impl(object, &shortcode_from_tag/1, &shortcode_from_emoji/1, patterns)
end
defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do
@@ -118,6 +133,66 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
end
end
+ defp maybe_delist(%{"object" => object, "to" => to, "type" => "Create"} = activity) do
+ check = fn object ->
+ if any_emoji_match?(object, &url_from_tag/1, &url_from_emoji/1, config_unlist_url()) or
+ any_emoji_match?(
+ object,
+ &shortcode_from_tag/1,
+ &shortcode_from_emoji/1,
+ config_unlist_shortcode()
+ ) do
+ {:should_delist, nil}
+ else
+ {:ok, %{}}
+ end
+ end
+
+ should_delist? = fn object ->
+ with {:ok, _} <- Pleroma.Object.Updater.do_with_history(object, check) do
+ false
+ else
+ _ -> true
+ end
+ end
+
+ if Pleroma.Constants.as_public() in to and should_delist?.(object) do
+ to = List.delete(to, Pleroma.Constants.as_public())
+ cc = [Pleroma.Constants.as_public() | activity["cc"] || []]
+
+ activity
+ |> Map.put("to", to)
+ |> Map.put("cc", cc)
+ else
+ activity
+ end
+ end
+
+ defp maybe_delist(activity), do: activity
+
+ defp any_emoji_match?(object, extract_from_tag, extract_from_emoji, patterns) do
+ Kernel.||(
+ Enum.any?(
+ object["tag"],
+ fn
+ %{"type" => "Emoji"} = tag ->
+ str = extract_from_tag.(tag)
+
+ if is_binary(str) do
+ match_any?(str, patterns)
+ else
+ false
+ end
+
+ _ ->
+ false
+ end
+ ),
+ object["emoji"]
+ |> Enum.any?(fn emoji -> match_any?(extract_from_emoji.(emoji), patterns) end)
+ )
+ end
+
@impl Pleroma.Web.ActivityPub.MRF.Policy
def describe do
# This horror is needed to convert regex sigils to strings
diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
index 6511f6532..1e1b5c578 100644
--- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
@@ -5,6 +5,8 @@
defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
use Pleroma.DataCase
+ require Pleroma.Constants
+
alias Pleroma.Web.ActivityPub.MRF
alias Pleroma.Web.ActivityPub.MRF.EmojiPolicy
@@ -84,8 +86,27 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
"nekomimi_girl_emoji_007" =>
"https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png",
"test" => "https://example.org/test.png"
- }
- }
+ },
+ "to" => ["https://example.org/self", Pleroma.Constants.as_public()],
+ "cc" => ["https://example.org/someone"]
+ },
+ "to" => ["https://example.org/self", Pleroma.Constants.as_public()],
+ "cc" => ["https://example.org/someone"]
+ }
+
+ @status_data_with_history %{
+ "type" => "Create",
+ "object" =>
+ @status_data["object"]
+ |> Map.merge(%{
+ "formerRepresentations" => %{
+ "type" => "OrderedCollection",
+ "orderedItems" => [@status_data["object"] |> Map.put("content", "older")],
+ "totalItems" => 1
+ }
+ }),
+ "to" => ["https://example.org/self", Pleroma.Constants.as_public()],
+ "cc" => ["https://example.org/someone"]
}
describe "remove_url" do
@@ -119,6 +140,49 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered
end
+
+ test "processes status with history" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data_with_history)
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ expected_emoji = %{
+ "nekomimi_girl_emoji_007" =>
+ "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png"
+ }
+
+ assert %{
+ "object" => %{
+ "tag" => ^expected_tags,
+ "emoji" => ^expected_emoji,
+ "formerRepresentations" => %{"orderedItems" => [item]}
+ }
+ } = filtered
+
+ assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item
+ end
+
+ test "processes updates" do
+ {:ok, filtered} =
+ MRF.filter_one(EmojiPolicy, @status_data_with_history |> Map.put("type", "Update"))
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ expected_emoji = %{
+ "nekomimi_girl_emoji_007" =>
+ "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png"
+ }
+
+ assert %{
+ "object" => %{
+ "tag" => ^expected_tags,
+ "emoji" => ^expected_emoji,
+ "formerRepresentations" => %{"orderedItems" => [item]}
+ }
+ } = filtered
+
+ assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item
+ end
end
describe "remove_shortcode" do
@@ -152,5 +216,117 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
assert %{"object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}} = filtered
end
+
+ test "processes status with history" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data_with_history)
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ expected_emoji = %{
+ "nekomimi_girl_emoji_007" =>
+ "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png"
+ }
+
+ assert %{
+ "object" => %{
+ "tag" => ^expected_tags,
+ "emoji" => ^expected_emoji,
+ "formerRepresentations" => %{"orderedItems" => [item]}
+ }
+ } = filtered
+
+ assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item
+ end
+
+ test "processes updates" do
+ {:ok, filtered} =
+ MRF.filter_one(EmojiPolicy, @status_data_with_history |> Map.put("type", "Update"))
+
+ expected_tags = [@emoji_tags |> Enum.at(2)] ++ @misc_tags
+
+ expected_emoji = %{
+ "nekomimi_girl_emoji_007" =>
+ "https://example.org/emoji/nekomimi_girl_emoji/nekomimi_girl_emoji_007.png"
+ }
+
+ assert %{
+ "object" => %{
+ "tag" => ^expected_tags,
+ "emoji" => ^expected_emoji,
+ "formerRepresentations" => %{"orderedItems" => [item]}
+ }
+ } = filtered
+
+ assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item
+ end
+ end
+
+ describe "federated_timeline_removal_url" do
+ setup do
+ clear_config([:mrf_emoji, :federated_timeline_removal_url], [
+ "https://example.org/test.png",
+ ~r{/biribiri/mikoto_smile[23]\.png},
+ "nekomimi_girl_emoji"
+ ])
+
+ :ok
+ end
+
+ test "processes status" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data)
+
+ expected_tags = @status_data["object"]["tag"]
+ expected_emoji = @status_data["object"]["emoji"]
+
+ expected_to = ["https://example.org/self"]
+ expected_cc = [Pleroma.Constants.as_public(), "https://example.org/someone"]
+
+ assert %{
+ "to" => ^expected_to,
+ "cc" => ^expected_cc,
+ "object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}
+ } = filtered
+ end
+
+ test "ignore updates" do
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, @status_data |> Map.put("type", "Update"))
+
+ expected_tags = @status_data["object"]["tag"]
+ expected_emoji = @status_data["object"]["emoji"]
+
+ expected_to = ["https://example.org/self", Pleroma.Constants.as_public()]
+ expected_cc = ["https://example.org/someone"]
+
+ assert %{
+ "to" => ^expected_to,
+ "cc" => ^expected_cc,
+ "object" => %{"tag" => ^expected_tags, "emoji" => ^expected_emoji}
+ } = filtered
+ end
+
+ test "processes status with history" do
+ status =
+ @status_data_with_history
+ |> put_in(["object", "tag"], @misc_tags)
+ |> put_in(["object", "emoji"], %{})
+
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, status)
+
+ expected_tags = @status_data["object"]["tag"]
+ expected_emoji = @status_data["object"]["emoji"]
+
+ expected_to = ["https://example.org/self"]
+ expected_cc = [Pleroma.Constants.as_public(), "https://example.org/someone"]
+
+ assert %{
+ "to" => ^expected_to,
+ "cc" => ^expected_cc,
+ "object" => %{
+ "formerRepresentations" => %{
+ "orderedItems" => [%{"tag" => ^expected_tags, "emoji" => ^expected_emoji}]
+ }
+ }
+ } = filtered
+ end
end
end
From f50422c3802cd2316cfa6312d5a88c018c722843 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 28 Feb 2023 11:48:34 -0500
Subject: [PATCH 081/199] Move emoji_policy.ex to the right place
---
lib/pleroma/web/activity_pub/{ => mrf}/emoji_policy.ex | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename lib/pleroma/web/activity_pub/{ => mrf}/emoji_policy.ex (100%)
diff --git a/lib/pleroma/web/activity_pub/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
similarity index 100%
rename from lib/pleroma/web/activity_pub/emoji_policy.ex
rename to lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
From 18a8378beb01a7ee93afcddf16e2699c5fe6d35a Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 28 Feb 2023 12:05:54 -0500
Subject: [PATCH 082/199] Update config cheatsheet
---
docs/configuration/cheatsheet.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index 1e49a79d0..696d10e74 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -261,6 +261,11 @@ Notes:
* `follower_nickname`: The name of the bot account to use for following newly discovered users. Using `followbot` or similar is strongly suggested.
+#### :mrf_emoji
+* `remove_url`: A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
+* `remove_shortcode`: A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
+* `federated_timeline_removal_url`: A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
+* `federated_timeline_removal_shortcode`: A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
### :activitypub
* `unfollow_blocked`: Whether blocks result in people getting unfollowed
From 20d193c91da587372c618c53020a1f90eff20a7b Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 28 Feb 2023 12:14:48 -0500
Subject: [PATCH 083/199] Improve config examples for EmojiPolicy
---
lib/pleroma/web/activity_pub/mrf/emoji_policy.ex | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
index df1566ec3..9a2e8eade 100644
--- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
@@ -231,7 +231,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
""",
- suggestions: ["foo", ~r/foo/iu]
+ suggestions: ["https://example.org/foo.png", ~r/example.org\/foo/iu]
},
%{
key: :remove_shortcode,
@@ -251,7 +251,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
""",
- suggestions: ["foo", ~r/foo/iu]
+ suggestions: ["https://example.org/foo.png", ~r/example.org\/foo/iu]
},
%{
key: :federated_timeline_removal_shortcode,
From ef8a6c539a98633d1a78fa42379952b93f847309 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 13 Jun 2023 14:53:20 -0400
Subject: [PATCH 084/199] Make EmojiPolicy aware of custom emoji reactions
---
docs/configuration/cheatsheet.md | 4 +-
.../web/activity_pub/mrf/emoji_policy.ex | 33 +++++++++----
.../activity_pub/mrf/emoji_policy_test.exs | 46 +++++++++++++++++++
3 files changed, 72 insertions(+), 11 deletions(-)
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index 696d10e74..f43cde114 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -262,8 +262,8 @@ Notes:
* `follower_nickname`: The name of the bot account to use for following newly discovered users. Using `followbot` or similar is strongly suggested.
#### :mrf_emoji
-* `remove_url`: A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
-* `remove_shortcode`: A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
+* `remove_url`: A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
+* `remove_shortcode`: A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
* `federated_timeline_removal_url`: A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
* `federated_timeline_removal_shortcode`: A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
index 9a2e8eade..13201ac55 100644
--- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
@@ -55,6 +55,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
end
end
+ @impl Pleroma.Web.ActivityPub.MRF.Policy
+ def filter(%{"type" => "EmojiReact"} = object) do
+ with {:ok, _} <-
+ matched_emoji_checker(config_remove_url(), config_remove_shortcode()).(object) do
+ {:ok, object}
+ else
+ _ ->
+ {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"}
+ end
+ end
+
@impl Pleroma.Web.ActivityPub.MRF.Policy
def filter(message) do
{:ok, message}
@@ -133,20 +144,24 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
end
end
- defp maybe_delist(%{"object" => object, "to" => to, "type" => "Create"} = activity) do
- check = fn object ->
- if any_emoji_match?(object, &url_from_tag/1, &url_from_emoji/1, config_unlist_url()) or
+ defp matched_emoji_checker(urls, shortcodes) do
+ fn object ->
+ if any_emoji_match?(object, &url_from_tag/1, &url_from_emoji/1, urls) or
any_emoji_match?(
object,
&shortcode_from_tag/1,
&shortcode_from_emoji/1,
- config_unlist_shortcode()
+ shortcodes
) do
- {:should_delist, nil}
+ {:matched, nil}
else
{:ok, %{}}
end
end
+ end
+
+ defp maybe_delist(%{"object" => object, "to" => to, "type" => "Create"} = activity) do
+ check = matched_emoji_checker(config_unlist_url(), config_unlist_shortcode())
should_delist? = fn object ->
with {:ok, _} <- Pleroma.Object.Updater.do_with_history(object, check) do
@@ -173,7 +188,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
defp any_emoji_match?(object, extract_from_tag, extract_from_emoji, patterns) do
Kernel.||(
Enum.any?(
- object["tag"],
+ object["tag"] || [],
fn
%{"type" => "Emoji"} = tag ->
str = extract_from_tag.(tag)
@@ -188,7 +203,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
false
end
),
- object["emoji"]
+ (object["emoji"] || [])
|> Enum.any?(fn emoji -> match_any?(extract_from_emoji.(emoji), patterns) end)
)
end
@@ -227,7 +242,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
key: :remove_url,
type: {:list, :string},
description: """
- A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to both statuses and user profiles.
+ A list of patterns which result in emoji whose URL matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles.
Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
""",
@@ -237,7 +252,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
key: :remove_shortcode,
type: {:list, :string},
description: """
- A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to both statuses and user profiles.
+ A list of patterns which result in emoji whose shortcode matches being removed from the message. This will apply to statuses, emoji reactions, and user profiles.
Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
""",
diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
index 1e1b5c578..ae4c44f1c 100644
--- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
@@ -109,6 +109,30 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
"cc" => ["https://example.org/someone"]
}
+ @emoji_react_data %{
+ "type" => "EmojiReact",
+ "tag" => [@emoji_tags |> Enum.at(3)],
+ "object" => "https://example.org/someobject",
+ "to" => ["https://example.org/self"],
+ "cc" => ["https://example.org/someone"]
+ }
+
+ @emoji_react_data_matching_regex %{
+ "type" => "EmojiReact",
+ "tag" => [@emoji_tags |> Enum.at(1)],
+ "object" => "https://example.org/someobject",
+ "to" => ["https://example.org/self"],
+ "cc" => ["https://example.org/someone"]
+ }
+
+ @emoji_react_data_matching_nothing %{
+ "type" => "EmojiReact",
+ "tag" => [@emoji_tags |> Enum.at(2)],
+ "object" => "https://example.org/someobject",
+ "to" => ["https://example.org/self"],
+ "cc" => ["https://example.org/someone"]
+ }
+
describe "remove_url" do
setup do
clear_config([:mrf_emoji, :remove_url], [
@@ -183,6 +207,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item
end
+
+ test "processes EmojiReact" do
+ assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data)
+
+ assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_regex)
+
+ assert {:ok, @emoji_react_data_matching_nothing} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing)
+ end
end
describe "remove_shortcode" do
@@ -259,6 +294,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
assert %{"tag" => ^expected_tags, "emoji" => ^expected_emoji} = item
end
+
+ test "processes EmojiReact" do
+ assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data)
+
+ assert {:reject, "[EmojiPolicy] Rejected for having disallowed emoji"} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_regex)
+
+ assert {:ok, @emoji_react_data_matching_nothing} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing)
+ end
end
describe "federated_timeline_removal_url" do
From d670dbdbd3e675b7d29c97e8bfd5301dcf3c9de0 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 13 Jun 2023 14:55:27 -0400
Subject: [PATCH 085/199] Test that unicode emoji reactions are not affected
---
.../web/activity_pub/mrf/emoji_policy_test.exs | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
index ae4c44f1c..121ee1ea0 100644
--- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
@@ -133,6 +133,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
"cc" => ["https://example.org/someone"]
}
+ @emoji_react_data_unicode %{
+ "type" => "EmojiReact",
+ "content" => "😍",
+ "object" => "https://example.org/someobject",
+ "to" => ["https://example.org/self"],
+ "cc" => ["https://example.org/someone"]
+ }
+
describe "remove_url" do
setup do
clear_config([:mrf_emoji, :remove_url], [
@@ -217,6 +225,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
assert {:ok, @emoji_react_data_matching_nothing} ==
MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing)
+
+ assert {:ok, @emoji_react_data_unicode} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data_unicode)
end
end
@@ -304,6 +315,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
assert {:ok, @emoji_react_data_matching_nothing} ==
MRF.filter_one(EmojiPolicy, @emoji_react_data_matching_nothing)
+
+ assert {:ok, @emoji_react_data_unicode} ==
+ MRF.filter_one(EmojiPolicy, @emoji_react_data_unicode)
end
end
From 0d914e17bedb49a5efb8c0268d4a6df2e7ffdf96 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 13 Jun 2023 14:56:16 -0400
Subject: [PATCH 086/199] Add changelog
---
changelog.d/emoji-policy.add | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/emoji-policy.add
diff --git a/changelog.d/emoji-policy.add b/changelog.d/emoji-policy.add
new file mode 100644
index 000000000..45510c4f6
--- /dev/null
+++ b/changelog.d/emoji-policy.add
@@ -0,0 +1 @@
+Implement MRF policy to reject or delist according to emojis
From ba3aa4f86da77ece8ac472c40da180ab1921c304 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 20 Jun 2023 10:14:01 -0400
Subject: [PATCH 087/199] Fix edge cases
---
lib/pleroma/constants.ex | 12 +++
.../web/activity_pub/mrf/emoji_policy.ex | 79 ++++++++++---------
.../activity_pub/mrf/emoji_policy_test.exs | 33 ++++++++
3 files changed, 87 insertions(+), 37 deletions(-)
diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex
index cfb405218..7b4fd03b6 100644
--- a/lib/pleroma/constants.ex
+++ b/lib/pleroma/constants.ex
@@ -42,6 +42,18 @@ defmodule Pleroma.Constants do
]
)
+ const(status_object_types,
+ do: [
+ "Note",
+ "Question",
+ "Audio",
+ "Video",
+ "Event",
+ "Article",
+ "Page"
+ ]
+ )
+
const(updatable_object_types,
do: [
"Note",
diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
index 13201ac55..95d6a6d43 100644
--- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
@@ -31,8 +31,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
def history_awareness, do: :manual
@impl Pleroma.Web.ActivityPub.MRF.Policy
- def filter(%{"type" => type, "object" => %{} = object} = message)
- when type in ["Create", "Update"] do
+ def filter(%{"type" => type, "object" => %{"type" => objtype} = object} = message)
+ when type in ["Create", "Update"] and objtype in Pleroma.Constants.status_object_types() do
with {:ok, object} <-
Updater.do_with_history(object, fn object ->
{:ok, process_remove(object, :url, config_remove_url())}
@@ -102,46 +102,51 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
end
defp process_remove_impl(object, extract_from_tag, extract_from_emoji, patterns) do
- processed_tag =
- Enum.filter(
- object["tag"],
- fn
- %{"type" => "Emoji"} = tag ->
- str = extract_from_tag.(tag)
+ object =
+ if object["tag"] do
+ Map.put(
+ object,
+ "tag",
+ Enum.filter(
+ object["tag"],
+ fn
+ %{"type" => "Emoji"} = tag ->
+ str = extract_from_tag.(tag)
- if is_binary(str) do
- not match_any?(str, patterns)
- else
- true
+ if is_binary(str) do
+ not match_any?(str, patterns)
+ else
+ true
+ end
+
+ _ ->
+ true
end
-
- _ ->
- true
- end
- )
-
- processed_emoji =
- if object["emoji"] do
- object["emoji"]
- |> Enum.reduce(%{}, fn {name, url} = emoji, acc ->
- if not match_any?(extract_from_emoji.(emoji), patterns) do
- Map.put(acc, name, url)
- else
- acc
- end
- end)
+ )
+ )
else
- nil
+ object
end
- if processed_emoji do
- object
- |> Map.put("tag", processed_tag)
- |> Map.put("emoji", processed_emoji)
- else
- object
- |> Map.put("tag", processed_tag)
- end
+ object =
+ if object["emoji"] do
+ Map.put(
+ object,
+ "emoji",
+ object["emoji"]
+ |> Enum.reduce(%{}, fn {name, url} = emoji, acc ->
+ if not match_any?(extract_from_emoji.(emoji), patterns) do
+ Map.put(acc, name, url)
+ else
+ acc
+ end
+ end)
+ )
+ else
+ object
+ end
+
+ object
end
defp matched_emoji_checker(urls, shortcodes) do
diff --git a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
index 121ee1ea0..7350800f0 100644
--- a/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
+++ b/test/pleroma/web/activity_pub/mrf/emoji_policy_test.exs
@@ -389,4 +389,37 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicyTest do
} = filtered
end
end
+
+ describe "edge cases" do
+ setup do
+ clear_config([:mrf_emoji, :remove_url], [
+ "https://example.org/test.png",
+ ~r{/biribiri/mikoto_smile[23]\.png},
+ "nekomimi_girl_emoji"
+ ])
+
+ :ok
+ end
+
+ test "non-statuses" do
+ answer = @status_data |> put_in(["object", "type"], "Answer")
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, answer)
+
+ assert filtered == answer
+ end
+
+ test "without tag" do
+ status = @status_data |> Map.put("object", Map.drop(@status_data["object"], ["tag"]))
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, status)
+
+ refute Map.has_key?(filtered["object"], "tag")
+ end
+
+ test "without emoji" do
+ status = @status_data |> Map.put("object", Map.drop(@status_data["object"], ["emoji"]))
+ {:ok, filtered} = MRF.filter_one(EmojiPolicy, status)
+
+ refute Map.has_key?(filtered["object"], "emoji")
+ end
+ end
end
From 1459d64508b10725231d8f4256fbc68166c1b8ae Mon Sep 17 00:00:00 2001
From: tusooa
Date: Fri, 7 Jul 2023 07:09:35 -0400
Subject: [PATCH 088/199] Make regex-to-string descriptor reusable
---
.../web/activity_pub/mrf/emoji_policy.ex | 12 ++----------
.../web/activity_pub/mrf/keyword_policy.ex | 16 ++++------------
lib/pleroma/web/activity_pub/mrf/utils.ex | 15 +++++++++++++++
.../web/activity_pub/mrf/utils_test.exs | 19 +++++++++++++++++++
4 files changed, 40 insertions(+), 22 deletions(-)
create mode 100644 lib/pleroma/web/activity_pub/mrf/utils.ex
create mode 100644 test/pleroma/web/activity_pub/mrf/utils_test.exs
diff --git a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
index 95d6a6d43..f884962b9 100644
--- a/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/emoji_policy.ex
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
require Pleroma.Constants
alias Pleroma.Object.Updater
+ alias Pleroma.Web.ActivityPub.MRF.Utils
@moduledoc "Reject or force-unlisted emojis with certain URLs or names"
@@ -215,19 +216,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.EmojiPolicy do
@impl Pleroma.Web.ActivityPub.MRF.Policy
def describe do
- # This horror is needed to convert regex sigils to strings
mrf_emoji =
Pleroma.Config.get(:mrf_emoji, [])
|> Enum.map(fn {key, value} ->
- {key,
- Enum.map(value, fn
- pattern ->
- if not is_binary(pattern) do
- inspect(pattern)
- else
- pattern
- end
- end)}
+ {key, Enum.map(value, &Utils.describe_regex_or_string/1)}
end)
|> Enum.into(%{})
diff --git a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex
index 687ec6c2f..874fe9ab9 100644
--- a/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/keyword_policy.ex
@@ -5,6 +5,8 @@
defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do
require Pleroma.Constants
+ alias Pleroma.Web.ActivityPub.MRF.Utils
+
@moduledoc "Reject or Word-Replace messages with a keyword or regex"
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
@@ -128,7 +130,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do
@impl true
def describe do
- # This horror is needed to convert regex sigils to strings
mrf_keyword =
Pleroma.Config.get(:mrf_keyword, [])
|> Enum.map(fn {key, value} ->
@@ -136,21 +137,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicy do
Enum.map(value, fn
{pattern, replacement} ->
%{
- "pattern" =>
- if not is_binary(pattern) do
- inspect(pattern)
- else
- pattern
- end,
+ "pattern" => Utils.describe_regex_or_string(pattern),
"replacement" => replacement
}
pattern ->
- if not is_binary(pattern) do
- inspect(pattern)
- else
- pattern
- end
+ Utils.describe_regex_or_string(pattern)
end)}
end)
|> Enum.into(%{})
diff --git a/lib/pleroma/web/activity_pub/mrf/utils.ex b/lib/pleroma/web/activity_pub/mrf/utils.ex
new file mode 100644
index 000000000..f2dc9eea9
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/utils.ex
@@ -0,0 +1,15 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2023 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.Utils do
+ @spec describe_regex_or_string(String.t() | Regex.t()) :: String.t()
+ def describe_regex_or_string(pattern) do
+ # This horror is needed to convert regex sigils to strings
+ if not is_binary(pattern) do
+ inspect(pattern)
+ else
+ pattern
+ end
+ end
+end
diff --git a/test/pleroma/web/activity_pub/mrf/utils_test.exs b/test/pleroma/web/activity_pub/mrf/utils_test.exs
new file mode 100644
index 000000000..3bbc2cfd3
--- /dev/null
+++ b/test/pleroma/web/activity_pub/mrf/utils_test.exs
@@ -0,0 +1,19 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2023 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.UtilsTest do
+ use Pleroma.DataCase, async: true
+
+ alias Pleroma.Web.ActivityPub.MRF.Utils
+
+ describe "describe_regex_or_string/1" do
+ test "describes regex" do
+ assert "~r/foo/i" == Utils.describe_regex_or_string(~r/foo/i)
+ end
+
+ test "returns string as-is" do
+ assert "foo" == Utils.describe_regex_or_string("foo")
+ end
+ end
+end
From ea4225a646b355150fb8e5e8c77d7fdc58b5e7ef Mon Sep 17 00:00:00 2001
From: tusooa
Date: Tue, 18 Jul 2023 18:39:59 -0400
Subject: [PATCH 089/199] Restrict attachments to only uploaded files only
---
changelog.d/attachment-type-check.fix | 1 +
lib/pleroma/constants.ex | 2 ++
lib/pleroma/web/common_api/utils.ex | 7 ++++++-
test/pleroma/web/common_api/utils_test.exs | 11 ++++++++---
4 files changed, 17 insertions(+), 4 deletions(-)
create mode 100644 changelog.d/attachment-type-check.fix
diff --git a/changelog.d/attachment-type-check.fix b/changelog.d/attachment-type-check.fix
new file mode 100644
index 000000000..9e14b75f1
--- /dev/null
+++ b/changelog.d/attachment-type-check.fix
@@ -0,0 +1 @@
+Restrict attachments to only uploaded files only
diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex
index 7b4fd03b6..6befc6897 100644
--- a/lib/pleroma/constants.ex
+++ b/lib/pleroma/constants.ex
@@ -81,4 +81,6 @@ defmodule Pleroma.Constants do
const(mime_regex,
do: ~r/^[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+\/[^[:cntrl:] ()<>@,;:\\"\/\[\]?=]+(; .*)?$/
)
+
+ const(upload_object_types, do: ["Document", "Image"])
end
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index a93c97e1e..b9fe0224c 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -59,7 +59,12 @@ defmodule Pleroma.Web.CommonAPI.Utils do
end
defp get_attachment(media_id) do
- Repo.get(Object, media_id)
+ with %Object{data: data} = object <- Repo.get(Object, media_id),
+ %{"type" => type} when type in Pleroma.Constants.upload_object_types() <- data do
+ object
+ else
+ _ -> nil
+ end
end
@spec get_to_and_cc(ActivityDraft.t()) :: {list(String.t()), list(String.t())}
diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs
index d309c6ded..ca5b92683 100644
--- a/test/pleroma/web/common_api/utils_test.exs
+++ b/test/pleroma/web/common_api/utils_test.exs
@@ -592,7 +592,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
end
test "returns list attachments with desc" do
- object = insert(:note)
+ object = insert(:attachment)
desc = Jason.encode!(%{object.id => "test-desc"})
assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc) == [
@@ -603,7 +603,7 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
describe "attachments_from_ids/1" do
test "returns attachments with descs" do
- object = insert(:note)
+ object = insert(:attachment)
desc = Jason.encode!(%{object.id => "test-desc"})
assert Utils.attachments_from_ids(%{
@@ -615,13 +615,18 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
end
test "returns attachments without descs" do
- object = insert(:note)
+ object = insert(:attachment)
assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == [object.data]
end
test "returns [] when not pass media_ids" do
assert Utils.attachments_from_ids(%{}) == []
end
+
+ test "checks that the object is of upload type" do
+ object = insert(:note)
+ assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == []
+ end
end
describe "maybe_add_list_data/3" do
From dc4de79d43ba941d8aa16f7c14887faae9f65e9f Mon Sep 17 00:00:00 2001
From: faried nawaz
Date: Wed, 7 Dec 2022 22:37:50 +0500
Subject: [PATCH 090/199] status context: perform visibility check on
activities around a status
issue #2927
---
lib/pleroma/web/activity_pub/activity_pub.ex | 23 ++
.../controllers/status_controller_test.exs | 267 ++++++++++++++++++
2 files changed, 290 insertions(+)
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index c93288b79..f1a12d22d 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -455,6 +455,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|> maybe_preload_objects(opts)
|> maybe_preload_bookmarks(opts)
|> maybe_set_thread_muted_field(opts)
+ |> restrict_unauthenticated(opts[:user])
|> restrict_blocked(opts)
|> restrict_blockers_visibility(opts)
|> restrict_recipients(recipients, opts[:user])
@@ -1215,6 +1216,28 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
defp restrict_filtered(query, _), do: query
+ defp restrict_unauthenticated(query, nil) do
+ local = Config.restrict_unauthenticated_access?(:activities, :local)
+ remote = Config.restrict_unauthenticated_access?(:activities, :remote)
+
+ cond do
+ local and remote ->
+ # is there a better way to handle this?
+ from(activity in query, where: 1 == 0)
+
+ local ->
+ from(activity in query, where: activity.local == false)
+
+ remote ->
+ from(activity in query, where: activity.local == true)
+
+ true ->
+ query
+ end
+ end
+
+ defp restrict_unauthenticated(query, _), do: query
+
defp exclude_poll_votes(query, %{include_poll_votes: true}), do: query
defp exclude_poll_votes(query, _) do
diff --git a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
index 4f434cb69..76c289ee7 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -771,6 +771,49 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
{:ok, local: local, remote: remote}
end
+ defp local_and_remote_context_activities do
+ local_user_1 = insert(:user)
+ local_user_2 = insert(:user)
+ remote_user = insert(:user, local: false)
+
+ {:ok, %{id: id1, data: %{"context" => context}}} =
+ CommonAPI.post(local_user_1, %{status: "post"})
+
+ {:ok, %{id: id2} = post} =
+ CommonAPI.post(local_user_2, %{status: "local reply", in_reply_to_status_id: id1})
+
+ params = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "actor" => remote_user.ap_id,
+ "type" => "Create",
+ "context" => context,
+ "id" => "#{remote_user.ap_id}/activities/1",
+ "inReplyTo" => post.data["id"],
+ "object" => %{
+ "type" => "Note",
+ "content" => "remote reply",
+ "context" => context,
+ "id" => "#{remote_user.ap_id}/objects/1",
+ "attributedTo" => remote_user.ap_id,
+ "to" => [
+ local_user_1.ap_id,
+ local_user_2.ap_id,
+ "https://www.w3.org/ns/activitystreams#Public"
+ ]
+ },
+ "to" => [
+ local_user_1.ap_id,
+ local_user_2.ap_id,
+ "https://www.w3.org/ns/activitystreams#Public"
+ ]
+ }
+
+ {:ok, job} = Pleroma.Web.Federator.incoming_ap_doc(params)
+ {:ok, remote_activity} = ObanHelpers.perform(job)
+
+ %{locals: [id1, id2], remote: remote_activity.id, context: context}
+ end
+
describe "status with restrict unauthenticated activities for local and remote" do
setup do: local_and_remote_activities()
@@ -957,6 +1000,230 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
end
end
+ describe "getting status contexts restricted unauthenticated for local and remote" do
+ setup do: local_and_remote_context_activities()
+
+ setup do: clear_config([:restrict_unauthenticated, :activities, :local], true)
+
+ setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true)
+
+ test "if user is unauthenticated", %{conn: conn, locals: [post_id, _]} do
+ res_conn = get(conn, "/api/v1/statuses/#{post_id}/context")
+
+ assert json_response_and_validate_schema(res_conn, 200) == %{
+ "ancestors" => [],
+ "descendants" => []
+ }
+ end
+
+ test "if user is unauthenticated reply", %{conn: conn, locals: [_, reply_id]} do
+ res_conn = get(conn, "/api/v1/statuses/#{reply_id}/context")
+
+ assert json_response_and_validate_schema(res_conn, 200) == %{
+ "ancestors" => [],
+ "descendants" => []
+ }
+ end
+
+ test "if user is authenticated", %{locals: [post_id, reply_id], remote: remote_reply_id} do
+ %{conn: conn} = oauth_access(["read"])
+ res_conn = get(conn, "/api/v1/statuses/#{post_id}/context")
+
+ %{"ancestors" => [], "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert reply_id in descendant_ids
+ assert remote_reply_id in descendant_ids
+ end
+
+ test "if user is authenticated reply", %{locals: [post_id, reply_id], remote: remote_reply_id} do
+ %{conn: conn} = oauth_access(["read"])
+ res_conn = get(conn, "/api/v1/statuses/#{reply_id}/context")
+
+ %{"ancestors" => ancestors, "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ ancestor_ids =
+ ancestors
+ |> Enum.map(& &1["id"])
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert post_id in ancestor_ids
+ assert remote_reply_id in descendant_ids
+ end
+ end
+
+ describe "getting status contexts restricted unauthenticated for local" do
+ setup do: local_and_remote_context_activities()
+
+ setup do: clear_config([:restrict_unauthenticated, :activities, :local], true)
+
+ setup do: clear_config([:restrict_unauthenticated, :activities, :remote], false)
+
+ test "if user is unauthenticated", %{
+ conn: conn,
+ locals: [post_id, reply_id],
+ remote: remote_reply_id
+ } do
+ res_conn = get(conn, "/api/v1/statuses/#{post_id}/context")
+
+ %{"ancestors" => [], "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert reply_id not in descendant_ids
+ assert remote_reply_id in descendant_ids
+ end
+
+ test "if user is unauthenticated reply", %{
+ conn: conn,
+ locals: [post_id, reply_id],
+ remote: remote_reply_id
+ } do
+ res_conn = get(conn, "/api/v1/statuses/#{reply_id}/context")
+
+ %{"ancestors" => ancestors, "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ ancestor_ids =
+ ancestors
+ |> Enum.map(& &1["id"])
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert post_id not in ancestor_ids
+ assert remote_reply_id in descendant_ids
+ end
+
+ test "if user is authenticated", %{locals: [post_id, reply_id], remote: remote_reply_id} do
+ %{conn: conn} = oauth_access(["read"])
+ res_conn = get(conn, "/api/v1/statuses/#{post_id}/context")
+
+ %{"ancestors" => [], "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert reply_id in descendant_ids
+ assert remote_reply_id in descendant_ids
+ end
+
+ test "if user is authenticated reply", %{locals: [post_id, reply_id], remote: remote_reply_id} do
+ %{conn: conn} = oauth_access(["read"])
+ res_conn = get(conn, "/api/v1/statuses/#{reply_id}/context")
+
+ %{"ancestors" => ancestors, "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ ancestor_ids =
+ ancestors
+ |> Enum.map(& &1["id"])
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert post_id in ancestor_ids
+ assert remote_reply_id in descendant_ids
+ end
+ end
+
+ describe "getting status contexts restricted unauthenticated for remote" do
+ setup do: local_and_remote_context_activities()
+
+ setup do: clear_config([:restrict_unauthenticated, :activities, :local], false)
+
+ setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true)
+
+ test "if user is unauthenticated", %{
+ conn: conn,
+ locals: [post_id, reply_id],
+ remote: remote_reply_id
+ } do
+ res_conn = get(conn, "/api/v1/statuses/#{post_id}/context")
+
+ %{"ancestors" => [], "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert reply_id in descendant_ids
+ assert remote_reply_id not in descendant_ids
+ end
+
+ test "if user is unauthenticated reply", %{
+ conn: conn,
+ locals: [post_id, reply_id],
+ remote: remote_reply_id
+ } do
+ res_conn = get(conn, "/api/v1/statuses/#{reply_id}/context")
+
+ %{"ancestors" => ancestors, "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ ancestor_ids =
+ ancestors
+ |> Enum.map(& &1["id"])
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert post_id in ancestor_ids
+ assert remote_reply_id not in descendant_ids
+ end
+
+ test "if user is authenticated", %{locals: [post_id, reply_id], remote: remote_reply_id} do
+ %{conn: conn} = oauth_access(["read"])
+ res_conn = get(conn, "/api/v1/statuses/#{post_id}/context")
+
+ %{"ancestors" => [], "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ reply_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert reply_id in reply_ids
+ assert remote_reply_id in reply_ids
+ end
+
+ test "if user is authenticated reply", %{locals: [post_id, reply_id], remote: remote_reply_id} do
+ %{conn: conn} = oauth_access(["read"])
+ res_conn = get(conn, "/api/v1/statuses/#{reply_id}/context")
+
+ %{"ancestors" => ancestors, "descendants" => descendants} =
+ json_response_and_validate_schema(res_conn, 200)
+
+ ancestor_ids =
+ ancestors
+ |> Enum.map(& &1["id"])
+
+ descendant_ids =
+ descendants
+ |> Enum.map(& &1["id"])
+
+ assert post_id in ancestor_ids
+ assert remote_reply_id in descendant_ids
+ end
+ end
+
describe "deleting a status" do
test "when you created it" do
%{user: author, conn: conn} = oauth_access(["write:statuses"])
From e5e76ec44559af62eb56043add0489c61e6c1ee5 Mon Sep 17 00:00:00 2001
From: Faried Nawaz
Date: Fri, 10 Feb 2023 01:32:32 +0500
Subject: [PATCH 091/199] cleaner ecto query to handle restrict_unauthenticated
for activities
This fix is for this case:
config :pleroma, :restrict_unauthenticated,
activities: %{local: true, remote: true}
---
lib/pleroma/web/activity_pub/activity_pub.ex | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index f1a12d22d..3979d418e 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -1222,8 +1222,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
cond do
local and remote ->
- # is there a better way to handle this?
- from(activity in query, where: 1 == 0)
+ from(activity in query, where: false)
local ->
from(activity in query, where: activity.local == false)
From 11ce81d4af6b428fabb9d4c6f0098d786a21487b Mon Sep 17 00:00:00 2001
From: faried nawaz
Date: Fri, 28 Jul 2023 18:49:05 +0500
Subject: [PATCH 092/199] add changelog entry
---
changelog.d/3801.fix | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/3801.fix
diff --git a/changelog.d/3801.fix b/changelog.d/3801.fix
new file mode 100644
index 000000000..8c2ec0199
--- /dev/null
+++ b/changelog.d/3801.fix
@@ -0,0 +1 @@
+Filter context activities using Visibility.visible_for_user?
From 18a0c923d0da4c8fb6e33b383dabd1d06bb22968 Mon Sep 17 00:00:00 2001
From: Mark Felder
Date: Thu, 3 Aug 2023 13:08:37 -0400
Subject: [PATCH 093/199] Resolve information disclosure vulnerability through
emoji pack archive download endpoint
The pack name has been sanitized so an attacker cannot upload a media
file called pack.json with their own handcrafted list of emoji files as
arbitrary files on the filesystem and then call the emoji pack archive
download endpoint with a pack name crafted to the location of the media
file they uploaded which tricks Pleroma into generating a zip file of
the target files the attacker wants to download.
The attack only works if the Pleroma instance does not have the
AnonymizeFilename upload filter enabled, which is currently the default.
Reported by: graf@poast.org
---
changelog.d/emoji-pack-sanitization.security | 1 +
lib/pleroma/emoji/pack.ex | 1 +
test/pleroma/emoji/pack_test.exs | 4 ++++
3 files changed, 6 insertions(+)
create mode 100644 changelog.d/emoji-pack-sanitization.security
diff --git a/changelog.d/emoji-pack-sanitization.security b/changelog.d/emoji-pack-sanitization.security
new file mode 100644
index 000000000..f3218abd4
--- /dev/null
+++ b/changelog.d/emoji-pack-sanitization.security
@@ -0,0 +1 @@
+Emoji pack loader sanitizes pack names
diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex
index a361ea200..6e58f8898 100644
--- a/lib/pleroma/emoji/pack.ex
+++ b/lib/pleroma/emoji/pack.ex
@@ -285,6 +285,7 @@ defmodule Pleroma.Emoji.Pack do
@spec load_pack(String.t()) :: {:ok, t()} | {:error, :file.posix()}
def load_pack(name) do
+ name = Path.basename(name)
pack_file = Path.join([emoji_path(), name, "pack.json"])
with {:ok, _} <- File.stat(pack_file),
diff --git a/test/pleroma/emoji/pack_test.exs b/test/pleroma/emoji/pack_test.exs
index 18b99da75..00001abfc 100644
--- a/test/pleroma/emoji/pack_test.exs
+++ b/test/pleroma/emoji/pack_test.exs
@@ -90,4 +90,8 @@ defmodule Pleroma.Emoji.PackTest do
assert updated_pack.files_count == 1
end
+
+ test "load_pack/1 ignores path traversal in a forged pack name", %{pack: pack} do
+ assert {:ok, ^pack} = Pack.load_pack("../../../../../dump_pack")
+ end
end
From 2c795094535537a8607cc0d3b7f076a609636f40 Mon Sep 17 00:00:00 2001
From: Mark Felder
Date: Thu, 3 Aug 2023 13:08:37 -0400
Subject: [PATCH 094/199] Resolve information disclosure vulnerability through
emoji pack archive download endpoint
The pack name has been sanitized so an attacker cannot upload a media
file called pack.json with their own handcrafted list of emoji files as
arbitrary files on the filesystem and then call the emoji pack archive
download endpoint with a pack name crafted to the location of the media
file they uploaded which tricks Pleroma into generating a zip file of
the target files the attacker wants to download.
The attack only works if the Pleroma instance does not have the
AnonymizeFilename upload filter enabled, which is currently the default.
Reported by: graf@poast.org
---
changelog.d/emoji-pack-sanitization.security | 1 +
lib/pleroma/emoji/pack.ex | 1 +
test/pleroma/emoji/pack_test.exs | 4 ++++
3 files changed, 6 insertions(+)
create mode 100644 changelog.d/emoji-pack-sanitization.security
diff --git a/changelog.d/emoji-pack-sanitization.security b/changelog.d/emoji-pack-sanitization.security
new file mode 100644
index 000000000..f3218abd4
--- /dev/null
+++ b/changelog.d/emoji-pack-sanitization.security
@@ -0,0 +1 @@
+Emoji pack loader sanitizes pack names
diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex
index a361ea200..6e58f8898 100644
--- a/lib/pleroma/emoji/pack.ex
+++ b/lib/pleroma/emoji/pack.ex
@@ -285,6 +285,7 @@ defmodule Pleroma.Emoji.Pack do
@spec load_pack(String.t()) :: {:ok, t()} | {:error, :file.posix()}
def load_pack(name) do
+ name = Path.basename(name)
pack_file = Path.join([emoji_path(), name, "pack.json"])
with {:ok, _} <- File.stat(pack_file),
diff --git a/test/pleroma/emoji/pack_test.exs b/test/pleroma/emoji/pack_test.exs
index 18b99da75..00001abfc 100644
--- a/test/pleroma/emoji/pack_test.exs
+++ b/test/pleroma/emoji/pack_test.exs
@@ -90,4 +90,8 @@ defmodule Pleroma.Emoji.PackTest do
assert updated_pack.files_count == 1
end
+
+ test "load_pack/1 ignores path traversal in a forged pack name", %{pack: pack} do
+ assert {:ok, ^pack} = Pack.load_pack("../../../../../dump_pack")
+ end
end
From 4befb3b1d02f32eb2c56f12e4684a7bb3167b0ee Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Thu, 22 Jun 2023 00:46:52 +0200
Subject: [PATCH 095/199] Config: Restrict permissions of OTP config file
---
lib/pleroma/config/release_runtime_provider.ex | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/lib/pleroma/config/release_runtime_provider.ex b/lib/pleroma/config/release_runtime_provider.ex
index 91e5f1a54..9ec0f975e 100644
--- a/lib/pleroma/config/release_runtime_provider.ex
+++ b/lib/pleroma/config/release_runtime_provider.ex
@@ -20,6 +20,20 @@ defmodule Pleroma.Config.ReleaseRuntimeProvider do
with_runtime_config =
if File.exists?(config_path) do
+ #
+ %File.Stat{mode: mode} = File.lstat!(config_path)
+
+ if Bitwise.band(mode, 0o007) > 0 do
+ raise "Configuration at #{config_path} has world-permissions, execute the following: chmod o= #{config_path}"
+ end
+
+ if Bitwise.band(mode, 0o020) > 0 do
+ raise "Configuration at #{config_path} has group-wise write permissions, execute the following: chmod g-w #{config_path}"
+ end
+
+ # Note: Elixir doesn't provides a getuid(2)
+ # so cannot forbid group-read only when config is owned by us
+
runtime_config = Config.Reader.read!(config_path)
with_defaults
From bd7381f2f4139c26d9dbb8aad77ce77be7777532 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Thu, 22 Jun 2023 00:58:05 +0200
Subject: [PATCH 096/199] instance gen: Reduce permissions of pleroma
directories and config files
---
lib/mix/tasks/pleroma/instance.ex | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex
index 5c93f19ff..5d8b254a2 100644
--- a/lib/mix/tasks/pleroma/instance.ex
+++ b/lib/mix/tasks/pleroma/instance.ex
@@ -266,12 +266,20 @@ defmodule Mix.Tasks.Pleroma.Instance do
config_dir = Path.dirname(config_path)
psql_dir = Path.dirname(psql_path)
+ # Note: Distros requiring group read (0o750) on those directories should
+ # pre-create the directories.
[config_dir, psql_dir, static_dir, uploads_dir]
|> Enum.reject(&File.exists?/1)
- |> Enum.map(&File.mkdir_p!/1)
+ |> Enum.each(fn dir ->
+ File.mkdir_p!(dir)
+ File.chmod!(dir, 0o700)
+ end)
shell_info("Writing config to #{config_path}.")
+ # Sadly no fchmod(2) equivalent in Elixir…
+ File.touch!(config_path)
+ File.chmod!(config_path, 0o640)
File.write(config_path, result_config)
shell_info("Writing the postgres script to #{psql_path}.")
File.write(psql_path, result_psql)
@@ -290,8 +298,7 @@ defmodule Mix.Tasks.Pleroma.Instance do
else
shell_error(
"The task would have overwritten the following files:\n" <>
- (Enum.map(will_overwrite, &"- #{&1}\n") |> Enum.join("")) <>
- "Rerun with `--force` to overwrite them."
+ Enum.map_join(will_overwrite, &"- #{&1}\n") <> "Rerun with `--force` to overwrite them."
)
end
end
From 22df32b3f5cfe9fe0a4a97ff799df72c091b676e Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Thu, 22 Jun 2023 01:00:25 +0200
Subject: [PATCH 097/199] changelog: Entry for config permissions restrictions
Closes: https://git.pleroma.social/pleroma/pleroma/-/issues/3135
---
changelog.d/otp_perms.security | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/otp_perms.security
diff --git a/changelog.d/otp_perms.security b/changelog.d/otp_perms.security
new file mode 100644
index 000000000..a3da1c677
--- /dev/null
+++ b/changelog.d/otp_perms.security
@@ -0,0 +1 @@
+- Reduced permissions of config files and directories, distros requiring greater permissions like group-read need to pre-create the directories
\ No newline at end of file
From 76e408e42d1da123a955b85490f05f6d810172f9 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 4 Aug 2023 07:16:50 +0200
Subject: [PATCH 098/199] release_runtime_provider_test: chmod config for
hardened permissions
Git doesn't manages file permissions precisely enough for us.
---
test/pleroma/config/release_runtime_provider_test.exs | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/test/pleroma/config/release_runtime_provider_test.exs b/test/pleroma/config/release_runtime_provider_test.exs
index 4e0d4c838..8ff578e63 100644
--- a/test/pleroma/config/release_runtime_provider_test.exs
+++ b/test/pleroma/config/release_runtime_provider_test.exs
@@ -17,6 +17,8 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
end
test "merged runtime config" do
+ assert :ok == File.chmod!("test/fixtures/config/temp.secret.exs", 0o640)
+
merged =
ReleaseRuntimeProvider.load([], config_path: "test/fixtures/config/temp.secret.exs")
@@ -25,6 +27,8 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
end
test "merged exported config" do
+ assert :ok == File.chmod!("test/fixtures/config/temp.exported_from_db.secret.exs", 0o640)
+
ExUnit.CaptureIO.capture_io(fn ->
merged =
ReleaseRuntimeProvider.load([],
@@ -37,6 +41,9 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
end
test "runtime config is merged with exported config" do
+ assert :ok == File.chmod!("test/fixtures/config/temp.secret.exs", 0o640)
+ assert :ok == File.chmod!("test/fixtures/config/temp.exported_from_db.secret.exs", 0o640)
+
merged =
ReleaseRuntimeProvider.load([],
config_path: "test/fixtures/config/temp.secret.exs",
From c37561214a803f9011d5ec6af8b8c07e547c19ff Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 4 Aug 2023 06:49:19 +0200
Subject: [PATCH 099/199] Force the use of amd64 runners for jobs using ci-base
---
.gitlab-ci.yml | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8b0381d11..91e568a32 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,7 +32,13 @@ before_script:
after_script:
- rm -rf _build/*/lib/pleroma
+.using-ci-base:
+ tags:
+ - amd64
+
build:
+ extends:
+ - .using-ci-base
stage: build
only:
changes: &build_changes_policy
@@ -44,6 +50,8 @@ build:
- mix compile --force
spec-build:
+ extends:
+ - .using-ci-base
stage: test
only:
changes:
@@ -57,6 +65,8 @@ spec-build:
- mix pleroma.openapi_spec spec.json
benchmark:
+ extends:
+ - .using-ci-base
stage: benchmark
when: manual
variables:
@@ -71,6 +81,8 @@ benchmark:
- mix pleroma.load_testing
unit-testing:
+ extends:
+ - .using-ci-base
stage: test
only:
changes: *build_changes_policy
@@ -94,6 +106,8 @@ unit-testing:
path: coverage.xml
unit-testing-erratic:
+ extends:
+ - .using-ci-base
stage: test
retry: 2
allow_failure: true
@@ -129,6 +143,8 @@ unit-testing-erratic:
# - mix test --trace --only federated
unit-testing-rum:
+ extends:
+ - .using-ci-base
stage: test
only:
changes: *build_changes_policy
@@ -162,6 +178,8 @@ lint:
- mix format --check-formatted
analysis:
+ extends:
+ - .using-ci-base
stage: test
only:
changes: *build_changes_policy
From 5ac2b7417d052a493b38ee05b393ae7c78e89484 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 4 Aug 2023 09:16:08 +0200
Subject: [PATCH 100/199] test: Fix warnings
---
.../activity_pub/transmogrifier/emoji_react_handling_test.exs | 2 +-
test/pleroma/web/mastodon_api/update_credentials_test.exs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
index 9d99df27c..83bf59c6f 100644
--- a/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier/emoji_react_handling_test.exs
@@ -65,7 +65,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.EmojiReactHandlingTest do
object = Object.get_by_ap_id(data["object"])
assert object.data["reaction_count"] == 1
- assert match?([[emoji, _]], object.data["reactions"])
+ assert match?([[^emoji, _]], object.data["reactions"])
end
test "it reject invalid emoji reactions" do
diff --git a/test/pleroma/web/mastodon_api/update_credentials_test.exs b/test/pleroma/web/mastodon_api/update_credentials_test.exs
index 57fa0f047..40f79d103 100644
--- a/test/pleroma/web/mastodon_api/update_credentials_test.exs
+++ b/test/pleroma/web/mastodon_api/update_credentials_test.exs
@@ -375,7 +375,7 @@ defmodule Pleroma.Web.MastodonAPI.UpdateCredentialsTest do
"pleroma_background_image" => new_background_oversized
})
- assert user_response = json_response_and_validate_schema(res, 413)
+ assert _user_response = json_response_and_validate_schema(res, 413)
assert user.background == %{}
clear_config([:instance, :upload_limit], upload_limit)
From 57f74537486cf7f721679f125741de9008478b00 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 4 Aug 2023 05:13:28 +0200
Subject: [PATCH 101/199] Release 2.5.3
---
CHANGELOG.md | 6 ++++++
mix.exs | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f6fc6aaee..468ec1012 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
+## 2.5.3
+
+### Security
+- Emoji pack loader sanitizes pack names
+- Reduced permissions of config files and directories, distros requiring greater permissions like group-read need to pre-create the directories
+
## 2.5.2
### Security
diff --git a/mix.exs b/mix.exs
index 79fd9c9ef..d1cdb151d 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("2.5.2"),
+ version: version("2.5.3"),
elixir: "~> 1.11",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
From 8cc8100120abdbf26cfe4cdac2c0a012d7919e05 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Thu, 22 Jun 2023 00:46:52 +0200
Subject: [PATCH 102/199] Config: Restrict permissions of OTP config file
---
lib/pleroma/config/release_runtime_provider.ex | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/lib/pleroma/config/release_runtime_provider.ex b/lib/pleroma/config/release_runtime_provider.ex
index 91e5f1a54..9ec0f975e 100644
--- a/lib/pleroma/config/release_runtime_provider.ex
+++ b/lib/pleroma/config/release_runtime_provider.ex
@@ -20,6 +20,20 @@ defmodule Pleroma.Config.ReleaseRuntimeProvider do
with_runtime_config =
if File.exists?(config_path) do
+ #
+ %File.Stat{mode: mode} = File.lstat!(config_path)
+
+ if Bitwise.band(mode, 0o007) > 0 do
+ raise "Configuration at #{config_path} has world-permissions, execute the following: chmod o= #{config_path}"
+ end
+
+ if Bitwise.band(mode, 0o020) > 0 do
+ raise "Configuration at #{config_path} has group-wise write permissions, execute the following: chmod g-w #{config_path}"
+ end
+
+ # Note: Elixir doesn't provides a getuid(2)
+ # so cannot forbid group-read only when config is owned by us
+
runtime_config = Config.Reader.read!(config_path)
with_defaults
From 69caedc591bd61029f897f37ef7ecddd470cf935 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Thu, 22 Jun 2023 00:58:05 +0200
Subject: [PATCH 103/199] instance gen: Reduce permissions of pleroma
directories and config files
---
lib/mix/tasks/pleroma/instance.ex | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex
index 5c93f19ff..5d8b254a2 100644
--- a/lib/mix/tasks/pleroma/instance.ex
+++ b/lib/mix/tasks/pleroma/instance.ex
@@ -266,12 +266,20 @@ defmodule Mix.Tasks.Pleroma.Instance do
config_dir = Path.dirname(config_path)
psql_dir = Path.dirname(psql_path)
+ # Note: Distros requiring group read (0o750) on those directories should
+ # pre-create the directories.
[config_dir, psql_dir, static_dir, uploads_dir]
|> Enum.reject(&File.exists?/1)
- |> Enum.map(&File.mkdir_p!/1)
+ |> Enum.each(fn dir ->
+ File.mkdir_p!(dir)
+ File.chmod!(dir, 0o700)
+ end)
shell_info("Writing config to #{config_path}.")
+ # Sadly no fchmod(2) equivalent in Elixir…
+ File.touch!(config_path)
+ File.chmod!(config_path, 0o640)
File.write(config_path, result_config)
shell_info("Writing the postgres script to #{psql_path}.")
File.write(psql_path, result_psql)
@@ -290,8 +298,7 @@ defmodule Mix.Tasks.Pleroma.Instance do
else
shell_error(
"The task would have overwritten the following files:\n" <>
- (Enum.map(will_overwrite, &"- #{&1}\n") |> Enum.join("")) <>
- "Rerun with `--force` to overwrite them."
+ Enum.map_join(will_overwrite, &"- #{&1}\n") <> "Rerun with `--force` to overwrite them."
)
end
end
From 9f0ad901ed4f8f0ad3e1d896fd41d25b93a97d76 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Thu, 22 Jun 2023 01:00:25 +0200
Subject: [PATCH 104/199] changelog: Entry for config permissions restrictions
Closes: https://git.pleroma.social/pleroma/pleroma/-/issues/3135
---
changelog.d/otp_perms.security | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/otp_perms.security
diff --git a/changelog.d/otp_perms.security b/changelog.d/otp_perms.security
new file mode 100644
index 000000000..a3da1c677
--- /dev/null
+++ b/changelog.d/otp_perms.security
@@ -0,0 +1 @@
+- Reduced permissions of config files and directories, distros requiring greater permissions like group-read need to pre-create the directories
\ No newline at end of file
From 65ef8f19c5e21baadfa7daabdbd37fb9a1fbf863 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 4 Aug 2023 07:16:50 +0200
Subject: [PATCH 105/199] release_runtime_provider_test: chmod config for
hardened permissions
Git doesn't manages file permissions precisely enough for us.
---
test/pleroma/config/release_runtime_provider_test.exs | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/test/pleroma/config/release_runtime_provider_test.exs b/test/pleroma/config/release_runtime_provider_test.exs
index e6d10b13e..8d2a93d6c 100644
--- a/test/pleroma/config/release_runtime_provider_test.exs
+++ b/test/pleroma/config/release_runtime_provider_test.exs
@@ -17,6 +17,8 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
end
test "merged runtime config" do
+ assert :ok == File.chmod!("test/fixtures/config/temp.secret.exs", 0o640)
+
merged =
ReleaseRuntimeProvider.load([], config_path: "test/fixtures/config/temp.secret.exs")
@@ -25,6 +27,8 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
end
test "merged exported config" do
+ assert :ok == File.chmod!("test/fixtures/config/temp.exported_from_db.secret.exs", 0o640)
+
ExUnit.CaptureIO.capture_io(fn ->
merged =
ReleaseRuntimeProvider.load([],
@@ -37,6 +41,9 @@ defmodule Pleroma.Config.ReleaseRuntimeProviderTest do
end
test "runtime config is merged with exported config" do
+ assert :ok == File.chmod!("test/fixtures/config/temp.secret.exs", 0o640)
+ assert :ok == File.chmod!("test/fixtures/config/temp.exported_from_db.secret.exs", 0o640)
+
merged =
ReleaseRuntimeProvider.load([],
config_path: "test/fixtures/config/temp.secret.exs",
From 6a0fd77c48946b4b2100585b4f32d125680f5f82 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 4 Aug 2023 05:13:28 +0200
Subject: [PATCH 106/199] Release 2.5.53
---
CHANGELOG.md | 6 ++++++
mix.exs | 2 +-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 42a1bbb8f..87e9c5298 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,6 +18,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
- BREAKING: Support for passwords generated with `crypt(3)` (Gnu Social migration artifact)
+## 2.5.3
+
+### Security
+- Emoji pack loader sanitizes pack names
+- Reduced permissions of config files and directories, distros requiring greater permissions like group-read need to pre-create the directories
+
## 2.5.2
### Security
diff --git a/mix.exs b/mix.exs
index fc4e87ee3..115e7113f 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("2.5.52"),
+ version: version("2.5.53"),
elixir: "~> 1.11",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix] ++ Mix.compilers(),
From 0e321698d21766772aa2b54b518dcd76a6abce8c Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 4 Aug 2023 17:09:50 +0200
Subject: [PATCH 107/199] gentoo_otp_en.md: Indicate which install method it
covers
---
changelog.d/gentoo_otp_intro.skip | 0
docs/installation/gentoo_otp_en.md | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 changelog.d/gentoo_otp_intro.skip
diff --git a/changelog.d/gentoo_otp_intro.skip b/changelog.d/gentoo_otp_intro.skip
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/installation/gentoo_otp_en.md b/docs/installation/gentoo_otp_en.md
index 76968eb38..4fafc0c17 100644
--- a/docs/installation/gentoo_otp_en.md
+++ b/docs/installation/gentoo_otp_en.md
@@ -2,7 +2,7 @@
{! backend/installation/otp_vs_from_source.include !}
-A [manual installation guide for gentoo](./gentoo_en.md) is also available.
+This guide covers installation via Gentoo provided packaging. A [manual installation guide for gentoo](./gentoo_en.md) is also available.
## Installation
From ca0859b90f0f3cb9bb369d38d29868de59796c2c Mon Sep 17 00:00:00 2001
From: Mae
Date: Fri, 4 Aug 2023 22:24:17 +0100
Subject: [PATCH 108/199] Prevent XML parser from loading external entities
---
lib/pleroma/web/xml.ex | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/xml.ex b/lib/pleroma/web/xml.ex
index b699446b0..380a80ab8 100644
--- a/lib/pleroma/web/xml.ex
+++ b/lib/pleroma/web/xml.ex
@@ -29,7 +29,10 @@ defmodule Pleroma.Web.XML do
{doc, _rest} =
text
|> :binary.bin_to_list()
- |> :xmerl_scan.string(quiet: true)
+ |> :xmerl_scan.string(
+ quiet: true,
+ fetch_fun: fn _, _ -> raise "Resolving external entities not supported" end
+ )
{:ok, doc}
rescue
From 307692cee8cdd0dbe3e6cf40c1192fcf43910610 Mon Sep 17 00:00:00 2001
From: FloatingGhost
Date: Fri, 4 Aug 2023 22:24:32 +0100
Subject: [PATCH 109/199] Add unit test for external entity loading
---
test/fixtures/xml_external_entities.xml | 3 +++
test/pleroma/web/web_finger_test.exs | 23 +++++++++++++++++++++++
test/pleroma/web/xml_test.exs | 10 ++++++++++
3 files changed, 36 insertions(+)
create mode 100644 test/fixtures/xml_external_entities.xml
create mode 100644 test/pleroma/web/xml_test.exs
diff --git a/test/fixtures/xml_external_entities.xml b/test/fixtures/xml_external_entities.xml
new file mode 100644
index 000000000..d5ff87134
--- /dev/null
+++ b/test/fixtures/xml_external_entities.xml
@@ -0,0 +1,3 @@
+
+ ]>
+&xxe;
diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs
index fafef54fe..be5e08776 100644
--- a/test/pleroma/web/web_finger_test.exs
+++ b/test/pleroma/web/web_finger_test.exs
@@ -180,5 +180,28 @@ defmodule Pleroma.Web.WebFingerTest do
{:ok, _data} = WebFinger.finger("pekorino@pawoo.net")
end
+
+ test "refuses to process XML remote entities" do
+ Tesla.Mock.mock(fn
+ %{
+ url: "https://pawoo.net/.well-known/webfinger?resource=acct:pekorino@pawoo.net"
+ } ->
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/xml_external_entities.xml"),
+ headers: [{"content-type", "application/xrd+xml"}]
+ }}
+
+ %{url: "https://pawoo.net/.well-known/host-meta"} ->
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/pawoo.net_host_meta")
+ }}
+ end)
+
+ assert :error = WebFinger.finger("pekorino@pawoo.net")
+ end
end
end
diff --git a/test/pleroma/web/xml_test.exs b/test/pleroma/web/xml_test.exs
new file mode 100644
index 000000000..89d4709b6
--- /dev/null
+++ b/test/pleroma/web/xml_test.exs
@@ -0,0 +1,10 @@
+defmodule Pleroma.Web.XMLTest do
+ use Pleroma.DataCase, async: true
+
+ alias Pleroma.Web.XML
+
+ test "refuses to load external entities from XML" do
+ data = File.read!("test/fixtures/xml_external_entities.xml")
+ assert(:error == XML.parse_document(data))
+ end
+end
From 6d48b0f1a93a5a44b95497063e885342240fbc27 Mon Sep 17 00:00:00 2001
From: Mark Felder
Date: Fri, 4 Aug 2023 22:44:09 -0400
Subject: [PATCH 110/199] Document and test that XXE processing is disabled
https://vuln.be/post/xxe-in-erlang-and-elixir/
---
changelog.d/akkoma-xml-remote-entities.security | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/akkoma-xml-remote-entities.security
diff --git a/changelog.d/akkoma-xml-remote-entities.security b/changelog.d/akkoma-xml-remote-entities.security
new file mode 100644
index 000000000..b3c86bee1
--- /dev/null
+++ b/changelog.d/akkoma-xml-remote-entities.security
@@ -0,0 +1 @@
+Restrict XML parser from processing external entitites (XXE)
From fc10e07ffbc9d81c7a2ac38a3f9175f2edf2bd1f Mon Sep 17 00:00:00 2001
From: Mae
Date: Fri, 4 Aug 2023 22:24:17 +0100
Subject: [PATCH 111/199] Prevent XML parser from loading external entities
---
lib/pleroma/web/xml.ex | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/xml.ex b/lib/pleroma/web/xml.ex
index b699446b0..380a80ab8 100644
--- a/lib/pleroma/web/xml.ex
+++ b/lib/pleroma/web/xml.ex
@@ -29,7 +29,10 @@ defmodule Pleroma.Web.XML do
{doc, _rest} =
text
|> :binary.bin_to_list()
- |> :xmerl_scan.string(quiet: true)
+ |> :xmerl_scan.string(
+ quiet: true,
+ fetch_fun: fn _, _ -> raise "Resolving external entities not supported" end
+ )
{:ok, doc}
rescue
From 77d57c974ad83fcea77e424d53dc16a27e5d88b6 Mon Sep 17 00:00:00 2001
From: FloatingGhost
Date: Fri, 4 Aug 2023 22:24:32 +0100
Subject: [PATCH 112/199] Add unit test for external entity loading
---
test/fixtures/xml_external_entities.xml | 3 +++
test/pleroma/web/web_finger_test.exs | 23 +++++++++++++++++++++++
test/pleroma/web/xml_test.exs | 10 ++++++++++
3 files changed, 36 insertions(+)
create mode 100644 test/fixtures/xml_external_entities.xml
create mode 100644 test/pleroma/web/xml_test.exs
diff --git a/test/fixtures/xml_external_entities.xml b/test/fixtures/xml_external_entities.xml
new file mode 100644
index 000000000..d5ff87134
--- /dev/null
+++ b/test/fixtures/xml_external_entities.xml
@@ -0,0 +1,3 @@
+
+ ]>
+&xxe;
diff --git a/test/pleroma/web/web_finger_test.exs b/test/pleroma/web/web_finger_test.exs
index fafef54fe..be5e08776 100644
--- a/test/pleroma/web/web_finger_test.exs
+++ b/test/pleroma/web/web_finger_test.exs
@@ -180,5 +180,28 @@ defmodule Pleroma.Web.WebFingerTest do
{:ok, _data} = WebFinger.finger("pekorino@pawoo.net")
end
+
+ test "refuses to process XML remote entities" do
+ Tesla.Mock.mock(fn
+ %{
+ url: "https://pawoo.net/.well-known/webfinger?resource=acct:pekorino@pawoo.net"
+ } ->
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/xml_external_entities.xml"),
+ headers: [{"content-type", "application/xrd+xml"}]
+ }}
+
+ %{url: "https://pawoo.net/.well-known/host-meta"} ->
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/pawoo.net_host_meta")
+ }}
+ end)
+
+ assert :error = WebFinger.finger("pekorino@pawoo.net")
+ end
end
end
diff --git a/test/pleroma/web/xml_test.exs b/test/pleroma/web/xml_test.exs
new file mode 100644
index 000000000..89d4709b6
--- /dev/null
+++ b/test/pleroma/web/xml_test.exs
@@ -0,0 +1,10 @@
+defmodule Pleroma.Web.XMLTest do
+ use Pleroma.DataCase, async: true
+
+ alias Pleroma.Web.XML
+
+ test "refuses to load external entities from XML" do
+ data = File.read!("test/fixtures/xml_external_entities.xml")
+ assert(:error == XML.parse_document(data))
+ end
+end
From cc848b78dca51fcd7e785eb92a7a3a4d5d1c419e Mon Sep 17 00:00:00 2001
From: Mark Felder
Date: Fri, 4 Aug 2023 22:44:09 -0400
Subject: [PATCH 113/199] Document and test that XXE processing is disabled
https://vuln.be/post/xxe-in-erlang-and-elixir/
---
changelog.d/akkoma-xml-remote-entities.security | 1 +
1 file changed, 1 insertion(+)
create mode 100644 changelog.d/akkoma-xml-remote-entities.security
diff --git a/changelog.d/akkoma-xml-remote-entities.security b/changelog.d/akkoma-xml-remote-entities.security
new file mode 100644
index 000000000..b3c86bee1
--- /dev/null
+++ b/changelog.d/akkoma-xml-remote-entities.security
@@ -0,0 +1 @@
+Restrict XML parser from processing external entitites (XXE)
From b631180b38ac63029f08bef137b13231bcf57b59 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Sat, 5 Aug 2023 08:27:42 +0200
Subject: [PATCH 114/199] Release 2.5.4
---
CHANGELOG.md | 5 +++++
changelog.d/akkoma-xml-remote-entities.security | 2 +-
mix.exs | 2 +-
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 468ec1012..9d9aadc6e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
+## 2.5.54
+
+## Security
+- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitary files from the server's filesystem
+
## 2.5.3
### Security
diff --git a/changelog.d/akkoma-xml-remote-entities.security b/changelog.d/akkoma-xml-remote-entities.security
index b3c86bee1..5e6725e5b 100644
--- a/changelog.d/akkoma-xml-remote-entities.security
+++ b/changelog.d/akkoma-xml-remote-entities.security
@@ -1 +1 @@
-Restrict XML parser from processing external entitites (XXE)
+Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitary files from the server's filesystem
diff --git a/mix.exs b/mix.exs
index d1cdb151d..12f721364 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("2.5.3"),
+ version: version("2.5.4"),
elixir: "~> 1.11",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
From 4099ddb3dc5840fa10cff743d87464acf7898a80 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Sat, 5 Aug 2023 08:27:42 +0200
Subject: [PATCH 115/199] Mergeback release 2.5.4
---
CHANGELOG.md | 5 +++++
changelog.d/akkoma-xml-remote-entities.security | 2 +-
mix.exs | 2 +-
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 87e9c5298..65acfad3e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,6 +18,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
- BREAKING: Support for passwords generated with `crypt(3)` (Gnu Social migration artifact)
+## 2.5.4
+
+## Security
+- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitary files from the server's filesystem
+
## 2.5.3
### Security
diff --git a/changelog.d/akkoma-xml-remote-entities.security b/changelog.d/akkoma-xml-remote-entities.security
index b3c86bee1..5e6725e5b 100644
--- a/changelog.d/akkoma-xml-remote-entities.security
+++ b/changelog.d/akkoma-xml-remote-entities.security
@@ -1 +1 @@
-Restrict XML parser from processing external entitites (XXE)
+Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitary files from the server's filesystem
diff --git a/mix.exs b/mix.exs
index 115e7113f..b071e7c7b 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("2.5.53"),
+ version: version("2.5.54"),
elixir: "~> 1.11",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix] ++ Mix.compilers(),
From 48b1e9bdc7382ec6ef33e95f2bd8674ae92f17b2 Mon Sep 17 00:00:00 2001
From: mae
Date: Sat, 5 Aug 2023 14:13:49 +0200
Subject: [PATCH 116/199] Completely disable xml entity resolution
---
.../disable-xml-entity-resolution.security | 1 +
lib/pleroma/web/xml.ex | 2 +-
test/fixtures/xml_billion_laughs.xml | 15 +++++++++++++++
test/pleroma/web/xml_test.exs | 5 +++++
4 files changed, 22 insertions(+), 1 deletion(-)
create mode 100644 changelog.d/disable-xml-entity-resolution.security
create mode 100644 test/fixtures/xml_billion_laughs.xml
diff --git a/changelog.d/disable-xml-entity-resolution.security b/changelog.d/disable-xml-entity-resolution.security
new file mode 100644
index 000000000..db8e12f67
--- /dev/null
+++ b/changelog.d/disable-xml-entity-resolution.security
@@ -0,0 +1 @@
+Disable XML entity resolution completely to fix a dos vulnerability
diff --git a/lib/pleroma/web/xml.ex b/lib/pleroma/web/xml.ex
index 380a80ab8..64329e4ba 100644
--- a/lib/pleroma/web/xml.ex
+++ b/lib/pleroma/web/xml.ex
@@ -31,7 +31,7 @@ defmodule Pleroma.Web.XML do
|> :binary.bin_to_list()
|> :xmerl_scan.string(
quiet: true,
- fetch_fun: fn _, _ -> raise "Resolving external entities not supported" end
+ allow_entities: false
)
{:ok, doc}
diff --git a/test/fixtures/xml_billion_laughs.xml b/test/fixtures/xml_billion_laughs.xml
new file mode 100644
index 000000000..75fb24cae
--- /dev/null
+++ b/test/fixtures/xml_billion_laughs.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+]>
+&lol9;
diff --git a/test/pleroma/web/xml_test.exs b/test/pleroma/web/xml_test.exs
index 89d4709b6..49306430b 100644
--- a/test/pleroma/web/xml_test.exs
+++ b/test/pleroma/web/xml_test.exs
@@ -3,6 +3,11 @@ defmodule Pleroma.Web.XMLTest do
alias Pleroma.Web.XML
+ test "refuses to parse any entities from XML" do
+ data = File.read!("test/fixtures/xml_billion_laughs.xml")
+ assert(:error == XML.parse_document(data))
+ end
+
test "refuses to load external entities from XML" do
data = File.read!("test/fixtures/xml_external_entities.xml")
assert(:error == XML.parse_document(data))
From c298e0165c29b30380466910bb328964a7264c4c Mon Sep 17 00:00:00 2001
From: Cat pony Black
Date: Sat, 5 Aug 2023 13:10:35 +0200
Subject: [PATCH 117/199] Fix config ownership in dockerfile to pass
restriction test
---
Dockerfile | 2 +-
changelog.d/dockerfile-config-perms.fix | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 changelog.d/dockerfile-config-perms.fix
diff --git a/Dockerfile b/Dockerfile
index 310d18104..72c227b76 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -49,7 +49,7 @@ USER pleroma
COPY --from=build --chown=pleroma:0 /release ${HOME}
-COPY ./config/docker.exs /etc/pleroma/config.exs
+COPY --chown=pleroma --chmod=640 ./config/docker.exs /etc/pleroma/config.exs
COPY ./docker-entrypoint.sh ${HOME}
EXPOSE 4000
diff --git a/changelog.d/dockerfile-config-perms.fix b/changelog.d/dockerfile-config-perms.fix
new file mode 100644
index 000000000..49ea5becb
--- /dev/null
+++ b/changelog.d/dockerfile-config-perms.fix
@@ -0,0 +1 @@
+- Fix config ownership in dockerfile to pass restriction test
From d838d1990bf23d452c1cc830629e42e51dbd7047 Mon Sep 17 00:00:00 2001
From: Haelwenn
Date: Wed, 16 Aug 2023 13:34:32 +0000
Subject: [PATCH 118/199] Apply lanodan's suggestion(s) to 1 file(s)
---
lib/pleroma/web/plugs/http_security_plug.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/pleroma/web/plugs/http_security_plug.ex b/lib/pleroma/web/plugs/http_security_plug.ex
index b3dc8a3a6..a3166bc96 100644
--- a/lib/pleroma/web/plugs/http_security_plug.ex
+++ b/lib/pleroma/web/plugs/http_security_plug.ex
@@ -93,7 +93,7 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlug do
img_src = "img-src 'self' data: blob:"
media_src = "media-src 'self'"
- connect_src = ["connect-src 'self' blob: ", ?\s, websocket_url]
+ connect_src = ["connect-src 'self' blob: ", static_url, ?\s, websocket_url]
# Strict multimedia CSP enforcement only when MediaProxy is enabled
{img_src, media_src, connect_src} =
From 3d09bc320efcc68beb9b57fba23b6b9f3dc17905 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 30 Aug 2023 20:34:16 -0400
Subject: [PATCH 119/199] Make lint happy
---
lib/pleroma/web/plugs/http_security_plug.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/pleroma/web/plugs/http_security_plug.ex b/lib/pleroma/web/plugs/http_security_plug.ex
index a3166bc96..5093414c4 100644
--- a/lib/pleroma/web/plugs/http_security_plug.ex
+++ b/lib/pleroma/web/plugs/http_security_plug.ex
@@ -100,6 +100,7 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlug do
if Config.get([:media_proxy, :enabled]) &&
!Config.get([:media_proxy, :proxy_opts, :redirect_on_failure]) do
sources = build_csp_multimedia_source_list()
+
{
[img_src, sources],
[media_src, sources],
@@ -113,7 +114,6 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlug do
}
end
-
connect_src =
if Config.get(:env) == :dev do
[connect_src, " http://localhost:3035/"]
From 3c5ecca37718a1eba05be1f379b8f47362079c65 Mon Sep 17 00:00:00 2001
From: tusooa
Date: Wed, 30 Aug 2023 20:37:45 -0400
Subject: [PATCH 120/199] Skip changelog
---
changelog.d/lint.skip | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 changelog.d/lint.skip
diff --git a/changelog.d/lint.skip b/changelog.d/lint.skip
new file mode 100644
index 000000000..e69de29bb
From 1afde067b12ad0062c1820091ea9b0a680819281 Mon Sep 17 00:00:00 2001
From: Mint
Date: Sat, 2 Sep 2023 01:43:25 +0300
Subject: [PATCH 121/199] CommonAPI: Prevent users from accessing media of
other users
---
.../check-attachment-attribution.security | 1 +
lib/pleroma/scheduled_activity.ex | 6 ++-
lib/pleroma/web/common_api.ex | 12 ++++++
lib/pleroma/web/common_api/activity_draft.ex | 2 +-
lib/pleroma/web/common_api/utils.ex | 27 ++++++------
test/pleroma/web/common_api/utils_test.exs | 43 +++++++++++++------
test/pleroma/web/common_api_test.exs | 18 ++++++++
.../views/scheduled_activity_view_test.exs | 2 +-
.../chat_message_reference_view_test.exs | 2 +-
9 files changed, 82 insertions(+), 31 deletions(-)
create mode 100644 changelog.d/check-attachment-attribution.security
diff --git a/changelog.d/check-attachment-attribution.security b/changelog.d/check-attachment-attribution.security
new file mode 100644
index 000000000..e0e46525b
--- /dev/null
+++ b/changelog.d/check-attachment-attribution.security
@@ -0,0 +1 @@
+CommonAPI: Prevent users from accessing media of other users by creating a status with reused attachment ID
diff --git a/lib/pleroma/scheduled_activity.ex b/lib/pleroma/scheduled_activity.ex
index a7be58512..0ed51ad07 100644
--- a/lib/pleroma/scheduled_activity.ex
+++ b/lib/pleroma/scheduled_activity.ex
@@ -40,7 +40,11 @@ defmodule Pleroma.ScheduledActivity do
%{changes: %{params: %{"media_ids" => media_ids} = params}} = changeset
)
when is_list(media_ids) do
- media_attachments = Utils.attachments_from_ids(%{media_ids: media_ids})
+ media_attachments =
+ Utils.attachments_from_ids(
+ %{media_ids: media_ids},
+ User.get_cached_by_id(changeset.data.user_id)
+ )
params =
params
diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex
index 77b3fa5d2..82c7f70d2 100644
--- a/lib/pleroma/web/common_api.ex
+++ b/lib/pleroma/web/common_api.ex
@@ -33,6 +33,7 @@ defmodule Pleroma.Web.CommonAPI do
def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) do
with maybe_attachment <- opts[:media_id] && Object.get_by_id(opts[:media_id]),
+ :ok <- validate_chat_attachment_attribution(maybe_attachment, user),
:ok <- validate_chat_content_length(content, !!maybe_attachment),
{_, {:ok, chat_message_data, _meta}} <-
{:build_object,
@@ -71,6 +72,17 @@ defmodule Pleroma.Web.CommonAPI do
text
end
+ defp validate_chat_attachment_attribution(nil, _), do: :ok
+
+ defp validate_chat_attachment_attribution(attachment, user) do
+ with :ok <- Object.authorize_access(attachment, user) do
+ :ok
+ else
+ e ->
+ e
+ end
+ end
+
defp validate_chat_content_length(_, true), do: :ok
defp validate_chat_content_length(nil, false), do: {:error, :no_content}
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 9af635da8..63ed48a27 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -111,7 +111,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
end
defp attachments(%{params: params} = draft) do
- attachments = Utils.attachments_from_ids(params)
+ attachments = Utils.attachments_from_ids(params, draft.user)
draft = %__MODULE__{draft | attachments: attachments}
case Utils.validate_attachments_count(attachments) do
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index b9fe0224c..0f394e951 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -23,21 +23,21 @@ 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)
+ def attachments_from_ids(%{media_ids: ids, descriptions: desc}, user) do
+ attachments_from_ids_descs(ids, desc, user)
end
- def attachments_from_ids(%{media_ids: ids}) do
- attachments_from_ids_no_descs(ids)
+ def attachments_from_ids(%{media_ids: ids}, user) do
+ attachments_from_ids_no_descs(ids, user)
end
- def attachments_from_ids(_), do: []
+ def attachments_from_ids(_, _), do: []
- def attachments_from_ids_no_descs([]), do: []
+ def attachments_from_ids_no_descs([], _), do: []
- def attachments_from_ids_no_descs(ids) do
+ def attachments_from_ids_no_descs(ids, user) do
Enum.map(ids, fn media_id ->
- case get_attachment(media_id) do
+ case get_attachment(media_id, user) do
%Object{data: data} -> data
_ -> nil
end
@@ -45,22 +45,23 @@ defmodule Pleroma.Web.CommonAPI.Utils do
|> Enum.reject(&is_nil/1)
end
- def attachments_from_ids_descs([], _), do: []
+ def attachments_from_ids_descs([], _, _), do: []
- def attachments_from_ids_descs(ids, descs_str) do
+ def attachments_from_ids_descs(ids, descs_str, user) do
{_, descs} = Jason.decode(descs_str)
Enum.map(ids, fn media_id ->
- with %Object{data: data} <- get_attachment(media_id) do
+ with %Object{data: data} <- get_attachment(media_id, user) do
Map.put(data, "name", descs[media_id])
end
end)
|> Enum.reject(&is_nil/1)
end
- defp get_attachment(media_id) do
+ defp get_attachment(media_id, user) do
with %Object{data: data} = object <- Repo.get(Object, media_id),
- %{"type" => type} when type in Pleroma.Constants.upload_object_types() <- data do
+ %{"type" => type} when type in Pleroma.Constants.upload_object_types() <- data,
+ :ok <- Object.authorize_access(object, user) do
object
else
_ -> nil
diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs
index ca5b92683..4ce039d64 100644
--- a/test/pleroma/web/common_api/utils_test.exs
+++ b/test/pleroma/web/common_api/utils_test.exs
@@ -586,46 +586,61 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
end
end
- describe "attachments_from_ids_descs/2" do
+ describe "attachments_from_ids_descs/3" do
test "returns [] when attachment ids is empty" do
- assert Utils.attachments_from_ids_descs([], "{}") == []
+ assert Utils.attachments_from_ids_descs([], "{}", nil) == []
end
test "returns list attachments with desc" do
- object = insert(:attachment)
+ user = insert(:user)
+ object = insert(:attachment, %{user: user})
desc = Jason.encode!(%{object.id => "test-desc"})
- assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc) == [
+ assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc, user) == [
Map.merge(object.data, %{"name" => "test-desc"})
]
end
end
- describe "attachments_from_ids/1" do
+ describe "attachments_from_ids/2" do
test "returns attachments with descs" do
- object = insert(:attachment)
+ user = insert(:user)
+ object = insert(:attachment, %{user: user})
desc = Jason.encode!(%{object.id => "test-desc"})
- assert Utils.attachments_from_ids(%{
- media_ids: ["#{object.id}"],
- descriptions: desc
- }) == [
+ assert Utils.attachments_from_ids(
+ %{
+ media_ids: ["#{object.id}"],
+ descriptions: desc
+ },
+ user
+ ) == [
Map.merge(object.data, %{"name" => "test-desc"})
]
end
test "returns attachments without descs" do
- object = insert(:attachment)
- assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == [object.data]
+ user = insert(:user)
+ object = insert(:attachment, %{user: user})
+ assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}, user) == [object.data]
end
test "returns [] when not pass media_ids" do
- assert Utils.attachments_from_ids(%{}) == []
+ assert Utils.attachments_from_ids(%{}, nil) == []
+ end
+
+ test "returns [] when media_ids not belong to current user" do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ object = insert(:attachment, %{user: user})
+
+ assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}, user2) == []
end
test "checks that the object is of upload type" do
object = insert(:note)
- assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}) == []
+ assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}, nil) == []
end
end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 968e11a14..0d76d6581 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -279,6 +279,24 @@ defmodule Pleroma.Web.CommonAPITest do
assert {:reject, "[KeywordPolicy] Matches with rejected keyword"} ==
CommonAPI.post_chat_message(author, recipient, "GNO/Linux")
end
+
+ test "it reject messages with attachments not belonging to user" do
+ author = insert(:user)
+ not_author = insert(:user)
+ recipient = author
+
+ attachment = insert(:attachment, %{user: not_author})
+
+ {:error, message} =
+ CommonAPI.post_chat_message(
+ author,
+ recipient,
+ "123",
+ media_id: attachment.id
+ )
+
+ assert message == :forbidden
+ end
end
describe "unblocking" do
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 e5e510d33..07a65a3bc 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
@@ -48,7 +48,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityViewTest do
id: to_string(scheduled_activity.id),
media_attachments:
%{media_ids: [upload.id]}
- |> Utils.attachments_from_ids()
+ |> Utils.attachments_from_ids(user)
|> Enum.map(&StatusView.render("attachment.json", %{attachment: &1})),
params: %{
in_reply_to_id: to_string(activity.id),
diff --git a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs b/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
index 017c9c5c0..7ab3f5acd 100644
--- a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
+++ b/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
@@ -24,7 +24,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do
filename: "an_image.jpg"
}
- {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
+ {:ok, upload} = ActivityPub.upload(file, actor: recipient.ap_id)
{:ok, activity} =
CommonAPI.post_chat_message(user, recipient, "kippis :firefox:", idempotency_key: "123")
From 535a5ecad04c9c49105a77e7025fe9f4b4d23ba6 Mon Sep 17 00:00:00 2001
From: Mint
Date: Sat, 2 Sep 2023 01:43:25 +0300
Subject: [PATCH 122/199] CommonAPI: Prevent users from accessing media of
other users
commit 1afde067b12ad0062c1820091ea9b0a680819281 upstream.
---
.../check-attachment-attribution.security | 1 +
lib/pleroma/scheduled_activity.ex | 6 ++-
lib/pleroma/web/common_api.ex | 12 ++++++
lib/pleroma/web/common_api/activity_draft.ex | 2 +-
lib/pleroma/web/common_api/utils.ex | 31 ++++++++------
test/pleroma/web/common_api/utils_test.exs | 41 +++++++++++++------
test/pleroma/web/common_api_test.exs | 18 ++++++++
.../views/scheduled_activity_view_test.exs | 2 +-
.../chat_message_reference_view_test.exs | 2 +-
9 files changed, 85 insertions(+), 30 deletions(-)
create mode 100644 changelog.d/check-attachment-attribution.security
diff --git a/changelog.d/check-attachment-attribution.security b/changelog.d/check-attachment-attribution.security
new file mode 100644
index 000000000..e0e46525b
--- /dev/null
+++ b/changelog.d/check-attachment-attribution.security
@@ -0,0 +1 @@
+CommonAPI: Prevent users from accessing media of other users by creating a status with reused attachment ID
diff --git a/lib/pleroma/scheduled_activity.ex b/lib/pleroma/scheduled_activity.ex
index a7be58512..0ed51ad07 100644
--- a/lib/pleroma/scheduled_activity.ex
+++ b/lib/pleroma/scheduled_activity.ex
@@ -40,7 +40,11 @@ defmodule Pleroma.ScheduledActivity do
%{changes: %{params: %{"media_ids" => media_ids} = params}} = changeset
)
when is_list(media_ids) do
- media_attachments = Utils.attachments_from_ids(%{media_ids: media_ids})
+ media_attachments =
+ Utils.attachments_from_ids(
+ %{media_ids: media_ids},
+ User.get_cached_by_id(changeset.data.user_id)
+ )
params =
params
diff --git a/lib/pleroma/web/common_api.ex b/lib/pleroma/web/common_api.ex
index 89cc0d6fe..44eb00075 100644
--- a/lib/pleroma/web/common_api.ex
+++ b/lib/pleroma/web/common_api.ex
@@ -33,6 +33,7 @@ defmodule Pleroma.Web.CommonAPI do
def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) do
with maybe_attachment <- opts[:media_id] && Object.get_by_id(opts[:media_id]),
+ :ok <- validate_chat_attachment_attribution(maybe_attachment, user),
:ok <- validate_chat_content_length(content, !!maybe_attachment),
{_, {:ok, chat_message_data, _meta}} <-
{:build_object,
@@ -71,6 +72,17 @@ defmodule Pleroma.Web.CommonAPI do
text
end
+ defp validate_chat_attachment_attribution(nil, _), do: :ok
+
+ defp validate_chat_attachment_attribution(attachment, user) do
+ with :ok <- Object.authorize_access(attachment, user) do
+ :ok
+ else
+ e ->
+ e
+ end
+ end
+
defp validate_chat_content_length(_, true), do: :ok
defp validate_chat_content_length(nil, false), do: {:error, :no_content}
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 9af635da8..63ed48a27 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -111,7 +111,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
end
defp attachments(%{params: params} = draft) do
- attachments = Utils.attachments_from_ids(params)
+ attachments = Utils.attachments_from_ids(params, draft.user)
draft = %__MODULE__{draft | attachments: attachments}
case Utils.validate_attachments_count(attachments) do
diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex
index ff0814329..6410815ea 100644
--- a/lib/pleroma/web/common_api/utils.ex
+++ b/lib/pleroma/web/common_api/utils.ex
@@ -23,21 +23,21 @@ 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)
+ def attachments_from_ids(%{media_ids: ids, descriptions: desc}, user) do
+ attachments_from_ids_descs(ids, desc, user)
end
- def attachments_from_ids(%{media_ids: ids}) do
- attachments_from_ids_no_descs(ids)
+ def attachments_from_ids(%{media_ids: ids}, user) do
+ attachments_from_ids_no_descs(ids, user)
end
- def attachments_from_ids(_), do: []
+ def attachments_from_ids(_, _), do: []
- def attachments_from_ids_no_descs([]), do: []
+ def attachments_from_ids_no_descs([], _), do: []
- def attachments_from_ids_no_descs(ids) do
+ def attachments_from_ids_no_descs(ids, user) do
Enum.map(ids, fn media_id ->
- case get_attachment(media_id) do
+ case get_attachment(media_id, user) do
%Object{data: data} -> data
_ -> nil
end
@@ -45,21 +45,26 @@ defmodule Pleroma.Web.CommonAPI.Utils do
|> Enum.reject(&is_nil/1)
end
- def attachments_from_ids_descs([], _), do: []
+ def attachments_from_ids_descs([], _, _), do: []
- def attachments_from_ids_descs(ids, descs_str) do
+ def attachments_from_ids_descs(ids, descs_str, user) do
{_, descs} = Jason.decode(descs_str)
Enum.map(ids, fn media_id ->
- with %Object{data: data} <- get_attachment(media_id) do
+ with %Object{data: data} <- get_attachment(media_id, user) do
Map.put(data, "name", descs[media_id])
end
end)
|> Enum.reject(&is_nil/1)
end
- defp get_attachment(media_id) do
- Repo.get(Object, media_id)
+ defp get_attachment(media_id, user) do
+ with %Object{data: _data} = object <- Repo.get(Object, media_id),
+ :ok <- Object.authorize_access(object, user) do
+ object
+ else
+ _ -> nil
+ end
end
@spec get_to_and_cc(ActivityDraft.t()) :: {list(String.t()), list(String.t())}
diff --git a/test/pleroma/web/common_api/utils_test.exs b/test/pleroma/web/common_api/utils_test.exs
index d309c6ded..c52d3e9c5 100644
--- a/test/pleroma/web/common_api/utils_test.exs
+++ b/test/pleroma/web/common_api/utils_test.exs
@@ -586,41 +586,56 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do
end
end
- describe "attachments_from_ids_descs/2" do
+ describe "attachments_from_ids_descs/3" do
test "returns [] when attachment ids is empty" do
- assert Utils.attachments_from_ids_descs([], "{}") == []
+ assert Utils.attachments_from_ids_descs([], "{}", nil) == []
end
test "returns list attachments with desc" do
- object = insert(:note)
+ user = insert(:user)
+ object = insert(:note, %{user: user})
desc = Jason.encode!(%{object.id => "test-desc"})
- assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc) == [
+ assert Utils.attachments_from_ids_descs(["#{object.id}", "34"], desc, user) == [
Map.merge(object.data, %{"name" => "test-desc"})
]
end
end
- describe "attachments_from_ids/1" do
+ describe "attachments_from_ids/2" do
test "returns attachments with descs" do
- object = insert(:note)
+ user = insert(:user)
+ object = insert(:note, %{user: user})
desc = Jason.encode!(%{object.id => "test-desc"})
- assert Utils.attachments_from_ids(%{
- media_ids: ["#{object.id}"],
- descriptions: desc
- }) == [
+ assert Utils.attachments_from_ids(
+ %{
+ media_ids: ["#{object.id}"],
+ descriptions: desc
+ },
+ user
+ ) == [
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]
+ user = insert(:user)
+ object = insert(:note, %{user: user})
+ assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}, user) == [object.data]
end
test "returns [] when not pass media_ids" do
- assert Utils.attachments_from_ids(%{}) == []
+ assert Utils.attachments_from_ids(%{}, nil) == []
+ end
+
+ test "returns [] when media_ids not belong to current user" do
+ user = insert(:user)
+ user2 = insert(:user)
+
+ object = insert(:attachment, %{user: user})
+
+ assert Utils.attachments_from_ids(%{media_ids: ["#{object.id}"]}, user2) == []
end
end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 5c9103e9f..e60691995 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -279,6 +279,24 @@ defmodule Pleroma.Web.CommonAPITest do
assert {:reject, "[KeywordPolicy] Matches with rejected keyword"} ==
CommonAPI.post_chat_message(author, recipient, "GNO/Linux")
end
+
+ test "it reject messages with attachments not belonging to user" do
+ author = insert(:user)
+ not_author = insert(:user)
+ recipient = author
+
+ attachment = insert(:attachment, %{user: not_author})
+
+ {:error, message} =
+ CommonAPI.post_chat_message(
+ author,
+ recipient,
+ "123",
+ media_id: attachment.id
+ )
+
+ assert message == :forbidden
+ end
end
describe "unblocking" do
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 e5e510d33..07a65a3bc 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
@@ -48,7 +48,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityViewTest do
id: to_string(scheduled_activity.id),
media_attachments:
%{media_ids: [upload.id]}
- |> Utils.attachments_from_ids()
+ |> Utils.attachments_from_ids(user)
|> Enum.map(&StatusView.render("attachment.json", %{attachment: &1})),
params: %{
in_reply_to_id: to_string(activity.id),
diff --git a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs b/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
index 017c9c5c0..7ab3f5acd 100644
--- a/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
+++ b/test/pleroma/web/pleroma_api/views/chat_message_reference_view_test.exs
@@ -24,7 +24,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do
filename: "an_image.jpg"
}
- {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
+ {:ok, upload} = ActivityPub.upload(file, actor: recipient.ap_id)
{:ok, activity} =
CommonAPI.post_chat_message(user, recipient, "kippis :firefox:", idempotency_key: "123")
From 385492577d11e9667064d7f7e0dacdc00457064a Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier"
Date: Fri, 23 Dec 2022 18:46:14 +0100
Subject: [PATCH 123/199] mix: version 2.5.5
---
CHANGELOG.md | 7 ++++++-
mix.exs | 2 +-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9d9aadc6e..32ec440de 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,7 +14,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
-## 2.5.54
+## 2.5.5
+
+## Security
+- Prevent users from accessing media of other users by creating a status with reused attachment ID
+
+## 2.5.4
## Security
- Fix XML External Entity (XXE) loading vulnerability allowing to fetch arbitary files from the server's filesystem
diff --git a/mix.exs b/mix.exs
index 12f721364..e2aac0fc5 100644
--- a/mix.exs
+++ b/mix.exs
@@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
def project do
[
app: :pleroma,
- version: version("2.5.4"),
+ version: version("2.5.5"),
elixir: "~> 1.11",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
From 31eb3dc24587ad3715da9fe00886867a6c0bf0c4 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 16:41:30 -0600
Subject: [PATCH 124/199] ObjectValidators: accept "quoteUrl" field
---
.../web/activity_pub/object_validators/common_fields.ex | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
index d580208df..835ed97b7 100644
--- a/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/common_fields.ex
@@ -27,7 +27,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFields do
end
end
- # All objects except Answer and CHatMessage
+ # All objects except Answer and ChatMessage
defmacro object_fields do
quote bind_quoted: binding() do
field(:content, :string)
@@ -58,6 +58,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonFields do
field(:like_count, :integer, default: 0)
field(:announcement_count, :integer, default: 0)
field(:inReplyTo, ObjectValidators.ObjectID)
+ field(:quoteUrl, ObjectValidators.ObjectID)
field(:url, ObjectValidators.BareUri)
field(:likes, {:array, ObjectValidators.ObjectID}, default: [])
From 7deda1fa18cb95a588ba66950ac45262c467a7f4 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 17:30:49 -0600
Subject: [PATCH 125/199] Quote post: add fixtures
---
.../quote_post/fedibird_quote_post.json | 52 +++++++++++++++++++
.../quote_post/misskey_quote_post.json | 46 ++++++++++++++++
2 files changed, 98 insertions(+)
create mode 100644 test/fixtures/quote_post/fedibird_quote_post.json
create mode 100644 test/fixtures/quote_post/misskey_quote_post.json
diff --git a/test/fixtures/quote_post/fedibird_quote_post.json b/test/fixtures/quote_post/fedibird_quote_post.json
new file mode 100644
index 000000000..ebf383356
--- /dev/null
+++ b/test/fixtures/quote_post/fedibird_quote_post.json
@@ -0,0 +1,52 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ {
+ "ostatus": "http://ostatus.org#",
+ "atomUri": "ostatus:atomUri",
+ "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+ "conversation": "ostatus:conversation",
+ "sensitive": "as:sensitive",
+ "toot": "http://joinmastodon.org/ns#",
+ "votersCount": "toot:votersCount",
+ "expiry": "toot:expiry"
+ }
+ ],
+ "id": "https://fedibird.com/users/noellabo/statuses/107663670404015196",
+ "type": "Note",
+ "summary": null,
+ "inReplyTo": null,
+ "published": "2022-01-22T02:07:16Z",
+ "url": "https://fedibird.com/@noellabo/107663670404015196",
+ "attributedTo": "https://fedibird.com/users/noellabo",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://fedibird.com/users/noellabo/followers"
+ ],
+ "sensitive": false,
+ "atomUri": "https://fedibird.com/users/noellabo/statuses/107663670404015196",
+ "inReplyToAtomUri": null,
+ "conversation": "tag:fedibird.com,2022-01-22:objectId=107663670404038002:objectType=Conversation",
+ "context": "https://fedibird.com/contexts/107663670404038002",
+ "quoteURL": "https://misskey.io/notes/8vsn2izjwh",
+ "_misskey_quote": "https://misskey.io/notes/8vsn2izjwh",
+ "_misskey_content": "いつの生まれだシトリン",
+ "content": "いつの生まれだシトリン
QT: https://misskey.io/notes/8vsn2izjwh
",
+ "contentMap": {
+ "ja": "いつの生まれだシトリン
QT: https://misskey.io/notes/8vsn2izjwh
"
+ },
+ "attachment": [],
+ "tag": [],
+ "replies": {
+ "id": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies",
+ "type": "Collection",
+ "first": {
+ "type": "CollectionPage",
+ "next": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies?only_other_accounts=true&page=true",
+ "partOf": "https://fedibird.com/users/noellabo/statuses/107663670404015196/replies",
+ "items": []
+ }
+ }
+}
diff --git a/test/fixtures/quote_post/misskey_quote_post.json b/test/fixtures/quote_post/misskey_quote_post.json
new file mode 100644
index 000000000..59f677ca9
--- /dev/null
+++ b/test/fixtures/quote_post/misskey_quote_post.json
@@ -0,0 +1,46 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey.io/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://misskey.io/notes/8vs6ylpfez",
+ "type": "Note",
+ "attributedTo": "https://misskey.io/users/7rkrarq81i",
+ "summary": null,
+ "content": "投稿者の設定によるね
Fanboxについても投稿者によっては過去の投稿は高額なプランに移動してることがある
RE: https://misskey.io/notes/8vs6wxufd0
",
+ "_misskey_content": "投稿者の設定によるね\nFanboxについても投稿者によっては過去の投稿は高額なプランに移動してることがある",
+ "_misskey_quote": "https://misskey.io/notes/8vs6wxufd0",
+ "quoteUrl": "https://misskey.io/notes/8vs6wxufd0",
+ "published": "2022-01-21T16:38:30.243Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://misskey.io/users/7rkrarq81i/followers"
+ ],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
From 795736af16dca77929725e7dd55f5de04a796fdb Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 18:03:22 -0600
Subject: [PATCH 126/199] ObjectValidators: improve quoteUrl compatibility
---
.../article_note_page_validator.ex | 16 +++++++++++++++
.../article_note_page_validator_test.exs | 20 +++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
index 2670e3f17..40bb67934 100644
--- a/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/article_note_page_validator.ex
@@ -76,6 +76,21 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
def fix_attachments(data), do: data
+ defp fix_quote_url(%{"quoteUrl" => _quote_url} = data), do: data
+
+ # Fix for Fedibird
+ # https://github.com/fedibird/mastodon/issues/9
+ defp fix_quote_url(%{"quoteURL" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ # Misskey fallback
+ defp fix_quote_url(%{"_misskey_quote" => quote_url} = data) do
+ Map.put(data, "quoteUrl", quote_url)
+ end
+
+ defp fix_quote_url(data), do: data
+
defp fix(data) do
data
|> CommonFixes.fix_actor()
@@ -84,6 +99,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidator do
|> fix_tag()
|> fix_replies()
|> fix_attachments()
+ |> fix_quote_url()
|> Transmogrifier.fix_emoji()
|> Transmogrifier.fix_content_map()
end
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index c7a62be18..c3cde00b5 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -116,4 +116,24 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
%{valid?: true} = ArticleNotePageValidator.cast_and_validate(note)
end
+
+ test "Fedibird quote post" do
+ insert(:user, ap_id: "https://fedibird.com/users/noellabo")
+
+ data = File.read!("test/fixtures/quote_post/fedibird_quote_post.json") |> Jason.decode!()
+ chg = ArticleNotePageValidator.cast_and_validate(data)
+
+ assert chg.valid?
+ assert chg.changes.quoteUrl == "https://misskey.io/notes/8vsn2izjwh"
+ end
+
+ test "Misskey quote post" do
+ insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i")
+
+ data = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
+ chg = ArticleNotePageValidator.cast_and_validate(data)
+
+ assert chg.valid?
+ assert chg.changes.quoteUrl == "https://misskey.io/notes/8vs6wxufd0"
+ end
end
From b022d6635dad4b2769fbf1fd4b97f77a4cc646b4 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 18:46:58 -0600
Subject: [PATCH 127/199] Transmogrifier: fetch quoted post
---
.../web/activity_pub/transmogrifier.ex | 17 +++++
test/fixtures/tesla_mock/aimu@misskey.io.json | 64 +++++++++++++++++++
.../tesla_mock/misskey.io_8vs6wxufd0.json | 44 +++++++++++++
.../web/activity_pub/transmogrifier_test.exs | 22 +++++++
test/support/http_request_mock.ex | 18 ++++++
5 files changed, 165 insertions(+)
create mode 100644 test/fixtures/tesla_mock/aimu@misskey.io.json
create mode 100644 test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 0e6c429f9..c466271ca 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -166,6 +166,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def fix_in_reply_to(object, _options), do: object
+ def fix_quote(object, options \\ [])
+
+ def fix_quote(%{"quoteUrl" => quote_url} = object, options)
+ when not is_nil(quote_url) do
+ with {:ok, quoted_object} <- get_obj_helper(quote_url, options),
+ %Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do
+ Map.put(object, "quoteUrl", quoted_object.data["id"])
+ else
+ e ->
+ Logger.warn("Couldn't fetch #{inspect(quote_url)}, error: #{inspect(e)}")
+ object
+ end
+ end
+
+ def fix_quote(object, _options), do: object
+
defp prepare_in_reply_to(in_reply_to) do
cond do
is_bitstring(in_reply_to) ->
@@ -454,6 +470,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> strip_internal_fields()
|> fix_type(fetch_options)
|> fix_in_reply_to(fetch_options)
+ |> fix_quote(fetch_options)
data = Map.put(data, "object", object)
options = Keyword.put(options, :local, false)
diff --git a/test/fixtures/tesla_mock/aimu@misskey.io.json b/test/fixtures/tesla_mock/aimu@misskey.io.json
new file mode 100644
index 000000000..9ff4cb6d0
--- /dev/null
+++ b/test/fixtures/tesla_mock/aimu@misskey.io.json
@@ -0,0 +1,64 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey.io/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "type": "Person",
+ "id": "https://misskey.io/users/83ssedkv53",
+ "inbox": "https://misskey.io/users/83ssedkv53/inbox",
+ "outbox": "https://misskey.io/users/83ssedkv53/outbox",
+ "followers": "https://misskey.io/users/83ssedkv53/followers",
+ "following": "https://misskey.io/users/83ssedkv53/following",
+ "sharedInbox": "https://misskey.io/inbox",
+ "endpoints": {
+ "sharedInbox": "https://misskey.io/inbox"
+ },
+ "url": "https://misskey.io/@aimu",
+ "preferredUsername": "aimu",
+ "name": "あいむ",
+ "summary": "わずかな作曲要素 巣穴で独り言
Twitter https://twitter.com/aimu_53
Soundcloud https://soundcloud.com/aimu-53
",
+ "icon": {
+ "type": "Image",
+ "url": "https://s3.arkjp.net/misskey/webpublic-3f7e93c0-34f5-443c-acc0-f415cb2342b4.jpg",
+ "sensitive": false,
+ "name": null
+ },
+ "image": {
+ "type": "Image",
+ "url": "https://s3.arkjp.net/misskey/webpublic-2db63d1d-490b-488b-ab62-c93c285f26b6.png",
+ "sensitive": false,
+ "name": null
+ },
+ "tag": [],
+ "manuallyApprovesFollowers": false,
+ "discoverable": true,
+ "publicKey": {
+ "id": "https://misskey.io/users/83ssedkv53#main-key",
+ "type": "Key",
+ "owner": "https://misskey.io/users/83ssedkv53",
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1ylhePJ6qGHmwHSBP17b\nIosxGaiFKvgDBgZdm8vzvKeRSqJV9uLHfZL3pO/Zt02EwaZd2GohZAtBZEF8DbMA\n3s93WAesvyGF9mjGrYYKlhp/glwyrrrbf+RdD0DLtyDwRRlrxp3pS2lLmv5Tp1Zl\npH+UKpOnNrpQqjHI5P+lEc9bnflzbRrX+UiyLNsVAP80v4wt7SZfT/telrU6mDru\n998UdfhUo7bDKeDsHG1PfLpyhhtfdoZub4kBpkyacHiwAd+CdCjR54Eu7FDwVK3p\nY3JcrT2q5stgMqN1m4QgSL4XAADIotWwDYttTJejM1n9dr+6VWv5bs0F2Q/6gxOp\nu5DQZLk4Q+64U4LWNox6jCMOq3fYe0g7QalJIHnanYQQo+XjoH6S1Aw64gQ3Ip2Y\nZBmZREAOR7GMFVDPFnVnsbCHnIAv16TdgtLgQBAihkWEUuPqITLi8PMu6kMr3uyq\nYkObEfH0TNTcqaiVpoXv791GZLEUV5ROl0FSUANLNkHZZv29xZ5JDOBOR1rNBLyH\ngVtW8rpszYqOXwzX23hh4WsVXfB7YgNvIijwjiaWbzsecleaENGEnLNMiVKVumTj\nmtyTeFJpH0+OaSrUYpemRRJizmqIjklKsNwUEwUb2WcUUg92o56T2obrBkooabZe\nwgSXSKTOcjsR/ju7+AuIyvkCAwEAAQ==\n-----END PUBLIC KEY-----\n"
+ },
+ "isCat": true,
+ "vcard:bday": "5353-05-03"
+}
diff --git a/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json b/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json
new file mode 100644
index 000000000..323ca10ed
--- /dev/null
+++ b/test/fixtures/tesla_mock/misskey.io_8vs6wxufd0.json
@@ -0,0 +1,44 @@
+{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+ "sensitive": "as:sensitive",
+ "Hashtag": "as:Hashtag",
+ "quoteUrl": "as:quoteUrl",
+ "toot": "http://joinmastodon.org/ns#",
+ "Emoji": "toot:Emoji",
+ "featured": "toot:featured",
+ "discoverable": "toot:discoverable",
+ "schema": "http://schema.org#",
+ "PropertyValue": "schema:PropertyValue",
+ "value": "schema:value",
+ "misskey": "https://misskey.io/ns#",
+ "_misskey_content": "misskey:_misskey_content",
+ "_misskey_quote": "misskey:_misskey_quote",
+ "_misskey_reaction": "misskey:_misskey_reaction",
+ "_misskey_votes": "misskey:_misskey_votes",
+ "_misskey_talk": "misskey:_misskey_talk",
+ "isCat": "misskey:isCat",
+ "vcard": "http://www.w3.org/2006/vcard/ns#"
+ }
+ ],
+ "id": "https://misskey.io/notes/8vs6wxufd0",
+ "type": "Note",
+ "attributedTo": "https://misskey.io/users/83ssedkv53",
+ "summary": null,
+ "content": "Fantiaこれできないように過去のやつは従量課金だった気がする
",
+ "_misskey_content": "Fantiaこれできないように過去のやつは従量課金だった気がする",
+ "published": "2022-01-21T16:37:12.663Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "cc": [
+ "https://misskey.io/users/83ssedkv53/followers"
+ ],
+ "inReplyTo": null,
+ "attachment": [],
+ "sensitive": false,
+ "tag": []
+}
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 3e0c8dc65..2c8e5ba21 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -136,6 +136,28 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
tag = object.data["tag"] |> List.first()
assert tag["type"] == "Mention"
end
+
+ test "it accepts quote posts" do
+ insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i")
+
+ object = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
+
+ message = %{
+ "@context" => "https://www.w3.org/ns/activitystreams",
+ "type" => "Create",
+ "actor" => "https://misskey.io/users/7rkrarq81i",
+ "object" => object
+ }
+
+ assert {:ok, activity} = Transmogrifier.handle_incoming(message)
+
+ # Object was created in the database
+ object = Object.normalize(activity)
+ assert object.data["quoteUrl"] == "https://misskey.io/notes/8vs6wxufd0"
+
+ # It fetched the quoted post
+ assert Object.normalize("https://misskey.io/notes/8vs6wxufd0")
+ end
end
describe "prepare outgoing" do
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index b0cf613ac..78a367024 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -1380,6 +1380,15 @@ defmodule HttpRequestMock do
}}
end
+ def get("https://misskey.io/users/83ssedkv53", _, _, _) do
+ {:ok,
+ %Tesla.Env{
+ status: 200,
+ body: File.read!("test/fixtures/tesla_mock/aimu@misskey.io.json"),
+ headers: activitypub_object_headers()
+ }}
+ end
+
def get("https://gleasonator.com/users/macgirvin", _, _, _) do
{:ok,
%Tesla.Env{
@@ -1446,6 +1455,15 @@ defmodule HttpRequestMock do
}}
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(url, query, body, headers) do
{:error,
"Mock response not implemented for GET #{inspect(url)}, #{query}, #{inspect(body)}, #{inspect(headers)}"}
From cc4badaf60462fdb8bb57225437e3dd360ee0dfb Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 19:14:39 -0600
Subject: [PATCH 128/199] Transmogrifier: fix quoteUrl here too
---
.../web/activity_pub/transmogrifier.ex | 23 +++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index c466271ca..f5771e75e 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -166,9 +166,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
def fix_in_reply_to(object, _options), do: object
- def fix_quote(object, options \\ [])
+ def fix_quote_url(object, options \\ [])
- def fix_quote(%{"quoteUrl" => quote_url} = object, options)
+ def fix_quote_url(%{"quoteUrl" => quote_url} = object, options)
when not is_nil(quote_url) do
with {:ok, quoted_object} <- get_obj_helper(quote_url, options),
%Activity{} <- Activity.get_create_by_object_ap_id(quoted_object.data["id"]) do
@@ -180,7 +180,22 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
end
- def fix_quote(object, _options), do: object
+ # Fix for Fedibird
+ # https://github.com/fedibird/mastodon/issues/9
+ def fix_quote_url(%{"quoteURL" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUrl", quote_url)
+ |> fix_quote_url(options)
+ end
+
+ # Misskey fallback
+ def fix_quote_url(%{"_misskey_quote" => quote_url} = object, options) do
+ object
+ |> Map.put("quoteUrl", quote_url)
+ |> fix_quote_url(options)
+ end
+
+ def fix_quote_url(object, _options), do: object
defp prepare_in_reply_to(in_reply_to) do
cond do
@@ -470,7 +485,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|> strip_internal_fields()
|> fix_type(fetch_options)
|> fix_in_reply_to(fetch_options)
- |> fix_quote(fetch_options)
+ |> fix_quote_url(fetch_options)
data = Map.put(data, "object", object)
options = Keyword.put(options, :local, false)
From ce5eb3172321f0ef2ae85d7819b44cc8241a5581 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 19:47:08 -0600
Subject: [PATCH 129/199] StatusView: show quoted posts through the API,
probably
---
.../web/mastodon_api/views/status_view.ex | 42 ++++++++++++++++++-
1 file changed, 41 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index dea22f9c2..b966a84d0 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -57,6 +57,27 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end)
end
+ defp get_quoted_activities([]), do: %{}
+
+ defp get_quoted_activities(activities) do
+ activities
+ |> Enum.map(fn
+ %{data: %{"type" => "Create"}} = activity ->
+ object = Object.normalize(activity, fetch: false)
+ object && object.data["quoteUrl"] != "" && object.data["quoteUrl"]
+
+ _ ->
+ nil
+ end)
+ |> Enum.filter(& &1)
+ |> Activity.create_by_object_ap_id_with_object()
+ |> Repo.all()
+ |> Enum.reduce(%{}, fn activity, acc ->
+ object = Object.normalize(activity, fetch: false)
+ if object, do: Map.put(acc, object.data["id"], activity), else: acc
+ end)
+ end
+
# DEPRECATED This field seems to be a left-over from the StatusNet era.
# If your application uses `pleroma.conversation_id`: this field is deprecated.
# It is currently stubbed instead by doing a CRC32 of the context, and
@@ -97,6 +118,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
# length(activities_with_links) * timeout
fetch_rich_media_for_activities(activities)
replied_to_activities = get_replied_to_activities(activities)
+ quoted_activities = get_quoted_activities(activities)
parent_activities =
activities
@@ -129,6 +151,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
opts =
opts
|> Map.put(:replied_to_activities, replied_to_activities)
+ |> Map.put(:quoted_activities, quoted_activities)
|> Map.put(:parent_activities, parent_activities)
|> Map.put(:relationships, relationships_opt)
@@ -277,7 +300,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
reply_to = get_reply_to(activity, opts)
-
reply_to_user = reply_to && CommonAPI.get_user(reply_to.data["actor"])
history_len =
@@ -290,6 +312,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
# Here the implicit index of the current content is 0
chrono_order = history_len - 1
+ quote_activity = get_quote(activity, opts)
+
content =
object
|> render_content()
@@ -398,6 +422,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
conversation_id: get_context_id(activity),
context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
+ quote_id: quote_activity && to_string(quote_activity.id),
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
@@ -633,6 +658,21 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
+ def get_quote(activity, %{quoted_activities: quoted_activities}) do
+ object = Object.normalize(activity, fetch: false)
+ quoted_activities[object.data["quoteUrl"]]
+ end
+
+ def get_quote(%{data: %{"object" => _object}} = activity, _) do
+ object = Object.normalize(activity, fetch: false)
+
+ if object.data["quoteUrl"] && object.data["quoteUrl"] != "" do
+ Activity.get_create_by_object_ap_id(object.data["quoteUrl"])
+ else
+ nil
+ end
+ end
+
def render_content(%{data: %{"name" => name}} = object) when not is_nil(name) and name != "" do
url = object.data["url"] || object.data["id"]
From 0d9c443e51c85d9ded3e20954c9620f7a9d2361e Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 20:05:58 -0600
Subject: [PATCH 130/199] StatusView: render the whole quoted status
---
lib/pleroma/web/api_spec/schemas/status.ex | 5 +++++
lib/pleroma/web/mastodon_api/views/status_view.ex | 10 +++++++++-
.../web/mastodon_api/views/status_view_test.exs | 1 +
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index bc29cf4a6..39241aa39 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -193,6 +193,11 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
nullable: true,
description: "The `acct` property of User entity for replied user (if any)"
},
+ quote: %Schema{
+ allOf: [%OpenApiSpex.Reference{"$ref": "#/components/schemas/Status"}],
+ nullable: true,
+ description: "Quoted status (if any)"
+ },
local: %Schema{
type: :boolean,
description: "`true` if the post was made on the local instance"
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index b966a84d0..5bde1ce04 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -314,6 +314,14 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
quote_activity = get_quote(activity, opts)
+ quote_post =
+ if quote_activity do
+ quote_rendering_opts = Map.put(opts, :activity, quote_activity)
+ render("show.json", quote_rendering_opts)
+ else
+ nil
+ end
+
content =
object
|> render_content()
@@ -422,7 +430,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
conversation_id: get_context_id(activity),
context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
- quote_id: quote_activity && to_string(quote_activity.id),
+ quote: quote_post,
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index b93335190..b10b0f0b9 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -326,6 +326,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
conversation_id: convo_id,
context: object_data["context"],
in_reply_to_account_acct: nil,
+ quote: nil,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
expires_at: nil,
From 6ac19c3999c543e5a26bbf04932a6a7aaa447b99 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 21:27:05 -0600
Subject: [PATCH 131/199] ActivityDraft: create quote posts
---
lib/pleroma/web/common_api/activity_draft.ex | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 63ed48a27..375aabc91 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -22,6 +22,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
attachments: [],
in_reply_to: nil,
in_reply_to_conversation: nil,
+ quote_post: nil,
visibility: nil,
expires_at: nil,
extra: nil,
@@ -53,6 +54,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
|> poll()
|> with_valid(&in_reply_to/1)
|> with_valid(&in_reply_to_conversation/1)
+ |> with_valid("e_post/1)
|> with_valid(&visibility/1)
|> content()
|> with_valid(&to_and_cc/1)
@@ -132,6 +134,18 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp in_reply_to(draft), do: draft
+ defp quote_post(%{params: %{quote_id: ""}} = draft), do: draft
+
+ defp quote_post(%{params: %{quote_id: id}} = draft) when is_binary(id) do
+ %__MODULE__{draft | quote_post: Activity.get_by_id(id)}
+ end
+
+ defp quote_post(%{params: %{quote_id: %Activity{} = quote_post}} = draft) do
+ %__MODULE__{draft | quote_post: quote_post}
+ end
+
+ defp quote_post(draft), do: draft
+
defp in_reply_to_conversation(draft) do
in_reply_to_conversation = Participation.get(draft.params[:in_reply_to_conversation_id])
%__MODULE__{draft | in_reply_to_conversation: in_reply_to_conversation}
From d4fea8b5595e9e6cd37bdb1cee21285f905693f1 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:15:54 -0600
Subject: [PATCH 132/199] ActivityDraft: allow quoting
---
lib/pleroma/web/activity_pub/builder.ex | 11 +++++++++++
.../web/api_spec/operations/status_operation.ex | 7 ++++++-
test/pleroma/web/common_api_test.exs | 12 ++++++++++++
3 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex
index 8eab3a241..eb0bb0e33 100644
--- a/lib/pleroma/web/activity_pub/builder.ex
+++ b/lib/pleroma/web/activity_pub/builder.ex
@@ -217,6 +217,7 @@ defmodule Pleroma.Web.ActivityPub.Builder do
"tag" => Keyword.values(draft.tags) |> Enum.uniq()
}
|> add_in_reply_to(draft.in_reply_to)
+ |> add_quote(draft.quote_post)
|> Map.merge(draft.extra)
{:ok, data, []}
@@ -232,6 +233,16 @@ defmodule Pleroma.Web.ActivityPub.Builder do
end
end
+ defp add_quote(object, nil), do: object
+
+ defp add_quote(object, quote_post) do
+ with %Object{} = quote_object <- Object.normalize(quote_post, fetch: false) do
+ Map.put(object, "quoteUrl", quote_object.data["id"])
+ else
+ _ -> object
+ end
+ end
+
def chat_message(actor, recipient, content, opts \\ []) do
basic = %{
"id" => Utils.generate_object_id(),
diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex
index 5d6e82f3c..8fa3b0890 100644
--- a/lib/pleroma/web/api_spec/operations/status_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/status_operation.ex
@@ -581,7 +581,12 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
type: :string,
description:
"Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`."
- }
+ },
+ quote_id: %Schema{
+ nullable: true,
+ allOf: [FlakeID],
+ description: "ID of the status being quoted, if any"
+ },
},
example: %{
"status" => "What time is it?",
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 0d76d6581..09df27acb 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -796,6 +796,18 @@ defmodule Pleroma.Web.CommonAPITest do
scheduled_at: expires_at
)
end
+
+ test "it allows allows quote posting" do
+ user = insert(:user)
+
+ {:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id})
+
+ quoted = Object.normalize(quoted)
+ quote_post = Object.normalize(quote_post)
+
+ assert quote_post.data["quoteUrl"] == quoted.data["id"]
+ end
end
describe "reactions" do
From c20e90e898affc9d00d8b7d6b71f11157f5c7837 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:29:13 -0600
Subject: [PATCH 133/199] BuilderTest: build quote post
---
.../pleroma/web/activity_pub/builder_test.exs | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/test/pleroma/web/activity_pub/builder_test.exs b/test/pleroma/web/activity_pub/builder_test.exs
index eb175a1be..52058a0a3 100644
--- a/test/pleroma/web/activity_pub/builder_test.exs
+++ b/test/pleroma/web/activity_pub/builder_test.exs
@@ -44,5 +44,34 @@ defmodule Pleroma.Web.ActivityPub.BuilderTest do
assert {:ok, ^expected, []} = Builder.note(draft)
end
+
+ test "quote post" do
+ user = insert(:user)
+ note = insert(:note)
+
+ draft = %ActivityDraft{
+ user: user,
+ context: "2hu",
+ content_html: "This is :moominmamma: note
",
+ quote_post: note,
+ extra: %{}
+ }
+
+ expected = %{
+ "actor" => user.ap_id,
+ "attachment" => [],
+ "content" => "This is :moominmamma: note
",
+ "context" => "2hu",
+ "sensitive" => false,
+ "type" => "Note",
+ "quoteUrl" => note.data["id"],
+ "cc" => [],
+ "summary" => nil,
+ "tag" => [],
+ "to" => []
+ }
+
+ assert {:ok, ^expected, []} = Builder.note(draft)
+ end
end
end
From 3a8b5d90df6de502debaee4d670211bcf64ad1db Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:35:08 -0600
Subject: [PATCH 134/199] StatusControllerTest: test creating a quote post
---
.../controllers/status_controller_test.exs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
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 76c289ee7..ba49256b5 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -125,6 +125,25 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
)
end
+ test "posting a quote post", %{conn: conn} do
+ user = insert(:user)
+
+ {:ok, %{id: activity_id}} = CommonAPI.post(user, %{status: "yolo"})
+
+ conn =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> post("/api/v1/statuses", %{
+ "status" => "indeed",
+ "quote_id" => activity_id
+ })
+
+ assert %{"id" => id, "pleroma" => %{"quote" => %{"id" => ^activity_id}}} =
+ json_response_and_validate_schema(conn, 200)
+
+ assert Activity.get_by_id(id)
+ end
+
test "it fails to create a status if `expires_in` is less or equal than an hour", %{
conn: conn
} do
From cbd1760efac872c00edad15f352ffe4d2e0e1e12 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:41:57 -0600
Subject: [PATCH 135/199] TransmogrifierTest: prepare an outgoing quote post
---
.../pleroma/web/activity_pub/transmogrifier_test.exs | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/test/pleroma/web/activity_pub/transmogrifier_test.exs b/test/pleroma/web/activity_pub/transmogrifier_test.exs
index 2c8e5ba21..824398e38 100644
--- a/test/pleroma/web/activity_pub/transmogrifier_test.exs
+++ b/test/pleroma/web/activity_pub/transmogrifier_test.exs
@@ -372,6 +372,18 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
}
} = prepared["object"]
end
+
+ test "it prepares a quote post" do
+ user = insert(:user)
+
+ {:ok, quoted_post} = CommonAPI.post(user, %{status: "hey"})
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "hey", quote_id: quoted_post.id})
+
+ {:ok, modified} = Transmogrifier.prepare_outgoing(quote_post.data)
+
+ quoted_post = Object.normalize(quoted_post)
+ assert modified["object"]["quoteUrl"] == quoted_post.data["id"]
+ end
end
describe "actor rewriting" do
From 96009739173e5e48a636bb964855eb7aea11c828 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 22:57:42 -0600
Subject: [PATCH 136/199] mix format
---
lib/pleroma/web/api_spec/operations/status_operation.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex
index 8fa3b0890..c133a3aac 100644
--- a/lib/pleroma/web/api_spec/operations/status_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/status_operation.ex
@@ -586,7 +586,7 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
nullable: true,
allOf: [FlakeID],
description: "ID of the status being quoted, if any"
- },
+ }
},
example: %{
"status" => "What time is it?",
From f4ccdfd5033e7b1136ae0fe4e41dba78d83e80cf Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 23:02:44 -0600
Subject: [PATCH 137/199] Fix typos
---
.../article_note_page_validator_test.exs | 12 ++++++------
test/pleroma/web/common_api_test.exs | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
index c3cde00b5..dec2e28c9 100644
--- a/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
+++ b/test/pleroma/web/activity_pub/object_validators/article_note_page_validator_test.exs
@@ -121,19 +121,19 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ArticleNotePageValidatorTest
insert(:user, ap_id: "https://fedibird.com/users/noellabo")
data = File.read!("test/fixtures/quote_post/fedibird_quote_post.json") |> Jason.decode!()
- chg = ArticleNotePageValidator.cast_and_validate(data)
+ cng = ArticleNotePageValidator.cast_and_validate(data)
- assert chg.valid?
- assert chg.changes.quoteUrl == "https://misskey.io/notes/8vsn2izjwh"
+ assert cng.valid?
+ assert cng.changes.quoteUrl == "https://misskey.io/notes/8vsn2izjwh"
end
test "Misskey quote post" do
insert(:user, ap_id: "https://misskey.io/users/7rkrarq81i")
data = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
- chg = ArticleNotePageValidator.cast_and_validate(data)
+ cng = ArticleNotePageValidator.cast_and_validate(data)
- assert chg.valid?
- assert chg.changes.quoteUrl == "https://misskey.io/notes/8vs6wxufd0"
+ assert cng.valid?
+ assert cng.changes.quoteUrl == "https://misskey.io/notes/8vs6wxufd0"
end
end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 09df27acb..734e6dd82 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -797,7 +797,7 @@ defmodule Pleroma.Web.CommonAPITest do
)
end
- test "it allows allows quote posting" do
+ test "it allows quote posting" do
user = insert(:user)
{:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
From 5716f88a1d8424cf7c62a0491b3bf9607dc9aa3f Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 23:09:33 -0600
Subject: [PATCH 138/199] InstanceView: add "quote_posting" feature
---
lib/pleroma/web/mastodon_api/views/instance_view.ex | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex
index efd2a0af6..1b01d7371 100644
--- a/lib/pleroma/web/mastodon_api/views/instance_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex
@@ -69,6 +69,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
"multifetch",
"pleroma:api/v1/notifications:include_types_filter",
"editing",
+ "quote_posting",
if Config.get([:activitypub, :blockers_visible]) do
"blockers_visible"
end,
From db46abce477b83b252e0ad87f74ac9266e9cb118 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sat, 22 Jan 2022 23:29:55 -0600
Subject: [PATCH 139/199] @context: add quoteUrl
---
priv/static/schemas/litepub-0.1.jsonld | 1 +
1 file changed, 1 insertion(+)
diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld
index 650118475..5d8244a11 100644
--- a/priv/static/schemas/litepub-0.1.jsonld
+++ b/priv/static/schemas/litepub-0.1.jsonld
@@ -26,6 +26,7 @@
"@id": "litepub:listMessage",
"@type": "@id"
},
+ "quoteUrl": "as:quoteUrl",
"oauthRegistrationEndpoint": {
"@id": "litepub:oauthRegistrationEndpoint",
"@type": "@id"
From 80ab2572a4d5590d738cc763a87156b3f79362fb Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sun, 23 Jan 2022 13:55:25 -0600
Subject: [PATCH 140/199] Return quote_url through the API, don't render quotes
more than 1 level deep
---
lib/pleroma/web/api_spec/schemas/status.ex | 6 +++++
.../web/mastodon_api/views/status_view.ex | 7 +++++-
.../controllers/status_controller_test.exs | 9 +++++---
.../mastodon_api/views/status_view_test.exs | 23 +++++++++++++++++++
4 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index 39241aa39..f4ee9b38c 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -198,6 +198,12 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
nullable: true,
description: "Quoted status (if any)"
},
+ quote_url: %Schema{
+ type: :string,
+ format: :uri,
+ nullable: true,
+ description: "URL of the quoted status"
+ },
local: %Schema{
type: :boolean,
description: "`true` if the post was made on the local instance"
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 5bde1ce04..06adfb221 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -316,7 +316,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
quote_post =
if quote_activity do
- quote_rendering_opts = Map.put(opts, :activity, quote_activity)
+ quote_rendering_opts = Map.merge(opts, %{activity: quote_activity, show_quote: false})
render("show.json", quote_rendering_opts)
else
nil
@@ -431,6 +431,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
context: object.data["context"],
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
quote: quote_post,
+ quote_url: object.data["quoteUrl"],
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
@@ -666,6 +667,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
end
end
+ def get_quote(_activity, %{show_quote: false}) do
+ nil
+ end
+
def get_quote(activity, %{quoted_activities: quoted_activities}) do
object = Object.normalize(activity, fetch: false)
quoted_activities[object.data["quoteUrl"]]
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 ba49256b5..de3b52e26 100644
--- a/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
+++ b/test/pleroma/web/mastodon_api/controllers/status_controller_test.exs
@@ -128,7 +128,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
test "posting a quote post", %{conn: conn} do
user = insert(:user)
- {:ok, %{id: activity_id}} = CommonAPI.post(user, %{status: "yolo"})
+ {:ok, %{id: activity_id} = activity} = CommonAPI.post(user, %{status: "yolo"})
+ %{data: %{"id" => quote_url}} = Object.normalize(activity)
conn =
conn
@@ -138,8 +139,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do
"quote_id" => activity_id
})
- assert %{"id" => id, "pleroma" => %{"quote" => %{"id" => ^activity_id}}} =
- json_response_and_validate_schema(conn, 200)
+ assert %{
+ "id" => id,
+ "pleroma" => %{"quote" => %{"id" => ^activity_id}, "quote_url" => ^quote_url}
+ } = json_response_and_validate_schema(conn, 200)
assert Activity.get_by_id(id)
end
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index b10b0f0b9..f50b02799 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -327,6 +327,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
context: object_data["context"],
in_reply_to_account_acct: nil,
quote: nil,
+ quote_url: nil,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
expires_at: nil,
@@ -423,6 +424,28 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert status.in_reply_to_id == to_string(note.id)
end
+ test "a quote post" do
+ post = insert(:note_activity)
+ user = insert(:user)
+
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "he", quote_id: post.id})
+ {:ok, quoted_quote_post} = CommonAPI.post(user, %{status: "yo", quote_id: quote_post.id})
+
+ status = StatusView.render("show.json", %{activity: quoted_quote_post})
+
+ assert status.pleroma.quote.id == to_string(quote_post.id)
+ assert status.pleroma.quote_url == Object.normalize(quote_post).data["id"]
+
+ # Quotes don't go more than one level deep
+ refute status.pleroma.quote.pleroma.quote
+ assert status.pleroma.quote.pleroma.quote_url == Object.normalize(post).data["id"]
+
+ # In an index
+ [status] = StatusView.render("index.json", %{activities: [quoted_quote_post], as: :activity})
+
+ assert status.pleroma.quote.id == to_string(quote_post.id)
+ end
+
test "contains mentions" do
user = insert(:user)
mentioned = insert(:user)
From 54a989793878c63900d2c6de7b4ffc8fbd8fe8c6 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sun, 23 Jan 2022 15:46:44 -0600
Subject: [PATCH 141/199] ActivityDraft: mention the OP of a quoted post
---
lib/pleroma/web/common_api/activity_draft.ex | 19 +++++++++++--------
test/pleroma/web/common_api_test.exs | 12 ++++++++++++
2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 375aabc91..588aba55e 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -137,11 +137,11 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp quote_post(%{params: %{quote_id: ""}} = draft), do: draft
defp quote_post(%{params: %{quote_id: id}} = draft) when is_binary(id) do
- %__MODULE__{draft | quote_post: Activity.get_by_id(id)}
- end
-
- defp quote_post(%{params: %{quote_id: %Activity{} = quote_post}} = draft) do
- %__MODULE__{draft | quote_post: quote_post}
+ with %Activity{actor: actor_ap_id} = activity <- Activity.get_by_id(id) do
+ %__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
+ else
+ _ -> draft
+ end
end
defp quote_post(draft), do: draft
@@ -178,12 +178,15 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
end
end
- defp content(draft) do
+ defp content(%{mentions: mentions} = draft) do
{content_html, mentioned_users, tags} = Utils.make_content_html(draft)
+ mentioned_ap_ids =
+ Enum.map(mentioned_users, fn {_, mentioned_user} -> mentioned_user.ap_id end)
+
mentions =
- mentioned_users
- |> Enum.map(fn {_, mentioned_user} -> mentioned_user.ap_id end)
+ mentions
+ |> Kernel.++(mentioned_ap_ids)
|> Utils.get_addressed_users(draft.params[:to])
%__MODULE__{draft | content_html: content_html, mentions: mentions, tags: tags}
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 734e6dd82..051e770d7 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -807,6 +807,18 @@ defmodule Pleroma.Web.CommonAPITest do
quote_post = Object.normalize(quote_post)
assert quote_post.data["quoteUrl"] == quoted.data["id"]
+
+ # The OP is mentioned
+ assert quoted.data["actor"] in quote_post.data["to"]
+ end
+
+ test "quote posting with explicit addressing doesn't mention the OP" do
+ user = insert(:user)
+
+ {:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
+ {:ok, quote_post} = CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id, to: []})
+
+ assert Object.normalize(quote_post).data["to"] == [Pleroma.Constants.as_public()]
end
end
From 1f19dd76f66ca657ddfe79a51e59b8997a4c6321 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Sun, 23 Jan 2022 16:03:46 -0600
Subject: [PATCH 142/199] ActivityDraft: mix format, defensive actor ID
---
lib/pleroma/web/common_api/activity_draft.ex | 16 ++++++++++------
test/pleroma/web/common_api_test.exs | 4 +++-
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 588aba55e..95534f3cb 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -11,6 +11,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
alias Pleroma.Web.CommonAPI.Utils
import Pleroma.Web.Gettext
+ import Pleroma.Web.Utils.Guards, only: [not_empty_string: 1]
defstruct valid?: true,
errors: [],
@@ -134,13 +135,16 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp in_reply_to(draft), do: draft
- defp quote_post(%{params: %{quote_id: ""}} = draft), do: draft
+ defp quote_post(%{params: %{quote_id: id}} = draft) when not_empty_string(id) do
+ case Activity.get_by_id(id) do
+ %Activity{actor: actor_ap_id} = activity when not_empty_string(actor_ap_id) ->
+ %__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
- defp quote_post(%{params: %{quote_id: id}} = draft) when is_binary(id) do
- with %Activity{actor: actor_ap_id} = activity <- Activity.get_by_id(id) do
- %__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
- else
- _ -> draft
+ %Activity{} = activity ->
+ %__MODULE__{draft | quote_post: activity}
+
+ _ ->
+ draft
end
end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 051e770d7..960d0cf16 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -816,7 +816,9 @@ defmodule Pleroma.Web.CommonAPITest do
user = insert(:user)
{:ok, quoted} = CommonAPI.post(user, %{status: "Hello world"})
- {:ok, quote_post} = CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id, to: []})
+
+ {:ok, quote_post} =
+ CommonAPI.post(user, %{status: "nice post", quote_id: quoted.id, to: []})
assert Object.normalize(quote_post).data["to"] == [Pleroma.Constants.as_public()]
end
From 36a5578d2b16ba9f771fff55daafa85ec606a6be Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Mon, 24 Jan 2022 15:34:23 -0600
Subject: [PATCH 143/199] Scrubber.Default: allow span.quote-inline for quote
post compatibility
---
priv/scrubbers/default.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/priv/scrubbers/default.ex b/priv/scrubbers/default.ex
index d1215d2e0..56324a9fa 100644
--- a/priv/scrubbers/default.ex
+++ b/priv/scrubbers/default.ex
@@ -60,7 +60,7 @@ defmodule Pleroma.HTML.Scrubber.Default do
Meta.allow_tag_with_these_attributes(:u, ["lang"])
Meta.allow_tag_with_these_attributes(:ul, ["lang"])
- Meta.allow_tag_with_this_attribute_values(:span, "class", ["h-card", "recipients-inline"])
+ Meta.allow_tag_with_this_attribute_values(:span, "class", ["h-card", "recipients-inline", "quote-inline"])
Meta.allow_tag_with_these_attributes(:span, ["lang"])
Meta.allow_tag_with_this_attribute_values(:code, "class", ["inline"])
From 57ef1d121101d785c043ef6aaf2d33bb9be3ec3b Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Mon, 24 Jan 2022 16:44:35 -0600
Subject: [PATCH 144/199] Add InlineQuotePolicy to force quote URLs inline
---
config/config.exs | 2 +
docs/configuration/cheatsheet.md | 4 ++
.../activity_pub/mrf/inline_quote_policy.ex | 53 ++++++++++++++++++
.../mrf/inline_quote_policy_test.exs | 56 +++++++++++++++++++
4 files changed, 115 insertions(+)
create mode 100644 lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
create mode 100644 test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
diff --git a/config/config.exs b/config/config.exs
index ebcbf8b49..56cc34db5 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -434,6 +434,8 @@ config :pleroma, :mrf_object_age,
config :pleroma, :mrf_follow_bot, follower_nickname: nil
+config :pleroma, :mrf_inline_quote, prefix: "RT"
+
config :pleroma, :rich_media,
enabled: true,
ignore_hosts: [],
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index f43cde114..32cc5811a 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -160,6 +160,7 @@ To add configuration to your config file, you can copy it from the base config.
* `Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy`: Drops follow requests from followbots. Users can still allow bots to follow them by first following the bot.
* `Pleroma.Web.ActivityPub.MRF.KeywordPolicy`: Rejects or removes from the federated timeline or replaces keywords. (See [`:mrf_keyword`](#mrf_keyword)).
* `Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent`: Forces every mentioned user to be reflected in the post content.
+ * `Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy`: Forces quote post URLs to be reflected in the message content inline.
* `transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo).
* `transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value.
@@ -267,6 +268,9 @@ Notes:
* `federated_timeline_removal_url`: A list of patterns which result in message with emojis whose URLs match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
* `federated_timeline_removal_shortcode`: A list of patterns which result in message with emojis whose shortcodes match being removed from federated timelines (a.k.a unlisted). This will apply only to statuses. Each pattern can be a string or a [regular expression](https://hexdocs.pm/elixir/Regex.html).
+#### :mrf_inline_quote
+* `prefix`: Prefix before the link (default: `RT`)
+
### :activitypub
* `unfollow_blocked`: Whether blocks result in people getting unfollowed
* `outgoing_blocks`: Whether to federate blocks to other instances
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
new file mode 100644
index 000000000..0f1dc9f42
--- /dev/null
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -0,0 +1,53 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
+ @moduledoc "Force a quote line into the message content."
+ @behaviour Pleroma.Web.ActivityPub.MRF.Policy
+
+ defp build_inline_quote(prefix, url) do
+ "
#{prefix}: #{url}"
+ end
+
+ defp filter_object(%{"quoteUrl" => quote_url} = object) do
+ content = object["content"] || ""
+
+ if content =~ quote_url do
+ object
+ else
+ prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
+ content = content <> build_inline_quote(prefix, quote_url)
+ Map.put(object, "content", content)
+ end
+ end
+
+ @impl true
+ def filter(%{"object" => %{"quoteUrl" => _} = object} = activity) do
+ {:ok, Map.put(activity, "object", filter_object(object))}
+ end
+
+ @impl true
+ def filter(object), do: {:ok, object}
+
+ @impl true
+ def describe, do: {:ok, %{}}
+
+ @impl true
+ def config_description do
+ %{
+ key: :mrf_inline_quote,
+ related_policy: "Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy",
+ label: "MRF Inline Quote",
+ description: "Force quote post URLs inline",
+ children: [
+ %{
+ key: :prefix,
+ type: :string,
+ description: "Prefix before the link",
+ suggestions: ["RT", "QT", "RE", "RN"]
+ }
+ ]
+ }
+ end
+end
diff --git a/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
new file mode 100644
index 000000000..81dc06dda
--- /dev/null
+++ b/test/pleroma/web/activity_pub/mrf/inline_quote_policy_test.exs
@@ -0,0 +1,56 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicyTest do
+ alias Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy
+ use Pleroma.DataCase
+
+ test "adds quote URL to post content" do
+ quote_url = "https://gleasonator.com/objects/1234"
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://gleasonator.com/users/alex",
+ "object" => %{
+ "type" => "Note",
+ "content" => "Nice post
",
+ "quoteUrl" => quote_url
+ }
+ }
+
+ {:ok, %{"object" => %{"content" => filtered}}} = InlineQuotePolicy.filter(activity)
+
+ assert filtered ==
+ "Nice post
RT: https://gleasonator.com/objects/1234"
+ end
+
+ test "ignores Misskey quote posts" do
+ object = File.read!("test/fixtures/quote_post/misskey_quote_post.json") |> Jason.decode!()
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://misskey.io/users/7rkrarq81i",
+ "object" => object
+ }
+
+ {:ok, filtered} = InlineQuotePolicy.filter(activity)
+ assert filtered == activity
+ end
+
+ test "ignores Fedibird quote posts" do
+ object = File.read!("test/fixtures/quote_post/fedibird_quote_post.json") |> Jason.decode!()
+
+ # Normally the ObjectValidator will fix this before it reaches MRF
+ object = Map.put(object, "quoteUrl", object["quoteURL"])
+
+ activity = %{
+ "type" => "Create",
+ "actor" => "https://fedibird.com/users/noellabo",
+ "object" => object
+ }
+
+ {:ok, filtered} = InlineQuotePolicy.filter(activity)
+ assert filtered == activity
+ end
+end
From 59326247aa754991add9170e204257a8bf94c40f Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Wed, 26 Jan 2022 11:21:49 -0600
Subject: [PATCH 145/199] CommonAPI: disallow quoting private posts through the
API
---
lib/pleroma/web/common_api/activity_draft.ex | 15 ++++++++++-
.../web/common_api/activity_draft_test.exs | 26 +++++++++++++++++++
test/pleroma/web/common_api_test.exs | 14 ++++++++++
3 files changed, 54 insertions(+), 1 deletion(-)
create mode 100644 test/pleroma/web/common_api/activity_draft_test.exs
diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex
index 95534f3cb..d4875765c 100644
--- a/lib/pleroma/web/common_api/activity_draft.ex
+++ b/lib/pleroma/web/common_api/activity_draft.ex
@@ -7,6 +7,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
alias Pleroma.Conversation.Participation
alias Pleroma.Object
alias Pleroma.Web.ActivityPub.Builder
+ alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.CommonAPI.Utils
@@ -57,6 +58,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
|> with_valid(&in_reply_to_conversation/1)
|> with_valid("e_post/1)
|> with_valid(&visibility/1)
+ |> with_valid("ing_visibility/1)
|> content()
|> with_valid(&to_and_cc/1)
|> with_valid(&context/1)
@@ -136,7 +138,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
defp in_reply_to(draft), do: draft
defp quote_post(%{params: %{quote_id: id}} = draft) when not_empty_string(id) do
- case Activity.get_by_id(id) do
+ case Activity.get_by_id_with_object(id) do
%Activity{actor: actor_ap_id} = activity when not_empty_string(actor_ap_id) ->
%__MODULE__{draft | quote_post: activity, mentions: [actor_ap_id]}
@@ -165,6 +167,17 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
end
end
+ defp quoting_visibility(%{quote_post: %Activity{}} = draft) do
+ with %Object{} = object <- Object.normalize(draft.quote_post, fetch: false),
+ visibility when visibility in ~w(public unlisted) <- Visibility.get_visibility(object) do
+ draft
+ else
+ _ -> add_error(draft, dgettext("errors", "Cannot quote private message"))
+ end
+ end
+
+ defp quoting_visibility(draft), do: draft
+
defp expires_at(draft) do
case CommonAPI.check_expiry_date(draft.params[:expires_in]) do
{:ok, expires_at} -> %__MODULE__{draft | expires_at: expires_at}
diff --git a/test/pleroma/web/common_api/activity_draft_test.exs b/test/pleroma/web/common_api/activity_draft_test.exs
new file mode 100644
index 000000000..8a09fc710
--- /dev/null
+++ b/test/pleroma/web/common_api/activity_draft_test.exs
@@ -0,0 +1,26 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.CommonAPI.ActivityDraftTest do
+ use Pleroma.DataCase
+
+ alias Pleroma.Web.CommonAPI
+ alias Pleroma.Web.CommonAPI.ActivityDraft
+
+ import Pleroma.Factory
+
+ test "create/2 with a quote post" do
+ user = insert(:user)
+
+ {:ok, direct} = CommonAPI.post(user, %{status: ".", visibility: "direct"})
+ {:ok, private} = CommonAPI.post(user, %{status: ".", visibility: "private"})
+ {:ok, unlisted} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
+ {:ok, public} = CommonAPI.post(user, %{status: ".", visibility: "public"})
+
+ {:error, _} = ActivityDraft.create(user, %{status: "nice", quote_id: direct.id})
+ {:error, _} = ActivityDraft.create(user, %{status: "nice", quote_id: private.id})
+ {:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = ActivityDraft.create(user, %{status: "nice", quote_id: public.id})
+ end
+end
diff --git a/test/pleroma/web/common_api_test.exs b/test/pleroma/web/common_api_test.exs
index 960d0cf16..c4eba8b9c 100644
--- a/test/pleroma/web/common_api_test.exs
+++ b/test/pleroma/web/common_api_test.exs
@@ -822,6 +822,20 @@ defmodule Pleroma.Web.CommonAPITest do
assert Object.normalize(quote_post).data["to"] == [Pleroma.Constants.as_public()]
end
+
+ test "quote posting visibility" do
+ user = insert(:user)
+
+ {:ok, direct} = CommonAPI.post(user, %{status: ".", visibility: "direct"})
+ {:ok, private} = CommonAPI.post(user, %{status: ".", visibility: "private"})
+ {:ok, unlisted} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
+ {:ok, public} = CommonAPI.post(user, %{status: ".", visibility: "public"})
+
+ {:error, _} = CommonAPI.post(user, %{status: "nice", quote_id: direct.id})
+ {:error, _} = CommonAPI.post(user, %{status: "nice", quote_id: private.id})
+ {:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: unlisted.id})
+ {:ok, _} = CommonAPI.post(user, %{status: "nice", quote_id: public.id})
+ end
end
describe "reactions" do
From 6f11f11519f9c735f6b059c250f4bf01e09b305f Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Wed, 26 Jan 2022 11:49:31 -0600
Subject: [PATCH 146/199] StatusView: fix quote visibility
---
.../web/mastodon_api/views/status_view.ex | 2 +-
.../mastodon_api/views/status_view_test.exs | 41 +++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 06adfb221..7360d1093 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -315,7 +315,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
quote_activity = get_quote(activity, opts)
quote_post =
- if quote_activity do
+ if visible_for_user?(quote_activity, opts[:for]) do
quote_rendering_opts = Map.merge(opts, %{activity: quote_activity, show_quote: false})
render("show.json", quote_rendering_opts)
else
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index f50b02799..f41ef580d 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -446,6 +446,47 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
assert status.pleroma.quote.id == to_string(quote_post.id)
end
+ test "quoted private post" do
+ user = insert(:user)
+
+ # Insert a private post
+ private = insert(:followers_only_note_activity, user: user)
+ private_object = Object.normalize(private)
+
+ # Create a public post quoting the private post
+ quote_private =
+ insert(:note_activity, note: insert(:note, data: %{"quoteUrl" => private_object.data["id"]}))
+
+ status = StatusView.render("show.json", %{activity: quote_private})
+
+ # The quote isn't rendered
+ refute status.pleroma.quote
+ assert status.pleroma.quote_url == private_object.data["id"]
+
+ # After following the user, the quote is rendered
+ follower = insert(:user)
+ CommonAPI.follow(follower, user)
+
+ status = StatusView.render("show.json", %{activity: quote_private, for: follower})
+ assert status.pleroma.quote.id == to_string(private.id)
+ end
+
+ test "quoted direct message" do
+ # Insert a direct message
+ direct = insert(:direct_note_activity)
+ direct_object = Object.normalize(direct)
+
+ # Create a public post quoting the direct message
+ quote_direct =
+ insert(:note_activity, note: insert(:note, data: %{"quoteUrl" => direct_object.data["id"]}))
+
+ status = StatusView.render("show.json", %{activity: quote_direct})
+
+ # The quote isn't rendered
+ refute status.pleroma.quote
+ assert status.pleroma.quote_url == direct_object.data["id"]
+ end
+
test "contains mentions" do
user = insert(:user)
mentioned = insert(:user)
From 74e0a4555f583a6962ad116bf6e54f06e42fe465 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Wed, 26 Jan 2022 11:52:50 -0600
Subject: [PATCH 147/199] StatusView: add `quote_visible` param
---
lib/pleroma/web/api_spec/schemas/status.ex | 4 ++++
lib/pleroma/web/mastodon_api/views/status_view.ex | 1 +
test/pleroma/web/mastodon_api/views/status_view_test.exs | 4 ++++
3 files changed, 9 insertions(+)
diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex
index f4ee9b38c..5d0eedb08 100644
--- a/lib/pleroma/web/api_spec/schemas/status.ex
+++ b/lib/pleroma/web/api_spec/schemas/status.ex
@@ -204,6 +204,10 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
nullable: true,
description: "URL of the quoted status"
},
+ quote_visible: %Schema{
+ type: :boolean,
+ description: "`true` if the quoted post is visible to the user"
+ },
local: %Schema{
type: :boolean,
description: "`true` if the post was made on the local instance"
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 7360d1093..2aa44b0f6 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -432,6 +432,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
quote: quote_post,
quote_url: object.data["quoteUrl"],
+ quote_visible: visible_for_user?(quote_activity, opts[:for]),
content: %{"text/plain" => content_plaintext},
spoiler_text: %{"text/plain" => summary},
expires_at: expires_at,
diff --git a/test/pleroma/web/mastodon_api/views/status_view_test.exs b/test/pleroma/web/mastodon_api/views/status_view_test.exs
index f41ef580d..ed0a87558 100644
--- a/test/pleroma/web/mastodon_api/views/status_view_test.exs
+++ b/test/pleroma/web/mastodon_api/views/status_view_test.exs
@@ -328,6 +328,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
in_reply_to_account_acct: nil,
quote: nil,
quote_url: nil,
+ quote_visible: false,
content: %{"text/plain" => HTML.strip_tags(object_data["content"])},
spoiler_text: %{"text/plain" => HTML.strip_tags(object_data["summary"])},
expires_at: nil,
@@ -462,6 +463,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
# The quote isn't rendered
refute status.pleroma.quote
assert status.pleroma.quote_url == private_object.data["id"]
+ refute status.pleroma.quote_visible
# After following the user, the quote is rendered
follower = insert(:user)
@@ -469,6 +471,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
status = StatusView.render("show.json", %{activity: quote_private, for: follower})
assert status.pleroma.quote.id == to_string(private.id)
+ assert status.pleroma.quote_visible
end
test "quoted direct message" do
@@ -485,6 +488,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
# The quote isn't rendered
refute status.pleroma.quote
assert status.pleroma.quote_url == direct_object.data["id"]
+ refute status.pleroma.quote_visible
end
test "contains mentions" do
From bee7e419597615ac6852942fe563166feba3fe73 Mon Sep 17 00:00:00 2001
From: Alex Gleason
Date: Thu, 27 Jan 2022 14:28:06 -0600
Subject: [PATCH 148/199] InlineQuotePolicy: don't add line breaks to markdown
posts
---
.../activity_pub/mrf/inline_quote_policy.ex | 12 ++++++++---
.../mrf/inline_quote_policy_test.exs | 21 ++++++++++++++++++-
2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
index 0f1dc9f42..46013fc5e 100644
--- a/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
+++ b/lib/pleroma/web/activity_pub/mrf/inline_quote_policy.ex
@@ -6,8 +6,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
@moduledoc "Force a quote line into the message content."
@behaviour Pleroma.Web.ActivityPub.MRF.Policy
- defp build_inline_quote(prefix, url) do
- "
#{prefix}: #{url}"
+ defp build_inline_quote(prefix, url, br) do
+ "#{String.duplicate("
", br)}#{prefix}: #{url}"
end
defp filter_object(%{"quoteUrl" => quote_url} = object) do
@@ -17,7 +17,13 @@ defmodule Pleroma.Web.ActivityPub.MRF.InlineQuotePolicy do
object
else
prefix = Pleroma.Config.get([:mrf_inline_quote, :prefix])
- content = content <> build_inline_quote(prefix, quote_url)
+
+ inline_quote =
+ if String.ends_with?(content, "