diff options
author | kaniini <nenolod@gmail.com> | 2019-06-21 22:56:54 +0000 |
---|---|---|
committer | kaniini <nenolod@gmail.com> | 2019-06-21 22:56:54 +0000 |
commit | 55742d978d15bba75bcae9c6f2d91afbb77d0dc5 (patch) | |
tree | 7132505554ff5eee71212001cf223500ea4c911e /lib | |
parent | 89fa14f5583b1465db1bad8c1fae2f7c436bf933 (diff) | |
parent | 127a5a7d6567124b834a1f5399a0032c1c1f849d (diff) | |
download | pleroma-55742d978d15bba75bcae9c6f2d91afbb77d0dc5.tar.gz |
Merge branch 'feature/mrf-anti-link-spam' into 'develop'
implement anti link spam MRF
See merge request pleroma/pleroma!1307
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex | 48 |
1 files changed, 48 insertions, 0 deletions
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 new file mode 100644 index 000000000..2da3eac2f --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex @@ -0,0 +1,48 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy do + alias Pleroma.User + + require Logger + + # has the user successfully posted before? + defp old_user?(%User{} = u) do + u.info.note_count > 0 || u.info.follower_count > 0 + end + + # does the post contain links? + defp contains_links?(%{"content" => content} = _object) do + content + |> Floki.filter_out("a.mention,a.hashtag,a[rel~=\"tag\"],a.zrl") + |> Floki.attribute("a", "href") + |> length() > 0 + end + + defp contains_links?(_), do: false + + def filter(%{"type" => "Create", "actor" => actor, "object" => object} = message) do + with {:ok, %User{} = u} <- User.get_or_fetch_by_ap_id(actor), + {:contains_links, true} <- {:contains_links, contains_links?(object)}, + {:old_user, true} <- {:old_user, old_user?(u)} do + {:ok, message} + else + {:contains_links, false} -> + {:ok, message} + + {:old_user, false} -> + {:reject, nil} + + {:error, _} -> + {:reject, nil} + + e -> + Logger.warn("[MRF anti-link-spam] WTF: unhandled error #{inspect(e)}") + {:reject, nil} + end + end + + # in all other cases, pass through + def filter(message), do: {:ok, message} +end |