Skip to content

Commit 2f0a09c

Browse files
committed
Fixed banned domain check (again), optimise domain and IP checks by using MapSet
1 parent a20c7e4 commit 2f0a09c

5 files changed

Lines changed: 29 additions & 12 deletions

File tree

lib/teiserver/moderation.ex

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -880,22 +880,38 @@ defmodule Teiserver.Moderation do
880880
Repo.all(BannedDomain)
881881
end
882882

883-
@spec list_banned_domains_cache :: [String.t()]
883+
@spec list_banned_domains_cache :: MapSet.t(String.t())
884884
def list_banned_domains_cache do
885-
Teiserver.cache_get(:application_metadata_cache, "banned_domains", [])
885+
Teiserver.cache_get(:application_metadata_cache, "banned_domains", MapSet.new())
886886
end
887887

888888
@spec banned_domain?(String.t()) :: boolean()
889889
def banned_domain?(email) do
890890
case String.split(email, "@") do
891891
[_start, domain] ->
892-
String.contains?(domain, list_banned_domains_cache())
892+
banned_domains = list_banned_domains_cache()
893+
894+
domain
895+
|> String.downcase()
896+
|> split_domain_segments()
897+
|> Enum.any?(&MapSet.member?(banned_domains, &1))
893898

894899
_no_email ->
895900
false
896901
end
897902
end
898903

904+
defp split_domain_segments(domain) do
905+
parts = String.split(domain, ".")
906+
count = length(parts)
907+
908+
Enum.map(0..(count - 1), fn i ->
909+
parts
910+
|> Enum.drop(i)
911+
|> Enum.join(".")
912+
end)
913+
end
914+
899915
@doc """
900916
Gets a single banned_domain.
901917
@@ -993,9 +1009,9 @@ defmodule Teiserver.Moderation do
9931009
Repo.all(BannedIP)
9941010
end
9951011

996-
@spec list_banned_ips_cache :: [BannedIP.t()]
1012+
@spec list_banned_ips_cache :: MapSet.t(BannedIP.t())
9971013
def list_banned_ips_cache do
998-
Teiserver.cache_get(:application_metadata_cache, "banned_ip_ranges", [])
1014+
Teiserver.cache_get(:application_metadata_cache, "banned_ip_ranges", MapSet.new())
9991015
end
10001016

10011017
@doc """
@@ -1199,9 +1215,9 @@ defmodule Teiserver.Moderation do
11991215
end
12001216

12011217
# VPNs
1202-
@spec list_vpn_cache :: [String.t()]
1218+
@spec list_vpn_cache :: MapSet.t(String.t())
12031219
def list_vpn_cache do
1204-
Teiserver.cache_get(:application_metadata_cache, "blocked_vpn_ranges", [])
1220+
Teiserver.cache_get(:application_metadata_cache, "banned_vpn_ranges", MapSet.new())
12051221
end
12061222

12071223
@spec vpn_ip?(String.t() | nil) :: boolean()

lib/teiserver/moderation/tasks/load_banned_domains_task.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ defmodule Teiserver.Moderation.LoadBannedDomainsTask do
3333
CacheHelper.store_put(
3434
:application_metadata_cache,
3535
"banned_domains",
36-
external_banned_domains ++ internal_banned_domains
36+
MapSet.new(external_banned_domains ++ internal_banned_domains)
3737
)
3838
end
3939

lib/teiserver/moderation/tasks/load_banned_ips_task.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule Teiserver.Moderation.LoadBannedIPsTask do
1717
CacheHelper.store_put(
1818
:application_metadata_cache,
1919
"banned_ip_ranges",
20-
banned_ip_ranges
20+
MapSet.new(banned_ip_ranges)
2121
)
2222
end
2323

lib/teiserver/moderation/tasks/load_vpns_task.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ defmodule Teiserver.Moderation.Tasks.LoadVPNsTask do
1313
def perform do
1414
url = Config.get_site_config_cache("teiserver.VPN blocklist URL")
1515

16-
blocked_vpn_ranges =
16+
banned_vpn_ranges =
1717
with true <- url != nil and url != "",
1818
{:ok, %Response{status: 200, body: body}} <- Req.get(url),
1919
cidr_list <- String.split(body, "\n") do
@@ -35,8 +35,8 @@ defmodule Teiserver.Moderation.Tasks.LoadVPNsTask do
3535

3636
CacheHelper.store_put(
3737
:application_metadata_cache,
38-
"blocked_vpn_ranges",
39-
blocked_vpn_ranges
38+
"banned_vpn_ranges",
39+
MapSet.new(banned_vpn_ranges)
4040
)
4141
end
4242
end

test/teiserver/moderation/banned_domain_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ defmodule Teiserver.Moderation.BannedDomainTest do
7979
assert Moderation.banned_domain?("me@some_domain.foo.bar")
8080
assert Moderation.banned_domain?("me@some_subdomain.some_domain.com")
8181
assert Moderation.banned_domain?("me@some_subdomain.some_domain.foo.bar")
82+
refute Moderation.banned_domain?("me@different_some_domain.foo.bar")
8283
refute Moderation.banned_domain?("me@not me")
8384
end
8485

0 commit comments

Comments
 (0)