giant massive dep upgrade and dialyxir-found error emporium (#371)

Co-authored-by: FloatingGhost <hannah@coffee-and-dreams.uk>
Reviewed-on: AkkomaGang/akkoma#371
This commit is contained in:
floatingghost 2022-12-14 12:38:48 +00:00
parent 7f4d218cff
commit 07a48b9293
75 changed files with 688 additions and 555 deletions

View file

@ -8,11 +8,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed ### Removed
- Non-finch HTTP adapters - Non-finch HTTP adapters
### Upgrade notes - Legacy redirect from /api/pleroma/admin to /api/v1/pleroma/admin
- Ensure `config :tesla, :adapter` is either unset, or set to `{Tesla.Adapter.Finch, name: MyFinch}` in your .exs config
### Changed ### Changed
- Return HTTP error 413 when uploading an avatar or banner that's above the configured upload limit instead of a 500. - Return HTTP error 413 when uploading an avatar or banner that's above the configured upload limit instead of a 500.
### Upgrade notes
- Ensure `config :tesla, :adapter` is either unset, or set to `{Tesla.Adapter.Finch, name: MyFinch}` in your .exs config
## 2022.12 ## 2022.12
## Added ## Added

View file

@ -1,3 +1,4 @@
# credo:disable-for-this-file
# Pleroma: A lightweight social networking server # Pleroma: A lightweight social networking server
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/> # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only

View file

@ -115,7 +115,6 @@ def run(["prune_task"]) do
nil nil
|> Pleroma.Workers.Cron.PruneDatabaseWorker.perform() |> Pleroma.Workers.Cron.PruneDatabaseWorker.perform()
|> IO.inspect()
end end
def run(["fix_likes_collections"]) do def run(["fix_likes_collections"]) do

View file

@ -1,3 +1,4 @@
# credo:disable-for-this-file
defmodule Mix.Tasks.Pleroma.Diagnostics do defmodule Mix.Tasks.Pleroma.Diagnostics do
alias Pleroma.Repo alias Pleroma.Repo
alias Pleroma.User alias Pleroma.User

View file

@ -247,9 +247,13 @@ def run(["gen" | rest]) do
config_dir = Path.dirname(config_path) config_dir = Path.dirname(config_path)
psql_dir = Path.dirname(psql_path) psql_dir = Path.dirname(psql_path)
to_create =
[config_dir, psql_dir, static_dir, uploads_dir] [config_dir, psql_dir, static_dir, uploads_dir]
|> Enum.reject(&File.exists?/1) |> Enum.reject(&File.exists?/1)
|> Enum.map(&File.mkdir_p!/1)
for dir <- to_create do
File.mkdir_p!(dir)
end
shell_info("Writing config to #{config_path}.") shell_info("Writing config to #{config_path}.")
@ -319,6 +323,4 @@ defp upload_filters(filters) when is_map(filters) do
enabled_filters enabled_filters
end end
defp upload_filters(_), do: []
end end

View file

@ -10,14 +10,11 @@ defmodule Mix.Tasks.Pleroma.Search do
def run(["import", "activities" | _rest]) do def run(["import", "activities" | _rest]) do
start_pleroma() start_pleroma()
IO.inspect(Pleroma.Config.get([Pleroma.Search.Elasticsearch.Cluster, :indexes, :activities]))
IO.inspect(
Elasticsearch.Index.Bulk.upload( Elasticsearch.Index.Bulk.upload(
Pleroma.Search.Elasticsearch.Cluster, Pleroma.Search.Elasticsearch.Cluster,
"activities", "activities",
Pleroma.Config.get([Pleroma.Search.Elasticsearch.Cluster, :indexes, :activities]) Pleroma.Config.get([Pleroma.Search.Elasticsearch.Cluster, :indexes, :activities])
) )
)
end end
end end

View file

@ -378,9 +378,11 @@ def run(["change_email", nickname, email]) do
def run(["show", nickname]) do def run(["show", nickname]) do
start_pleroma() start_pleroma()
user =
nickname nickname
|> User.get_cached_by_nickname() |> User.get_cached_by_nickname()
|> IO.inspect()
shell_info("#{inspect(user)}")
end end
def run(["send_confirmation", nickname]) do def run(["send_confirmation", nickname]) do
@ -389,7 +391,6 @@ def run(["send_confirmation", nickname]) do
with %User{} = user <- User.get_cached_by_nickname(nickname) do with %User{} = user <- User.get_cached_by_nickname(nickname) do
user user
|> Pleroma.Emails.UserEmail.account_confirmation_email() |> Pleroma.Emails.UserEmail.account_confirmation_email()
|> IO.inspect()
|> Pleroma.Emails.Mailer.deliver!() |> Pleroma.Emails.Mailer.deliver!()
shell_info("#{nickname}'s email sent") shell_info("#{nickname}'s email sent")
@ -465,7 +466,7 @@ def run(["blocking", nickname]) do
with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do with %User{local: true} = user <- User.get_cached_by_nickname(nickname) do
blocks = User.following_ap_ids(user) blocks = User.following_ap_ids(user)
IO.inspect(blocks, limit: :infinity) IO.puts("#{inspect(blocks)}")
end end
end end

View file

@ -38,7 +38,11 @@ defp add_cache_key_for(activity_id, additional_key) do
def invalidate_cache_for(activity_id) do def invalidate_cache_for(activity_id) do
keys = get_cache_keys_for(activity_id) keys = get_cache_keys_for(activity_id)
Enum.map(keys, &@cachex.del(:scrubber_cache, &1))
for key <- keys do
@cachex.del(:scrubber_cache, key)
end
@cachex.del(:scrubber_management_cache, activity_id) @cachex.del(:scrubber_management_cache, activity_id)
end end

View file

@ -24,8 +24,10 @@ defmodule Pleroma.Announcement do
end end
def change(struct, params \\ %{}) do def change(struct, params \\ %{}) do
params = validate_params(struct, params)
struct struct
|> cast(validate_params(struct, params), [:data, :starts_at, :ends_at, :rendered]) |> cast(params, [:data, :starts_at, :ends_at, :rendered])
|> validate_required([:data]) |> validate_required([:data])
end end

View file

@ -198,6 +198,8 @@ defp background_migrators do
] ]
end end
@spec task_children(atom()) :: [map()]
defp task_children(:test) do defp task_children(:test) do
[ [
%{ %{
@ -223,6 +225,7 @@ defp task_children(_) do
] ]
end end
@spec elasticsearch_children :: [Pleroma.Search.Elasticsearch.Cluster]
def elasticsearch_children do def elasticsearch_children do
config = Config.get([Pleroma.Search, :module]) config = Config.get([Pleroma.Search, :module])

View file

@ -194,8 +194,6 @@ defp check_system_commands!(:ok) do
end end
end end
defp check_system_commands!(result), do: result
defp check_repo_pool_size!(:ok) do defp check_repo_pool_size!(:ok) do
if Pleroma.Config.get([Pleroma.Repo, :pool_size], 10) != 10 and if Pleroma.Config.get([Pleroma.Repo, :pool_size], 10) != 10 and
not Pleroma.Config.get([:dangerzone, :override_repo_pool_size], false) do not Pleroma.Config.get([:dangerzone, :override_repo_pool_size], false) do

View file

@ -209,7 +209,9 @@ def list_remote(opts) do
with :ok <- validate_shareable_packs_available(uri) do with :ok <- validate_shareable_packs_available(uri) do
uri uri
|> URI.merge("/api/pleroma/emoji/packs?page=#{opts[:page]}&page_size=#{opts[:page_size]}") |> URI.merge(
"/api/v1/pleroma/emoji/packs?page=#{opts[:page]}&page_size=#{opts[:page_size]}"
)
|> http_get() |> http_get()
end end
end end
@ -250,7 +252,7 @@ def download(name, url, as) do
with :ok <- validate_shareable_packs_available(uri), with :ok <- validate_shareable_packs_available(uri),
{:ok, remote_pack} <- {:ok, remote_pack} <-
uri |> URI.merge("/api/pleroma/emoji/pack?name=#{name}") |> http_get(), uri |> URI.merge("/api/v1/pleroma/emoji/pack?name=#{name}") |> http_get(),
{:ok, %{sha: sha, url: url} = pack_info} <- fetch_pack_info(remote_pack, uri, name), {:ok, %{sha: sha, url: url} = pack_info} <- fetch_pack_info(remote_pack, uri, name),
{:ok, archive} <- download_archive(url, sha), {:ok, archive} <- download_archive(url, sha),
pack <- copy_as(remote_pack, as || name), pack <- copy_as(remote_pack, as || name),
@ -591,7 +593,7 @@ defp fetch_pack_info(remote_pack, uri, name) do
{:ok, {:ok,
%{ %{
sha: sha, sha: sha,
url: URI.merge(uri, "/api/pleroma/emoji/packs/archive?name=#{name}") |> to_string() url: URI.merge(uri, "/api/v1/pleroma/emoji/packs/archive?name=#{name}") |> to_string()
}} }}
%{"fallback-src" => src, "fallback-src-sha256" => sha} when is_binary(src) -> %{"fallback-src" => src, "fallback-src-sha256" => sha} when is_binary(src) ->

View file

@ -14,6 +14,8 @@ defmodule Pleroma.FollowingRelationship do
alias Pleroma.Repo alias Pleroma.Repo
alias Pleroma.User alias Pleroma.User
@type follow_state :: :follow_pending | :follow_accept | :follow_reject | :unfollow
schema "following_relationships" do schema "following_relationships" do
field(:state, State, default: :follow_pending) field(:state, State, default: :follow_pending)
@ -72,6 +74,7 @@ def update(%User{} = follower, %User{} = following, state) do
end end
end end
@spec follow(User.t(), User.t()) :: {:ok, User.t(), User.t()} | {:error, any}
def follow(%User{} = follower, %User{} = following, state \\ :follow_accept) do def follow(%User{} = follower, %User{} = following, state \\ :follow_accept) do
with {:ok, _following_relationship} <- with {:ok, _following_relationship} <-
%__MODULE__{} %__MODULE__{}
@ -81,6 +84,7 @@ def follow(%User{} = follower, %User{} = following, state \\ :follow_accept) do
end end
end end
@spec unfollow(User.t(), User.t()) :: {:ok, User.t(), User.t()} | {:error, any}
def unfollow(%User{} = follower, %User{} = following) do def unfollow(%User{} = follower, %User{} = following) do
case get(follower, following) do case get(follower, following) do
%__MODULE__{} = following_relationship -> %__MODULE__{} = following_relationship ->
@ -89,10 +93,12 @@ def unfollow(%User{} = follower, %User{} = following) do
end end
_ -> _ ->
{:ok, nil} {:ok, follower, following}
end end
end end
@spec after_update(follow_state(), User.t(), User.t()) ::
{:ok, User.t(), User.t()} | {:error, any()}
defp after_update(state, %User{} = follower, %User{} = following) do defp after_update(state, %User{} = follower, %User{} = following) do
with {:ok, following} <- User.update_follower_count(following), with {:ok, following} <- User.update_follower_count(following),
{:ok, follower} <- User.update_following_count(follower) do {:ok, follower} <- User.update_following_count(follower) do
@ -103,6 +109,8 @@ defp after_update(state, %User{} = follower, %User{} = following) do
}) })
{:ok, follower, following} {:ok, follower, following}
else
err -> {:error, err}
end end
end end

View file

@ -104,10 +104,10 @@ defp run_fifo(fifo_path, env, executable, args) do
args: args args: args
]) ])
fifo = Port.open(to_charlist(fifo_path), [:eof, :binary, :stream, :out]) fifo = File.open!(fifo_path, [:append, :binary])
fix = Pleroma.Helpers.QtFastStart.fix(env.body) fix = Pleroma.Helpers.QtFastStart.fix(env.body)
true = Port.command(fifo, fix) IO.binwrite(fifo, fix)
:erlang.port_close(fifo) File.close(fifo)
loop_recv(pid) loop_recv(pid)
after after
File.rm(fifo_path) File.rm(fifo_path)

View file

@ -14,9 +14,7 @@ defmodule Pleroma.HTTP.AdapterHelper do
alias Pleroma.HTTP.AdapterHelper alias Pleroma.HTTP.AdapterHelper
require Logger require Logger
@type proxy :: @type proxy :: {Connection.proxy_type(), Connection.host(), pos_integer(), list()}
{Connection.host(), pos_integer()}
| {Connection.proxy_type(), Connection.host(), pos_integer()}
@callback options(keyword(), URI.t()) :: keyword() @callback options(keyword(), URI.t()) :: keyword()
@ -25,7 +23,6 @@ def format_proxy(nil), do: nil
def format_proxy(proxy_url) do def format_proxy(proxy_url) do
case parse_proxy(proxy_url) do case parse_proxy(proxy_url) do
{:ok, host, port} -> {:http, host, port, []}
{:ok, type, host, port} -> {type, host, port, []} {:ok, type, host, port} -> {type, host, port, []}
_ -> nil _ -> nil
end end
@ -94,8 +91,7 @@ defp proxy_type("https"), do: {:ok, :https}
defp proxy_type(_), do: {:error, :unknown} defp proxy_type(_), do: {:error, :unknown}
@spec parse_proxy(String.t() | tuple() | nil) :: @spec parse_proxy(String.t() | tuple() | nil) ::
{:ok, host(), pos_integer()} {:ok, proxy_type(), host(), pos_integer()}
| {:ok, proxy_type(), host(), pos_integer()}
| {:error, atom()} | {:error, atom()}
| nil | nil
def parse_proxy(nil), do: nil def parse_proxy(nil), do: nil

View file

@ -14,7 +14,7 @@ defmodule Pleroma.Migrators.Support.BaseMigrator do
@callback fault_rate_allowance() :: integer() | float() @callback fault_rate_allowance() :: integer() | float()
defmacro __using__(_opts) do defmacro __using__(_opts) do
quote do quote generated: true do
use GenServer use GenServer
require Logger require Logger

View file

@ -237,7 +237,8 @@ def insert_log(%{actor: %User{}, action: action, target: target} = attrs)
insert_log_entry_with_message(%ModerationLog{data: data}) insert_log_entry_with_message(%ModerationLog{data: data})
end end
@spec insert_log_entry_with_message(ModerationLog) :: {:ok, ModerationLog} | {:error, any} @spec insert_log_entry_with_message(ModerationLog.t()) ::
{:ok, ModerationLog.t()} | {:error, any}
defp insert_log_entry_with_message(entry) do defp insert_log_entry_with_message(entry) do
entry.data["message"] entry.data["message"]
|> put_in(get_log_entry_message(entry)) |> put_in(get_log_entry_message(entry))

View file

@ -240,7 +240,7 @@ def delete(%Object{data: %{"id" => id}} = object) do
{:ok, _} <- invalid_object_cache(object) do {:ok, _} <- invalid_object_cache(object) do
cleanup_attachments( cleanup_attachments(
Config.get([:instance, :cleanup_attachments]), Config.get([:instance, :cleanup_attachments]),
%{"object" => object} %{object: object}
) )
{:ok, object, deleted_activity} {:ok, object, deleted_activity}
@ -249,7 +249,7 @@ def delete(%Object{data: %{"id" => id}} = object) do
@spec cleanup_attachments(boolean(), %{required(:object) => map()}) :: @spec cleanup_attachments(boolean(), %{required(:object) => map()}) ::
{:ok, Oban.Job.t() | nil} {:ok, Oban.Job.t() | nil}
def cleanup_attachments(true, %{"object" => _} = params) do def cleanup_attachments(true, %{object: _} = params) do
AttachmentsCleanupWorker.enqueue("cleanup_attachments", params) AttachmentsCleanupWorker.enqueue("cleanup_attachments", params)
end end

View file

@ -61,9 +61,6 @@ def create do
IO.puts("The database for #{inspect(@repo)} has already been created") IO.puts("The database for #{inspect(@repo)} has already been created")
{:error, term} when is_binary(term) -> {:error, term} when is_binary(term) ->
IO.puts(:stderr, "The database for #{inspect(@repo)} couldn't be created: #{term}")
{:error, term} ->
IO.puts( IO.puts(
:stderr, :stderr,
"The database for #{inspect(@repo)} couldn't be created: #{inspect(term)}" "The database for #{inspect(@repo)} couldn't be created: #{inspect(term)}"

View file

@ -66,6 +66,7 @@ defp read_chunk!(%{pid: pid, stream: stream, opts: opts}) do
@impl true @impl true
@spec close(map) :: :ok | no_return() @spec close(map) :: :ok | no_return()
def close(%{pid: _pid}) do def close(%{pid: _pid}) do
:ok
end end
defp check_adapter do defp check_adapter do

View file

@ -13,9 +13,6 @@ defmodule Pleroma.Search.Elasticsearch do
def es_query(:activity, query, offset, limit) do def es_query(:activity, query, offset, limit) do
must = Parsers.Activity.parse(query) must = Parsers.Activity.parse(query)
if must == [] do
:skip
else
%{ %{
size: limit, size: limit,
from: offset, from: offset,
@ -32,7 +29,6 @@ def es_query(:activity, query, offset, limit) do
} }
} }
end end
end
defp maybe_fetch(:activity, search_query) do defp maybe_fetch(:activity, search_query) do
with true <- Regex.match?(~r/https?:/, search_query), with true <- Regex.match?(~r/https?:/, search_query),

View file

@ -57,5 +57,5 @@ def encode(activity) do
defimpl Elasticsearch.Document, for: Pleroma.Object do defimpl Elasticsearch.Document, for: Pleroma.Object do
def id(obj), do: obj.id def id(obj), do: obj.id
def routing(_), do: false def routing(_), do: false
def encode(_), do: nil def encode(_), do: %{}
end end

View file

@ -154,10 +154,11 @@ def add_to_index(activity) do
with {:ok, res} <- result, with {:ok, res} <- result,
true <- Map.has_key?(res, "taskUid") do true <- Map.has_key?(res, "taskUid") do
# Do nothing {:ok, res}
else else
_ -> err ->
Logger.error("Failed to add activity #{activity.id} to index: #{inspect(result)}") Logger.error("Failed to add activity #{activity.id} to index: #{inspect(result)}")
{:error, err}
end end
end end
end end

View file

@ -4,7 +4,7 @@ defmodule Pleroma.Search.SearchBackend do
The whole activity is passed, to allow filtering on things such as scope. The whole activity is passed, to allow filtering on things such as scope.
""" """
@callback add_to_index(activity :: Pleroma.Activity.t()) :: nil @callback add_to_index(activity :: Pleroma.Activity.t()) :: {:ok, any()} | {:error, any()}
@doc """ @doc """
Remove the object from the index. Remove the object from the index.
@ -13,5 +13,5 @@ defmodule Pleroma.Search.SearchBackend do
is what contains the actual content and there is no need for fitlering when removing is what contains the actual content and there is no need for fitlering when removing
from index. from index.
""" """
@callback remove_from_index(object :: Pleroma.Object.t()) :: nil @callback remove_from_index(object :: Pleroma.Object.t()) :: {:ok, any()} | {:error, any()}
end end

View file

@ -27,7 +27,7 @@ def key_id_to_actor_id(key_id) do
_ -> _ ->
case Pleroma.Web.WebFinger.finger(maybe_ap_id) do case Pleroma.Web.WebFinger.finger(maybe_ap_id) do
%{"ap_id" => ap_id} -> {:ok, ap_id} {:ok, %{"ap_id" => ap_id}} -> {:ok, ap_id}
_ -> {:error, maybe_ap_id} _ -> {:error, maybe_ap_id}
end end
end end

View file

@ -162,7 +162,7 @@ defp prepare_upload(%Plug.Upload{} = file, opts) do
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) parsed = Regex.named_captures(~r/(?<filetype>jpeg|png|gif);base64,(?<data>.*)/, image_data)
data = Base.decode64!(parsed["data"], ignore: :whitespace) data = Base.decode64!(parsed["data"], ignore: :whitespace)
hash = Base.encode16(:crypto.hash(:sha256, data), lower: true) hash = Base.encode16(:crypto.hash(:sha256, data), case: :lower)
with :ok <- check_binary_size(data, opts.size_limit), with :ok <- check_binary_size(data, opts.size_limit),
tmp_path <- tempfile_for_image(data), tmp_path <- tempfile_for_image(data),

View file

@ -77,7 +77,6 @@ defp media_dimensions(file) do
%{width: width, height: height} %{width: width, height: height}
else else
nil -> {:error, {:ffprobe, :command_not_found}} nil -> {:error, {:ffprobe, :command_not_found}}
{:error, _} = error -> error
end end
end end
end end

View file

@ -9,7 +9,7 @@ defmodule Pleroma.Upload.Filter.Exiftool do
""" """
@behaviour Pleroma.Upload.Filter @behaviour Pleroma.Upload.Filter
@spec filter(Pleroma.Upload.t()) :: {:ok, any()} | {:error, String.t()} @spec filter(Pleroma.Upload.t()) :: {:ok, :noop} | {:ok, :filtered} | {:error, String.t()}
# Formats not compatible with exiftool at this time # Formats not compatible with exiftool at this time
def filter(%Pleroma.Upload{content_type: "image/heic"}), do: {:ok, :noop} def filter(%Pleroma.Upload{content_type: "image/heic"}), do: {:ok, :noop}

View file

@ -38,7 +38,7 @@ defmodule Pleroma.Upload.Filter.Mogrifun do
[{"fill", "yellow"}, {"tint", "40"}] [{"fill", "yellow"}, {"tint", "40"}]
] ]
@spec filter(Pleroma.Upload.t()) :: {:ok, atom()} | {:error, String.t()} @spec filter(Pleroma.Upload.t()) :: {:ok, :filtered | :noop} | {:error, String.t()}
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
try do try do
Filter.Mogrify.do_filter(file, [Enum.random(@filters)]) Filter.Mogrify.do_filter(file, [Enum.random(@filters)])

View file

@ -3,6 +3,10 @@
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.User do defmodule Pleroma.User do
@moduledoc """
A user, local or remote
"""
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
@ -549,9 +553,17 @@ def update_changeset(struct, params \\ %{}) do
end end
defp put_fields(changeset) do defp put_fields(changeset) do
# These fields are inconsistent in tests when it comes to binary/atom keys
if raw_fields = get_change(changeset, :raw_fields) do if raw_fields = get_change(changeset, :raw_fields) do
raw_fields = raw_fields =
raw_fields raw_fields
|> Enum.map(fn
%{name: name, value: value} ->
%{"name" => name, "value" => value}
%{"name" => _} = field ->
field
end)
|> Enum.filter(fn %{"name" => n} -> n != "" end) |> Enum.filter(fn %{"name" => n} -> n != "" end)
fields = fields =
@ -705,7 +717,8 @@ def register_changeset_ldap(struct, params = %{password: password})
|> put_private_key() |> put_private_key()
end end
def register_changeset(struct, params \\ %{}, opts \\ []) do @spec register_changeset(User.t(), map(), keyword()) :: Changeset.t()
def register_changeset(%User{} = struct, params \\ %{}, opts \\ []) do
bio_limit = Config.get([:instance, :user_bio_length], 5000) bio_limit = Config.get([:instance, :user_bio_length], 5000)
name_limit = Config.get([:instance, :user_name_length], 100) name_limit = Config.get([:instance, :user_name_length], 100)
reason_limit = Config.get([:instance, :registration_reason_length], 500) reason_limit = Config.get([:instance, :registration_reason_length], 500)
@ -819,12 +832,14 @@ defp autofollowing_users(user) do
end end
@doc "Inserts provided changeset, performs post-registration actions (confirmation email sending etc.)" @doc "Inserts provided changeset, performs post-registration actions (confirmation email sending etc.)"
@spec register(Changeset.t()) :: {:ok, User.t()} | {:error, any} | nil
def register(%Ecto.Changeset{} = changeset) do def register(%Ecto.Changeset{} = changeset) do
with {:ok, user} <- Repo.insert(changeset) do with {:ok, user} <- Repo.insert(changeset) do
post_register_action(user) post_register_action(user)
end end
end end
@spec post_register_action(User.t()) :: {:error, any} | {:ok, User.t()}
def post_register_action(%User{is_confirmed: false} = user) do def post_register_action(%User{is_confirmed: false} = user) do
with {:ok, _} <- maybe_send_confirmation_email(user) do with {:ok, _} <- maybe_send_confirmation_email(user) do
{:ok, user} {:ok, user}
@ -939,7 +954,8 @@ def needs_update?(%User{local: false} = user) do
def needs_update?(_), do: true def needs_update?(_), do: true
@spec maybe_direct_follow(User.t(), User.t()) :: {:ok, User.t()} | {:error, String.t()} @spec maybe_direct_follow(User.t(), User.t()) ::
{:ok, User.t(), User.t()} | {:error, String.t()}
# "Locked" (self-locked) users demand explicit authorization of follow requests # "Locked" (self-locked) users demand explicit authorization of follow requests
def maybe_direct_follow(%User{} = follower, %User{local: true, is_locked: true} = followed) do def maybe_direct_follow(%User{} = follower, %User{local: true, is_locked: true} = followed) do
@ -1072,6 +1088,11 @@ def get_by_guessed_nickname(ap_id) do
get_cached_by_nickname(nickname) get_cached_by_nickname(nickname)
end end
@spec set_cache(
{:error, any}
| {:ok, User.t()}
| User.t()
) :: {:ok, User.t()} | {:error, any}
def set_cache({:ok, user}), do: set_cache(user) def set_cache({:ok, user}), do: set_cache(user)
def set_cache({:error, err}), do: {:error, err} def set_cache({:error, err}), do: {:error, err}
@ -1082,12 +1103,14 @@ def set_cache(%User{} = user) do
{:ok, user} {:ok, user}
end end
@spec update_and_set_cache(User.t(), map()) :: {:ok, User.t()} | {:error, any}
def update_and_set_cache(struct, params) do def update_and_set_cache(struct, params) do
struct struct
|> update_changeset(params) |> update_changeset(params)
|> update_and_set_cache() |> update_and_set_cache()
end end
@spec update_and_set_cache(Changeset.t()) :: {:ok, User.t()} | {:error, any}
def update_and_set_cache(%{data: %Pleroma.User{} = user} = changeset) do def update_and_set_cache(%{data: %Pleroma.User{} = user} = changeset) do
was_superuser_before_update = User.superuser?(user) was_superuser_before_update = User.superuser?(user)
@ -1142,6 +1165,7 @@ def get_cached_by_ap_id(ap_id) do
end end
end end
@spec get_cached_by_id(String.t()) :: nil | Pleroma.User.t()
def get_cached_by_id(id) do def get_cached_by_id(id) do
key = "id:#{id}" key = "id:#{id}"
@ -2302,6 +2326,7 @@ def add_alias(user, new_alias_user) do
end end
end end
@spec delete_alias(User.t(), User.t()) :: {:error, :no_such_alias}
def delete_alias(user, alias_user) do def delete_alias(user, alias_user) do
current_aliases = user.also_known_as || [] current_aliases = user.also_known_as || []
alias_ap_id = alias_user.ap_id alias_ap_id = alias_user.ap_id
@ -2417,7 +2442,7 @@ def confirmation_changeset(user, set_confirmation: confirmed?) do
cast(user, params, [:is_confirmed, :confirmation_token]) cast(user, params, [:is_confirmed, :confirmation_token])
end end
@spec approval_changeset(User.t(), keyword()) :: Changeset.t() @spec approval_changeset(Changeset.t(), keyword()) :: Changeset.t()
def approval_changeset(user, set_approval: approved?) do def approval_changeset(user, set_approval: approved?) do
cast(user, %{is_approved: approved?}, [:is_approved]) cast(user, %{is_approved: approved?}, [:is_approved])
end end
@ -2492,15 +2517,19 @@ defp add_to_block(%User{} = user, %User{} = blocked) do
with {:ok, relationship} <- UserRelationship.create_block(user, blocked) do with {:ok, relationship} <- UserRelationship.create_block(user, blocked) do
@cachex.del(:user_cache, "blocked_users_ap_ids:#{user.ap_id}") @cachex.del(:user_cache, "blocked_users_ap_ids:#{user.ap_id}")
{:ok, relationship} {:ok, relationship}
else
err -> err
end end
end end
@spec add_to_block(User.t(), User.t()) :: @spec remove_from_block(User.t(), User.t()) ::
{:ok, UserRelationship.t()} | {:ok, nil} | {:error, Ecto.Changeset.t()} {:ok, UserRelationship.t()} | {:ok, nil} | {:error, Ecto.Changeset.t()}
defp remove_from_block(%User{} = user, %User{} = blocked) do defp remove_from_block(%User{} = user, %User{} = blocked) do
with {:ok, relationship} <- UserRelationship.delete_block(user, blocked) do with {:ok, relationship} <- UserRelationship.delete_block(user, blocked) do
@cachex.del(:user_cache, "blocked_users_ap_ids:#{user.ap_id}") @cachex.del(:user_cache, "blocked_users_ap_ids:#{user.ap_id}")
{:ok, relationship} {:ok, relationship}
else
err -> err
end end
end end

