Add v1/instance/domain_blocks endpoint
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
parent
0dfcc24d30
commit
02edd04cca
6 changed files with 115 additions and 1 deletions
1
changelog.d/instance-domain-blocks.add
Normal file
1
changelog.d/instance-domain-blocks.add
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Add v1/instance/domain_blocks endpoint
|
||||||
|
|
@ -57,6 +57,22 @@ defmodule Pleroma.Web.ApiSpec.InstanceOperation do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def domain_blocks_operation do
|
||||||
|
%Operation{
|
||||||
|
tags: ["Instance misc"],
|
||||||
|
summary: "Retrieve instance domain blocks",
|
||||||
|
operationId: "InstanceController.domain_blocks",
|
||||||
|
responses: %{
|
||||||
|
200 =>
|
||||||
|
Operation.response(
|
||||||
|
"Array of domain blocks",
|
||||||
|
"application/json",
|
||||||
|
array_of_domain_blocks()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def translation_languages_operation do
|
def translation_languages_operation do
|
||||||
%Operation{
|
%Operation{
|
||||||
tags: ["Instance misc"],
|
tags: ["Instance misc"],
|
||||||
|
|
@ -420,4 +436,19 @@ defmodule Pleroma.Web.ApiSpec.InstanceOperation do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp array_of_domain_blocks do
|
||||||
|
%Schema{
|
||||||
|
type: :array,
|
||||||
|
items: %Schema{
|
||||||
|
type: :object,
|
||||||
|
properties: %{
|
||||||
|
domain: %Schema{type: :string},
|
||||||
|
digest: %Schema{type: :string},
|
||||||
|
severity: %Schema{type: :string},
|
||||||
|
comment: %Schema{type: :string}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceController do
|
||||||
|
|
||||||
plug(Pleroma.Web.ApiSpec.CastAndValidate)
|
plug(Pleroma.Web.ApiSpec.CastAndValidate)
|
||||||
|
|
||||||
plug(:skip_auth when action in [:show, :show2, :peers])
|
plug(:skip_auth)
|
||||||
|
|
||||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.InstanceOperation
|
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.InstanceOperation
|
||||||
|
|
||||||
|
|
@ -31,6 +31,11 @@ defmodule Pleroma.Web.MastodonAPI.InstanceController do
|
||||||
render(conn, "rules.json")
|
render(conn, "rules.json")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc "GET /api/v1/instance/domain_blocks"
|
||||||
|
def domain_blocks(conn, _params) do
|
||||||
|
render(conn, "domain_blocks.json")
|
||||||
|
end
|
||||||
|
|
||||||
@doc "GET /api/v1/instance/translation_languages"
|
@doc "GET /api/v1/instance/translation_languages"
|
||||||
def translation_languages(conn, _params) do
|
def translation_languages(conn, _params) do
|
||||||
render(conn, "translation_languages.json")
|
render(conn, "translation_languages.json")
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,18 @@
|
||||||
defmodule Pleroma.Web.MastodonAPI.InstanceView do
|
defmodule Pleroma.Web.MastodonAPI.InstanceView do
|
||||||
use Pleroma.Web, :view
|
use Pleroma.Web, :view
|
||||||
|
|
||||||
|
import Pleroma.Web.Utils.Guards, only: [not_empty_string: 1]
|
||||||
|
|
||||||
alias Pleroma.Config
|
alias Pleroma.Config
|
||||||
alias Pleroma.Web.ActivityPub.MRF
|
alias Pleroma.Web.ActivityPub.MRF
|
||||||
|
|
||||||
@mastodon_api_level "2.7.2"
|
@mastodon_api_level "2.7.2"
|
||||||
|
|
||||||
|
@block_severities %{
|
||||||
|
federated_timeline_removal: "silence",
|
||||||
|
reject: "suspend"
|
||||||
|
}
|
||||||
|
|
||||||
def render("show.json", _) do
|
def render("show.json", _) do
|
||||||
instance = Config.get(:instance)
|
instance = Config.get(:instance)
|
||||||
|
|
||||||
|
|
@ -90,6 +97,48 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render("domain_blocks.json", _) do
|
||||||
|
if Config.get([:mrf, :transparency]) do
|
||||||
|
exclusions = Config.get([:mrf, :transparency_exclusions]) |> MRF.instance_list_from_tuples()
|
||||||
|
|
||||||
|
domain_blocks =
|
||||||
|
Config.get(:mrf_simple)
|
||||||
|
|> Enum.map(fn {rule, instances} ->
|
||||||
|
instances
|
||||||
|
|> Enum.map(fn
|
||||||
|
{host, reason} when not_empty_string(host) and not_empty_string(reason) ->
|
||||||
|
{host, reason}
|
||||||
|
|
||||||
|
{host, _reason} when not_empty_string(host) ->
|
||||||
|
{host, ""}
|
||||||
|
|
||||||
|
host when not_empty_string(host) ->
|
||||||
|
{host, ""}
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
nil
|
||||||
|
end)
|
||||||
|
|> Enum.reject(&is_nil/1)
|
||||||
|
|> Enum.reject(fn {host, _} ->
|
||||||
|
host in exclusions or not Map.has_key?(@block_severities, rule)
|
||||||
|
end)
|
||||||
|
|> Enum.map(fn {host, reason} ->
|
||||||
|
%{
|
||||||
|
domain: host,
|
||||||
|
digest: :crypto.hash(:sha256, host) |> Base.encode16(case: :lower),
|
||||||
|
severity: Map.get(@block_severities, rule),
|
||||||
|
comment: reason
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
|> List.flatten()
|
||||||
|
|
||||||
|
domain_blocks
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def render("translation_languages.json", _) do
|
def render("translation_languages.json", _) do
|
||||||
with true <- Pleroma.Language.Translation.configured?(),
|
with true <- Pleroma.Language.Translation.configured?(),
|
||||||
{:ok, languages} <- Pleroma.Language.Translation.languages_matrix() do
|
{:ok, languages} <- Pleroma.Language.Translation.languages_matrix() do
|
||||||
|
|
|
||||||
|
|
@ -798,6 +798,7 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/instance", InstanceController, :show)
|
get("/instance", InstanceController, :show)
|
||||||
get("/instance/peers", InstanceController, :peers)
|
get("/instance/peers", InstanceController, :peers)
|
||||||
get("/instance/rules", InstanceController, :rules)
|
get("/instance/rules", InstanceController, :rules)
|
||||||
|
get("/instance/domain_blocks", InstanceController, :domain_blocks)
|
||||||
get("/instance/translation_languages", InstanceController, :translation_languages)
|
get("/instance/translation_languages", InstanceController, :translation_languages)
|
||||||
|
|
||||||
get("/statuses", StatusController, :index)
|
get("/statuses", StatusController, :index)
|
||||||
|
|
|
||||||
|
|
@ -153,6 +153,33 @@ defmodule Pleroma.Web.MastodonAPI.InstanceControllerTest do
|
||||||
] = result["rules"]
|
] = result["rules"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "instance domain blocks" do
|
||||||
|
setup do
|
||||||
|
clear_config([:mrf_simple, :reject], [{"fediverse.pl", "uses pl-fe"}])
|
||||||
|
end
|
||||||
|
|
||||||
|
test "get instance domain blocks", %{conn: conn} do
|
||||||
|
conn = get(conn, "/api/v1/instance/domain_blocks")
|
||||||
|
|
||||||
|
assert [
|
||||||
|
%{
|
||||||
|
"comment" => "uses pl-fe",
|
||||||
|
"digest" => "55e3f44aefe7eb022d3b1daaf7396cabf7f181bf6093c8ea841e30c9fc7d8226",
|
||||||
|
"domain" => "fediverse.pl",
|
||||||
|
"severity" => "suspend"
|
||||||
|
}
|
||||||
|
] == json_response_and_validate_schema(conn, 200)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns empty array if mrf transparency is disabled", %{conn: conn} do
|
||||||
|
clear_config([:mrf, :transparency], false)
|
||||||
|
|
||||||
|
conn = get(conn, "/api/v1/instance/domain_blocks")
|
||||||
|
|
||||||
|
assert [] == json_response_and_validate_schema(conn, 200)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
test "translation languages matrix", %{conn: conn} do
|
test "translation languages matrix", %{conn: conn} do
|
||||||
clear_config([Pleroma.Language.Translation, :provider], TranslationMock)
|
clear_config([Pleroma.Language.Translation, :provider], TranslationMock)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue