Merge develop
authorRoman Chvanikov <chvanikoff@pm.me>
Sun, 13 Sep 2020 09:24:57 +0000 (12:24 +0300)
committerRoman Chvanikov <chvanikoff@pm.me>
Sun, 13 Sep 2020 09:24:57 +0000 (12:24 +0300)
1  2 
config/config.exs
lib/pleroma/user.ex
lib/pleroma/web/common_api/common_api.ex
test/web/common_api/common_api_test.exs
test/web/mastodon_api/views/account_view_test.exs

diff --combined config/config.exs
index 84a02bc2eb00628152df66e164089f8339620469,88c47fd032c382b9e92a021dcccdd4c5bbdba869..c975da739b9a05b1cc15c7a56403c312d65eb767
@@@ -454,9 -454,7 +454,7 @@@ config :pleroma, :gopher
  config :pleroma, Pleroma.Web.Metadata,
    providers: [
      Pleroma.Web.Metadata.Providers.OpenGraph,
-     Pleroma.Web.Metadata.Providers.TwitterCard,
-     Pleroma.Web.Metadata.Providers.RelMe,
-     Pleroma.Web.Metadata.Providers.Feed
+     Pleroma.Web.Metadata.Providers.TwitterCard
    ],
    unfurl_nsfw: false
  
@@@ -532,6 -530,7 +530,7 @@@ config :pleroma, Oban
    log: false,
    queues: [
      activity_expiration: 10,
+     token_expiration: 5,
      federator_incoming: 50,
      federator_outgoing: 50,
      web_push: 50,
      background: 5,
      remote_fetcher: 2,
      attachments_cleanup: 5,
 -    new_users_digest: 1
 +    new_users_digest: 1,
 +    mute_expire: 5
    ],
    plugins: [Oban.Plugins.Pruner],
    crontab: [
-     {"0 0 * * *", Pleroma.Workers.Cron.ClearOauthTokenWorker},
-     {"* * * * *", Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker},
      {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker},
      {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker}
    ]
@@@ -658,7 -654,7 +655,7 @@@ config :pleroma, :rate_limit
    account_confirmation_resend: {8_640_000, 5},
    ap_routes: {60_000, 15}
  
- config :pleroma, Pleroma.ActivityExpiration, enabled: true
+ config :pleroma, Pleroma.Workers.PurgeExpiredActivity, enabled: true, min_lifetime: 600
  
  config :pleroma, Pleroma.Plugs.RemoteIp, enabled: true
  
diff --combined lib/pleroma/user.ex
index 46e03553ceae0668348c66d6372806834720a980,e73d199648f616d0a57a1c9ad2014cc83fc77ac9..039fd89f3c8d6535785a300c8797800cb7030c3c
@@@ -1125,31 -1125,31 +1125,31 @@@ defmodule Pleroma.User d
      User.Query.build(%{followers: user, deactivated: false})
    end
  
-   def get_followers_query(user, page) do
+   def get_followers_query(%User{} = user, page) do
      user
      |> get_followers_query(nil)
      |> User.Query.paginate(page, 20)
    end
  
    @spec get_followers_query(User.t()) :: Ecto.Query.t()
-   def get_followers_query(user), do: get_followers_query(user, nil)
+   def get_followers_query(%User{} = user), do: get_followers_query(user, nil)
  
    @spec get_followers(User.t(), pos_integer() | nil) :: {:ok, list(User.t())}
-   def get_followers(user, page \\ nil) do
+   def get_followers(%User{} = user, page \\ nil) do
      user
      |> get_followers_query(page)
      |> Repo.all()
    end
  
    @spec get_external_followers(User.t(), pos_integer() | nil) :: {:ok, list(User.t())}
-   def get_external_followers(user, page \\ nil) do
+   def get_external_followers(%User{} = user, page \\ nil) do
      user
      |> get_followers_query(page)
      |> User.Query.build(%{external: true})
      |> Repo.all()
    end
  
-   def get_followers_ids(user, page \\ nil) do
+   def get_followers_ids(%User{} = user, page \\ nil) do
      user
      |> get_followers_query(page)
      |> select([u], u.id)
      User.Query.build(%{friends: user, deactivated: false})
    end
  
-   def get_friends_query(user, page) do
+   def get_friends_query(%User{} = user, page) do
      user
      |> get_friends_query(nil)
      |> User.Query.paginate(page, 20)
    end
  
    @spec get_friends_query(User.t()) :: Ecto.Query.t()
-   def get_friends_query(user), do: get_friends_query(user, nil)
+   def get_friends_query(%User{} = user), do: get_friends_query(user, nil)
  
-   def get_friends(user, page \\ nil) do
+   def get_friends(%User{} = user, page \\ nil) do
      user
      |> get_friends_query(page)
      |> Repo.all()
    end
  