View file

@ -130,7 +130,8 @@ def export(%__MODULE__{} = backup) do
:ok <- statuses(dir, backup.user), :ok <- statuses(dir, backup.user),
:ok <- likes(dir, backup.user), :ok <- likes(dir, backup.user),
:ok <- bookmarks(dir, backup.user), :ok <- bookmarks(dir, backup.user),
{:ok, zip_path} <- :zip.create(String.to_charlist(dir <> ".zip"), @files, cwd: dir), {:ok, zip_path} <-
:zip.create(String.to_charlist(dir <> ".zip"), @files, cwd: String.to_charlist(dir)),
{:ok, _} <- File.rm_rf(dir) do {:ok, _} <- File.rm_rf(dir) do
{:ok, to_string(zip_path)} {:ok, to_string(zip_path)}
end end

View file

@ -56,7 +56,10 @@ defp skip_plug(conn, plug_modules) do
plug_module.skip_plug(conn) plug_module.skip_plug(conn)
rescue rescue
UndefinedFunctionError -> UndefinedFunctionError ->
raise "`#{plug_module}` is not skippable. Append `use Pleroma.Web, :plug` to its code." reraise(
"`#{plug_module}` is not skippable. Append `use Pleroma.Web, :plug` to its code.",
__STACKTRACE__
)
end end
end end
) )

View file

@ -1531,6 +1531,10 @@ defp normalize_image(%{"url" => url}) do
defp normalize_image(urls) when is_list(urls), do: urls |> List.first() |> normalize_image() defp normalize_image(urls) when is_list(urls), do: urls |> List.first() |> normalize_image()
defp normalize_image(_), do: nil defp normalize_image(_), do: nil
defp normalize_also_known_as(aka) when is_list(aka), do: aka
defp normalize_also_known_as(aka) when is_binary(aka), do: [aka]
defp normalize_also_known_as(nil), do: []
defp object_to_user_data(data, additional) do defp object_to_user_data(data, additional) do
fields = fields =
data data
@ -1576,6 +1580,7 @@ defp object_to_user_data(data, additional) do
also_known_as = also_known_as =
data data
|> Map.get("alsoKnownAs", []) |> Map.get("alsoKnownAs", [])
|> normalize_also_known_as()
|> Enum.filter(fn url -> |> Enum.filter(fn url ->
case URI.parse(url) do case URI.parse(url) do
%URI{scheme: "http"} -> true %URI{scheme: "http"} -> true

View file

@ -3,6 +3,8 @@ defmodule Pleroma.Web.AkkomaAPI.TranslationController do
alias Pleroma.Web.Plugs.OAuthScopesPlug alias Pleroma.Web.Plugs.OAuthScopesPlug
require Logger
@cachex Pleroma.Config.get([:cachex, :provider], Cachex) @cachex Pleroma.Config.get([:cachex, :provider], Cachex)
@unauthenticated_access %{fallback: :proceed_unauthenticated, scopes: []} @unauthenticated_access %{fallback: :proceed_unauthenticated, scopes: []}
@ -26,8 +28,12 @@ def languages(conn, _params) do
conn conn
|> json(%{source: source_languages, target: dest_languages}) |> json(%{source: source_languages, target: dest_languages})
else else
{:enabled, false} -> json(conn, %{}) {:enabled, false} ->
e -> IO.inspect(e) json(conn, %{})
e ->
Logger.error("Translation language list error: #{inspect(e)}")
{:error, e}
end end
end end

View file

@ -231,11 +231,20 @@ defp emoji_packs_response do
"application/json", "application/json",
%Schema{ %Schema{
type: :object, type: :object,
additionalProperties: emoji_pack(), properties: %{
count: %Schema{type: :integer},
packs: %Schema{
type: :object,
additionalProperties: emoji_pack()
}
},
example: %{ example: %{
"count" => 4,
"packs" => %{
"emojos" => emoji_pack().example "emojos" => emoji_pack().example
} }
} }
}
) )
end end

View file

