Add admin interface to manage instances subscriptions
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -14,7 +14,8 @@ defmodule MobilizonWeb.API.ReportTest do
|
||||
|
||||
describe "reports" do
|
||||
test "creates a report on a event" do
|
||||
%Actor{id: reporter_id, url: reporter_url} = insert(:actor)
|
||||
%Actor{url: relay_reporter_url} = Mobilizon.Service.ActivityPub.Relay.get_actor()
|
||||
%Actor{id: reporter_id} = insert(:actor)
|
||||
%Actor{id: reported_id, url: reported_url} = reported = insert(:actor)
|
||||
|
||||
%Event{id: event_id, url: event_url} = _event = insert(:event, organizer_actor: reported)
|
||||
@@ -28,11 +29,11 @@ defmodule MobilizonWeb.API.ReportTest do
|
||||
content: comment,
|
||||
event_id: event_id,
|
||||
comments_ids: [],
|
||||
local: true
|
||||
forward: false
|
||||
})
|
||||
|
||||
assert %Activity{
|
||||
actor: ^reporter_url,
|
||||
actor: ^relay_reporter_url,
|
||||
data: %{
|
||||
"type" => "Flag",
|
||||
"cc" => [],
|
||||
@@ -43,7 +44,8 @@ defmodule MobilizonWeb.API.ReportTest do
|
||||
end
|
||||
|
||||
test "creates a report on several comments" do
|
||||
%Actor{id: reporter_id, url: reporter_url} = insert(:actor)
|
||||
%Actor{url: relay_reporter_url} = Mobilizon.Service.ActivityPub.Relay.get_actor()
|
||||
%Actor{id: reporter_id} = insert(:actor)
|
||||
%Actor{id: reported_id, url: reported_url} = reported = insert(:actor)
|
||||
|
||||
%Comment{id: comment_1_id, url: comment_1_url} =
|
||||
@@ -64,20 +66,21 @@ defmodule MobilizonWeb.API.ReportTest do
|
||||
})
|
||||
|
||||
assert %Activity{
|
||||
actor: ^reporter_url,
|
||||
actor: ^relay_reporter_url,
|
||||
data: %{
|
||||
"type" => "Flag",
|
||||
"content" => ^comment,
|
||||
"object" => [^reported_url, ^comment_1_url, ^comment_2_url],
|
||||
"to" => ["https://www.w3.org/ns/activitystreams#Public"],
|
||||
"to" => [],
|
||||
"cc" => [],
|
||||
"actor" => ^reporter_url
|
||||
"actor" => ^relay_reporter_url
|
||||
}
|
||||
} = flag_activity
|
||||
end
|
||||
|
||||
test "creates a report that gets federated" do
|
||||
%Actor{id: reporter_id, url: reporter_url} = insert(:actor)
|
||||
%Actor{url: relay_reporter_url} = Mobilizon.Service.ActivityPub.Relay.get_actor()
|
||||
%Actor{id: reporter_id} = insert(:actor)
|
||||
%Actor{id: reported_id, url: reported_url} = reported = insert(:actor)
|
||||
|
||||
%Comment{id: comment_1_id, url: comment_1_url} =
|
||||
@@ -96,21 +99,21 @@ defmodule MobilizonWeb.API.ReportTest do
|
||||
content: comment,
|
||||
event_id: nil,
|
||||
comments_ids: [comment_1_id, comment_2_id],
|
||||
local: false
|
||||
forward: true
|
||||
})
|
||||
|
||||
assert %Activity{
|
||||
actor: ^reporter_url,
|
||||
actor: ^relay_reporter_url,
|
||||
data: %{
|
||||
"type" => "Flag",
|
||||
"actor" => ^reporter_url,
|
||||
"actor" => ^relay_reporter_url,
|
||||
"cc" => [^reported_url],
|
||||
"content" => ^encoded_comment,
|
||||
"object" => [^reported_url, ^comment_1_url, ^comment_2_url],
|
||||
"to" => ["https://www.w3.org/ns/activitystreams#Public"]
|
||||
"to" => []
|
||||
},
|
||||
local: true,
|
||||
recipients: ["https://www.w3.org/ns/activitystreams#Public", ^reported_url]
|
||||
recipients: [^reported_url]
|
||||
} = flag_activity
|
||||
end
|
||||
|
||||
|
||||
@@ -19,6 +19,11 @@ defmodule MobilizonWeb.ActivityPubControllerTest do
|
||||
alias MobilizonWeb.PageView
|
||||
alias MobilizonWeb.Router.Helpers, as: Routes
|
||||
|
||||
setup_all do
|
||||
Mobilizon.Config.put([:instance, :federating], true)
|
||||
:ok
|
||||
end
|
||||
|
||||
setup do
|
||||
conn = build_conn() |> put_req_header("accept", "application/activity+json")
|
||||
{:ok, conn: conn}
|
||||
@@ -34,7 +39,10 @@ defmodule MobilizonWeb.ActivityPubControllerTest do
|
||||
|
||||
actor = Actors.get_actor!(actor.id)
|
||||
|
||||
assert json_response(conn, 200) == ActorView.render("actor.json", %{actor: actor})
|
||||
assert json_response(conn, 200) ==
|
||||
ActorView.render("actor.json", %{actor: actor})
|
||||
|> Jason.encode!()
|
||||
|> Jason.decode!()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -9,6 +9,11 @@ defmodule MobilizonWeb.WebFingerTest do
|
||||
alias Mobilizon.Service.WebFinger
|
||||
import Mobilizon.Factory
|
||||
|
||||
setup_all do
|
||||
Mobilizon.Config.put([:instance, :federating], true)
|
||||
:ok
|
||||
end
|
||||
|
||||
test "GET /.well-known/host-meta", %{conn: conn} do
|
||||
conn = get(conn, "/.well-known/host-meta")
|
||||
|
||||
|
||||
30
test/mobilizon_web/plugs/federating_plug_test.exs
Normal file
30
test/mobilizon_web/plugs/federating_plug_test.exs
Normal file
@@ -0,0 +1,30 @@
|
||||
# Portions of this file are derived from Pleroma:
|
||||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule MobilizonWeb.Plug.FederatingTest do
|
||||
use MobilizonWeb.ConnCase
|
||||
|
||||
test "returns and halt the conn when federating is disabled" do
|
||||
Mobilizon.Config.put([:instance, :federating], false)
|
||||
|
||||
conn =
|
||||
build_conn()
|
||||
|> MobilizonWeb.Plugs.Federating.call(%{})
|
||||
|
||||
assert conn.status == 404
|
||||
assert conn.halted
|
||||
end
|
||||
|
||||
test "does nothing when federating is enabled" do
|
||||
Mobilizon.Config.put([:instance, :federating], true)
|
||||
|
||||
conn =
|
||||
build_conn()
|
||||
|> MobilizonWeb.Plugs.Federating.call(%{})
|
||||
|
||||
refute conn.status
|
||||
refute conn.halted
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,60 @@
|
||||
# Portions of this file are derived from Pleroma:
|
||||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule MobilizonWeb.Plugs.MappedSignatureToIdentityPlugTest do
|
||||
use MobilizonWeb.ConnCase
|
||||
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
|
||||
alias MobilizonWeb.Plugs.MappedSignatureToIdentity
|
||||
|
||||
defp set_signature(conn, key_id) do
|
||||
conn
|
||||
|> put_req_header("signature", "keyId=\"#{key_id}\"")
|
||||
|> assign(:valid_signature, true)
|
||||
end
|
||||
|
||||
test "it successfully maps a valid identity with a valid signature" do
|
||||
use_cassette "activity_pub/signature/valid" do
|
||||
conn =
|
||||
build_conn(:get, "/doesntmattter")
|
||||
|> set_signature("https://framapiaf.org/users/admin")
|
||||
|> MappedSignatureToIdentity.call(%{})
|
||||
|
||||
refute is_nil(conn.assigns.actor)
|
||||
end
|
||||
end
|
||||
|
||||
test "it successfully maps a valid identity with a valid signature with payload" do
|
||||
use_cassette "activity_pub/signature/valid_payload" do
|
||||
conn =
|
||||
build_conn(:post, "/doesntmattter", %{"actor" => "https://framapiaf.org/users/admin"})
|
||||
|> set_signature("https://framapiaf.org/users/admin")
|
||||
|> MappedSignatureToIdentity.call(%{})
|
||||
|
||||
refute is_nil(conn.assigns.actor)
|
||||
end
|
||||
end
|
||||
|
||||
test "it considers a mapped identity to be invalid when it mismatches a payload" do
|
||||
use_cassette "activity_pub/signature/invalid_payload" do
|
||||
conn =
|
||||
build_conn(:post, "/doesntmattter", %{"actor" => "https://framapiaf.org/users/admin"})
|
||||
|> set_signature("https://niu.moe/users/rye")
|
||||
|> MappedSignatureToIdentity.call(%{})
|
||||
|
||||
assert %{valid_signature: false} == conn.assigns
|
||||
end
|
||||
end
|
||||
|
||||
test "it considers a mapped identity to be invalid when the identity cannot be found" do
|
||||
use_cassette "activity_pub/signature/invalid_not_found" do
|
||||
conn =
|
||||
build_conn(:post, "/doesntmattter", %{"actor" => "https://framapiaf.org/users/admin"})
|
||||
|> set_signature("http://niu.moe/users/rye")
|
||||
|> MappedSignatureToIdentity.call(%{})
|
||||
|
||||
assert %{valid_signature: false} == conn.assigns
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -121,4 +121,99 @@ defmodule MobilizonWeb.Resolvers.AdminResolverTest do
|
||||
title
|
||||
end
|
||||
end
|
||||
|
||||
describe "Resolver: Get the list of relay followers" do
|
||||
test "test list_relay_followers/3 returns relay followers", %{conn: conn} do
|
||||
%User{} = user_admin = insert(:user, role: :administrator)
|
||||
|
||||
follower_actor =
|
||||
insert(:actor,
|
||||
domain: "localhost",
|
||||
user: nil,
|
||||
url: "http://localhost:8080/actor",
|
||||
preferred_username: "instance_actor",
|
||||
name: "I am an instance actor"
|
||||
)
|
||||
|
||||
%Actor{} = relay_actor = Mobilizon.Service.ActivityPub.Relay.get_actor()
|
||||
insert(:follower, actor: follower_actor, target_actor: relay_actor)
|
||||
|
||||
query = """
|
||||
{
|
||||
relayFollowers {
|
||||
elements {
|
||||
actor {
|
||||
preferredUsername,
|
||||
domain,
|
||||
},
|
||||
approved
|
||||
},
|
||||
total
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
res =
|
||||
conn
|
||||
|> auth_conn(user_admin)
|
||||
|> AbsintheHelpers.graphql_query(query: query)
|
||||
|
||||
assert is_nil(res["errors"])
|
||||
|
||||
assert hd(res["data"]["relayFollowers"]["elements"]) == %{
|
||||
"actor" => %{"preferredUsername" => "instance_actor", "domain" => "localhost"},
|
||||
"approved" => false
|
||||
}
|
||||
end
|
||||
|
||||
test "test list_relay_followers/3 returns relay followings", %{conn: conn} do
|
||||
%User{} = user_admin = insert(:user, role: :administrator)
|
||||
|
||||
%Actor{
|
||||
preferred_username: following_actor_preferred_username,
|
||||
domain: following_actor_domain
|
||||
} =
|
||||
following_actor =
|
||||
insert(:actor,
|
||||
domain: "localhost",
|
||||
user: nil,
|
||||
url: "http://localhost:8080/actor",
|
||||
preferred_username: "instance_actor",
|
||||
name: "I am an instance actor"
|
||||
)
|
||||
|
||||
%Actor{} = relay_actor = Mobilizon.Service.ActivityPub.Relay.get_actor()
|
||||
insert(:follower, actor: relay_actor, target_actor: following_actor)
|
||||
|
||||
query = """
|
||||
{
|
||||
relayFollowings {
|
||||
elements {
|
||||
targetActor {
|
||||
preferredUsername,
|
||||
domain,
|
||||
},
|
||||
approved
|
||||
},
|
||||
total
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
res =
|
||||
conn
|
||||
|> auth_conn(user_admin)
|
||||
|> AbsintheHelpers.graphql_query(query: query)
|
||||
|
||||
assert is_nil(res["errors"])
|
||||
|
||||
assert hd(res["data"]["relayFollowings"]["elements"]) == %{
|
||||
"targetActor" => %{
|
||||
"preferredUsername" => following_actor_preferred_username,
|
||||
"domain" => following_actor_domain
|
||||
},
|
||||
"approved" => false
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -199,7 +199,9 @@ defmodule MobilizonWeb.Resolvers.ParticipantResolverTest do
|
||||
user: user,
|
||||
actor: actor
|
||||
} do
|
||||
event = insert(:event, %{organizer_actor: actor})
|
||||
event =
|
||||
insert(:event, %{organizer_actor: actor, participant_stats: %{creator: 1, participant: 1}})
|
||||
|
||||
insert(:participant, %{actor: actor, event: event, role: :creator})
|
||||
user2 = insert(:user)
|
||||
actor2 = insert(:actor, user: user2)
|
||||
|
||||
@@ -3,6 +3,7 @@ defmodule MobilizonWeb.Resolvers.PersonResolverTest do
|
||||
alias MobilizonWeb.AbsintheHelpers
|
||||
alias Mobilizon.Actors.Actor
|
||||
import Mobilizon.Factory
|
||||
use Oban.Testing, repo: Mobilizon.Storage.Repo
|
||||
|
||||
@non_existent_username "nonexistent"
|
||||
|
||||
@@ -478,7 +479,7 @@ defmodule MobilizonWeb.Resolvers.PersonResolverTest do
|
||||
"Cannot remove the last administrator of a group"
|
||||
end
|
||||
|
||||
test "delete_person/3 should delete a user identity", context do
|
||||
test "delete_person/3 should delete an actor identity", context do
|
||||
user = insert(:user)
|
||||
%Actor{id: person_id} = insert(:actor, user: user, preferred_username: "riri")
|
||||
insert(:actor, user: user, preferred_username: "fifi")
|
||||
@@ -498,6 +499,13 @@ defmodule MobilizonWeb.Resolvers.PersonResolverTest do
|
||||
|
||||
assert json_response(res, 200)["errors"] == nil
|
||||
|
||||
assert_enqueued(
|
||||
worker: Mobilizon.Service.Workers.BackgroundWorker,
|
||||
args: %{"actor_id" => person_id, "op" => "delete_actor"}
|
||||
)
|
||||
|
||||
assert %{success: 1, failure: 0} == Oban.drain_queue(:background)
|
||||
|
||||
query = """
|
||||
{
|
||||
person(id: "#{person_id}") {
|
||||
|
||||
Reference in New Issue
Block a user