diff options
Diffstat (limited to 'lib/pleroma')
15 files changed, 178 insertions, 73 deletions
| diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 14a5185be..787ff8141 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -1,6 +1,7 @@  defmodule Pleroma.Emoji.Pack do -  @derive {Jason.Encoder, only: [:files, :pack]} +  @derive {Jason.Encoder, only: [:files, :pack, :files_count]}    defstruct files: %{}, +            files_count: 0,              pack_file: nil,              path: nil,              pack: %{}, @@ -8,6 +9,7 @@ defmodule Pleroma.Emoji.Pack do    @type t() :: %__MODULE__{            files: %{String.t() => Path.t()}, +          files_count: non_neg_integer(),            pack_file: Path.t(),            path: Path.t(),            pack: map(), @@ -16,7 +18,7 @@ defmodule Pleroma.Emoji.Pack do    alias Pleroma.Emoji -  @spec create(String.t()) :: :ok | {:error, File.posix()} | {:error, :empty_values} +  @spec create(String.t()) :: {:ok, t()} | {:error, File.posix()} | {:error, :empty_values}    def create(name) do      with :ok <- validate_not_empty([name]),           dir <- Path.join(emoji_path(), name), @@ -26,10 +28,27 @@ defmodule Pleroma.Emoji.Pack do      end    end -  @spec show(String.t()) :: {:ok, t()} | {:error, atom()} -  def show(name) do +  defp paginate(entities, 1, page_size), do: Enum.take(entities, page_size) + +  defp paginate(entities, page, page_size) do +    entities +    |> Enum.chunk_every(page_size) +    |> Enum.at(page - 1) +  end + +  @spec show(keyword()) :: {:ok, t()} | {:error, atom()} +  def show(opts) do +    name = opts[:name] +      with :ok <- validate_not_empty([name]),           {:ok, pack} <- load_pack(name) do +      shortcodes = +        pack.files +        |> Map.keys() +        |> paginate(opts[:page], opts[:page_size]) + +      pack = Map.put(pack, :files, Map.take(pack.files, shortcodes)) +        {:ok, validate_pack(pack)}      end    end @@ -120,10 +139,10 @@ defmodule Pleroma.Emoji.Pack do      end    end -  @spec list_local() :: {:ok, map()} -  def list_local do +  @spec list_local(keyword()) :: {:ok, map(), non_neg_integer()} +  def list_local(opts) do      with {:ok, results} <- list_packs_dir() do -      packs = +      all_packs =          results          |> Enum.map(fn name ->            case load_pack(name) do @@ -132,9 +151,13 @@ defmodule Pleroma.Emoji.Pack do            end          end)          |> Enum.reject(&is_nil/1) + +      packs = +        all_packs +        |> paginate(opts[:page], opts[:page_size])          |> Map.new(fn pack -> {pack.name, validate_pack(pack)} end) -      {:ok, packs} +      {:ok, packs, length(all_packs)}      end    end @@ -146,7 +169,7 @@ defmodule Pleroma.Emoji.Pack do      end    end -  @spec download(String.t(), String.t(), String.t()) :: :ok | {:error, atom()} +  @spec download(String.t(), String.t(), String.t()) :: {:ok, t()} | {:error, atom()}    def download(name, url, as) do      uri = url |> String.trim() |> URI.parse() @@ -197,7 +220,12 @@ defmodule Pleroma.Emoji.Pack do          |> Map.put(:path, Path.dirname(pack_file))          |> Map.put(:name, name) -      {:ok, pack} +      files_count = +        pack.files +        |> Map.keys() +        |> length() + +      {:ok, Map.put(pack, :files_count, files_count)}      else        {:error, :not_found}      end @@ -296,7 +324,9 @@ defmodule Pleroma.Emoji.Pack do      # Otherwise, they'd have to download it from external-src      pack.pack["share-files"] &&        Enum.all?(pack.files, fn {_, file} -> -        File.exists?(Path.join(pack.path, file)) +        pack.path +        |> Path.join(file) +        |> File.exists?()        end)    end @@ -440,7 +470,7 @@ defmodule Pleroma.Emoji.Pack do      # with the API so it should be sufficient      with {:create_dir, :ok} <- {:create_dir, File.mkdir_p(emoji_path)},           {:ls, {:ok, results}} <- {:ls, File.ls(emoji_path)} do -      {:ok, results} +      {:ok, Enum.sort(results)}      else        {:create_dir, {:error, e}} -> {:error, :create_dir, e}        {:ls, {:error, e}} -> {:error, :ls, e} diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index f0ccc7c79..1d70a37ef 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -263,37 +263,60 @@ defmodule Pleroma.User do    def account_status(%User{password_reset_pending: true}), do: :password_reset_pending    def account_status(%User{confirmation_pending: true}) do -    case Config.get([:instance, :account_activation_required]) do -      true -> :confirmation_pending -      _ -> :active +    if Config.get([:instance, :account_activation_required]) do +      :confirmation_pending +    else +      :active      end    end    def account_status(%User{}), do: :active -  @spec visible_for?(User.t(), User.t() | nil) :: boolean() -  def visible_for?(user, for_user \\ nil) +  @spec visible_for(User.t(), User.t() | nil) :: +          :visible +          | :invisible +          | :restricted_unauthenticated +          | :deactivated +          | :confirmation_pending +  def visible_for(user, for_user \\ nil) -  def visible_for?(%User{invisible: true}, _), do: false +  def visible_for(%User{invisible: true}, _), do: :invisible -  def visible_for?(%User{id: user_id}, %User{id: user_id}), do: true +  def visible_for(%User{id: user_id}, %User{id: user_id}), do: :visible -  def visible_for?(%User{local: local} = user, nil) do -    cfg_key = -      if local, -        do: :local, -        else: :remote +  def visible_for(%User{} = user, nil) do +    if restrict_unauthenticated?(user) do +      :restrict_unauthenticated +    else +      visible_account_status(user) +    end +  end -    if Config.get([:restrict_unauthenticated, :profiles, cfg_key]), -      do: false, -      else: account_status(user) == :active +  def visible_for(%User{} = user, for_user) do +    if superuser?(for_user) do +      :visible +    else +      visible_account_status(user) +    end    end -  def visible_for?(%User{} = user, for_user) do -    account_status(user) == :active || superuser?(for_user) +  def visible_for(_, _), do: :invisible + +  defp restrict_unauthenticated?(%User{local: local}) do +    config_key = if local, do: :local, else: :remote + +    Config.get([:restrict_unauthenticated, :profiles, config_key], false)    end -  def visible_for?(_, _), do: false +  defp visible_account_status(user) do +    status = account_status(user) + +    if status in [:active, :password_reset_pending] do +      :visible +    else +      status +    end +  end    @spec superuser?(User.t()) :: boolean()    def superuser?(%User{local: true, is_admin: true}), do: true @@ -465,6 +488,7 @@ defmodule Pleroma.User do      |> validate_format(:nickname, local_nickname_regex())      |> validate_length(:bio, max: bio_limit)      |> validate_length(:name, min: 1, max: name_limit) +    |> validate_inclusion(:actor_type, ["Person", "Service"])      |> put_fields()      |> put_emoji()      |> put_change_if_present(:bio, &{:ok, parse_bio(&1, struct)}) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 3e4f3ad30..3e4d0a2be 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -834,7 +834,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    defp restrict_media(query, %{only_media: true}) do      from( -      [_activity, object] in query, +      [activity, object] in query, +      where: fragment("(?)->>'type' = ?", activity.data, "Create"),        where: fragment("not (?)->'attachment' = (?)", object.data, ^[])      )    end diff --git a/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex b/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex index 1764bc789..f6b2c4415 100644 --- a/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex @@ -13,8 +13,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do    defp delist_message(message, threshold) when threshold > 0 do      follower_collection = User.get_cached_by_ap_id(message["actor"]).follower_address +    to = message["to"] || [] +    cc = message["cc"] || [] -    follower_collection? = Enum.member?(message["to"] ++ message["cc"], follower_collection) +    follower_collection? = Enum.member?(to ++ cc, follower_collection)      message =        case get_recipient_count(message) do @@ -71,7 +73,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do    end    @impl true -  def filter(%{"type" => "Create"} = message) do +  def filter(%{"type" => "Create", "object" => %{"type" => object_type}} = message) +      when object_type in ~w{Note Article} do      reject_threshold =        Pleroma.Config.get(          [:mrf_hellthread, :reject_threshold], diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex index a10728ac6..56b93dde8 100644 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex @@ -41,7 +41,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do      field(:announcements, {:array, :string}, default: [])      # see if needed -    field(:conversation, :string)      field(:context_id, :string)    end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 851f474b8..1c60ef8f5 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -172,8 +172,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do          object          |> Map.put("inReplyTo", replied_object.data["id"])          |> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id) -        |> Map.put("conversation", replied_object.data["context"] || object["conversation"])          |> Map.put("context", replied_object.data["context"] || object["conversation"]) +        |> Map.drop(["conversation"])        else          e ->            Logger.error("Couldn't fetch #{inspect(in_reply_to_id)}, error: #{inspect(e)}") @@ -207,7 +207,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do      object      |> Map.put("context", context) -    |> Map.put("conversation", context) +    |> Map.drop(["conversation"])    end    def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachment) do @@ -458,7 +458,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do          to: data["to"],          object: object,          actor: user, -        context: object["conversation"], +        context: object["context"],          local: false,          published: data["published"],          additional: diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 5cbf0dd4f..db2413dfe 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -111,8 +111,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do        action: "delete"      }) -    conn -    |> json(nicknames) +    json(conn, nicknames)    end    def user_follow(%{assigns: %{user: admin}} = conn, %{ @@ -131,8 +130,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do        })      end -    conn -    |> json("ok") +    json(conn, "ok")    end    def user_unfollow(%{assigns: %{user: admin}} = conn, %{ @@ -151,8 +149,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do        })      end -    conn -    |> json("ok") +    json(conn, "ok")    end    def users_create(%{assigns: %{user: admin}} = conn, %{"users" => users}) do @@ -191,8 +188,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do            action: "create"          }) -        conn -        |> json(res) +        json(conn, res)        {:error, id, changeset, _} ->          res = @@ -363,8 +359,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do      filters      |> String.split(",")      |> Enum.filter(&Enum.member?(@filters, &1)) -    |> Enum.map(&String.to_atom(&1)) -    |> Enum.into(%{}, &{&1, true}) +    |> Enum.map(&String.to_atom/1) +    |> Map.new(&{&1, true})    end    def right_add_multiple(%{assigns: %{user: admin}} = conn, %{ @@ -568,10 +564,10 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do        {:error, changeset} ->          errors = Map.new(changeset.errors, fn {key, {error, _}} -> {key, error} end) -        json(conn, %{errors: errors}) +        {:errors, errors}        _ -> -        json(conn, %{error: "Unable to update user."}) +        {:error, :not_found}      end    end @@ -616,7 +612,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do    def reload_emoji(conn, _params) do      Pleroma.Emoji.reload() -    conn |> json("ok") +    json(conn, "ok")    end    def confirm_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do @@ -630,7 +626,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do        action: "confirm_email"      }) -    conn |> json("") +    json(conn, "")    end    def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do @@ -644,14 +640,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do        action: "resend_confirmation_email"      }) -    conn |> json("") +    json(conn, "")    end    def stats(conn, _) do      count = Stats.get_status_visibility_count() -    conn -    |> json(%{"status_visibility" => count}) +    json(conn, %{"status_visibility" => count})    end    defp page_params(params) do diff --git a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex index 82965936d..34d90db07 100644 --- a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex @@ -17,6 +17,12 @@ defmodule Pleroma.Web.AdminAPI.FallbackController do      |> json(%{error: reason})    end +  def call(conn, {:errors, errors}) do +    conn +    |> put_status(:bad_request) +    |> json(%{errors: errors}) +  end +    def call(conn, {:param_cast, _}) do      conn      |> put_status(:bad_request) diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex index 20572f8ea..9bde8fc0d 100644 --- a/lib/pleroma/web/api_spec/operations/account_operation.ex +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -102,6 +102,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do        parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}],        responses: %{          200 => Operation.response("Account", "application/json", Account), +        401 => Operation.response("Error", "application/json", ApiError),          404 => Operation.response("Error", "application/json", ApiError)        }      } @@ -142,6 +143,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do          ] ++ pagination_params(),        responses: %{          200 => Operation.response("Statuses", "application/json", array_of_statuses()), +        401 => Operation.response("Error", "application/json", ApiError),          404 => Operation.response("Error", "application/json", ApiError)        }      } diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex index 41328b5f2..f09be64cb 100644 --- a/lib/pleroma/web/api_spec/operations/notification_operation.ex +++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex @@ -163,6 +163,13 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do            description:              "Status that was the object of the notification, e.g. in mentions, reblogs, favourites, or polls.",            nullable: true +        }, +        pleroma: %Schema{ +          type: :object, +          properties: %{ +            is_seen: %Schema{type: :boolean}, +            is_muted: %Schema{type: :boolean} +          }          }        },        example: %{ @@ -170,7 +177,8 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do          "type" => "mention",          "created_at" => "2019-11-23T07:49:02.064Z",          "account" => Account.schema().example, -        "status" => Status.schema().example +        "status" => Status.schema().example, +        "pleroma" => %{"is_seen" => false, "is_muted" => false}        }      }    end 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 567688ff5..b2b4f8713 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 @@ -33,6 +33,20 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do        tags: ["Emoji Packs"],        summary: "Lists local custom emoji packs",        operationId: "PleromaAPI.EmojiPackController.index", +      parameters: [ +        Operation.parameter( +          :page, +          :query, +          %Schema{type: :integer, default: 1}, +          "Page" +        ), +        Operation.parameter( +          :page_size, +          :query, +          %Schema{type: :integer, default: 50}, +          "Number of emoji packs to return" +        ) +      ],        responses: %{          200 => emoji_packs_response()        } @@ -44,7 +58,21 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do        tags: ["Emoji Packs"],        summary: "Show emoji pack",        operationId: "PleromaAPI.EmojiPackController.show", -      parameters: [name_param()], +      parameters: [ +        name_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" +        ) +      ],        responses: %{          200 => Operation.response("Emoji Pack", "application/json", emoji_pack()),          400 => Operation.response("Bad Request", "application/json", ApiError), diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index c38c2b895..d50e7c5dd 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -177,6 +177,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do        |> Maps.put_if_present(:pleroma_settings_store, params[:pleroma_settings_store])        |> Maps.put_if_present(:default_scope, params[:default_scope])        |> Maps.put_if_present(:default_scope, params["source"]["privacy"]) +      |> Maps.put_if_present(:actor_type, params[:bot], fn bot -> +        if bot, do: {:ok, "Service"}, else: {:ok, "Person"} +      end)        |> Maps.put_if_present(:actor_type, params[:actor_type])      changeset = User.update_changeset(user, user_params) @@ -231,17 +234,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do    @doc "GET /api/v1/accounts/:id"    def show(%{assigns: %{user: for_user}} = conn, %{id: nickname_or_id}) do      with %User{} = user <- User.get_cached_by_nickname_or_id(nickname_or_id, for: for_user), -         true <- User.visible_for?(user, for_user) do +         :visible <- User.visible_for(user, for_user) do        render(conn, "show.json", user: user, for: for_user)      else -      _e -> render_error(conn, :not_found, "Can't find user") +      error -> user_visibility_error(conn, error)      end    end    @doc "GET /api/v1/accounts/:id/statuses"    def statuses(%{assigns: %{user: reading_user}} = conn, params) do      with %User{} = user <- User.get_cached_by_nickname_or_id(params.id, for: reading_user), -         true <- User.visible_for?(user, reading_user) do +         :visible <- User.visible_for(user, reading_user) do        params =          params          |> Map.delete(:tagged) @@ -258,7 +261,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do          as: :activity        )      else -      _e -> render_error(conn, :not_found, "Can't find user") +      error -> user_visibility_error(conn, error) +    end +  end + +  defp user_visibility_error(conn, error) do +    case error do +      :restrict_unauthenticated -> +        render_error(conn, :unauthorized, "This API requires an authenticated user") + +      _ -> +        render_error(conn, :not_found, "Can't find user")      end    end diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 68beb69b8..a6e64b4ab 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -35,7 +35,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do    end    def render("show.json", %{user: user} = opts) do -    if User.visible_for?(user, opts[:for]) do +    if User.visible_for(user, opts[:for]) == :visible do        do_render("show.json", opts)      else        %{} @@ -179,7 +179,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do          0        end -    bot = user.actor_type in ["Application", "Service"] +    bot = user.actor_type == "Service"      emojis =        Enum.map(user.emoji, fn {shortcode, raw_url} -> diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 3865be280..c97e6d32f 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -84,12 +84,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do      # Note: :relationships contain user mutes (needed for :muted flag in :status)      status_render_opts = %{relationships: opts[:relationships]} - -    account = -      AccountView.render( -        "show.json", -        %{user: actor, for: reading_user} -      ) +    account = AccountView.render("show.json", %{user: actor, for: reading_user})      response = %{        id: to_string(notification.id), @@ -97,6 +92,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do        created_at: CommonAPI.Utils.to_masto_date(notification.inserted_at),        account: account,        pleroma: %{ +        is_muted: User.mutes?(reading_user, actor),          is_seen: notification.seen        }      } 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 d1efdeb5d..33ecd1f70 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -37,14 +37,14 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do      end    end -  def index(conn, _params) do +  def index(conn, params) do      emoji_path =        [:instance, :static_dir]        |> Pleroma.Config.get!()        |> Path.join("emoji") -    with {:ok, packs} <- Pack.list_local() do -      json(conn, packs) +    with {:ok, packs, count} <- Pack.list_local(page: params.page, page_size: params.page_size) do +      json(conn, %{packs: packs, count: count})      else        {:error, :create_dir, e} ->          conn @@ -60,10 +60,10 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do      end    end -  def show(conn, %{name: name}) do +  def show(conn, %{name: name, page: page, page_size: page_size}) do      name = String.trim(name) -    with {:ok, pack} <- Pack.show(name) do +    with {:ok, pack} <- Pack.show(name: name, page: page, page_size: page_size) do        json(conn, pack)      else        {:error, :not_found} -> | 
