diff options
| author | Egor Kislitsyn <egor@kislitsyn.com> | 2020-03-02 15:35:49 +0400 | 
|---|---|---|
| committer | Egor Kislitsyn <egor@kislitsyn.com> | 2020-03-02 15:35:49 +0400 | 
| commit | 4a45b96a91485a39f26bcc86b6cbd21d1547511e (patch) | |
| tree | b4a6cc3f7be26b84b85d3a1ff3adc9b896b54e85 /lib | |
| parent | f446744a6a72d707504c2ba20ea2326f956b5097 (diff) | |
| parent | 45b08ca1665920564c9daf35a96e93dff031a649 (diff) | |
| download | pleroma-4a45b96a91485a39f26bcc86b6cbd21d1547511e.tar.gz pleroma-4a45b96a91485a39f26bcc86b6cbd21d1547511e.zip | |
Merge branch 'develop' into fix/signup-without-email
Diffstat (limited to 'lib')
107 files changed, 450 insertions, 237 deletions
| diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 3e76d2c97..5c9ef6904 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Config do diff --git a/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index 74bf968fc..2b03a3009 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Emoji do diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index 54d34e42f..bc842a59f 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.Instance do diff --git a/lib/mix/tasks/pleroma/refresh_counter_cache.ex b/lib/mix/tasks/pleroma/refresh_counter_cache.ex index bc2571efd..15b4dbfa6 100644 --- a/lib/mix/tasks/pleroma/refresh_counter_cache.ex +++ b/lib/mix/tasks/pleroma/refresh_counter_cache.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.RefreshCounterCache do diff --git a/lib/mix/tasks/pleroma/robotstxt.ex b/lib/mix/tasks/pleroma/robotstxt.ex index e99dd8502..24f08180e 100644 --- a/lib/mix/tasks/pleroma/robotstxt.ex +++ b/lib/mix/tasks/pleroma/robotstxt.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.RobotsTxt do diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index ba10a705a..40dd9bdc0 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Mix.Tasks.Pleroma.User do diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 7fb1f913b..397eb6e3f 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Activity do diff --git a/lib/pleroma/activity/queries.ex b/lib/pleroma/activity/queries.ex index 8d08d81ca..04593b9fb 100644 --- a/lib/pleroma/activity/queries.ex +++ b/lib/pleroma/activity/queries.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Activity.Queries do diff --git a/lib/pleroma/activity/search.ex b/lib/pleroma/activity/search.ex index f96e208da..ceb365bb3 100644 --- a/lib/pleroma/activity/search.ex +++ b/lib/pleroma/activity/search.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Activity.Search do diff --git a/lib/pleroma/activity_expiration.ex b/lib/pleroma/activity_expiration.ex index a58a493f7..db9c88d84 100644 --- a/lib/pleroma/activity_expiration.ex +++ b/lib/pleroma/activity_expiration.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.ActivityExpiration do diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index 27758cf94..18854b850 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Application do diff --git a/lib/pleroma/captcha/native.ex b/lib/pleroma/captcha/native.ex index 2c8db2c30..06c479ca9 100644 --- a/lib/pleroma/captcha/native.ex +++ b/lib/pleroma/captcha/native.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Captcha.Native do diff --git a/lib/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index 119251bee..2b43d4c36 100644 --- a/lib/pleroma/config/config_db.ex +++ b/lib/pleroma/config/config_db.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.ConfigDB do diff --git a/lib/pleroma/config/holder.ex b/lib/pleroma/config/holder.ex index d4fe892af..f1a339703 100644 --- a/lib/pleroma/config/holder.ex +++ b/lib/pleroma/config/holder.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Config.Holder do diff --git a/lib/pleroma/config/loader.ex b/lib/pleroma/config/loader.ex index b8787cb49..df2d18725 100644 --- a/lib/pleroma/config/loader.ex +++ b/lib/pleroma/config/loader.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Config.Loader do diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex index f037ce8a5..1846aa22c 100644 --- a/lib/pleroma/config/transfer_task.ex +++ b/lib/pleroma/config/transfer_task.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Config.TransferTask do diff --git a/lib/pleroma/conversation/participation.ex b/lib/pleroma/conversation/participation.ex index d4b255537..693825cf5 100644 --- a/lib/pleroma/conversation/participation.ex +++ b/lib/pleroma/conversation/participation.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Conversation.Participation do diff --git a/lib/pleroma/counter_cache.ex b/lib/pleroma/counter_cache.ex index 8e868e956..4d348a413 100644 --- a/lib/pleroma/counter_cache.ex +++ b/lib/pleroma/counter_cache.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.CounterCache do diff --git a/lib/pleroma/emails/admin_email.ex b/lib/pleroma/emails/admin_email.ex index 5f23345f7..55f61024e 100644 --- a/lib/pleroma/emails/admin_email.ex +++ b/lib/pleroma/emails/admin_email.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Emails.AdminEmail do diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index b8cb3bf03..a6d281151 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.FollowingRelationship do diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index 90895374d..e2a658cb3 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Formatter do diff --git a/lib/pleroma/html.ex b/lib/pleroma/html.ex index 05946aa96..d78c5f202 100644 --- a/lib/pleroma/html.ex +++ b/lib/pleroma/html.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.HTML do diff --git a/lib/pleroma/mime.ex b/lib/pleroma/mime.ex index 08f96f7bf..6ee055f50 100644 --- a/lib/pleroma/mime.ex +++ b/lib/pleroma/mime.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.MIME do diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 66e91fcef..60dba3434 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Notification do diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index f316f8b36..9574432f0 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -1,10 +1,13 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Object do    use Ecto.Schema +  import Ecto.Query +  import Ecto.Changeset +    alias Pleroma.Activity    alias Pleroma.Object    alias Pleroma.Object.Fetcher @@ -12,9 +15,6 @@ defmodule Pleroma.Object do    alias Pleroma.Repo    alias Pleroma.User -  import Ecto.Query -  import Ecto.Changeset -    require Logger    @type t() :: %__MODULE__{} @@ -145,18 +145,18 @@ defmodule Pleroma.Object do    # Legacy objects can be mutated by anybody    def authorize_mutation(%Object{}, %User{}), do: true +  @spec get_cached_by_ap_id(String.t()) :: Object.t() | nil    def get_cached_by_ap_id(ap_id) do      key = "object:#{ap_id}" -    Cachex.fetch!(:object_cache, key, fn _ -> -      object = get_by_ap_id(ap_id) - -      if object do -        {:commit, object} -      else -        {:ignore, object} -      end -    end) +    with {:ok, nil} <- Cachex.get(:object_cache, key), +         object when not is_nil(object) <- get_by_ap_id(ap_id), +         {:ok, true} <- Cachex.put(:object_cache, key, object) do +      object +    else +      {:ok, object} -> object +      nil -> nil +    end    end    def context_mapping(context) do diff --git a/lib/pleroma/object/containment.ex b/lib/pleroma/object/containment.ex index 9efa50edb..9ae6a5600 100644 --- a/lib/pleroma/object/containment.ex +++ b/lib/pleroma/object/containment.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Object.Containment do diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex index 23ecd9e15..eaa13d1e7 100644 --- a/lib/pleroma/object/fetcher.ex +++ b/lib/pleroma/object/fetcher.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Object.Fetcher do diff --git a/lib/pleroma/pagination.ex b/lib/pleroma/pagination.ex index 4535ca7c5..d43a96cd2 100644 --- a/lib/pleroma/pagination.ex +++ b/lib/pleroma/pagination.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Pagination do @@ -12,11 +12,15 @@ defmodule Pleroma.Pagination do    alias Pleroma.Repo +  @type type :: :keyset | :offset +    @default_limit 20 +  @max_limit 40    @page_keys ["max_id", "min_id", "limit", "since_id", "order"]    def page_keys, do: @page_keys +  @spec fetch_paginated(Ecto.Query.t(), map(), type(), atom() | nil) :: [Ecto.Schema.t()]    def fetch_paginated(query, params, type \\ :keyset, table_binding \\ nil)    def fetch_paginated(query, %{"total" => true} = params, :keyset, table_binding) do @@ -57,6 +61,7 @@ defmodule Pleroma.Pagination do      |> Repo.all()    end +  @spec paginate(Ecto.Query.t(), map(), type(), atom() | nil) :: [Ecto.Schema.t()]    def paginate(query, options, method \\ :keyset, table_binding \\ nil)    def paginate(query, options, :keyset, table_binding) do @@ -130,7 +135,11 @@ defmodule Pleroma.Pagination do    end    defp restrict(query, :limit, options, _table_binding) do -    limit = Map.get(options, :limit, @default_limit) +    limit = +      case Map.get(options, :limit, @default_limit) do +        limit when limit < @max_limit -> limit +        _ -> @max_limit +      end      query      |> limit(^limit) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index b04273979..81e6b4f2a 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Plugs.HTTPSecurityPlug do diff --git a/lib/pleroma/plugs/http_signature.ex b/lib/pleroma/plugs/http_signature.ex index 477a5b578..036e2a773 100644 --- a/lib/pleroma/plugs/http_signature.ex +++ b/lib/pleroma/plugs/http_signature.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Plugs.HTTPSignaturePlug do diff --git a/lib/pleroma/plugs/oauth_scopes_plug.ex b/lib/pleroma/plugs/oauth_scopes_plug.ex index 07c0f7fdb..38df074ad 100644 --- a/lib/pleroma/plugs/oauth_scopes_plug.ex +++ b/lib/pleroma/plugs/oauth_scopes_plug.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Plugs.OAuthScopesPlug do diff --git a/lib/pleroma/plugs/rate_limiter/limiter_supervisor.ex b/lib/pleroma/plugs/rate_limiter/limiter_supervisor.ex index 187582ede..884268d96 100644 --- a/lib/pleroma/plugs/rate_limiter/limiter_supervisor.ex +++ b/lib/pleroma/plugs/rate_limiter/limiter_supervisor.ex @@ -7,8 +7,8 @@ defmodule Pleroma.Plugs.RateLimiter.LimiterSupervisor do      DynamicSupervisor.start_link(__MODULE__, init_arg, name: __MODULE__)    end -  def add_limiter(limiter_name, expiration) do -    {:ok, _pid} = +  def add_or_return_limiter(limiter_name, expiration) do +    result =        DynamicSupervisor.start_child(          __MODULE__,          %{ @@ -28,6 +28,12 @@ defmodule Pleroma.Plugs.RateLimiter.LimiterSupervisor do               ]}          }        ) + +    case result do +      {:ok, _pid} = result -> result +      {:error, {:already_started, pid}} -> {:ok, pid} +      _ -> result +    end    end    @impl true diff --git a/lib/pleroma/plugs/rate_limiter/rate_limiter.ex b/lib/pleroma/plugs/rate_limiter/rate_limiter.ex index 7fb92489c..c3f6351c8 100644 --- a/lib/pleroma/plugs/rate_limiter/rate_limiter.ex +++ b/lib/pleroma/plugs/rate_limiter/rate_limiter.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Plugs.RateLimiter do @@ -7,12 +7,14 @@ defmodule Pleroma.Plugs.RateLimiter do    ## Configuration -  A keyword list of rate limiters where a key is a limiter name and value is the limiter configuration. The basic configuration is a tuple where: +  A keyword list of rate limiters where a key is a limiter name and value is the limiter configuration. +  The basic configuration is a tuple where:    * The first element: `scale` (Integer). The time scale in milliseconds.    * The second element: `limit` (Integer). How many requests to limit in the time scale provided. -  It is also possible to have different limits for unauthenticated and authenticated users: the keyword value must be a list of two tuples where the first one is a config for unauthenticated users and the second one is for authenticated. +  It is also possible to have different limits for unauthenticated and authenticated users: the keyword value must be a +  list of two tuples where the first one is a config for unauthenticated users and the second one is for authenticated.    To disable a limiter set its value to `nil`. @@ -64,91 +66,102 @@ defmodule Pleroma.Plugs.RateLimiter do    import Pleroma.Web.TranslationHelpers    import Plug.Conn +  alias Pleroma.Config    alias Pleroma.Plugs.RateLimiter.LimiterSupervisor    alias Pleroma.User    require Logger -  def init(opts) do -    limiter_name = Keyword.get(opts, :name) - -    case Pleroma.Config.get([:rate_limit, limiter_name]) do -      nil -> -        nil - -      config -> -        name_root = Keyword.get(opts, :bucket_name, limiter_name) +  @doc false +  def init(plug_opts) do +    plug_opts +  end -        %{ -          name: name_root, -          limits: config, -          opts: opts -        } +  def call(conn, plug_opts) do +    if disabled?() do +      handle_disabled(conn) +    else +      action_settings = action_settings(plug_opts) +      handle(conn, action_settings)      end    end -  # Do not limit if there is no limiter configuration -  def call(conn, nil), do: conn +  defp handle_disabled(conn) do +    if Config.get(:env) == :prod do +      Logger.warn("Rate limiter is disabled for localhost/socket") +    end + +    conn +  end -  def call(conn, settings) do -    case disabled?() do -      true -> -        if Pleroma.Config.get(:env) == :prod, -          do: Logger.warn("Rate limiter is disabled for localhost/socket") +  defp handle(conn, nil), do: conn +  defp handle(conn, action_settings) do +    action_settings +    |> incorporate_conn_info(conn) +    |> check_rate() +    |> case do +      {:ok, _count} ->          conn -      false -> -        settings -        |> incorporate_conn_info(conn) -        |> check_rate() -        |> case do -          {:ok, _count} -> -            conn - -          {:error, _count} -> -            render_throttled_error(conn) -        end +      {:error, _count} -> +        render_throttled_error(conn)      end    end    def disabled? do      localhost_or_socket = -      Pleroma.Config.get([Pleroma.Web.Endpoint, :http, :ip]) +      Config.get([Pleroma.Web.Endpoint, :http, :ip])        |> Tuple.to_list()        |> Enum.join(".")        |> String.match?(~r/^local|^127.0.0.1/) -    remote_ip_disabled = not Pleroma.Config.get([Pleroma.Plugs.RemoteIp, :enabled]) +    remote_ip_disabled = not Config.get([Pleroma.Plugs.RemoteIp, :enabled])      localhost_or_socket and remote_ip_disabled    end -  def inspect_bucket(conn, name_root, settings) do -    settings = -      settings -      |> incorporate_conn_info(conn) +  @inspect_bucket_not_found {:error, :not_found} -    bucket_name = make_bucket_name(%{settings | name: name_root}) -    key_name = make_key_name(settings) -    limit = get_limits(settings) +  def inspect_bucket(conn, bucket_name_root, plug_opts) do +    with %{name: _} = action_settings <- action_settings(plug_opts) do +      action_settings = incorporate_conn_info(action_settings, conn) +      bucket_name = make_bucket_name(%{action_settings | name: bucket_name_root}) +      key_name = make_key_name(action_settings) +      limit = get_limits(action_settings) -    case Cachex.get(bucket_name, key_name) do -      {:error, :no_cache} -> -        {:err, :not_found} +      case Cachex.get(bucket_name, key_name) do +        {:error, :no_cache} -> +          @inspect_bucket_not_found -      {:ok, nil} -> -        {0, limit} +        {:ok, nil} -> +          {0, limit} -      {:ok, value} -> -        {value, limit - value} +        {:ok, value} -> +          {value, limit - value} +      end +    else +      _ -> @inspect_bucket_not_found      end    end -  defp check_rate(settings) do -    bucket_name = make_bucket_name(settings) -    key_name = make_key_name(settings) -    limit = get_limits(settings) +  def action_settings(plug_opts) do +    with limiter_name when is_atom(limiter_name) <- plug_opts[:name], +         limits when not is_nil(limits) <- Config.get([:rate_limit, limiter_name]) do +      bucket_name_root = Keyword.get(plug_opts, :bucket_name, limiter_name) + +      %{ +        name: bucket_name_root, +        limits: limits, +        opts: plug_opts +      } +    end +  end + +  defp check_rate(action_settings) do +    bucket_name = make_bucket_name(action_settings) +    key_name = make_key_name(action_settings) +    limit = get_limits(action_settings)      case Cachex.get_and_update(bucket_name, key_name, &increment_value(&1, limit)) do        {:commit, value} -> @@ -158,8 +171,8 @@ defmodule Pleroma.Plugs.RateLimiter do          {:error, value}        {:error, :no_cache} -> -        initialize_buckets(settings) -        check_rate(settings) +        initialize_buckets!(action_settings) +        check_rate(action_settings)      end    end @@ -169,16 +182,19 @@ defmodule Pleroma.Plugs.RateLimiter do    defp increment_value(val, _limit), do: {:commit, val + 1} -  defp incorporate_conn_info(settings, %{assigns: %{user: %User{id: user_id}}, params: params}) do -    Map.merge(settings, %{ +  defp incorporate_conn_info(action_settings, %{ +         assigns: %{user: %User{id: user_id}}, +         params: params +       }) do +    Map.merge(action_settings, %{        mode: :user,        conn_params: params,        conn_info: "#{user_id}"      })    end -  defp incorporate_conn_info(settings, %{params: params} = conn) do -    Map.merge(settings, %{ +  defp incorporate_conn_info(action_settings, %{params: params} = conn) do +    Map.merge(action_settings, %{        mode: :anon,        conn_params: params,        conn_info: "#{ip(conn)}" @@ -197,10 +213,10 @@ defmodule Pleroma.Plugs.RateLimiter do      |> halt()    end -  defp make_key_name(settings) do +  defp make_key_name(action_settings) do      "" -    |> attach_params(settings) -    |> attach_identity(settings) +    |> attach_selected_params(action_settings) +    |> attach_identity(action_settings)    end    defp get_scale(_, {scale, _}), do: scale @@ -215,28 +231,35 @@ defmodule Pleroma.Plugs.RateLimiter do    defp get_limits(%{limits: [{_, limit}, _]}), do: limit -  defp make_bucket_name(%{mode: :user, name: name_root}), -    do: user_bucket_name(name_root) +  defp make_bucket_name(%{mode: :user, name: bucket_name_root}), +    do: user_bucket_name(bucket_name_root) -  defp make_bucket_name(%{mode: :anon, name: name_root}), -    do: anon_bucket_name(name_root) +  defp make_bucket_name(%{mode: :anon, name: bucket_name_root}), +    do: anon_bucket_name(bucket_name_root) -  defp attach_params(input, %{conn_params: conn_params, opts: opts}) do -    param_string = -      opts +  defp attach_selected_params(input, %{conn_params: conn_params, opts: plug_opts}) do +    params_string = +      plug_opts        |> Keyword.get(:params, [])        |> Enum.sort()        |> Enum.map(&Map.get(conn_params, &1, ""))        |> Enum.join(":") -    "#{input}#{param_string}" +    [input, params_string] +    |> Enum.join(":") +    |> String.replace_leading(":", "")    end -  defp initialize_buckets(%{name: _name, limits: nil}), do: :ok +  defp initialize_buckets!(%{name: _name, limits: nil}), do: :ok + +  defp initialize_buckets!(%{name: name, limits: limits}) do +    {:ok, _pid} = +      LimiterSupervisor.add_or_return_limiter(anon_bucket_name(name), get_scale(:anon, limits)) + +    {:ok, _pid} = +      LimiterSupervisor.add_or_return_limiter(user_bucket_name(name), get_scale(:user, limits)) -  defp initialize_buckets(%{name: name, limits: limits}) do -    LimiterSupervisor.add_limiter(anon_bucket_name(name), get_scale(:anon, limits)) -    LimiterSupervisor.add_limiter(user_bucket_name(name), get_scale(:user, limits)) +    :ok    end    defp attach_identity(base, %{mode: :user, conn_info: conn_info}), @@ -245,6 +268,6 @@ defmodule Pleroma.Plugs.RateLimiter do    defp attach_identity(base, %{mode: :anon, conn_info: conn_info}),      do: "ip:#{base}:#{conn_info}" -  defp user_bucket_name(name_root), do: "user:#{name_root}" |> String.to_atom() -  defp anon_bucket_name(name_root), do: "anon:#{name_root}" |> String.to_atom() +  defp user_bucket_name(bucket_name_root), do: "user:#{bucket_name_root}" |> String.to_atom() +  defp anon_bucket_name(bucket_name_root), do: "anon:#{bucket_name_root}" |> String.to_atom()  end diff --git a/lib/pleroma/plugs/remote_ip.ex b/lib/pleroma/plugs/remote_ip.ex index 1cd5af48a..2eca4f8f6 100644 --- a/lib/pleroma/plugs/remote_ip.ex +++ b/lib/pleroma/plugs/remote_ip.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Plugs.RemoteIp do diff --git a/lib/pleroma/plugs/user_enabled_plug.ex b/lib/pleroma/plugs/user_enabled_plug.ex index 7b304eebc..23e800a74 100644 --- a/lib/pleroma/plugs/user_enabled_plug.ex +++ b/lib/pleroma/plugs/user_enabled_plug.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Plugs.UserEnabledPlug do diff --git a/lib/pleroma/plugs/user_is_admin_plug.ex b/lib/pleroma/plugs/user_is_admin_plug.ex index 3190163d3..2748102df 100644 --- a/lib/pleroma/plugs/user_is_admin_plug.ex +++ b/lib/pleroma/plugs/user_is_admin_plug.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Plugs.UserIsAdminPlug do diff --git a/lib/pleroma/repo.ex b/lib/pleroma/repo.ex index cb0b6653c..f62138466 100644 --- a/lib/pleroma/repo.ex +++ b/lib/pleroma/repo.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Repo do diff --git a/lib/pleroma/scheduled_activity.ex b/lib/pleroma/scheduled_activity.ex index e81bfcd7d..8ff06a462 100644 --- a/lib/pleroma/scheduled_activity.ex +++ b/lib/pleroma/scheduled_activity.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.ScheduledActivity do diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex index 771a06e32..33f50dda8 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Stats do diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 2e0986197..440199d19 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -37,6 +37,7 @@ defmodule Pleroma.Upload do            Plug.Upload.t()            | (data_uri_string :: String.t())            | {:from_local, name :: String.t(), id :: String.t(), path :: String.t()} +          | map()    @type option ::            {:type, :avatar | :banner | :background} diff --git a/lib/pleroma/uploaders/local.ex b/lib/pleroma/uploaders/local.ex index 2e6fe3292..10b3069f4 100644 --- a/lib/pleroma/uploaders/local.ex +++ b/lib/pleroma/uploaders/local.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Uploaders.Local do diff --git a/lib/pleroma/uploaders/s3.ex b/lib/pleroma/uploaders/s3.ex index feb89cea6..a13ff23b6 100644 --- a/lib/pleroma/uploaders/s3.ex +++ b/lib/pleroma/uploaders/s3.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Uploaders.S3 do diff --git a/lib/pleroma/uploaders/uploader.ex b/lib/pleroma/uploaders/uploader.ex index d71e213d2..9a94534e9 100644 --- a/lib/pleroma/uploaders/uploader.ex +++ b/lib/pleroma/uploaders/uploader.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Uploaders.Uploader do diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 5271d8dbe..7531757f5 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -756,9 +756,18 @@ defmodule Pleroma.User do      Cachex.del(:user_cache, "nickname:#{user.nickname}")    end +  @spec get_cached_by_ap_id(String.t()) :: User.t() | nil    def get_cached_by_ap_id(ap_id) do      key = "ap_id:#{ap_id}" -    Cachex.fetch!(:user_cache, key, fn _ -> get_by_ap_id(ap_id) end) + +    with {:ok, nil} <- Cachex.get(:user_cache, key), +         user when not is_nil(user) <- get_by_ap_id(ap_id), +         {:ok, true} <- Cachex.put(:user_cache, key, user) do +      user +    else +      {:ok, user} -> user +      nil -> nil +    end    end    def get_cached_by_id(id) do diff --git a/lib/pleroma/user/query.ex b/lib/pleroma/user/query.ex index 4358907cb..884e33039 100644 --- a/lib/pleroma/user/query.ex +++ b/lib/pleroma/user/query.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.User.Query do diff --git a/lib/pleroma/user/search.ex b/lib/pleroma/user/search.ex index 1cfecef83..cec59c372 100644 --- a/lib/pleroma/user/search.ex +++ b/lib/pleroma/user/search.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.User.Search do diff --git a/lib/pleroma/user_relationship.ex b/lib/pleroma/user_relationship.ex index 3149e10e9..393947942 100644 --- a/lib/pleroma/user_relationship.ex +++ b/lib/pleroma/user_relationship.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.UserRelationship do diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 5c436941a..04b853dcf 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1,11 +1,12 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.ActivityPub do    alias Pleroma.Activity    alias Pleroma.Activity.Ir.Topics    alias Pleroma.Config +  alias Pleroma.Constants    alias Pleroma.Conversation    alias Pleroma.Conversation.Participation    alias Pleroma.Notification @@ -124,6 +125,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    def increase_poll_votes_if_vote(_create_data), do: :noop +  @spec insert(map(), boolean(), boolean(), boolean()) :: {:ok, Activity.t()} | {:error, any()}    def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when is_map(map) do      with nil <- Activity.normalize(map),           map <- lazy_put_activity_defaults(map, fake), @@ -231,12 +233,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      :noop    end -  def create(%{to: to, actor: actor, context: context, object: object} = params, fake \\ false) do +  @spec create(map(), boolean()) :: {:ok, Activity.t()} | {:error, any()} +  def create(params, fake \\ false) do +    with {:ok, result} <- Repo.transaction(fn -> do_create(params, fake) end) do +      result +    end +  end + +  defp do_create(%{to: to, actor: actor, context: context, object: object} = params, fake) do      additional = params[:additional] || %{}      # only accept false as false value      local = !(params[:local] == false)      published = params[:published] -    quick_insert? = Pleroma.Config.get([:env]) == :benchmark +    quick_insert? = Config.get([:env]) == :benchmark      with create_data <-             make_create_data( @@ -259,10 +268,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do          {:ok, activity}        {:error, message} -> -        {:error, message} +        Repo.rollback(message)      end    end +  @spec listen(map()) :: {:ok, Activity.t()} | {:error, any()}    def listen(%{to: to, actor: actor, context: context, object: object} = params) do      additional = params[:additional] || %{}      # only accept false as false value @@ -277,20 +287,20 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           {:ok, activity} <- insert(listen_data, local),           :ok <- maybe_federate(activity) do        {:ok, activity} -    else -      {:error, message} -> -        {:error, message}      end    end +  @spec accept(map()) :: {:ok, Activity.t()} | {:error, any()}    def accept(params) do      accept_or_reject("Accept", params)    end +  @spec reject(map()) :: {:ok, Activity.t()} | {:error, any()}    def reject(params) do      accept_or_reject("Reject", params)    end +  @spec accept_or_reject(String.t(), map()) :: {:ok, Activity.t()} | {:error, any()}    def accept_or_reject(type, %{to: to, actor: actor, object: object} = params) do      local = Map.get(params, :local, true)      activity_id = Map.get(params, :activity_id, nil) @@ -304,6 +314,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      end    end +  @spec update(map()) :: {:ok, Activity.t()} | {:error, any()}    def update(%{to: to, cc: cc, actor: actor, object: object} = params) do      local = !(params[:local] == false)      activity_id = params[:activity_id] @@ -322,7 +333,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      end    end +  @spec react_with_emoji(User.t(), Object.t(), String.t(), keyword()) :: +          {:ok, Activity.t(), Object.t()} | {:error, any()}    def react_with_emoji(user, object, emoji, options \\ []) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_react_with_emoji(user, object, emoji, options) end) do +      result +    end +  end + +  defp do_react_with_emoji(user, object, emoji, options) do      with local <- Keyword.get(options, :local, true),           activity_id <- Keyword.get(options, :activity_id, nil),           true <- Pleroma.Emoji.is_unicode_emoji?(emoji), @@ -332,11 +352,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           :ok <- maybe_federate(activity) do        {:ok, activity, object}      else -      e -> {:error, e} +      false -> {:error, false} +      {:error, error} -> Repo.rollback(error)      end    end +  @spec unreact_with_emoji(User.t(), String.t(), keyword()) :: +          {:ok, Activity.t(), Object.t()} | {:error, any()}    def unreact_with_emoji(user, reaction_id, options \\ []) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_unreact_with_emoji(user, reaction_id, options) end) do +      result +    end +  end + +  defp do_unreact_with_emoji(user, reaction_id, options) do      with local <- Keyword.get(options, :local, true),           activity_id <- Keyword.get(options, :activity_id, nil),           user_ap_id <- user.ap_id, @@ -348,17 +378,25 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           :ok <- maybe_federate(activity) do        {:ok, activity, object}      else -      e -> {:error, e} +      {:error, error} -> Repo.rollback(error)      end    end    # TODO: This is weird, maybe we shouldn't check here if we can make the activity. -  def like( -        %User{ap_id: ap_id} = user, -        %Object{data: %{"id" => _}} = object, -        activity_id \\ nil, -        local \\ true -      ) do +  @spec like(User.t(), Object.t(), String.t() | nil, boolean()) :: +          {:ok, Activity.t(), Object.t()} | {:error, any()} +  def like(user, object, activity_id \\ nil, local \\ true) do +    with {:ok, result} <- Repo.transaction(fn -> do_like(user, object, activity_id, local) end) do +      result +    end +  end + +  defp do_like( +         %User{ap_id: ap_id} = user, +         %Object{data: %{"id" => _}} = object, +         activity_id, +         local +       ) do      with nil <- get_existing_like(ap_id, object),           like_data <- make_like_data(user, object, activity_id),           {:ok, activity} <- insert(like_data, local), @@ -366,12 +404,24 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           :ok <- maybe_federate(activity) do        {:ok, activity, object}      else -      %Activity{} = activity -> {:ok, activity, object} -      error -> {:error, error} +      %Activity{} = activity -> +        {:ok, activity, object} + +      {:error, error} -> +        Repo.rollback(error)      end    end +  @spec unlike(User.t(), Object.t(), String.t() | nil, boolean()) :: +          {:ok, Activity.t(), Activity.t(), Object.t()} | {:ok, Object.t()} | {:error, any()}    def unlike(%User{} = actor, %Object{} = object, activity_id \\ nil, local \\ true) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_unlike(actor, object, activity_id, local) end) do +      result +    end +  end + +  defp do_unlike(actor, object, activity_id, local) do      with %Activity{} = like_activity <- get_existing_like(actor.ap_id, object),           unlike_data <- make_unlike_data(actor, like_activity, activity_id),           {:ok, unlike_activity} <- insert(unlike_data, local), @@ -380,10 +430,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           :ok <- maybe_federate(unlike_activity) do        {:ok, unlike_activity, like_activity, object}      else -      _e -> {:ok, object} +      nil -> {:ok, object} +      {:error, error} -> Repo.rollback(error)      end    end +  @spec announce(User.t(), Object.t(), String.t() | nil, boolean(), boolean()) :: +          {:ok, Activity.t(), Object.t()} | {:error, any()}    def announce(          %User{ap_id: _} = user,          %Object{data: %{"id" => _}} = object, @@ -391,6 +444,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do          local \\ true,          public \\ true        ) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_announce(user, object, activity_id, local, public) end) do +      result +    end +  end + +  defp do_announce(user, object, activity_id, local, public) do      with true <- is_announceable?(object, user, public),           announce_data <- make_announce_data(user, object, activity_id, public),           {:ok, activity} <- insert(announce_data, local), @@ -398,16 +458,26 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           :ok <- maybe_federate(activity) do        {:ok, activity, object}      else -      error -> {:error, error} +      false -> {:error, false} +      {:error, error} -> Repo.rollback(error)      end    end +  @spec unannounce(User.t(), Object.t(), String.t() | nil, boolean()) :: +          {:ok, Activity.t(), Object.t()} | {:ok, Object.t()} | {:error, any()}    def unannounce(          %User{} = actor,          %Object{} = object,          activity_id \\ nil,          local \\ true        ) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_unannounce(actor, object, activity_id, local) end) do +      result +    end +  end + +  defp do_unannounce(actor, object, activity_id, local) do      with %Activity{} = announce_activity <- get_existing_announce(actor.ap_id, object),           unannounce_data <- make_unannounce_data(actor, announce_activity, activity_id),           {:ok, unannounce_activity} <- insert(unannounce_data, local), @@ -416,30 +486,61 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           {:ok, object} <- remove_announce_from_object(announce_activity, object) do        {:ok, unannounce_activity, object}      else -      _e -> {:ok, object} +      nil -> {:ok, object} +      {:error, error} -> Repo.rollback(error)      end    end +  @spec follow(User.t(), User.t(), String.t() | nil, boolean()) :: +          {:ok, Activity.t()} | {:error, any()}    def follow(follower, followed, activity_id \\ nil, local \\ true) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_follow(follower, followed, activity_id, local) end) do +      result +    end +  end + +  defp do_follow(follower, followed, activity_id, local) do      with data <- make_follow_data(follower, followed, activity_id),           {:ok, activity} <- insert(data, local),           :ok <- maybe_federate(activity),           _ <- User.set_follow_state_cache(follower.ap_id, followed.ap_id, activity.data["state"]) do        {:ok, activity} +    else +      {:error, error} -> Repo.rollback(error)      end    end +  @spec unfollow(User.t(), User.t(), String.t() | nil, boolean()) :: +          {:ok, Activity.t()} | nil | {:error, any()}    def unfollow(follower, followed, activity_id \\ nil, local \\ true) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_unfollow(follower, followed, activity_id, local) end) do +      result +    end +  end + +  defp do_unfollow(follower, followed, activity_id, local) do      with %Activity{} = follow_activity <- fetch_latest_follow(follower, followed),           {:ok, follow_activity} <- update_follow_state(follow_activity, "cancelled"),           unfollow_data <- make_unfollow_data(follower, followed, follow_activity, activity_id),           {:ok, activity} <- insert(unfollow_data, local),           :ok <- maybe_federate(activity) do        {:ok, activity} +    else +      nil -> nil +      {:error, error} -> Repo.rollback(error) +    end +  end + +  @spec delete(User.t() | Object.t(), keyword()) :: {:ok, User.t() | Object.t()} | {:error, any()} +  def delete(entity, options \\ []) do +    with {:ok, result} <- Repo.transaction(fn -> do_delete(entity, options) end) do +      result      end    end -  def delete(%User{ap_id: ap_id, follower_address: follower_address} = user) do +  defp do_delete(%User{ap_id: ap_id, follower_address: follower_address} = user, _) do      with data <- %{             "to" => [follower_address],             "type" => "Delete", @@ -452,7 +553,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      end    end -  def delete(%Object{data: %{"id" => id, "actor" => actor}} = object, options \\ []) do +  defp do_delete(%Object{data: %{"id" => id, "actor" => actor}} = object, options) do      local = Keyword.get(options, :local, true)      activity_id = Keyword.get(options, :activity_id, nil)      actor = Keyword.get(options, :actor, actor) @@ -477,11 +578,22 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           {:ok, _actor} <- decrease_note_count_if_public(user, object),           :ok <- maybe_federate(activity) do        {:ok, activity} +    else +      {:error, error} -> +        Repo.rollback(error)      end    end -  @spec block(User.t(), User.t(), String.t() | nil, boolean) :: {:ok, Activity.t() | nil} +  @spec block(User.t(), User.t(), String.t() | nil, boolean()) :: +          {:ok, Activity.t()} | {:error, any()}    def block(blocker, blocked, activity_id \\ nil, local \\ true) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_block(blocker, blocked, activity_id, local) end) do +      result +    end +  end + +  defp do_block(blocker, blocked, activity_id, local) do      outgoing_blocks = Config.get([:activitypub, :outgoing_blocks])      unfollow_blocked = Config.get([:activitypub, :unfollow_blocked]) @@ -496,20 +608,32 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do           :ok <- maybe_federate(activity) do        {:ok, activity}      else -      _e -> {:ok, nil} +      {:error, error} -> Repo.rollback(error)      end    end +  @spec unblock(User.t(), User.t(), String.t() | nil, boolean()) :: +          {:ok, Activity.t()} | {:error, any()} | nil    def unblock(blocker, blocked, activity_id \\ nil, local \\ true) do +    with {:ok, result} <- +           Repo.transaction(fn -> do_unblock(blocker, blocked, activity_id, local) end) do +      result +    end +  end + +  defp do_unblock(blocker, blocked, activity_id, local) do      with %Activity{} = block_activity <- fetch_latest_block(blocker, blocked),           unblock_data <- make_unblock_data(blocker, blocked, block_activity, activity_id),           {:ok, activity} <- insert(unblock_data, local),           :ok <- maybe_federate(activity) do        {:ok, activity} +    else +      nil -> nil +      {:error, error} -> Repo.rollback(error)      end    end -  @spec flag(map()) :: {:ok, Activity.t()} | any +  @spec flag(map()) :: {:ok, Activity.t()} | {:error, any()}    def flag(          %{            actor: actor, @@ -546,6 +670,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      end    end +  @spec move(User.t(), User.t(), boolean()) :: {:ok, Activity.t()} | {:error, any()}    def move(%User{} = origin, %User{} = target, local \\ true) do      params = %{        "type" => "Move", @@ -571,7 +696,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    end    defp fetch_activities_for_context_query(context, opts) do -    public = [Pleroma.Constants.as_public()] +    public = [Constants.as_public()]      recipients =        if opts["user"], @@ -616,10 +741,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      |> Repo.one()    end +  @spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()]    def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do      opts = Map.drop(opts, ["user"]) -    [Pleroma.Constants.as_public()] +    [Constants.as_public()]      |> fetch_activities_query(opts)      |> restrict_unlisted()      |> Pagination.fetch_paginated(opts, pagination) @@ -770,13 +896,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      |> Enum.reverse()    end -  def fetch_instance_activities(params) do +  def fetch_statuses(reading_user, params) do      params =        params        |> Map.put("type", ["Create", "Announce"]) -      |> Map.put("instance", params["instance"]) -    fetch_activities([Pleroma.Constants.as_public()], params, :offset) +    recipients = +      user_activities_recipients(%{ +        "godmode" => params["godmode"], +        "reading_user" => reading_user +      }) + +    fetch_activities(recipients, params, :offset)      |> Enum.reverse()    end @@ -786,9 +917,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    defp user_activities_recipients(%{"reading_user" => reading_user}) do      if reading_user do -      [Pleroma.Constants.as_public()] ++ [reading_user.ap_id | User.following(reading_user)] +      [Constants.as_public()] ++ [reading_user.ap_id | User.following(reading_user)]      else -      [Pleroma.Constants.as_public()] +      [Constants.as_public()]      end    end @@ -995,7 +1126,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do          fragment(            "not (coalesce(?->'cc', '{}'::jsonb) \\?| ?)",            activity.data, -          ^[Pleroma.Constants.as_public()] +          ^[Constants.as_public()]          )      )    end @@ -1169,7 +1300,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    @doc """    Fetch favorites activities of user with order by sort adds to favorites    """ -  @spec fetch_favourites(User.t(), map(), atom()) :: list(Activity.t()) +  @spec fetch_favourites(User.t(), map(), Pagination.type()) :: list(Activity.t())    def fetch_favourites(user, params \\ %{}, pagination \\ :keyset) do      user.ap_id      |> Activity.Queries.by_actor() @@ -1207,7 +1338,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do        where:          fragment("? && ?", activity.recipients, ^recipients) or            (fragment("? && ?", activity.recipients, ^recipients_with_public) and -             ^Pleroma.Constants.as_public() in activity.recipients) +             ^Constants.as_public() in activity.recipients)      )    end @@ -1223,6 +1354,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do      |> Enum.reverse()    end +  @spec upload(Upload.source(), keyword()) :: {:ok, Object.t()} | {:error, any()}    def upload(file, opts \\ []) do      with {:ok, data} <- Upload.store(file, opts) do        obj_data = @@ -1320,8 +1452,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    defp normalize_counter(_), do: 0    defp maybe_update_follow_information(data) do -    with {:enabled, true} <- -           {:enabled, Pleroma.Config.get([:instance, :external_user_synchronization])}, +    with {:enabled, true} <- {:enabled, Config.get([:instance, :external_user_synchronization])},           {:ok, info} <- fetch_follow_information_for_user(data) do        info = Map.merge(data[:info] || %{}, info)        Map.put(data, :info, info) diff --git a/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex b/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex index 802d10edc..9e7800997 100644 --- a/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex index df774b0f7..d9a0acfd3 100644 --- a/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/media_proxy_warming_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/no_op_policy.ex b/lib/pleroma/web/activity_pub/mrf/no_op_policy.ex index 878c57925..cc2ac9d08 100644 --- a/lib/pleroma/web/activity_pub/mrf/no_op_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/no_op_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.NoOpPolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex b/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex index 788508349..4a8bc91ae 100644 --- a/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/object_age_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index b94c3c78a..4edc007fd 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex b/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex index 77ffd1bb9..c9f20571f 100644 --- a/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/subchain_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex b/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex index 7389d6a96..a927a4ed8 100644 --- a/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.UserAllowListPolicy do diff --git a/lib/pleroma/web/activity_pub/mrf/vocabulary_policy.ex b/lib/pleroma/web/activity_pub/mrf/vocabulary_policy.ex index c184c3b66..6167a74e2 100644 --- a/lib/pleroma/web/activity_pub/mrf/vocabulary_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/vocabulary_policy.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.VocabularyPolicy do diff --git a/lib/pleroma/web/activity_pub/publisher.ex b/lib/pleroma/web/activity_pub/publisher.ex index e4e3ab44a..6c558e7f0 100644 --- a/lib/pleroma/web/activity_pub/publisher.ex +++ b/lib/pleroma/web/activity_pub/publisher.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.Publisher do diff --git a/lib/pleroma/web/activity_pub/relay.ex b/lib/pleroma/web/activity_pub/relay.ex index 48a1b71e0..bb5542c89 100644 --- a/lib/pleroma/web/activity_pub/relay.ex +++ b/lib/pleroma/web/activity_pub/relay.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.Relay do diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 3afc82345..9cd3de705 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.Transmogrifier do diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index 50e076ca4..2bc958670 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.Utils do diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex index 816b8938c..558832703 100644 --- a/lib/pleroma/web/admin_api/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/admin_api_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.AdminAPI.AdminAPIController do @@ -244,13 +244,15 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do    end    def list_instance_statuses(conn, %{"instance" => instance} = params) do +    with_reblogs = params["with_reblogs"] == "true" || params["with_reblogs"] == true      {page, page_size} = page_params(params)      activities = -      ActivityPub.fetch_instance_activities(%{ +      ActivityPub.fetch_statuses(nil, %{          "instance" => instance,          "limit" => page_size, -        "offset" => (page - 1) * page_size +        "offset" => (page - 1) * page_size, +        "exclude_reblogs" => !with_reblogs && "true"        })      conn @@ -259,6 +261,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do    end    def list_user_statuses(conn, %{"nickname" => nickname} = params) do +    with_reblogs = params["with_reblogs"] == "true" || params["with_reblogs"] == true      godmode = params["godmode"] == "true" || params["godmode"] == true      with %User{} = user <- User.get_cached_by_nickname_or_id(nickname) do @@ -267,7 +270,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do        activities =          ActivityPub.fetch_user_activities(user, nil, %{            "limit" => page_size, -          "godmode" => godmode +          "godmode" => godmode, +          "exclude_reblogs" => !with_reblogs && "true"          })        conn @@ -741,6 +745,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do      end    end +  def list_statuses(%{assigns: %{user: admin}} = conn, params) do +    godmode = params["godmode"] == "true" || params["godmode"] == true +    local_only = params["local_only"] == "true" || params["local_only"] == true +    {page, page_size} = page_params(params) + +    activities = +      ActivityPub.fetch_statuses(admin, %{ +        "godmode" => godmode, +        "local_only" => local_only, +        "limit" => page_size, +        "offset" => (page - 1) * page_size +      }) + +    conn +    |> put_view(Pleroma.Web.AdminAPI.StatusView) +    |> render("index.json", %{activities: activities, as: :activity}) +  end +    def status_update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do      with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do        {:ok, sensitive} = Ecto.Type.cast(:boolean, params["sensitive"]) diff --git a/lib/pleroma/web/admin_api/search.ex b/lib/pleroma/web/admin_api/search.ex index 778cf4c36..29cea1f44 100644 --- a/lib/pleroma/web/admin_api/search.ex +++ b/lib/pleroma/web/admin_api/search.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.AdminAPI.Search do diff --git a/lib/pleroma/web/admin_api/views/config_view.ex b/lib/pleroma/web/admin_api/views/config_view.ex index bbb53efcd..587ef760e 100644 --- a/lib/pleroma/web/admin_api/views/config_view.ex +++ b/lib/pleroma/web/admin_api/views/config_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.AdminAPI.ConfigView do diff --git a/lib/pleroma/web/admin_api/views/status_view.ex b/lib/pleroma/web/admin_api/views/status_view.ex index 6f2b2b09c..360ddc22c 100644 --- a/lib/pleroma/web/admin_api/views/status_view.ex +++ b/lib/pleroma/web/admin_api/views/status_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.AdminAPI.StatusView do @@ -10,7 +10,7 @@ defmodule Pleroma.Web.AdminAPI.StatusView do    alias Pleroma.User    def render("index.json", opts) do -    render_many(opts.activities, __MODULE__, "show.json", opts) +    safe_render_many(opts.activities, __MODULE__, "show.json", opts)    end    def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} = opts) do diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 2a348dcf6..027b3dc30 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.CommonAPI do diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 4445894b0..8746273c4 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.CommonAPI.Utils do diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index e3d7a465b..c9a3a2585 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ControllerHelper do diff --git a/lib/pleroma/web/endpoint.ex b/lib/pleroma/web/endpoint.ex index a77b73109..118c3ac6f 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Endpoint do diff --git a/lib/pleroma/web/federator/federator.ex b/lib/pleroma/web/federator/federator.ex index 013fb5b70..fd904ef0a 100644 --- a/lib/pleroma/web/federator/federator.ex +++ b/lib/pleroma/web/federator/federator.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Federator do diff --git a/lib/pleroma/web/feed/feed_view.ex b/lib/pleroma/web/feed/feed_view.ex index 334802e0a..e18adaea8 100644 --- a/lib/pleroma/web/feed/feed_view.ex +++ b/lib/pleroma/web/feed/feed_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Feed.FeedView do diff --git a/lib/pleroma/web/feed/tag_controller.ex b/lib/pleroma/web/feed/tag_controller.ex index 9accd0872..75c9ea17e 100644 --- a/lib/pleroma/web/feed/tag_controller.ex +++ b/lib/pleroma/web/feed/tag_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Feed.TagController do diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex index f5096834b..59aabb549 100644 --- a/lib/pleroma/web/feed/user_controller.ex +++ b/lib/pleroma/web/feed/user_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Feed.UserController do diff --git a/lib/pleroma/web/masto_fe_controller.ex b/lib/pleroma/web/masto_fe_controller.ex index 9f7e4943c..43649ad26 100644 --- a/lib/pleroma/web/masto_fe_controller.ex +++ b/lib/pleroma/web/masto_fe_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastoFEController do diff --git a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex index f2508aca4..0c9218454 100644 --- a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.NotificationController do diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 5a5db8e00..fcab4ef63 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.SearchController do diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex index 287d1631c..b0048102f 100644 --- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.StatusController do diff --git a/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex b/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex index 11f7b85d3..11df6fc4a 100644 --- a/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.SubscriptionController do diff --git a/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex b/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex index b9cc8f104..0cdc7bd8d 100644 --- a/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.SuggestionController do diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 29964a1d4..09e08271b 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.TimelineController do @@ -10,9 +10,20 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do    alias Pleroma.Pagination    alias Pleroma.Plugs.OAuthScopesPlug +  alias Pleroma.Plugs.RateLimiter    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub +  # TODO: Replace with a macro when there is a Phoenix release with +  # https://github.com/phoenixframework/phoenix/commit/2e8c63c01fec4dde5467dbbbf9705ff9e780735e +  # in it + +  plug(RateLimiter, [name: :timeline, bucket_name: :direct_timeline] when action == :direct) +  plug(RateLimiter, [name: :timeline, bucket_name: :public_timeline] when action == :public) +  plug(RateLimiter, [name: :timeline, bucket_name: :home_timeline] when action == :home) +  plug(RateLimiter, [name: :timeline, bucket_name: :hashtag_timeline] when action == :hashtag) +  plug(RateLimiter, [name: :timeline, bucket_name: :list_timeline] when action == :list) +    plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:home, :direct])    plug(OAuthScopesPlug, %{scopes: ["read:lists"]} when action == :list) diff --git a/lib/pleroma/web/mastodon_api/mastodon_api.ex b/lib/pleroma/web/mastodon_api/mastodon_api.ex index 390a2b190..3fe2be521 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.MastodonAPI do diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index c6d37ead7..6dc191250 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.AccountView do diff --git a/lib/pleroma/web/mastodon_api/views/app_view.ex b/lib/pleroma/web/mastodon_api/views/app_view.ex index beba89edb..d934e2107 100644 --- a/lib/pleroma/web/mastodon_api/views/app_view.ex +++ b/lib/pleroma/web/mastodon_api/views/app_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.AppView do diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 360ec10f0..33145c484 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.NotificationView do diff --git a/lib/pleroma/web/mastodon_api/views/poll_view.ex b/lib/pleroma/web/mastodon_api/views/poll_view.ex index 6bb3652fb..40edbb213 100644 --- a/lib/pleroma/web/mastodon_api/views/poll_view.ex +++ b/lib/pleroma/web/mastodon_api/views/poll_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.PollView do diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 6b0fe9215..f7469cdff 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.MastodonAPI.StatusView do diff --git a/lib/pleroma/web/metadata/feed.ex b/lib/pleroma/web/metadata/feed.ex index ee48913a7..bd1459a17 100644 --- a/lib/pleroma/web/metadata/feed.ex +++ b/lib/pleroma/web/metadata/feed.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Metadata.Providers.Feed do diff --git a/lib/pleroma/web/metadata/rel_me.ex b/lib/pleroma/web/metadata/rel_me.ex index 86dcc1a3b..8905c9c72 100644 --- a/lib/pleroma/web/metadata/rel_me.ex +++ b/lib/pleroma/web/metadata/rel_me.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Metadata.Providers.RelMe do diff --git a/lib/pleroma/web/metadata/utils.ex b/lib/pleroma/web/metadata/utils.ex index 000bd9f66..2f0dfb474 100644 --- a/lib/pleroma/web/metadata/utils.ex +++ b/lib/pleroma/web/metadata/utils.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Metadata.Utils do diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 947edd8b7..18eb41333 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Nodeinfo.NodeinfoController do diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index 528f08574..46688db7e 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.OAuth.OAuthController do diff --git a/lib/pleroma/web/oauth/scopes.ex b/lib/pleroma/web/oauth/scopes.ex index 151467494..8ecf901f3 100644 --- a/lib/pleroma/web/oauth/scopes.ex +++ b/lib/pleroma/web/oauth/scopes.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.OAuth.Scopes do diff --git a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex index f86a068fb..0e160bbfc 100644 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do diff --git a/lib/pleroma/web/rel_me.ex b/lib/pleroma/web/rel_me.ex index 540fa65df..e97c398dc 100644 --- a/lib/pleroma/web/rel_me.ex +++ b/lib/pleroma/web/rel_me.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.RelMe do diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 9702e90f1..0779065ee 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.RichMedia.Parser do diff --git a/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex b/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex index fae3c462e..ae0f36702 100644 --- a/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex +++ b/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c2ffb025a..980242c68 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Router do @@ -192,6 +192,7 @@ defmodule Pleroma.Web.Router do      put("/statuses/:id", AdminAPIController, :status_update)      delete("/statuses/:id", AdminAPIController, :status_delete) +    get("/statuses", AdminAPIController, :list_statuses)      get("/config", AdminAPIController, :config_show)      post("/config", AdminAPIController, :config_update) diff --git a/lib/pleroma/web/streamer/worker.ex b/lib/pleroma/web/streamer/worker.ex index 5392c1ec3..29f992a67 100644 --- a/lib/pleroma/web/streamer/worker.ex +++ b/lib/pleroma/web/streamer/worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.Streamer.Worker do diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index f08b9d28c..bca0e26eb 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.TwitterAPI.UtilController do diff --git a/lib/pleroma/web/twitter_api/views/remote_follow_view.ex b/lib/pleroma/web/twitter_api/views/remote_follow_view.ex index d469c4726..c05c7821c 100644 --- a/lib/pleroma/web/twitter_api/views/remote_follow_view.ex +++ b/lib/pleroma/web/twitter_api/views/remote_follow_view.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.TwitterAPI.RemoteFollowView do diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex index 2cbc6b64d..3c5820a86 100644 --- a/lib/pleroma/workers/attachments_cleanup_worker.ex +++ b/lib/pleroma/workers/attachments_cleanup_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.AttachmentsCleanupWorker do diff --git a/lib/pleroma/workers/background_worker.ex b/lib/pleroma/workers/background_worker.ex index ac2fe6946..598df6580 100644 --- a/lib/pleroma/workers/background_worker.ex +++ b/lib/pleroma/workers/background_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.BackgroundWorker do diff --git a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex b/lib/pleroma/workers/cron/clear_oauth_token_worker.ex index a24407874..341eff054 100644 --- a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex +++ b/lib/pleroma/workers/cron/clear_oauth_token_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.Cron.ClearOauthTokenWorker do diff --git a/lib/pleroma/workers/cron/digest_emails_worker.ex b/lib/pleroma/workers/cron/digest_emails_worker.ex index 0a00129df..c589a59eb 100644 --- a/lib/pleroma/workers/cron/digest_emails_worker.ex +++ b/lib/pleroma/workers/cron/digest_emails_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.Cron.DigestEmailsWorker do diff --git a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex b/lib/pleroma/workers/cron/purge_expired_activities_worker.ex index 7a52860a9..b8953dd7f 100644 --- a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex +++ b/lib/pleroma/workers/cron/purge_expired_activities_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker do diff --git a/lib/pleroma/workers/cron/stats_worker.ex b/lib/pleroma/workers/cron/stats_worker.ex index 425ad41ca..e9b8d59c4 100644 --- a/lib/pleroma/workers/cron/stats_worker.ex +++ b/lib/pleroma/workers/cron/stats_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.Cron.StatsWorker do diff --git a/lib/pleroma/workers/remote_fetcher_worker.ex b/lib/pleroma/workers/remote_fetcher_worker.ex index e860ca869..ec6534f21 100644 --- a/lib/pleroma/workers/remote_fetcher_worker.ex +++ b/lib/pleroma/workers/remote_fetcher_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.RemoteFetcherWorker do diff --git a/lib/pleroma/workers/scheduled_activity_worker.ex b/lib/pleroma/workers/scheduled_activity_worker.ex index bd41ab4ce..8905f4ad0 100644 --- a/lib/pleroma/workers/scheduled_activity_worker.ex +++ b/lib/pleroma/workers/scheduled_activity_worker.ex @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Workers.ScheduledActivityWorker do | 
