From f44e11c7ab79f52ad232e2eddcdede99216ae899 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 26 Jan 2021 13:35:12 -0600 Subject: Credo --- lib/pleroma/web/activity_pub/mrf/dns_rbl_policy.ex | 90 ++++++++++++++++++++++ lib/pleroma/web/activity_pub/mrf/dnsrbl.ex | 90 ---------------------- 2 files changed, 90 insertions(+), 90 deletions(-) create mode 100644 lib/pleroma/web/activity_pub/mrf/dns_rbl_policy.ex delete mode 100644 lib/pleroma/web/activity_pub/mrf/dnsrbl.ex diff --git a/lib/pleroma/web/activity_pub/mrf/dns_rbl_policy.ex b/lib/pleroma/web/activity_pub/mrf/dns_rbl_policy.ex new file mode 100644 index 000000000..37e13d4dd --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/dns_rbl_policy.ex @@ -0,0 +1,90 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.DnsRblPolicy do + @moduledoc "Dynamic activity filtering based on public database" + @behaviour Pleroma.Web.ActivityPub.MRF + + alias Pleroma.Config + + defp check_rbl(%{host: actor_host} = _actor_info, object) do + rblconfig = Config.get([:mrf_dnsrbl]) + rblhost = rblconfig[:nameserver] + + {:ok, rblnsip} = + case rblhost |> String.to_charlist() |> :inet_parse.address() do + {:ok, _} -> rblhost |> String.to_charlist() |> :inet_parse.address() + _ -> {:ok, rblhost |> :inet_res.lookup(:in, :a) |> Enum.random()} + end + + rblport = rblconfig[:port] + + rblzone = rblconfig[:zone] || rblhost + + query = (actor_host <> "." <> rblzone) |> String.to_charlist() + + rbl_response = + :inet_res.lookup(query, :in, :a, nameservers: [{rblnsip, rblport}], timeout: 1000, retry: 1) + + cond do + actor_host == Config.get([Pleroma.Web.Endpoint, :url, :host]) -> {:ok, object} + rbl_response != [] -> {:reject, "[DNSRBLPolicy]"} + true -> {:ok, object} + end + end + + @impl true + def filter(%{"actor" => actor} = object) do + actor_info = URI.parse(actor) + + with {:ok, object} <- check_rbl(actor_info, object) do + {:ok, object} + else + _ -> {:reject, "[DNSRBLPolicy]"} + end + end + + @impl true + def filter(object), do: {:ok, object} + + @impl true + def describe do + mrf_dnsrbl = + Config.get(:mrf_dnsrbl) + |> Enum.into(%{}) + + {:ok, %{mrf_dnsrbl: mrf_dnsrbl}} + end + + @impl true + def config_description do + %{ + key: :mrf_dnsrbl, + related_policy: "Pleroma.Web.ActivityPub.MRF.DnsRblPolicy", + label: "MRF DNSRBL", + description: "DNS RealTime Blackhole Policy", + children: [ + %{ + key: :nameserver, + type: {:string}, + description: "DNSRBL NameServer to Query", + suggestions: ["bl.pleroma.com"] + }, + %{ + key: :port, + type: {:string}, + description: "Nameserver port", + suggestions: ["53"] + }, + %{ + key: :zone, + type: {:string}, + description: + "Zone for querying, if unable to detect because nameserver is an IP address", + suggestions: ["bl.pleroma.com"] + } + ] + } + end +end diff --git a/lib/pleroma/web/activity_pub/mrf/dnsrbl.ex b/lib/pleroma/web/activity_pub/mrf/dnsrbl.ex deleted file mode 100644 index 37e13d4dd..000000000 --- a/lib/pleroma/web/activity_pub/mrf/dnsrbl.ex +++ /dev/null @@ -1,90 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2021 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ActivityPub.MRF.DnsRblPolicy do - @moduledoc "Dynamic activity filtering based on public database" - @behaviour Pleroma.Web.ActivityPub.MRF - - alias Pleroma.Config - - defp check_rbl(%{host: actor_host} = _actor_info, object) do - rblconfig = Config.get([:mrf_dnsrbl]) - rblhost = rblconfig[:nameserver] - - {:ok, rblnsip} = - case rblhost |> String.to_charlist() |> :inet_parse.address() do - {:ok, _} -> rblhost |> String.to_charlist() |> :inet_parse.address() - _ -> {:ok, rblhost |> :inet_res.lookup(:in, :a) |> Enum.random()} - end - - rblport = rblconfig[:port] - - rblzone = rblconfig[:zone] || rblhost - - query = (actor_host <> "." <> rblzone) |> String.to_charlist() - - rbl_response = - :inet_res.lookup(query, :in, :a, nameservers: [{rblnsip, rblport}], timeout: 1000, retry: 1) - - cond do - actor_host == Config.get([Pleroma.Web.Endpoint, :url, :host]) -> {:ok, object} - rbl_response != [] -> {:reject, "[DNSRBLPolicy]"} - true -> {:ok, object} - end - end - - @impl true - def filter(%{"actor" => actor} = object) do - actor_info = URI.parse(actor) - - with {:ok, object} <- check_rbl(actor_info, object) do - {:ok, object} - else - _ -> {:reject, "[DNSRBLPolicy]"} - end - end - - @impl true - def filter(object), do: {:ok, object} - - @impl true - def describe do - mrf_dnsrbl = - Config.get(:mrf_dnsrbl) - |> Enum.into(%{}) - - {:ok, %{mrf_dnsrbl: mrf_dnsrbl}} - end - - @impl true - def config_description do - %{ - key: :mrf_dnsrbl, - related_policy: "Pleroma.Web.ActivityPub.MRF.DnsRblPolicy", - label: "MRF DNSRBL", - description: "DNS RealTime Blackhole Policy", - children: [ - %{ - key: :nameserver, - type: {:string}, - description: "DNSRBL NameServer to Query", - suggestions: ["bl.pleroma.com"] - }, - %{ - key: :port, - type: {:string}, - description: "Nameserver port", - suggestions: ["53"] - }, - %{ - key: :zone, - type: {:string}, - description: - "Zone for querying, if unable to detect because nameserver is an IP address", - suggestions: ["bl.pleroma.com"] - } - ] - } - end -end -- cgit v1.2.3