Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F162692
anti_followbot_policy.ex
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
2 KB
Referenced Files
None
Subscribers
None
anti_followbot_policy.ex
View Options
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule
Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicy
do
alias
Pleroma.User
@moduledoc
"Prevent followbots from following with a bit of heuristic"
@behaviour
Pleroma.Web.ActivityPub.MRF.Policy
# XXX: this should become User.normalize_by_ap_id() or similar, really.
defp
normalize_by_ap_id
(%{
"id"
=>
id
}),
do
:
User
.
get_cached_by_ap_id
(
id
)
defp
normalize_by_ap_id
(
uri
)
when
is_binary
(
uri
),
do
:
User
.
get_cached_by_ap_id
(
uri
)
defp
normalize_by_ap_id
(
_
),
do
:
nil
defp
score_nickname
(
"followbot@"
<>
_
),
do
:
1.0
defp
score_nickname
(
"federationbot@"
<>
_
),
do
:
1.0
defp
score_nickname
(
"federation_bot@"
<>
_
),
do
:
1.0
defp
score_nickname
(
_
),
do
:
0.0
defp
score_displayname
(
"federation bot"
),
do
:
1.0
defp
score_displayname
(
"federationbot"
),
do
:
1.0
defp
score_displayname
(
"fedibot"
),
do
:
1.0
defp
score_displayname
(
_
),
do
:
0.0
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
nickname
|>
String
.
downcase
()
|>
score_nickname
()
else
0.0
end
# displayname will either be a binary string or nil, if a displayname isn't set.
name_score
=
if
is_binary
(
displayname
)
do
displayname
|>
String
.
downcase
()
|>
score_displayname
()
else
0.0
end
# 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
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
}
=
activity
)
do
%
User
{}
=
actor
=
normalize_by_ap_id
(
actor_id
)
score
=
determine_if_followbot
(
actor
)
if
score
<
0.8
||
bot_allowed?
(
activity
,
actor
)
do
{
:ok
,
activity
}
else
{
:reject
,
"[AntiFollowbotPolicy] Scored
#{
actor_id
}
as
#{
score
}
"
}
end
end
@impl
true
def
filter
(
activity
),
do
:
{
:ok
,
activity
}
@impl
true
def
describe
,
do
:
{
:ok
,
%{}}
end
File Metadata
Details
Attached
Mime Type
text/x-ruby
Expires
Fri, Feb 21, 5:39 PM (13 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
66770
Default Alt Text
anti_followbot_policy.ex (2 KB)
Attached To
Mode
rPUBE pleroma-upstream
Attached
Detach File
Event Timeline
Log In to Comment