Merge remote-tracking branch 'origin/develop' into shigusegubu
* origin/develop: Add tlsv1.3 to suggestions hackney adapter helper & reverse proxy client: enable TLSv1.3 StealEmojiPolicy: fix String rejected_shortcodes Instruct users to run 'git pull' as the pleroma user Also use actor_type to determine if an account is a bot in antiFollowbotPolicy mix: Bump to 2.4.52 for 2.4.3 mergeback Skip cache when /objects or /activities is authenticated Allow to skip cache in Cache plug update sweet_xml [Security]
This commit is contained in:
commit
83e4a112b9
18 changed files with 175 additions and 36 deletions
|
|
@ -24,10 +24,6 @@ defmodule Pleroma.HTTP.AdapterHelper.Hackney do
|
|||
|> Pleroma.HTTP.AdapterHelper.maybe_add_proxy(proxy)
|
||||
end
|
||||
|
||||
defp add_scheme_opts(opts, %URI{scheme: "https"}) do
|
||||
Keyword.put(opts, :ssl_options, versions: [:"tlsv1.2", :"tlsv1.1", :tlsv1])
|
||||
end
|
||||
|
||||
defp add_scheme_opts(opts, _), do: opts
|
||||
|
||||
defp maybe_add_with_body(opts) do
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ defmodule Pleroma.ReverseProxy.Client.Hackney do
|
|||
|
||||
@impl true
|
||||
def request(method, url, headers, body, opts \\ []) do
|
||||
opts = Keyword.put(opts, :ssl_options, versions: [:"tlsv1.2", :"tlsv1.1", :tlsv1])
|
||||
:hackney.request(method, url, headers, body, opts)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
|||
user <- Map.get(assigns, :user, nil),
|
||||
{_, true} <- {:visible?, Visibility.visible_for_user?(object, user)} do
|
||||
conn
|
||||
|> maybe_skip_cache(user)
|
||||
|> assign(:tracking_fun_data, object.id)
|
||||
|> set_cache_ttl_for(object)
|
||||
|> put_resp_content_type("application/activity+json")
|
||||
|
|
@ -112,6 +113,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
|||
user <- Map.get(assigns, :user, nil),
|
||||
{_, true} <- {:visible?, Visibility.visible_for_user?(activity, user)} do
|
||||
conn
|
||||
|> maybe_skip_cache(user)
|
||||
|> maybe_set_tracking_data(activity)
|
||||
|> set_cache_ttl_for(activity)
|
||||
|> put_resp_content_type("application/activity+json")
|
||||
|
|
@ -151,6 +153,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
|||
assign(conn, :cache_ttl, ttl)
|
||||
end
|
||||
|
||||
def maybe_skip_cache(conn, user) do
|
||||
if user do
|
||||
conn
|
||||
|> assign(:skip_cache, true)
|
||||
else
|
||||
conn
|
||||
end
|
||||
end
|
||||
|
||||
# GET /relay/following
|
||||
def relay_following(conn, _params) do
|
||||
with %{halted: false} = conn <- FederatingPlug.call(conn, []) do
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy do
|
|||
defp score_displayname("fedibot"), do: 1.0
|
||||
defp score_displayname(_), do: 0.0
|
||||
|
||||
defp determine_if_followbot(%User{nickname: nickname, name: displayname}) do
|
||||
defp determine_if_followbot(%User{nickname: nickname, name: displayname, actor_type: actor_type}) do
|
||||
# nickname will be a binary string except when following a relay
|
||||
nick_score =
|
||||
if is_binary(nickname) do
|
||||
|
|
@ -45,19 +45,32 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy do
|
|||
0.0
|
||||
end
|
||||
|
||||
nick_score + name_score
|
||||
# actor_type "Service" is a Bot account
|
||||
actor_type_score =
|
||||
if actor_type == "Service" do
|
||||
1.0
|
||||
else
|
||||
0.0
|
||||
end
|
||||
|
||||
nick_score + name_score + actor_type_score
|
||||
end
|
||||
|
||||
defp determine_if_followbot(_), do: 0.0
|
||||
|
||||
defp bot_allowed?(%{"object" => target}, bot_actor) do
|
||||
%User{} = user = normalize_by_ap_id(target)
|
||||
|
||||
User.following?(user, bot_actor)
|
||||
end
|
||||
|
||||
@impl true
|
||||
def filter(%{"type" => "Follow", "actor" => actor_id} = message) do
|
||||
%User{} = actor = normalize_by_ap_id(actor_id)
|
||||
|
||||
score = determine_if_followbot(actor)
|
||||
|
||||
# TODO: scan biography data for keywords and score it somehow.
|
||||
if score < 0.8 do
|
||||
if score < 0.8 || bot_allowed?(message, actor) do
|
||||
{:ok, message}
|
||||
else
|
||||
{:reject, "[AntiFollowbotPolicy] Scored #{actor_id} as #{score}"}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy do
|
|||
|
||||
defp accept_host?(host), do: host in Config.get([:mrf_steal_emoji, :hosts], [])
|
||||
|
||||
defp shortcode_matches?(shortcode, pattern) when is_binary(pattern) do
|
||||
shortcode == pattern
|
||||
end
|
||||
|
||||
defp shortcode_matches?(shortcode, pattern) do
|
||||
String.match?(shortcode, pattern)
|
||||
end
|
||||
|
||||
defp steal_emoji({shortcode, url}, emoji_dir_path) do
|
||||
url = Pleroma.Web.MediaProxy.url(url)
|
||||
|
||||
|
|
@ -72,7 +80,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy do
|
|||
reject_emoji? =
|
||||
[:mrf_steal_emoji, :rejected_shortcodes]
|
||||
|> Config.get([])
|
||||
|> Enum.find(false, fn regex -> String.match?(shortcode, regex) end)
|
||||
|> Enum.find(false, fn pattern -> shortcode_matches?(shortcode, pattern) end)
|
||||
|
||||
!reject_emoji?
|
||||
end)
|
||||
|
|
@ -122,8 +130,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy do
|
|||
%{
|
||||
key: :rejected_shortcodes,
|
||||
type: {:list, :string},
|
||||
description: "Regex-list of shortcodes to reject",
|
||||
suggestions: [""]
|
||||
description: """
|
||||
A list of patterns or matches to reject shortcodes with.
|
||||
|
||||
Each pattern can be a string or [Regex](https://hexdocs.pm/elixir/Regex.html) in the format of `~r/PATTERN/`.
|
||||
""",
|
||||
suggestions: ["foo", ~r/foo/]
|
||||
},
|
||||
%{
|
||||
key: :size_limit,
|
||||
|
|
|
|||
|
|
@ -97,13 +97,21 @@ defmodule Pleroma.Web.Plugs.Cache do
|
|||
key = cache_key(conn, opts)
|
||||
content_type = content_type(conn)
|
||||
|
||||
should_cache = not Map.get(conn.assigns, :skip_cache, false)
|
||||
|
||||
conn =
|
||||
unless opts[:tracking_fun] do
|
||||
@cachex.put(:web_resp_cache, key, {content_type, body}, ttl: ttl)
|
||||
if should_cache do
|
||||
@cachex.put(:web_resp_cache, key, {content_type, body}, ttl: ttl)
|
||||
end
|
||||
|
||||
conn
|
||||
else
|
||||
tracking_fun_data = Map.get(conn.assigns, :tracking_fun_data, nil)
|
||||
@cachex.put(:web_resp_cache, key, {content_type, body, tracking_fun_data}, ttl: ttl)
|
||||
|
||||
if should_cache do
|
||||
@cachex.put(:web_resp_cache, key, {content_type, body, tracking_fun_data}, ttl: ttl)
|
||||
end
|
||||
|
||||
opts.tracking_fun.(conn, tracking_fun_data)
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue