projects
/
akkoma
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
UpdateValidator: Only allow updates from the user themselves.
[akkoma]
/
lib
/
pleroma
/
web
/
activity_pub
/
object_validators
/
chat_message_validator.ex
diff --git
a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex
b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex
index e87c1ac2e217bdb48cac07f3a6c2775a4a463531..c481d79e0483aa11c7ca68da75943127cb275be8 100644
(file)
--- a/
lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex
+++ b/
lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex
@@
-5,8
+5,9
@@
defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do
use Ecto.Schema
defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do
use Ecto.Schema
+ alias Pleroma.EctoType.ActivityPub.ObjectValidators
alias Pleroma.User
alias Pleroma.User
- alias Pleroma.Web.ActivityPub.ObjectValidators.
Types
+ alias Pleroma.Web.ActivityPub.ObjectValidators.
AttachmentValidator
import Ecto.Changeset
import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1]
import Ecto.Changeset
import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1]
@@
-15,13
+16,15
@@
defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do
@derive Jason.Encoder
embedded_schema do
@derive Jason.Encoder
embedded_schema do
- field(:id,
Type
s.ObjectID, primary_key: true)
- field(:to,
Type
s.Recipients, default: [])
+ field(:id,
ObjectValidator
s.ObjectID, primary_key: true)
+ field(:to,
ObjectValidator
s.Recipients, default: [])
field(:type, :string)
field(:type, :string)
- field(:content,
Type
s.SafeText)
- field(:actor,
Type
s.ObjectID)
- field(:published,
Type
s.DateTime)
+ field(:content,
ObjectValidator
s.SafeText)
+ field(:actor,
ObjectValidator
s.ObjectID)
+ field(:published,
ObjectValidator
s.DateTime)
field(:emoji, :map, default: %{})
field(:emoji, :map, default: %{})
+
+ embeds_one(:attachment, AttachmentValidator)
end
def cast_and_apply(data) do
end
def cast_and_apply(data) do
@@
-44,25
+47,47
@@
defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do
def fix(data) do
data
|> fix_emoji()
def fix(data) do
data
|> fix_emoji()
+ |> fix_attachment()
|> Map.put_new("actor", data["attributedTo"])
end
|> Map.put_new("actor", data["attributedTo"])
end
+ # Throws everything but the first one away
+ def fix_attachment(%{"attachment" => [attachment | _]} = data) do
+ data
+ |> Map.put("attachment", attachment)
+ end
+
+ def fix_attachment(data), do: data
+
def changeset(struct, data) do
data = fix(data)
struct
def changeset(struct, data) do
data = fix(data)
struct
- |> cast(data, __schema__(:fields))
+ |> cast(data, List.delete(__schema__(:fields), :attachment))
+ |> cast_embed(:attachment)
end
def validate_data(data_cng) do
data_cng
|> validate_inclusion(:type, ["ChatMessage"])
end
def validate_data(data_cng) do
data_cng
|> validate_inclusion(:type, ["ChatMessage"])
- |> validate_required([:id, :actor, :to, :type, :content, :published])
+ |> validate_required([:id, :actor, :to, :type, :published])
+ |> validate_content_or_attachment()
|> validate_length(:to, is: 1)
|> validate_length(:content, max: Pleroma.Config.get([:instance, :remote_limit]))
|> validate_local_concern()
end
|> validate_length(:to, is: 1)
|> validate_length(:content, max: Pleroma.Config.get([:instance, :remote_limit]))
|> validate_local_concern()
end
+ def validate_content_or_attachment(cng) do
+ attachment = get_field(cng, :attachment)
+
+ if attachment do
+ cng
+ else
+ cng
+ |> validate_required([:content])
+ end
+ end
+
@doc """
Validates the following
- If both users are in our system
@doc """
Validates the following
- If both users are in our system