Browse Source

Merge commit '07fed0fda2473fc4e1e3b01e863217391fd2902f'; commit 'e3173a279dad89dfce6eae89368ad3ba180c0490'; commit '21787546c01069d1d1d8261f0bc37d13a73122a9'; commit 'fda34591cefad94277385311c6391d1ca2adb36c'; commit '0ada3fe823a3c2e6c5835431bdacfbdb8b3d02a7'; commit '32d263cb905dd7fffd43a4955295af0b2b378537'; commit 'c9e4200ed2167772294fceb4f282979b5ea04981'; commit '3ff9c5e2a67ab83c2abdb14cd246dea059079e75'; commit 'fa543a936124abee524f9a103c17d2601176dcd4'; commit 'c23b81e399d5be6fc30f4acb1d757d5eb291d8e1' into cycles-phase-1

cycles-config-url
No known key found for this signature in database GPG Key ID: 7211D1F99744FBB7
32 changed files with 215 additions and 133 deletions
  1. +4
    -0
      config/dev.exs
  2. +4
    -0
      config/test.exs
  3. +45
    -0
      lib/pleroma/activity/html.ex
  4. +16
    -14
      lib/pleroma/config/loader.ex
  5. +21
    -19
      lib/pleroma/config/transfer_task.ex
  6. +1
    -3
      lib/pleroma/gun.ex
  7. +3
    -3
      lib/pleroma/gun/connection_pool/reclaimer.ex
  8. +5
    -5
      lib/pleroma/gun/connection_pool/worker.ex
  9. +0
    -35
      lib/pleroma/html.ex
  10. +2
    -2
      lib/pleroma/http/adapter_helper/gun.ex
  11. +0
    -12
      lib/pleroma/web.ex
  12. +14
    -17
      lib/pleroma/web/activity_pub/pipeline.ex
  13. +0
    -1
      lib/pleroma/web/admin_api/controllers/o_auth_app_controller.ex
  14. +10
    -0
      lib/pleroma/web/admin_api/views/o_auth_app_view.ex
  15. +0
    -1
      lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex
  16. +0
    -1
      lib/pleroma/web/mastodon_api/controllers/media_controller.ex
  17. +0
    -2
      lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex
  18. +10
    -0
      lib/pleroma/web/mastodon_api/views/follow_request_view.ex
  19. +10
    -0
      lib/pleroma/web/mastodon_api/views/media_view.ex
  20. +2
    -2
      lib/pleroma/web/mastodon_api/views/status_view.ex
  21. +10
    -0
      lib/pleroma/web/mastodon_api/views/timeline_view.ex
  22. +2
    -1
      lib/pleroma/web/metadata/utils.ex
  23. +0
    -1
      lib/pleroma/web/pleroma_api/controllers/account_controller.ex
  24. +0
    -1
      lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex
  25. +0
    -2
      lib/pleroma/web/pleroma_api/controllers/notification_controller.ex
  26. +10
    -0
      lib/pleroma/web/pleroma_api/views/account_view.ex
  27. +10
    -0
      lib/pleroma/web/pleroma_api/views/conversation_view.ex
  28. +10
    -0
      lib/pleroma/web/pleroma_api/views/notification_view.ex
  29. +1
    -1
      lib/pleroma/web/plugs/frontend_static.ex
  30. +24
    -8
      lib/pleroma/web/router.ex
  31. +0
    -1
      lib/pleroma/web/static_fe/static_fe_controller.ex
  32. +1
    -1
      test/pleroma/web/plugs/frontend_static_plug_test.exs

+ 4
- 0
config/dev.exs View File

@@ -54,6 +54,10 @@ config :pleroma, Pleroma.Repo,

config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: true

# Reduce recompilation time
# https://dashbit.co/blog/speeding-up-re-compilation-of-elixir-projects
config :phoenix, :plug_init_mode, :runtime

if File.exists?("./config/dev.secret.exs") do
import_config "dev.secret.exs"
else


+ 4
- 0
config/test.exs View File

@@ -133,6 +133,10 @@ config :pleroma, :side_effects,
ap_streamer: Pleroma.Web.ActivityPub.ActivityPubMock,
logger: Pleroma.LoggerMock

# Reduce recompilation time
# https://dashbit.co/blog/speeding-up-re-compilation-of-elixir-projects
config :phoenix, :plug_init_mode, :runtime

