diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/web/activity_pub/transmogrifier.ex | 43 | ||||
| -rw-r--r-- | lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 | 
2 files changed, 43 insertions, 2 deletions
| diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 803445011..eaa716cea 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do    alias Pleroma.Activity    alias Pleroma.Repo    alias Pleroma.Web.ActivityPub.ActivityPub +  alias Pleroma.Web.ActivityPub.Utils    import Ecto.Query @@ -145,6 +146,48 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do      end    end +  defp get_follow_activity(follow_object) do +    cond do +      is_map(follow_object) -> +        {:ok, follow_object} + +      is_binary(follow_object) -> +        object = get_obj_helper(follow_object) || ActivityPub.fetch_object_from_id(follow_object) +        if object do +          {:ok, object} +        else +          {:error, nil} +        end + +      true -> +        {:error, nil} +    end +  end + +  def handle_incoming( +        %{"type" => "Accept", "object" => follow_object, "actor" => actor, "id" => id} = data +      ) do +    with %User{} = followed <- User.get_or_fetch_by_ap_id(actor), +         {:ok, follow_activity} <- get_follow_activity(follow_object), +         %User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity["actor"]) do +      User.follow(follower, followed) + +      {:ok, data} +    end +  end + +  def handle_incoming( +        %{"type" => "Reject", "object" => follow_object, "actor" => actor, "id" => id} = data +      ) do +    with %User{} = followed <- User.get_or_fetch_by_ap_id(actor), +         {:ok, follow_activity} <- get_follow_activity(follow_object), +         %User{local: true} = follower <- User.get_cached_by_ap_id(follow_activity["actor"]), +         {:ok, follow_activity} <- Utils.fetch_latest_follow(follower, followed), +         {:ok, activity} <- ActivityPub.delete(follow_activity, false) do +      {:ok, activity} +    end +  end +    def handle_incoming(          %{"type" => "Like", "object" => object_id, "actor" => actor, "id" => id} = _data        ) do diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 460942f1a..d50d2d9b5 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -429,7 +429,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do    def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do      with %User{} = followed <- Repo.get(User, id), -         {:ok, follower} <- User.follow(follower, followed),           {:ok, _activity} <- ActivityPub.follow(follower, followed) do        render(conn, AccountView, "relationship.json", %{user: follower, target: followed})      else @@ -442,7 +441,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do    def follow(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do      with %User{} = followed <- Repo.get_by(User, nickname: uri), -         {:ok, follower} <- User.follow(follower, followed),           {:ok, _activity} <- ActivityPub.follow(follower, followed) do        render(conn, AccountView, "account.json", %{user: followed})      else | 
