diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/media.ex | 23 | ||||
-rw-r--r-- | lib/pleroma/object.ex | 58 | ||||
-rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 2 | ||||
-rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub_controller.ex | 11 |
4 files changed, 52 insertions, 42 deletions
diff --git a/lib/pleroma/media.ex b/lib/pleroma/media.ex index b9b001366..965041809 100644 --- a/lib/pleroma/media.ex +++ b/lib/pleroma/media.ex @@ -8,7 +8,7 @@ defmodule Pleroma.Media do alias Pleroma.User @derive {Jason.Encoder, - only: [:href, :type, :media_type, :name, :blurhash, :meta, :object_id, :user_id]} + only: [:href, :type, :media_type, :name, :blurhash, :meta, :object_id, :actor]} @type t() :: %__MODULE__{} @@ -19,16 +19,16 @@ defmodule Pleroma.Media do field(:name, :string) field(:blurhash, :string) field(:meta, :map) + field(:actor, :string) field(:removable, :boolean, virtual: true, default: false) belongs_to(:object, Pleroma.Object) - belongs_to(:user, Pleroma.User, type: FlakeId.Ecto.CompatType) timestamps() end - def create_from_object_data(%{"url" => [url]} = data, %{user: user} = opts) do + def create_from_object_data(%{"url" => [url]} = data, %{actor: actor} = opts) do object_id = get_in(opts, [:object, "id"]) || Map.get(opts, :object_id) %Media{} @@ -39,7 +39,7 @@ defmodule Pleroma.Media do name: data["name"], blurhash: nil, meta: %{}, - user_id: user.id, + actor: actor, object_id: object_id }) |> Repo.insert() @@ -49,7 +49,12 @@ defmodule Pleroma.Media do def get_by_id(id), do: Repo.get(Media, id) @spec authorize_access(Media.t(), User.t()) :: :ok | {:error, :forbidden} - def authorize_access(%Media{user_id: user_id}, %User{id: user_id}), do: :ok + def authorize_access(%Media{actor: ap_id}, %User{ap_id: ap_id}), do: :ok + + def authorize_access(_media, %User{is_admin: is_admin?, is_moderator: is_moderator?}) + when true in [is_admin?, is_moderator?], + do: :ok + def authorize_access(_media, _user), do: {:error, :forbidden} def update(%Media{} = media, attrs \\ %{}) do @@ -58,10 +63,6 @@ defmodule Pleroma.Media do |> Repo.update() end - def from_object(%Pleroma.Object{data: data}, %{user: user}) do - %Media{href: data["href"], user_id: user.id} - end - def insert(%Media{} = media) do media |> changeset() @@ -70,7 +71,7 @@ defmodule Pleroma.Media do def changeset(struct, params \\ %{}) do struct - |> cast(params, [:href, :type, :media_type, :name, :blurhash, :meta, :user_id, :object_id]) + |> cast(params, [:href, :type, :media_type, :name, :blurhash, :meta, :actor, :object_id]) |> validate_required([:href, :type, :media_type]) end @@ -88,7 +89,7 @@ defmodule Pleroma.Media do "type" => "Document", "blurhash" => media.blurhash, "mediaType" => media.media_type, - "actor" => User.get_by_id(media.user_id).ap_id + "actor" => media.actor } end end diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index a794b13c2..fb61d4796 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -52,7 +52,7 @@ defmodule Pleroma.Object do def create(data) do Object.change(%Object{}, %{data: data}) |> Repo.insert() - |> maybe_handle_attachments() + |> maybe_set_media_object_id() end def change(struct, params \\ %{}) do @@ -60,6 +60,7 @@ defmodule Pleroma.Object do |> cast(params, [:data]) |> validate_required([:data]) |> unique_constraint(:ap_id, name: :objects_unique_apid_index) + |> maybe_create_media() end def get_by_id(nil), do: nil @@ -352,32 +353,45 @@ defmodule Pleroma.Object do def self_replies(object, opts \\ []), do: replies(object, Keyword.put(opts, :self_only, true)) - defp maybe_handle_attachments( - {:ok, - %Object{id: object_id, data: %{"attachment" => [_ | _] = attachments} = data} = object} = - result + defp maybe_create_media( + %{ + valid?: true, + changes: %{data: %{"actor" => actor, "attachment" => [_ | _] = attachments}} + } = changeset ) do - Enum.each(attachments, fn attachment -> - case attachment["id"] do - # New media incoming - nil -> - Media.create_from_object_data(attachment, %{ - user: User.get_by_ap_id(data["actor"]), - object_id: object_id - }) - - # Media pre-uploaded for a post - media_id -> - media_id - |> Media.get_by_id() - |> Media.update(%{object_id: object_id}) - end + new_attachments = + Enum.map(attachments, fn attachment -> + if is_nil(attachment["id"]) do + {:ok, media} = Media.create_from_object_data(attachment, %{actor: actor}) + + Map.put(attachment, "id", media.id) + else + attachment + end + end) + + %{ + changeset + | changes: %{ + changeset.changes + | data: %{changeset.changes.data | "attachment" => new_attachments} + } + } + end - object + defp maybe_create_media(changeset), do: changeset + + defp maybe_set_media_object_id( + {:ok, %Object{id: object_id, data: %{"attachment" => [_ | _] = attachments}}} = result + ) do + Enum.each(attachments, fn %{"id" => media_id} -> + media_id + |> Media.get_by_id() + |> Media.update(%{object_id: object_id}) end) result end - defp maybe_handle_attachments(result), do: result + defp maybe_set_media_object_id(result), do: result end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 4322fc729..cf0cc604c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1202,7 +1202,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do def upload(file, opts \\ []) do with {:ok, data} <- Upload.store(file, opts), %User{} = user <- opts[:user] do - Pleroma.Media.create_from_object_data(data, %{user: user}) + Pleroma.Media.create_from_object_data(data, %{actor: user.ap_id}) end end diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index ecb632b75..4f0a186eb 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -272,12 +272,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do end end - def inbox(conn, params) do - IO.inspect(%{conn: conn, params: params}) - inbox2(conn, params) - end - - def inbox2(%{assigns: %{valid_signature: true}} = conn, %{"nickname" => nickname} = params) do + def inbox(%{assigns: %{valid_signature: true}} = conn, %{"nickname" => nickname} = params) do with %User{} = recipient <- User.get_cached_by_nickname(nickname), {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(params["actor"]), true <- Utils.recipient_in_message(recipient, actor, params), @@ -287,13 +282,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do end end - def inbox2(%{assigns: %{valid_signature: true}} = conn, params) do + def inbox(%{assigns: %{valid_signature: true}} = conn, params) do Federator.incoming_ap_doc(params) json(conn, "ok") end # POST /relay/inbox -or- POST /internal/fetch/inbox - def inbox2(conn, params) do + def inbox(conn, params) do if params["type"] == "Create" && FederatingPlug.federating?() do post_inbox_relayed_create(conn, params) else |