@ -60,6 +60,8 @@ def get_registration(%Plug.Conn{
def get_registration(%Plug.Conn{} = _conn), do: {:error, :missing_credentials} def get_registration(%Plug.Conn{} = _conn), do: {:error, :missing_credentials}
@doc "Creates Pleroma.User record basing on params and Pleroma.Registration record." @doc "Creates Pleroma.User record basing on params and Pleroma.Registration record."
@spec create_from_registration(Plug.Conn.t(), Registration.t()) ::
{:ok, User.t()} | {:error, any()}
def create_from_registration( def create_from_registration(
%Plug.Conn{params: %{"authorization" => registration_attrs}}, %Plug.Conn{params: %{"authorization" => registration_attrs}},
%Registration{} = registration %Registration{} = registration
@ -89,6 +91,8 @@ def create_from_registration(
{:ok, _} <- {:ok, _} <-
Registration.changeset(registration, %{user_id: new_user.id}) |> Repo.update() do Registration.changeset(registration, %{user_id: new_user.id}) |> Repo.update() do
{:ok, new_user} {:ok, new_user}
else
err -> err
end end
end end

View file

@ -87,16 +87,18 @@ def get_pagination_fields(conn, entries, extra_params \\ %{}) do
def assign_account_by_id(conn, _) do def assign_account_by_id(conn, _) do
case Pleroma.User.get_cached_by_id(conn.params.id) do case Pleroma.User.get_cached_by_id(conn.params.id) do
%Pleroma.User{} = account -> assign(conn, :account, account) %Pleroma.User{} = account ->
nil -> Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found}) |> halt() assign(conn, :account, account)
nil ->
Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found})
|> halt()
end end
end end
@spec try_render(Plug.Conn.t(), any, any) :: Plug.Conn.t()
def try_render(conn, target, params) when is_binary(target) do def try_render(conn, target, params) when is_binary(target) do
case render(conn, target, params) do render(conn, target, params)
nil -> render_error(conn, :not_implemented, "Can't display this activity")
res -> res
end
end end
def try_render(conn, _, _) do def try_render(conn, _, _) do

View file

@ -123,7 +123,7 @@ defmodule Pleroma.Web.Endpoint do
plug(Plug.Parsers, plug(Plug.Parsers,
parsers: [ parsers: [
:urlencoded, :urlencoded,
{:multipart, length: {Config, :get, [[:instance, :upload_limit]]}}, Pleroma.Web.Plugs.Parsers.Multipart,
:json :json
], ],
pass: ["*/*"], pass: ["*/*"],

View file

@ -1,26 +0,0 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Web.Fallback.LegacyPleromaApiRerouterPlug do
alias Pleroma.Web.Endpoint
alias Pleroma.Web.Fallback.RedirectController
def init(opts), do: opts
def call(%{path_info: ["api", "pleroma" | path_info_rest]} = conn, _opts) do
new_path_info = ["api", "v1", "pleroma" | path_info_rest]
new_request_path = Enum.join(new_path_info, "/")
conn
|> Map.merge(%{
path_info: new_path_info,
request_path: new_request_path
})
|> Endpoint.call(conn.params)
end
def call(conn, _opts) do
RedirectController.api_not_implemented(conn, %{})
end
end

View file

@ -30,6 +30,10 @@ def scrub_html_and_truncate(%{data: %{"content" => content}} = object) do
|> scrub_html_and_truncate_object_field(object) |> scrub_html_and_truncate_object_field(object)
end end
def scrub_html_and_truncate(%{data: _}) do
""
end
def scrub_html_and_truncate(content, max_length \\ 200) when is_binary(content) do def scrub_html_and_truncate(content, max_length \\ 200) when is_binary(content) do
content content
|> scrub_html |> scrub_html

View file

@ -558,10 +558,9 @@ def register(%Plug.Conn{} = conn, %{"authorization" => _, "op" => "register"} =
else else
{:error, changeset} -> {:error, changeset} ->
message = message =
Enum.map(changeset.errors, fn {field, {error, _}} -> Enum.map_join(changeset.errors, "; ", fn {field, {error, _}} ->
"#{field} #{error}" "#{field} #{error}"
end) end)
|> Enum.join("; ")
message = message =
String.replace( String.replace(

View file

@ -0,0 +1,21 @@
defmodule Pleroma.Web.Plugs.Parsers.Multipart do
@multipart Plug.Parsers.MULTIPART
alias Pleroma.Config
def init(opts) do
opts
end
def parse(conn, "multipart", subtype, headers, opts) do
length = Config.get([:instance, :upload_limit])
opts = @multipart.init([length: length] ++ opts)
@multipart.parse(conn, "multipart", subtype, headers, opts)
end
def parse(conn, _type, _subtype, _headers, _opts) do
{:next, conn}
end
end

View file

@ -8,7 +8,6 @@ defmodule Pleroma.Web.Plugs.RemoteIp do
""" """
alias Pleroma.Config alias Pleroma.Config
import Plug.Conn
@behaviour Plug @behaviour Plug
@ -16,15 +15,21 @@ def init(_), do: nil
def call(%{remote_ip: original_remote_ip} = conn, _) do def call(%{remote_ip: original_remote_ip} = conn, _) do
if Config.get([__MODULE__, :enabled]) do if Config.get([__MODULE__, :enabled]) do
%{remote_ip: new_remote_ip} = conn = RemoteIp.call(conn, remote_ip_opts()) {headers, proxies} = remote_ip_opts()
assign(conn, :remote_ip_found, original_remote_ip != new_remote_ip) new_remote_ip = RemoteIp.from(conn.req_headers, headers: headers, proxies: proxies)
if new_remote_ip != original_remote_ip do
Map.put(conn, :remote_ip, new_remote_ip)
else
conn
end
else else
conn conn
end end
end end
defp remote_ip_opts do defp remote_ip_opts do
headers = Config.get([__MODULE__, :headers], []) |> MapSet.new() headers = Config.get([__MODULE__, :headers], [])
reserved = Config.get([__MODULE__, :reserved], []) reserved = Config.get([__MODULE__, :reserved], [])
proxies = proxies =
@ -36,13 +41,10 @@ defp remote_ip_opts do
end end
defp maybe_add_cidr(proxy) when is_binary(proxy) do defp maybe_add_cidr(proxy) when is_binary(proxy) do
proxy =
cond do cond do
"/" in String.codepoints(proxy) -> proxy "/" in String.codepoints(proxy) -> proxy
InetCidr.v4?(InetCidr.parse_address!(proxy)) -> proxy <> "/32" InetCidr.v4?(InetCidr.parse_address!(proxy)) -> proxy <> "/32"
InetCidr.v6?(InetCidr.parse_address!(proxy)) -> proxy <> "/128" InetCidr.v6?(InetCidr.parse_address!(proxy)) -> proxy <> "/128"
end end
InetCidr.parse(proxy, true)
end end
end end

View file

@ -906,8 +906,6 @@ defmodule Pleroma.Web.Router do
scope "/", Pleroma.Web.Fallback do scope "/", Pleroma.Web.Fallback do
get("/registration/:token", RedirectController, :registration_page) get("/registration/:token", RedirectController, :registration_page)
get("/:maybe_nickname_or_id", RedirectController, :redirector_with_meta) get("/:maybe_nickname_or_id", RedirectController, :redirector_with_meta)
match(:*, "/api/pleroma*path", LegacyPleromaApiRerouterPlug, [])
get("/api*path", RedirectController, :api_not_implemented)
get("/*path", RedirectController, :redirector_with_preload) get("/*path", RedirectController, :redirector_with_preload)
options("/*path", RedirectController, :empty) options("/*path", RedirectController, :empty)

View file

@ -150,7 +150,10 @@ def remote_subscribe(conn, %{"status" => %{"status_id" => id, "profile" => profi
end end
end end
def remote_interaction(%{body_params: %{ap_id: ap_id, profile: profile}} = conn, _params) do def remote_interaction(
%Plug.Conn{body_params: %{ap_id: ap_id, profile: profile}} = conn,
_params
) do
with {:ok, %{"subscribe_address" => template}} <- WebFinger.finger(profile) do with {:ok, %{"subscribe_address" => template}} <- WebFinger.finger(profile) do
conn conn
|> json(%{url: String.replace(template, "{uri}", ap_id)}) |> json(%{url: String.replace(template, "{uri}", ap_id)})

View file

@ -100,6 +100,7 @@ defp domain do
Pleroma.Config.get([__MODULE__, :domain]) || Pleroma.Web.Endpoint.host() Pleroma.Config.get([__MODULE__, :domain]) || Pleroma.Web.Endpoint.host()
end end
@spec webfinger_from_xml(binary()) :: {:ok, map()} | nil
defp webfinger_from_xml(body) do defp webfinger_from_xml(body) do
with {:ok, doc} <- XML.parse_document(body) do with {:ok, doc} <- XML.parse_document(body) do
subject = XML.string_from_xpath("//Subject", doc) subject = XML.string_from_xpath("//Subject", doc)

View file

@ -36,7 +36,7 @@ def webfinger(%{assigns: %{format: format}} = conn, %{"resource" => resource})
else else
_e -> _e ->
conn conn
|> put_status(404) |> put_status(:not_found)
|> json("Couldn't find user") |> json("Couldn't find user")
end end
end end

49
mix.exs
View file

@ -7,7 +7,7 @@ def project do
version: version("3.5.0"), version: version("3.5.0"),
elixir: "~> 1.12", elixir: "~> 1.12",
elixirc_paths: elixirc_paths(Mix.env()), elixirc_paths: elixirc_paths(Mix.env()),
compilers: [:phoenix, :gettext] ++ Mix.compilers(), compilers: [:phoenix] ++ Mix.compilers(),
elixirc_options: [warnings_as_errors: warnings_as_errors()], elixirc_options: [warnings_as_errors: warnings_as_errors()],
xref: [exclude: [:eldap]], xref: [exclude: [:eldap]],
start_permanent: Mix.env() == :prod, start_permanent: Mix.env() == :prod,
@ -94,7 +94,8 @@ defp warnings_as_errors, do: System.get_env("CI") == "true"
# Specifies OAuth dependencies. # Specifies OAuth dependencies.
defp oauth_deps do defp oauth_deps do
oauth_strategy_packages = oauth_strategy_packages =
System.get_env("OAUTH_CONSUMER_STRATEGIES") "OAUTH_CONSUMER_STRATEGIES"
|> System.get_env()
|> to_string() |> to_string()
|> String.split() |> String.split()
|> Enum.map(fn strategy_entry -> |> Enum.map(fn strategy_entry ->
@ -113,32 +114,29 @@ defp oauth_deps do
# Type `mix help deps` for examples and options. # Type `mix help deps` for examples and options.
defp deps do defp deps do
[ [
{:phoenix, "~> 1.6.11"}, {:phoenix, "~> 1.6.15"},
{:tzdata, "~> 1.1.1"}, {:tzdata, "~> 1.1.1"},
{:plug_cowboy, "~> 2.5"}, {:plug_cowboy, "~> 2.6"},
{:phoenix_pubsub, "~> 2.1"}, {:phoenix_pubsub, "~> 2.1"},
{:phoenix_ecto, "~> 4.4"}, {:phoenix_ecto, "~> 4.4"},
{:inet_cidr, "~> 1.0.0"},
{:ecto_enum, "~> 1.4"}, {:ecto_enum, "~> 1.4"},
{:ecto_sql, "~> 3.9.0"}, {:ecto_sql, "~> 3.9.0"},
{:postgrex, ">= 0.16.3"}, {:postgrex, ">= 0.16.3"},
{:oban, "~> 2.12.1"}, {:oban, "~> 2.12.1"},
{:gettext, {:gettext, "~> 0.20.0"},
git: "https://github.com/tusooa/gettext.git",
ref: "72fb2496b6c5280ed911bdc3756890e7f38a4808",
override: true},
{:bcrypt_elixir, "~> 2.2"}, {:bcrypt_elixir, "~> 2.2"},
{:trailing_format_plug, "~> 0.0.7"},
{:fast_sanitize, "~> 0.2.3"}, {:fast_sanitize, "~> 0.2.3"},
{:html_entities, "~> 0.5", override: true}, {:html_entities, "~> 0.5"},
{:phoenix_html, "~> 3.1", override: true}, {:phoenix_html, "~> 3.2"},
{:calendar, "~> 1.0"}, {:calendar, "~> 1.0"},
{:cachex, "~> 3.4"}, {:cachex, "~> 3.4"},
{:poison, "~> 5.0", override: true}, {:tesla, "~> 1.4.4"},
{:tesla, "~> 1.4.4", override: true},
{:castore, "~> 0.1"}, {:castore, "~> 0.1"},
{:cowlib, "~> 2.9", override: true}, {:cowlib, "~> 2.9"},
{:finch, "~> 0.14.0"}, {:finch, "~> 0.14.0"},
{:jason, "~> 1.2"}, {:jason, "~> 1.2"},
{:trailing_format_plug, "~> 0.0.7"},
{:mogrify, "~> 0.9.1"}, {:mogrify, "~> 0.9.1"},
{:ex_aws, "~> 2.1.6"}, {:ex_aws, "~> 2.1.6"},
{:ex_aws_s3, "~> 2.0"}, {:ex_aws_s3, "~> 2.0"},
@ -172,39 +170,40 @@ defp deps do
{:plug_static_index_html, "~> 1.0.0"}, {:plug_static_index_html, "~> 1.0.0"},
{:flake_id, "~> 0.1.0"}, {:flake_id, "~> 0.1.0"},
{:concurrent_limiter, "~> 0.1.1"}, {:concurrent_limiter, "~> 0.1.1"},
{:remote_ip, {:remote_ip, "~> 1.1.0"},
git: "https://git.pleroma.social/pleroma/remote_ip.git",
ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"},
{:captcha, {:captcha,
git: "https://git.pleroma.social/pleroma/elixir-libraries/elixir-captcha.git", git: "https://git.pleroma.social/pleroma/elixir-libraries/elixir-captcha.git",
ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"}, ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"},
{:restarter, path: "./restarter"}, {:restarter, path: "./restarter"},
{:majic, "~> 1.0"}, {:majic, "~> 1.0"},
{:eblurhash, "~> 1.2.2"}, {:eblurhash, "~> 1.2.2"},
{:open_api_spex, "3.10.0"}, {:open_api_spex, "~> 3.16.0"},
{:search_parser, {:search_parser,
git: "https://github.com/FloatingGhost/pleroma-contrib-search-parser.git", git: "https://github.com/FloatingGhost/pleroma-contrib-search-parser.git",
ref: "08971a81e68686f9ac465cfb6661d51c5e4e1e7f"}, ref: "08971a81e68686f9ac465cfb6661d51c5e4e1e7f"},
{:nimble_parsec, "~> 1.0", override: true}, {:nimble_parsec, "~> 1.0", override: true},
{:phoenix_live_dashboard, "~> 0.6.2"}, {:phoenix_live_dashboard, "~> 0.7.2"},
{:ecto_psql_extras, "~> 0.6"}, {:ecto_psql_extras, "~> 0.6"},
{:elasticsearch, {:elasticsearch,
git: "https://akkoma.dev/AkkomaGang/elasticsearch-elixir.git", ref: "main"}, git: "https://akkoma.dev/AkkomaGang/elasticsearch-elixir.git", ref: "main"},
{:mfm_parser, {:mfm_parser,
git: "https://akkoma.dev/AkkomaGang/mfm-parser.git", git: "https://akkoma.dev/AkkomaGang/mfm-parser.git",
ref: "912fba81152d4d572e457fd5427f9875b2bc3dbe"}, ref: "912fba81152d4d572e457fd5427f9875b2bc3dbe"},
{:poison, ">= 0.0.0"},
# indirect dependency version override
{:plug, "~> 1.10.4", override: true},
## dev & test ## dev & test
{:ex_doc, "~> 0.22", only: :dev, runtime: false}, {:ex_doc, "~> 0.22", only: :dev, runtime: false},
{:ex_machina, "~> 2.4", only: :test}, {:ex_machina, "~> 2.4", only: :test},
{:credo, "~> 1.6", only: [:dev, :test], runtime: false}, {:credo,
git: "https://github.com/rrrene/credo.git",
ref: "1c1b99ea41a457761383d81aaf6a606913996fe7",
only: [:dev, :test],
runtime: false},
{:mock, "~> 0.3.5", only: :test}, {:mock, "~> 0.3.5", only: :test},
{:excoveralls, "0.15.1", only: :test}, {:excoveralls, "0.15.1", only: :test},
{:mox, "~> 1.0", only: :test}, {:mox, "~> 1.0", only: :test},
{:websockex, "~> 0.4.3", only: :test} {:websockex, "~> 0.4.3", only: :test},
{:dialyxir, "~> 1.0", only: [:dev], runtime: false}
] ++ oauth_deps() ] ++ oauth_deps()
end end
@ -336,7 +335,7 @@ defp add_copyright(_) do
# Pleroma: A lightweight social networking server # Pleroma: A lightweight social networking server
# Copyright © 2017-#{year} Pleroma Authors <https://pleroma.social/> # Copyright © 2017-#{year} Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
# Akkoma: The cooler pleroma # Akkoma: Magically expressive social media
# Copyright © 2022-#{year} Akkoma Authors <https://akkoma.dev/> # Copyright © 2022-#{year} Akkoma Authors <https://akkoma.dev/>
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only

View file

@ -17,13 +17,14 @@
"cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"}, "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"},
"cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"},
"credo": {:hex, :credo, "1.6.7", "323f5734350fd23a456f2688b9430e7d517afb313fbd38671b8a4449798a7854", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "41e110bfb007f7eda7f897c10bf019ceab9a0b269ce79f015d54b0dcf4fc7dd3"}, "credo": {:git, "https://github.com/rrrene/credo.git", "1c1b99ea41a457761383d81aaf6a606913996fe7", [ref: "1c1b99ea41a457761383d81aaf6a606913996fe7"]},
"crypt": {:git, "https://github.com/msantos/crypt.git", "f75cd55325e33cbea198fb41fe41871392f8fb76", [ref: "f75cd55325e33cbea198fb41fe41871392f8fb76"]}, "crypt": {:git, "https://github.com/msantos/crypt.git", "f75cd55325e33cbea198fb41fe41871392f8fb76", [ref: "f75cd55325e33cbea198fb41fe41871392f8fb76"]},
"custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"}, "custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm", "8df019facc5ec9603e94f7270f1ac73ddf339f56ade76a721eaa57c1493ba463"},
"db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"}, "db_connection": {:hex, :db_connection, "2.4.3", "3b9aac9f27347ec65b271847e6baeb4443d8474289bd18c1d6f4de655b70c94d", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c127c15b0fa6cfb32eed07465e05da6c815b032508d4ed7c116122871df73c12"},
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
"deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"},
"earmark": {:hex, :earmark, "1.4.33", "2b33a505180583f98bfa17317f03973b52081bdb24a11be05a7f4fa6d64dd8bf", [:mix], [{:earmark_parser, "~> 1.4.29", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "21b31363d6a0a70802cfbaf2de88355778aa76654298a072bce2e01d1858ae06"}, "dialyxir": {:hex, :dialyxir, "1.2.0", "58344b3e87c2e7095304c81a9ae65cb68b613e28340690dfe1a5597fd08dec37", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "61072136427a851674cab81762be4dbeae7679f85b1272b6d25c3a839aff8463"},
"earmark": {:hex, :earmark, "1.4.34", "d7f89d3bbd7567a0bffc465e0a949f8f8dcbe43909c3acf96f4761a302cea10c", [:mix], [{:earmark_parser, "~> 1.4.29", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "90b106f3dad85b133b10d7d628167c88246123fd1cecb4557d83d21ec9e65504"},
"earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"}, "earmark_parser": {:hex, :earmark_parser, "1.4.29", "149d50dcb3a93d9f3d6f3ecf18c918fb5a2d3c001b5d3305c926cddfbd33355b", [:mix], [], "hexpm", "4902af1b3eb139016aed210888748db8070b8125c2342ce3dcae4f38dcc63503"},
"eblurhash": {:hex, :eblurhash, "1.2.2", "7da4255aaea984b31bb71155f673257353b0e0554d0d30dcf859547e74602582", [:rebar3], [], "hexpm", "8c20ca00904de023a835a9dcb7b7762fed32264c85a80c3cafa85288e405044c"}, "eblurhash": {:hex, :eblurhash, "1.2.2", "7da4255aaea984b31bb71155f673257353b0e0554d0d30dcf859547e74602582", [:rebar3], [], "hexpm", "8c20ca00904de023a835a9dcb7b7762fed32264c85a80c3cafa85288e405044c"},
"ecto": {:hex, :ecto, "3.9.2", "017db3bc786ff64271108522c01a5d3f6ba0aea5c84912cfb0dd73bf13684108", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "21466d5177e09e55289ac7eade579a642578242c7a3a9f91ad5c6583337a9d15"}, "ecto": {:hex, :ecto, "3.9.2", "017db3bc786ff64271108522c01a5d3f6ba0aea5c84912cfb0dd73bf13684108", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "21466d5177e09e55289ac7eade579a642578242c7a3a9f91ad5c6583337a9d15"},
@ -32,6 +33,7 @@
"ecto_sql": {:hex, :ecto_sql, "3.9.1", "9bd5894eecc53d5b39d0c95180d4466aff00e10679e13a5cfa725f6f85c03c22", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5fd470a4fff2e829bbf9dcceb7f3f9f6d1e49b4241e802f614de6b8b67c51118"}, "ecto_sql": {:hex, :ecto_sql, "3.9.1", "9bd5894eecc53d5b39d0c95180d4466aff00e10679e13a5cfa725f6f85c03c22", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.9.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5fd470a4fff2e829bbf9dcceb7f3f9f6d1e49b4241e802f614de6b8b67c51118"},
"elasticsearch": {:git, "https://akkoma.dev/AkkomaGang/elasticsearch-elixir.git", "6cd946f75f6ab9042521a009d1d32d29a90113ca", [ref: "main"]}, "elasticsearch": {:git, "https://akkoma.dev/AkkomaGang/elasticsearch-elixir.git", "6cd946f75f6ab9042521a009d1d32d29a90113ca", [ref: "main"]},
"elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"}, "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"},
"ex_aws": {:hex, :ex_aws, "2.1.9", "dc4865ecc20a05190a34a0ac5213e3e5e2b0a75a0c2835e923ae7bfeac5e3c31", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "3e6c776703c9076001fbe1f7c049535f042cb2afa0d2cbd3b47cbc4e92ac0d10"}, "ex_aws": {:hex, :ex_aws, "2.1.9", "dc4865ecc20a05190a34a0ac5213e3e5e2b0a75a0c2835e923ae7bfeac5e3c31", [:mix], [{:configparser_ex, "~> 4.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:jsx, "~> 3.0", [hex: :jsx, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "3e6c776703c9076001fbe1f7c049535f042cb2afa0d2cbd3b47cbc4e92ac0d10"},
"ex_aws_s3": {:hex, :ex_aws_s3, "2.3.3", "61412e524616ea31d3f31675d8bc4c73f277e367dee0ae8245610446f9b778aa", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "0044f0b6f9ce925666021eafd630de64c2b3404d79c85245cc7c8a9a32d7f104"}, "ex_aws_s3": {:hex, :ex_aws_s3, "2.3.3", "61412e524616ea31d3f31675d8bc4c73f277e367dee0ae8245610446f9b778aa", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm", "0044f0b6f9ce925666021eafd630de64c2b3404d79c85245cc7c8a9a32d7f104"},
@ -47,7 +49,7 @@
"flake_id": {:hex, :flake_id, "0.1.0", "7716b086d2e405d09b647121a166498a0d93d1a623bead243e1f74216079ccb3", [:mix], [{:base62, "~> 1.2", [hex: :base62, repo: "hexpm", optional: false]}, {:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "31fc8090fde1acd267c07c36ea7365b8604055f897d3a53dd967658c691bd827"}, "flake_id": {:hex, :flake_id, "0.1.0", "7716b086d2e405d09b647121a166498a0d93d1a623bead243e1f74216079ccb3", [:mix], [{:base62, "~> 1.2", [hex: :base62, repo: "hexpm", optional: false]}, {:ecto, ">= 2.0.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm", "31fc8090fde1acd267c07c36ea7365b8604055f897d3a53dd967658c691bd827"},
"floki": {:hex, :floki, "0.34.0", "002d0cc194b48794d74711731db004fafeb328fe676976f160685262d43706a8", [:mix], [], "hexpm", "9c3a9f43f40dde00332a589bd9d389b90c1f518aef500364d00636acc5ebc99c"}, "floki": {:hex, :floki, "0.34.0", "002d0cc194b48794d74711731db004fafeb328fe676976f160685262d43706a8", [:mix], [], "hexpm", "9c3a9f43f40dde00332a589bd9d389b90c1f518aef500364d00636acc5ebc99c"},
"gen_smtp": {:hex, :gen_smtp, "0.15.0", "9f51960c17769b26833b50df0b96123605a8024738b62db747fece14eb2fbfcc", [:rebar3], [], "hexpm", "29bd14a88030980849c7ed2447b8db6d6c9278a28b11a44cafe41b791205440f"}, "gen_smtp": {:hex, :gen_smtp, "0.15.0", "9f51960c17769b26833b50df0b96123605a8024738b62db747fece14eb2fbfcc", [:rebar3], [], "hexpm", "29bd14a88030980849c7ed2447b8db6d6c9278a28b11a44cafe41b791205440f"},
"gettext": {:git, "https://github.com/tusooa/gettext.git", "72fb2496b6c5280ed911bdc3756890e7f38a4808", [ref: "72fb2496b6c5280ed911bdc3756890e7f38a4808"]}, "gettext": {:hex, :gettext, "0.20.0", "75ad71de05f2ef56991dbae224d35c68b098dd0e26918def5bb45591d5c8d429", [:mix], [], "hexpm", "1c03b177435e93a47441d7f681a7040bd2a816ece9e2666d1c9001035121eb3d"},
"hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~> 2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"}, "hackney": {:hex, :hackney, "1.18.1", "f48bf88f521f2a229fc7bae88cf4f85adc9cd9bcf23b5dc8eb6a1788c662c4f6", [:rebar3], [{:certifi, "~> 2.9.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a4ecdaff44297e9b5894ae499e9a070ea1888c84afdd1fd9b7b2bc384950128e"},
"hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"},
"html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"},
@ -78,18 +80,18 @@
"nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"}, "nimble_parsec": {:hex, :nimble_parsec, "1.2.3", "244836e6e3f1200c7f30cb56733fd808744eca61fd182f731eac4af635cc6d0b", [:mix], [], "hexpm", "c8d789e39b9131acf7b99291e93dae60ab48ef14a7ee9d58c6964f59efb570b0"},
"nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"}, "nimble_pool": {:hex, :nimble_pool, "0.2.6", "91f2f4c357da4c4a0a548286c84a3a28004f68f05609b4534526871a22053cde", [:mix], [], "hexpm", "1c715055095d3f2705c4e236c18b618420a35490da94149ff8b580a2144f653f"},
"oban": {:hex, :oban, "2.12.1", "f604d7e6a8be9fda4a9b0f6cebbd633deba569f85dbff70c4d25d99a6f023177", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b1844c2b74e0d788b73e5144b0c9d5674cb775eae29d88a36f3c3b48d42d058"}, "oban": {:hex, :oban, "2.12.1", "f604d7e6a8be9fda4a9b0f6cebbd633deba569f85dbff70c4d25d99a6f023177", [:mix], [{:ecto_sql, "~> 3.6", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.16", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b1844c2b74e0d788b73e5144b0c9d5674cb775eae29d88a36f3c3b48d42d058"},
"open_api_spex": {:hex, :open_api_spex, "3.10.0", "94e9521ad525b3fcf6dc77da7c45f87fdac24756d4de588cb0816b413e7c1844", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.1", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "2dbb2bde3d2b821f06936e8dfaf3284331186556291946d84eeba3750ac28765"}, "open_api_spex": {:hex, :open_api_spex, "3.16.0", "9843af4e87550cd8ac5821b10e4c74f1d51f0d4e3310f824d780614743423b25", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}, {:ymlr, "~> 2.0 or ~> 3.0", [hex: :ymlr, repo: "hexpm", optional: true]}], "hexpm", "bb0be24a648b73e8fc8cbda17f514b8486262275e8b33e8b5ae66283df972129"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
"phoenix": {:hex, :phoenix, "1.6.15", "0a1d96bbc10747fd83525370d691953cdb6f3ccbac61aa01b4acb012474b047d", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d70ab9fbf6b394755ea88b644d34d79d8b146e490973151f248cacd122d20672"}, "phoenix": {:hex, :phoenix, "1.6.15", "0a1d96bbc10747fd83525370d691953cdb6f3ccbac61aa01b4acb012474b047d", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 1.0 or ~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d70ab9fbf6b394755ea88b644d34d79d8b146e490973151f248cacd122d20672"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.4.0", "0672ed4e4808b3fbed494dded89958e22fb882de47a97634c0b13e7b0b5f7720", [:mix], [{:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "09864e558ed31ee00bd48fcc1d4fc58ae9678c9e81649075431e69dbabb43cc1"},
"phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"}, "phoenix_html": {:hex, :phoenix_html, "3.2.0", "1c1219d4b6cb22ac72f12f73dc5fad6c7563104d083f711c3fcd8551a1f4ae11", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "36ec97ba56d25c0136ef1992c37957e4246b649d620958a1f9fa86165f8bc54f"},
"phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.6.5", "1495bb014be12c9a9252eca04b9af54246f6b5c1e4cd1f30210cd00ec540cf8e", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.3", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.17.7", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "ef4fa50dd78364409039c99cf6f98ab5209b4c5f8796c17f4db118324f0db852"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.7.2", "97cc4ff2dba1ebe504db72cb45098cb8e91f11160528b980bd282cc45c73b29c", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.18.3", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "0e5fdf063c7a3b620c566a30fcf68b7ee02e5e46fe48ee46a6ec3ba382dc05b7"},
"phoenix_live_view": {:hex, :phoenix_live_view, "0.17.12", "74f4c0ad02d7deac2d04f50b52827a5efdc5c6e7fac5cede145f5f0e4183aedc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.0 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "af6dd5e0aac16ff43571f527a8e0616d62cb80b10eb87aac82170243e50d99c8"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.18.3", "2e3d009422addf8b15c3dccc65ce53baccbe26f7cfd21d264680b5867789a9c1", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.1", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c8845177a866e017dcb7083365393c8f00ab061b8b6b2bda575891079dce81b2"},
"phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.1", "ba04e489ef03763bf28a17eb2eaddc2c20c6d217e2150a61e3298b0f4c2012b5", [:mix], [], "hexpm", "81367c6d1eea5878ad726be80808eb5a787a23dee699f96e72b1109c57cdd8d9"},
"phoenix_swoosh": {:hex, :phoenix_swoosh, "0.3.4", "615f8f393135de7e0cbb4bd00ba238b1e0cd324b0d90efbaee613c2f02ca5e5c", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.0", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "3971221846232021ab5e3c7489fd62ec5bfd6a2e01cae10a317ccf6fb350571c"}, "phoenix_swoosh": {:hex, :phoenix_swoosh, "0.3.4", "615f8f393135de7e0cbb4bd00ba238b1e0cd324b0d90efbaee613c2f02ca5e5c", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:swoosh, "~> 1.0", [hex: :swoosh, repo: "hexpm", optional: false]}], "hexpm", "3971221846232021ab5e3c7489fd62ec5bfd6a2e01cae10a317ccf6fb350571c"},
"phoenix_template": {:hex, :phoenix_template, "1.0.0", "c57bc5044f25f007dc86ab21895688c098a9f846a8dda6bc40e2d0ddc146e38f", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "1b066f99a26fd22064c12b2600a9a6e56700f591bf7b20b418054ea38b4d4357"}, "phoenix_template": {:hex, :phoenix_template, "1.0.0", "c57bc5044f25f007dc86ab21895688c098a9f846a8dda6bc40e2d0ddc146e38f", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "1b066f99a26fd22064c12b2600a9a6e56700f591bf7b20b418054ea38b4d4357"},
"phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"}, "phoenix_view": {:hex, :phoenix_view, "2.0.2", "6bd4d2fd595ef80d33b439ede6a19326b78f0f1d8d62b9a318e3d9c1af351098", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}], "hexpm", "a929e7230ea5c7ee0e149ffcf44ce7cf7f4b6d2bfe1752dd7c084cdff152d36f"},
"plug": {:hex, :plug, "1.10.4", "41eba7d1a2d671faaf531fa867645bd5a3dce0957d8e2a3f398ccff7d2ef017f", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad1e233fe73d2eec56616568d260777b67f53148a999dc2d048f4eb9778fe4a0"}, "plug": {:hex, :plug, "1.14.0", "ba4f558468f69cbd9f6b356d25443d0b796fbdc887e03fa89001384a9cac638f", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "bf020432c7d4feb7b3af16a0c2701455cbbbb95e5b6866132cb09eb0c29adc14"},
"plug_cowboy": {:hex, :plug_cowboy, "2.6.0", "d1cf12ff96a1ca4f52207c5271a6c351a4733f413803488d75b70ccf44aebec2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "073cf20b753ce6682ed72905cd62a2d4bd9bad1bf9f7feb02a1b8e525bd94fa6"}, "plug_cowboy": {:hex, :plug_cowboy, "2.6.0", "d1cf12ff96a1ca4f52207c5271a6c351a4733f413803488d75b70ccf44aebec2", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "073cf20b753ce6682ed72905cd62a2d4bd9bad1bf9f7feb02a1b8e525bd94fa6"},
"plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"}, "plug_crypto": {:hex, :plug_crypto, "1.2.3", "8f77d13aeb32bfd9e654cb68f0af517b371fb34c56c9f2b58fe3df1235c1251a", [:mix], [], "hexpm", "b5672099c6ad5c202c45f5a403f21a3411247f164e4a8fab056e5cd8a290f4a2"},
"plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"}, "plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "79fd4fcf34d110605c26560cbae8f23c603ec4158c08298bd4360fdea90bb5cf"},
@ -97,16 +99,15 @@
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"},
"postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"}, "postgrex": {:hex, :postgrex, "0.16.5", "fcc4035cc90e23933c5d69a9cd686e329469446ef7abba2cf70f08e2c4b69810", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "edead639dc6e882618c01d8fc891214c481ab9a3788dfe38dd5e37fd1d5fb2e8"},
"pot": {:hex, :pot, "1.0.2", "13abb849139fdc04ab8154986abbcb63bdee5de6ed2ba7e1713527e33df923dd", [:rebar3], [], "hexpm", "78fe127f5a4f5f919d6ea5a2a671827bd53eb9d37e5b4128c0ad3df99856c2e0"}, "pot": {:hex, :pot, "1.0.2", "13abb849139fdc04ab8154986abbcb63bdee5de6ed2ba7e1713527e33df923dd", [:rebar3], [], "hexpm", "78fe127f5a4f5f919d6ea5a2a671827bd53eb9d37e5b4128c0ad3df99856c2e0"},
"quack": {:hex, :quack, "0.1.1", "cca7b4da1a233757fdb44b3334fce80c94785b3ad5a602053b7a002b5a8967bf", [:mix], [{:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2.0", [hex: :tesla, repo: "hexpm", optional: false]}], "hexpm", "d736bfa7444112eb840027bb887832a0e403a4a3437f48028c3b29a2dbbd2543"},
"ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"},
"recon": {:hex, :recon, "2.5.2", "cba53fa8db83ad968c9a652e09c3ed7ddcc4da434f27c3eaa9ca47ffb2b1ff03", [:mix, :rebar3], [], "hexpm", "2c7523c8dee91dff41f6b3d63cba2bd49eb6d2fe5bf1eec0df7f87eb5e230e1c"}, "recon": {:hex, :recon, "2.5.2", "cba53fa8db83ad968c9a652e09c3ed7ddcc4da434f27c3eaa9ca47ffb2b1ff03", [:mix, :rebar3], [], "hexpm", "2c7523c8dee91dff41f6b3d63cba2bd49eb6d2fe5bf1eec0df7f87eb5e230e1c"},
"remote_ip": {:git, "https://git.pleroma.social/pleroma/remote_ip.git", "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8", [ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"]}, "remote_ip": {:hex, :remote_ip, "1.1.0", "cb308841595d15df3f9073b7c39243a1dd6ca56e5020295cb012c76fbec50f2d", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "616ffdf66aaad6a72fc546dabf42eed87e2a99e97b09cbd92b10cc180d02ed74"},
"search_parser": {:git, "https://github.com/FloatingGhost/pleroma-contrib-search-parser.git", "08971a81e68686f9ac465cfb6661d51c5e4e1e7f", [ref: "08971a81e68686f9ac465cfb6661d51c5e4e1e7f"]}, "search_parser": {:git, "https://github.com/FloatingGhost/pleroma-contrib-search-parser.git", "08971a81e68686f9ac465cfb6661d51c5e4e1e7f", [ref: "08971a81e68686f9ac465cfb6661d51c5e4e1e7f"]},
"sleeplocks": {:hex, :sleeplocks, "1.1.2", "d45aa1c5513da48c888715e3381211c859af34bee9b8290490e10c90bb6ff0ca", [:rebar3], [], "hexpm", "9fe5d048c5b781d6305c1a3a0f40bb3dfc06f49bf40571f3d2d0c57eaa7f59a5"}, "sleeplocks": {:hex, :sleeplocks, "1.1.2", "d45aa1c5513da48c888715e3381211c859af34bee9b8290490e10c90bb6ff0ca", [:rebar3], [], "hexpm", "9fe5d048c5b781d6305c1a3a0f40bb3dfc06f49bf40571f3d2d0c57eaa7f59a5"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
"statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"}, "statistex": {:hex, :statistex, "1.0.0", "f3dc93f3c0c6c92e5f291704cf62b99b553253d7969e9a5fa713e5481cd858a5", [:mix], [], "hexpm", "ff9d8bee7035028ab4742ff52fc80a2aa35cece833cf5319009b52f1b5a86c27"},
"sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"}, "sweet_xml": {:hex, :sweet_xml, "0.7.3", "debb256781c75ff6a8c5cbf7981146312b66f044a2898f453709a53e5031b45b", [:mix], [], "hexpm", "e110c867a1b3fe74bfc7dd9893aa851f0eed5518d0d7cad76d7baafd30e4f5ba"},
"swoosh": {:hex, :swoosh, "1.8.2", "af9a22ab2c0d20b266f61acca737fa11a121902de9466a39e91bacdce012101c", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d058ba750eafadb6c09a84a352c14c5d1eeeda6e84945fcc95785b7f3067b7db"}, "swoosh": {:hex, :swoosh, "1.8.3", "733357d9a65da19c162171f08d1e42a6259236cf44d02a64711b776afbbbaa78", [:mix], [{:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c699abbac7a296c205055a7501c5d5261320ea1f08bde2392699a9e899815bc7"},
"syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"}, "syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"},
"table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"}, "table_rex": {:hex, :table_rex, "3.1.1", "0c67164d1714b5e806d5067c1e96ff098ba7ae79413cc075973e17c38a587caa", [:mix], [], "hexpm", "678a23aba4d670419c23c17790f9dcd635a4a89022040df7d5d772cb21012490"},
"telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"}, "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"},

View file

@ -163,4 +163,8 @@ defp error(issue_meta, module, expected_file) do
line_no: 1 line_no: 1
) )
end end
defp append_issues_and_timings(_issues, exec) do
exec
end
end end

View file

@ -116,7 +116,7 @@ test "it deduces the actor id for gotoSocial" do
test "it calls webfinger for 'acct:' accounts" do test "it calls webfinger for 'acct:' accounts" do
with_mock(Pleroma.Web.WebFinger, with_mock(Pleroma.Web.WebFinger,
finger: fn _ -> %{"ap_id" => "https://gensokyo.2hu/users/raymoo"} end finger: fn _ -> {:ok, %{"ap_id" => "https://gensokyo.2hu/users/raymoo"}} end
) do ) do
assert Signature.key_id_to_actor_id("acct:raymoo@gensokyo.2hu") == assert Signature.key_id_to_actor_id("acct:raymoo@gensokyo.2hu") ==
{:ok, "https://gensokyo.2hu/users/raymoo"} {:ok, "https://gensokyo.2hu/users/raymoo"}

View file

@ -41,15 +41,16 @@ test "with valid `admin_token` query parameter, skips OAuth scopes check" do
user = insert(:user) user = insert(:user)
conn = get(build_conn(), "/api/pleroma/admin/users/#{user.nickname}?admin_token=password123") conn =
get(build_conn(), "/api/v1/pleroma/admin/users/#{user.nickname}?admin_token=password123")
assert json_response(conn, 200) assert json_response(conn, 200)
end end
test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope", test "GET /api/v1/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope",
%{admin: admin} do %{admin: admin} do
user = insert(:user) user = insert(:user)
url = "/api/pleroma/admin/users/#{user.nickname}" url = "/api/v1/pleroma/admin/users/#{user.nickname}"
good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"])
good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"])
@ -90,7 +91,7 @@ test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or bro
end end
end end
describe "PUT /api/pleroma/admin/users/tag" do describe "PUT /api/v1/pleroma/admin/users/tag" do
setup %{conn: conn} do setup %{conn: conn} do
user1 = insert(:user, %{tags: ["x"]}) user1 = insert(:user, %{tags: ["x"]})
user2 = insert(:user, %{tags: ["y"]}) user2 = insert(:user, %{tags: ["y"]})
@ -100,7 +101,7 @@ test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or bro
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put( |> put(
"/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <> "/api/v1/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <>
"#{user2.nickname}&tags[]=foo&tags[]=bar" "#{user2.nickname}&tags[]=foo&tags[]=bar"
) )
@ -136,7 +137,7 @@ test "it does not modify tags of not specified users", %{conn: conn, user3: user
end end
end end
describe "DELETE /api/pleroma/admin/users/tag" do describe "DELETE /api/v1/pleroma/admin/users/tag" do
setup %{conn: conn} do setup %{conn: conn} do
user1 = insert(:user, %{tags: ["x"]}) user1 = insert(:user, %{tags: ["x"]})
user2 = insert(:user, %{tags: ["y", "z"]}) user2 = insert(:user, %{tags: ["y", "z"]})
@ -146,7 +147,7 @@ test "it does not modify tags of not specified users", %{conn: conn, user3: user
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> delete( |> delete(
"/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <> "/api/v1/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <>
"#{user2.nickname}&tags[]=x&tags[]=z" "#{user2.nickname}&tags[]=x&tags[]=z"
) )
@ -182,12 +183,12 @@ test "it does not modify tags of not specified users", %{conn: conn, user3: user
end end
end end
describe "/api/pleroma/admin/users/:nickname/permission_group" do describe "/api/v1/pleroma/admin/users/:nickname/permission_group" do
test "GET is giving user_info", %{admin: admin, conn: conn} do test "GET is giving user_info", %{admin: admin, conn: conn} do
conn = conn =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> get("/api/pleroma/admin/users/#{admin.nickname}/permission_group/") |> get("/api/v1/pleroma/admin/users/#{admin.nickname}/permission_group/")
assert json_response(conn, 200) == %{ assert json_response(conn, 200) == %{
"is_admin" => true, "is_admin" => true,
@ -201,7 +202,7 @@ test "/:right POST, can add to a permission group", %{admin: admin, conn: conn}
conn = conn =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> post("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") |> post("/api/v1/pleroma/admin/users/#{user.nickname}/permission_group/admin")
assert json_response(conn, 200) == %{ assert json_response(conn, 200) == %{
"is_admin" => true "is_admin" => true
@ -220,7 +221,7 @@ test "/:right POST, can add to a permission group (multiple)", %{admin: admin, c
conn = conn =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> post("/api/pleroma/admin/users/permission_group/admin", %{ |> post("/api/v1/pleroma/admin/users/permission_group/admin", %{
nicknames: [user_one.nickname, user_two.nickname] nicknames: [user_one.nickname, user_two.nickname]
}) })
@ -238,7 +239,7 @@ test "/:right DELETE, can remove from a permission group", %{admin: admin, conn:
conn = conn =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") |> delete("/api/v1/pleroma/admin/users/#{user.nickname}/permission_group/admin")
assert json_response(conn, 200) == %{"is_admin" => false} assert json_response(conn, 200) == %{"is_admin" => false}
@ -258,7 +259,7 @@ test "/:right DELETE, can remove from a permission group (multiple)", %{
conn = conn =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> delete("/api/pleroma/admin/users/permission_group/admin", %{ |> delete("/api/v1/pleroma/admin/users/permission_group/admin", %{
nicknames: [user_one.nickname, user_two.nickname] nicknames: [user_one.nickname, user_two.nickname]
}) })
@ -271,13 +272,13 @@ test "/:right DELETE, can remove from a permission group (multiple)", %{
end end
end end
test "/api/pleroma/admin/users/:nickname/password_reset", %{conn: conn} do test "/api/v1/pleroma/admin/users/:nickname/password_reset", %{conn: conn} do
user = insert(:user) user = insert(:user)
conn = conn =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> get("/api/pleroma/admin/users/#{user.nickname}/password_reset") |> get("/api/v1/pleroma/admin/users/#{user.nickname}/password_reset")
resp = json_response(conn, 200) resp = json_response(conn, 200)
@ -296,7 +297,7 @@ test "returns 200 and disable 2fa", %{conn: conn} do
response = response =
conn conn
|> put("/api/pleroma/admin/users/disable_mfa", %{nickname: user.nickname}) |> put("/api/v1/pleroma/admin/users/disable_mfa", %{nickname: user.nickname})
|> json_response(200) |> json_response(200)
assert response == user.nickname assert response == user.nickname
@ -309,19 +310,19 @@ test "returns 200 and disable 2fa", %{conn: conn} do
test "returns 404 if user not found", %{conn: conn} do test "returns 404 if user not found", %{conn: conn} do
response = response =
conn conn
|> put("/api/pleroma/admin/users/disable_mfa", %{nickname: "nickname"}) |> put("/api/v1/pleroma/admin/users/disable_mfa", %{nickname: "nickname"})
|> json_response(404) |> json_response(404)
assert response == %{"error" => "Not found"} assert response == %{"error" => "Not found"}
end end
end end
describe "GET /api/pleroma/admin/restart" do describe "GET /api/v1/pleroma/admin/restart" do
setup do: clear_config(:configurable_from_database, true) setup do: clear_config(:configurable_from_database, true)
test "pleroma restarts", %{conn: conn} do test "pleroma restarts", %{conn: conn} do
capture_log(fn -> capture_log(fn ->
assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} assert conn |> get("/api/v1/pleroma/admin/restart") |> json_response(200) == %{}
end) =~ "pleroma restarted" end) =~ "pleroma restarted"
refute Restarter.Pleroma.need_reboot?() refute Restarter.Pleroma.need_reboot?()
@ -330,19 +331,19 @@ test "pleroma restarts", %{conn: conn} do
test "need_reboot flag", %{conn: conn} do test "need_reboot flag", %{conn: conn} do
assert conn assert conn
|> get("/api/pleroma/admin/need_reboot") |> get("/api/v1/pleroma/admin/need_reboot")
|> json_response(200) == %{"need_reboot" => false} |> json_response(200) == %{"need_reboot" => false}
Restarter.Pleroma.need_reboot() Restarter.Pleroma.need_reboot()
assert conn assert conn
|> get("/api/pleroma/admin/need_reboot") |> get("/api/v1/pleroma/admin/need_reboot")
|> json_response(200) == %{"need_reboot" => true} |> json_response(200) == %{"need_reboot" => true}
on_exit(fn -> Restarter.Pleroma.refresh() end) on_exit(fn -> Restarter.Pleroma.refresh() end)
end end
describe "GET /api/pleroma/admin/users/:nickname/statuses" do describe "GET /api/v1/pleroma/admin/users/:nickname/statuses" do
setup do setup do
user = insert(:user) user = insert(:user)
@ -354,7 +355,7 @@ test "need_reboot flag", %{conn: conn} do
end end
test "renders user's statuses", %{conn: conn, user: user} do test "renders user's statuses", %{conn: conn, user: user} do
conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") conn = get(conn, "/api/v1/pleroma/admin/users/#{user.nickname}/statuses")
assert %{"total" => 3, "activities" => activities} = json_response(conn, 200) assert %{"total" => 3, "activities" => activities} = json_response(conn, 200)
assert length(activities) == 3 assert length(activities) == 3
@ -363,12 +364,12 @@ test "renders user's statuses", %{conn: conn, user: user} do
test "renders user's statuses with pagination", %{conn: conn, user: user} do test "renders user's statuses with pagination", %{conn: conn, user: user} do
%{"total" => 3, "activities" => [activity1]} = %{"total" => 3, "activities" => [activity1]} =
conn conn
|> get("/api/pleroma/admin/users/#{user.nickname}/statuses?page_size=1&page=1") |> get("/api/v1/pleroma/admin/users/#{user.nickname}/statuses?page_size=1&page=1")
|> json_response(200) |> json_response(200)
%{"total" => 3, "activities" => [activity2]} = %{"total" => 3, "activities" => [activity2]} =
conn conn
|> get("/api/pleroma/admin/users/#{user.nickname}/statuses?page_size=1&page=2") |> get("/api/v1/pleroma/admin/users/#{user.nickname}/statuses?page_size=1&page=2")
|> json_response(200) |> json_response(200)
refute activity1 == activity2 refute activity1 == activity2
@ -381,7 +382,7 @@ test "doesn't return private statuses by default", %{conn: conn, user: user} do
%{"total" => 4, "activities" => activities} = %{"total" => 4, "activities" => activities} =
conn conn
|> get("/api/pleroma/admin/users/#{user.nickname}/statuses") |> get("/api/v1/pleroma/admin/users/#{user.nickname}/statuses")
|> json_response(200) |> json_response(200)
assert length(activities) == 4 assert length(activities) == 4
@ -394,7 +395,7 @@ test "returns private statuses with godmode on", %{conn: conn, user: user} do
%{"total" => 5, "activities" => activities} = %{"total" => 5, "activities" => activities} =
conn conn
|> get("/api/pleroma/admin/users/#{user.nickname}/statuses?godmode=true") |> get("/api/v1/pleroma/admin/users/#{user.nickname}/statuses?godmode=true")
|> json_response(200) |> json_response(200)
assert length(activities) == 5 assert length(activities) == 5
@ -407,19 +408,19 @@ test "excludes reblogs by default", %{conn: conn, user: user} do
assert %{"total" => 0, "activities" => []} == assert %{"total" => 0, "activities" => []} ==
conn conn
|> get("/api/pleroma/admin/users/#{other_user.nickname}/statuses") |> get("/api/v1/pleroma/admin/users/#{other_user.nickname}/statuses")
|> json_response(200) |> json_response(200)
assert %{"total" => 1, "activities" => [_]} = assert %{"total" => 1, "activities" => [_]} =
conn conn
|> get( |> get(
"/api/pleroma/admin/users/#{other_user.nickname}/statuses?with_reblogs=true" "/api/v1/pleroma/admin/users/#{other_user.nickname}/statuses?with_reblogs=true"
) )
|> json_response(200) |> json_response(200)
end end
end end
describe "GET /api/pleroma/admin/moderation_log" do describe "GET /api/v1/pleroma/admin/moderation_log" do
setup do setup do
moderator = insert(:user, is_moderator: true) moderator = insert(:user, is_moderator: true)
@ -453,7 +454,7 @@ test "returns the log", %{conn: conn, admin: admin} do
inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second) inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second)
}) })
conn = get(conn, "/api/pleroma/admin/moderation_log") conn = get(conn, "/api/v1/pleroma/admin/moderation_log")
response = json_response(conn, 200) response = json_response(conn, 200)
[first_entry, second_entry] = response["items"] [first_entry, second_entry] = response["items"]
@ -497,7 +498,7 @@ test "returns the log with pagination", %{conn: conn, admin: admin} do
inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second) inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second)
}) })
conn1 = get(conn, "/api/pleroma/admin/moderation_log?page_size=1&page=1") conn1 = get(conn, "/api/v1/pleroma/admin/moderation_log?page_size=1&page=1")
response1 = json_response(conn1, 200) response1 = json_response(conn1, 200)
[first_entry] = response1["items"] [first_entry] = response1["items"]
@ -509,7 +510,7 @@ test "returns the log with pagination", %{conn: conn, admin: admin} do
assert first_entry["message"] == assert first_entry["message"] ==
"@#{admin.nickname} unfollowed relay: https://example.org/relay" "@#{admin.nickname} unfollowed relay: https://example.org/relay"
conn2 = get(conn, "/api/pleroma/admin/moderation_log?page_size=1&page=2") conn2 = get(conn, "/api/v1/pleroma/admin/moderation_log?page_size=1&page=2")
response2 = json_response(conn2, 200) response2 = json_response(conn2, 200)
[second_entry] = response2["items"] [second_entry] = response2["items"]
@ -555,7 +556,7 @@ test "filters log by date", %{conn: conn, admin: admin} do
conn1 = conn1 =
get( get(
conn, conn,
"/api/pleroma/admin/moderation_log?start_date=#{second_date}" "/api/v1/pleroma/admin/moderation_log?start_date=#{second_date}"
) )
response1 = json_response(conn1, 200) response1 = json_response(conn1, 200)
@ -593,7 +594,7 @@ test "returns log filtered by user", %{conn: conn, admin: admin, moderator: mode
} }
}) })
conn1 = get(conn, "/api/pleroma/admin/moderation_log?user_id=#{moderator.id}") conn1 = get(conn, "/api/v1/pleroma/admin/moderation_log?user_id=#{moderator.id}")
response1 = json_response(conn1, 200) response1 = json_response(conn1, 200)
[first_entry] = response1["items"] [first_entry] = response1["items"]
@ -615,7 +616,7 @@ test "returns log filtered by search", %{conn: conn, moderator: moderator} do
target: "https://example.org/relay" target: "https://example.org/relay"
}) })
conn1 = get(conn, "/api/pleroma/admin/moderation_log?search=unfo") conn1 = get(conn, "/api/v1/pleroma/admin/moderation_log?search=unfo")
response1 = json_response(conn1, 200) response1 = json_response(conn1, 200)
[first_entry] = response1["items"] [first_entry] = response1["items"]
@ -631,7 +632,7 @@ test "gets a remote users when [:instance, :limit_to_local_content] is set to :u
%{conn: conn} do %{conn: conn} do
clear_config(Pleroma.Config.get([:instance, :limit_to_local_content]), :unauthenticated) clear_config(Pleroma.Config.get([:instance, :limit_to_local_content]), :unauthenticated)
user = insert(:user, %{local: false, nickname: "u@peer1.com"}) user = insert(:user, %{local: false, nickname: "u@peer1.com"})
conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials") conn = get(conn, "/api/v1/pleroma/admin/users/#{user.nickname}/credentials")
assert json_response(conn, 200) assert json_response(conn, 200)
end end
@ -639,7 +640,7 @@ test "gets a remote users when [:instance, :limit_to_local_content] is set to :u
describe "GET /users/:nickname/credentials" do describe "GET /users/:nickname/credentials" do
test "gets the user credentials", %{conn: conn} do test "gets the user credentials", %{conn: conn} do
user = insert(:user) user = insert(:user)
conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials") conn = get(conn, "/api/v1/pleroma/admin/users/#{user.nickname}/credentials")
response = assert json_response(conn, 200) response = assert json_response(conn, 200)
assert response["email"] == user.email assert response["email"] == user.email
@ -651,7 +652,7 @@ test "returns 403 if requested by a non-admin" do
conn = conn =
build_conn() build_conn()
|> assign(:user, user) |> assign(:user, user)
|> get("/api/pleroma/admin/users/#{user.nickname}/credentials") |> get("/api/v1/pleroma/admin/users/#{user.nickname}/credentials")
assert json_response(conn, :forbidden) assert json_response(conn, :forbidden)
end end
@ -667,7 +668,7 @@ test "changes password and email", %{conn: conn, admin: admin, user: user} do
assert user.password_reset_pending == false assert user.password_reset_pending == false
conn = conn =
patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ patch(conn, "/api/v1/pleroma/admin/users/#{user.nickname}/credentials", %{
"password" => "new_password", "password" => "new_password",
"email" => "new_email@example.com", "email" => "new_email@example.com",
"name" => "new_name" "name" => "new_name"
@ -697,7 +698,7 @@ test "returns 403 if requested by a non-admin", %{user: user} do
conn = conn =
build_conn() build_conn()
|> assign(:user, user) |> assign(:user, user)
|> patch("/api/pleroma/admin/users/#{user.nickname}/credentials", %{ |> patch("/api/v1/pleroma/admin/users/#{user.nickname}/credentials", %{
"password" => "new_password", "password" => "new_password",
"email" => "new_email@example.com", "email" => "new_email@example.com",
"name" => "new_name" "name" => "new_name"
@ -709,7 +710,7 @@ test "returns 403 if requested by a non-admin", %{user: user} do
test "changes actor type from permitted list", %{conn: conn, user: user} do test "changes actor type from permitted list", %{conn: conn, user: user} do
assert user.actor_type == "Person" assert user.actor_type == "Person"
assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ assert patch(conn, "/api/v1/pleroma/admin/users/#{user.nickname}/credentials", %{
"actor_type" => "Service" "actor_type" => "Service"
}) })
|> json_response(200) == %{"status" => "success"} |> json_response(200) == %{"status" => "success"}
@ -718,14 +719,14 @@ test "changes actor type from permitted list", %{conn: conn, user: user} do
assert updated_user.actor_type == "Service" assert updated_user.actor_type == "Service"
assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ assert patch(conn, "/api/v1/pleroma/admin/users/#{user.nickname}/credentials", %{
"actor_type" => "Application" "actor_type" => "Application"
}) })
|> json_response(400) == %{"errors" => %{"actor_type" => "is invalid"}} |> json_response(400) == %{"errors" => %{"actor_type" => "is invalid"}}
end end
test "update non existing user", %{conn: conn} do test "update non existing user", %{conn: conn} do
assert patch(conn, "/api/pleroma/admin/users/non-existing/credentials", %{ assert patch(conn, "/api/v1/pleroma/admin/users/non-existing/credentials", %{
"password" => "new_password" "password" => "new_password"
}) })
|> json_response(404) == %{"error" => "Not found"} |> json_response(404) == %{"error" => "Not found"}
@ -738,7 +739,9 @@ test "sets password_reset_pending to true", %{conn: conn} do
assert user.password_reset_pending == false assert user.password_reset_pending == false
conn = conn =
patch(conn, "/api/pleroma/admin/users/force_password_reset", %{nicknames: [user.nickname]}) patch(conn, "/api/v1/pleroma/admin/users/force_password_reset", %{
nicknames: [user.nickname]
})
assert empty_json_response(conn) == "" assert empty_json_response(conn) == ""
@ -756,7 +759,7 @@ test "it confirms emails of two users", %{conn: conn, admin: admin} do
refute second_user.is_confirmed refute second_user.is_confirmed
ret_conn = ret_conn =
patch(conn, "/api/pleroma/admin/users/confirm_email", %{ patch(conn, "/api/v1/pleroma/admin/users/confirm_email", %{
nicknames: [ nicknames: [
first_user.nickname, first_user.nickname,
second_user.nickname second_user.nickname
@ -783,7 +786,7 @@ test "it resend emails for two users", %{conn: conn, admin: admin} do
[first_user, second_user] = insert_pair(:user, is_confirmed: false) [first_user, second_user] = insert_pair(:user, is_confirmed: false)
ret_conn = ret_conn =
patch(conn, "/api/pleroma/admin/users/resend_confirmation_email", %{ patch(conn, "/api/v1/pleroma/admin/users/resend_confirmation_email", %{
nicknames: [ nicknames: [
first_user.nickname, first_user.nickname,
second_user.nickname second_user.nickname
@ -804,7 +807,7 @@ test "it resend emails for two users", %{conn: conn, admin: admin} do
end end
end end
describe "/api/pleroma/admin/stats" do describe "/api/v1/pleroma/admin/stats" do
test "status visibility count", %{conn: conn} do test "status visibility count", %{conn: conn} do
user = insert(:user) user = insert(:user)
CommonAPI.post(user, %{visibility: "public", status: "hey"}) CommonAPI.post(user, %{visibility: "public", status: "hey"})
@ -813,7 +816,7 @@ test "status visibility count", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/stats") |> get("/api/v1/pleroma/admin/stats")
|> json_response(200) |> json_response(200)
assert %{"direct" => 0, "private" => 0, "public" => 1, "unlisted" => 2} = assert %{"direct" => 0, "private" => 0, "public" => 1, "unlisted" => 2} =
@ -831,7 +834,7 @@ test "by instance", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/stats", instance: instance2) |> get("/api/v1/pleroma/admin/stats", instance: instance2)
|> json_response(200) |> json_response(200)
assert %{"direct" => 0, "private" => 1, "public" => 0, "unlisted" => 1} = assert %{"direct" => 0, "private" => 1, "public" => 0, "unlisted" => 1} =
@ -839,7 +842,7 @@ test "by instance", %{conn: conn} do
end end
end end
describe "/api/pleroma/backups" do describe "/api/v1/pleroma/backups" do
test "it creates a backup", %{conn: conn} do test "it creates a backup", %{conn: conn} do
admin = %{id: admin_id, nickname: admin_nickname} = insert(:user, is_admin: true) admin = %{id: admin_id, nickname: admin_nickname} = insert(:user, is_admin: true)
token = insert(:oauth_admin_token, user: admin) token = insert(:oauth_admin_token, user: admin)
@ -849,7 +852,7 @@ test "it creates a backup", %{conn: conn} do
conn conn
|> assign(:user, admin) |> assign(:user, admin)
|> assign(:token, token) |> assign(:token, token)
|> post("/api/pleroma/admin/backups", %{nickname: user.nickname}) |> post("/api/v1/pleroma/admin/backups", %{nickname: user.nickname})
|> json_response(200) |> json_response(200)
assert [backup] = Repo.all(Pleroma.User.Backup) assert [backup] = Repo.all(Pleroma.User.Backup)
@ -890,7 +893,7 @@ test "it doesn't limit admins", %{conn: conn} do
conn conn
|> assign(:user, admin) |> assign(:user, admin)
|> assign(:token, token) |> assign(:token, token)
|> post("/api/pleroma/admin/backups", %{nickname: user.nickname}) |> post("/api/v1/pleroma/admin/backups", %{nickname: user.nickname})
|> json_response(200) |> json_response(200)
assert [_backup] = Repo.all(Pleroma.User.Backup) assert [_backup] = Repo.all(Pleroma.User.Backup)
@ -899,7 +902,7 @@ test "it doesn't limit admins", %{conn: conn} do
conn conn
|> assign(:user, admin) |> assign(:user, admin)
|> assign(:token, token) |> assign(:token, token)
|> post("/api/pleroma/admin/backups", %{nickname: user.nickname}) |> post("/api/v1/pleroma/admin/backups", %{nickname: user.nickname})
|> json_response(200) |> json_response(200)
assert Repo.aggregate(Pleroma.User.Backup, :count) == 2 assert Repo.aggregate(Pleroma.User.Backup, :count) == 2

View file

@ -30,11 +30,11 @@ defmodule Pleroma.Web.AdminAPI.FrontendControllerTest do
{:ok, %{admin: admin, token: token, conn: conn}} {:ok, %{admin: admin, token: token, conn: conn}}
end end
describe "GET /api/pleroma/admin/frontends" do describe "GET /api/v1/pleroma/admin/frontends" do
test "it lists available frontends", %{conn: conn} do test "it lists available frontends", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/frontends") |> get("/api/v1/pleroma/admin/frontends")
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert Enum.map(response, & &1["name"]) == assert Enum.map(response, & &1["name"]) ==
@ -48,7 +48,7 @@ test "it lists available frontends when no frontend folder was created yet", %{c
response = response =
conn conn
|> get("/api/pleroma/admin/frontends") |> get("/api/v1/pleroma/admin/frontends")
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert Enum.map(response, & &1["name"]) == assert Enum.map(response, & &1["name"]) ==
@ -58,7 +58,7 @@ test "it lists available frontends when no frontend folder was created yet", %{c
end end
end end
describe "POST /api/pleroma/admin/frontends/install" do describe "POST /api/v1/pleroma/admin/frontends/install" do
test "from available frontends", %{conn: conn} do test "from available frontends", %{conn: conn} do
clear_config([:frontends, :available], %{ clear_config([:frontends, :available], %{
"pleroma" => %{ "pleroma" => %{
@ -74,14 +74,14 @@ test "from available frontends", %{conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/frontends/install", %{name: "pleroma"}) |> post("/api/v1/pleroma/admin/frontends/install", %{name: "pleroma"})
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert File.exists?(Path.join([@dir, "frontends", "pleroma", "fantasy", "test.txt"])) assert File.exists?(Path.join([@dir, "frontends", "pleroma", "fantasy", "test.txt"]))
response = response =
conn conn
|> get("/api/pleroma/admin/frontends") |> get("/api/v1/pleroma/admin/frontends")
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert response == [ assert response == [
@ -106,7 +106,7 @@ test "from a file", %{conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/frontends/install", %{ |> post("/api/v1/pleroma/admin/frontends/install", %{
name: "pleroma", name: "pleroma",
file: "test/fixtures/tesla_mock/frontend.zip" file: "test/fixtures/tesla_mock/frontend.zip"
}) })
@ -122,7 +122,7 @@ test "from an URL", %{conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/frontends/install", %{ |> post("/api/v1/pleroma/admin/frontends/install", %{
name: "unknown", name: "unknown",
ref: "baka", ref: "baka",
build_url: "http://gensokyo.2hu/madeup.zip", build_url: "http://gensokyo.2hu/madeup.zip",
@ -141,7 +141,7 @@ test "failing returns an error", %{conn: conn} do
result = result =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/frontends/install", %{ |> post("/api/v1/pleroma/admin/frontends/install", %{
name: "unknown", name: "unknown",
ref: "baka", ref: "baka",
build_url: "http://gensokyo.2hu/madeup.zip", build_url: "http://gensokyo.2hu/madeup.zip",

View file

@ -37,26 +37,28 @@ test "GET /instances/:instance/statuses", %{conn: conn} do
activity = insert(:note_activity, user: user2) activity = insert(:note_activity, user: user2)
%{"total" => 2, "activities" => activities} = %{"total" => 2, "activities" => activities} =
conn |> get("/api/pleroma/admin/instances/archae.me/statuses") |> json_response(200) conn |> get("/api/v1/pleroma/admin/instances/archae.me/statuses") |> json_response(200)
assert length(activities) == 2 assert length(activities) == 2
%{"total" => 1, "activities" => [_]} = %{"total" => 1, "activities" => [_]} =
conn |> get("/api/pleroma/admin/instances/test.com/statuses") |> json_response(200) conn |> get("/api/v1/pleroma/admin/instances/test.com/statuses") |> json_response(200)
%{"total" => 0, "activities" => []} = %{"total" => 0, "activities" => []} =
conn |> get("/api/pleroma/admin/instances/nonexistent.com/statuses") |> json_response(200) conn
|> get("/api/v1/pleroma/admin/instances/nonexistent.com/statuses")
|> json_response(200)
CommonAPI.repeat(activity.id, user) CommonAPI.repeat(activity.id, user)
%{"total" => 2, "activities" => activities} = %{"total" => 2, "activities" => activities} =
conn |> get("/api/pleroma/admin/instances/archae.me/statuses") |> json_response(200) conn |> get("/api/v1/pleroma/admin/instances/archae.me/statuses") |> json_response(200)
assert length(activities) == 2 assert length(activities) == 2
%{"total" => 3, "activities" => activities} = %{"total" => 3, "activities" => activities} =
conn conn
|> get("/api/pleroma/admin/instances/archae.me/statuses?with_reblogs=true") |> get("/api/v1/pleroma/admin/instances/archae.me/statuses?with_reblogs=true")
|> json_response(200) |> json_response(200)
assert length(activities) == 3 assert length(activities) == 3
@ -68,7 +70,7 @@ test "DELETE /instances/:instance", %{conn: conn} do
response = response =
conn conn
|> delete("/api/pleroma/admin/instances/lain.com") |> delete("/api/v1/pleroma/admin/instances/lain.com")
|> json_response(200) |> json_response(200)
[:ok] = ObanHelpers.perform_all() [:ok] = ObanHelpers.perform_all()

View file

@ -28,9 +28,9 @@ defmodule Pleroma.Web.AdminAPI.InstanceDocumentControllerTest do
{:ok, %{admin: admin, token: token, conn: conn}} {:ok, %{admin: admin, token: token, conn: conn}}
end end
describe "GET /api/pleroma/admin/instance_document/:name" do describe "GET /api/v1/pleroma/admin/instance_document/:name" do
test "return the instance document url", %{conn: conn} do test "return the instance document url", %{conn: conn} do
conn = get(conn, "/api/pleroma/admin/instance_document/instance-panel") conn = get(conn, "/api/v1/pleroma/admin/instance_document/instance-panel")
assert content = html_response(conn, 200) assert content = html_response(conn, 200)
assert String.contains?(content, @default_instance_panel) assert String.contains?(content, @default_instance_panel)
@ -44,7 +44,7 @@ test "it returns 403 if requested by a non-admin" do
build_conn() build_conn()
|> assign(:user, non_admin_user) |> assign(:user, non_admin_user)
|> assign(:token, token) |> assign(:token, token)
|> get("/api/pleroma/admin/instance_document/instance-panel") |> get("/api/v1/pleroma/admin/instance_document/instance-panel")
assert json_response(conn, :forbidden) assert json_response(conn, :forbidden)
end end
@ -52,13 +52,13 @@ test "it returns 403 if requested by a non-admin" do
test "it returns 404 if the instance document with the given name doesn't exist", %{ test "it returns 404 if the instance document with the given name doesn't exist", %{
conn: conn conn: conn
} do } do
conn = get(conn, "/api/pleroma/admin/instance_document/1234") conn = get(conn, "/api/v1/pleroma/admin/instance_document/1234")
assert json_response_and_validate_schema(conn, 404) assert json_response_and_validate_schema(conn, 404)
end end
end end
describe "PATCH /api/pleroma/admin/instance_document/:name" do describe "PATCH /api/v1/pleroma/admin/instance_document/:name" do
test "uploads the instance document", %{conn: conn} do test "uploads the instance document", %{conn: conn} do
image = %Plug.Upload{ image = %Plug.Upload{
content_type: "text/html", content_type: "text/html",
@ -69,7 +69,7 @@ test "uploads the instance document", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/admin/instance_document/instance-panel", %{ |> patch("/api/v1/pleroma/admin/instance_document/instance-panel", %{
"file" => image "file" => image
}) })
@ -79,24 +79,24 @@ test "uploads the instance document", %{conn: conn} do
end end
end end
describe "DELETE /api/pleroma/admin/instance_document/:name" do describe "DELETE /api/v1/pleroma/admin/instance_document/:name" do
test "deletes the instance document", %{conn: conn} do test "deletes the instance document", %{conn: conn} do
File.mkdir!(@dir <> "/instance/") File.mkdir!(@dir <> "/instance/")
File.write!(@dir <> "/instance/panel.html", "Custom instance panel") File.write!(@dir <> "/instance/panel.html", "Custom instance panel")
conn_resp = conn_resp =
conn conn
|> get("/api/pleroma/admin/instance_document/instance-panel") |> get("/api/v1/pleroma/admin/instance_document/instance-panel")
assert html_response(conn_resp, 200) == "Custom instance panel" assert html_response(conn_resp, 200) == "Custom instance panel"
conn conn
|> delete("/api/pleroma/admin/instance_document/instance-panel") |> delete("/api/v1/pleroma/admin/instance_document/instance-panel")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
conn_resp = conn_resp =
conn conn
|> get("/api/pleroma/admin/instance_document/instance-panel") |> get("/api/v1/pleroma/admin/instance_document/instance-panel")
assert content = html_response(conn_resp, 200) assert content = html_response(conn_resp, 200)
assert String.contains?(content, @default_instance_panel) assert String.contains?(content, @default_instance_panel)

View file

@ -22,7 +22,7 @@ defmodule Pleroma.Web.AdminAPI.InviteControllerTest do
{:ok, %{admin: admin, token: token, conn: conn}} {:ok, %{admin: admin, token: token, conn: conn}}
end end
describe "POST /api/pleroma/admin/users/email_invite, with valid config" do describe "POST /api/v1/pleroma/admin/users/email_invite, with valid config" do
setup do: clear_config([:instance, :registrations_open], false) setup do: clear_config([:instance, :registrations_open], false)
setup do: clear_config([:instance, :invites_enabled], true) setup do: clear_config([:instance, :invites_enabled], true)
@ -33,7 +33,7 @@ test "sends invitation and returns 204", %{admin: admin, conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json;charset=utf-8") |> put_req_header("content-type", "application/json;charset=utf-8")
|> post("/api/pleroma/admin/users/email_invite", %{ |> post("/api/v1/pleroma/admin/users/email_invite", %{
email: recipient_email, email: recipient_email,
name: recipient_name name: recipient_name
}) })
@ -71,7 +71,7 @@ test "it returns 403 if requested by a non-admin" do
|> assign(:user, non_admin_user) |> assign(:user, non_admin_user)
|> assign(:token, token) |> assign(:token, token)
|> put_req_header("content-type", "application/json;charset=utf-8") |> put_req_header("content-type", "application/json;charset=utf-8")
|> post("/api/pleroma/admin/users/email_invite", %{ |> post("/api/v1/pleroma/admin/users/email_invite", %{
email: "foo@bar.com", email: "foo@bar.com",
name: "JD" name: "JD"
}) })
@ -84,7 +84,7 @@ test "email with +", %{conn: conn, admin: admin} do
conn conn
|> put_req_header("content-type", "application/json;charset=utf-8") |> put_req_header("content-type", "application/json;charset=utf-8")
|> post("/api/pleroma/admin/users/email_invite", %{email: recipient_email}) |> post("/api/v1/pleroma/admin/users/email_invite", %{email: recipient_email})
|> json_response_and_validate_schema(:no_content) |> json_response_and_validate_schema(:no_content)
token_record = token_record =
@ -113,7 +113,7 @@ test "email with +", %{conn: conn, admin: admin} do
end end
end end
describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do describe "POST /api/v1/pleroma/admin/users/email_invite, with invalid config" do
setup do: clear_config([:instance, :registrations_open]) setup do: clear_config([:instance, :registrations_open])
setup do: clear_config([:instance, :invites_enabled]) setup do: clear_config([:instance, :invites_enabled])
@ -124,7 +124,7 @@ test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/email_invite", %{ |> post("/api/v1/pleroma/admin/users/email_invite", %{
email: "foo@bar.com", email: "foo@bar.com",
name: "JD" name: "JD"
}) })
@ -143,7 +143,7 @@ test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/email_invite", %{ |> post("/api/v1/pleroma/admin/users/email_invite", %{
email: "foo@bar.com", email: "foo@bar.com",
name: "JD" name: "JD"
}) })
@ -156,12 +156,12 @@ test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do
end end
end end
describe "POST /api/pleroma/admin/users/invite_token" do describe "POST /api/v1/pleroma/admin/users/invite_token" do
test "without options", %{conn: conn} do test "without options", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/invite_token") |> post("/api/v1/pleroma/admin/users/invite_token")
invite_json = json_response_and_validate_schema(conn, 200) invite_json = json_response_and_validate_schema(conn, 200)
invite = UserInviteToken.find_by_token!(invite_json["token"]) invite = UserInviteToken.find_by_token!(invite_json["token"])
@ -175,7 +175,7 @@ test "with expires_at", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/invite_token", %{ |> post("/api/v1/pleroma/admin/users/invite_token", %{
"expires_at" => Date.to_string(Date.utc_today()) "expires_at" => Date.to_string(Date.utc_today())
}) })
@ -192,7 +192,7 @@ test "with max_use", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/invite_token", %{"max_use" => 150}) |> post("/api/v1/pleroma/admin/users/invite_token", %{"max_use" => 150})
invite_json = json_response_and_validate_schema(conn, 200) invite_json = json_response_and_validate_schema(conn, 200)
invite = UserInviteToken.find_by_token!(invite_json["token"]) invite = UserInviteToken.find_by_token!(invite_json["token"])
@ -206,7 +206,7 @@ test "with max use and expires_at", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/invite_token", %{ |> post("/api/v1/pleroma/admin/users/invite_token", %{
"max_use" => 150, "max_use" => 150,
"expires_at" => Date.to_string(Date.utc_today()) "expires_at" => Date.to_string(Date.utc_today())
}) })
@ -220,9 +220,9 @@ test "with max use and expires_at", %{conn: conn} do
end end
end end
describe "GET /api/pleroma/admin/users/invites" do describe "GET /api/v1/pleroma/admin/users/invites" do
test "no invites", %{conn: conn} do test "no invites", %{conn: conn} do
conn = get(conn, "/api/pleroma/admin/users/invites") conn = get(conn, "/api/v1/pleroma/admin/users/invites")
assert json_response_and_validate_schema(conn, 200) == %{"invites" => []} assert json_response_and_validate_schema(conn, 200) == %{"invites" => []}
end end
@ -230,7 +230,7 @@ test "no invites", %{conn: conn} do
test "with invite", %{conn: conn} do test "with invite", %{conn: conn} do
{:ok, invite} = UserInviteToken.create_invite() {:ok, invite} = UserInviteToken.create_invite()
conn = get(conn, "/api/pleroma/admin/users/invites") conn = get(conn, "/api/v1/pleroma/admin/users/invites")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"invites" => [ "invites" => [
@ -248,14 +248,14 @@ test "with invite", %{conn: conn} do
end end
end end
describe "POST /api/pleroma/admin/users/revoke_invite" do describe "POST /api/v1/pleroma/admin/users/revoke_invite" do
test "with token", %{conn: conn} do test "with token", %{conn: conn} do
{:ok, invite} = UserInviteToken.create_invite() {:ok, invite} = UserInviteToken.create_invite()
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token}) |> post("/api/v1/pleroma/admin/users/revoke_invite", %{"token" => invite.token})
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"expires_at" => nil, "expires_at" => nil,
@ -272,7 +272,7 @@ test "with invalid token", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) |> post("/api/v1/pleroma/admin/users/revoke_invite", %{"token" => "foo"})
assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"}
end end

View file

@ -28,7 +28,7 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do
{:ok, %{admin: admin, token: token, conn: conn}} {:ok, %{admin: admin, token: token, conn: conn}}
end end
describe "GET /api/pleroma/admin/media_proxy_caches" do describe "GET /api/v1/pleroma/admin/media_proxy_caches" do
test "shows banned MediaProxy URLs", %{conn: conn} do test "shows banned MediaProxy URLs", %{conn: conn} do
MediaProxy.put_in_banned_urls([ MediaProxy.put_in_banned_urls([
"http://localhost:4001/media/a688346.jpg", "http://localhost:4001/media/a688346.jpg",
@ -41,7 +41,7 @@ test "shows banned MediaProxy URLs", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/media_proxy_caches?page_size=2") |> get("/api/v1/pleroma/admin/media_proxy_caches?page_size=2")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert response["page_size"] == 2 assert response["page_size"] == 2
@ -51,7 +51,7 @@ test "shows banned MediaProxy URLs", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=2") |> get("/api/v1/pleroma/admin/media_proxy_caches?page_size=2&page=2")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert response["page_size"] == 2 assert response["page_size"] == 2
@ -61,7 +61,7 @@ test "shows banned MediaProxy URLs", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=3") |> get("/api/v1/pleroma/admin/media_proxy_caches?page_size=2&page=3")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
results = results ++ response["urls"] results = results ++ response["urls"]
@ -89,7 +89,7 @@ test "search banned MediaProxy URLs", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/media_proxy_caches?page_size=2&query=F44") |> get("/api/v1/pleroma/admin/media_proxy_caches?page_size=2&query=F44")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert response["urls"] |> Enum.sort() == [ assert response["urls"] |> Enum.sort() == [
@ -102,7 +102,7 @@ test "search banned MediaProxy URLs", %{conn: conn} do
end end
end end
describe "POST /api/pleroma/admin/media_proxy_caches/delete" do describe "POST /api/v1/pleroma/admin/media_proxy_caches/delete" do
test "deleted MediaProxy URLs from banned", %{conn: conn} do test "deleted MediaProxy URLs from banned", %{conn: conn} do
MediaProxy.put_in_banned_urls([ MediaProxy.put_in_banned_urls([
"http://localhost:4001/media/a688346.jpg", "http://localhost:4001/media/a688346.jpg",
@ -111,7 +111,7 @@ test "deleted MediaProxy URLs from banned", %{conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/media_proxy_caches/delete", %{ |> post("/api/v1/pleroma/admin/media_proxy_caches/delete", %{
urls: ["http://localhost:4001/media/a688346.jpg"] urls: ["http://localhost:4001/media/a688346.jpg"]
}) })
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
@ -121,7 +121,7 @@ test "deleted MediaProxy URLs from banned", %{conn: conn} do
end end
end end
describe "POST /api/pleroma/admin/media_proxy_caches/purge" do describe "POST /api/v1/pleroma/admin/media_proxy_caches/purge" do
test "perform invalidates cache of MediaProxy", %{conn: conn} do test "perform invalidates cache of MediaProxy", %{conn: conn} do
urls = [ urls = [
"http://example.com/media/a688346.jpg", "http://example.com/media/a688346.jpg",
@ -136,7 +136,7 @@ test "perform invalidates cache of MediaProxy", %{conn: conn} do
] do ] do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/media_proxy_caches/purge", %{urls: urls, ban: false}) |> post("/api/v1/pleroma/admin/media_proxy_caches/purge", %{urls: urls, ban: false})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
refute MediaProxy.in_banned_urls("http://example.com/media/a688346.jpg") refute MediaProxy.in_banned_urls("http://example.com/media/a688346.jpg")
@ -154,7 +154,7 @@ test "perform invalidates cache of MediaProxy and adds url to banned", %{conn: c
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post( |> post(
"/api/pleroma/admin/media_proxy_caches/purge", "/api/v1/pleroma/admin/media_proxy_caches/purge",
%{urls: urls, ban: true} %{urls: urls, ban: true}
) )
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)

View file

@ -22,12 +22,12 @@ defmodule Pleroma.Web.AdminAPI.OAuthAppControllerTest do
{:ok, %{admin: admin, token: token, conn: conn}} {:ok, %{admin: admin, token: token, conn: conn}}
end end
describe "POST /api/pleroma/admin/oauth_app" do describe "POST /api/v1/pleroma/admin/oauth_app" do
test "errors", %{conn: conn} do test "errors", %{conn: conn} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/oauth_app", %{}) |> post("/api/v1/pleroma/admin/oauth_app", %{})
|> json_response_and_validate_schema(400) |> json_response_and_validate_schema(400)
assert %{ assert %{
@ -42,7 +42,7 @@ test "success", %{conn: conn} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/oauth_app", %{ |> post("/api/v1/pleroma/admin/oauth_app", %{
name: app_name, name: app_name,
redirect_uris: base_url redirect_uris: base_url
}) })
@ -64,7 +64,7 @@ test "with trusted", %{conn: conn} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/oauth_app", %{ |> post("/api/v1/pleroma/admin/oauth_app", %{
name: app_name, name: app_name,
redirect_uris: base_url, redirect_uris: base_url,
trusted: true trusted: true
@ -81,7 +81,7 @@ test "with trusted", %{conn: conn} do
end end
end end
describe "GET /api/pleroma/admin/oauth_app" do describe "GET /api/v1/pleroma/admin/oauth_app" do
setup do setup do
app = insert(:oauth_app) app = insert(:oauth_app)
{:ok, app: app} {:ok, app: app}
@ -90,7 +90,7 @@ test "with trusted", %{conn: conn} do
test "list", %{conn: conn} do test "list", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/oauth_app") |> get("/api/v1/pleroma/admin/oauth_app")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert %{"apps" => apps, "count" => count, "page_size" => _} = response assert %{"apps" => apps, "count" => count, "page_size" => _} = response
@ -104,7 +104,7 @@ test "with page size", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/oauth_app?page_size=#{page_size}") |> get("/api/v1/pleroma/admin/oauth_app?page_size=#{page_size}")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert %{"apps" => apps, "count" => _, "page_size" => ^page_size} = response assert %{"apps" => apps, "count" => _, "page_size" => ^page_size} = response
@ -115,7 +115,7 @@ test "with page size", %{conn: conn} do
test "search by client name", %{conn: conn, app: app} do test "search by client name", %{conn: conn, app: app} do
response = response =
conn conn
|> get("/api/pleroma/admin/oauth_app?name=#{app.client_name}") |> get("/api/v1/pleroma/admin/oauth_app?name=#{app.client_name}")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert %{"apps" => [returned], "count" => _, "page_size" => _} = response assert %{"apps" => [returned], "count" => _, "page_size" => _} = response
@ -127,7 +127,7 @@ test "search by client name", %{conn: conn, app: app} do
test "search by client id", %{conn: conn, app: app} do test "search by client id", %{conn: conn, app: app} do
response = response =
conn conn
|> get("/api/pleroma/admin/oauth_app?client_id=#{app.client_id}") |> get("/api/v1/pleroma/admin/oauth_app?client_id=#{app.client_id}")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert %{"apps" => [returned], "count" => _, "page_size" => _} = response assert %{"apps" => [returned], "count" => _, "page_size" => _} = response
@ -141,7 +141,7 @@ test "only trusted", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/oauth_app?trusted=true") |> get("/api/v1/pleroma/admin/oauth_app?trusted=true")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert %{"apps" => [returned], "count" => _, "page_size" => _} = response assert %{"apps" => [returned], "count" => _, "page_size" => _} = response
@ -151,13 +151,13 @@ test "only trusted", %{conn: conn} do
end end
end end
describe "DELETE /api/pleroma/admin/oauth_app/:id" do describe "DELETE /api/v1/pleroma/admin/oauth_app/:id" do
test "with id", %{conn: conn} do test "with id", %{conn: conn} do
app = insert(:oauth_app) app = insert(:oauth_app)
response = response =
conn conn
|> delete("/api/pleroma/admin/oauth_app/" <> to_string(app.id)) |> delete("/api/v1/pleroma/admin/oauth_app/" <> to_string(app.id))
|> json_response_and_validate_schema(:no_content) |> json_response_and_validate_schema(:no_content)
assert response == "" assert response == ""
@ -166,14 +166,14 @@ test "with id", %{conn: conn} do
test "with non existance id", %{conn: conn} do test "with non existance id", %{conn: conn} do
response = response =
conn conn
|> delete("/api/pleroma/admin/oauth_app/0") |> delete("/api/v1/pleroma/admin/oauth_app/0")
|> json_response_and_validate_schema(:bad_request) |> json_response_and_validate_schema(:bad_request)
assert response == "" assert response == ""
end end
end end
describe "PATCH /api/pleroma/admin/oauth_app/:id" do describe "PATCH /api/v1/pleroma/admin/oauth_app/:id" do
test "with id", %{conn: conn} do test "with id", %{conn: conn} do
app = insert(:oauth_app) app = insert(:oauth_app)
@ -186,7 +186,7 @@ test "with id", %{conn: conn} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/oauth_app/#{id}", %{ |> patch("/api/v1/pleroma/admin/oauth_app/#{id}", %{
name: name, name: name,
trusted: true, trusted: true,
redirect_uris: url, redirect_uris: url,
@ -210,7 +210,7 @@ test "without id", %{conn: conn} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/oauth_app/0") |> patch("/api/v1/pleroma/admin/oauth_app/0")
|> json_response_and_validate_schema(:bad_request) |> json_response_and_validate_schema(:bad_request)
assert response == "" assert response == ""

View file

@ -34,7 +34,7 @@ test "POST /relay", %{conn: conn, admin: admin} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/relay", %{ |> post("/api/v1/pleroma/admin/relay", %{
relay_url: "http://mastodon.example.org/users/admin" relay_url: "http://mastodon.example.org/users/admin"
}) })
@ -58,7 +58,7 @@ test "GET /relay", %{conn: conn} do
User.follow(relay_user, user) User.follow(relay_user, user)
end) end)
conn = get(conn, "/api/pleroma/admin/relay") conn = get(conn, "/api/v1/pleroma/admin/relay")
assert json_response_and_validate_schema(conn, 200)["relays"] |> Enum.sort() == [ assert json_response_and_validate_schema(conn, 200)["relays"] |> Enum.sort() == [
%{ %{
@ -72,14 +72,14 @@ test "GET /relay", %{conn: conn} do
test "DELETE /relay", %{conn: conn, admin: admin} do test "DELETE /relay", %{conn: conn, admin: admin} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/relay", %{ |> post("/api/v1/pleroma/admin/relay", %{
relay_url: "http://mastodon.example.org/users/admin" relay_url: "http://mastodon.example.org/users/admin"
}) })
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> delete("/api/pleroma/admin/relay", %{ |> delete("/api/v1/pleroma/admin/relay", %{
relay_url: "http://mastodon.example.org/users/admin" relay_url: "http://mastodon.example.org/users/admin"
}) })

View file

@ -25,7 +25,7 @@ defmodule Pleroma.Web.AdminAPI.ReportControllerTest do
{:ok, %{admin: admin, token: token, conn: conn}} {:ok, %{admin: admin, token: token, conn: conn}}
end end
describe "GET /api/pleroma/admin/reports/:id" do describe "GET /api/v1/pleroma/admin/reports/:id" do
test "returns report by its id", %{conn: conn} do test "returns report by its id", %{conn: conn} do
[reporter, target_user] = insert_pair(:user) [reporter, target_user] = insert_pair(:user)
activity = insert(:note_activity, user: target_user) activity = insert(:note_activity, user: target_user)
@ -39,13 +39,13 @@ test "returns report by its id", %{conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ |> post("/api/v1/pleroma/admin/reports/#{report_id}/notes", %{
content: "this is an admin note" content: "this is an admin note"
}) })
response = response =
conn conn
|> get("/api/pleroma/admin/reports/#{report_id}") |> get("/api/v1/pleroma/admin/reports/#{report_id}")
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert response["id"] == report_id assert response["id"] == report_id
@ -55,13 +55,13 @@ test "returns report by its id", %{conn: conn} do
end end
test "returns 404 when report id is invalid", %{conn: conn} do test "returns 404 when report id is invalid", %{conn: conn} do
conn = get(conn, "/api/pleroma/admin/reports/test") conn = get(conn, "/api/v1/pleroma/admin/reports/test")
assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"}
end end
end end
describe "PATCH /api/pleroma/admin/reports" do describe "PATCH /api/v1/pleroma/admin/reports" do
setup do setup do
[reporter, target_user] = insert_pair(:user) [reporter, target_user] = insert_pair(:user)
activity = insert(:note_activity, user: target_user) activity = insert(:note_activity, user: target_user)
@ -94,7 +94,7 @@ test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} d
conn conn
|> assign(:token, read_token) |> assign(:token, read_token)
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/reports", %{ |> patch("/api/v1/pleroma/admin/reports", %{
"reports" => [%{"state" => "resolved", "id" => id}] "reports" => [%{"state" => "resolved", "id" => id}]
}) })
|> json_response_and_validate_schema(403) |> json_response_and_validate_schema(403)
@ -106,7 +106,7 @@ test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} d
conn conn
|> assign(:token, write_token) |> assign(:token, write_token)
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/reports", %{ |> patch("/api/v1/pleroma/admin/reports", %{
"reports" => [%{"state" => "resolved", "id" => id}] "reports" => [%{"state" => "resolved", "id" => id}]
}) })
|> json_response_and_validate_schema(:no_content) |> json_response_and_validate_schema(:no_content)
@ -115,7 +115,7 @@ test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} d
test "mark report as resolved", %{conn: conn, id: id, admin: admin} do test "mark report as resolved", %{conn: conn, id: id, admin: admin} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/reports", %{ |> patch("/api/v1/pleroma/admin/reports", %{
"reports" => [ "reports" => [
%{"state" => "resolved", "id" => id} %{"state" => "resolved", "id" => id}
] ]
@ -134,7 +134,7 @@ test "mark report as resolved", %{conn: conn, id: id, admin: admin} do
test "closes report", %{conn: conn, id: id, admin: admin} do test "closes report", %{conn: conn, id: id, admin: admin} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/reports", %{ |> patch("/api/v1/pleroma/admin/reports", %{
"reports" => [ "reports" => [
%{"state" => "closed", "id" => id} %{"state" => "closed", "id" => id}
] ]
@ -154,7 +154,7 @@ test "returns 400 when state is unknown", %{conn: conn, id: id} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/reports", %{ |> patch("/api/v1/pleroma/admin/reports", %{
"reports" => [ "reports" => [
%{"state" => "test", "id" => id} %{"state" => "test", "id" => id}
] ]
@ -168,7 +168,7 @@ test "returns 404 when report is not exist", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/reports", %{ |> patch("/api/v1/pleroma/admin/reports", %{
"reports" => [ "reports" => [
%{"state" => "closed", "id" => "test"} %{"state" => "closed", "id" => "test"}
] ]
@ -185,7 +185,7 @@ test "updates state of multiple reports", %{
} do } do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/reports", %{ |> patch("/api/v1/pleroma/admin/reports", %{
"reports" => [ "reports" => [
%{"state" => "resolved", "id" => id}, %{"state" => "resolved", "id" => id},
%{"state" => "closed", "id" => second_report_id} %{"state" => "closed", "id" => second_report_id}
@ -208,7 +208,7 @@ test "updates state of multiple reports", %{
end end
end end
describe "GET /api/pleroma/admin/reports" do describe "GET /api/v1/pleroma/admin/reports" do
test "returns empty response when no reports created", %{conn: conn} do test "returns empty response when no reports created", %{conn: conn} do
response = response =
conn conn
@ -300,14 +300,14 @@ test "returns 403 when requested by a non-admin" do
build_conn() build_conn()
|> assign(:user, user) |> assign(:user, user)
|> assign(:token, token) |> assign(:token, token)
|> get("/api/pleroma/admin/reports") |> get("/api/v1/pleroma/admin/reports")
assert json_response(conn, :forbidden) == assert json_response(conn, :forbidden) ==
%{"error" => "User is not a staff member."} %{"error" => "User is not a staff member."}
end end
test "returns 403 when requested by anonymous" do test "returns 403 when requested by anonymous" do
conn = get(build_conn(), "/api/pleroma/admin/reports") conn = get(build_conn(), "/api/v1/pleroma/admin/reports")
assert json_response(conn, :forbidden) == %{ assert json_response(conn, :forbidden) == %{
"error" => "Invalid credentials." "error" => "Invalid credentials."
@ -315,7 +315,7 @@ test "returns 403 when requested by anonymous" do
end end
end end
describe "POST /api/pleroma/admin/reports/:id/notes" do describe "POST /api/v1/pleroma/admin/reports/:id/notes" do
setup %{conn: conn, admin: admin} do setup %{conn: conn, admin: admin} do
[reporter, target_user] = insert_pair(:user) [reporter, target_user] = insert_pair(:user)
activity = insert(:note_activity, user: target_user) activity = insert(:note_activity, user: target_user)
@ -329,13 +329,13 @@ test "returns 403 when requested by anonymous" do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ |> post("/api/v1/pleroma/admin/reports/#{report_id}/notes", %{
content: "this is disgusting!" content: "this is disgusting!"
}) })
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ |> post("/api/v1/pleroma/admin/reports/#{report_id}/notes", %{
content: "this is disgusting2!" content: "this is disgusting2!"
}) })
@ -356,7 +356,7 @@ test "it creates report note", %{admin_id: admin_id, report_id: report_id} do
end end
test "it returns reports with notes", %{conn: conn, admin: admin} do test "it returns reports with notes", %{conn: conn, admin: admin} do
conn = get(conn, "/api/pleroma/admin/reports") conn = get(conn, "/api/v1/pleroma/admin/reports")
response = json_response_and_validate_schema(conn, 200) response = json_response_and_validate_schema(conn, 200)
notes = hd(response["reports"])["notes"] notes = hd(response["reports"])["notes"]
@ -379,7 +379,7 @@ test "it deletes the note", %{conn: conn, report_id: report_id} do
assert ReportNote |> Repo.all() |> length() == 2 assert ReportNote |> Repo.all() |> length() == 2
assert [note, _] = Repo.all(ReportNote) assert [note, _] = Repo.all(ReportNote)
delete(conn, "/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}") delete(conn, "/api/v1/pleroma/admin/reports/#{report_id}/notes/#{note.id}")
assert ReportNote |> Repo.all() |> length() == 1 assert ReportNote |> Repo.all() |> length() == 1
end end

View file

@ -25,10 +25,10 @@ defmodule Pleroma.Web.AdminAPI.StatusControllerTest do
{:ok, %{admin: admin, token: token, conn: conn}} {:ok, %{admin: admin, token: token, conn: conn}}
end end
describe "GET /api/pleroma/admin/statuses/:id" do describe "GET /api/v1/pleroma/admin/statuses/:id" do
test "not found", %{conn: conn} do test "not found", %{conn: conn} do
assert conn assert conn
|> get("/api/pleroma/admin/statuses/not_found") |> get("/api/v1/pleroma/admin/statuses/not_found")
|> json_response_and_validate_schema(:not_found) |> json_response_and_validate_schema(:not_found)
end end
@ -37,7 +37,7 @@ test "shows activity", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/statuses/#{activity.id}") |> get("/api/v1/pleroma/admin/statuses/#{activity.id}")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert response["id"] == activity.id assert response["id"] == activity.id
@ -52,7 +52,7 @@ test "shows activity", %{conn: conn} do
end end
end end
describe "PUT /api/pleroma/admin/statuses/:id" do describe "PUT /api/v1/pleroma/admin/statuses/:id" do
setup do setup do
activity = insert(:note_activity) activity = insert(:note_activity)
@ -63,7 +63,7 @@ test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"}) |> put("/api/v1/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"})
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert response["sensitive"] assert response["sensitive"]
@ -76,7 +76,7 @@ test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"}) |> put("/api/v1/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"})
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
refute response["sensitive"] refute response["sensitive"]
@ -86,7 +86,7 @@ test "change visibility flag", %{conn: conn, id: id, admin: admin} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "public"}) |> put("/api/v1/pleroma/admin/statuses/#{id}", %{visibility: "public"})
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert response["visibility"] == "public" assert response["visibility"] == "public"
@ -99,7 +99,7 @@ test "change visibility flag", %{conn: conn, id: id, admin: admin} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "private"}) |> put("/api/v1/pleroma/admin/statuses/#{id}", %{visibility: "private"})
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert response["visibility"] == "private" assert response["visibility"] == "private"
@ -107,7 +107,7 @@ test "change visibility flag", %{conn: conn, id: id, admin: admin} do
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "unlisted"}) |> put("/api/v1/pleroma/admin/statuses/#{id}", %{visibility: "unlisted"})
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
assert response["visibility"] == "unlisted" assert response["visibility"] == "unlisted"
@ -117,14 +117,14 @@ test "returns 400 when visibility is unknown", %{conn: conn, id: id} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "test"}) |> put("/api/v1/pleroma/admin/statuses/#{id}", %{visibility: "test"})
assert %{"error" => "test - Invalid value for enum."} = assert %{"error" => "test - Invalid value for enum."} =
json_response_and_validate_schema(conn, :bad_request) json_response_and_validate_schema(conn, :bad_request)
end end
end end
describe "DELETE /api/pleroma/admin/statuses/:id" do describe "DELETE /api/v1/pleroma/admin/statuses/:id" do
setup do setup do
activity = insert(:note_activity) activity = insert(:note_activity)
@ -133,7 +133,7 @@ test "returns 400 when visibility is unknown", %{conn: conn, id: id} do
test "deletes status", %{conn: conn, id: id, admin: admin} do test "deletes status", %{conn: conn, id: id, admin: admin} do
conn conn
|> delete("/api/pleroma/admin/statuses/#{id}") |> delete("/api/v1/pleroma/admin/statuses/#{id}")
|> json_response_and_validate_schema(:ok) |> json_response_and_validate_schema(:ok)
refute Activity.get_by_id(id) refute Activity.get_by_id(id)
@ -145,13 +145,13 @@ test "deletes status", %{conn: conn, id: id, admin: admin} do
end end
test "returns 404 when the status does not exist", %{conn: conn} do test "returns 404 when the status does not exist", %{conn: conn} do
conn = delete(conn, "/api/pleroma/admin/statuses/test") conn = delete(conn, "/api/v1/pleroma/admin/statuses/test")
assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"}
end end
end end
describe "GET /api/pleroma/admin/statuses" do describe "GET /api/v1/pleroma/admin/statuses" do
test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do
blocked = insert(:user) blocked = insert(:user)
user = insert(:user) user = insert(:user)
@ -166,7 +166,7 @@ test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do
response = response =
conn conn
|> get("/api/pleroma/admin/statuses") |> get("/api/v1/pleroma/admin/statuses")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
refute "private" in Enum.map(response, & &1["visibility"]) refute "private" in Enum.map(response, & &1["visibility"])
@ -181,7 +181,7 @@ test "returns only local statuses with local_only on", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/admin/statuses?local_only=true") |> get("/api/v1/pleroma/admin/statuses?local_only=true")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert length(response) == 1 assert length(response) == 1
@ -194,7 +194,7 @@ test "returns private and direct statuses with godmode on", %{conn: conn, admin:
{:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"}) {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"})
{:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"}) {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"})
conn = get(conn, "/api/pleroma/admin/statuses?godmode=true") conn = get(conn, "/api/v1/pleroma/admin/statuses?godmode=true")
assert json_response_and_validate_schema(conn, 200) |> length() == 3 assert json_response_and_validate_schema(conn, 200) |> length() == 3
end end
end end

