import Ecto.Changeset
import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations
+ require Pleroma.Constants
+
alias Pleroma.EctoType.ActivityPub.ObjectValidators
@primary_key false
def cast_and_validate(data) do
data
+ |> maybe_fix_data_for_mastodon()
|> cast_data()
|> validate_data()
end
+ defp maybe_fix_data_for_mastodon(data) do
+ {:ok, actor} = Pleroma.User.get_or_fetch_by_ap_id(data["actor"])
+ # Mastodon sends pin/unpin objects without id, to, cc fields
+ data
+ |> Map.put_new("id", Pleroma.Web.ActivityPub.Utils.generate_activity_id())
+ |> Map.put_new("to", [Pleroma.Constants.as_public()])
+ |> Map.put_new("cc", [actor.follower_address])
+ end
+
defp cast_data(data) do
cast(%__MODULE__{}, data, __schema__(:fields))
end
end
defp validate_collection_belongs_to_actor(changeset) do
+ {:ok, actor} = Pleroma.User.get_or_fetch_by_ap_id(changeset.changes[:actor])
+
validate_change(changeset, :target, fn :target, target ->
- if String.starts_with?(target, changeset.changes[:actor]) do
+ if target == actor.featured_address do
[]
else
[target: "collection doesn't belong to actor"]