diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/mix/tasks/pleroma/relay.ex | 10 | ||||
| -rw-r--r-- | lib/pleroma/following_relationship.ex | 8 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 17 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 7 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/builder.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/activity_pub/relay.ex | 56 | ||||
| -rw-r--r-- | lib/pleroma/web/admin_api/controllers/relay_controller.ex | 2 | ||||
| -rw-r--r-- | lib/pleroma/web/api_spec/operations/admin/relay_operation.ex | 50 | 
8 files changed, 84 insertions, 68 deletions
diff --git a/lib/mix/tasks/pleroma/relay.ex b/lib/mix/tasks/pleroma/relay.ex index c3312507e..a6d8d6c1c 100644 --- a/lib/mix/tasks/pleroma/relay.ex +++ b/lib/mix/tasks/pleroma/relay.ex @@ -35,10 +35,16 @@ defmodule Mix.Tasks.Pleroma.Relay do    def run(["list"]) do      start_pleroma() -    with {:ok, list} <- Relay.list(true) do -      list |> Enum.each(&shell_info(&1)) +    with {:ok, list} <- Relay.list() do +      Enum.each(list, &print_relay_url/1)      else        {:error, e} -> shell_error("Error while fetching relay subscription list: #{inspect(e)}")      end    end + +  defp print_relay_url(%{followed_back: false} = relay) do +    shell_info("#{relay.actor} - no Accept received (relay didn't follow back)") +  end + +  defp print_relay_url(relay), do: shell_info(relay.actor)  end diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 83b366dd4..2039a259d 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -264,4 +264,12 @@ defmodule Pleroma.FollowingRelationship do        end      end)    end + +  @spec following_ap_ids(User.t()) :: [String.t()] +  def following_ap_ids(%User{} = user) do +    user +    |> following_query() +    |> select([r, u], u.ap_id) +    |> Repo.all() +  end  end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index a9820affa..d2ad9516f 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -247,6 +247,13 @@ defmodule Pleroma.User do      end    end +  defdelegate following_count(user), to: FollowingRelationship +  defdelegate following(user), to: FollowingRelationship +  defdelegate following?(follower, followed), to: FollowingRelationship +  defdelegate following_ap_ids(user), to: FollowingRelationship +  defdelegate get_follow_requests(user), to: FollowingRelationship +  defdelegate search(query, opts \\ []), to: User.Search +    @doc """    Dumps Flake Id to SQL-compatible format (16-byte UUID).    E.g. "9pQtDGXuq4p3VlcJEm" -> <<0, 0, 1, 110, 179, 218, 42, 92, 213, 41, 44, 227, 95, 213, 0, 0>> @@ -372,8 +379,6 @@ defmodule Pleroma.User do      from(u in query, where: u.deactivated != ^true)    end -  defdelegate following_count(user), to: FollowingRelationship -    defp truncate_fields_param(params) do      if Map.has_key?(params, :fields) do        Map.put(params, :fields, Enum.map(params[:fields], &truncate_field/1)) @@ -868,8 +873,6 @@ defmodule Pleroma.User do      set_cache(follower)    end -  defdelegate following(user), to: FollowingRelationship -    def follow(%User{} = follower, %User{} = followed, state \\ :follow_accept) do      deny_follow_blocked = Config.get([:user, :deny_follow_blocked]) @@ -923,8 +926,6 @@ defmodule Pleroma.User do      end    end -  defdelegate following?(follower, followed), to: FollowingRelationship -    @doc "Returns follow state as Pleroma.FollowingRelationship.State value"    def get_follow_state(%User{} = follower, %User{} = following) do      following_relationship = FollowingRelationship.get(follower, following) @@ -1189,8 +1190,6 @@ defmodule Pleroma.User do      |> Repo.all()    end -  defdelegate get_follow_requests(user), to: FollowingRelationship -    def increase_note_count(%User{} = user) do      User      |> where(id: ^user.id) @@ -2163,8 +2162,6 @@ defmodule Pleroma.User do      |> Repo.all()    end -  defdelegate search(query, opts \\ []), to: User.Search -    defp put_password_hash(           %Ecto.Changeset{valid?: true, changes: %{password: password}} = changeset         ) do diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 8c5b7dac2..624a508ae 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1344,9 +1344,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    end    def maybe_handle_clashing_nickname(data) do -    nickname = data[:nickname] - -    with %User{} = old_user <- User.get_by_nickname(nickname), +    with nickname when is_binary(nickname) <- data[:nickname], +         %User{} = old_user <- User.get_by_nickname(nickname),           {_, false} <- {:ap_id_comparison, data[:ap_id] == old_user.ap_id} do        Logger.info(          "Found an old user for #{nickname}, the old ap id is #{old_user.ap_id}, new one is #{ @@ -1360,7 +1359,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      else        {:ap_id_comparison, true} ->          Logger.info( -          "Found an old user for #{nickname}, but the ap id #{data[:ap_id]} is the same as the new user. Race condition? Not changing anything." +          "Found an old user for #{data[:nickname]}, but the ap id #{data[:ap_id]} is the same as the new user. Race condition? Not changing anything."          )        _ -> diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index f2392ce79..9a7b7d9de 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -215,7 +215,7 @@ defmodule Pleroma.Web.ActivityPub.Builder do      to =        cond do -        actor.ap_id == Relay.relay_ap_id() -> +        actor.ap_id == Relay.ap_id() ->            [actor.follower_address]          public? -> diff --git a/lib/pleroma/web/activity_pub/relay.ex b/lib/pleroma/web/activity_pub/relay.ex index b09764d2b..b65710a94 100644 --- a/lib/pleroma/web/activity_pub/relay.ex +++ b/lib/pleroma/web/activity_pub/relay.ex @@ -10,19 +10,13 @@ defmodule Pleroma.Web.ActivityPub.Relay do    alias Pleroma.Web.CommonAPI    require Logger -  @relay_nickname "relay" +  @nickname "relay" -  def get_actor do -    actor = -      relay_ap_id() -      |> User.get_or_create_service_actor_by_ap_id(@relay_nickname) +  @spec ap_id() :: String.t() +  def ap_id, do: "#{Pleroma.Web.Endpoint.url()}/#{@nickname}" -    actor -  end - -  def relay_ap_id do -    "#{Pleroma.Web.Endpoint.url()}/relay" -  end +  @spec get_actor() :: User.t() | nil +  def get_actor, do: User.get_or_create_service_actor_by_ap_id(ap_id(), @nickname)    @spec follow(String.t()) :: {:ok, Activity.t()} | {:error, any()}    def follow(target_instance) do @@ -61,34 +55,38 @@ defmodule Pleroma.Web.ActivityPub.Relay do    def publish(_), do: {:error, "Not implemented"} -  @spec list(boolean()) :: {:ok, [String.t()]} | {:error, any()} -  def list(with_not_accepted \\ false) do +  @spec list() :: {:ok, [%{actor: String.t(), followed_back: boolean()}]} | {:error, any()} +  def list do      with %User{} = user <- get_actor() do        accepted =          user -        |> User.following() -        |> Enum.map(fn entry -> URI.parse(entry).host end) -        |> Enum.uniq() - -      list = -        if with_not_accepted do -          without_accept = -            user -            |> Pleroma.Activity.following_requests_for_actor() -            |> Enum.map(fn a -> URI.parse(a.data["object"]).host <> " (no Accept received)" end) -            |> Enum.uniq() +        |> following() +        |> Enum.map(fn actor -> %{actor: actor, followed_back: true} end) -          accepted ++ without_accept -        else -          accepted -        end +      without_accept = +        user +        |> Pleroma.Activity.following_requests_for_actor() +        |> Enum.map(fn activity -> %{actor: activity.data["object"], followed_back: false} end) +        |> Enum.uniq() -      {:ok, list} +      {:ok, accepted ++ without_accept}      else        error -> format_error(error)      end    end +  @spec following() :: [String.t()] +  def following do +    get_actor() +    |> following() +  end + +  defp following(user) do +    user +    |> User.following_ap_ids() +    |> Enum.uniq() +  end +    defp format_error({:error, error}), do: format_error(error)    defp format_error(error) do diff --git a/lib/pleroma/web/admin_api/controllers/relay_controller.ex b/lib/pleroma/web/admin_api/controllers/relay_controller.ex index cf9f3a14b..95d06dde7 100644 --- a/lib/pleroma/web/admin_api/controllers/relay_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/relay_controller.ex @@ -39,7 +39,7 @@ defmodule Pleroma.Web.AdminAPI.RelayController do          target: target        }) -      json(conn, target) +      json(conn, %{actor: target, followed_back: target in Relay.following()})      else        _ ->          conn diff --git a/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex b/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex index 67ee5eee0..e06b2d164 100644 --- a/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex @@ -27,8 +27,7 @@ defmodule Pleroma.Web.ApiSpec.Admin.RelayOperation do              properties: %{                relays: %Schema{                  type: :array, -                items: %Schema{type: :string}, -                example: ["lain.com", "mstdn.io"] +                items: relay()                }              }            }) @@ -43,19 +42,9 @@ defmodule Pleroma.Web.ApiSpec.Admin.RelayOperation do        operationId: "AdminAPI.RelayController.follow",        security: [%{"oAuth" => ["write:follows"]}],        parameters: admin_api_params(), -      requestBody: -        request_body("Parameters", %Schema{ -          type: :object, -          properties: %{ -            relay_url: %Schema{type: :string, format: :uri} -          } -        }), +      requestBody: request_body("Parameters", relay_url()),        responses: %{ -        200 => -          Operation.response("Status", "application/json", %Schema{ -            type: :string, -            example: "http://mastodon.example.org/users/admin" -          }) +        200 => Operation.response("Status", "application/json", relay())        }      }    end @@ -67,13 +56,7 @@ defmodule Pleroma.Web.ApiSpec.Admin.RelayOperation do        operationId: "AdminAPI.RelayController.unfollow",        security: [%{"oAuth" => ["write:follows"]}],        parameters: admin_api_params(), -      requestBody: -        request_body("Parameters", %Schema{ -          type: :object, -          properties: %{ -            relay_url: %Schema{type: :string, format: :uri} -          } -        }), +      requestBody: request_body("Parameters", relay_url()),        responses: %{          200 =>            Operation.response("Status", "application/json", %Schema{ @@ -83,4 +66,29 @@ defmodule Pleroma.Web.ApiSpec.Admin.RelayOperation do        }      }    end + +  defp relay do +    %Schema{ +      type: :object, +      properties: %{ +        actor: %Schema{ +          type: :string, +          example: "https://example.com/relay" +        }, +        followed_back: %Schema{ +          type: :boolean, +          description: "Is relay followed back by this actor?" +        } +      } +    } +  end + +  defp relay_url do +    %Schema{ +      type: :object, +      properties: %{ +        relay_url: %Schema{type: :string, format: :uri} +      } +    } +  end  end  | 