View file

@ -42,15 +42,16 @@ test "with valid `admin_token` query parameter, skips OAuth scopes check" do
user = insert(:user) user = insert(:user)
conn = get(build_conn(), "/api/pleroma/admin/users/#{user.nickname}?admin_token=password123") conn =
get(build_conn(), "/api/v1/pleroma/admin/users/#{user.nickname}?admin_token=password123")
assert json_response_and_validate_schema(conn, 200) assert json_response_and_validate_schema(conn, 200)
end end
test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope", test "GET /api/v1/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope",
%{admin: admin} do %{admin: admin} do
user = insert(:user) user = insert(:user)
url = "/api/pleroma/admin/users/#{user.nickname}" url = "/api/v1/pleroma/admin/users/#{user.nickname}"
good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"])
good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"])
@ -91,7 +92,7 @@ test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or bro
end end
end end
describe "DELETE /api/pleroma/admin/users" do describe "DELETE /api/v1/pleroma/admin/users" do
test "single user", %{admin: admin, conn: conn} do test "single user", %{admin: admin, conn: conn} do
clear_config([:instance, :federating], true) clear_config([:instance, :federating], true)
@ -120,7 +121,7 @@ test "single user", %{admin: admin, conn: conn} do
conn = conn =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> delete("/api/pleroma/admin/users?nickname=#{user.nickname}") |> delete("/api/v1/pleroma/admin/users?nickname=#{user.nickname}")
ObanHelpers.perform_all() ObanHelpers.perform_all()
@ -156,7 +157,7 @@ test "multiple users", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> delete("/api/pleroma/admin/users", %{ |> delete("/api/v1/pleroma/admin/users", %{
nicknames: [user_one.nickname, user_two.nickname] nicknames: [user_one.nickname, user_two.nickname]
}) })
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
@ -170,13 +171,13 @@ test "multiple users", %{admin: admin, conn: conn} do
end end
end end
describe "/api/pleroma/admin/users" do describe "/api/v1/pleroma/admin/users" do
test "Create", %{conn: conn} do test "Create", %{conn: conn} do
response = response =
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users", %{ |> post("/api/v1/pleroma/admin/users", %{
"users" => [ "users" => [
%{ %{
"nickname" => "lain", "nickname" => "lain",
@ -207,7 +208,7 @@ test "Cannot create user with existing email", %{conn: conn} do
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users", %{ |> post("/api/v1/pleroma/admin/users", %{
"users" => [ "users" => [
%{ %{
"nickname" => "lain", "nickname" => "lain",
@ -237,7 +238,7 @@ test "Cannot create user with existing nickname", %{conn: conn} do
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users", %{ |> post("/api/v1/pleroma/admin/users", %{
"users" => [ "users" => [
%{ %{
"nickname" => user.nickname, "nickname" => user.nickname,
@ -267,7 +268,7 @@ test "Multiple user creation works in transaction", %{conn: conn} do
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users", %{ |> post("/api/v1/pleroma/admin/users", %{
"users" => [ "users" => [
%{ %{
"nickname" => "newuser", "nickname" => "newuser",
@ -307,11 +308,11 @@ test "Multiple user creation works in transaction", %{conn: conn} do
end end
end end
describe "/api/pleroma/admin/users/:nickname" do describe "/api/v1/pleroma/admin/users/:nickname" do
test "Show", %{conn: conn} do test "Show", %{conn: conn} do
user = insert(:user) user = insert(:user)
conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") conn = get(conn, "/api/v1/pleroma/admin/users/#{user.nickname}")
assert user_response(user) == json_response_and_validate_schema(conn, 200) assert user_response(user) == json_response_and_validate_schema(conn, 200)
end end
@ -319,13 +320,13 @@ test "Show", %{conn: conn} do
test "when the user doesn't exist", %{conn: conn} do test "when the user doesn't exist", %{conn: conn} do
user = build(:user) user = build(:user)
conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") conn = get(conn, "/api/v1/pleroma/admin/users/#{user.nickname}")
assert %{"error" => "Not found"} == json_response_and_validate_schema(conn, 404) assert %{"error" => "Not found"} == json_response_and_validate_schema(conn, 404)
end end
end end
describe "/api/pleroma/admin/users/follow" do describe "/api/v1/pleroma/admin/users/follow" do
test "allows to force-follow another user", %{admin: admin, conn: conn} do test "allows to force-follow another user", %{admin: admin, conn: conn} do
user = insert(:user) user = insert(:user)
follower = insert(:user) follower = insert(:user)
@ -333,7 +334,7 @@ test "allows to force-follow another user", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/follow", %{ |> post("/api/v1/pleroma/admin/users/follow", %{
"follower" => follower.nickname, "follower" => follower.nickname,
"followed" => user.nickname "followed" => user.nickname
}) })
@ -350,7 +351,7 @@ test "allows to force-follow another user", %{admin: admin, conn: conn} do
end end
end end
describe "/api/pleroma/admin/users/unfollow" do describe "/api/v1/pleroma/admin/users/unfollow" do
test "allows to force-unfollow another user", %{admin: admin, conn: conn} do test "allows to force-unfollow another user", %{admin: admin, conn: conn} do
user = insert(:user) user = insert(:user)
follower = insert(:user) follower = insert(:user)
@ -360,7 +361,7 @@ test "allows to force-unfollow another user", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("accept", "application/json") |> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users/unfollow", %{ |> post("/api/v1/pleroma/admin/users/unfollow", %{
"follower" => follower.nickname, "follower" => follower.nickname,
"followed" => user.nickname "followed" => user.nickname
}) })
@ -377,12 +378,12 @@ test "allows to force-unfollow another user", %{admin: admin, conn: conn} do
end end
end end
describe "GET /api/pleroma/admin/users" do describe "GET /api/v1/pleroma/admin/users" do
test "renders users array for the first page", %{conn: conn, admin: admin} do test "renders users array for the first page", %{conn: conn, admin: admin} do
user = insert(:user, local: false, tags: ["foo", "bar"]) user = insert(:user, local: false, tags: ["foo", "bar"])
user2 = insert(:user, is_approved: false, registration_reason: "I'm a chill dude") user2 = insert(:user, is_approved: false, registration_reason: "I'm a chill dude")
conn = get(conn, "/api/pleroma/admin/users?page=1") conn = get(conn, "/api/v1/pleroma/admin/users?page=1")
users = [ users = [
user_response( user_response(
@ -415,7 +416,7 @@ test "pagination works correctly with service users", %{conn: conn} do
assert %{"count" => 26, "page_size" => 10, "users" => users1} = assert %{"count" => 26, "page_size" => 10, "users" => users1} =
conn conn
|> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"}) |> get("/api/v1/pleroma/admin/users?page=1&filters=", %{page_size: "10"})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert Enum.count(users1) == 10 assert Enum.count(users1) == 10
@ -423,7 +424,7 @@ test "pagination works correctly with service users", %{conn: conn} do
assert %{"count" => 26, "page_size" => 10, "users" => users2} = assert %{"count" => 26, "page_size" => 10, "users" => users2} =
conn conn
|> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"}) |> get("/api/v1/pleroma/admin/users?page=2&filters=", %{page_size: "10"})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert Enum.count(users2) == 10 assert Enum.count(users2) == 10
@ -431,7 +432,7 @@ test "pagination works correctly with service users", %{conn: conn} do
assert %{"count" => 26, "page_size" => 10, "users" => users3} = assert %{"count" => 26, "page_size" => 10, "users" => users3} =
conn conn
|> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"}) |> get("/api/v1/pleroma/admin/users?page=3&filters=", %{page_size: "10"})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert Enum.count(users3) == 6 assert Enum.count(users3) == 6
@ -441,7 +442,7 @@ test "pagination works correctly with service users", %{conn: conn} do
test "renders empty array for the second page", %{conn: conn} do test "renders empty array for the second page", %{conn: conn} do
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?page=2") conn = get(conn, "/api/v1/pleroma/admin/users?page=2")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 2, "count" => 2,
@ -453,7 +454,7 @@ test "renders empty array for the second page", %{conn: conn} do
test "regular search", %{conn: conn} do test "regular search", %{conn: conn} do
user = insert(:user, nickname: "bob") user = insert(:user, nickname: "bob")
conn = get(conn, "/api/pleroma/admin/users?query=bo") conn = get(conn, "/api/v1/pleroma/admin/users?query=bo")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -466,7 +467,7 @@ test "search by domain", %{conn: conn} do
user = insert(:user, nickname: "nickname@domain.com") user = insert(:user, nickname: "nickname@domain.com")
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?query=domain.com") conn = get(conn, "/api/v1/pleroma/admin/users?query=domain.com")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -479,7 +480,7 @@ test "search by full nickname", %{conn: conn} do
user = insert(:user, nickname: "nickname@domain.com") user = insert(:user, nickname: "nickname@domain.com")
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com") conn = get(conn, "/api/v1/pleroma/admin/users?query=nickname@domain.com")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -492,7 +493,7 @@ test "search by display name", %{conn: conn} do
user = insert(:user, name: "Display name") user = insert(:user, name: "Display name")
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?name=display") conn = get(conn, "/api/v1/pleroma/admin/users?name=display")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -505,7 +506,7 @@ test "search by email", %{conn: conn} do
user = insert(:user, email: "email@example.com") user = insert(:user, email: "email@example.com")
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?email=email@example.com") conn = get(conn, "/api/v1/pleroma/admin/users?email=email@example.com")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -518,7 +519,7 @@ test "regular search with page size", %{conn: conn} do
user = insert(:user, nickname: "aalice") user = insert(:user, nickname: "aalice")
user2 = insert(:user, nickname: "alice") user2 = insert(:user, nickname: "alice")
conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1") conn1 = get(conn, "/api/v1/pleroma/admin/users?query=a&page_size=1&page=1")
assert json_response_and_validate_schema(conn1, 200) == %{ assert json_response_and_validate_schema(conn1, 200) == %{
"count" => 2, "count" => 2,
@ -526,7 +527,7 @@ test "regular search with page size", %{conn: conn} do
"users" => [user_response(user2)] "users" => [user_response(user2)]
} }
conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2") conn2 = get(conn, "/api/v1/pleroma/admin/users?query=a&page_size=1&page=2")
assert json_response_and_validate_schema(conn2, 200) == %{ assert json_response_and_validate_schema(conn2, 200) == %{
"count" => 2, "count" => 2,
@ -546,7 +547,7 @@ test "only local users" do
build_conn() build_conn()
|> assign(:user, admin) |> assign(:user, admin)
|> assign(:token, token) |> assign(:token, token)
|> get("/api/pleroma/admin/users?query=bo&filters=local") |> get("/api/v1/pleroma/admin/users?query=bo&filters=local")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -561,7 +562,7 @@ test "only local users with no query", %{conn: conn, admin: old_admin} do
insert(:user, nickname: "bobb", local: false) insert(:user, nickname: "bobb", local: false)
conn = get(conn, "/api/pleroma/admin/users?filters=local") conn = get(conn, "/api/v1/pleroma/admin/users?filters=local")
users = [ users = [
user_response(user), user_response(user),
@ -590,7 +591,7 @@ test "only unconfirmed users", %{conn: conn} do
result = result =
conn conn
|> get("/api/pleroma/admin/users?filters=unconfirmed") |> get("/api/v1/pleroma/admin/users?filters=unconfirmed")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
users = users =
@ -614,7 +615,7 @@ test "only unapproved users", %{conn: conn} do
insert(:user, nickname: "happyboy", is_approved: true) insert(:user, nickname: "happyboy", is_approved: true)
conn = get(conn, "/api/pleroma/admin/users?filters=need_approval") conn = get(conn, "/api/v1/pleroma/admin/users?filters=need_approval")
users = [ users = [
user_response( user_response(
@ -635,7 +636,7 @@ test "load only admins", %{conn: conn, admin: admin} do
insert(:user) insert(:user)
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?filters=is_admin") conn = get(conn, "/api/v1/pleroma/admin/users?filters=is_admin")
users = [ users = [
user_response(second_admin, %{ user_response(second_admin, %{
@ -660,7 +661,7 @@ test "load only moderators", %{conn: conn} do
insert(:user) insert(:user)
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator") conn = get(conn, "/api/v1/pleroma/admin/users?filters=is_moderator")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -739,7 +740,7 @@ test "load users with tags list", %{conn: conn} do
insert(:user) insert(:user)
insert(:user) insert(:user)
conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second") conn = get(conn, "/api/v1/pleroma/admin/users?tags[]=first&tags[]=second")
users = [ users = [
user_response(user2, %{"tags" => ["second"]}), user_response(user2, %{"tags" => ["second"]}),
@ -762,7 +763,7 @@ test "`active` filters out users pending approval", %{token: token} do
build_conn() build_conn()
|> assign(:user, token.user) |> assign(:user, token.user)
|> assign(:token, token) |> assign(:token, token)
|> get("/api/pleroma/admin/users?filters=active") |> get("/api/v1/pleroma/admin/users?filters=active")
assert %{ assert %{
"count" => 2, "count" => 2,
@ -786,7 +787,7 @@ test "it works with multiple filters" do
build_conn() build_conn()
|> assign(:user, admin) |> assign(:user, admin)
|> assign(:token, token) |> assign(:token, token)
|> get("/api/pleroma/admin/users?filters=deactivated,external") |> get("/api/v1/pleroma/admin/users?filters=deactivated,external")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -798,7 +799,7 @@ test "it works with multiple filters" do
test "it omits relay user", %{admin: admin, conn: conn} do test "it omits relay user", %{admin: admin, conn: conn} do
assert %User{} = Relay.get_actor() assert %User{} = Relay.get_actor()
conn = get(conn, "/api/pleroma/admin/users") conn = get(conn, "/api/v1/pleroma/admin/users")
assert json_response_and_validate_schema(conn, 200) == %{ assert json_response_and_validate_schema(conn, 200) == %{
"count" => 1, "count" => 1,
@ -810,7 +811,7 @@ test "it omits relay user", %{admin: admin, conn: conn} do
end end
end end
test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do test "PATCH /api/v1/pleroma/admin/users/activate", %{admin: admin, conn: conn} do
user_one = insert(:user, is_active: false) user_one = insert(:user, is_active: false)
user_two = insert(:user, is_active: false) user_two = insert(:user, is_active: false)
@ -818,7 +819,7 @@ test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch( |> patch(
"/api/pleroma/admin/users/activate", "/api/v1/pleroma/admin/users/activate",
%{nicknames: [user_one.nickname, user_two.nickname]} %{nicknames: [user_one.nickname, user_two.nickname]}
) )
@ -831,7 +832,7 @@ test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do
"@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}" "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}"
end end
test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do test "PATCH /api/v1/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do
user_one = insert(:user, is_active: true) user_one = insert(:user, is_active: true)
user_two = insert(:user, is_active: true) user_two = insert(:user, is_active: true)
@ -839,7 +840,7 @@ test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch( |> patch(
"/api/pleroma/admin/users/deactivate", "/api/v1/pleroma/admin/users/deactivate",
%{nicknames: [user_one.nickname, user_two.nickname]} %{nicknames: [user_one.nickname, user_two.nickname]}
) )
@ -852,7 +853,7 @@ test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do
"@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}"
end end
test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do test "PATCH /api/v1/pleroma/admin/users/approve", %{admin: admin, conn: conn} do
user_one = insert(:user, is_approved: false) user_one = insert(:user, is_approved: false)
user_two = insert(:user, is_approved: false) user_two = insert(:user, is_approved: false)
@ -860,7 +861,7 @@ test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch( |> patch(
"/api/pleroma/admin/users/approve", "/api/v1/pleroma/admin/users/approve",
%{nicknames: [user_one.nickname, user_two.nickname]} %{nicknames: [user_one.nickname, user_two.nickname]}
) )
@ -873,7 +874,7 @@ test "PATCH /api/pleroma/admin/users/approve", %{admin: admin, conn: conn} do
"@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}" "@#{admin.nickname} approved users: @#{user_one.nickname}, @#{user_two.nickname}"
end end
test "PATCH /api/pleroma/admin/users/suggest", %{admin: admin, conn: conn} do test "PATCH /api/v1/pleroma/admin/users/suggest", %{admin: admin, conn: conn} do
user1 = insert(:user, is_suggested: false) user1 = insert(:user, is_suggested: false)
user2 = insert(:user, is_suggested: false) user2 = insert(:user, is_suggested: false)
@ -881,7 +882,7 @@ test "PATCH /api/pleroma/admin/users/suggest", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch( |> patch(
"/api/pleroma/admin/users/suggest", "/api/v1/pleroma/admin/users/suggest",
%{nicknames: [user1.nickname, user2.nickname]} %{nicknames: [user1.nickname, user2.nickname]}
) )
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
@ -898,7 +899,7 @@ test "PATCH /api/pleroma/admin/users/suggest", %{admin: admin, conn: conn} do
"@#{admin.nickname} added suggested users: @#{user1.nickname}, @#{user2.nickname}" "@#{admin.nickname} added suggested users: @#{user1.nickname}, @#{user2.nickname}"
end end
test "PATCH /api/pleroma/admin/users/unsuggest", %{admin: admin, conn: conn} do test "PATCH /api/v1/pleroma/admin/users/unsuggest", %{admin: admin, conn: conn} do
user1 = insert(:user, is_suggested: true) user1 = insert(:user, is_suggested: true)
user2 = insert(:user, is_suggested: true) user2 = insert(:user, is_suggested: true)
@ -906,7 +907,7 @@ test "PATCH /api/pleroma/admin/users/unsuggest", %{admin: admin, conn: conn} do
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch( |> patch(
"/api/pleroma/admin/users/unsuggest", "/api/v1/pleroma/admin/users/unsuggest",
%{nicknames: [user1.nickname, user2.nickname]} %{nicknames: [user1.nickname, user2.nickname]}
) )
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
@ -923,13 +924,16 @@ test "PATCH /api/pleroma/admin/users/unsuggest", %{admin: admin, conn: conn} do
"@#{admin.nickname} removed suggested users: @#{user1.nickname}, @#{user2.nickname}" "@#{admin.nickname} removed suggested users: @#{user1.nickname}, @#{user2.nickname}"
end end
test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do test "PATCH /api/v1/pleroma/admin/users/:nickname/toggle_activation", %{
admin: admin,
conn: conn
} do
user = insert(:user) user = insert(:user)
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> patch("/api/pleroma/admin/users/#{user.nickname}/toggle_activation") |> patch("/api/v1/pleroma/admin/users/#{user.nickname}/toggle_activation")
assert json_response_and_validate_schema(conn, 200) == assert json_response_and_validate_schema(conn, 200) ==
user_response( user_response(

View file

@ -72,12 +72,6 @@ test "GET /main/all", %{conn: conn} do
end end
end end
test "GET /api*path", %{conn: conn} do
assert conn
|> get("/api/foo")
|> json_response(404) == %{"error" => "Not implemented"}
end
test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} do
assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/" assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/"
end end

View file

@ -38,7 +38,7 @@ test "posting a status does not increment reblog_count when relaying", %{conn: c
response = response =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{ |> post("/api/v1/statuses", %{
"content_type" => "text/plain", "content_type" => "text/plain",
"source" => "Pleroma FE", "source" => "Pleroma FE",
"status" => "Hello world", "status" => "Hello world",
@ -51,7 +51,7 @@ test "posting a status does not increment reblog_count when relaying", %{conn: c
response = response =
conn conn
|> get("api/v1/statuses/#{response["id"]}", %{}) |> get("/api/v1/statuses/#{response["id"]}", %{})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert response["reblogs_count"] == 0 assert response["reblogs_count"] == 0
@ -110,7 +110,7 @@ test "posting a status", %{conn: conn} do
conn_four = conn_four =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{ |> post("/api/v1/statuses", %{
"status" => "oolong", "status" => "oolong",
"expires_in" => expires_in "expires_in" => expires_in
}) })
@ -133,7 +133,7 @@ test "automatically setting a post expiry if status_ttl_days is set" do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{ |> post("/api/v1/statuses", %{
"status" => "aa chikichiki banban" "status" => "aa chikichiki banban"
}) })
@ -164,7 +164,7 @@ test "it fails to create a status if `expires_in` is less or equal than an hour"
assert %{"error" => "Expiry date is too soon"} = assert %{"error" => "Expiry date is too soon"} =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{ |> post("/api/v1/statuses", %{
"status" => "oolong", "status" => "oolong",
"expires_in" => expires_in "expires_in" => expires_in
}) })
@ -176,7 +176,7 @@ test "it fails to create a status if `expires_in` is less or equal than an hour"
assert %{"error" => "Expiry date is too soon"} = assert %{"error" => "Expiry date is too soon"} =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{ |> post("/api/v1/statuses", %{
"status" => "oolong", "status" => "oolong",
"expires_in" => expires_in "expires_in" => expires_in
}) })
@ -190,7 +190,7 @@ test "Get MRF reason when posting a status is rejected by one", %{conn: conn} do
assert %{"error" => "[KeywordPolicy] Matches with rejected keyword"} = assert %{"error" => "[KeywordPolicy] Matches with rejected keyword"} =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{"status" => "GNO/Linux"}) |> post("/api/v1/statuses", %{"status" => "GNO/Linux"})
|> json_response_and_validate_schema(422) |> json_response_and_validate_schema(422)
end end
@ -383,7 +383,7 @@ test "posting a direct status", %{conn: conn} do
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{"status" => content, "visibility" => "direct"}) |> post("/api/v1/statuses", %{"status" => content, "visibility" => "direct"})
assert %{"id" => id} = response = json_response_and_validate_schema(conn, 200) assert %{"id" => id} = response = json_response_and_validate_schema(conn, 200)
assert response["visibility"] == "direct" assert response["visibility"] == "direct"
@ -420,7 +420,7 @@ test "discloses application metadata when enabled" do
result = result =
conn conn
|> get("api/v1/statuses/#{activity}") |> get("/api/v1/statuses/#{activity}")
assert %{ assert %{
"content" => "cofe is my copilot", "content" => "cofe is my copilot",
@ -449,7 +449,7 @@ test "hides application metadata when disabled" do
result = result =
conn conn
|> get("api/v1/statuses/#{activity}") |> get("/api/v1/statuses/#{activity}")
assert %{ assert %{
"content" => "club mate is my wingman", "content" => "club mate is my wingman",
@ -1342,7 +1342,7 @@ test "on pin removes deletion job, on unpin reschedule deletion" do
assert %{"id" => id} = assert %{"id" => id} =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> post("api/v1/statuses", %{ |> post("/api/v1/statuses", %{
"status" => "oolong", "status" => "oolong",
"expires_in" => expires_in "expires_in" => expires_in
}) })
@ -1511,7 +1511,7 @@ test "Repeated posts that are replies incorrectly have in_reply_to_id null", %{c
conn conn
|> assign(:user, user3) |> assign(:user, user3)
|> assign(:token, insert(:oauth_token, user: user3, scopes: ["read:statuses"])) |> assign(:token, insert(:oauth_token, user: user3, scopes: ["read:statuses"]))
|> get("api/v1/timelines/home") |> get("/api/v1/timelines/home")
[reblogged_activity] = json_response_and_validate_schema(conn3, 200) [reblogged_activity] = json_response_and_validate_schema(conn3, 200)

View file

@ -288,7 +288,7 @@ test "doesn't return posts from users who blocked you when :blockers_visible is
get(conn, "/api/v1/timelines/public") get(conn, "/api/v1/timelines/public")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert length(response) == 0 assert response == []
end end
test "doesn't return replies if follow is posting with users from blocked domain" do test "doesn't return replies if follow is posting with users from blocked domain" do
@ -527,7 +527,7 @@ test "direct timeline", %{conn: conn} do
|> assign(:token, insert(:oauth_token, user: user_two, scopes: ["read:statuses"])) |> assign(:token, insert(:oauth_token, user: user_two, scopes: ["read:statuses"]))
# Only direct should be visible here # Only direct should be visible here
res_conn = get(conn_user_two, "api/v1/timelines/direct") res_conn = get(conn_user_two, "/api/v1/timelines/direct")
assert [status] = json_response_and_validate_schema(res_conn, :ok) assert [status] = json_response_and_validate_schema(res_conn, :ok)
@ -539,14 +539,14 @@ test "direct timeline", %{conn: conn} do
build_conn() build_conn()
|> assign(:user, user_one) |> assign(:user, user_one)
|> assign(:token, insert(:oauth_token, user: user_one, scopes: ["read:statuses"])) |> assign(:token, insert(:oauth_token, user: user_one, scopes: ["read:statuses"]))
|> get("api/v1/timelines/direct") |> get("/api/v1/timelines/direct")
[status] = json_response_and_validate_schema(res_conn, :ok) [status] = json_response_and_validate_schema(res_conn, :ok)
assert %{"visibility" => "direct"} = status assert %{"visibility" => "direct"} = status
# Both should be visible here # Both should be visible here
res_conn = get(conn_user_two, "api/v1/timelines/home") res_conn = get(conn_user_two, "/api/v1/timelines/home")
[_s1, _s2] = json_response_and_validate_schema(res_conn, :ok) [_s1, _s2] = json_response_and_validate_schema(res_conn, :ok)
@ -559,14 +559,14 @@ test "direct timeline", %{conn: conn} do
}) })
end) end)
res_conn = get(conn_user_two, "api/v1/timelines/direct") res_conn = get(conn_user_two, "/api/v1/timelines/direct")
statuses = json_response_and_validate_schema(res_conn, :ok) statuses = json_response_and_validate_schema(res_conn, :ok)
assert length(statuses) == 20 assert length(statuses) == 20
max_id = List.last(statuses)["id"] max_id = List.last(statuses)["id"]
res_conn = get(conn_user_two, "api/v1/timelines/direct?max_id=#{max_id}") res_conn = get(conn_user_two, "/api/v1/timelines/direct?max_id=#{max_id}")
assert [status] = json_response_and_validate_schema(res_conn, :ok) assert [status] = json_response_and_validate_schema(res_conn, :ok)
@ -591,7 +591,7 @@ test "doesn't include DMs from blocked users" do
visibility: "direct" visibility: "direct"
}) })
res_conn = get(conn, "api/v1/timelines/direct") res_conn = get(conn, "/api/v1/timelines/direct")
[status] = json_response_and_validate_schema(res_conn, :ok) [status] = json_response_and_validate_schema(res_conn, :ok)
assert status["id"] == direct.id assert status["id"] == direct.id

View file

@ -388,7 +388,7 @@ test "updates the user's background, upload_limit, returns a HTTP 413", %{
"pleroma_background_image" => new_background_oversized "pleroma_background_image" => new_background_oversized
}) })
assert user_response = json_response_and_validate_schema(res, 413) assert json_response_and_validate_schema(res, 413)
assert user.background == %{} assert user.background == %{}
clear_config([:instance, :upload_limit], upload_limit) clear_config([:instance, :upload_limit], upload_limit)
@ -439,13 +439,13 @@ test "updates profile emojos", %{user: user, conn: conn} do
test "update fields", %{conn: conn} do test "update fields", %{conn: conn} do
fields = [ fields = [
%{"name" => "<a href=\"http://google.com\">foo</a>", "value" => "<script>bar</script>"}, %{name: "<a href=\"http://google.com\">foo</a>", value: "<script>bar</script>"},
%{"name" => "link.io", "value" => "cofe.io"} %{name: "link.io", value: "cofe.io"}
] ]
account_data = account_data =
conn conn
|> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) |> patch("/api/v1/accounts/update_credentials", %{fields_attributes: fields})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert account_data["fields"] == [ assert account_data["fields"] == [
@ -467,13 +467,13 @@ test "update fields", %{conn: conn} do
test "emojis in fields labels", %{conn: conn} do test "emojis in fields labels", %{conn: conn} do
fields = [ fields = [
%{"name" => ":firefox:", "value" => "is best 2hu"}, %{name: ":firefox:", value: "is best 2hu"},
%{"name" => "they wins", "value" => ":blank:"} %{name: "they wins", value: ":blank:"}
] ]
account_data = account_data =
conn conn
|> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) |> patch("/api/v1/accounts/update_credentials", %{fields_attributes: fields})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert account_data["fields"] == [ assert account_data["fields"] == [
@ -521,13 +521,13 @@ test "update fields via x-www-form-urlencoded", %{conn: conn} do
test "update fields with empty name", %{conn: conn} do test "update fields with empty name", %{conn: conn} do
fields = [ fields = [
%{"name" => "foo", "value" => ""}, %{name: "foo", value: ""},
%{"name" => "", "value" => "bar"} %{name: "", value: "bar"}
] ]
account = account =
conn conn
|> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) |> patch("/api/v1/accounts/update_credentials", %{fields_attributes: fields})
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert account["fields"] == [ assert account["fields"] == [
@ -542,30 +542,30 @@ test "update fields when invalid request", %{conn: conn} do
long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join() long_name = Enum.map(0..name_limit, fn _ -> "x" end) |> Enum.join()
long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join() long_value = Enum.map(0..value_limit, fn _ -> "x" end) |> Enum.join()
fields = [%{"name" => "foo", "value" => long_value}] fields = [%{name: "foo", value: long_value}]
assert %{"error" => "Invalid request"} == assert %{"error" => "Invalid request"} ==
conn conn
|> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) |> patch("/api/v1/accounts/update_credentials", %{fields_attributes: fields})
|> json_response_and_validate_schema(403) |> json_response_and_validate_schema(403)
fields = [%{"name" => long_name, "value" => "bar"}] fields = [%{name: long_name, value: "bar"}]
assert %{"error" => "Invalid request"} == assert %{"error" => "Invalid request"} ==
conn conn
|> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) |> patch("/api/v1/accounts/update_credentials", %{fields_attributes: fields})
|> json_response_and_validate_schema(403) |> json_response_and_validate_schema(403)
clear_config([:instance, :max_account_fields], 1) clear_config([:instance, :max_account_fields], 1)
fields = [ fields = [
%{"name" => "foo", "value" => "bar"}, %{name: "foo", value: "bar"},
%{"name" => "link", "value" => "cofe.io"} %{"name" => "link", "value" => "cofe.io"}
] ]
assert %{"error" => "Invalid request"} == assert %{"error" => "Invalid request"} ==
conn conn
|> patch("/api/v1/accounts/update_credentials", %{"fields_attributes" => fields}) |> patch("/api/v1/accounts/update_credentials", %{fields_attributes: fields})
|> json_response_and_validate_schema(403) |> json_response_and_validate_schema(403)
end end
end end

View file

@ -133,7 +133,7 @@ test "returns favorited DM only when user is logged in and he is one of recipien
|> get("/api/v1/pleroma/accounts/#{user.id}/favourites") |> get("/api/v1/pleroma/accounts/#{user.id}/favourites")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert length(response) == 0 assert response == []
end end
test "does not return others' favorited DM when user is not one of recipients", %{ test "does not return others' favorited DM when user is not one of recipients", %{

View file

@ -28,7 +28,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiFileControllerTest do
{:ok, %{admin_conn: admin_conn}} {:ok, %{admin_conn: admin_conn}}
end end
describe "POST/PATCH/DELETE /api/pleroma/emoji/packs/files?name=:name" do describe "POST/PATCH/DELETE /api/v1/pleroma/emoji/packs/files?name=:name" do
setup do setup do
pack_file = "#{@emoji_path}/test_pack/pack.json" pack_file = "#{@emoji_path}/test_pack/pack.json"
original_content = File.read!(pack_file) original_content = File.read!(pack_file)
@ -55,7 +55,7 @@ test "upload zip file with emojies", %{admin_conn: admin_conn} do
resp = resp =
admin_conn admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
file: %Plug.Upload{ file: %Plug.Upload{
content_type: "application/zip", content_type: "application/zip",
filename: "emojis.zip", filename: "emojis.zip",
@ -82,7 +82,7 @@ test "upload zip file with emojies", %{admin_conn: admin_conn} do
test "create shortcode exists", %{admin_conn: admin_conn} do test "create shortcode exists", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank", shortcode: "blank",
filename: "dir/blank.png", filename: "dir/blank.png",
file: %Plug.Upload{ file: %Plug.Upload{
@ -100,7 +100,7 @@ test "don't rewrite old emoji", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank3", shortcode: "blank3",
filename: "dir/blank.png", filename: "dir/blank.png",
file: %Plug.Upload{ file: %Plug.Upload{
@ -118,7 +118,7 @@ test "don't rewrite old emoji", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> patch("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank", shortcode: "blank",
new_shortcode: "blank2", new_shortcode: "blank2",
new_filename: "dir_2/blank_3.png" new_filename: "dir_2/blank_3.png"
@ -134,7 +134,7 @@ test "rewrite old emoji with force option", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank3", shortcode: "blank3",
filename: "dir/blank.png", filename: "dir/blank.png",
file: %Plug.Upload{ file: %Plug.Upload{
@ -152,7 +152,7 @@ test "rewrite old emoji with force option", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> patch("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank3", shortcode: "blank3",
new_shortcode: "blank4", new_shortcode: "blank4",
new_filename: "dir_2/blank_3.png", new_filename: "dir_2/blank_3.png",
@ -170,7 +170,7 @@ test "rewrite old emoji with force option", %{admin_conn: admin_conn} do
test "with empty filename", %{admin_conn: admin_conn} do test "with empty filename", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank2", shortcode: "blank2",
filename: "", filename: "",
file: %Plug.Upload{ file: %Plug.Upload{
@ -186,7 +186,7 @@ test "with empty filename", %{admin_conn: admin_conn} do
test "add file with not loaded pack", %{admin_conn: admin_conn} do test "add file with not loaded pack", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=not_loaded", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=not_loaded", %{
shortcode: "blank3", shortcode: "blank3",
filename: "dir/blank.png", filename: "dir/blank.png",
file: %Plug.Upload{ file: %Plug.Upload{
@ -209,7 +209,7 @@ test "returns an error on add file when file system is not writable", %{
]) do ]) do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=not_loaded", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=not_loaded", %{
shortcode: "blank3", shortcode: "blank3",
filename: "dir/blank.png", filename: "dir/blank.png",
file: %Plug.Upload{ file: %Plug.Upload{
@ -226,7 +226,7 @@ test "returns an error on add file when file system is not writable", %{
test "remove file with not loaded pack", %{admin_conn: admin_conn} do test "remove file with not loaded pack", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/packs/files?name=not_loaded&shortcode=blank3") |> delete("/api/v1/pleroma/emoji/packs/files?name=not_loaded&shortcode=blank3")
|> json_response_and_validate_schema(:not_found) == %{ |> json_response_and_validate_schema(:not_found) == %{
"error" => "pack \"not_loaded\" is not found" "error" => "pack \"not_loaded\" is not found"
} }
@ -234,7 +234,7 @@ test "remove file with not loaded pack", %{admin_conn: admin_conn} do
test "remove file with empty shortcode", %{admin_conn: admin_conn} do test "remove file with empty shortcode", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/packs/files?name=not_loaded&shortcode=") |> delete("/api/v1/pleroma/emoji/packs/files?name=not_loaded&shortcode=")
|> json_response_and_validate_schema(:not_found) == %{ |> json_response_and_validate_schema(:not_found) == %{
"error" => "pack \"not_loaded\" is not found" "error" => "pack \"not_loaded\" is not found"
} }
@ -243,7 +243,7 @@ test "remove file with empty shortcode", %{admin_conn: admin_conn} do
test "update file with not loaded pack", %{admin_conn: admin_conn} do test "update file with not loaded pack", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/packs/files?name=not_loaded", %{ |> patch("/api/v1/pleroma/emoji/packs/files?name=not_loaded", %{
shortcode: "blank4", shortcode: "blank4",
new_shortcode: "blank3", new_shortcode: "blank3",
new_filename: "dir_2/blank_3.png" new_filename: "dir_2/blank_3.png"
@ -256,7 +256,7 @@ test "update file with not loaded pack", %{admin_conn: admin_conn} do
test "new with shortcode as file with update", %{admin_conn: admin_conn} do test "new with shortcode as file with update", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank4", shortcode: "blank4",
filename: "dir/blank.png", filename: "dir/blank.png",
file: %Plug.Upload{ file: %Plug.Upload{
@ -274,7 +274,7 @@ test "new with shortcode as file with update", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> patch("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank4", shortcode: "blank4",
new_shortcode: "blank3", new_shortcode: "blank3",
new_filename: "dir_2/blank_3.png" new_filename: "dir_2/blank_3.png"
@ -289,7 +289,7 @@ test "new with shortcode as file with update", %{admin_conn: admin_conn} do
assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png") assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png")
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/packs/files?name=test_pack&shortcode=blank3") |> delete("/api/v1/pleroma/emoji/packs/files?name=test_pack&shortcode=blank3")
|> json_response_and_validate_schema(200) == %{ |> json_response_and_validate_schema(200) == %{
"blank" => "blank.png", "blank" => "blank.png",
"blank2" => "blank2.png" "blank2" => "blank2.png"
@ -311,7 +311,7 @@ test "new with shortcode from url", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank_url", shortcode: "blank_url",
file: "https://test-blank/blank_url.png" file: "https://test-blank/blank_url.png"
}) })
@ -331,7 +331,7 @@ test "new without shortcode", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> post("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
file: %Plug.Upload{ file: %Plug.Upload{
filename: "shortcode.png", filename: "shortcode.png",
path: "#{Pleroma.Config.get([:instance, :static_dir])}/add/shortcode.png" path: "#{Pleroma.Config.get([:instance, :static_dir])}/add/shortcode.png"
@ -346,7 +346,7 @@ test "new without shortcode", %{admin_conn: admin_conn} do
test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/packs/files?name=test_pack&shortcode=blank3") |> delete("/api/v1/pleroma/emoji/packs/files?name=test_pack&shortcode=blank3")
|> json_response_and_validate_schema(:bad_request) == %{ |> json_response_and_validate_schema(:bad_request) == %{
"error" => "Emoji \"blank3\" does not exist" "error" => "Emoji \"blank3\" does not exist"
} }
@ -355,7 +355,7 @@ test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do
test "update non existing emoji", %{admin_conn: admin_conn} do test "update non existing emoji", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> patch("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank3", shortcode: "blank3",
new_shortcode: "blank4", new_shortcode: "blank4",
new_filename: "dir_2/blank_3.png" new_filename: "dir_2/blank_3.png"
@ -371,7 +371,7 @@ test "update with empty shortcode", %{admin_conn: admin_conn} do
} = } =
admin_conn admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/packs/files?name=test_pack", %{ |> patch("/api/v1/pleroma/emoji/packs/files?name=test_pack", %{
shortcode: "blank", shortcode: "blank",
new_filename: "dir_2/blank_3.png" new_filename: "dir_2/blank_3.png"
}) })

View file

@ -29,13 +29,16 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do
{:ok, %{admin_conn: admin_conn}} {:ok, %{admin_conn: admin_conn}}
end end
test "GET /api/pleroma/emoji/packs when :public: false", %{conn: conn} do test "GET /api/v1/pleroma/emoji/packs when :public: false", %{conn: conn} do
clear_config([:instance, :public], false) clear_config([:instance, :public], false)
conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) conn |> get("/api/v1/pleroma/emoji/packs") |> json_response_and_validate_schema(200)
end end
test "GET /api/pleroma/emoji/packs", %{conn: conn} do test "GET /api/v1/pleroma/emoji/packs", %{conn: conn} do
resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) resp =
conn
|> get("/api/v1/pleroma/emoji/packs")
|> json_response_and_validate_schema(200)
assert resp["count"] == 4 assert resp["count"] == 4
@ -55,7 +58,7 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do
resp = resp =
conn conn
|> get("/api/pleroma/emoji/packs?page_size=1") |> get("/api/v1/pleroma/emoji/packs?page_size=1")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert resp["count"] == 4 assert resp["count"] == 4
@ -68,7 +71,7 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do
resp = resp =
conn conn
|> get("/api/pleroma/emoji/packs?page_size=1&page=2") |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=2")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert resp["count"] == 4 assert resp["count"] == 4
@ -78,7 +81,7 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do
resp = resp =
conn conn
|> get("/api/pleroma/emoji/packs?page_size=1&page=3") |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=3")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert resp["count"] == 4 assert resp["count"] == 4
@ -88,7 +91,7 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do
resp = resp =
conn conn
|> get("/api/pleroma/emoji/packs?page_size=1&page=4") |> get("/api/v1/pleroma/emoji/packs?page_size=1&page=4")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert resp["count"] == 4 assert resp["count"] == 4
@ -98,11 +101,11 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do
assert [pack1, pack2, pack3, pack4] |> Enum.uniq() |> length() == 4 assert [pack1, pack2, pack3, pack4] |> Enum.uniq() |> length() == 4
end end
describe "GET /api/pleroma/emoji/packs/remote" do describe "GET /api/v1/pleroma/emoji/packs/remote" do
test "shareable instance", %{admin_conn: admin_conn, conn: conn} do test "shareable instance", %{admin_conn: admin_conn, conn: conn} do
resp = resp =
conn conn
|> get("/api/pleroma/emoji/packs?page=2&page_size=1") |> get("/api/v1/pleroma/emoji/packs?page=2&page_size=1")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
mock(fn mock(fn
@ -112,12 +115,17 @@ test "shareable instance", %{admin_conn: admin_conn, conn: conn} do
%{method: :get, url: "https://example.com/nodeinfo/2.1.json"} -> %{method: :get, url: "https://example.com/nodeinfo/2.1.json"} ->
json(%{metadata: %{features: ["shareable_emoji_packs"]}}) json(%{metadata: %{features: ["shareable_emoji_packs"]}})
%{method: :get, url: "https://example.com/api/pleroma/emoji/packs?page=2&page_size=1"} -> %{
method: :get,
url: "https://example.com/api/v1/pleroma/emoji/packs?page=2&page_size=1"
} ->
json(resp) json(resp)
end) end)
assert admin_conn assert admin_conn
|> get("/api/pleroma/emoji/packs/remote?url=https://example.com&page=2&page_size=1") |> get(
"/api/v1/pleroma/emoji/packs/remote?url=https://example.com&page=2&page_size=1"
)
|> json_response_and_validate_schema(200) == resp |> json_response_and_validate_schema(200) == resp
end end
@ -131,18 +139,18 @@ test "non shareable instance", %{admin_conn: admin_conn} do
end) end)
assert admin_conn assert admin_conn
|> get("/api/pleroma/emoji/packs/remote?url=https://example.com") |> get("/api/v1/pleroma/emoji/packs/remote?url=https://example.com")
|> json_response_and_validate_schema(500) == %{ |> json_response_and_validate_schema(500) == %{
"error" => "The requested instance does not support sharing emoji packs" "error" => "The requested instance does not support sharing emoji packs"
} }
end end
end end
describe "GET /api/pleroma/emoji/packs/archive?name=:name" do describe "GET /api/v1/pleroma/emoji/packs/archive?name=:name" do
test "download shared pack", %{conn: conn} do test "download shared pack", %{conn: conn} do
resp = resp =
conn conn
|> get("/api/pleroma/emoji/packs/archive?name=test_pack") |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack")
|> response(200) |> response(200)
{:ok, arch} = :zip.unzip(resp, [:memory]) {:ok, arch} = :zip.unzip(resp, [:memory])
@ -153,7 +161,7 @@ test "download shared pack", %{conn: conn} do
test "non existing pack", %{conn: conn} do test "non existing pack", %{conn: conn} do
assert conn assert conn
|> get("/api/pleroma/emoji/packs/archive?name=test_pack_for_import") |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack_for_import")
|> json_response_and_validate_schema(:not_found) == %{ |> json_response_and_validate_schema(:not_found) == %{
"error" => "Pack test_pack_for_import does not exist" "error" => "Pack test_pack_for_import does not exist"
} }
@ -161,7 +169,7 @@ test "non existing pack", %{conn: conn} do
test "non downloadable pack", %{conn: conn} do test "non downloadable pack", %{conn: conn} do
assert conn assert conn
|> get("/api/pleroma/emoji/packs/archive?name=test_pack_nonshared") |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack_nonshared")
|> json_response_and_validate_schema(:forbidden) == %{ |> json_response_and_validate_schema(:forbidden) == %{
"error" => "error" =>
"Pack test_pack_nonshared cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing" "Pack test_pack_nonshared cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing"
@ -169,7 +177,7 @@ test "non downloadable pack", %{conn: conn} do
end end
end end
describe "POST /api/pleroma/emoji/packs/download" do describe "POST /api/v1/pleroma/emoji/packs/download" do
test "shared pack from remote and non shared from fallback-src", %{ test "shared pack from remote and non shared from fallback-src", %{
admin_conn: admin_conn, admin_conn: admin_conn,
conn: conn conn: conn
@ -183,28 +191,28 @@ test "shared pack from remote and non shared from fallback-src", %{
%{ %{
method: :get, method: :get,
url: "https://example.com/api/pleroma/emoji/pack?name=test_pack" url: "https://example.com/api/v1/pleroma/emoji/pack?name=test_pack"
} -> } ->
conn conn
|> get("/api/pleroma/emoji/pack?name=test_pack") |> get("/api/v1/pleroma/emoji/pack?name=test_pack")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
|> json() |> json()
%{ %{
method: :get, method: :get,
url: "https://example.com/api/pleroma/emoji/packs/archive?name=test_pack" url: "https://example.com/api/v1/pleroma/emoji/packs/archive?name=test_pack"
} -> } ->
conn conn
|> get("/api/pleroma/emoji/packs/archive?name=test_pack") |> get("/api/v1/pleroma/emoji/packs/archive?name=test_pack")
|> response(200) |> response(200)
|> text() |> text()
%{ %{
method: :get, method: :get,
url: "https://example.com/api/pleroma/emoji/pack?name=test_pack_nonshared" url: "https://example.com/api/v1/pleroma/emoji/pack?name=test_pack_nonshared"
} -> } ->
conn conn
|> get("/api/pleroma/emoji/pack?name=test_pack_nonshared") |> get("/api/v1/pleroma/emoji/pack?name=test_pack_nonshared")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
|> json() |> json()
@ -217,7 +225,7 @@ test "shared pack from remote and non shared from fallback-src", %{
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/download", %{ |> post("/api/v1/pleroma/emoji/packs/download", %{
url: "https://example.com", url: "https://example.com",
name: "test_pack", name: "test_pack",
as: "test_pack2" as: "test_pack2"
@ -228,7 +236,7 @@ test "shared pack from remote and non shared from fallback-src", %{
assert File.exists?("#{@emoji_path}/test_pack2/blank.png") assert File.exists?("#{@emoji_path}/test_pack2/blank.png")
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/pack?name=test_pack2") |> delete("/api/v1/pleroma/emoji/pack?name=test_pack2")
|> json_response_and_validate_schema(200) == "ok" |> json_response_and_validate_schema(200) == "ok"
refute File.exists?("#{@emoji_path}/test_pack2") refute File.exists?("#{@emoji_path}/test_pack2")
@ -236,7 +244,7 @@ test "shared pack from remote and non shared from fallback-src", %{
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post( |> post(
"/api/pleroma/emoji/packs/download", "/api/v1/pleroma/emoji/packs/download",
%{ %{
url: "https://example.com", url: "https://example.com",
name: "test_pack_nonshared", name: "test_pack_nonshared",
@ -249,7 +257,7 @@ test "shared pack from remote and non shared from fallback-src", %{
assert File.exists?("#{@emoji_path}/test_pack_nonshared2/blank.png") assert File.exists?("#{@emoji_path}/test_pack_nonshared2/blank.png")
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/pack?name=test_pack_nonshared2") |> delete("/api/v1/pleroma/emoji/pack?name=test_pack_nonshared2")
|> json_response_and_validate_schema(200) == "ok" |> json_response_and_validate_schema(200) == "ok"
refute File.exists?("#{@emoji_path}/test_pack_nonshared2") refute File.exists?("#{@emoji_path}/test_pack_nonshared2")
@ -267,7 +275,7 @@ test "nonshareable instance", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post( |> post(
"/api/pleroma/emoji/packs/download", "/api/v1/pleroma/emoji/packs/download",
%{ %{
url: "https://old-instance", url: "https://old-instance",
name: "test_pack", name: "test_pack",
@ -289,14 +297,14 @@ test "checksum fail", %{admin_conn: admin_conn} do
%{ %{
method: :get, method: :get,
url: "https://example.com/api/pleroma/emoji/pack?name=pack_bad_sha" url: "https://example.com/api/v1/pleroma/emoji/pack?name=pack_bad_sha"
} -> } ->
{:ok, pack} = Pleroma.Emoji.Pack.load_pack("pack_bad_sha") {:ok, pack} = Pleroma.Emoji.Pack.load_pack("pack_bad_sha")
%Tesla.Env{status: 200, body: Jason.encode!(pack)} %Tesla.Env{status: 200, body: Jason.encode!(pack)}
%{ %{
method: :get, method: :get,
url: "https://example.com/api/pleroma/emoji/packs/archive?name=pack_bad_sha" url: "https://example.com/api/v1/pleroma/emoji/packs/archive?name=pack_bad_sha"
} -> } ->
%Tesla.Env{ %Tesla.Env{
status: 200, status: 200,
@ -306,7 +314,7 @@ test "checksum fail", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/download", %{ |> post("/api/v1/pleroma/emoji/packs/download", %{
url: "https://example.com", url: "https://example.com",
name: "pack_bad_sha", name: "pack_bad_sha",
as: "pack_bad_sha2" as: "pack_bad_sha2"
@ -326,7 +334,7 @@ test "other error", %{admin_conn: admin_conn} do
%{ %{
method: :get, method: :get,
url: "https://example.com/api/pleroma/emoji/pack?name=test_pack" url: "https://example.com/api/v1/pleroma/emoji/pack?name=test_pack"
} -> } ->
{:ok, pack} = Pleroma.Emoji.Pack.load_pack("test_pack") {:ok, pack} = Pleroma.Emoji.Pack.load_pack("test_pack")
%Tesla.Env{status: 200, body: Jason.encode!(pack)} %Tesla.Env{status: 200, body: Jason.encode!(pack)}
@ -334,7 +342,7 @@ test "other error", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/emoji/packs/download", %{ |> post("/api/v1/pleroma/emoji/packs/download", %{
url: "https://example.com", url: "https://example.com",
name: "test_pack", name: "test_pack",
as: "test_pack2" as: "test_pack2"
@ -346,7 +354,7 @@ test "other error", %{admin_conn: admin_conn} do
end end
end end
describe "PATCH/update /api/pleroma/emoji/pack?name=:name" do describe "PATCH/update /api/v1/pleroma/emoji/pack?name=:name" do
setup do setup do
pack_file = "#{@emoji_path}/test_pack/pack.json" pack_file = "#{@emoji_path}/test_pack/pack.json"
original_content = File.read!(pack_file) original_content = File.read!(pack_file)
@ -372,7 +380,7 @@ test "returns error when file system not writable", %{admin_conn: conn} = ctx do
assert conn assert conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch( |> patch(
"/api/pleroma/emoji/pack?name=test_pack", "/api/v1/pleroma/emoji/pack?name=test_pack",
%{"metadata" => ctx[:new_data]} %{"metadata" => ctx[:new_data]}
) )
|> json_response_and_validate_schema(500) |> json_response_and_validate_schema(500)
@ -382,7 +390,7 @@ test "returns error when file system not writable", %{admin_conn: conn} = ctx do
test "for a pack without a fallback source", ctx do test "for a pack without a fallback source", ctx do
assert ctx[:admin_conn] assert ctx[:admin_conn]
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/pack?name=test_pack", %{ |> patch("/api/v1/pleroma/emoji/pack?name=test_pack", %{
"metadata" => ctx[:new_data] "metadata" => ctx[:new_data]
}) })
|> json_response_and_validate_schema(200) == ctx[:new_data] |> json_response_and_validate_schema(200) == ctx[:new_data]
@ -410,7 +418,7 @@ test "for a pack with a fallback source", ctx do
assert ctx[:admin_conn] assert ctx[:admin_conn]
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/pack?name=test_pack", %{metadata: new_data}) |> patch("/api/v1/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})
|> json_response_and_validate_schema(200) == new_data_with_sha |> json_response_and_validate_schema(200) == new_data_with_sha
assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == new_data_with_sha assert Jason.decode!(File.read!(ctx[:pack_file]))["pack"] == new_data_with_sha
@ -430,14 +438,14 @@ test "when the fallback source doesn't have all the files", ctx do
assert ctx[:admin_conn] assert ctx[:admin_conn]
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> patch("/api/pleroma/emoji/pack?name=test_pack", %{metadata: new_data}) |> patch("/api/v1/pleroma/emoji/pack?name=test_pack", %{metadata: new_data})
|> json_response_and_validate_schema(:bad_request) == %{ |> json_response_and_validate_schema(:bad_request) == %{
"error" => "The fallback archive does not have all files specified in pack.json" "error" => "The fallback archive does not have all files specified in pack.json"
} }
end end
end end
describe "POST/DELETE /api/pleroma/emoji/pack?name=:name" do describe "POST/DELETE /api/v1/pleroma/emoji/pack?name=:name" do
test "returns an error on creates pack when file system not writable", %{ test "returns an error on creates pack when file system not writable", %{
admin_conn: admin_conn admin_conn: admin_conn
} do } do
@ -447,7 +455,7 @@ test "returns an error on creates pack when file system not writable", %{
{File, [:passthrough], [mkdir: fn ^path_pack -> {:error, :eacces} end]} {File, [:passthrough], [mkdir: fn ^path_pack -> {:error, :eacces} end]}
]) do ]) do
assert admin_conn assert admin_conn
|> post("/api/pleroma/emoji/pack?name=test_pack") |> post("/api/v1/pleroma/emoji/pack?name=test_pack")
|> json_response_and_validate_schema(500) == %{ |> json_response_and_validate_schema(500) == %{
"error" => "error" =>
"Unexpected error occurred while creating pack. (POSIX error: Permission denied)" "Unexpected error occurred while creating pack. (POSIX error: Permission denied)"
@ -467,7 +475,7 @@ test "returns an error on deletes pack when the file system is not writable", %{
{File, [:passthrough], [rm_rf: fn ^path_pack -> {:error, :eacces, path_pack} end]} {File, [:passthrough], [rm_rf: fn ^path_pack -> {:error, :eacces, path_pack} end]}
]) do ]) do
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/pack?name=test_emoji_pack") |> delete("/api/v1/pleroma/emoji/pack?name=test_emoji_pack")
|> json_response_and_validate_schema(500) == %{ |> json_response_and_validate_schema(500) == %{
"error" => "error" =>
"Couldn't delete the `test_emoji_pack` pack (POSIX error: Permission denied)" "Couldn't delete the `test_emoji_pack` pack (POSIX error: Permission denied)"
@ -480,7 +488,7 @@ test "returns an error on deletes pack when the file system is not writable", %{
test "creating and deleting a pack", %{admin_conn: admin_conn} do test "creating and deleting a pack", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> post("/api/pleroma/emoji/pack?name=test_created") |> post("/api/v1/pleroma/emoji/pack?name=test_created")
|> json_response_and_validate_schema(200) == "ok" |> json_response_and_validate_schema(200) == "ok"
assert File.exists?("#{@emoji_path}/test_created/pack.json") assert File.exists?("#{@emoji_path}/test_created/pack.json")
@ -492,7 +500,7 @@ test "creating and deleting a pack", %{admin_conn: admin_conn} do
} }
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/pack?name=test_created") |> delete("/api/v1/pleroma/emoji/pack?name=test_created")
|> json_response_and_validate_schema(200) == "ok" |> json_response_and_validate_schema(200) == "ok"
refute File.exists?("#{@emoji_path}/test_created/pack.json") refute File.exists?("#{@emoji_path}/test_created/pack.json")
@ -505,7 +513,7 @@ test "if pack exists", %{admin_conn: admin_conn} do
File.write!(Path.join(path, "pack.json"), pack_file) File.write!(Path.join(path, "pack.json"), pack_file)
assert admin_conn assert admin_conn
|> post("/api/pleroma/emoji/pack?name=test_created") |> post("/api/v1/pleroma/emoji/pack?name=test_created")
|> json_response_and_validate_schema(:conflict) == %{ |> json_response_and_validate_schema(:conflict) == %{
"error" => "A pack named \"test_created\" already exists" "error" => "A pack named \"test_created\" already exists"
} }
@ -515,7 +523,7 @@ test "if pack exists", %{admin_conn: admin_conn} do
test "with empty name", %{admin_conn: admin_conn} do test "with empty name", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> post("/api/pleroma/emoji/pack?name= ") |> post("/api/v1/pleroma/emoji/pack?name= ")
|> json_response_and_validate_schema(:bad_request) == %{ |> json_response_and_validate_schema(:bad_request) == %{
"error" => "pack name cannot be empty" "error" => "pack name cannot be empty"
} }
@ -524,7 +532,7 @@ test "with empty name", %{admin_conn: admin_conn} do
test "deleting nonexisting pack", %{admin_conn: admin_conn} do test "deleting nonexisting pack", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/pack?name=non_existing") |> delete("/api/v1/pleroma/emoji/pack?name=non_existing")
|> json_response_and_validate_schema(:not_found) == %{ |> json_response_and_validate_schema(:not_found) == %{
"error" => "Pack non_existing does not exist" "error" => "Pack non_existing does not exist"
} }
@ -532,7 +540,7 @@ test "deleting nonexisting pack", %{admin_conn: admin_conn} do
test "deleting with empty name", %{admin_conn: admin_conn} do test "deleting with empty name", %{admin_conn: admin_conn} do
assert admin_conn assert admin_conn
|> delete("/api/pleroma/emoji/pack?name= ") |> delete("/api/v1/pleroma/emoji/pack?name= ")
|> json_response_and_validate_schema(:bad_request) == %{ |> json_response_and_validate_schema(:bad_request) == %{
"error" => "pack name cannot be empty" "error" => "pack name cannot be empty"
} }
@ -544,15 +552,22 @@ test "filesystem import", %{admin_conn: admin_conn, conn: conn} do
File.rm!("#{@emoji_path}/test_pack_for_import/pack.json") File.rm!("#{@emoji_path}/test_pack_for_import/pack.json")
end) end)
resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) resp =
conn
|> get("/api/v1/pleroma/emoji/packs")
|> json_response_and_validate_schema(200)
refute Map.has_key?(resp["packs"], "test_pack_for_import") refute Map.has_key?(resp["packs"], "test_pack_for_import")
assert admin_conn assert admin_conn
|> get("/api/pleroma/emoji/packs/import") |> get("/api/v1/pleroma/emoji/packs/import")
|> json_response_and_validate_schema(200) == ["test_pack_for_import"] |> json_response_and_validate_schema(200) == ["test_pack_for_import"]
resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) resp =
conn
|> get("/api/v1/pleroma/emoji/packs")
|> json_response_and_validate_schema(200)
assert resp["packs"]["test_pack_for_import"]["files"] == %{"blank" => "blank.png"} assert resp["packs"]["test_pack_for_import"]["files"] == %{"blank" => "blank.png"}
File.rm!("#{@emoji_path}/test_pack_for_import/pack.json") File.rm!("#{@emoji_path}/test_pack_for_import/pack.json")
@ -568,10 +583,13 @@ test "filesystem import", %{admin_conn: admin_conn, conn: conn} do
File.write!("#{@emoji_path}/test_pack_for_import/emoji.txt", emoji_txt_content) File.write!("#{@emoji_path}/test_pack_for_import/emoji.txt", emoji_txt_content)
assert admin_conn assert admin_conn
|> get("/api/pleroma/emoji/packs/import") |> get("/api/v1/pleroma/emoji/packs/import")
|> json_response_and_validate_schema(200) == ["test_pack_for_import"] |> json_response_and_validate_schema(200) == ["test_pack_for_import"]
resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) resp =
conn
|> get("/api/v1/pleroma/emoji/packs")
|> json_response_and_validate_schema(200)
assert resp["packs"]["test_pack_for_import"]["files"] == %{ assert resp["packs"]["test_pack_for_import"]["files"] == %{
"blank" => "blank.png", "blank" => "blank.png",
@ -580,7 +598,7 @@ test "filesystem import", %{admin_conn: admin_conn, conn: conn} do
} }
end end
describe "GET /api/pleroma/emoji/pack?name=:name" do describe "GET /api/v1/pleroma/emoji/pack?name=:name" do
test "shows pack.json", %{conn: conn} do test "shows pack.json", %{conn: conn} do
assert %{ assert %{
"files" => files, "files" => files,
@ -595,7 +613,7 @@ test "shows pack.json", %{conn: conn} do
} }
} = } =
conn conn
|> get("/api/pleroma/emoji/pack?name=test_pack") |> get("/api/v1/pleroma/emoji/pack?name=test_pack")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert files == %{"blank" => "blank.png", "blank2" => "blank2.png"} assert files == %{"blank" => "blank.png", "blank2" => "blank2.png"}
@ -605,7 +623,7 @@ test "shows pack.json", %{conn: conn} do
"files_count" => 2 "files_count" => 2
} = } =
conn conn
|> get("/api/pleroma/emoji/pack?name=test_pack&page_size=1") |> get("/api/v1/pleroma/emoji/pack?name=test_pack&page_size=1")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert files |> Map.keys() |> length() == 1 assert files |> Map.keys() |> length() == 1
@ -615,7 +633,7 @@ test "shows pack.json", %{conn: conn} do
"files_count" => 2 "files_count" => 2
} = } =
conn conn
|> get("/api/pleroma/emoji/pack?name=test_pack&page_size=1&page=2") |> get("/api/v1/pleroma/emoji/pack?name=test_pack&page_size=1&page=2")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert files |> Map.keys() |> length() == 1 assert files |> Map.keys() |> length() == 1
@ -635,13 +653,13 @@ test "for pack name with special chars", %{conn: conn} do
} }
} = } =
conn conn
|> get("/api/pleroma/emoji/pack?name=blobs.gg") |> get("/api/v1/pleroma/emoji/pack?name=blobs.gg")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
end end
test "non existing pack", %{conn: conn} do test "non existing pack", %{conn: conn} do
assert conn assert conn
|> get("/api/pleroma/emoji/pack?name=non_existing") |> get("/api/v1/pleroma/emoji/pack?name=non_existing")
|> json_response_and_validate_schema(:not_found) == %{ |> json_response_and_validate_schema(:not_found) == %{
"error" => "Pack non_existing does not exist" "error" => "Pack non_existing does not exist"
} }
@ -649,7 +667,7 @@ test "non existing pack", %{conn: conn} do
test "error name", %{conn: conn} do test "error name", %{conn: conn} do
assert conn assert conn
|> get("/api/pleroma/emoji/pack?name= ") |> get("/api/v1/pleroma/emoji/pack?name= ")
|> json_response_and_validate_schema(:bad_request) == %{ |> json_response_and_validate_schema(:bad_request) == %{
"error" => "pack name cannot be empty" "error" => "pack name cannot be empty"
} }

View file

@ -151,7 +151,10 @@ test "returns success result", %{conn: conn} do
assert conn assert conn
|> put_req_header("authorization", "Bearer #{token.token}") |> put_req_header("authorization", "Bearer #{token.token}")
|> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: code}) |> post("/api/pleroma/accounts/mfa/confirm/totp", %{
password: "test",
code: code
})
|> json_response(:ok) |> json_response(:ok)
settings = refresh_record(user).multi_factor_authentication_settings settings = refresh_record(user).multi_factor_authentication_settings
@ -162,7 +165,10 @@ test "returns success result", %{conn: conn} do
assert conn assert conn
|> put_req_header("authorization", "Bearer #{token2.token}") |> put_req_header("authorization", "Bearer #{token2.token}")
|> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: code}) |> post("/api/pleroma/accounts/mfa/confirm/totp", %{
password: "test",
code: code
})
|> json_response(403) == %{ |> json_response(403) == %{
"error" => "Insufficient permissions: write:security." "error" => "Insufficient permissions: write:security."
} }
@ -185,7 +191,10 @@ test "returns error if password incorrect", %{conn: conn} do
response = response =
conn conn
|> put_req_header("authorization", "Bearer #{token.token}") |> put_req_header("authorization", "Bearer #{token.token}")
|> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "xxx", code: code}) |> post("/api/pleroma/accounts/mfa/confirm/totp", %{
password: "xxx",
code: code
})
|> json_response(422) |> json_response(422)
settings = refresh_record(user).multi_factor_authentication_settings settings = refresh_record(user).multi_factor_authentication_settings
@ -212,7 +221,10 @@ test "returns error if code incorrect", %{conn: conn} do
response = response =
conn conn
|> put_req_header("authorization", "Bearer #{token.token}") |> put_req_header("authorization", "Bearer #{token.token}")
|> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: "code"}) |> post("/api/pleroma/accounts/mfa/confirm/totp", %{
password: "test",
code: "code"
})
|> json_response(422) |> json_response(422)
settings = refresh_record(user).multi_factor_authentication_settings settings = refresh_record(user).multi_factor_authentication_settings
@ -223,7 +235,10 @@ test "returns error if code incorrect", %{conn: conn} do
assert conn assert conn
|> put_req_header("authorization", "Bearer #{token2.token}") |> put_req_header("authorization", "Bearer #{token2.token}")
|> post("/api/pleroma/accounts/mfa/confirm/totp", %{password: "test", code: "code"}) |> post("/api/pleroma/accounts/mfa/confirm/totp", %{
password: "test",
code: "code"
})
|> json_response(403) == %{ |> json_response(403) == %{
"error" => "Insufficient permissions: write:security." "error" => "Insufficient permissions: write:security."
} }

View file

@ -10,12 +10,14 @@ defmodule Pleroma.Web.Plugs.RemoteIpTest do
import Pleroma.Tests.Helpers, only: [clear_config: 2] import Pleroma.Tests.Helpers, only: [clear_config: 2]
setup do: setup do
clear_config(RemoteIp, clear_config([RemoteIp, :enabled], true)
enabled: true, clear_config([RemoteIp, :headers], ["x-forwarded-for"])
headers: ["x-forwarded-for"], clear_config([RemoteIp, :proxies], [])
proxies: [],
reserved: [ clear_config(
[RemoteIp, :reserved],
[
"127.0.0.0/8", "127.0.0.0/8",
"::1/128", "::1/128",
"fc00::/7", "fc00::/7",
@ -24,14 +26,16 @@ defmodule Pleroma.Web.Plugs.RemoteIpTest do
"192.168.0.0/16" "192.168.0.0/16"
] ]
) )
end
test "disabled" do test "disabled" do
clear_config(RemoteIp, enabled: false) clear_config([RemoteIp, :enabled], false)
%{remote_ip: remote_ip} = conn(:get, "/") %{remote_ip: remote_ip} = conn(:get, "/")
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("x-forwarded-for", "1.1.1.1") |> put_req_header("x-forwarded-for", "1.1.1.1")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)
@ -40,7 +44,8 @@ test "disabled" do
test "enabled" do test "enabled" do
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("x-forwarded-for", "1.1.1.1") |> put_req_header("x-forwarded-for", "1.1.1.1")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)
@ -48,17 +53,20 @@ test "enabled" do
end end
test "custom headers" do test "custom headers" do
clear_config(RemoteIp, enabled: true, headers: ["cf-connecting-ip"]) clear_config([RemoteIp, :enabled], true)
clear_config([RemoteIp, :headers], ["cf-connecting-ip"])
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("x-forwarded-for", "1.1.1.1") |> put_req_header("x-forwarded-for", "1.1.1.1")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)
refute conn.remote_ip == {1, 1, 1, 1} refute conn.remote_ip == {1, 1, 1, 1}
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("cf-connecting-ip", "1.1.1.1") |> put_req_header("cf-connecting-ip", "1.1.1.1")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)
@ -67,7 +75,8 @@ test "custom headers" do
test "custom proxies" do test "custom proxies" do
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1, 173.245.48.2") |> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1, 173.245.48.2")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)
@ -76,7 +85,8 @@ test "custom proxies" do
clear_config([RemoteIp, :proxies], ["173.245.48.0/20"]) clear_config([RemoteIp, :proxies], ["173.245.48.0/20"])
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1, 173.245.48.2") |> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1, 173.245.48.2")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)
@ -87,7 +97,8 @@ test "proxies set without CIDR format" do
clear_config([RemoteIp, :proxies], ["173.245.48.1"]) clear_config([RemoteIp, :proxies], ["173.245.48.1"])
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1") |> put_req_header("x-forwarded-for", "173.245.48.1, 1.1.1.1")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)
@ -99,7 +110,8 @@ test "proxies set `nonsensical` CIDR" do
clear_config([RemoteIp, :proxies], ["10.0.0.3/24"]) clear_config([RemoteIp, :proxies], ["10.0.0.3/24"])
conn = conn =
conn(:get, "/") :get
|> conn("/")
|> put_req_header("x-forwarded-for", "10.0.0.3, 1.1.1.1") |> put_req_header("x-forwarded-for", "10.0.0.3, 1.1.1.1")
|> RemoteIp.call(nil) |> RemoteIp.call(nil)

View file

@ -14,11 +14,11 @@ defmodule Pleroma.Web.TwitterAPI.PasswordControllerTest do
import Pleroma.Factory import Pleroma.Factory
import Swoosh.TestAssertions import Swoosh.TestAssertions
describe "GET /api/pleroma/password_reset/token" do describe "GET /api/v1/pleroma/password_reset/token" do
test "it returns error when token invalid", %{conn: conn} do test "it returns error when token invalid", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/password_reset/token") |> get("/api/v1/pleroma/password_reset/token")
|> html_response(:ok) |> html_response(:ok)
assert response =~ "<h2>Invalid Token</h2>" assert response =~ "<h2>Invalid Token</h2>"
@ -30,7 +30,7 @@ test "it shows password reset form", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/password_reset/#{token.token}") |> get("/api/v1/pleroma/password_reset/#{token.token}")
|> html_response(:ok) |> html_response(:ok)
assert response =~ "<h2>Password Reset for #{user.nickname}</h2>" assert response =~ "<h2>Password Reset for #{user.nickname}</h2>"
@ -45,14 +45,14 @@ test "it returns an error when the token has expired", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/password_reset/#{token.token}") |> get("/api/v1/pleroma/password_reset/#{token.token}")
|> html_response(:ok) |> html_response(:ok)
assert response =~ "<h2>Invalid Token</h2>" assert response =~ "<h2>Invalid Token</h2>"
end end
end end
describe "POST /api/pleroma/password_reset" do describe "POST /api/v1/pleroma/password_reset" do
test "it fails for an expired token", %{conn: conn} do test "it fails for an expired token", %{conn: conn} do
clear_config([:instance, :password_reset_token_validity], 0) clear_config([:instance, :password_reset_token_validity], 0)
@ -70,7 +70,7 @@ test "it fails for an expired token", %{conn: conn} do
response = response =
conn conn
|> assign(:user, user) |> assign(:user, user)
|> post("/api/pleroma/password_reset", %{data: params}) |> post("/api/v1/pleroma/password_reset", %{data: params})
|> html_response(:ok) |> html_response(:ok)
refute response =~ "<h2>Password changed!</h2>" refute response =~ "<h2>Password changed!</h2>"
@ -90,7 +90,7 @@ test "it returns HTTP 200", %{conn: conn} do
response = response =
conn conn
|> assign(:user, user) |> assign(:user, user)
|> post("/api/pleroma/password_reset", %{data: params}) |> post("/api/v1/pleroma/password_reset", %{data: params})
|> html_response(:ok) |> html_response(:ok)
assert response =~ "<h2>Password changed!</h2>" assert response =~ "<h2>Password changed!</h2>"
@ -114,7 +114,7 @@ test "it sets password_reset_pending to false", %{conn: conn} do
conn conn
|> assign(:user, user) |> assign(:user, user)
|> post("/api/pleroma/password_reset", %{data: params}) |> post("/api/v1/pleroma/password_reset", %{data: params})
|> html_response(:ok) |> html_response(:ok)
assert User.get_by_id(user.id).password_reset_pending == false assert User.get_by_id(user.id).password_reset_pending == false

View file

@ -77,11 +77,11 @@ test "returns everything in :pleroma, :frontend_configurations", %{conn: conn} d
end end
end end
describe "/api/pleroma/emoji" do describe "/api/v1/pleroma/emoji" do
test "returns json with custom emoji with tags", %{conn: conn} do test "returns json with custom emoji with tags", %{conn: conn} do
emoji = emoji =
conn conn
|> get("/api/pleroma/emoji") |> get("/api/v1/pleroma/emoji")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert Enum.all?(emoji, fn assert Enum.all?(emoji, fn
@ -95,7 +95,7 @@ test "returns json with custom emoji with tags", %{conn: conn} do
end end
end end
describe "GET /api/pleroma/healthcheck" do describe "GET /api/v1/pleroma/healthcheck" do
setup do: clear_config([:instance, :healthcheck]) setup do: clear_config([:instance, :healthcheck])
test "returns 503 when healthcheck disabled", %{conn: conn} do test "returns 503 when healthcheck disabled", %{conn: conn} do
@ -103,7 +103,7 @@ test "returns 503 when healthcheck disabled", %{conn: conn} do
response = response =
conn conn
|> get("/api/pleroma/healthcheck") |> get("/api/v1/pleroma/healthcheck")
|> json_response_and_validate_schema(503) |> json_response_and_validate_schema(503)
assert response == %{} assert response == %{}
@ -116,7 +116,7 @@ test "returns 200 when healthcheck enabled and all ok", %{conn: conn} do
system_info: fn -> %Pleroma.Healthcheck{healthy: true} end do system_info: fn -> %Pleroma.Healthcheck{healthy: true} end do
response = response =
conn conn
|> get("/api/pleroma/healthcheck") |> get("/api/v1/pleroma/healthcheck")
|> json_response_and_validate_schema(200) |> json_response_and_validate_schema(200)
assert %{ assert %{
@ -136,7 +136,7 @@ test "returns 503 when healthcheck enabled and health is false", %{conn: conn} d
system_info: fn -> %Pleroma.Healthcheck{healthy: false} end do system_info: fn -> %Pleroma.Healthcheck{healthy: false} end do
response = response =
conn conn
|> get("/api/pleroma/healthcheck") |> get("/api/v1/pleroma/healthcheck")
|> json_response_and_validate_schema(503) |> json_response_and_validate_schema(503)
assert %{ assert %{
@ -334,7 +334,7 @@ test "it returns new captcha", %{conn: conn} do
new: fn -> "test_captcha" end do new: fn -> "test_captcha" end do
resp = resp =
conn conn
|> get("/api/pleroma/captcha") |> get("/api/v1/pleroma/captcha")
|> response(200) |> response(200)
assert resp == "\"test_captcha\"" assert resp == "\"test_captcha\""
@ -459,7 +459,10 @@ test "with proper permissions, valid password and valid email", %{
conn = conn =
conn conn
|> put_req_header("content-type", "multipart/form-data") |> put_req_header("content-type", "multipart/form-data")
|> post("/api/pleroma/change_email", %{password: "test", email: "cofe@foobar.com"}) |> post("/api/pleroma/change_email", %{
password: "test",
email: "cofe@foobar.com"
})
assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"} assert json_response_and_validate_schema(conn, 200) == %{"status" => "success"}
end end
@ -961,7 +964,9 @@ test "with permissions, account does not have such alias", %{
conn = conn =
conn conn
|> put_req_header("content-type", "application/json") |> put_req_header("content-type", "application/json")
|> delete("/api/pleroma/aliases", %{alias: non_alias_user |> User.full_nickname()}) |> delete("/api/pleroma/aliases", %{
alias: non_alias_user |> User.full_nickname()
})
assert %{"error" => "Account has no such alias."} = assert %{"error" => "Account has no such alias."} =
json_response_and_validate_schema(conn, 404) json_response_and_validate_schema(conn, 404)

View file

@ -123,7 +123,10 @@ def eval_quoted(block, binding) do
defp start_peer({node_host, override_configs}) do defp start_peer({node_host, override_configs}) do
log(node_host, "booting federated VM") log(node_host, "booting federated VM")
{:ok, node} = :peer.start(%{host: ~c"127.0.0.1", name: node_name(node_host), args: vm_args()})
{:ok, _pid, node} =
:peer.start(%{host: ~c"127.0.0.1", name: node_name(node_host), args: vm_args()})
add_code_paths(node) add_code_paths(node)
load_apps_and_transfer_configuration(node, override_configs) load_apps_and_transfer_configuration(node, override_configs)
ensure_apps_started(node) ensure_apps_started(node)