Add admin interface to manage instances subscriptions

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2019-12-03 11:29:51 +01:00
parent 0a96d70348
commit 334d66bf5d
141 changed files with 4198 additions and 1923 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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")

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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}") {