KeywordPolicy: Still match when fields are absent
This commit is contained in:
parent
beefc022dd
commit
3a0f99ed35
|
@ -20,9 +20,17 @@ defp string_matches?(string, pattern) do
|
||||||
String.match?(string, pattern)
|
String.match?(string, pattern)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp check_reject(%{"object" => %{"content" => content, "summary" => summary}} = message) do
|
defp object_payload(%{} = object) do
|
||||||
|
[object["content"], object["summary"], object["name"]]
|
||||||
|
|> Enum.filter(& &1)
|
||||||
|
|> Enum.join("\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp check_reject(%{"object" => %{} = object} = message) do
|
||||||
|
payload = object_payload(object)
|
||||||
|
|
||||||
if Enum.any?(Pleroma.Config.get([:mrf_keyword, :reject]), fn pattern ->
|
if Enum.any?(Pleroma.Config.get([:mrf_keyword, :reject]), fn pattern ->
|
||||||
string_matches?(content, pattern) or string_matches?(summary, pattern)
|
string_matches?(payload, pattern)
|
||||||
end) do
|
end) do
|
||||||
{:reject, "[KeywordPolicy] Matches with rejected keyword"}
|
{:reject, "[KeywordPolicy] Matches with rejected keyword"}
|
||||||
else
|
else
|
||||||
|
@ -30,12 +38,12 @@ defp check_reject(%{"object" => %{"content" => content, "summary" => summary}} =
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp check_ftl_removal(
|
defp check_ftl_removal(%{"to" => to, "object" => %{} = object} = message) do
|
||||||
%{"to" => to, "object" => %{"content" => content, "summary" => summary}} = message
|
payload = object_payload(object)
|
||||||
) do
|
|
||||||
if Pleroma.Constants.as_public() in to and
|
if Pleroma.Constants.as_public() in to and
|
||||||
Enum.any?(Pleroma.Config.get([:mrf_keyword, :federated_timeline_removal]), fn pattern ->
|
Enum.any?(Pleroma.Config.get([:mrf_keyword, :federated_timeline_removal]), fn pattern ->
|
||||||
string_matches?(content, pattern) or string_matches?(summary, pattern)
|
string_matches?(payload, pattern)
|
||||||
end) do
|
end) do
|
||||||
to = List.delete(to, Pleroma.Constants.as_public())
|
to = List.delete(to, Pleroma.Constants.as_public())
|
||||||
cc = [Pleroma.Constants.as_public() | message["cc"] || []]
|
cc = [Pleroma.Constants.as_public() | message["cc"] || []]
|
||||||
|
@ -51,35 +59,24 @@ defp check_ftl_removal(
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp check_replace(%{"object" => %{"content" => content, "summary" => summary}} = message) do
|
defp check_replace(%{"object" => %{} = object} = message) do
|
||||||
content =
|
object =
|
||||||
if is_binary(content) do
|
["content", "name", "summary"]
|
||||||
content
|
|> Enum.filter(fn field -> Map.has_key?(object, field) && object[field] end)
|
||||||
else
|
|> Enum.reduce(object, fn field, object ->
|
||||||
""
|
data =
|
||||||
end
|
Enum.reduce(
|
||||||
|
Pleroma.Config.get([:mrf_keyword, :replace]),
|
||||||
|
object[field],
|
||||||
|
fn {pat, repl}, acc -> String.replace(acc, pat, repl) end
|
||||||
|
)
|
||||||
|
|
||||||
summary =
|
Map.put(object, field, data)
|
||||||
if is_binary(summary) do
|
end)
|
||||||
summary
|
|
||||||
else
|
|
||||||
""
|
|
||||||
end
|
|
||||||
|
|
||||||
{content, summary} =
|
message = Map.put(message, "object", object)
|
||||||
Enum.reduce(
|
|
||||||
Pleroma.Config.get([:mrf_keyword, :replace]),
|
|
||||||
{content, summary},
|
|
||||||
fn {pattern, replacement}, {content_acc, summary_acc} ->
|
|
||||||
{String.replace(content_acc, pattern, replacement),
|
|
||||||
String.replace(summary_acc, pattern, replacement)}
|
|
||||||
end
|
|
||||||
)
|
|
||||||
|
|
||||||
{:ok,
|
{:ok, message}
|
||||||
message
|
|
||||||
|> put_in(["object", "content"], content)
|
|
||||||
|> put_in(["object", "summary"], summary)}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
|
|
Loading…
Reference in New Issue