Max media attachment count
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
This commit is contained in:
parent
60deddb7e5
commit
e473bcf7a0
6 changed files with 58 additions and 2 deletions
|
@ -259,7 +259,8 @@ config :pleroma, :instance,
|
||||||
privileged_staff: false,
|
privileged_staff: false,
|
||||||
max_endorsed_users: 20,
|
max_endorsed_users: 20,
|
||||||
birthday_required: false,
|
birthday_required: false,
|
||||||
birthday_min_age: 0
|
birthday_min_age: 0,
|
||||||
|
max_media_attachments: 1_000
|
||||||
|
|
||||||
config :pleroma, :welcome,
|
config :pleroma, :welcome,
|
||||||
direct_message: [
|
direct_message: [
|
||||||
|
|
|
@ -552,6 +552,14 @@ config :pleroma, :config_description, [
|
||||||
100_000
|
100_000
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
%{
|
||||||
|
key: :max_media_attachments,
|
||||||
|
type: :integer,
|
||||||
|
description: "Maximum number of post media attachments",
|
||||||
|
suggestions: [
|
||||||
|
1_000_000
|
||||||
|
]
|
||||||
|
},
|
||||||
%{
|
%{
|
||||||
key: :upload_limit,
|
key: :upload_limit,
|
||||||
type: :integer,
|
type: :integer,
|
||||||
|
|
|
@ -112,7 +112,12 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do
|
||||||
|
|
||||||
defp attachments(%{params: params} = draft) do
|
defp attachments(%{params: params} = draft) do
|
||||||
attachments = Utils.attachments_from_ids(params)
|
attachments = Utils.attachments_from_ids(params)
|
||||||
%__MODULE__{draft | attachments: attachments}
|
draft = %__MODULE__{draft | attachments: attachments}
|
||||||
|
|
||||||
|
case Utils.validate_attachments_count(attachments) do
|
||||||
|
:ok -> draft
|
||||||
|
{:error, message} -> add_error(draft, message)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp in_reply_to(%{params: %{in_reply_to_status_id: ""}} = draft), do: draft
|
defp in_reply_to(%{params: %{in_reply_to_status_id: ""}} = draft), do: draft
|
||||||
|
|
|
@ -492,4 +492,19 @@ defmodule Pleroma.Web.CommonAPI.Utils do
|
||||||
{:error, dgettext("errors", "The status is over the character limit")}
|
{:error, dgettext("errors", "The status is over the character limit")}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def validate_attachments_count([] = _attachments) do
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate_attachments_count(attachments) do
|
||||||
|
limit = Config.get([:instance, :max_media_attachments])
|
||||||
|
count = length(attachments)
|
||||||
|
|
||||||
|
if count <= limit do
|
||||||
|
:ok
|
||||||
|
else
|
||||||
|
{:error, dgettext("errors", "Too many attachments")}
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -31,6 +31,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
|
||||||
approval_required: Keyword.get(instance, :account_approval_required),
|
approval_required: Keyword.get(instance, :account_approval_required),
|
||||||
# Extra (not present in Mastodon):
|
# Extra (not present in Mastodon):
|
||||||
max_toot_chars: Keyword.get(instance, :limit),
|
max_toot_chars: Keyword.get(instance, :limit),
|
||||||
|
max_media_attachments: Keyword.get(instance, :max_media_attachments),
|
||||||
poll_limits: Keyword.get(instance, :poll_limits),
|
poll_limits: Keyword.get(instance, :poll_limits),
|
||||||
upload_limit: Keyword.get(instance, :upload_limit),
|
upload_limit: Keyword.get(instance, :upload_limit),
|
||||||
avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
|
avatar_upload_limit: Keyword.get(instance, :avatar_upload_limit),
|
||||||
|
|
|
@ -683,6 +683,32 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
assert {:ok, _activity} = CommonAPI.post(user, %{status: "12345"})
|
assert {:ok, _activity} = CommonAPI.post(user, %{status: "12345"})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "it validates media attachment limits are correctly enforced" do
|
||||||
|
clear_config([:instance, :max_media_attachments], 4)
|
||||||
|
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
file = %Plug.Upload{
|
||||||
|
content_type: "image/jpeg",
|
||||||
|
path: Path.absname("test/fixtures/image.jpg"),
|
||||||
|
filename: "an_image.jpg"
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
|
||||||
|
|
||||||
|
assert {:error, "Too many attachments"} =
|
||||||
|
CommonAPI.post(user, %{
|
||||||
|
status: "",
|
||||||
|
media_ids: List.duplicate(upload.id, 5)
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, _activity} =
|
||||||
|
CommonAPI.post(user, %{
|
||||||
|
status: "",
|
||||||
|
media_ids: [upload.id]
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
test "it can handle activities that expire" do
|
test "it can handle activities that expire" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue