diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/pleroma/user.ex | 51 | ||||
| -rw-r--r-- | lib/pleroma/user/import.ex | 91 | ||||
| -rw-r--r-- | lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex | 57 | ||||
| -rw-r--r-- | lib/pleroma/web/router.ex | 7 | ||||
| -rw-r--r-- | lib/pleroma/web/twitter_api/controllers/util_controller.ex | 35 | ||||
| -rw-r--r-- | lib/pleroma/workers/background_worker.ex | 11 | 
6 files changed, 161 insertions, 91 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 94c96de8d..be2ef0d1b 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1686,42 +1686,6 @@ defmodule Pleroma.User do    def perform(:deactivate_async, user, status), do: deactivate(user, status) -  @spec perform(atom(), User.t(), list()) :: list() | {:error, any()} -  def perform(:blocks_import, %User{} = blocker, blocked_identifiers) -      when is_list(blocked_identifiers) do -    Enum.map( -      blocked_identifiers, -      fn blocked_identifier -> -        with {:ok, %User{} = blocked} <- get_or_fetch(blocked_identifier), -             {:ok, _block} <- CommonAPI.block(blocker, blocked) do -          blocked -        else -          err -> -            Logger.debug("blocks_import failed for #{blocked_identifier} with: #{inspect(err)}") -            err -        end -      end -    ) -  end - -  def perform(:follow_import, %User{} = follower, followed_identifiers) -      when is_list(followed_identifiers) do -    Enum.map( -      followed_identifiers, -      fn followed_identifier -> -        with {:ok, %User{} = followed} <- get_or_fetch(followed_identifier), -             {:ok, follower} <- maybe_direct_follow(follower, followed), -             {:ok, _, _, _} <- CommonAPI.follow(follower, followed) do -          followed -        else -          err -> -            Logger.debug("follow_import failed for #{followed_identifier} with: #{inspect(err)}") -            err -        end -      end -    ) -  end -    @spec external_users_query() :: Ecto.Query.t()    def external_users_query do      User.Query.build(%{ @@ -1750,21 +1714,6 @@ defmodule Pleroma.User do      Repo.all(query)    end -  def blocks_import(%User{} = blocker, blocked_identifiers) when is_list(blocked_identifiers) do -    BackgroundWorker.enqueue("blocks_import", %{ -      "blocker_id" => blocker.id, -      "blocked_identifiers" => blocked_identifiers -    }) -  end - -  def follow_import(%User{} = follower, followed_identifiers) -      when is_list(followed_identifiers) do -    BackgroundWorker.enqueue("follow_import", %{ -      "follower_id" => follower.id, -      "followed_identifiers" => followed_identifiers -    }) -  end -    def delete_notifications_from_user_activities(%User{ap_id: ap_id}) do      Notification      |> join(:inner, [n], activity in assoc(n, :activity)) diff --git a/lib/pleroma/user/import.ex b/lib/pleroma/user/import.ex new file mode 100644 index 000000000..de27bdc4c --- /dev/null +++ b/lib/pleroma/user/import.ex @@ -0,0 +1,91 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.User.Import do +  use Ecto.Schema + +  alias Pleroma.User +  alias Pleroma.Web.CommonAPI +  alias Pleroma.Workers.BackgroundWorker + +  require Logger + +  @spec perform(atom(), User.t(), list()) :: :ok | list() | {:error, any()} +  def perform(:mutes_import, %User{} = user, [_ | _] = identifiers) do +    Enum.map( +      identifiers, +      fn identifier -> +        with {:ok, %User{} = muted_user} <- User.get_or_fetch(identifier), +             {:ok, _} <- User.mute(user, muted_user) do +          muted_user +        else +          error -> handle_error(:mutes_import, identifier, error) +        end +      end +    ) +  end + +  def perform(:blocks_import, %User{} = blocker, [_ | _] = identifiers) do +    Enum.map( +      identifiers, +      fn identifier -> +        with {:ok, %User{} = blocked} <- User.get_or_fetch(identifier), +             {:ok, _block} <- CommonAPI.block(blocker, blocked) do +          blocked +        else +          error -> handle_error(:blocks_import, identifier, error) +        end +      end +    ) +  end + +  def perform(:follow_import, %User{} = follower, [_ | _] = identifiers) do +    Enum.map( +      identifiers, +      fn identifier -> +        with {:ok, %User{} = followed} <- User.get_or_fetch(identifier), +             {:ok, follower} <- User.maybe_direct_follow(follower, followed), +             {:ok, _, _, _} <- CommonAPI.follow(follower, followed) do +          followed +        else +          error -> handle_error(:follow_import, identifier, error) +        end +      end +    ) +  end + +  def perform(_, _, _), do: :ok + +  defp handle_error(op, user_id, error) do +    Logger.debug("#{op} failed for #{user_id} with: #{inspect(error)}") +    error +  end + +  def blocks_import(%User{} = blocker, [_ | _] = identifiers) do +    BackgroundWorker.enqueue( +      "blocks_import", +      %{ +        "blocker_id" => blocker.id, +        "blocked_identifiers" => identifiers +      } +    ) +  end + +  def follow_import(%User{} = follower, [_ | _] = identifiers) do +    BackgroundWorker.enqueue( +      "follow_import", +      %{ +        "follower_id" => follower.id, +        "followed_identifiers" => identifiers +      } +    ) +  end + +  def mutes_import(%User{} = user, [_ | _] = identifiers) do +    BackgroundWorker.enqueue( +      "mutes_import", +      %{"user_id" => user.id, "identifiers" => identifiers} +    ) +  end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex new file mode 100644 index 000000000..df6a0f131 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex @@ -0,0 +1,57 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.UserImportController do +  use Pleroma.Web, :controller + +  require Logger + +  alias Pleroma.Plugs.OAuthScopesPlug +  alias Pleroma.User + +  plug(OAuthScopesPlug, %{scopes: ["follow", "write:follows"]} when action == :follow) +  plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks) +  plug(OAuthScopesPlug, %{scopes: ["follow", "write:mutes"]} when action == :mutes) + +  def follow(conn, %{"list" => %Plug.Upload{path: path}}) do +    follow(conn, %{"list" => File.read!(path)}) +  end + +  def follow(%{assigns: %{user: follower}} = conn, %{"list" => list}) do +    identifiers = +      list +      |> String.split("\n") +      |> Enum.map(&(&1 |> String.split(",") |> List.first())) +      |> List.delete("Account address") +      |> Enum.map(&(&1 |> String.trim() |> String.trim_leading("@"))) +      |> Enum.reject(&(&1 == "")) + +    User.Import.follow_import(follower, identifiers) +    json(conn, "job started") +  end + +  def blocks(conn, %{"list" => %Plug.Upload{path: path}}) do +    blocks(conn, %{"list" => File.read!(path)}) +  end + +  def blocks(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do +    User.Import.blocks_import(blocker, prepare_user_identifiers(list)) +    json(conn, "job started") +  end + +  def mutes(conn, %{"list" => %Plug.Upload{path: path}}) do +    mutes(conn, %{"list" => File.read!(path)}) +  end + +  def mutes(%{assigns: %{user: user}} = conn, %{"list" => list}) do +    User.Import.mutes_import(user, prepare_user_identifiers(list)) +    json(conn, "job started") +  end + +  defp prepare_user_identifiers(list) do +    list +    |> String.split() +    |> Enum.map(&String.trim_leading(&1, "@")) +  end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c6433cc53..f69b1545f 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -260,14 +260,15 @@ defmodule Pleroma.Web.Router do      post("/delete_account", UtilController, :delete_account)      put("/notification_settings", UtilController, :update_notificaton_settings)      post("/disable_account", UtilController, :disable_account) - -    post("/blocks_import", UtilController, :blocks_import) -    post("/follow_import", UtilController, :follow_import)    end    scope "/api/pleroma", Pleroma.Web.PleromaAPI do      pipe_through(:authenticated_api) +    post("/mutes_import", UserImportController, :mutes) +    post("/blocks_import", UserImportController, :blocks) +    post("/follow_import", UserImportController, :follow) +      get("/accounts/mfa", TwoFactorAuthenticationController, :settings)      get("/accounts/mfa/backup_codes", TwoFactorAuthenticationController, :backup_codes)      get("/accounts/mfa/setup/:method", TwoFactorAuthenticationController, :setup) diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index f02c4075c..70b0fbd54 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -20,14 +20,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do    plug(      OAuthScopesPlug, -    %{scopes: ["follow", "write:follows"]} -    when action == :follow_import -  ) - -  plug(OAuthScopesPlug, %{scopes: ["follow", "write:blocks"]} when action == :blocks_import) - -  plug( -    OAuthScopesPlug,      %{scopes: ["write:accounts"]}      when action in [             :change_email, @@ -104,33 +96,6 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do      end    end -  def follow_import(conn, %{"list" => %Plug.Upload{} = listfile}) do -    follow_import(conn, %{"list" => File.read!(listfile.path)}) -  end - -  def follow_import(%{assigns: %{user: follower}} = conn, %{"list" => list}) do -    followed_identifiers = -      list -      |> String.split("\n") -      |> Enum.map(&(&1 |> String.split(",") |> List.first())) -      |> List.delete("Account address") -      |> Enum.map(&(&1 |> String.trim() |> String.trim_leading("@"))) -      |> Enum.reject(&(&1 == "")) - -    User.follow_import(follower, followed_identifiers) -    json(conn, "job started") -  end - -  def blocks_import(conn, %{"list" => %Plug.Upload{} = listfile}) do -    blocks_import(conn, %{"list" => File.read!(listfile.path)}) -  end - -  def blocks_import(%{assigns: %{user: blocker}} = conn, %{"list" => list}) do -    blocked_identifiers = list |> String.split() |> Enum.map(&String.trim_leading(&1, "@")) -    User.blocks_import(blocker, blocked_identifiers) -    json(conn, "job started") -  end -    def change_password(%{assigns: %{user: user}} = conn, params) do      case CommonAPI.Utils.confirm_current_password(user, params["password"]) do        {:ok, user} -> diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index cec5a7462..f9c767ee0 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -34,7 +34,7 @@ defmodule Pleroma.Workers.BackgroundWorker do          }        }) do      blocker = User.get_cached_by_id(blocker_id) -    {:ok, User.perform(:blocks_import, blocker, blocked_identifiers)} +    {:ok, User.Import.perform(:blocks_import, blocker, blocked_identifiers)}    end    def perform(%Job{ @@ -45,7 +45,14 @@ defmodule Pleroma.Workers.BackgroundWorker do          }        }) do      follower = User.get_cached_by_id(follower_id) -    {:ok, User.perform(:follow_import, follower, followed_identifiers)} +    {:ok, User.Import.perform(:follow_import, follower, followed_identifiers)} +  end + +  def perform(%Job{ +        args: %{"op" => "mutes_import", "user_id" => user_id, "identifiers" => identifiers} +      }) do +    user = User.get_cached_by_id(user_id) +    {:ok, User.Import.perform(:mutes_import, user, identifiers)}    end    def perform(%Job{args: %{"op" => "media_proxy_preload", "message" => message}}) do  | 
