diff options
| -rw-r--r-- | CHANGELOG.md | 14 | ||||
| -rw-r--r-- | docs/API/pleroma_api.md | 137 | ||||
| -rw-r--r-- | docs/installation/otp_en.md | 2 | ||||
| -rw-r--r-- | lib/pleroma/emoji/pack.ex | 15 | ||||
| -rw-r--r-- | lib/pleroma/web/api_spec/cast_and_validate.ex | 4 | ||||
| -rw-r--r-- | lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex | 18 | ||||
| -rw-r--r-- | lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex | 5 | ||||
| -rw-r--r-- | lib/pleroma/web/router.ex | 28 | ||||
| -rw-r--r-- | test/instance_static/emoji/blobs.gg/blank.png | bin | 0 -> 95 bytes | |||
| -rw-r--r-- | test/instance_static/emoji/blobs.gg/pack.json | 11 | ||||
| -rw-r--r-- | test/web/pleroma_api/controllers/emoji_file_controller_test.exs | 40 | ||||
| -rw-r--r-- | test/web/pleroma_api/controllers/emoji_pack_controller_test.exs | 112 | 
13 files changed, 252 insertions, 136 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index e02e84301..9ae5d0eda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).  ### Changed +- **Breaking:** Pleroma Admin API: emoji packs and files routes changed.  - Search: Users are now findable by their urls.  - Renamed `:await_up_timeout` in `:connections_pool` namespace to `:connect_timeout`, old name is deprecated.  - Renamed `:timeout` in `pools` namespace to `:recv_timeout`, old name is deprecated. @@ -24,7 +25,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).  - Media preview proxy (requires `ffmpeg` and `ImageMagick` to be installed and media proxy to be enabled; see `:media_preview_proxy` config for more details).  - Pleroma API: Importing the mutes users from CSV files.  - Experimental websocket-based federation between Pleroma instances. + +<details> +  <summary>API Changes</summary> + +- Pleroma API: Importing the mutes users from CSV files.  - Admin API: Importing emoji from a zip file +- Pleroma API: Pagination for remote/local packs and emoji. + +</details>  ### Removed @@ -39,6 +48,11 @@ switched to a new configuration mechanism, however it was not officially removed  - Add documented-but-missing chat pagination.  - Allow sending out emails again. +## Unreleased (Patch) + +### Changed +- API: Empty parameter values for integer parameters are now ignored in non-strict validaton mode. +  ## [2.1.2] - 2020-09-17  ### Security diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 94b6a4fda..3fd141bd2 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -378,44 +378,43 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa  * Params: None  * Response: JSON, returns a list of Mastodon Conversation entities that were marked as read (200 - healthy, 503 unhealthy). -## `GET /api/pleroma/emoji/packs/import` -### Imports packs from filesystem -* Method `GET` -* Authentication: required -* Params: None -* Response: JSON, returns a list of imported packs. +## `GET /api/pleroma/emoji/pack?name=:name` + +### Get pack.json for the pack -## `GET /api/pleroma/emoji/packs/remote` -### Make request to another instance for packs list  * Method `GET` -* Authentication: required +* Authentication: not required  * Params: -  * `url`: url of the instance to get packs from -* Response: JSON with the pack list, hashmap with pack name and pack contents +  * `page`: page number for files (default 1) +  * `page_size`: page size for files (default 30) +* Response: JSON, pack json with `files`, `files_count` and `pack` keys with 200 status or 404 if the pack does not exist. -## `POST /api/pleroma/emoji/packs/download` -### Download pack from another instance -* Method `POST` -* Authentication: required -* Params: -  * `url`: url of the instance to download from -  * `name`: pack to download from that instance -  * `as`: (*optional*) name how to save pack -* Response: JSON, "ok" with 200 status if the pack was downloaded, or 500 if there were -  errors downloading the pack +```json +{ +  "files": {...}, +  "files_count": 0, // emoji count in pack +  "pack": {...} +} +``` + +## `POST /api/pleroma/emoji/pack?name=:name` -## `POST /api/pleroma/emoji/packs/:name`  ### Creates an empty pack +  * Method `POST` -* Authentication: required -* Params: None +* Authentication: required (admin) +* Params: +  * `name`: pack name  * Response: JSON, "ok" and 200 status or 409 if the pack with that name already exists -## `PATCH /api/pleroma/emoji/packs/:name` +## `PATCH /api/pleroma/emoji/pack?name=:name` +  ### Updates (replaces) pack metadata +  * Method `PATCH` -* Authentication: required +* Authentication: required (admin)  * Params: +  * `name`: pack name    * `metadata`: metadata to replace the old one      * `license`: Pack license      * `homepage`: Pack home page url @@ -426,39 +425,85 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa  * Response: JSON, updated "metadata" section of the pack and 200 status or 400 if there was a    problem with the new metadata (the error is specified in the "error" part of the response JSON) -## `DELETE /api/pleroma/emoji/packs/:name` +## `DELETE /api/pleroma/emoji/pack?name=:name` +  ### Delete a custom emoji pack +  * Method `DELETE` -* Authentication: required -* Params: None +* Authentication: required (admin) +* Params: +  * `name`: pack name  * Response: JSON, "ok" and 200 status or 500 if there was an error deleting the pack -## `POST /api/pleroma/emoji/packs/:name/files` +## `GET /api/pleroma/emoji/packs/import` + +### Imports packs from filesystem + +* Method `GET` +* Authentication: required (admin) +* Params: None +* Response: JSON, returns a list of imported packs. + +## `GET /api/pleroma/emoji/packs/remote` + +### Make request to another instance for packs list + +* Method `GET` +* Authentication: required (admin) +* Params: +  * `url`: url of the instance to get packs from +  * `page`: page number for packs (default 1) +  * `page_size`: page size for packs (default 50) +* Response: JSON with the pack list, hashmap with pack name and pack contents + +## `POST /api/pleroma/emoji/packs/download` + +### Download pack from another instance + +* Method `POST` +* Authentication: required (admin) +* Params: +  * `url`: url of the instance to download from +  * `name`: pack to download from that instance +  * `as`: (*optional*) name how to save pack +* Response: JSON, "ok" with 200 status if the pack was downloaded, or 500 if there were +  errors downloading the pack + +## `POST /api/pleroma/emoji/packs/files?name=:name` +  ### Add new file to the pack +  * Method `POST` -* Authentication: required +* Authentication: required (admin)  * Params: +  * `name`: pack name    * `file`: file needs to be uploaded with the multipart request or link to remote file.    * `shortcode`: (*optional*) shortcode for new emoji, must be unique for all emoji. If not sended, shortcode will be taken from original filename.    * `filename`: (*optional*) new emoji file name. If not specified will be taken from original filename.  * Response: JSON, list of files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. -## `PATCH /api/pleroma/emoji/packs/:name/files` +## `PATCH /api/pleroma/emoji/packs/files?name=:name` +  ### Update emoji file from pack +  * Method `PATCH` -* Authentication: required +* Authentication: required (admin)  * Params: +  * `name`: pack name    * `shortcode`: emoji file shortcode    * `new_shortcode`: new emoji file shortcode    * `new_filename`: new filename for emoji file    * `force`: (*optional*) with true value to overwrite existing emoji with new shortcode  * Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. -## `DELETE /api/pleroma/emoji/packs/:name/files` +## `DELETE /api/pleroma/emoji/packs/files?name=:name` +  ### Delete emoji file from pack +  * Method `DELETE` -* Authentication: required +* Authentication: required (admin)  * Params: +  * `name`: pack name    * `shortcode`: emoji file shortcode  * Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. @@ -483,30 +528,14 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa  }  ``` -## `GET /api/pleroma/emoji/packs/:name` +## `GET /api/pleroma/emoji/packs/archive?name=:name` -### Get pack.json for the pack +### Requests a local pack archive from the instance  * Method `GET`  * Authentication: not required  * Params: -  * `page`: page number for files (default 1) -  * `page_size`: page size for files (default 30) -* Response: JSON, pack json with `files`, `files_count` and `pack` keys with 200 status or 404 if the pack does not exist. - -```json -{ -  "files": {...}, -  "files_count": 0, // emoji count in pack -  "pack": {...} -} -``` - -## `GET /api/pleroma/emoji/packs/:name/archive` -### Requests a local pack archive from the instance -* Method `GET` -* Authentication: not required -* Params: None +  * `name`: pack name  * Response: the archive of the pack with a 200 status code, 403 if the pack is not set as shared,    404 if the pack does not exist diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index f6b05c887..92584d80d 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -101,6 +101,8 @@ It is encouraged to check [Optimizing your PostgreSQL performance](../configurat  If you are using PostgreSQL 12 or higher, add this to your Ecto database configuration  ```elixir +# +config :pleroma, Pleroma.Repo,  prepare: :named,  parameters: [    plan_cache_mode: "force_custom_plan" diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 0b3f8f00b..8f1989ada 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -198,13 +198,13 @@ defmodule Pleroma.Emoji.Pack do      end    end -  @spec list_remote(String.t()) :: {:ok, map()} | {:error, atom()} -  def list_remote(url) do -    uri = url |> String.trim() |> URI.parse() +  @spec list_remote(keyword()) :: {:ok, map()} | {:error, atom()} +  def list_remote(opts) do +    uri = opts[:url] |> String.trim() |> URI.parse()      with :ok <- validate_shareable_packs_available(uri) do        uri -      |> URI.merge("/api/pleroma/emoji/packs") +      |> URI.merge("/api/pleroma/emoji/packs?page=#{opts[:page]}&page_size=#{opts[:page_size]}")        |> http_get()      end    end @@ -244,7 +244,8 @@ defmodule Pleroma.Emoji.Pack do      uri = url |> String.trim() |> URI.parse()      with :ok <- validate_shareable_packs_available(uri), -         {:ok, remote_pack} <- uri |> URI.merge("/api/pleroma/emoji/packs/#{name}") |> http_get(), +         {:ok, remote_pack} <- +           uri |> URI.merge("/api/pleroma/emoji/pack?name=#{name}") |> http_get(),           {:ok, %{sha: sha, url: url} = pack_info} <- fetch_pack_info(remote_pack, uri, name),           {:ok, archive} <- download_archive(url, sha),           pack <- copy_as(remote_pack, as || name), @@ -523,7 +524,7 @@ defmodule Pleroma.Emoji.Pack do    defp http_get(%URI{} = url), do: url |> to_string() |> http_get()    defp http_get(url) do -    with {:ok, %{body: body}} <- url |> Pleroma.HTTP.get() do +    with {:ok, %{body: body}} <- Pleroma.HTTP.get(url, [], pool: :default) do        Jason.decode(body)      end    end @@ -572,7 +573,7 @@ defmodule Pleroma.Emoji.Pack do          {:ok,           %{             sha: sha, -           url: URI.merge(uri, "/api/pleroma/emoji/packs/#{name}/archive") |> to_string() +           url: URI.merge(uri, "/api/pleroma/emoji/packs/archive?name=#{name}") |> to_string()           }}        %{"fallback-src" => src, "fallback-src-sha256" => sha} when is_binary(src) -> diff --git a/lib/pleroma/web/api_spec/cast_and_validate.ex b/lib/pleroma/web/api_spec/cast_and_validate.ex index fbfc27d6f..6d1a7ebbc 100644 --- a/lib/pleroma/web/api_spec/cast_and_validate.ex +++ b/lib/pleroma/web/api_spec/cast_and_validate.ex @@ -115,6 +115,10 @@ defmodule Pleroma.Web.ApiSpec.CastAndValidate do              %{reason: :unexpected_field, name: name, path: [name]}, params ->                Map.delete(params, name) +            # Filter out empty params +            %{reason: :invalid_type, path: [name_atom], value: ""}, params -> +              Map.delete(params, to_string(name_atom)) +              %{reason: :invalid_enum, name: nil, path: path, value: value}, params ->                path = path |> Enum.reverse() |> tl() |> Enum.reverse() |> list_items_to_string()                update_in(params, path, &List.delete(&1, value)) diff --git a/lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex index efbfce75f..a56641426 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_emoji_file_operation.ex @@ -126,7 +126,7 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiFileOperation do    end    defp name_param do -    Operation.parameter(:name, :path, :string, "Pack Name", example: "cofe", required: true) +    Operation.parameter(:name, :query, :string, "Pack Name", example: "cofe", required: true)    end    defp files_object do diff --git a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex index 59548af13..79f52dcb3 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex @@ -19,7 +19,21 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do        tags: ["Emoji Packs"],        summary: "Make request to another instance for emoji packs list",        security: [%{"oAuth" => ["write"]}], -      parameters: [url_param()], +      parameters: [ +        url_param(), +        Operation.parameter( +          :page, +          :query, +          %Schema{type: :integer, default: 1}, +          "Page" +        ), +        Operation.parameter( +          :page_size, +          :query, +          %Schema{type: :integer, default: 30}, +          "Number of emoji to return" +        ) +      ],        operationId: "PleromaAPI.EmojiPackController.remote",        responses: %{          200 => emoji_packs_response(), @@ -192,7 +206,7 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do    end    defp name_param do -    Operation.parameter(:name, :path, :string, "Pack Name", example: "cofe", required: true) +    Operation.parameter(:name, :query, :string, "Pack Name", example: "cofe", required: true)    end    defp url_param do diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex index e3969fee1..6696f8b92 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -23,8 +23,9 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do    defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaEmojiPackOperation -  def remote(conn, %{url: url}) do -    with {:ok, packs} <- Pack.list_remote(url) do +  def remote(conn, params) do +    with {:ok, packs} <- +           Pack.list_remote(url: params.url, page_size: params.page_size, page: params.page) do        json(conn, packs)      else        {:error, :not_shareable} -> diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 6439a1c39..97fcaafd5 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -234,6 +234,20 @@ defmodule Pleroma.Web.Router do    end    scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do +    scope "/pack" do +      pipe_through(:admin_api) + +      post("/", EmojiPackController, :create) +      patch("/", EmojiPackController, :update) +      delete("/", EmojiPackController, :delete) +    end + +    scope "/pack" do +      pipe_through(:api) + +      get("/", EmojiPackController, :show) +    end +      # Modifying packs      scope "/packs" do        pipe_through(:admin_api) @@ -242,21 +256,17 @@ defmodule Pleroma.Web.Router do        get("/remote", EmojiPackController, :remote)        post("/download", EmojiPackController, :download) -      post("/:name", EmojiPackController, :create) -      patch("/:name", EmojiPackController, :update) -      delete("/:name", EmojiPackController, :delete) - -      post("/:name/files", EmojiFileController, :create) -      patch("/:name/files", EmojiFileController, :update) -      delete("/:name/files", EmojiFileController, :delete) +      post("/files", EmojiFileController, :create) +      patch("/files", EmojiFileController, :update) +      delete("/files", EmojiFileController, :delete)      end      # Pack info / downloading      scope "/packs" do        pipe_through(:api) +        get("/", EmojiPackController, :index) -      get("/:name", EmojiPackController, :show) -      get("/:name/archive", EmojiPackController, :archive) +      get("/archive", EmojiPackController, :archive)      end    end diff --git a/test/instance_static/emoji/blobs.gg/blank.png b/test/instance_static/emoji/blobs.gg/blank.png Binary files differnew file mode 100644 index 000000000..8f50fa023 --- /dev/null +++ b/test/instance_static/emoji/blobs.gg/blank.png diff --git a/test/instance_static/emoji/blobs.gg/pack.json b/test/instance_static/emoji/blobs.gg/pack.json new file mode 100644 index 000000000..481891b08 --- /dev/null +++ b/test/instance_static/emoji/blobs.gg/pack.json @@ -0,0 +1,11 @@ +{ +    "files": { +        "blank": "blank.png" +    }, +    "pack": { +        "description": "Test description", +        "homepage": "https://pleroma.social", +        "license": "Test license", +        "share-files": true +    } +}
\ No newline at end of file diff --git a/test/web/pleroma_api/controllers/emoji_file_controller_test.exs b/test/web/pleroma_api/controllers/emoji_file_controller_test.exs index 39b4e1dac..82de86ee3 100644 --- a/test/web/pleroma_api/controllers/emoji_file_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_file_controller_test.exs @@ -29,7 +29,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      {:ok, %{admin_conn: admin_conn}}    end -  describe "POST/PATCH/DELETE /api/pleroma/emoji/packs/:name/files" do +  describe "POST/PATCH/DELETE /api/pleroma/emoji/packs/files?name=:name" do      setup do        pack_file = "#{@emoji_path}/test_pack/pack.json"        original_content = File.read!(pack_file) @@ -56,7 +56,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        resp =          admin_conn          |> put_req_header("content-type", "multipart/form-data") -        |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +        |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{            file: %Plug.Upload{              content_type: "application/zip",              filename: "emojis.zip", @@ -83,7 +83,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "create shortcode exists", %{admin_conn: admin_conn} do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank",                 filename: "dir/blank.png",                 file: %Plug.Upload{ @@ -101,7 +101,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank3",                 filename: "dir/blank.png",                 file: %Plug.Upload{ @@ -119,7 +119,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank",                 new_shortcode: "blank2",                 new_filename: "dir_2/blank_3.png" @@ -135,7 +135,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank3",                 filename: "dir/blank.png",                 file: %Plug.Upload{ @@ -153,7 +153,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank3",                 new_shortcode: "blank4",                 new_filename: "dir_2/blank_3.png", @@ -171,7 +171,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "with empty filename", %{admin_conn: admin_conn} do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank2",                 filename: "",                 file: %Plug.Upload{ @@ -187,7 +187,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "add file with not loaded pack", %{admin_conn: admin_conn} do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/not_loaded/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=not_loaded", %{                 shortcode: "blank3",                 filename: "dir/blank.png",                 file: %Plug.Upload{ @@ -202,7 +202,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "remove file with not loaded pack", %{admin_conn: admin_conn} do        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/not_loaded/files?shortcode=blank3") +             |> delete("/api/pleroma/emoji/packs/files?name=not_loaded&shortcode=blank3")               |> json_response_and_validate_schema(:not_found) == %{                 "error" => "pack \"not_loaded\" is not found"               } @@ -210,7 +210,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "remove file with empty shortcode", %{admin_conn: admin_conn} do        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/not_loaded/files?shortcode=") +             |> delete("/api/pleroma/emoji/packs/files?name=not_loaded&shortcode=")               |> json_response_and_validate_schema(:not_found) == %{                 "error" => "pack \"not_loaded\" is not found"               } @@ -219,7 +219,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "update file with not loaded pack", %{admin_conn: admin_conn} do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/not_loaded/files", %{ +             |> patch("/api/pleroma/emoji/packs/files?name=not_loaded", %{                 shortcode: "blank4",                 new_shortcode: "blank3",                 new_filename: "dir_2/blank_3.png" @@ -232,7 +232,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "new with shortcode as file with update", %{admin_conn: admin_conn} do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank4",                 filename: "dir/blank.png",                 file: %Plug.Upload{ @@ -250,7 +250,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank4",                 new_shortcode: "blank3",                 new_filename: "dir_2/blank_3.png" @@ -265,7 +265,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png")        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank3") +             |> delete("/api/pleroma/emoji/packs/files?name=test_pack&shortcode=blank3")               |> json_response_and_validate_schema(200) == %{                 "blank" => "blank.png",                 "blank2" => "blank2.png" @@ -287,7 +287,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank_url",                 file: "https://test-blank/blank_url.png"               }) @@ -307,7 +307,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> post("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> post("/api/pleroma/emoji/packs/files?name=test_pack", %{                 file: %Plug.Upload{                   filename: "shortcode.png",                   path: "#{Pleroma.Config.get([:instance, :static_dir])}/add/shortcode.png" @@ -322,7 +322,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank3") +             |> delete("/api/pleroma/emoji/packs/files?name=test_pack&shortcode=blank3")               |> json_response_and_validate_schema(:bad_request) == %{                 "error" => "Emoji \"blank3\" does not exist"               } @@ -331,7 +331,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do      test "update non existing emoji", %{admin_conn: admin_conn} do        assert admin_conn               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +             |> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{                 shortcode: "blank3",                 new_shortcode: "blank4",                 new_filename: "dir_2/blank_3.png" @@ -347,7 +347,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do               } =                 admin_conn                 |> put_req_header("content-type", "multipart/form-data") -               |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ +               |> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{                   shortcode: "blank",                   new_filename: "dir_2/blank_3.png"                 }) diff --git a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs index a34df2c18..386ad8634 100644 --- a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -37,11 +37,11 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do    test "GET /api/pleroma/emoji/packs", %{conn: conn} do      resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) -    assert resp["count"] == 3 +    assert resp["count"] == 4      assert resp["packs"]             |> Map.keys() -           |> length() == 3 +           |> length() == 4      shared = resp["packs"]["test_pack"]      assert shared["files"] == %{"blank" => "blank.png", "blank2" => "blank2.png"} @@ -58,7 +58,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        |> get("/api/pleroma/emoji/packs?page_size=1")        |> json_response_and_validate_schema(200) -    assert resp["count"] == 3 +    assert resp["count"] == 4      packs = Map.keys(resp["packs"]) @@ -71,7 +71,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        |> get("/api/pleroma/emoji/packs?page_size=1&page=2")        |> json_response_and_validate_schema(200) -    assert resp["count"] == 3 +    assert resp["count"] == 4      packs = Map.keys(resp["packs"])      assert length(packs) == 1      [pack2] = packs @@ -81,18 +81,28 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        |> get("/api/pleroma/emoji/packs?page_size=1&page=3")        |> json_response_and_validate_schema(200) -    assert resp["count"] == 3 +    assert resp["count"] == 4      packs = Map.keys(resp["packs"])      assert length(packs) == 1      [pack3] = packs -    assert [pack1, pack2, pack3] |> Enum.uniq() |> length() == 3 + +    resp = +      conn +      |> get("/api/pleroma/emoji/packs?page_size=1&page=4") +      |> json_response_and_validate_schema(200) + +    assert resp["count"] == 4 +    packs = Map.keys(resp["packs"]) +    assert length(packs) == 1 +    [pack4] = packs +    assert [pack1, pack2, pack3, pack4] |> Enum.uniq() |> length() == 4    end    describe "GET /api/pleroma/emoji/packs/remote" do      test "shareable instance", %{admin_conn: admin_conn, conn: conn} do        resp =          conn -        |> get("/api/pleroma/emoji/packs") +        |> get("/api/pleroma/emoji/packs?page=2&page_size=1")          |> json_response_and_validate_schema(200)        mock(fn @@ -102,12 +112,12 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do          %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} ->            json(%{metadata: %{features: ["shareable_emoji_packs"]}}) -        %{method: :get, url: "https://example.com/api/pleroma/emoji/packs"} -> +        %{method: :get, url: "https://example.com/api/pleroma/emoji/packs?page=2&page_size=1"} ->            json(resp)        end)        assert admin_conn -             |> get("/api/pleroma/emoji/packs/remote?url=https://example.com") +             |> get("/api/pleroma/emoji/packs/remote?url=https://example.com&page=2&page_size=1")               |> json_response_and_validate_schema(200) == resp      end @@ -128,11 +138,11 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      end    end -  describe "GET /api/pleroma/emoji/packs/:name/archive" do +  describe "GET /api/pleroma/emoji/packs/archive?name=:name" do      test "download shared pack", %{conn: conn} do        resp =          conn -        |> get("/api/pleroma/emoji/packs/test_pack/archive") +        |> get("/api/pleroma/emoji/packs/archive?name=test_pack")          |> response(200)        {:ok, arch} = :zip.unzip(resp, [:memory]) @@ -143,7 +153,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      test "non existing pack", %{conn: conn} do        assert conn -             |> get("/api/pleroma/emoji/packs/test_pack_for_import/archive") +             |> get("/api/pleroma/emoji/packs/archive?name=test_pack_for_import")               |> json_response_and_validate_schema(:not_found) == %{                 "error" => "Pack test_pack_for_import does not exist"               } @@ -151,7 +161,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      test "non downloadable pack", %{conn: conn} do        assert conn -             |> get("/api/pleroma/emoji/packs/test_pack_nonshared/archive") +             |> get("/api/pleroma/emoji/packs/archive?name=test_pack_nonshared")               |> json_response_and_validate_schema(:forbidden) == %{                 "error" =>                   "Pack test_pack_nonshared cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing" @@ -173,28 +183,28 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do          %{            method: :get, -          url: "https://example.com/api/pleroma/emoji/packs/test_pack" +          url: "https://example.com/api/pleroma/emoji/pack?name=test_pack"          } ->            conn -          |> get("/api/pleroma/emoji/packs/test_pack") +          |> get("/api/pleroma/emoji/pack?name=test_pack")            |> json_response_and_validate_schema(200)            |> json()          %{            method: :get, -          url: "https://example.com/api/pleroma/emoji/packs/test_pack/archive" +          url: "https://example.com/api/pleroma/emoji/packs/archive?name=test_pack"          } ->            conn -          |> get("/api/pleroma/emoji/packs/test_pack/archive") +          |> get("/api/pleroma/emoji/packs/archive?name=test_pack")            |> response(200)            |> text()          %{            method: :get, -          url: "https://example.com/api/pleroma/emoji/packs/test_pack_nonshared" +          url: "https://example.com/api/pleroma/emoji/pack?name=test_pack_nonshared"          } ->            conn -          |> get("/api/pleroma/emoji/packs/test_pack_nonshared") +          |> get("/api/pleroma/emoji/pack?name=test_pack_nonshared")            |> json_response_and_validate_schema(200)            |> json() @@ -218,7 +228,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert File.exists?("#{@emoji_path}/test_pack2/blank.png")        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/test_pack2") +             |> delete("/api/pleroma/emoji/pack?name=test_pack2")               |> json_response_and_validate_schema(200) == "ok"        refute File.exists?("#{@emoji_path}/test_pack2") @@ -239,7 +249,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert File.exists?("#{@emoji_path}/test_pack_nonshared2/blank.png")        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/test_pack_nonshared2") +             |> delete("/api/pleroma/emoji/pack?name=test_pack_nonshared2")               |> json_response_and_validate_schema(200) == "ok"        refute File.exists?("#{@emoji_path}/test_pack_nonshared2") @@ -279,14 +289,14 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do          %{            method: :get, -          url: "https://example.com/api/pleroma/emoji/packs/pack_bad_sha" +          url: "https://example.com/api/pleroma/emoji/pack?name=pack_bad_sha"          } ->            {:ok, pack} = Pleroma.Emoji.Pack.load_pack("pack_bad_sha")            %Tesla.Env{status: 200, body: Jason.encode!(pack)}          %{            method: :get, -          url: "https://example.com/api/pleroma/emoji/packs/pack_bad_sha/archive" +          url: "https://example.com/api/pleroma/emoji/packs/archive?name=pack_bad_sha"          } ->            %Tesla.Env{              status: 200, @@ -316,7 +326,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do          %{            method: :get, -          url: "https://example.com/api/pleroma/emoji/packs/test_pack" +          url: "https://example.com/api/pleroma/emoji/pack?name=test_pack"          } ->            {:ok, pack} = Pleroma.Emoji.Pack.load_pack("test_pack")            %Tesla.Env{status: 200, body: Jason.encode!(pack)} @@ -336,7 +346,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      end    end -  describe "PATCH /api/pleroma/emoji/packs/:name" do +  describe "PATCH /api/pleroma/emoji/pack?name=:name" do      setup do        pack_file = "#{@emoji_path}/test_pack/pack.json"        original_content = File.read!(pack_file) @@ -358,7 +368,9 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      test "for a pack without a fallback source", ctx do        assert ctx[:admin_conn]               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/test_pack", %{"metadata" => ctx[:new_data]}) +             |> patch("/api/pleroma/emoji/pack?name=test_pack", %{ +               "metadata" => ctx[:new_data] +             })               |> json_response_and_validate_schema(200) == ctx[:new_data]        assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == ctx[:new_data] @@ -384,7 +396,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert ctx[:admin_conn]               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/test_pack", %{metadata: new_data}) +             |> patch("/api/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})               |> json_response_and_validate_schema(200) == new_data_with_sha        assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == new_data_with_sha @@ -404,17 +416,17 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        assert ctx[:admin_conn]               |> put_req_header("content-type", "multipart/form-data") -             |> patch("/api/pleroma/emoji/packs/test_pack", %{metadata: new_data}) +             |> patch("/api/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})               |> json_response_and_validate_schema(:bad_request) == %{                 "error" => "The fallback archive does not have all files specified in pack.json"               }      end    end -  describe "POST/DELETE /api/pleroma/emoji/packs/:name" do +  describe "POST/DELETE /api/pleroma/emoji/pack?name=:name" do      test "creating and deleting a pack", %{admin_conn: admin_conn} do        assert admin_conn -             |> post("/api/pleroma/emoji/packs/test_created") +             |> post("/api/pleroma/emoji/pack?name=test_created")               |> json_response_and_validate_schema(200) == "ok"        assert File.exists?("#{@emoji_path}/test_created/pack.json") @@ -426,7 +438,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do               }        assert admin_conn -             |> delete("/api/pleroma/emoji/packs/test_created") +             |> delete("/api/pleroma/emoji/pack?name=test_created")               |> json_response_and_validate_schema(200) == "ok"        refute File.exists?("#{@emoji_path}/test_created/pack.json") @@ -439,7 +451,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do        File.write!(Path.join(path, "pack.json"), pack_file)        assert admin_conn -             |> post("/api/pleroma/emoji/packs/test_created") +             |> post("/api/pleroma/emoji/pack?name=test_created")               |> json_response_and_validate_schema(:conflict) == %{                 "error" => "A pack named \"test_created\" already exists"               } @@ -449,7 +461,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      test "with empty name", %{admin_conn: admin_conn} do        assert admin_conn -             |> post("/api/pleroma/emoji/packs/ ") +             |> post("/api/pleroma/emoji/pack?name= ")               |> json_response_and_validate_schema(:bad_request) == %{                 "error" => "pack name cannot be empty"               } @@ -458,7 +470,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do    test "deleting nonexisting pack", %{admin_conn: admin_conn} do      assert admin_conn -           |> delete("/api/pleroma/emoji/packs/non_existing") +           |> delete("/api/pleroma/emoji/pack?name=non_existing")             |> json_response_and_validate_schema(:not_found) == %{               "error" => "Pack non_existing does not exist"             } @@ -466,7 +478,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do    test "deleting with empty name", %{admin_conn: admin_conn} do      assert admin_conn -           |> delete("/api/pleroma/emoji/packs/ ") +           |> delete("/api/pleroma/emoji/pack?name= ")             |> json_response_and_validate_schema(:bad_request) == %{               "error" => "pack name cannot be empty"             } @@ -514,7 +526,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do             }    end -  describe "GET /api/pleroma/emoji/packs/:name" do +  describe "GET /api/pleroma/emoji/pack?name=:name" do      test "shows pack.json", %{conn: conn} do        assert %{                 "files" => files, @@ -529,7 +541,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do                 }               } =                 conn -               |> get("/api/pleroma/emoji/packs/test_pack") +               |> get("/api/pleroma/emoji/pack?name=test_pack")                 |> json_response_and_validate_schema(200)        assert files == %{"blank" => "blank.png", "blank2" => "blank2.png"} @@ -539,7 +551,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do                 "files_count" => 2               } =                 conn -               |> get("/api/pleroma/emoji/packs/test_pack?page_size=1") +               |> get("/api/pleroma/emoji/pack?name=test_pack&page_size=1")                 |> json_response_and_validate_schema(200)        assert files |> Map.keys() |> length() == 1 @@ -549,15 +561,33 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do                 "files_count" => 2               } =                 conn -               |> get("/api/pleroma/emoji/packs/test_pack?page_size=1&page=2") +               |> get("/api/pleroma/emoji/pack?name=test_pack&page_size=1&page=2")                 |> json_response_and_validate_schema(200)        assert files |> Map.keys() |> length() == 1      end +    test "for pack name with special chars", %{conn: conn} do +      assert %{ +               "files" => files, +               "files_count" => 1, +               "pack" => %{ +                 "can-download" => true, +                 "description" => "Test description", +                 "download-sha256" => _, +                 "homepage" => "https://pleroma.social", +                 "license" => "Test license", +                 "share-files" => true +               } +             } = +               conn +               |> get("/api/pleroma/emoji/pack?name=blobs.gg") +               |> json_response_and_validate_schema(200) +    end +      test "non existing pack", %{conn: conn} do        assert conn -             |> get("/api/pleroma/emoji/packs/non_existing") +             |> get("/api/pleroma/emoji/pack?name=non_existing")               |> json_response_and_validate_schema(:not_found) == %{                 "error" => "Pack non_existing does not exist"               } @@ -565,7 +595,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do      test "error name", %{conn: conn} do        assert conn -             |> get("/api/pleroma/emoji/packs/ ") +             |> get("/api/pleroma/emoji/pack?name= ")               |> json_response_and_validate_schema(:bad_request) == %{                 "error" => "pack name cannot be empty"               }  | 
