diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 2ca174c1f..f9b47a26b 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -252,7 +252,7 @@ def download(name, url, as) do with :ok <- validate_shareable_packs_available(uri), {:ok, remote_pack} <- - uri |> URI.merge("/api/v1/pleroma/emoji/pack?name=#{name}") |> http_get(), + uri |> URI.merge("/api/v1/pleroma/emoji/pack?name=#{URI.encode(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), @@ -593,7 +593,9 @@ defp fetch_pack_info(remote_pack, uri, name) do {:ok, %{ sha: sha, - url: URI.merge(uri, "/api/v1/pleroma/emoji/packs/archive?name=#{name}") |> to_string() + url: + URI.merge(uri, "/api/v1/pleroma/emoji/packs/archive?name=#{URI.encode(name)}") + |> to_string() }} %{"fallback-src" => src, "fallback-src-sha256" => sha} when is_binary(src) -> diff --git a/test/instance_static/emoji/test with spaces/blank.png b/test/instance_static/emoji/test with spaces/blank.png new file mode 100644 index 000000000..8f50fa023 Binary files /dev/null and b/test/instance_static/emoji/test with spaces/blank.png differ diff --git a/test/instance_static/emoji/test with spaces/blank2.png b/test/instance_static/emoji/test with spaces/blank2.png new file mode 100644 index 000000000..8f50fa023 Binary files /dev/null and b/test/instance_static/emoji/test with spaces/blank2.png differ diff --git a/test/instance_static/emoji/test with spaces/pack.json b/test/instance_static/emoji/test with spaces/pack.json new file mode 100644 index 000000000..5b33fbb32 --- /dev/null +++ b/test/instance_static/emoji/test with spaces/pack.json @@ -0,0 +1,12 @@ +{ + "files": { + "blank": "blank.png", + "blank2": "blank2.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/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs index b86418196..d6f9036e2 100644 --- a/test/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/pleroma/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -40,11 +40,11 @@ test "GET /api/v1/pleroma/emoji/packs", %{conn: conn} do |> get("/api/v1/pleroma/emoji/packs") |> json_response_and_validate_schema(200) - assert resp["count"] == 4 + assert resp["count"] == 5 assert resp["packs"] |> Map.keys() - |> length() == 4 + |> length() == 5 shared = resp["packs"]["test_pack"] assert shared["files"] == %{"blank" => "blank.png", "blank2" => "blank2.png"} @@ -61,7 +61,7 @@ test "GET /api/v1/pleroma/emoji/packs", %{conn: conn} do |> get("/api/v1/pleroma/emoji/packs?page_size=1") |> json_response_and_validate_schema(200) - assert resp["count"] == 4 + assert resp["count"] == 5 packs = Map.keys(resp["packs"]) @@ -74,7 +74,7 @@ test "GET /api/v1/pleroma/emoji/packs", %{conn: conn} do |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=2") |> json_response_and_validate_schema(200) - assert resp["count"] == 4 + assert resp["count"] == 5 packs = Map.keys(resp["packs"]) assert length(packs) == 1 [pack2] = packs @@ -84,7 +84,7 @@ test "GET /api/v1/pleroma/emoji/packs", %{conn: conn} do |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=3") |> json_response_and_validate_schema(200) - assert resp["count"] == 4 + assert resp["count"] == 5 packs = Map.keys(resp["packs"]) assert length(packs) == 1 [pack3] = packs @@ -94,7 +94,7 @@ test "GET /api/v1/pleroma/emoji/packs", %{conn: conn} do |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=4") |> json_response_and_validate_schema(200) - assert resp["count"] == 4 + assert resp["count"] == 5 packs = Map.keys(resp["packs"]) assert length(packs) == 1 [pack4] = packs @@ -221,6 +221,24 @@ test "shared pack from remote and non shared from fallback-src", %{ url: "https://nonshared-pack" } -> text(File.read!("#{@emoji_path}/test_pack_nonshared/nonshared.zip")) + + %{ + method: :get, + url: "https://example.com/api/v1/pleroma/emoji/pack?name=test%20with%20spaces" + } -> + conn + |> get("/api/v1/pleroma/emoji/pack?name=test%20with%20spaces") + |> json_response_and_validate_schema(200) + |> json() + + %{ + method: :get, + url: "https://example.com/api/v1/pleroma/emoji/packs/archive?name=test%20with%20spaces" + } -> + conn + |> get("/api/v1/pleroma/emoji/packs/archive?name=test%20with%20spaces") + |> response(200) + |> text() end) assert admin_conn @@ -261,6 +279,18 @@ test "shared pack from remote and non shared from fallback-src", %{ |> json_response_and_validate_schema(200) == "ok" refute File.exists?("#{@emoji_path}/test_pack_nonshared2") + + assert admin_conn + |> put_req_header("content-type", "multipart/form-data") + |> post("/api/v1/pleroma/emoji/packs/download", %{ + url: "https://example.com", + name: "test with spaces", + as: "test with spaces" + }) + |> json_response_and_validate_schema(200) == "ok" + + assert File.exists?("#{@emoji_path}/test with spaces/pack.json") + assert File.exists?("#{@emoji_path}/test with spaces/blank.png") end test "nonshareable instance", %{admin_conn: admin_conn} do