Merge branch 'fix/digest-task-otp' into 'develop'
authorlain <lain@soykaf.club>
Fri, 15 May 2020 14:22:59 +0000 (14:22 +0000)
committerlain <lain@soykaf.club>
Fri, 15 May 2020 14:22:59 +0000 (14:22 +0000)
Fix digest mix task on OTP releases

See merge request pleroma/pleroma!2526

39 files changed:
CHANGELOG.md
docs/configuration/cheatsheet.md
installation/init.d/pleroma
lib/pleroma/bbs/authenticator.ex
lib/pleroma/config/config_db.ex
lib/pleroma/constants.ex
lib/pleroma/docs/json.ex
lib/pleroma/plugs/authentication_plug.ex
lib/pleroma/upload.ex
lib/pleroma/web/admin_api/admin_api_controller.ex
lib/pleroma/web/api_spec/helpers.ex
lib/pleroma/web/api_spec/operations/account_operation.ex
lib/pleroma/web/api_spec/operations/app_operation.ex
lib/pleroma/web/api_spec/operations/filter_operation.ex
lib/pleroma/web/api_spec/operations/marker_operation.ex
lib/pleroma/web/api_spec/operations/pleroma_account_operation.ex [new file with mode: 0644]
lib/pleroma/web/api_spec/operations/report_operation.ex
lib/pleroma/web/api_spec/operations/status_operation.ex
lib/pleroma/web/api_spec/operations/subscription_operation.ex
lib/pleroma/web/auth/totp_authenticator.ex
lib/pleroma/web/mongooseim/mongoose_im_controller.ex
lib/pleroma/web/pleroma_api/controllers/account_controller.ex
mix.exs
mix.lock
priv/gettext/fr/LC_MESSAGES/errors.po
priv/gettext/pl/LC_MESSAGES/errors.po [new file with mode: 0644]
test/activity_test.exs
test/config/config_db_test.exs
test/http/connection_test.exs
test/http/request_builder_test.exs
test/plugs/authentication_plug_test.exs
test/uploaders/s3_test.exs
test/web/activity_pub/activity_pub_test.exs
test/web/admin_api/admin_api_controller_test.exs
test/web/feed/tag_controller_test.exs
test/web/mastodon_api/controllers/search_controller_test.exs
test/web/pleroma_api/controllers/account_controller_test.exs
test/web/push/impl_test.exs
test/web/rel_me_test.exs

index 4b7fb603dbc3e04695fc7a84c64eab0525de060d..feda4132050d7c48b60cb91d4400f13bfd040506 100644 (file)
@@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - NodeInfo: `pleroma:api/v1/notifications:include_types_filter` to the `features` list.
 - NodeInfo: `pleroma_emoji_reactions` to the `features` list.
 - Configuration: `:restrict_unauthenticated` setting, restrict access for unauthenticated users to timelines (public and federate), user profiles and statuses.
+- Configuration: Add `:database_config_whitelist` setting to whitelist settings which can be configured from AdminFE.
 - New HTTP adapter [gun](https://github.com/ninenines/gun). Gun adapter requires minimum OTP version of 22.2 otherwise Pleroma won’t start. For hackney OTP update is not required.
 - Mix task to create trusted OAuth App.
 - Notifications: Added `follow_request` notification type.
index 707d7fdbd58228b61988666afb107fb7e5e10903..1078c4e8769a46f71b3a3528e1fd6f79ed53b767 100644 (file)
@@ -911,6 +911,21 @@ config :auto_linker,
 
 Boolean, enables/disables in-database configuration. Read [Transfering the config to/from the database](../administration/CLI_tasks/config.md) for more information.
 
+## :database_config_whitelist
+
+List of valid configuration sections which are allowed to be configured from the
+database. Settings stored in the database before the whitelist is configured are
+still applied, so it is suggested to only use the whitelist on instances that
+have not migrated the config to the database.
+
+Example:
+```elixir
+config :pleroma, :database_config_whitelist, [
+  {:pleroma, :instance},
+  {:pleroma, Pleroma.Web.Metadata},
+  {:auto_linker}
+]
+```
 
 ### Multi-factor authentication -  :two_factor_authentication
 * `totp` - a list containing TOTP configuration
index ed50bb551a0b9591a7ea15503083859b2bfa77ca..384536f7e99d50efdb17bfe1683990efb6b1ea04 100755 (executable)
@@ -1,21 +1,45 @@
 #!/sbin/openrc-run
-
-# Requires OpenRC >= 0.35
-directory=/opt/pleroma
-
-command=/usr/bin/mix
-command_args="phx.server"
+supervisor=supervise-daemon
 command_user=pleroma:pleroma
 command_background=1
-
-export PORT=4000
-export MIX_ENV=prod
-
 # Ask process to terminate within 30 seconds, otherwise kill it
 retry="SIGTERM/30/SIGKILL/5"
-
 pidfile="/var/run/pleroma.pid"
+directory=/opt/pleroma
+healthcheck_delay=60
+healthcheck_timer=30
+
+: ${pleroma_port:-4000}
+
+# Needs OpenRC >= 0.42
+#respawn_max=0
+#respawn_delay=5
+
+# put pleroma_console=YES in /etc/conf.d/pleroma if you want to be able to
+# connect to pleroma via an elixir console
+if yesno "${pleroma_console}"; then
+       command=elixir
+       command_args="--name pleroma@127.0.0.1 --erl '-kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001 inet_dist_use_interface {127,0,0,1}' -S mix phx.server"
+
+       start_post() {
+               einfo "You can get a console by using this command as pleroma's user:"
+               einfo "iex --name console@127.0.0.1 --remsh pleroma@127.0.0.1"
+       }
+else
+       command=/usr/bin/mix
+       command_args="phx.server"
+fi
+
+export MIX_ENV=prod
 
 depend() {
-    need nginx postgresql
+       need nginx postgresql
+}
+
+healthcheck() {
+       # put pleroma_health=YES in /etc/conf.d/pleroma if you want healthchecking
+       # and make sure you have curl installed
+       yesno "$pleroma_health" || return 0
+
+       curl -q "localhost:${pleroma_port}/api/pleroma/healthcheck"
 }
index d4494b00304bb25aec03af26b21109cb8bbfab21..815de70020e6cf519fe9c08b06c8557a3e74d68f 100644 (file)
@@ -4,6 +4,7 @@
 
 defmodule Pleroma.BBS.Authenticator do
   use Sshd.PasswordAuthenticator
+  alias Pleroma.Plugs.AuthenticationPlug
   alias Pleroma.User
 
   def authenticate(username, password) do
@@ -11,7 +12,7 @@ defmodule Pleroma.BBS.Authenticator do
     password = to_string(password)
 
     with %User{} = user <- User.get_by_nickname(username) do
-      Pbkdf2.verify_pass(password, user.password_hash)
+      AuthenticationPlug.checkpw(password, user.password_hash)
     else
       _e -> false
     end
index 4097ee5b75cbe7ea6a58a7f00a1e36714f47d952..2b43d4c365f91586b5e0a9b569958fce83048a74 100644 (file)
@@ -278,6 +278,8 @@ defmodule Pleroma.ConfigDB do
     }
   end
 
+  defp do_convert({:partial_chain, entity}), do: %{"tuple" => [":partial_chain", inspect(entity)]}
+
   defp do_convert(entity) when is_tuple(entity) do
     value =
       entity
@@ -321,6 +323,15 @@ defmodule Pleroma.ConfigDB do
     {:proxy_url, {do_transform_string(type), parse_host(host), port}}
   end
 
+  defp do_transform(%{"tuple" => [":partial_chain", entity]}) do
+    {partial_chain, []} =
+      entity
+      |> String.replace(~r/[^\w|^{:,[|^,|^[|^\]^}|^\/|^\.|^"]^\s/, "")
+      |> Code.eval_string()
+
+    {:partial_chain, partial_chain}
+  end
+
   defp do_transform(%{"tuple" => entity}) do
     Enum.reduce(entity, {}, fn val, acc -> Tuple.append(acc, do_transform(val)) end)
   end
index 3a9eec5ea445f33f3b4cf7351476a87a477138c0..06174f624a6d4d80a1c457a74f5e888122a5b516 100644 (file)
@@ -17,7 +17,8 @@ defmodule Pleroma.Constants do
       "announcement_count",
       "emoji",
       "context_id",
-      "deleted_activity_id"
+      "deleted_activity_id",
+      "pleroma_internal"
     ]
   )
 
index 74f8b261507e0c8db343ac01eeccbc53b08060cf..d1cf1f487b447ae994f982dd5359c1211402a1d4 100644 (file)
@@ -18,7 +18,6 @@ defmodule Pleroma.Docs.JSON do
     with config <- Pleroma.Config.Loader.read("config/description.exs") do
       config[:pleroma][:config_description]
       |> Pleroma.Docs.Generator.convert_to_strings()
-      |> Jason.encode!()
     end
   end
 end
index ae4a235bdcd0a8e8b32e25c0c3ef32efd2f44721..2cdf6c9511f986b44c0266a19012a38ba76c0ca2 100644 (file)
@@ -16,6 +16,11 @@ defmodule Pleroma.Plugs.AuthenticationPlug do
     :crypt.crypt(password, password_hash) == password_hash
   end
 
+  def checkpw(password, "$2" <> _ = password_hash) do
+    # Handle bcrypt passwords for Mastodon migration
+    Bcrypt.verify_pass(password, password_hash)
+  end
+
   def checkpw(password, "$pbkdf2" <> _ = password_hash) do
     Pbkdf2.verify_pass(password, password_hash)
   end
@@ -36,7 +41,7 @@ defmodule Pleroma.Plugs.AuthenticationPlug do
         } = conn,
         _
       ) do
-    if Pbkdf2.verify_pass(password, password_hash) do
+    if checkpw(password, password_hash) do
       conn
       |> assign(:user, auth_user)
       |> OAuthScopesPlug.skip_plug()
index 762d813d98a279f409f248e148a5742a26a0e9d7..1be1a3a5b3e03c371b89549374b8cf9579187e0c 100644 (file)
@@ -134,7 +134,7 @@ defmodule Pleroma.Upload do
     end
   end
 
-  defp prepare_upload(%{"img" => "data:image/" <> image_data}, opts) do
+  defp prepare_upload(%{img: "data:image/" <> image_data}, opts) do
     parsed = Regex.named_captures(~r/(?<filetype>jpeg|png|gif);base64,(?<data>.*)/, image_data)
     data = Base.decode64!(parsed["data"], ignore: :whitespace)
     hash = String.downcase(Base.encode16(:crypto.hash(:sha256, data)))
index 9821173d0569a25314fb8456c0ffad721490da2c..451dc92d6766d3896659ce972872bf616a85fca1 100644 (file)
@@ -37,7 +37,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
 
   require Logger
 