-   def get_friends_ap_ids(user) do
+   def get_friends_ap_ids(%User{} = user) do
      user
      |> get_friends_query(nil)
      |> select([u], u.ap_id)
      |> Repo.all()
    end
  
-   def get_friends_ids(user, page \\ nil) do
+   def get_friends_ids(%User{} = user, page \\ nil) do
      user
      |> get_friends_query(page)
      |> select([u], u.id)
      |> Repo.all()
    end
  
 -  @spec mute(User.t(), User.t(), boolean()) ::
 +  @spec mute(User.t(), User.t(), map()) ::
            {:ok, list(UserRelationship.t())} | {:error, String.t()}
 -  def mute(%User{} = muter, %User{} = mutee, notifications? \\ true) do
 -    add_to_mutes(muter, mutee, notifications?)
 +  def mute(%User{} = muter, %User{} = mutee, params \\ %{}) do
 +    notifications? = Map.get(params, :notifications, true)
 +    expires_in = Map.get(params, :expires_in, 0)
 +
 +    with {:ok, user_mute} <- UserRelationship.create_mute(muter, mutee),
 +         {:ok, user_notification_mute} <-
 +           (notifications? && UserRelationship.create_notification_mute(muter, mutee)) ||
 +             {:ok, nil} do
 +      if expires_in > 0 do
 +        Pleroma.Workers.MuteExpireWorker.enqueue(
 +          "unmute_user",
 +          %{"muter_id" => muter.id, "mutee_id" => mutee.id},
 +          schedule_in: expires_in
 +        )
 +      end
 +
 +      {:ok, Enum.filter([user_mute, user_notification_mute], & &1)}
 +    end
    end
  
    def unmute(%User{} = muter, %User{} = mutee) do
 -    remove_from_mutes(muter, mutee)
 +    with {:ok, user_mute} <- UserRelationship.delete_mute(muter, mutee),
 +         {:ok, user_notification_mute} <-
 +           UserRelationship.delete_notification_mute(muter, mutee) do
 +      {:ok, [user_mute, user_notification_mute]}
 +    end
    end
  
    def subscribe(%User{} = subscriber, %User{} = target) do
        max_pinned_statuses = Config.get([:instance, :max_pinned_statuses], 0)
        params = %{pinned_activities: user.pinned_activities ++ [id]}
  