if File.exists?("./config/test.secret.exs") do
import_config "test.secret.exs"
else


+ 45
- 0
lib/pleroma/activity/html.ex View File

@@ -0,0 +1,45 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Activity.HTML do
alias Pleroma.HTML
alias Pleroma.Object

@cachex Pleroma.Config.get([:cachex, :provider], Cachex)

def get_cached_scrubbed_html_for_activity(
content,
scrubbers,
activity,
key \\ "",
callback \\ fn x -> x end
) do
key = "#{key}#{generate_scrubber_signature(scrubbers)}|#{activity.id}"

@cachex.fetch!(:scrubber_cache, key, fn _key ->
object = Object.normalize(activity, fetch: false)
HTML.ensure_scrubbed_html(content, scrubbers, object.data["fake"] || false, callback)
end)
end

def get_cached_stripped_html_for_activity(content, activity, key) do
get_cached_scrubbed_html_for_activity(
content,
FastSanitize.Sanitizer.StripTags,
activity,
key,
&HtmlEntities.decode/1
)
end

defp generate_scrubber_signature(scrubber) when is_atom(scrubber) do
generate_scrubber_signature([scrubber])
end

defp generate_scrubber_signature(scrubbers) do
Enum.reduce(scrubbers, "", fn scrubber, signature ->
"#{signature}#{to_string(scrubber)}"
end)
end
end

+ 16
- 14
lib/pleroma/config/loader.ex View File

@@ -3,19 +3,21 @@
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Config.Loader do
@reject_keys [
Pleroma.Repo,
Pleroma.Web.Endpoint,
:env,
:configurable_from_database,
:database,
:swarm
]

@reject_groups [
:postgrex,
:tesla
]
defp reject_keys,
do: [
Pleroma.Repo,
Pleroma.Web.Endpoint,
:env,
:configurable_from_database,
:database,
:swarm
]

defp reject_groups,
do: [
:postgrex,
:tesla
]

if Code.ensure_loaded?(Config.Reader) do
@reader Config.Reader
@@ -52,7 +54,7 @@ defmodule Pleroma.Config.Loader do
@spec filter_group(atom(), keyword()) :: keyword()
def filter_group(group, configs) do
Enum.reject(configs[group], fn {key, _v} ->
key in @reject_keys or group in @reject_groups or
key in reject_keys() or group in reject_groups() or
(group == :phoenix and key == :serve_endpoints)
end)
end


+ 21
- 19
lib/pleroma/config/transfer_task.ex View File

@@ -13,23 +13,25 @@ defmodule Pleroma.Config.TransferTask do

@type env() :: :test | :benchmark | :dev | :prod

@reboot_time_keys [
{:pleroma, :hackney_pools},
{:pleroma, :chat},
{:pleroma, Oban},
{:pleroma, :rate_limit},
{:pleroma, :markup},
{:pleroma, :streamer},
{:pleroma, :pools},
{:pleroma, :connections_pool}
]

@reboot_time_subkeys [
{:pleroma, Pleroma.Captcha, [:seconds_valid]},
{:pleroma, Pleroma.Upload, [:proxy_remote]},
{:pleroma, :instance, [:upload_limit]},
{:pleroma, :gopher, [:enabled]}
]
defp reboot_time_keys,
do: [
{:pleroma, :hackney_pools},
{:pleroma, :chat},
{:pleroma, Oban},
{:pleroma, :rate_limit},
{:pleroma, :markup},
{:pleroma, :streamer},
{:pleroma, :pools},
{:pleroma, :connections_pool}
]

defp reboot_time_subkeys,
do: [
{:pleroma, Pleroma.Captcha, [:seconds_valid]},
{:pleroma, Pleroma.Upload, [:proxy_remote]},
{:pleroma, :instance, [:upload_limit]},
{:pleroma, :gopher, [:enabled]}
]

def start_link(restart_pleroma? \\ true) do
load_and_update_env([], restart_pleroma?)
@@ -165,12 +167,12 @@ defmodule Pleroma.Config.TransferTask do
end

defp group_and_key_need_reboot?(group, key) do
Enum.any?(@reboot_time_keys, fn {g, k} -> g == group and k == key end)
Enum.any?(reboot_time_keys(), fn {g, k} -> g == group and k == key end)
end