-  @descriptions_json Pleroma.Docs.JSON.compile()
+  @descriptions Pleroma.Docs.JSON.compile()
   @users_page_size 50
 
   plug(
@@ -897,9 +897,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
   end
 
   def config_descriptions(conn, _params) do
-    conn
-    |> Plug.Conn.put_resp_content_type("application/json")
-    |> Plug.Conn.send_resp(200, @descriptions_json)
+    descriptions = Enum.filter(@descriptions, &whitelisted_config?/1)
+
+    json(conn, descriptions)
   end
 
   def config_show(conn, %{"only_db" => true}) do
@@ -954,7 +954,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
   def config_update(conn, %{"configs" => configs}) do
     with :ok <- configurable_from_database(conn) do
       {_errors, results} =
-        Enum.map(configs, fn
+        configs
+        |> Enum.filter(&whitelisted_config?/1)
+        |> Enum.map(fn
           %{"group" => group, "key" => key, "delete" => true} = params ->
             ConfigDB.delete(%{group: group, key: key, subkeys: params["subkeys"]})
 
@@ -1016,6 +1018,28 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
     end
   end
 
+  defp whitelisted_config?(group, key) do
+    if whitelisted_configs = Config.get(:database_config_whitelist) do
+      Enum.any?(whitelisted_configs, fn
+        {whitelisted_group} ->
+          group == inspect(whitelisted_group)
+
+        {whitelisted_group, whitelisted_key} ->
+          group == inspect(whitelisted_group) && key == inspect(whitelisted_key)
+      end)
+    else
+      true
+    end
+  end
+
+  defp whitelisted_config?(%{"group" => group, "key" => key}) do
+    whitelisted_config?(group, key)
+  end
+
+  defp whitelisted_config?(%{:group => group} = config) do
+    whitelisted_config?(group, config[:key])
+  end
+
   def reload_emoji(conn, _params) do
     Pleroma.Emoji.reload()
 
index 183df43eea9a03819753219ec33b31edac1b3a25..f0b558aa533aa25ff23aa199288fcefa40112c58 100644 (file)
@@ -54,4 +54,8 @@ defmodule Pleroma.Web.ApiSpec.Helpers do
   def empty_array_response do
     Operation.response("Empty array", "application/json", %Schema{type: :array, example: []})
   end
+
+  def no_content_response do
+    Operation.response("No Content", "application/json", %Schema{type: :string, example: ""})
+  end
 end
index 70069d6f9671307ec3f07e44b5a8523dedd3fa26..988bab88234b57c763216080fdd20e25e601e78c 100644 (file)
@@ -367,15 +367,18 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
       title: "AccountCreateRequest",
       description: "POST body for creating an account",
       type: :object,
+      required: [:username, :password, :agreement],
       properties: %{
         reason: %Schema{
           type: :string,
+          nullable: true,
           description:
             "Text that will be reviewed by moderators if registrations require manual approval"
         },
         username: %Schema{type: :string, description: "The desired username for the account"},
         email: %Schema{
           type: :string,
+          nullable: true,
           description:
             "The email address to be used for login. Required when `account_activation_required` is enabled.",
           format: :email
@@ -392,23 +395,33 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
         },
         locale: %Schema{
           type: :string,
+          nullable: true,
           description: "The language of the confirmation email that will be sent"
         },
         # Pleroma-specific properties:
-        fullname: %Schema{type: :string, description: "Full name"},
-        bio: %Schema{type: :string, description: "Bio", default: ""},
+        fullname: %Schema{type: :string, nullable: true, description: "Full name"},
+        bio: %Schema{type: :string, description: "Bio", nullable: true, default: ""},
         captcha_solution: %Schema{
           type: :string,
+          nullable: true,
           description: "Provider-specific captcha solution"
         },
-        captcha_token: %Schema{type: :string, description: "Provider-specific captcha token"},
-        captcha_answer_data: %Schema{type: :string, description: "Provider-specific captcha data"},
+        captcha_token: %Schema{
+          type: :string,
+          nullable: true,
+          description: "Provider-specific captcha token"
+        },
+        captcha_answer_data: %Schema{
+          type: :string,
+          nullable: true,
+          description: "Provider-specific captcha data"
+        },
         token: %Schema{
           type: :string,
+          nullable: true,
           description: "Invite token required when the registrations aren't public"
         }
       },
-      required: [:username, :password, :agreement],
       example: %{
         "username" => "cofe",
         "email" => "cofe@example.com",
@@ -447,28 +460,34 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
       properties: %{
         bot: %Schema{
           type: :boolean,
+          nullable: true,
           description: "Whether the account has a bot flag."
         },
         display_name: %Schema{
           type: :string,
+          nullable: true,
           description: "The display name to use for the profile."
         },
         note: %Schema{type: :string, description: "The account bio."},
         avatar: %Schema{
           type: :string,
+          nullable: true,
           description: "Avatar image encoded using multipart/form-data",
           format: :binary
         },
         header: %Schema{
           type: :string,
+          nullable: true,
           description: "Header image encoded using multipart/form-data",
           format: :binary
         },
         locked: %Schema{
           type: :boolean,
+          nullable: true,
           description: "Whether manual approval of follow requests is required."
         },
         fields_attributes: %Schema{
+          nullable: true,
           oneOf: [
             %Schema{type: :array, items: attribute_field()},
             %Schema{type: :object, additionalProperties: %Schema{type: attribute_field()}}
@@ -488,47 +507,65 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
         # Pleroma-specific fields
         no_rich_text: %Schema{
           type: :boolean,
+          nullable: true,
           description: "html tags are stripped from all statuses requested from the API"
         },
-        hide_followers: %Schema{type: :boolean, description: "user's followers will be hidden"},
-        hide_follows: %Schema{type: :boolean, description: "user's follows will be hidden"},
+        hide_followers: %Schema{
+          type: :boolean,
+          nullable: true,
+          description: "user's followers will be hidden"
+        },
+        hide_follows: %Schema{
+          type: :boolean,
+          nullable: true,
+          description: "user's follows will be hidden"
+        },
         hide_followers_count: %Schema{
           type: :boolean,
+          nullable: true,
           description: "user's follower count will be hidden"
         },
         hide_follows_count: %Schema{
           type: :boolean,
+          nullable: true,
           description: "user's follow count will be hidden"
         },
         hide_favorites: %Schema{
           type: :boolean,
+          nullable: true,
           description: "user's favorites timeline will be hidden"
         },
         show_role: %Schema{
           type: :boolean,
+          nullable: true,
           description: "user's role (e.g admin, moderator) will be exposed to anyone in the
         API"
         },
         default_scope: VisibilityScope,
         pleroma_settings_store: %Schema{
           type: :object,
+          nullable: true,
           description: "Opaque user settings to be saved on the backend."
         },
         skip_thread_containment: %Schema{
           type: :boolean,
+          nullable: true,
           description: "Skip filtering out broken threads"
         },
         allow_following_move: %Schema{
           type: :boolean,
+          nullable: true,
           description: "Allows automatically follow moved following accounts"
         },
         pleroma_background_image: %Schema{
           type: :string,
+          nullable: true,
           description: "Sets the background image of the user.",
           format: :binary
         },
         discoverable: %Schema{
           type: :boolean,
+          nullable: true,
           description:
             "Discovery of this account in search results and other services is allowed."
         },
@@ -624,7 +661,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
       description: "POST body for muting an account",
       type: :object,
       properties: %{
-        uri: %Schema{type: :string, format: :uri}
+        uri: %Schema{type: :string, nullable: true, format: :uri}
       },
       required: [:uri]
     }
@@ -638,6 +675,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do
       properties: %{
         notifications: %Schema{
           type: :boolean,
+          nullable: true,
           description: "Mute notifications in addition to statuses? Defaults to true.",
           default: true
         }
index f6ccd073fec07d8348d33e20f257e4a1eabcee2a..ae01cbbec0b34dc0e05b0fb9d9c3e60a2b1a66a9 100644 (file)
@@ -105,7 +105,11 @@ defmodule Pleroma.Web.ApiSpec.AppOperation do
           description: "Space separated list of scopes",
           default: "read"
         },
-        website: %Schema{type: :string, description: "A URL to the homepage of your app"}
+        website: %Schema{
+          type: :string,
+          nullable: true,
+          description: "A URL to the homepage of your app"
+        }
       },
       required: [:client_name, :redirect_uris],
       example: %{
index 53e57b46bc6ce04919aa7efb252d248c625d1b1c..7310c1c4d5e0e49c072d9f8629f5c0aa9e92e3d0 100644 (file)
@@ -199,12 +199,14 @@ defmodule Pleroma.Web.ApiSpec.FilterOperation do
             "Array of enumerable strings `home`, `notifications`, `public`, `thread`. At least one context must be specified."
         },
         irreversible: %Schema{
-          type: :bolean,
+          type: :boolean,
+          nullable: true,
           description:
             "Should the server irreversibly drop matching entities from home and notifications?"
         },
         whole_word: %Schema{
-          type: :bolean,
+          type: :boolean,
+          nullable: true,
           description: "Consider word boundaries?",
           default: true
         }
index 06620492a32daa6e320b1c652cba574325ac36ca..714ef1f992f7b34610169cff6484ff49a290b221 100644 (file)
@@ -110,14 +110,16 @@ defmodule Pleroma.Web.ApiSpec.MarkerOperation do
       properties: %{
         notifications: %Schema{
           type: :object,
+          nullable: true,
           properties: %{
-            last_read_id: %Schema{type: :string}
+            last_read_id: %Schema{nullable: true, type: :string}
           }
         },
         home: %Schema{
           type: :object,
+          nullable: true,
           properties: %{
-            last_read_id: %Schema{type: :string}
+            last_read_id: %Schema{nullable: true, type: :string}
           }
         }
       },
diff --git a/lib/pleroma/web/api_spec/operations/pleroma_account_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_account_operation.ex
new file mode 100644 (file)
index 0000000..90922c0
--- /dev/null
@@ -0,0 +1,187 @@
+# Pleroma: A lightweight social networking server
+# Copyright Â© 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.ApiSpec.PleromaAccountOperation do
+  alias OpenApiSpex.Operation
+  alias OpenApiSpex.Schema
+  alias Pleroma.Web.ApiSpec.Schemas.AccountRelationship
+  alias Pleroma.Web.ApiSpec.Schemas.ApiError
+  alias Pleroma.Web.ApiSpec.Schemas.FlakeID
+  alias Pleroma.Web.ApiSpec.StatusOperation
+
+  import Pleroma.Web.ApiSpec.Helpers
+
+  def open_api_operation(action) do
+    operation = String.to_existing_atom("#{action}_operation")
+    apply(__MODULE__, operation, [])
+  end
+
+  def confirmation_resend_operation do
+    %Operation{
+      tags: ["Accounts"],
+      summary: "Resend confirmation email. Expects `email` or `nickname`",
+      operationId: "PleromaAPI.AccountController.confirmation_resend",
+      parameters: [
+        Operation.parameter(:email, :query, :string, "Email of that needs to be verified",
+          example: "cofe@cofe.io"
+        ),
+        Operation.parameter(
+          :nickname,
+          :query,
+          :string,
+          "Nickname of user that needs to be verified",
+          example: "cofefe"
+        )
+      ],
+      responses: %{
+        204 => no_content_response()
+      }
+    }
+  end
+
+  def update_avatar_operation do
+    %Operation{
+      tags: ["Accounts"],
+      summary: "Set/clear user avatar image",
+      operationId: "PleromaAPI.AccountController.update_avatar",
+      requestBody:
+        request_body("Parameters", update_avatar_or_background_request(), required: true),
+      security: [%{"oAuth" => ["write:accounts"]}],
+      responses: %{
+        200 => update_response(),
+        403 => Operation.response("Forbidden", "application/json", ApiError)
+      }
+    }
+  end
+
+  def update_banner_operation do
+    %Operation{
+      tags: ["Accounts"],
+      summary: "Set/clear user banner image",
+      operationId: "PleromaAPI.AccountController.update_banner",
+      requestBody: request_body("Parameters", update_banner_request(), required: true),
+      security: [%{"oAuth" => ["write:accounts"]}],
+      responses: %{
+        200 => update_response()
+      }
+    }
+  end
+
+  def update_background_operation do
+    %Operation{
+      tags: ["Accounts"],
+      summary: "Set/clear user background image",
+      operationId: "PleromaAPI.AccountController.update_background",
+      security: [%{"oAuth" => ["write:accounts"]}],
+      requestBody:
+        request_body("Parameters", update_avatar_or_background_request(), required: true),
+      responses: %{
+        200 => update_response()
+      }
+    }
+  end
+
+  def favourites_operation do
+    %Operation{
+      tags: ["Accounts"],
+      summary: "Returns favorites timeline of any user",
+      operationId: "PleromaAPI.AccountController.favourites",
+      parameters: [id_param() | pagination_params()],
+      security: [%{"oAuth" => ["read:favourites"]}],
+      responses: %{
+        200 =>
+          Operation.response(
+            "Array of Statuses",
+            "application/json",
+            StatusOperation.array_of_statuses()
+          ),
+        403 => Operation.response("Forbidden", "application/json", ApiError),
+        404 => Operation.response("Not Found", "application/json", ApiError)
+      }
+    }
+  end
+
+  def subscribe_operation do
+    %Operation{
+      tags: ["Accounts"],
+      summary: "Subscribe to receive notifications for all statuses posted by a user",
+      operationId: "PleromaAPI.AccountController.subscribe",
+      parameters: [id_param()],
+      security: [%{"oAuth" => ["follow", "write:follows"]}],
+      responses: %{
+        200 => Operation.response("Relationship", "application/json", AccountRelationship),
+        404 => Operation.response("Not Found", "application/json", ApiError)
+      }
+    }
+  end
+
+  def unsubscribe_operation do
+    %Operation{
+      tags: ["Accounts"],
+      summary: "Unsubscribe to stop receiving notifications from user statuses",
+      operationId: "PleromaAPI.AccountController.unsubscribe",
+      parameters: [id_param()],
+      security: [%{"oAuth" => ["follow", "write:follows"]}],
+      responses: %{
+        200 => Operation.response("Relationship", "application/json", AccountRelationship),
+        404 => Operation.response("Not Found", "application/json", ApiError)
+      }
+    }
+  end
+
+  defp id_param do
+    Operation.parameter(:id, :path, FlakeID, "Account ID",
+      example: "9umDrYheeY451cQnEe",
+      required: true
+    )
+  end
+
+  defp update_avatar_or_background_request do
+    %Schema{
+      title: "PleromaAccountUpdateAvatarOrBackgroundRequest",
+      type: :object,
+      properties: %{
+        img: %Schema{
+          nullable: true,
+          type: :string,
+          format: :binary,
+          description: "Image encoded using `multipart/form-data` or an empty string to clear"
+        }
+      }
+    }
+  end
+
+  defp update_banner_request do
+    %Schema{
+      title: "PleromaAccountUpdateBannerRequest",
+      type: :object,
+      properties: %{
+        banner: %Schema{
+          type: :string,
+          nullable: true,
+          format: :binary,
+          description: "Image encoded using `multipart/form-data` or an empty string to clear"
+        }
+      }
+    }
+  end
+
+  defp update_response do
+    Operation.response("PleromaAccountUpdateResponse", "application/json", %Schema{
+      type: :object,
+      properties: %{
+        url: %Schema{
+          type: :string,
+          format: :uri,
+          nullable: true,
+          description: "Image URL"
+        }
+      },
+      example: %{
+        "url" =>
+          "https://cofe.party/media/9d0add56-bcb6-4c0f-8225-cbbd0b6dd773/13eadb6972c9ccd3f4ffa3b8196f0e0d38b4d2f27594457c52e52946c054cd9a.gif"
+      }
+    })
+  end
+end
index da4d50703bffdd2f6ec80901ce2873a53b9d5442..882177c96968a4a659b73dd6c5efe18e7329eb8a 100644 (file)
@@ -37,15 +37,18 @@ defmodule Pleroma.Web.ApiSpec.ReportOperation do
         account_id: %Schema{type: :string, description: "ID of the account to report"},
         status_ids: %Schema{
           type: :array,
+          nullable: true,
           items: %Schema{type: :string},
           description: "Array of Statuses to attach to the report, for context"
         },
         comment: %Schema{
           type: :string,
+          nullable: true,
           description: "Reason for the report"
         },
         forward: %Schema{
           type: :boolean,
+          nullable: true,
           default: false,
           description:
             "If the account is remote, should the report be forwarded to the remote admin?"
index a6bb87560c749187f05ce6290db43ae2e6004e16..fc2909d8c76bd2c3e6807e9267b6575510cc05fd 100644 (file)
@@ -360,7 +360,7 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
     }
   end
 
-  defp array_of_statuses do
+  def array_of_statuses do
     %Schema{type: :array, items: Status, example: [Status.schema().example]}
   end
 
@@ -371,15 +371,18 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
       properties: %{
         status: %Schema{
           type: :string,
+          nullable: true,
           description:
             "Text content of the status. If `media_ids` is provided, this becomes optional. Attaching a `poll` is optional while `status` is provided."
         },
         media_ids: %Schema{
+          nullable: true,
           type: :array,
           items: %Schema{type: :string},
           description: "Array of Attachment ids to be attached as media."
         },
         poll: %Schema{
+          nullable: true,
           type: :object,
           required: [:options],
           properties: %{
@@ -390,26 +393,35 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
             },
             expires_in: %Schema{
               type: :integer,
+              nullable: true,
               description:
                 "Duration the poll should be open, in seconds. Must be provided with `poll[options]`"
             },
-            multiple: %Schema{type: :boolean, description: "Allow multiple choices?"},
+            multiple: %Schema{
+              type: :boolean,
+              nullable: true,
+              description: "Allow multiple choices?"
+            },
             hide_totals: %Schema{
               type: :boolean,
+              nullable: true,
               description: "Hide vote counts until the poll ends?"
             }
           }
         },
         in_reply_to_id: %Schema{
+          nullable: true,
           allOf: [FlakeID],
           description: "ID of the status being replied to, if status is a reply"
         },
         sensitive: %Schema{
           type: :boolean,
+          nullable: true,
           description: "Mark status and attached media as sensitive?"
         },
         spoiler_text: %Schema{
           type: :string,
+          nullable: true,
           description:
             "Text to be shown as a warning or subject before the actual content. Statuses are generally collapsed behind this field."
         },
@@ -420,25 +432,33 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
           description:
             "ISO 8601 Datetime at which to schedule a status. Providing this paramter will cause ScheduledStatus to be returned instead of Status. Must be at least 5 minutes in the future."
         },
-        language: %Schema{type: :string, description: "ISO 639 language code for this status."},
+        language: %Schema{
+          type: :string,
+          nullable: true,
+          description: "ISO 639 language code for this status."
+        },
         # Pleroma-specific properties:
         preview: %Schema{
           type: :boolean,
+          nullable: true,
           description:
             "If set to `true` the post won't be actually posted, but the status entitiy would still be rendered back. This could be useful for previewing rich text/custom emoji, for example"
         },
         content_type: %Schema{
           type: :string,
+          nullable: true,
           description:
             "The MIME type of the status, it is transformed into HTML by the backend. You can get the list of the supported MIME types with the nodeinfo endpoint."
         },
         to: %Schema{
           type: :array,
+          nullable: true,
           items: %Schema{type: :string},
           description:
             "A list of nicknames (like `lain@soykaf.club` or `lain` on the local server) that will be used to determine who is going to be addressed by this post. Using this will disable the implicit addressing by mentioned names in the `status` body, only the people in the `to` list will be addressed. The normal rules for for post visibility are not affected by this and will still apply"
         },
         visibility: %Schema{
+          nullable: true,
           anyOf: [
             VisibilityScope,
             %Schema{type: :string, description: "`list:LIST_ID`", example: "LIST:123"}
@@ -447,11 +467,13 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do
             "Visibility of the posted status. Besides standard MastoAPI values (`direct`, `private`, `unlisted` or `public`) it can be used to address a List by setting it to `list:LIST_ID`"
         },
         expires_in: %Schema{
+          nullable: true,
           type: :integer,
           description:
             "The number of seconds the posted activity should expire in. When a posted activity expires it will be deleted from the server, and a delete request for it will be federated. This needs to be longer than an hour."
         },
         in_reply_to_conversation_id: %Schema{
+          nullable: true,
           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`."
index 663b8fa1159850b525090b6ebbaeae140da4f132..cf6dcb06850d04a2712a8c5afb808e87bf7a0993 100644 (file)
@@ -109,19 +109,38 @@ defmodule Pleroma.Web.ApiSpec.SubscriptionOperation do
           required: [:endpoint, :keys]
         },
         data: %Schema{
+          nullable: true,
           type: :object,
           properties: %{
             alerts: %Schema{
+              nullable: true,
               type: :object,
               properties: %{
-                follow: %Schema{type: :boolean, description: "Receive follow notifications?"},
+                follow: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive follow notifications?"
+                },
                 favourite: %Schema{
                   type: :boolean,
+                  nullable: true,
                   description: "Receive favourite notifications?"
                 },
-                reblog: %Schema{type: :boolean, description: "Receive reblog notifications?"},
-                mention: %Schema{type: :boolean, description: "Receive mention notifications?"},
-                poll: %Schema{type: :boolean, description: "Receive poll notifications?"}
+                reblog: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive reblog notifications?"
+                },
+                mention: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive mention notifications?"
+                },
+                poll: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive poll notifications?"
+                }
               }
             }
           }
@@ -154,19 +173,38 @@ defmodule Pleroma.Web.ApiSpec.SubscriptionOperation do
       type: :object,
       properties: %{
         data: %Schema{
+          nullable: true,
           type: :object,
           properties: %{
             alerts: %Schema{
+              nullable: true,
               type: :object,
               properties: %{
-                follow: %Schema{type: :boolean, description: "Receive follow notifications?"},
+                follow: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive follow notifications?"
+                },
                 favourite: %Schema{
                   type: :boolean,
+                  nullable: true,
                   description: "Receive favourite notifications?"
                 },
-                reblog: %Schema{type: :boolean, description: "Receive reblog notifications?"},
-                mention: %Schema{type: :boolean, description: "Receive mention notifications?"},
-                poll: %Schema{type: :boolean, description: "Receive poll notifications?"}
+                reblog: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive reblog notifications?"
+                },
+                mention: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive mention notifications?"
+                },
+                poll: %Schema{
+                  type: :boolean,
+                  nullable: true,
+                  description: "Receive poll notifications?"
+                }
               }
             }
           }
index 04e489c8398fe14ec33aae4e64772b169c1a41d9..ce8a76219f3d48e940ba83474abcd48baa7894f0 100644 (file)
@@ -5,6 +5,7 @@
 defmodule Pleroma.Web.Auth.TOTPAuthenticator do
   alias Pleroma.MFA
   alias Pleroma.MFA.TOTP
+  alias Pleroma.Plugs.AuthenticationPlug
   alias Pleroma.User
 
   @doc "Verify code or check backup code."
@@ -30,7 +31,7 @@ defmodule Pleroma.Web.Auth.TOTPAuthenticator do
         code
       )
       when is_list(codes) and is_binary(code) do
-    hash_code = Enum.find(codes, fn hash -> Pbkdf2.verify_pass(code, hash) end)
+    hash_code = Enum.find(codes, fn hash -> AuthenticationPlug.checkpw(code, hash) end)
 
     if hash_code do
       MFA.invalidate_backup_code(user, hash_code)
index 0814b3bc34f43a7d91a05c2848562b41037c2b54..6cbbe8fd8dbb7ea1f879f4686a4a955f7671073e 100644 (file)
@@ -5,6 +5,7 @@
 defmodule Pleroma.Web.MongooseIM.MongooseIMController do
   use Pleroma.Web, :controller
 
+  alias Pleroma.Plugs.AuthenticationPlug
   alias Pleroma.Plugs.RateLimiter
   alias Pleroma.Repo
   alias Pleroma.User
@@ -27,7 +28,7 @@ defmodule Pleroma.Web.MongooseIM.MongooseIMController do
   def check_password(conn, %{"user" => username, "pass" => password}) do
     with %User{password_hash: password_hash, deactivated: false} <-
            Repo.get_by(User, nickname: username, local: true),
-         true <- Pbkdf2.verify_pass(password, password_hash) do
+         true <- AuthenticationPlug.checkpw(password, password_hash) do
       conn
       |> json(true)
     else
index be7477867b3592766fa10170331922c90c50c6a9..07078d41572bf84752ae531e31cd632ac82e6fea 100644 (file)
@@ -18,6 +18,13 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
 
   require Pleroma.Constants
 
+  plug(
+    OpenApiSpex.Plug.PutApiSpec,
+    [module: Pleroma.Web.ApiSpec] when action == :confirmation_resend
+  )
+
+  plug(Pleroma.Web.ApiSpec.CastAndValidate)
+
   plug(
     :skip_plug,
     [OAuthScopesPlug, EnsurePublicOrAuthenticatedPlug] when action == :confirmation_resend
@@ -49,9 +56,11 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
   plug(:assign_account_by_id when action in [:favourites, :subscribe, :unsubscribe])
   plug(:put_view, Pleroma.Web.MastodonAPI.AccountView)
 
+  defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaAccountOperation
+
   @doc "POST /api/v1/pleroma/accounts/confirmation_resend"
   def confirmation_resend(conn, params) do
-    nickname_or_email = params["email"] || params["nickname"]
+    nickname_or_email = params[:email] || params[:nickname]
 
     with %User{} = user <- User.get_by_nickname_or_email(nickname_or_email),
          {:ok, _} <- User.try_send_confirmation_email(user) do
@@ -60,7 +69,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
   end
 
   @doc "PATCH /api/v1/pleroma/accounts/update_avatar"
-  def update_avatar(%{assigns: %{user: user}} = conn, %{"img" => ""}) do
+  def update_avatar(%{assigns: %{user: user}, body_params: %{img: ""}} = conn, _) do
     {:ok, _user} =
       user
       |> Changeset.change(%{avatar: nil})
@@ -69,7 +78,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
     json(conn, %{url: nil})
   end
 
-  def update_avatar(%{assigns: %{user: user}} = conn, params) do
+  def update_avatar(%{assigns: %{user: user}, body_params: params} = conn, _params) do
     {:ok, %{data: data}} = ActivityPub.upload(params, type: :avatar)
     {:ok, _user} = user |> Changeset.change(%{avatar: data}) |> User.update_and_set_cache()
     %{"url" => [%{"href" => href} | _]} = data
@@ -78,14 +87,14 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
   end
 
   @doc "PATCH /api/v1/pleroma/accounts/update_banner"
-  def update_banner(%{assigns: %{user: user}} = conn, %{"banner" => ""}) do
+  def update_banner(%{assigns: %{user: user}, body_params: %{banner: ""}} = conn, _) do
     with {:ok, _user} <- User.update_banner(user, %{}) do
       json(conn, %{url: nil})
     end
   end
 
-  def update_banner(%{assigns: %{user: user}} = conn, params) do
-    with {:ok, object} <- ActivityPub.upload(%{"img" => params["banner"]}, type: :banner),
+  def update_banner(%{assigns: %{user: user}, body_params: params} = conn, _) do
+    with {:ok, object} <- ActivityPub.upload(%{img: params[:banner]}, type: :banner),
          {:ok, _user} <- User.update_banner(user, object.data) do
       %{"url" => [%{"href" => href} | _]} = object.data
 
@@ -94,13 +103,13 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
   end
 
   @doc "PATCH /api/v1/pleroma/accounts/update_background"
-  def update_background(%{assigns: %{user: user}} = conn, %{"img" => ""}) do
+  def update_background(%{assigns: %{user: user}, body_params: %{img: ""}} = conn, _) do
     with {:ok, _user} <- User.update_background(user, %{}) do
       json(conn, %{url: nil})
     end
   end
 
-  def update_background(%{assigns: %{user: user}} = conn, params) do
+  def update_background(%{assigns: %{user: user}, body_params: params} = conn, _) do
     with {:ok, object} <- ActivityPub.upload(params, type: :background),
          {:ok, _user} <- User.update_background(user, object.data) do
       %{"url" => [%{"href" => href} | _]} = object.data
@@ -117,6 +126,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
   def favourites(%{assigns: %{user: for_user, account: user}} = conn, params) do
     params =
       params
+      |> Map.new(fn {key, value} -> {to_string(key), value} end)
       |> Map.put("type", "Create")
       |> Map.put("favorited_by", user.ap_id)
       |> Map.put("blocking_user", for_user)
diff --git a/mix.exs b/mix.exs
index 0186d291fff2fc25ba9ae6bc64503abdbca28fe2..b8e663a0355955739c4a8fa145730c7ab8877a22 100644 (file)
--- a/mix.exs
+++ b/mix.exs
@@ -127,6 +127,7 @@ defmodule Pleroma.Mixfile do
       {:oban, "~> 1.2"},
       {:gettext, "~> 0.15"},
       {:pbkdf2_elixir, "~> 1.0"},
+      {:bcrypt_elixir, "~> 2.0"},
       {:trailing_format_plug, "~> 0.0.7"},
       {:fast_sanitize, "~> 0.1"},
       {:html_entities, "~> 0.5", override: true},
index 62fe35146d3b37b990b4d2f91dbfe15f663970f9..955b2bb376ef7b20c03d2c791175cdcdc4100da1 100644 (file)
--- a/mix.lock
+++ b/mix.lock
@@ -5,6 +5,7 @@
   "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"},
   "bbcode": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/bbcode.git", "f2d267675e9a7e1ad1ea9beb4cc23382762b66c2", [ref: "v0.2.0"]},
   "bbcode_pleroma": {:hex, :bbcode_pleroma, "0.2.0", "d36f5bca6e2f62261c45be30fa9b92725c0655ad45c99025cb1c3e28e25803ef", [:mix], [{:nimble_parsec, "~> 0.5", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "19851074419a5fedb4ef49e1f01b30df504bb5dbb6d6adfc135238063bebd1c3"},
+  "bcrypt_elixir": {:hex, :bcrypt_elixir, "2.2.0", "3df902b81ce7fa8867a2ae30d20a1da6877a2c056bfb116fd0bc8a5f0190cea4", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "762be3fcb779f08207531bc6612cca480a338e4b4357abb49f5ce00240a77d1e"},
   "benchee": {:hex, :benchee, "1.0.1", "66b211f9bfd84bd97e6d1beaddf8fc2312aaabe192f776e8931cb0c16f53a521", [:mix], [{:deep_merge, "~> 1.0", [hex: :deep_merge, repo: "hexpm", optional: false]}], "hexpm", "3ad58ae787e9c7c94dd7ceda3b587ec2c64604563e049b2a0e8baafae832addb"},
   "bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"},
   "cachex": {:hex, :cachex, "3.2.0", "a596476c781b0646e6cb5cd9751af2e2974c3e0d5498a8cab71807618b74fe2f", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "aef93694067a43697ae0531727e097754a9e992a1e7946296f5969d6dd9ac986"},
@@ -29,6 +30,7 @@
   "ecto": {:hex, :ecto, "3.4.0", "a7a83ab8359bf816ce729e5e65981ce25b9fc5adfc89c2ea3980f4fed0bfd7c1", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "5eed18252f5b5bbadec56a24112b531343507dbe046273133176b12190ce19cc"},
   "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_sql": {:hex, :ecto_sql, "3.3.4", "aa18af12eb875fbcda2f75e608b3bd534ebf020fc4f6448e4672fcdcbb081244", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4 or ~> 3.3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5eccbdbf92e3c6f213007a82d5dbba4cd9bb659d1a21331f89f408e4c0efd7a8"},
+  "elixir_make": {:hex, :elixir_make, "0.6.0", "38349f3e29aff4864352084fc736fa7fa0f2995a819a737554f7ebd28b85aaab", [:mix], [], "hexpm", "d522695b93b7f0b4c0fcb2dfe73a6b905b1c301226a5a55cb42e5b14d509e050"},
   "esshd": {:hex, :esshd, "0.1.1", "d4dd4c46698093a40a56afecce8a46e246eb35463c457c246dacba2e056f31b5", [:mix], [], "hexpm", "d73e341e3009d390aa36387dc8862860bf9f874c94d9fd92ade2926376f49981"},
   "eternal": {:hex, :eternal, "1.2.1", "d5b6b2499ba876c57be2581b5b999ee9bdf861c647401066d3eeed111d096bc4", [:mix], [], "hexpm", "b14f1dc204321429479c569cfbe8fb287541184ed040956c8862cb7a677b8406"},
   "ex2ms": {:hex, :ex2ms, "1.5.0", "19e27f9212be9a96093fed8cdfbef0a2b56c21237196d26760f11dfcfae58e97", [:mix], [], "hexpm"},
index 678b322891447bcbad56fc632738a4bcbe470104..406f98de9257f955273cc5e98410ce5bcac10cb2 100644 (file)
@@ -8,8 +8,16 @@
 ## to merge POT files into PO files.
 msgid ""
 msgstr ""
+"PO-Revision-Date: 2020-05-12 15:52+0000\n"
+"Last-Translator: Haelwenn (lanodan) Monnier "
+"<contact+translate.pleroma.social@hacktivis.me>\n"
+"Language-Team: French <https://translate.pleroma.social/projects/pleroma/"
+"pleroma/fr/>\n"
 "Language: fr\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Plural-Forms: nplurals=2; plural=n > 1;\n"
+"X-Generator: Weblate 4.0.4\n"
+"Content-Transfer-Encoding: 8bit\n"
 
 msgid "can't be blank"
 msgstr "ne peut ĂŞtre vide"
@@ -35,10 +43,10 @@ msgid "does not match confirmation"
 msgstr "ne correspondent pas"
 
 msgid "is still associated with this entry"
-msgstr ""
+msgstr "est toujours associĂ© Ă  cette entrĂ©e"
 
 msgid "are still associated with this entry"
-msgstr ""
+msgstr "sont toujours associĂ©s Ă  cette entrĂ©e"
 
 msgid "should be %{count} character(s)"
 msgid_plural "should be %{count} character(s)"
@@ -85,375 +93,375 @@ msgstr "doit ĂŞtre supĂ©rieur ou Ă©gal Ă  %{number}"
 msgid "must be equal to %{number}"
 msgstr "doit Ă©gal Ă  %{number}"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:381
+#, elixir-format
 msgid "Account not found"
 msgstr "Compte non trouvĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:153
+#, elixir-format
 msgid "Already voted"
 msgstr "A dĂ©jĂ  votĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:263
+#, elixir-format
 msgid "Bad request"
 msgstr "RequĂŞte Invalide"
 
-#, elixir-format
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:254
+#, elixir-format
 msgid "Can't delete object"
 msgstr "Ne peut supprimer cet objet"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:569
+#, elixir-format
 msgid "Can't delete this post"
 msgstr "Ne peut supprimer ce message"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1731
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1737
+#, elixir-format
 msgid "Can't display this activity"
 msgstr "Ne peut afficher cette activitĂ©e"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:195
+#, elixir-format
 msgid "Can't find user"
 msgstr "Compte non trouvĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1148
+#, elixir-format
 msgid "Can't get favorites"
 msgstr "Favoris non trouvables"
 
-#, elixir-format
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:263
+#, elixir-format
 msgid "Can't like object"
 msgstr "Ne peut aimer cet objet"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/utils.ex:518
+#, elixir-format
 msgid "Cannot post an empty status without attachments"
 msgstr "Ne peut envoyer un status vide sans attachements"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/utils.ex:461
+#, elixir-format
 msgid "Comment must be up to %{max_size} characters"
 msgstr "Le commentaire ne doit faire plus de %{max_size} charactères"
 
-#, elixir-format
 #: lib/pleroma/web/admin_api/config.ex:63
+#, elixir-format
 msgid "Config with params %{params} not found"
 msgstr "Configuration avec les paramètres %{params} non trouvĂ©e"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:78
+#, elixir-format
 msgid "Could not delete"
 msgstr "Échec de la suppression"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:110
+#, elixir-format
 msgid "Could not favorite"
 msgstr "Échec de mise en favoris"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:310
+#, elixir-format
 msgid "Could not pin"
 msgstr "Échec de l'Ă©pinglage"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:89
+#, elixir-format
 msgid "Could not repeat"
 msgstr "Échec de crĂ©ation la rĂ©pĂ©tition"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:120
+#, elixir-format
 msgid "Could not unfavorite"
 msgstr "Échec de suppression des favoris"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:327
+#, elixir-format
 msgid "Could not unpin"
 msgstr "Échec du dĂ©pinglage"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:99
+#, elixir-format
 msgid "Could not unrepeat"
 msgstr "Échec de suppression de la rĂ©pĂ©tition"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:392
+#, elixir-format
 msgid "Could not update state"
 msgstr "Échec de la mise Ă  jour du status"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1271
+#, elixir-format
 msgid "Error."
 msgstr "Erreur."
 
-#, elixir-format
 #: lib/pleroma/captcha/kocaptcha.ex:36
+#, elixir-format
 msgid "Invalid CAPTCHA"
 msgstr "CAPTCHA invalide"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1700
 #: lib/pleroma/web/oauth/oauth_controller.ex:465
+#, elixir-format
 msgid "Invalid credentials"
 msgstr "Paramètres d'authentification invalides"
 
-#, elixir-format
 #: lib/pleroma/plugs/ensure_authenticated_plug.ex:20
+#, elixir-format
 msgid "Invalid credentials."
 msgstr "Paramètres d'authentification invalides."
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:154
+#, elixir-format
 msgid "Invalid indices"
 msgstr "Indices invalides"
 
-#, elixir-format
 #: lib/pleroma/web/admin_api/admin_api_controller.ex:411
+#, elixir-format
 msgid "Invalid parameters"
 msgstr "Paramètres invalides"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/utils.ex:377
+#, elixir-format
 msgid "Invalid password."
 msgstr "Mot de passe invalide."
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:163
+#, elixir-format
 msgid "Invalid request"
 msgstr "RequĂŞte invalide"
 
-#, elixir-format
 #: lib/pleroma/captcha/kocaptcha.ex:16
+#, elixir-format
 msgid "Kocaptcha service unavailable"
 msgstr "Service Kocaptcha non disponible"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1696
+#, elixir-format
 msgid "Missing parameters"
 msgstr "Paramètres manquants"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/utils.ex:496
+#, elixir-format
 msgid "No such conversation"
 msgstr "Conversation inconnue"
 
-#, elixir-format
 #: lib/pleroma/web/admin_api/admin_api_controller.ex:163
 #: lib/pleroma/web/admin_api/admin_api_controller.ex:206
+#, elixir-format
 msgid "No such permission_group"
 msgstr "Groupe de permission inconnu"
 
-#, elixir-format
 #: lib/pleroma/plugs/uploaded_media.ex:69
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:311
 #: lib/pleroma/web/admin_api/admin_api_controller.ex:399
 #: lib/pleroma/web/mastodon_api/subscription_controller.ex:63
 #: lib/pleroma/web/ostatus/ostatus_controller.ex:248
+#, elixir-format
 msgid "Not found"
 msgstr "Non TrouvĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:152
+#, elixir-format
 msgid "Poll's author can't vote"
 msgstr "L'auteur·rice d'un sondage ne peut voter"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:443
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:444
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:473
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:476
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1180
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1564
+#, elixir-format
 msgid "Record not found"
 msgstr "Enregistrement non trouvĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/admin_api/admin_api_controller.ex:417
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1570
 #: lib/pleroma/web/mastodon_api/subscription_controller.ex:69
 #: lib/pleroma/web/ostatus/ostatus_controller.ex:252
+#, elixir-format
 msgid "Something went wrong"
 msgstr "Erreur inconnue"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:253
+#, elixir-format
 msgid "The message visibility must be direct"
 msgstr "La visibilitĂ©e du message doit ĂŞtre Â«Â direct »"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/utils.ex:521
+#, elixir-format
 msgid "The status is over the character limit"
 msgstr "Le status est au-delĂ  de la limite de charactères"
 
-#, elixir-format
 #: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:27
+#, elixir-format
 msgid "This resource requires authentication."
 msgstr "Cette resource nĂ©cessite une authentification."
 
-#, elixir-format
 #: lib/pleroma/plugs/rate_limiter.ex:89
+#, elixir-format
 msgid "Throttled"
 msgstr "LimitĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:155
+#, elixir-format
 msgid "Too many choices"
 msgstr "Trop de choix"
 
-#, elixir-format
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:268
+#, elixir-format
 msgid "Unhandled activity type"
 msgstr "Type d'activitĂ©e non-gĂ©rĂ©e"
 
-#, elixir-format
 #: lib/pleroma/plugs/user_is_admin_plug.ex:20
+#, elixir-format
 msgid "User is not admin."
 msgstr "Le compte n'est pas admin."
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:380
+#, elixir-format
 msgid "Valid `account_id` required"
 msgstr "Un `account_id` valide est requis"
 
-#, elixir-format
 #: lib/pleroma/web/admin_api/admin_api_controller.ex:185
+#, elixir-format
 msgid "You can't revoke your own admin status."
 msgstr "Vous ne pouvez rĂ©voquer votre propre status d'admin."
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:216
+#, elixir-format
 msgid "Your account is currently disabled"
 msgstr "Votre compte est actuellement dĂ©sactivĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:158
 #: lib/pleroma/web/oauth/oauth_controller.ex:213
+#, elixir-format
 msgid "Your login is missing a confirmed e-mail address"
 msgstr "Une confirmation de l'addresse de couriel est requise pour l'authentification"
 
-#, elixir-format
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:221
+#, elixir-format
 msgid "can't read inbox of %{nickname} as %{as_nickname}"
 msgstr "Ne peut lire la boite de rĂ©ception de %{nickname} en tant que %{as_nickname}"
 
-#, elixir-format
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:297
+#, elixir-format
 msgid "can't update outbox of %{nickname} as %{as_nickname}"
 msgstr "Ne peut poster dans la boite d'Ă©mission de %{nickname} en tant que %{as_nickname}"
 
-#, elixir-format
 #: lib/pleroma/web/common_api/common_api.ex:335
+#, elixir-format
 msgid "conversation is already muted"
 msgstr "la conversation est dĂ©jĂ  baillonĂ©e"
 
-#, elixir-format
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:192
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:317
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1196
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1247
+#, elixir-format
 msgid "error"
 msgstr "erreur"
 
-#, elixir-format
 #: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:789
+#, elixir-format
 msgid "mascots can only be images"
 msgstr "les mascottes ne peuvent ĂŞtre que des images"
 
-#, elixir-format
 #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:34
+#, elixir-format
 msgid "not found"
 msgstr "non trouvĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:298
+#, elixir-format
 msgid "Bad OAuth request."
 msgstr "RequĂŞte OAuth invalide."
 
-#, elixir-format
 #: lib/pleroma/captcha/captcha.ex:92
+#, elixir-format
 msgid "CAPTCHA already used"
 msgstr "CAPTCHA dĂ©jĂ  utilisĂ©"
 
-#, elixir-format
 #: lib/pleroma/captcha/captcha.ex:89
+#, elixir-format
 msgid "CAPTCHA expired"
 msgstr "CAPTCHA expirĂ©"
 
-#, elixir-format
 #: lib/pleroma/plugs/uploaded_media.ex:50
+#, elixir-format
 msgid "Failed"
 msgstr "Échec"
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:314
+#, elixir-format
 msgid "Failed to authenticate: %{message}."
-msgstr "Échec de l'authentification: %{message}"
+msgstr "Échec de l'authentification : %{message}."
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:345
+#, elixir-format
 msgid "Failed to set up user account."
 msgstr "Échec de crĂ©ation de votre compte."
 
-#, elixir-format
 #: lib/pleroma/plugs/oauth_scopes_plug.ex:37
+#, elixir-format
 msgid "Insufficient permissions: %{permissions}."
-msgstr "Permissions insuffisantes: %{permissions}."
+msgstr "Permissions insuffisantes : %{permissions}."
 
-#, elixir-format
 #: lib/pleroma/plugs/uploaded_media.ex:89
+#, elixir-format
 msgid "Internal Error"
 msgstr "Erreur interne"
 
-#, elixir-format
 #: lib/pleroma/web/oauth/fallback_controller.ex:22
 #: lib/pleroma/web/oauth/fallback_controller.ex:29
+#, elixir-format
 msgid "Invalid Username/Password"
 msgstr "Nom d'utilisateur/mot de passe invalide"
 
-#, elixir-format
 #: lib/pleroma/captcha/captcha.ex:107
+#, elixir-format
 msgid "Invalid answer data"
 msgstr "RĂ©ponse invalide"
 
-#, elixir-format
 #: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:204
+#, elixir-format
 msgid "Nodeinfo schema version not handled"
 msgstr "Version du schĂ©ma nodeinfo non gĂ©rĂ©"
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:145
+#, elixir-format
 msgid "This action is outside the authorized scopes"
-msgstr "Cette action est en dehors des authorisations" # "scopes" ?
+msgstr "Cette action est en dehors des authorisations" # "scopes"
 
-#, elixir-format
 #: lib/pleroma/web/oauth/fallback_controller.ex:14
+#, elixir-format
 msgid "Unknown error, please check the details and try again."
 msgstr "Erreur inconnue, veuillez vĂ©rifier les dĂ©tails et rĂ©essayer."
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:93
 #: lib/pleroma/web/oauth/oauth_controller.ex:131
+#, elixir-format
 msgid "Unlisted redirect_uri."
 msgstr "redirect_uri non listĂ©."
 
-#, elixir-format
 #: lib/pleroma/web/oauth/oauth_controller.ex:294
+#, elixir-format
 msgid "Unsupported OAuth provider: %{provider}."
 msgstr "Fournisseur OAuth non supporté : %{provider}."
 
-#, elixir-format
 #: lib/pleroma/uploaders/uploader.ex:71
+#, elixir-format
 msgid "Uploader callback timeout"
-msgstr ""
-## msgstr "Attente Ă©coulĂ©e"
+msgstr "Temps d'attente du tĂ©lĂ©verseur Ă©coulĂ©"
 
-#, elixir-format
+## msgstr "Attente Ă©coulĂ©e"
 #: lib/pleroma/web/uploader_controller.ex:11
 #: lib/pleroma/web/uploader_controller.ex:23
+#, elixir-format
 msgid "bad request"
 msgstr "requĂŞte invalide"
diff --git a/priv/gettext/pl/LC_MESSAGES/errors.po b/priv/gettext/pl/LC_MESSAGES/errors.po
new file mode 100644 (file)
index 0000000..af9e214
--- /dev/null
@@ -0,0 +1,587 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-05-13 16:37+0000\n"
+"PO-Revision-Date: 2020-05-14 14:37+0000\n"
+"Last-Translator: MichaĹ‚ Sidor <pleromeme@meekchopp.es>\n"
+"Language-Team: Polish <https://translate.pleroma.social/projects/pleroma/"
+"pleroma/pl/>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.0.4\n"
+
+## This file is a PO Template file.
+##
+## `msgid`s here are often extracted from source code.
+## Add new translations manually only if they're dynamic
+## translations that can't be statically extracted.
+##
+## Run `mix gettext.extract` to bring this file up to
+## date. Leave `msgstr`s empty as changing them here as no
+## effect: edit them in PO (`.po`) files instead.
+## From Ecto.Changeset.cast/4
+msgid "can't be blank"
+msgstr "nie moĹĽe być pusty"
+
+## From Ecto.Changeset.unique_constraint/3
+msgid "has already been taken"
+msgstr "jest juĹĽ zajÄ™ty"
+
+## From Ecto.Changeset.put_change/3
+msgid "is invalid"
+msgstr "jest nieprawidĹ‚owy"
+
+## From Ecto.Changeset.validate_format/3
+msgid "has invalid format"
+msgstr "ma niepoprawny format"
+
+## From Ecto.Changeset.validate_subset/3
+msgid "has an invalid entry"
+msgstr "ma niepoprawny wpis"
+
+## From Ecto.Changeset.validate_exclusion/3
+msgid "is reserved"
+msgstr ""
+
+## From Ecto.Changeset.validate_confirmation/3
+msgid "does not match confirmation"
+msgstr ""
+
+## From Ecto.Changeset.no_assoc_constraint/3
+msgid "is still associated with this entry"
+msgstr ""
+
+msgid "are still associated with this entry"
+msgstr ""
+
+## From Ecto.Changeset.validate_length/3
+msgid "should be %{count} character(s)"
+msgid_plural "should be %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "should have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "should be at least %{count} character(s)"
+msgid_plural "should be at least %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "should have at least %{count} item(s)"
+msgid_plural "should have at least %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "should be at most %{count} character(s)"
+msgid_plural "should be at most %{count} character(s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+msgid "should have at most %{count} item(s)"
+msgid_plural "should have at most %{count} item(s)"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+## From Ecto.Changeset.validate_number/3
+msgid "must be less than %{number}"
+msgstr ""
+
+msgid "must be greater than %{number}"
+msgstr ""
+
+msgid "must be less than or equal to %{number}"
+msgstr ""
+
+msgid "must be greater than or equal to %{number}"
+msgstr ""
+
+msgid "must be equal to %{number}"
+msgstr ""
+
+#: lib/pleroma/web/common_api/common_api.ex:421
+#, elixir-format
+msgid "Account not found"
+msgstr "Nie znaleziono konta"
+
+#: lib/pleroma/web/common_api/common_api.ex:249
+#, elixir-format
+msgid "Already voted"
+msgstr "JuĹĽ zagĹ‚osowano"
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:360
+#, elixir-format
+msgid "Bad request"
+msgstr "NieprawidĹ‚owe ĹĽÄ…danie"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:425
+#, elixir-format
+msgid "Can't delete object"
+msgstr "Nie moĹĽna usunąć obiektu"
+
+#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:196
+#, elixir-format
+msgid "Can't delete this post"
+msgstr "Nie udaĹ‚o siÄ™ usunąć tego statusu"
+
+#: lib/pleroma/web/controller_helper.ex:95
+#: lib/pleroma/web/controller_helper.ex:101
+#, elixir-format
+msgid "Can't display this activity"
+msgstr "Nie moĹĽna wyĹ›wietlić tej aktywnoĹ›ci"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:227
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:254
+#, elixir-format
+msgid "Can't find user"
+msgstr "Nie znaleziono uĹĽytkownika"
+
+#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:114
+#, elixir-format
+msgid "Can't get favorites"
+msgstr ""
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:437
+#, elixir-format
+msgid "Can't like object"
+msgstr "Nie udaĹ‚o siÄ™ polubić obiektu"
+
+#: lib/pleroma/web/common_api/utils.ex:556
+#, elixir-format
+msgid "Cannot post an empty status without attachments"
+msgstr "Nie moĹĽna opublikować pustego statusu bez zaĹ‚Ä…cznikĂłw"
+
+#: lib/pleroma/web/common_api/utils.ex:504
+#, elixir-format
+msgid "Comment must be up to %{max_size} characters"
+msgstr "Komentarz moĹĽe mieć co najwyĹĽej %{max_size} znakĂłw"
+
+#: lib/pleroma/config/config_db.ex:222
+#, elixir-format
+msgid "Config with params %{params} not found"
+msgstr ""
+
+#: lib/pleroma/web/common_api/common_api.ex:95
+#, elixir-format
+msgid "Could not delete"
+msgstr "Nie udaĹ‚o siÄ™ usunąć"
+
+#: lib/pleroma/web/common_api/common_api.ex:141
+#, elixir-format
+msgid "Could not favorite"
+msgstr "Nie udaĹ‚o siÄ™ dodać do ulubionych"
+
+#: lib/pleroma/web/common_api/common_api.ex:370
+#, elixir-format
+msgid "Could not pin"
+msgstr "Nie udaĹ‚o siÄ™ przypiąć"
+
+#: lib/pleroma/web/common_api/common_api.ex:112
+#, elixir-format
+msgid "Could not repeat"
+msgstr "Nie udaĹ‚o siÄ™ powtĂłrzyć"
+
+#: lib/pleroma/web/common_api/common_api.ex:188
+#, elixir-format
+msgid "Could not unfavorite"
+msgstr "Nie udaĹ‚o siÄ™ usunąć z ulubionych"
+
+#: lib/pleroma/web/common_api/common_api.ex:380
+#, elixir-format
+msgid "Could not unpin"
+msgstr "Nie udaĹ‚o siÄ™ odpiąć"
+
+#: lib/pleroma/web/common_api/common_api.ex:126
+#, elixir-format
+msgid "Could not unrepeat"
+msgstr "Nie udaĹ‚o siÄ™ cofnąć powtĂłrzenia"
+
+#: lib/pleroma/web/common_api/common_api.ex:428
+#: lib/pleroma/web/common_api/common_api.ex:437
+#, elixir-format
+msgid "Could not update state"
+msgstr ""
+
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:202
+#, elixir-format
+msgid "Error."
+msgstr ""
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:106
+#, elixir-format
+msgid "Invalid CAPTCHA"
+msgstr ""
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:117
+#: lib/pleroma/web/oauth/oauth_controller.ex:569
+#, elixir-format
+msgid "Invalid credentials"
+msgstr ""
+
+#: lib/pleroma/plugs/ensure_authenticated_plug.ex:38
+#, elixir-format
+msgid "Invalid credentials."
+msgstr ""
+
+#: lib/pleroma/web/common_api/common_api.ex:265
+#, elixir-format
+msgid "Invalid indices"
+msgstr ""
+
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:1147
+#, elixir-format
+msgid "Invalid parameters"
+msgstr ""
+
+#: lib/pleroma/web/common_api/utils.ex:411
+#, elixir-format
+msgid "Invalid password."
+msgstr "NieprawidĹ‚owe hasĹ‚o."
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:187
+#, elixir-format
+msgid "Invalid request"
+msgstr "NieprawidĹ‚owe ĹĽÄ…danie"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:109
+#, elixir-format
+msgid "Kocaptcha service unavailable"
+msgstr "UsĹ‚uga Kocaptcha niedostÄ™pna"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:113
+#, elixir-format
+msgid "Missing parameters"
+msgstr "BrakujÄ…ce parametry"
+
+#: lib/pleroma/web/common_api/utils.ex:540
+#, elixir-format
+msgid "No such conversation"
+msgstr "Nie ma takiej rozmowy"
+
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:439
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:465 lib/pleroma/web/admin_api/admin_api_controller.ex:507
+#, elixir-format
+msgid "No such permission_group"
+msgstr "Nie ma takiej grupy uprawnieĹ„"
+
+#: lib/pleroma/plugs/uploaded_media.ex:74
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:485 lib/pleroma/web/admin_api/admin_api_controller.ex:1135
+#: lib/pleroma/web/feed/user_controller.ex:73 lib/pleroma/web/ostatus/ostatus_controller.ex:143
+#, elixir-format
+msgid "Not found"
+msgstr "Nie znaleziono"
+
+#: lib/pleroma/web/common_api/common_api.ex:241
+#, elixir-format
+msgid "Poll's author can't vote"
+msgstr "Autor ankiety nie moĹĽe gĹ‚osować"
+
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:37 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:49
+#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:50 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:290
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71
+#, elixir-format
+msgid "Record not found"
+msgstr "Nie znaleziono rekordu"
+
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:1153
+#: lib/pleroma/web/feed/user_controller.ex:79 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:32
+#: lib/pleroma/web/ostatus/ostatus_controller.ex:149
+#, elixir-format
+msgid "Something went wrong"
+msgstr "CoĹ› siÄ™ zepsuĹ‚o"
+
+#: lib/pleroma/web/common_api/activity_draft.ex:107
+#, elixir-format
+msgid "The message visibility must be direct"
+msgstr ""
+
+#: lib/pleroma/web/common_api/utils.ex:566
+#, elixir-format
+msgid "The status is over the character limit"
+msgstr "Ten status przekracza limit znakĂłw"
+
+#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:31
+#, elixir-format
+msgid "This resource requires authentication."
+msgstr ""
+
+#: lib/pleroma/plugs/rate_limiter/rate_limiter.ex:206
+#, elixir-format
+msgid "Throttled"
+msgstr ""
+
+#: lib/pleroma/web/common_api/common_api.ex:266
+#, elixir-format
+msgid "Too many choices"
+msgstr ""
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:442
+#, elixir-format
+msgid "Unhandled activity type"
+msgstr "NieobsĹ‚ugiwany typ aktywnoĹ›ci"
+
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:536
+#, elixir-format
+msgid "You can't revoke your own admin status."
+msgstr "Nie moĹĽesz odebrać samemu sobie statusu administratora."
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:218
+#: lib/pleroma/web/oauth/oauth_controller.ex:309
+#, elixir-format
+msgid "Your account is currently disabled"
+msgstr "Twoje konto jest obecnie nieaktywne"
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:180
+#: lib/pleroma/web/oauth/oauth_controller.ex:332
+#, elixir-format
+msgid "Your login is missing a confirmed e-mail address"
+msgstr ""
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:389
+#, elixir-format
+msgid "can't read inbox of %{nickname} as %{as_nickname}"
+msgstr ""
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:472
+#, elixir-format
+msgid "can't update outbox of %{nickname} as %{as_nickname}"
+msgstr ""
+
+#: lib/pleroma/web/common_api/common_api.ex:388
+#, elixir-format
+msgid "conversation is already muted"
+msgstr "rozmowa jest juĹĽ wyciszona"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:316
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:491
+#, elixir-format
+msgid "error"
+msgstr "bĹ‚Ä…d"
+
+#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:29
+#, elixir-format
+msgid "mascots can only be images"
+msgstr "maskotki muszÄ… być obrazkami"
+
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:60
+#, elixir-format
+msgid "not found"
+msgstr "nie znaleziono"
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:395
+#, elixir-format
+msgid "Bad OAuth request."
+msgstr "Niepoprawne ĹĽÄ…danie OAuth."
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:115
+#, elixir-format
+msgid "CAPTCHA already used"
+msgstr "ZuĹĽyta CAPTCHA"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:112
+#, elixir-format
+msgid "CAPTCHA expired"
+msgstr "CAPTCHA wygasĹ‚a"
+
+#: lib/pleroma/plugs/uploaded_media.ex:55
+#, elixir-format
+msgid "Failed"
+msgstr "Nie udaĹ‚o siÄ™"
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:411
+#, elixir-format
+msgid "Failed to authenticate: %{message}."
+msgstr ""
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:442
+#, elixir-format
+msgid "Failed to set up user account."
+msgstr ""
+
+#: lib/pleroma/plugs/oauth_scopes_plug.ex:38
+#, elixir-format
+msgid "Insufficient permissions: %{permissions}."
+msgstr "NiewystarczajÄ…ce uprawnienia: %{permissions}."
+
+#: lib/pleroma/plugs/uploaded_media.ex:94
+#, elixir-format
+msgid "Internal Error"
+msgstr "BĹ‚Ä…d wewnÄ™trzny"
+
+#: lib/pleroma/web/oauth/fallback_controller.ex:22
+#: lib/pleroma/web/oauth/fallback_controller.ex:29
+#, elixir-format
+msgid "Invalid Username/Password"
+msgstr "NieprawidĹ‚owa nazwa uĹĽytkownika lub hasĹ‚o"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:118
+#, elixir-format
+msgid "Invalid answer data"
+msgstr ""
+
+#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:128
+#, elixir-format
+msgid "Nodeinfo schema version not handled"
+msgstr "NieobsĹ‚ugiwana wersja schematu Nodeinfo"
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:169
+#, elixir-format
+msgid "This action is outside the authorized scopes"
+msgstr ""
+
+#: lib/pleroma/web/oauth/fallback_controller.ex:14
+#, elixir-format
+msgid "Unknown error, please check the details and try again."
+msgstr "Nieznany bĹ‚Ä…d, sprawdĹş szczegóły i sprĂłbuj ponownie."
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:116
+#: lib/pleroma/web/oauth/oauth_controller.ex:155
+#, elixir-format
+msgid "Unlisted redirect_uri."
+msgstr ""
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:391
+#, elixir-format
+msgid "Unsupported OAuth provider: %{provider}."
+msgstr "NieobsĹ‚ugiwany dostawca OAuth: %{provider}."
+
+#: lib/pleroma/uploaders/uploader.ex:72
+#, elixir-format
+msgid "Uploader callback timeout"
+msgstr ""
+
+#: lib/pleroma/web/uploader_controller.ex:23
+#, elixir-format
+msgid "bad request"
+msgstr "nieprawidĹ‚owe ĹĽÄ…danie"
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:103
+#, elixir-format
+msgid "CAPTCHA Error"
+msgstr "BĹ‚Ä…d CAPTCHA"
+
+#: lib/pleroma/web/common_api/common_api.ex:200
+#, elixir-format
+msgid "Could not add reaction emoji"
+msgstr ""
+
+#: lib/pleroma/web/common_api/common_api.ex:211
+#, elixir-format
+msgid "Could not remove reaction emoji"
+msgstr ""
+
+#: lib/pleroma/web/twitter_api/twitter_api.ex:129
+#, elixir-format
+msgid "Invalid CAPTCHA (Missing parameter: %{name})"
+msgstr "NieprawidĹ‚owa CAPTCHA (BrakujÄ…cy parametr: %{name})"
+
+#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:92
+#, elixir-format
+msgid "List not found"
+msgstr "Nie znaleziono listy"
+
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:124
+#, elixir-format
+msgid "Missing parameter: %{name}"
+msgstr "BrakujÄ…cy parametr: %{name}"
+
+#: lib/pleroma/web/oauth/oauth_controller.ex:207
+#: lib/pleroma/web/oauth/oauth_controller.ex:322
+#, elixir-format
+msgid "Password reset is required"
+msgstr "Wymagany reset hasĹ‚a"
+
+#: lib/pleroma/tests/auth_test_controller.ex:9
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/admin_api_controller.ex:6
+#: lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/fallback_redirect_controller.ex:6
+#: lib/pleroma/web/feed/tag_controller.ex:6 lib/pleroma/web/feed/user_controller.ex:6
+#: lib/pleroma/web/mailer/subscription_controller.ex:2 lib/pleroma/web/masto_fe_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/app_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14 lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:8 lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7 lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6 lib/pleroma/web/media_proxy/media_proxy_controller.ex:6
+#: lib/pleroma/web/mongooseim/mongoose_im_controller.ex:6 lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6
+#: lib/pleroma/web/oauth/fallback_controller.ex:6 lib/pleroma/web/oauth/mfa_controller.ex:10
+#: lib/pleroma/web/oauth/oauth_controller.ex:6 lib/pleroma/web/ostatus/ostatus_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:2
+#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6
+#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7 lib/pleroma/web/static_fe/static_fe_controller.ex:6
+#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10 lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6
+#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 lib/pleroma/web/twitter_api/twitter_api_controller.ex:6
+#: lib/pleroma/web/uploader_controller.ex:6 lib/pleroma/web/web_finger/web_finger_controller.ex:6
+#, elixir-format
+msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped."
+msgstr ""
+
+#: lib/pleroma/plugs/ensure_authenticated_plug.ex:28
+#, elixir-format
+msgid "Two-factor authentication enabled, you must use a access token."
+msgstr "Uwierzytelnienie dwuskĹ‚adnikowe jest wĹ‚Ä…czone, musisz uĹĽyć tokenu."
+
+#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:210
+#, elixir-format
+msgid "Unexpected error occurred while adding file to pack."
+msgstr "Nieoczekiwany bĹ‚Ä…d podczas dodawania pliku do paczki."
+
+#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:138
+#, elixir-format
+msgid "Unexpected error occurred while creating pack."
+msgstr "Nieoczekiwany bĹ‚Ä…d podczas tworzenia paczki."
+
+#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:278
+#, elixir-format
+msgid "Unexpected error occurred while removing file from pack."
+msgstr "Nieoczekiwany bĹ‚Ä…d podczas usuwania pliku z paczki."
+
+#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:250
+#, elixir-format
+msgid "Unexpected error occurred while updating file in pack."
+msgstr "Nieoczekiwany bĹ‚Ä…d podczas zmieniania pliku w paczce."
+
+#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:179
+#, elixir-format
+msgid "Unexpected error occurred while updating pack metadata."
+msgstr "Nieoczekiwany bĹ‚Ä…d podczas zmieniania metadanych paczki."
+
+#: lib/pleroma/plugs/user_is_admin_plug.ex:40
+#, elixir-format
+msgid "User is not an admin or OAuth admin scope is not granted."
+msgstr ""
+
+#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61
+#, elixir-format
+msgid "Web push subscription is disabled on this Pleroma instance"
+msgstr "Powiadomienia web push sÄ… wyĹ‚Ä…czone na tej instancji Pleromy"
+
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:502
+#, elixir-format
+msgid "You can't revoke your own admin/moderator status."
+msgstr "Nie moĹĽesz odebrać samemu sobie statusu administratora/moderatora."
+
+#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:105
+#, elixir-format
+msgid "authorization required for timeline view"
+msgstr "logowanie wymagane do przeglÄ…dania osi czasu"
index 507027e5ad90745d8ba6689e36cfc57af4548251..2a92327d136dec9768bcf13687acf0ec778baf35 100644 (file)
@@ -11,6 +11,11 @@ defmodule Pleroma.ActivityTest do
   alias Pleroma.ThreadMute
   import Pleroma.Factory
 
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
+
   test "returns an activity by it's AP id" do
     activity = insert(:note_activity)
     found_activity = Activity.get_by_ap_id(activity.data["id"])
@@ -107,8 +112,6 @@ defmodule Pleroma.ActivityTest do
 
   describe "search" do
     setup do
-      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
-
       user = insert(:user)
 
       params = %{
index 6b0e7b4b64c4b5606ae8377ee01ddbb08363c8e2..336de735900b12806295cfb2810ae855e97af477 100644 (file)
@@ -43,11 +43,9 @@ defmodule Pleroma.ConfigDBTest do
              {ConfigDB.from_string(saved.key), ConfigDB.from_binary(saved.value)}
            ]
 
-    assert config[:quack] == [
-             level: :info,
-             meta: [:none],
-             webhook_url: "https://hooks.slack.com/services/KEY/some_val"
-           ]
+    assert config[:quack][:level] == :info
+    assert config[:quack][:meta] == [:none]
+    assert config[:quack][:webhook_url] == "https://hooks.slack.com/services/KEY/some_val"
   end
 
   describe "update_or_create/1" do
@@ -478,6 +476,14 @@ defmodule Pleroma.ConfigDBTest do
       assert ConfigDB.from_binary(binary) == [key: "value"]
     end
 
+    test "keyword with partial_chain key" do
+      binary =
+        ConfigDB.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}])
+
+      assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1)
+      assert ConfigDB.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1]
+    end
+
     test "keyword" do
       binary =
         ConfigDB.transform([
index 5cc78ad5bc19aa893157831eb01b99103682b1fb..7c94a50b242a6701652254770d8e4ed0ff05ab9c 100644 (file)
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.HTTP.ConnectionTest do
-  use ExUnit.Case, async: true
+  use ExUnit.Case
   use Pleroma.Tests.Helpers
 
   import ExUnit.CaptureLog
index f11528c3feb5138cc4710f03cee047056e0f90f0..fab909905d133936d186bf0d754ffcb65043c01c 100644 (file)
@@ -3,23 +3,19 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.HTTP.RequestBuilderTest do
-  use ExUnit.Case, async: true
+  use ExUnit.Case
   use Pleroma.Tests.Helpers
-  alias Pleroma.Config
   alias Pleroma.HTTP.Request
   alias Pleroma.HTTP.RequestBuilder
 
   describe "headers/2" do
-    setup do: clear_config([:http, :send_user_agent])
-    setup do: clear_config([:http, :user_agent])
-
     test "don't send pleroma user agent" do
       assert RequestBuilder.headers(%Request{}, []) == %Request{headers: []}
     end
 
     test "send pleroma user agent" do
-      Config.put([:http, :send_user_agent], true)
-      Config.put([:http, :user_agent], :default)
+      clear_config([:http, :send_user_agent], true)
+      clear_config([:http, :user_agent], :default)
 
       assert RequestBuilder.headers(%Request{}, []) == %Request{
                headers: [{"user-agent", Pleroma.Application.user_agent()}]
@@ -27,8 +23,8 @@ defmodule Pleroma.HTTP.RequestBuilderTest do
     end
 
     test "send custom user agent" do
-      Config.put([:http, :send_user_agent], true)
-      Config.put([:http, :user_agent], "totally-not-pleroma")
+      clear_config([:http, :send_user_agent], true)
+      clear_config([:http, :user_agent], "totally-not-pleroma")
 
       assert RequestBuilder.headers(%Request{}, []) == %Request{
                headers: [{"user-agent", "totally-not-pleroma"}]
index 31e20d7264b11efa0e8f199f487884f4cef2ff8e..c8ede71c036b9de971b8600a96712aaa77755dff 100644 (file)
@@ -79,6 +79,13 @@ defmodule Pleroma.Plugs.AuthenticationPlugTest do
       assert AuthenticationPlug.checkpw("password", hash)
     end
 
+    test "check bcrypt hash" do
+      hash = "$2a$10$uyhC/R/zoE1ndwwCtMusK.TLVzkQ/Ugsbqp3uXI.CTTz0gBw.24jS"
+
+      assert AuthenticationPlug.checkpw("password", hash)
+      refute AuthenticationPlug.checkpw("password1", hash)
+    end
+
     test "it returns false when hash invalid" do
       hash =
         "psBWV8gxkGOZWBz$PmfCycChoxeJ3GgGzwvhlgacb9mUoZ.KUXNCssekER4SJ7bOK53uXrHNb2e4i8yPFgSKyzaW9CcmrDXWIEMtD1"
index 6950ccb254ef13100a06e22a74d41a4e474c6e43..d949c90a5c2ce183fb0a8d869a4f4edee1891ca4 100644 (file)
@@ -58,7 +58,7 @@ defmodule Pleroma.Uploaders.S3Test do
         name: "image-tet.jpg",
         content_type: "image/jpg",
         path: "test_folder/image-tet.jpg",
-        tempfile: Path.absname("test/fixtures/image_tmp.jpg")
+        tempfile: Path.absname("test/instance_static/add/shortcode.png")
       }
 
       [file_upload: file_upload]
index 56fde97e7f106bfa4814ec24f222c0a27bbcaa6d..77bd07edf24332897a94177b7aae0a64771531b8 100644 (file)
@@ -951,7 +951,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
 
     test "works with base64 encoded images" do
       file = %{
-        "img" => data_uri()
+        img: data_uri()
       }
 
       {:ok, %Object{}} = ActivityPub.upload(file)
index ecf5465bedc1a6e08136e75f41082e2fcdf72c56..370d876d0f1a2c564d067ca78654ae5e4976e29a 100644 (file)
@@ -2509,6 +2509,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
                 %{"tuple" => [":seconds_valid", 60]},
                 %{"tuple" => [":path", ""]},
                 %{"tuple" => [":key1", nil]},
+                %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},
                 %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]},
                 %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]},
                 %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]},
@@ -2532,6 +2533,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
                      %{"tuple" => [":seconds_valid", 60]},
                      %{"tuple" => [":path", ""]},
                      %{"tuple" => [":key1", nil]},
+                     %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},
                      %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]},
                      %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]},
                      %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]},
@@ -2544,6 +2546,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
                      ":seconds_valid",
                      ":path",
                      ":key1",
+                     ":partial_chain",
                      ":regex1",
                      ":regex2",
                      ":regex3",
@@ -2862,26 +2865,25 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
               group: ":pleroma",
               key: ":http",
               value: [
-                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]},
-                %{"tuple" => [":send_user_agent", false]}
+                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]}
               ]
             }
           ]
         })
 
-      assert json_response(conn, 200) == %{
+      assert %{
                "configs" => [
                  %{
                    "group" => ":pleroma",
                    "key" => ":http",
-                   "value" => [
-                     %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]},
-                     %{"tuple" => [":send_user_agent", false]}
-                   ],
-                   "db" => [":proxy_url", ":send_user_agent"]
+                   "value" => value,
+                   "db" => db
                  }
                ]
-             }
+             } = json_response(conn, 200)
+
+      assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} in value
+      assert ":proxy_url" in db
     end
 
     test "proxy tuple domain", %{conn: conn} do
@@ -2892,26 +2894,25 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
               group: ":pleroma",
               key: ":http",
               value: [
-                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]},
-                %{"tuple" => [":send_user_agent", false]}
+                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]}
               ]
             }
           ]
         })
 
-      assert json_response(conn, 200) == %{
+      assert %{
                "configs" => [
                  %{
                    "group" => ":pleroma",
                    "key" => ":http",
-                   "value" => [
-                     %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]},
-                     %{"tuple" => [":send_user_agent", false]}
-                   ],
-                   "db" => [":proxy_url", ":send_user_agent"]
+                   "value" => value,
+                   "db" => db
                  }
                ]
-             }
+             } = json_response(conn, 200)
+
+      assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} in value
+      assert ":proxy_url" in db
     end
 
     test "proxy tuple ip", %{conn: conn} do
@@ -2922,26 +2923,52 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
               group: ":pleroma",
               key: ":http",
               value: [
-                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]},
-                %{"tuple" => [":send_user_agent", false]}
+                %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]}
               ]
             }
           ]
         })
 
-      assert json_response(conn, 200) == %{
+      assert %{
                "configs" => [
                  %{
                    "group" => ":pleroma",
                    "key" => ":http",
-                   "value" => [
-                     %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]},
-                     %{"tuple" => [":send_user_agent", false]}
-                   ],
-                   "db" => [":proxy_url", ":send_user_agent"]
+                   "value" => value,
+                   "db" => db
                  }
                ]
-             }
+             } = json_response(conn, 200)
+
+      assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} in value
+      assert ":proxy_url" in db
+    end
+
+    test "doesn't set keys not in the whitelist", %{conn: conn} do
+      clear_config(:database_config_whitelist, [
+        {:pleroma, :key1},
+        {:pleroma, :key2},
+        {:pleroma, Pleroma.Captcha.NotReal},
+        {:not_real}
+      ])
+
+      post(conn, "/api/pleroma/admin/config", %{
+        configs: [
+          %{group: ":pleroma", key: ":key1", value: "value1"},
+          %{group: ":pleroma", key: ":key2", value: "value2"},
+          %{group: ":pleroma", key: ":key3", value: "value3"},
+          %{group: ":pleroma", key: "Pleroma.Web.Endpoint.NotReal", value: "value4"},
+          %{group: ":pleroma", key: "Pleroma.Captcha.NotReal", value: "value5"},
+          %{group: ":not_real", key: ":anything", value: "value6"}
+        ]
+      })
+
+      assert Application.get_env(:pleroma, :key1) == "value1"
+      assert Application.get_env(:pleroma, :key2) == "value2"
+      assert Application.get_env(:pleroma, :key3) == nil
+      assert Application.get_env(:pleroma, Pleroma.Web.Endpoint.NotReal) == nil
+      assert Application.get_env(:pleroma, Pleroma.Captcha.NotReal) == "value5"
+      assert Application.get_env(:not_real, :anything) == "value6"
     end
   end
 
@@ -3574,19 +3601,54 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
     end
   end
 
-  test "GET /api/pleroma/admin/config/descriptions", %{conn: conn} do
-    admin = insert(:user, is_admin: true)
+  describe "GET /api/pleroma/admin/config/descriptions" do
+    test "structure", %{conn: conn} do
+      admin = insert(:user, is_admin: true)
 
-    conn =
-      assign(conn, :user, admin)
-      |> get("/api/pleroma/admin/config/descriptions")
+      conn =
+        assign(conn, :user, admin)
+        |> get("/api/pleroma/admin/config/descriptions")
 
-    assert [child | _others] = json_response(conn, 200)
+      assert [child | _others] = json_response(conn, 200)
+
+      assert child["children"]
+      assert child["key"]
+      assert String.starts_with?(child["group"], ":")
+      assert child["description"]
+    end
+
+    test "filters by database configuration whitelist", %{conn: conn} do
+      clear_config(:database_config_whitelist, [
+        {:pleroma, :instance},
+        {:pleroma, :activitypub},
+        {:pleroma, Pleroma.Upload},
+        {:esshd}
+      ])
+
+      admin = insert(:user, is_admin: true)
 
-    assert child["children"]
-    assert child["key"]
-    assert String.starts_with?(child["group"], ":")
-    assert child["description"]
+      conn =
+        assign(conn, :user, admin)
+        |> get("/api/pleroma/admin/config/descriptions")
+
+      children = json_response(conn, 200)
+
+      assert length(children) == 4
+
+      assert Enum.count(children, fn c -> c["group"] == ":pleroma" end) == 3
+
+      instance = Enum.find(children, fn c -> c["key"] == ":instance" end)
+      assert instance["children"]
+
+      activitypub = Enum.find(children, fn c -> c["key"] == ":activitypub" end)
+      assert activitypub["children"]
+
+      web_endpoint = Enum.find(children, fn c -> c["key"] == "Pleroma.Upload" end)
+      assert web_endpoint["children"]
+
+      esshd = Enum.find(children, fn c -> c["group"] == ":esshd" end)
+      assert esshd["children"]
+    end
   end
 
   describe "/api/pleroma/admin/stats" do
index a54161bd4506fafe9c524f3051bf2a20e7de6130..3c29cd94fadd501cfb4c8ffdaade5909f7229e3c 100644 (file)
@@ -138,8 +138,8 @@ defmodule Pleroma.Web.Feed.TagControllerTest do
            ]
 
     assert xpath(xml, ~x"//channel/item/pubDate/text()"sl) == [
-             FeedView.pub_date(activity1.data["published"]),
-             FeedView.pub_date(activity2.data["published"])
+             FeedView.pub_date(activity2.data["published"]),
+             FeedView.pub_date(activity1.data["published"])
            ]
 
     assert xpath(xml, ~x"//channel/item/enclosure/@url"sl) == [
index 6ad9a59fe69ced25624bc25d46f041756a858d72..7d0cafccc834144e0e8b084a7dc59ffbb0d36b22 100644 (file)
@@ -13,7 +13,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do
   import Tesla.Mock
   import Mock
 
-  setup do
+  setup_all do
     mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
   end
index 34fc4aa23115d66155e2f0816537e44ce06396f2..103997c31b394030a3b1f829c4d7efdc36adbae6 100644 (file)
@@ -31,8 +31,28 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
 
     test "resend account confirmation email", %{conn: conn, user: user} do
       conn
+      |> put_req_header("content-type", "application/json")
       |> post("/api/v1/pleroma/accounts/confirmation_resend?email=#{user.email}")
-      |> json_response(:no_content)
+      |> json_response_and_validate_schema(:no_content)
+
+      ObanHelpers.perform_all()
+
+      email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
+      notify_email = Config.get([:instance, :notify_email])
+      instance_name = Config.get([:instance, :name])
+
+      assert_email_sent(
+        from: {instance_name, notify_email},
+        to: {user.name, user.email},
+        html_body: email.html_body
+      )
+    end
+
+    test "resend account confirmation email (with nickname)", %{conn: conn, user: user} do
+      conn
+      |> put_req_header("content-type", "application/json")
+      |> post("/api/v1/pleroma/accounts/confirmation_resend?nickname=#{user.nickname}")
+      |> json_response_and_validate_schema(:no_content)
 
       ObanHelpers.perform_all()
 
@@ -54,7 +74,10 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
     test "user avatar can be set", %{user: user, conn: conn} do
       avatar_image = File.read!("test/fixtures/avatar_data_uri")
 
-      conn = patch(conn, "/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image})
+      conn =
+        conn
+        |> put_req_header("content-type", "multipart/form-data")
+        |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: avatar_image})
 
       user = refresh_record(user)
 
@@ -70,17 +93,20 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
                ]
              } = user.avatar
 
-      assert %{"url" => _} = json_response(conn, 200)
+      assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
     end
 
     test "user avatar can be reset", %{user: user, conn: conn} do
-      conn = patch(conn, "/api/v1/pleroma/accounts/update_avatar", %{img: ""})
+      conn =
+        conn
+        |> put_req_header("content-type", "multipart/form-data")
+        |> patch("/api/v1/pleroma/accounts/update_avatar", %{img: ""})
 
       user = User.get_cached_by_id(user.id)
 
       assert user.avatar == nil
 
-      assert %{"url" => nil} = json_response(conn, 200)
+      assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
     end
   end
 
@@ -88,21 +114,27 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
     setup do: oauth_access(["write:accounts"])
 
     test "can set profile banner", %{user: user, conn: conn} do
-      conn = patch(conn, "/api/v1/pleroma/accounts/update_banner", %{"banner" => @image})
+      conn =
+        conn
+        |> put_req_header("content-type", "multipart/form-data")
+        |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => @image})
 
       user = refresh_record(user)
       assert user.banner["type"] == "Image"
 
-      assert %{"url" => _} = json_response(conn, 200)
+      assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
     end
 
     test "can reset profile banner", %{user: user, conn: conn} do
-      conn = patch(conn, "/api/v1/pleroma/accounts/update_banner", %{"banner" => ""})
+      conn =
+        conn
+        |> put_req_header("content-type", "multipart/form-data")
+        |> patch("/api/v1/pleroma/accounts/update_banner", %{"banner" => ""})
 
       user = refresh_record(user)
       assert user.banner == %{}
 
-      assert %{"url" => nil} = json_response(conn, 200)
+      assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
     end
   end
 
@@ -110,19 +142,26 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
     setup do: oauth_access(["write:accounts"])
 
     test "background image can be set", %{user: user, conn: conn} do
-      conn = patch(conn, "/api/v1/pleroma/accounts/update_background", %{"img" => @image})
+      conn =
+        conn
+        |> put_req_header("content-type", "multipart/form-data")
+        |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => @image})
 
       user = refresh_record(user)
       assert user.background["type"] == "Image"
-      assert %{"url" => _} = json_response(conn, 200)
+      # assert %{"url" => _} = json_response(conn, 200)
+      assert %{"url" => _} = json_response_and_validate_schema(conn, 200)
     end
 
     test "background image can be reset", %{user: user, conn: conn} do
-      conn = patch(conn, "/api/v1/pleroma/accounts/update_background", %{"img" => ""})
+      conn =
+        conn
+        |> put_req_header("content-type", "multipart/form-data")
+        |> patch("/api/v1/pleroma/accounts/update_background", %{"img" => ""})
 
       user = refresh_record(user)
       assert user.background == %{}
-      assert %{"url" => nil} = json_response(conn, 200)
+      assert %{"url" => nil} = json_response_and_validate_schema(conn, 200)
     end
   end
 
@@ -143,7 +182,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
       response =
         conn
         |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
-        |> json_response(:ok)
+        |> json_response_and_validate_schema(:ok)
 
       [like] = response
 
@@ -160,7 +199,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
       response =
         build_conn()
         |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
-        |> json_response(200)
+        |> json_response_and_validate_schema(200)
 
       assert length(response) == 1
     end
@@ -183,7 +222,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
           |> assign(:user, u)
           |> assign(:token, insert(:oauth_token, user: u, scopes: ["read:favourites"]))
           |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
-          |> json_response(:ok)
+          |> json_response_and_validate_schema(:ok)
 
         assert length(response) == 1
       end
@@ -191,7 +230,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
       response =
         build_conn()
         |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
-        |> json_response(200)
+        |> json_response_and_validate_schema(200)
 
       assert length(response) == 0
     end
@@ -213,7 +252,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
       response =
         conn
         |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
-        |> json_response(:ok)
+        |> json_response_and_validate_schema(:ok)
 
       assert Enum.empty?(response)
     end
@@ -233,11 +272,12 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
 
       response =
         conn
-        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{
-          since_id: third_activity.id,
-          max_id: seventh_activity.id
-        })
-        |> json_response(:ok)
+        |> get(
+          "/api/v1/pleroma/accounts/#{user.id}/favourites?since_id=#{third_activity.id}&max_id=#{
+            seventh_activity.id
+          }"
+        )
+        |> json_response_and_validate_schema(:ok)
 
       assert length(response) == 3
       refute third_activity in response
@@ -256,8 +296,8 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
 
       response =
         conn
-        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites", %{limit: "3"})
-        |> json_response(:ok)
+        |> get("/api/v1/pleroma/accounts/#{user.id}/favourites?limit=3")
+        |> json_response_and_validate_schema(:ok)
 
       assert length(response) == 3
     end
@@ -269,7 +309,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
       response =
         conn
         |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
-        |> json_response(:ok)
+        |> json_response_and_validate_schema(:ok)
 
       assert Enum.empty?(response)
     end
@@ -277,7 +317,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
     test "returns 404 error when specified user is not exist", %{conn: conn} do
       conn = get(conn, "/api/v1/pleroma/accounts/test/favourites")
 
-      assert json_response(conn, 404) == %{"error" => "Record not found"}
+      assert json_response_and_validate_schema(conn, 404) == %{"error" => "Record not found"}
     end
 
     test "returns 403 error when user has hidden own favorites", %{conn: conn} do
@@ -287,7 +327,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
 
       conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
 
-      assert json_response(conn, 403) == %{"error" => "Can't get favorites"}
+      assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"}
     end
 
     test "hides favorites for new users by default", %{conn: conn} do
@@ -298,7 +338,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
       assert user.hide_favorites
       conn = get(conn, "/api/v1/pleroma/accounts/#{user.id}/favourites")
 
-      assert json_response(conn, 403) == %{"error" => "Can't get favorites"}
+      assert json_response_and_validate_schema(conn, 403) == %{"error" => "Can't get favorites"}
     end
   end
 
@@ -312,11 +352,12 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
         |> assign(:user, user)
         |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe")
 
-      assert %{"id" => _id, "subscribing" => true} = json_response(ret_conn, 200)
+      assert %{"id" => _id, "subscribing" => true} =
+               json_response_and_validate_schema(ret_conn, 200)
 
       conn = post(conn, "/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe")
 
-      assert %{"id" => _id, "subscribing" => false} = json_response(conn, 200)
+      assert %{"id" => _id, "subscribing" => false} = json_response_and_validate_schema(conn, 200)
     end
   end
 
@@ -326,7 +367,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
 
       conn = post(conn, "/api/v1/pleroma/accounts/target_id/subscribe")
 
-      assert %{"error" => "Record not found"} = json_response(conn, 404)
+      assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404)
     end
   end
 
@@ -336,7 +377,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do
 
       conn = post(conn, "/api/v1/pleroma/accounts/target_id/unsubscribe")
 
-      assert %{"error" => "Record not found"} = json_response(conn, 404)
+      assert %{"error" => "Record not found"} = json_response_and_validate_schema(conn, 404)
     end
   end
 end
index 2fc3e73b5c9e8a6fc301876649256fa62b0c207d..2acd0939fa71c3c4951cf871ed6b287f1cfda088 100644 (file)
@@ -13,8 +13,8 @@ defmodule Pleroma.Web.Push.ImplTest do
 
   import Pleroma.Factory
 
-  setup_all do
-    Tesla.Mock.mock_global(fn
+  setup do
+    Tesla.Mock.mock(fn
       %{method: :post, url: "https://example.com/example/1234"} ->
         %Tesla.Env{status: 200}
 
index e05a8863de581245556a058402fd09d02cccd4dc..65255916d083f9788e7a70f7b777515601127490 100644 (file)
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.Web.RelMeTest do
-  use ExUnit.Case, async: true
+  use ExUnit.Case
 
   setup_all do
     Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)