+       # if pinned activity was scheduled for deletion, we remove job
+       if expiration = Pleroma.Workers.PurgeExpiredActivity.get_expiration(id) do
+         Oban.cancel_job(expiration.id)
+       end
        user
        |> cast(params, [:pinned_activities])
        |> validate_length(:pinned_activities,
      |> update_and_set_cache()
    end
  
-   def remove_pinnned_activity(user, %Pleroma.Activity{id: id}) do
+   def remove_pinnned_activity(user, %Pleroma.Activity{id: id, data: data}) do
      params = %{pinned_activities: List.delete(user.pinned_activities, id)}
  
+     # if pinned activity was scheduled for deletion, we reschedule it for deletion
+     if data["expires_at"] do
+       {:ok, expires_at, _} = DateTime.from_iso8601(data["expires_at"])
+       Pleroma.Workers.PurgeExpiredActivity.enqueue(%{
+         activity_id: id,
+         expires_at: expires_at
+       })
+     end
      user
      |> cast(params, [:pinned_activities])
      |> update_and_set_cache()
      UserRelationship.delete_block(user, blocked)
    end
  
 -  defp add_to_mutes(%User{} = user, %User{} = muted_user, notifications?) do
 -    with {:ok, user_mute} <- UserRelationship.create_mute(user, muted_user),
 -         {:ok, user_notification_mute} <-
 -           (notifications? && UserRelationship.create_notification_mute(user, muted_user)) ||
 -             {:ok, nil} do
 -      {:ok, Enum.filter([user_mute, user_notification_mute], & &1)}
 -    end
 -  end
 -
 -  defp remove_from_mutes(user, %User{} = muted_user) do
 -    with {:ok, user_mute} <- UserRelationship.delete_mute(user, muted_user),
 -         {:ok, user_notification_mute} <-
 -           UserRelationship.delete_notification_mute(user, muted_user) do
 -      {:ok, [user_mute, user_notification_mute]}
 -    end
 -  end
 -
    def set_invisible(user, invisible) do
      params = %{invisible: invisible}
  
index b217c4d10fbbe928f79e66cd46b45a86f657c363,500c3883e9661f18edb444484431f9d38a299d73..b49a9579167e75c1f584b7a3e7b447f8cf02fdd2
@@@ -4,7 -4,6 +4,6 @@@
  
  defmodule Pleroma.Web.CommonAPI do
    alias Pleroma.Activity
-   alias Pleroma.ActivityExpiration
    alias Pleroma.Conversation.Participation
    alias Pleroma.Formatter
    alias Pleroma.Object
    def check_expiry_date({:ok, nil} = res), do: res
  
    def check_expiry_date({:ok, in_seconds}) do
-     expiry = NaiveDateTime.utc_now() |> NaiveDateTime.add(in_seconds)
+     expiry = DateTime.add(DateTime.utc_now(), in_seconds)
  
-     if ActivityExpiration.expires_late_enough?(expiry) do
+     if Pleroma.Workers.PurgeExpiredActivity.expires_late_enough?(expiry) do
        {:ok, expiry}
      else
        {:error, "Expiry date is too soon"}
      end
    end
  
 -  def add_mute(user, activity) do
 +  def add_mute(user, activity, params \\ %{}) do
 +    expires_in = Map.get(params, :expires_in, 0)
 +
      with {:ok, _} <- ThreadMute.add_mute(user.id, activity.data["context"]),
           _ <- Pleroma.Notification.mark_context_as_read(user, activity.data["context"]) do
 +      if expires_in > 0 do
 +        Pleroma.Workers.MuteExpireWorker.enqueue(
 +          "unmute_conversation",
 +          %{"user_id" => user.id, "activity_id" => activity.id},
 +          schedule_in: expires_in
 +        )
 +      end
 +
        {:ok, activity}
      else
        {:error, _} -> {:error, dgettext("errors", "conversation is already muted")}
index 7ceb7ec7fb065b80292a2ffbca62680f9d2b8552,5afb0a6dcaa69d0aa6cd5862d08b0f85d72a1558..bdc569e64151d9c51f866ec7c1cff2174f9f808a
@@@ -3,8 -3,8 +3,8 @@@
  # SPDX-License-Identifier: AGPL-3.0-only
  
  defmodule Pleroma.Web.CommonAPITest do
 -  use Pleroma.DataCase
    use Oban.Testing, repo: Pleroma.Repo
 +  use Pleroma.DataCase
  
    alias Pleroma.Activity
    alias Pleroma.Chat
      test "it can handle activities that expire" do
        user = insert(:user)
  
-       expires_at =
-         NaiveDateTime.utc_now()
-         |> NaiveDateTime.truncate(:second)
-         |> NaiveDateTime.add(1_000_000, :second)
+       expires_at = DateTime.add(DateTime.utc_now(), 1_000_000)
  
        assert {:ok, activity} = CommonAPI.post(user, %{status: "chai", expires_in: 1_000_000})
  
-       assert expiration = Pleroma.ActivityExpiration.get_by_activity_id(activity.id)
-       assert expiration.scheduled_at == expires_at
+       assert_enqueued(
+         worker: Pleroma.Workers.PurgeExpiredActivity,
+         args: %{activity_id: activity.id},
+         scheduled_at: expires_at
+       )
      end
    end
  
        assert CommonAPI.thread_muted?(user, activity)
      end
  
 +    test "add expiring mute", %{user: user, activity: activity} do
 +      {:ok, _} = CommonAPI.add_mute(user, activity, %{expires_in: 60})
 +      assert CommonAPI.thread_muted?(user, activity)
 +
 +      worker = Pleroma.Workers.MuteExpireWorker
 +      args = %{"op" => "unmute_conversation", "user_id" => user.id, "activity_id" => activity.id}
 +
 +      assert_enqueued(
 +        worker: worker,
 +        args: args
 +      )
 +
 +      assert :ok = perform_job(worker, args)
 +      refute CommonAPI.thread_muted?(user, activity)
 +    end
 +
      test "remove mute", %{user: user, activity: activity} do
        CommonAPI.add_mute(user, activity)
        {:ok, _} = CommonAPI.remove_mute(user, activity)
index 3d70d460cf59fe0f51d757d1aafe991cd1118c0f,9f22f9dcf99e7a2a2445c8739583098cd595d4d1..6e9ab62eed1f1af511ac236cf029a1b702e3de6a
@@@ -116,9 -116,6 +116,6 @@@ defmodule Pleroma.Web.MastodonAPI.Accou
      end
    end
  
-   test "Favicon when :instance_favicons is enabled" do
-   end
    test "Represent the user account for the account owner" do
      user = insert(:user)
  
        {:ok, user} = User.follow(user, other_user)
        {:ok, other_user} = User.follow(other_user, user)
        {:ok, _subscription} = User.subscribe(user, other_user)
 -      {:ok, _user_relationships} = User.mute(user, other_user, true)
 +      {:ok, _user_relationships} = User.mute(user, other_user, %{notifications: true})
        {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, other_user)
  
        expected =