defp group_and_subkey_need_reboot?(group, key, value) do
Keyword.keyword?(value) and
Enum.any?(@reboot_time_subkeys, fn {g, k, subkeys} ->
Enum.any?(reboot_time_subkeys(), fn {g, k, subkeys} ->
g == group and k == key and
Enum.any?(Keyword.keys(value), &(&1 in subkeys))
end)


+ 1
- 3
lib/pleroma/gun.ex View File

@@ -11,9 +11,7 @@ defmodule Pleroma.Gun do
@callback await(pid(), reference()) :: {:response, :fin, 200, []}
@callback set_owner(pid(), pid()) :: :ok

@api Pleroma.Config.get([Pleroma.Gun], Pleroma.Gun.API)

defp api, do: @api
defp api, do: Pleroma.Config.get([Pleroma.Gun], Pleroma.Gun.API)

def open(host, port, opts), do: api().open(host, port, opts)



+ 3
- 3
lib/pleroma/gun/connection_pool/reclaimer.ex View File

@@ -5,11 +5,11 @@
defmodule Pleroma.Gun.ConnectionPool.Reclaimer do
use GenServer, restart: :temporary

@registry Pleroma.Gun.ConnectionPool
defp registry, do: Pleroma.Gun.ConnectionPool

def start_monitor do
pid =
case :gen_server.start(__MODULE__, [], name: {:via, Registry, {@registry, "reclaimer"}}) do
case :gen_server.start(__MODULE__, [], name: {:via, Registry, {registry(), "reclaimer"}}) do
{:ok, pid} ->
pid

@@ -46,7 +46,7 @@ defmodule Pleroma.Gun.ConnectionPool.Reclaimer do
# {worker_pid, crf, last_reference} end)
unused_conns =
Registry.select(
@registry,
registry(),
[
{{:_, :"$1", {:_, :"$2", :"$3", :"$4"}}, [{:==, :"$2", []}], [{{:"$1", :"$3", :"$4"}}]}
]


+ 5
- 5
lib/pleroma/gun/connection_pool/worker.ex View File

@@ -6,10 +6,10 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do
alias Pleroma.Gun
use GenServer, restart: :temporary

@registry Pleroma.Gun.ConnectionPool
defp registry, do: Pleroma.Gun.ConnectionPool

def start_link([key | _] = opts) do
GenServer.start_link(__MODULE__, opts, name: {:via, Registry, {@registry, key}})
GenServer.start_link(__MODULE__, opts, name: {:via, Registry, {registry(), key}})
end

@impl true
@@ -24,7 +24,7 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do
time = :erlang.monotonic_time(:millisecond)

{_, _} =
Registry.update_value(@registry, key, fn _ ->
Registry.update_value(registry(), key, fn _ ->
{conn_pid, [client_pid], 1, time}
end)

@@ -65,7 +65,7 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do
time = :erlang.monotonic_time(:millisecond)

{{conn_pid, used_by, _, _}, _} =
Registry.update_value(@registry, key, fn {conn_pid, used_by, crf, last_reference} ->
Registry.update_value(registry(), key, fn {conn_pid, used_by, crf, last_reference} ->
{conn_pid, [client_pid | used_by], crf(time - last_reference, crf), time}
end)

@@ -92,7 +92,7 @@ defmodule Pleroma.Gun.ConnectionPool.Worker do
@impl true
def handle_call(:remove_client, {client_pid, _}, %{key: key} = state) do
{{_conn_pid, used_by, _crf, _last_reference}, _} =
Registry.update_value(@registry, key, fn {conn_pid, used_by, crf, last_reference} ->
Registry.update_value(registry(), key, fn {conn_pid, used_by, crf, last_reference} ->
{conn_pid, List.delete(used_by, client_pid), crf, last_reference}
end)



+ 0
- 35
lib/pleroma/html.ex View File

@@ -49,31 +49,6 @@ defmodule Pleroma.HTML do
def filter_tags(html), do: filter_tags(html, nil)
def strip_tags(html), do: filter_tags(html, FastSanitize.Sanitizer.StripTags)

def get_cached_scrubbed_html_for_activity(
content,
scrubbers,
activity,
key \\ "",
callback \\ fn x -> x end
) do
key = "#{key}#{generate_scrubber_signature(scrubbers)}|#{activity.id}"

@cachex.fetch!(:scrubber_cache, key, fn _key ->
object = Pleroma.Object.normalize(activity, fetch: false)
ensure_scrubbed_html(content, scrubbers, object.data["fake"] || false, callback)
end)
end

def get_cached_stripped_html_for_activity(content, activity, key) do
get_cached_scrubbed_html_for_activity(
content,
FastSanitize.Sanitizer.StripTags,
activity,
key,
&HtmlEntities.decode/1
)
end

def ensure_scrubbed_html(
content,
scrubbers,
@@ -92,16 +67,6 @@ defmodule Pleroma.HTML do
end
end

defp generate_scrubber_signature(scrubber) when is_atom(scrubber) do
generate_scrubber_signature([scrubber])
end

defp generate_scrubber_signature(scrubbers) do
Enum.reduce(scrubbers, "", fn scrubber, signature ->
"#{signature}#{to_string(scrubber)}"
end)
end

def extract_first_external_url_from_object(%{data: %{"content" => content}} = object)
when is_binary(content) do
unless object.data["fake"] do


+ 2
- 2
lib/pleroma/http/adapter_helper/gun.ex View File

@@ -54,8 +54,8 @@ defmodule Pleroma.HTTP.AdapterHelper.Gun do
Config.get([:pools, pool, :recv_timeout], default)
end

@prefix Pleroma.Gun.ConnectionPool
def limiter_setup do
prefix = Pleroma.Gun.ConnectionPool
wait = Config.get([:connections_pool, :connection_acquisition_wait])
retries = Config.get([:connections_pool, :connection_acquisition_retries])

@@ -66,7 +66,7 @@ defmodule Pleroma.HTTP.AdapterHelper.Gun do
max_waiting = Keyword.get(opts, :max_waiting, 10)

result =
ConcurrentLimiter.new(:"#{@prefix}.#{name}", max_running, max_waiting,
ConcurrentLimiter.new(:"#{prefix}.#{name}", max_running, max_waiting,
wait: wait,
max_retries: retries
)


+ 0
- 12
lib/pleroma/web.ex View File

@@ -235,16 +235,4 @@ defmodule Pleroma.Web do
def base_url do
Pleroma.Web.Endpoint.url()
end

# TODO: Change to Phoenix.Router.routes/1 for Phoenix 1.6.0+
def get_api_routes do
Pleroma.Web.Router.__routes__()
|> Enum.reject(fn r -> r.plug == Pleroma.Web.Fallback.RedirectController end)
|> Enum.map(fn r ->
r.path
|> String.split("/", trim: true)
|> List.first()
end)
|> Enum.uniq()
end
end

+ 14
- 17
lib/pleroma/web/activity_pub/pipeline.ex View File

@@ -7,26 +7,23 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do
alias Pleroma.Config
alias Pleroma.Object
alias Pleroma.Repo
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.ActivityPub.MRF
alias Pleroma.Web.ActivityPub.ObjectValidator
alias Pleroma.Web.ActivityPub.SideEffects
alias Pleroma.Web.ActivityPub
alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.Federator

@side_effects Config.get([:pipeline, :side_effects], SideEffects)
@federator Config.get([:pipeline, :federator], Federator)
@object_validator Config.get([:pipeline, :object_validator], ObjectValidator)
@mrf Config.get([:pipeline, :mrf], MRF)
@activity_pub Config.get([:pipeline, :activity_pub], ActivityPub)
@config Config.get([:pipeline, :config], Config)
defp side_effects, do: Config.get([:pipeline, :side_effects], SideEffects)
defp federator, do: Config.get([:pipeline, :federator], Federator)
defp object_validator, do: Config.get([:pipeline, :object_validator], ObjectValidator)
defp mrf, do: Config.get([:pipeline, :mrf], MRF)
defp activity_pub, do: Config.get([:pipeline, :activity_pub], ActivityPub)
defp config, do: Config.get([:pipeline, :config], Config)

@spec common_pipeline(map(), keyword()) ::
{:ok, Activity.t() | Object.t(), keyword()} | {:error, any()}
def common_pipeline(object, meta) do
case Repo.transaction(fn -> do_common_pipeline(object, meta) end) do
{:ok, {:ok, activity, meta}} ->
@side_effects.handle_after_transaction(meta)
side_effects().handle_after_transaction(meta)
{:ok, activity, meta}

{:ok, value} ->
@@ -42,13 +39,13 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do

def do_common_pipeline(object, meta) do
with {_, {:ok, validated_object, meta}} <-
{:validate_object, @object_validator.validate(object, meta)},
{:validate_object, object_validator().validate(object, meta)},
{_, {:ok, mrfd_object, meta}} <-
{:mrf_object, @mrf.pipeline_filter(validated_object, meta)},
{:mrf_object, mrf().pipeline_filter(validated_object, meta)},
{_, {:ok, activity, meta}} <-
{:persist_object, @activity_pub.persist(mrfd_object, meta)},
{:persist_object, activity_pub().persist(mrfd_object, meta)},
{_, {:ok, activity, meta}} <-
{:execute_side_effects, @side_effects.handle(activity, meta)},
{:execute_side_effects, side_effects().handle(activity, meta)},
{_, {:ok, _}} <- {:federation, maybe_federate(activity, meta)} do
{:ok, activity, meta}
else
@@ -61,7 +58,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do

defp maybe_federate(%Activity{} = activity, meta) do
with {:ok, local} <- Keyword.fetch(meta, :local) do
do_not_federate = meta[:do_not_federate] || !@config.get([:instance, :federating])
do_not_federate = meta[:do_not_federate] || !config().get([:instance, :federating])

if !do_not_federate and local and not Visibility.is_local_public?(activity) do
activity =
@@ -71,7 +68,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do
activity
end

@federator.publish(activity)
federator().publish(activity)
{:ok, :federated}
else
{:ok, :not_federated}


+ 0
- 1
lib/pleroma/web/admin_api/controllers/o_auth_app_controller.ex View File

@@ -13,7 +13,6 @@ defmodule Pleroma.Web.AdminAPI.OAuthAppController do
require Logger

plug(Pleroma.Web.ApiSpec.CastAndValidate)
plug(:put_view, Pleroma.Web.MastodonAPI.AppView)

plug(
OAuthScopesPlug,


+ 10
- 0
lib/pleroma/web/admin_api/views/o_auth_app_view.ex View File

@@ -0,0 +1,10 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.AdminAPI.OAuthAppView do
use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI

def render(view, opts), do: MastodonAPI.AppView.render(view, opts)
end

+ 0
- 1
lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex View File

@@ -9,7 +9,6 @@ defmodule Pleroma.Web.MastodonAPI.FollowRequestController do
alias Pleroma.Web.CommonAPI
alias Pleroma.Web.Plugs.OAuthScopesPlug

plug(:put_view, Pleroma.Web.MastodonAPI.AccountView)
plug(Pleroma.Web.ApiSpec.CastAndValidate)
plug(:assign_follower when action != :index)



+ 0
- 1
lib/pleroma/web/mastodon_api/controllers/media_controller.ex View File

@@ -13,7 +13,6 @@ defmodule Pleroma.Web.MastodonAPI.MediaController do
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
plug(Majic.Plug, [pool: Pleroma.MajicPool] when action in [:create, :create2])
plug(Pleroma.Web.ApiSpec.CastAndValidate)
plug(:put_view, Pleroma.Web.MastodonAPI.StatusView)

plug(OAuthScopesPlug, %{scopes: ["read:media"]} when action == :show)
plug(OAuthScopesPlug, %{scopes: ["write:media"]} when action != :show)


+ 0
- 2
lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex View File

@@ -37,8 +37,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do
when action in [:public, :hashtag]
)

plug(:put_view, Pleroma.Web.MastodonAPI.StatusView)

defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.TimelineOperation

# GET /api/v1/timelines/home


+ 10
- 0
lib/pleroma/web/mastodon_api/views/follow_request_view.ex View File

@@ -0,0 +1,10 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.FollowRequestView do
use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI

def render(view, opts), do: MastodonAPI.AccountView.render(view, opts)
end

+ 10
- 0
lib/pleroma/web/mastodon_api/views/media_view.ex View File

@@ -0,0 +1,10 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.MediaView do
use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI

def render(view, opts), do: MastodonAPI.StatusView.render(view, opts)
end

+ 2
- 2
lib/pleroma/web/mastodon_api/views/status_view.ex View File

@@ -254,7 +254,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do

content_html =
content
|> HTML.get_cached_scrubbed_html_for_activity(
|> Activity.HTML.get_cached_scrubbed_html_for_activity(
User.html_filter_policy(opts[:for]),
activity,
"mastoapi:content"
@@ -262,7 +262,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do

content_plaintext =
content
|> HTML.get_cached_stripped_html_for_activity(
|> Activity.HTML.get_cached_stripped_html_for_activity(
activity,
"mastoapi:content"
)


+ 10
- 0
lib/pleroma/web/mastodon_api/views/timeline_view.ex View File

@@ -0,0 +1,10 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.MastodonAPI.TimelineView do
use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI

def render(view, opts), do: MastodonAPI.StatusView.render(view, opts)
end

+ 2
- 1
lib/pleroma/web/metadata/utils.ex View File

@@ -3,6 +3,7 @@
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.Metadata.Utils do
alias Pleroma.Activity
alias Pleroma.Emoji
alias Pleroma.Formatter
alias Pleroma.HTML
@@ -13,7 +14,7 @@ defmodule Pleroma.Web.Metadata.Utils do
# html content comes from DB already encoded, decode first and scrub after
|> HtmlEntities.decode()
|> String.replace(~r/<br\s?\/?>/, " ")
|> HTML.get_cached_stripped_html_for_activity(object, "metadata")
|> Activity.HTML.get_cached_stripped_html_for_activity(object, "metadata")
|> Emoji.Formatter.demojify()
|> HtmlEntities.decode()
|> Formatter.truncate()


+ 0
- 1
lib/pleroma/web/pleroma_api/controllers/account_controller.ex View File

@@ -47,7 +47,6 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do
plug(RateLimiter, [name: :account_confirmation_resend] when action == :confirmation_resend)

plug(:assign_account_by_id when action in [:favourites, :subscribe, :unsubscribe])
plug(:put_view, Pleroma.Web.MastodonAPI.AccountView)

defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaAccountOperation



+ 0
- 1
lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex View File

@@ -13,7 +13,6 @@ defmodule Pleroma.Web.PleromaAPI.ConversationController do
alias Pleroma.Web.Plugs.OAuthScopesPlug

plug(Pleroma.Web.ApiSpec.CastAndValidate)
plug(:put_view, Pleroma.Web.MastodonAPI.ConversationView)
plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:show, :statuses])

plug(


+ 0
- 2
lib/pleroma/web/pleroma_api/controllers/notification_controller.ex View File

@@ -14,8 +14,6 @@ defmodule Pleroma.Web.PleromaAPI.NotificationController do
%{scopes: ["write:notifications"]} when action == :mark_as_read
)

plug(:put_view, Pleroma.Web.MastodonAPI.NotificationView)

defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaNotificationOperation

def mark_as_read(%{assigns: %{user: user}, body_params: %{id: notification_id}} = conn, _) do


+ 10
- 0
lib/pleroma/web/pleroma_api/views/account_view.ex View File

@@ -0,0 +1,10 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.PleromaAPI.AccountView do
use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI

def render(view, opts), do: MastodonAPI.AccountView.render(view, opts)
end

+ 10
- 0
lib/pleroma/web/pleroma_api/views/conversation_view.ex View File

@@ -0,0 +1,10 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.PleromaAPI.ConversationView do
use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI

def render(view, opts), do: MastodonAPI.ConversationView.render(view, opts)
end

+ 10
- 0
lib/pleroma/web/pleroma_api/views/notification_view.ex View File

@@ -0,0 +1,10 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Web.PleromaAPI.NotificationView do
use Pleroma.Web, :view
alias Pleroma.Web.MastodonAPI

def render(view, opts), do: MastodonAPI.NotificationView.render(view, opts)
end

+ 1
- 1
lib/pleroma/web/plugs/frontend_static.ex View File

@@ -10,7 +10,7 @@ defmodule Pleroma.Web.Plugs.FrontendStatic do
"""
@behaviour Plug

@api_routes Pleroma.Web.get_api_routes()
@api_routes Pleroma.Web.Router.get_api_routes()

def file_path(path, frontend_type \\ :primary) do
if configuration = Pleroma.Config.get([:frontends, frontend_type]) do


+ 24
- 8
lib/pleroma/web/router.ex View File

@@ -140,6 +140,10 @@ defmodule Pleroma.Web.Router do
plug(Pleroma.Web.Plugs.MappedSignatureToIdentityPlug)
end

pipeline :static_fe do
plug(Pleroma.Web.Plugs.StaticFEPlug)
end

scope "/api/v1/pleroma", Pleroma.Web.TwitterAPI do
pipe_through(:pleroma_api)

@@ -631,7 +635,7 @@ defmodule Pleroma.Web.Router do
scope "/", Pleroma.Web do
# Note: html format is supported only if static FE is enabled
# Note: http signature is only considered for json requests (no auth for non-json requests)
pipe_through([:accepts_html_json, :http_signature, Pleroma.Web.Plugs.StaticFEPlug])
pipe_through([:accepts_html_json, :http_signature, :static_fe])

get("/objects/:uuid", OStatus.OStatusController, :object)
get("/activities/:uuid", OStatus.OStatusController, :activity)
@@ -645,7 +649,7 @@ defmodule Pleroma.Web.Router do
scope "/", Pleroma.Web do
# Note: html format is supported only if static FE is enabled
# Note: http signature is only considered for json requests (no auth for non-json requests)
pipe_through([:accepts_html_xml_json, :http_signature, Pleroma.Web.Plugs.StaticFEPlug])
pipe_through([:accepts_html_xml_json, :http_signature, :static_fe])

# Note: returns user _profile_ for json requests, redirects to user _feed_ for non-json ones
get("/users/:nickname", Feed.UserController, :feed_redirect, as: :user_feed)
@@ -653,7 +657,7 @@ defmodule Pleroma.Web.Router do

scope "/", Pleroma.Web do
# Note: html format is supported only if static FE is enabled
pipe_through([:accepts_html_xml, Pleroma.Web.Plugs.StaticFEPlug])
pipe_through([:accepts_html_xml, :static_fe])

get("/users/:nickname/feed", Feed.UserController, :feed, as: :user_feed)
end
@@ -764,11 +768,11 @@ defmodule Pleroma.Web.Router do
get("/embed/:id", EmbedController, :show)
end

scope "/proxy/", Pleroma.Web.MediaProxy do
get("/preview/:sig/:url", MediaProxyController, :preview)
get("/preview/:sig/:url/:filename", MediaProxyController, :preview)
get("/:sig/:url", MediaProxyController, :remote)
get("/:sig/:url/:filename", MediaProxyController, :remote)
scope "/proxy/", Pleroma.Web do
get("/preview/:sig/:url", MediaProxy.MediaProxyController, :preview)
get("/preview/:sig/:url/:filename", MediaProxy.MediaProxyController, :preview)
get("/:sig/:url", MediaProxy.MediaProxyController, :remote)
get("/:sig/:url/:filename", MediaProxy.MediaProxyController, :remote)
end

if Pleroma.Config.get(:env) == :dev do
@@ -821,4 +825,16 @@ defmodule Pleroma.Web.Router do

options("/*path", RedirectController, :empty)
end

# TODO: Change to Phoenix.Router.routes/1 for Phoenix 1.6.0+
def get_api_routes do
__MODULE__.__routes__()
|> Enum.reject(fn r -> r.plug == Pleroma.Web.Fallback.RedirectController end)
|> Enum.map(fn r ->
r.path
|> String.split("/", trim: true)
|> List.first()
end)
|> Enum.uniq()
end
end

+ 0
- 1
lib/pleroma/web/static_fe/static_fe_controller.ex View File

@@ -14,7 +14,6 @@ defmodule Pleroma.Web.StaticFE.StaticFEController do
alias Pleroma.Web.Router.Helpers

plug(:put_layout, :static_fe)
plug(:put_view, Pleroma.Web.StaticFE.StaticFEView)
plug(:assign_id)

@page_keys ["max_id", "min_id", "limit", "since_id", "order"]


+ 1
- 1
test/pleroma/web/plugs/frontend_static_plug_test.exs View File

@@ -103,6 +103,6 @@ defmodule Pleroma.Web.Plugs.FrontendStaticPlugTest do
"check_password"
]

assert expected_routes == Pleroma.Web.get_api_routes()
assert expected_routes == Pleroma.Web.Router.get_api_routes()
end
end

Loading…
Cancel
Save