forked from AkkomaGang/akkoma
Merge branch 'runtime-router' into 'develop'
Runtime configured router See merge request pleroma/pleroma!426
This commit is contained in:
commit
0f3e78addb
11 changed files with 183 additions and 35 deletions
18
lib/pleroma/plugs/federating_plug.ex
Normal file
18
lib/pleroma/plugs/federating_plug.ex
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
defmodule Pleroma.Web.FederatingPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, opts) do
|
||||||
|
if Keyword.get(Application.get_env(:pleroma, :instance), :federating) do
|
||||||
|
conn
|
||||||
|
else
|
||||||
|
conn
|
||||||
|
|> put_status(404)
|
||||||
|
|> Phoenix.Controller.render(Pleroma.Web.ErrorView, "404.json")
|
||||||
|
|> halt()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
|
||||||
|
|
||||||
action_fallback(:errors)
|
action_fallback(:errors)
|
||||||
|
|
||||||
|
plug(Pleroma.Web.FederatingPlug when action in [:inbox, :relay])
|
||||||
plug(:relay_active? when action in [:relay])
|
plug(:relay_active? when action in [:relay])
|
||||||
|
|
||||||
def relay_active?(conn, _) do
|
def relay_active?(conn, _) do
|
||||||
|
|
|
@ -6,6 +6,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
|
||||||
alias Pleroma.{User, Repo}
|
alias Pleroma.{User, Repo}
|
||||||
alias Pleroma.Web.ActivityPub.MRF
|
alias Pleroma.Web.ActivityPub.MRF
|
||||||
|
|
||||||
|
plug(Pleroma.Web.FederatingPlug)
|
||||||
|
|
||||||
def schemas(conn, _params) do
|
def schemas(conn, _params) do
|
||||||
response = %{
|
response = %{
|
||||||
links: [
|
links: [
|
||||||
|
|
|
@ -10,6 +10,7 @@ defmodule Pleroma.Web.OStatus.OStatusController do
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPubController
|
alias Pleroma.Web.ActivityPub.ActivityPubController
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
|
|
||||||
|
plug(Pleroma.Web.FederatingPlug when action in [:salmon_incoming])
|
||||||
action_fallback(:errors)
|
action_fallback(:errors)
|
||||||
|
|
||||||
def feed_redirect(conn, %{"nickname" => nickname}) do
|
def feed_redirect(conn, %{"nickname" => nickname}) do
|
||||||
|
|
|
@ -3,11 +3,6 @@ defmodule Pleroma.Web.Router do
|
||||||
|
|
||||||
alias Pleroma.{Repo, User, Web.Router}
|
alias Pleroma.{Repo, User, Web.Router}
|
||||||
|
|
||||||
@instance Application.get_env(:pleroma, :instance)
|
|
||||||
@federating Keyword.get(@instance, :federating)
|
|
||||||
@public Keyword.get(@instance, :public)
|
|
||||||
@registrations_open Keyword.get(@instance, :registrations_open)
|
|
||||||
|
|
||||||
pipeline :api do
|
pipeline :api do
|
||||||
plug(:accepts, ["json"])
|
plug(:accepts, ["json"])
|
||||||
plug(:fetch_session)
|
plug(:fetch_session)
|
||||||
|
@ -242,11 +237,7 @@ defmodule Pleroma.Web.Router do
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/api", Pleroma.Web do
|
scope "/api", Pleroma.Web do
|
||||||
if @public do
|
|
||||||
pipe_through(:api)
|
pipe_through(:api)
|
||||||
else
|
|
||||||
pipe_through(:authenticated_api)
|
|
||||||
end
|
|
||||||
|
|
||||||
get("/statuses/public_timeline", TwitterAPI.Controller, :public_timeline)
|
get("/statuses/public_timeline", TwitterAPI.Controller, :public_timeline)
|
||||||
|
|
||||||
|
@ -330,13 +321,11 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/users/:nickname/feed", OStatus.OStatusController, :feed)
|
get("/users/:nickname/feed", OStatus.OStatusController, :feed)
|
||||||
get("/users/:nickname", OStatus.OStatusController, :feed_redirect)
|
get("/users/:nickname", OStatus.OStatusController, :feed_redirect)
|
||||||
|
|
||||||
if @federating do
|
|
||||||
post("/users/:nickname/salmon", OStatus.OStatusController, :salmon_incoming)
|
post("/users/:nickname/salmon", OStatus.OStatusController, :salmon_incoming)
|
||||||
post("/push/hub/:nickname", Websub.WebsubController, :websub_subscription_request)
|
post("/push/hub/:nickname", Websub.WebsubController, :websub_subscription_request)
|
||||||
get("/push/subscriptions/:id", Websub.WebsubController, :websub_subscription_confirmation)
|
get("/push/subscriptions/:id", Websub.WebsubController, :websub_subscription_confirmation)
|
||||||
post("/push/subscriptions/:id", Websub.WebsubController, :websub_incoming)
|
post("/push/subscriptions/:id", Websub.WebsubController, :websub_incoming)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
pipeline :activitypub do
|
pipeline :activitypub do
|
||||||
plug(:accepts, ["activity+json"])
|
plug(:accepts, ["activity+json"])
|
||||||
|
@ -352,7 +341,6 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/users/:nickname/outbox", ActivityPubController, :outbox)
|
get("/users/:nickname/outbox", ActivityPubController, :outbox)
|
||||||
end
|
end
|
||||||
|
|
||||||
if @federating do
|
|
||||||
scope "/relay", Pleroma.Web.ActivityPub do
|
scope "/relay", Pleroma.Web.ActivityPub do
|
||||||
pipe_through(:ap_relay)
|
pipe_through(:ap_relay)
|
||||||
get("/", ActivityPubController, :relay)
|
get("/", ActivityPubController, :relay)
|
||||||
|
@ -375,7 +363,6 @@ defmodule Pleroma.Web.Router do
|
||||||
scope "/nodeinfo", Pleroma.Web do
|
scope "/nodeinfo", Pleroma.Web do
|
||||||
get("/:version", Nodeinfo.NodeinfoController, :nodeinfo)
|
get("/:version", Nodeinfo.NodeinfoController, :nodeinfo)
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
scope "/", Pleroma.Web.MastodonAPI do
|
scope "/", Pleroma.Web.MastodonAPI do
|
||||||
pipe_through(:mastodon_html)
|
pipe_through(:mastodon_html)
|
||||||
|
|
|
@ -11,6 +11,7 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
|
||||||
|
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
|
plug(:only_if_public_instance when action in [:public_timeline, :public_and_external_timeline])
|
||||||
action_fallback(:errors)
|
action_fallback(:errors)
|
||||||
|
|
||||||
def verify_credentials(%{assigns: %{user: user}} = conn, _params) do
|
def verify_credentials(%{assigns: %{user: user}} = conn, _params) do
|
||||||
|
@ -518,6 +519,18 @@ defp forbidden_json_reply(conn, error_message) do
|
||||||
json_reply(conn, 403, json)
|
json_reply(conn, 403, json)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def only_if_public_instance(conn = %{conn: %{assigns: %{user: _user}}}, _), do: conn
|
||||||
|
|
||||||
|
def only_if_public_instance(conn, _) do
|
||||||
|
if Keyword.get(Application.get_env(:pleroma, :instance), :public) do
|
||||||
|
conn
|
||||||
|
else
|
||||||
|
conn
|
||||||
|
|> forbidden_json_reply("Invalid credentials.")
|
||||||
|
|> halt()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp error_json(conn, error_message) do
|
defp error_json(conn, error_message) do
|
||||||
%{"error" => error_message, "request" => conn.request_path} |> Jason.encode!()
|
%{"error" => error_message, "request" => conn.request_path} |> Jason.encode!()
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,6 +3,8 @@ defmodule Pleroma.Web.WebFinger.WebFingerController do
|
||||||
|
|
||||||
alias Pleroma.Web.WebFinger
|
alias Pleroma.Web.WebFinger
|
||||||
|
|
||||||
|
plug(Pleroma.Web.FederatingPlug)
|
||||||
|
|
||||||
def host_meta(conn, _params) do
|
def host_meta(conn, _params) do
|
||||||
xml = WebFinger.host_meta()
|
xml = WebFinger.host_meta()
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,15 @@ defmodule Pleroma.Web.Websub.WebsubController do
|
||||||
alias Pleroma.Web.Websub.WebsubClientSubscription
|
alias Pleroma.Web.Websub.WebsubClientSubscription
|
||||||
require Logger
|
require Logger
|
||||||
|
|
||||||
|
plug(
|
||||||
|
Pleroma.Web.FederatingPlug
|
||||||
|
when action in [
|
||||||
|
:websub_subscription_request,
|
||||||
|
:websub_subscription_confirmation,
|
||||||
|
:websub_incoming
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def websub_subscription_request(conn, %{"nickname" => nickname} = params) do
|
def websub_subscription_request(conn, %{"nickname" => nickname} = params) do
|
||||||
user = User.get_cached_by_nickname(nickname)
|
user = User.get_cached_by_nickname(nickname)
|
||||||
|
|
||||||
|
|
|
@ -14,4 +14,36 @@ test "nodeinfo shows staff accounts", %{conn: conn} do
|
||||||
|
|
||||||
assert user.ap_id in result["metadata"]["staffAccounts"]
|
assert user.ap_id in result["metadata"]["staffAccounts"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "returns 404 when federation is disabled" do
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:federating, false)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> get("/.well-known/nodeinfo")
|
||||||
|
|> json_response(404)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> get("/nodeinfo/2.0.json")
|
||||||
|
|> json_response(404)
|
||||||
|
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:federating, true)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns 200 when federation is enabled" do
|
||||||
|
conn
|
||||||
|
|> get("/.well-known/nodeinfo")
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> get("/nodeinfo/2.0.json")
|
||||||
|
|> json_response(200)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
33
test/web/plugs/federating_plug_test.exs
Normal file
33
test/web/plugs/federating_plug_test.exs
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
defmodule Pleroma.Web.FederatingPlugTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
|
||||||
|
test "returns and halt the conn when federating is disabled" do
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:federating, false)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> Pleroma.Web.FederatingPlug.call(%{})
|
||||||
|
|
||||||
|
assert conn.status == 404
|
||||||
|
assert conn.halted
|
||||||
|
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:federating, true)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "does nothing when federating is enabled" do
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> Pleroma.Web.FederatingPlug.call(%{})
|
||||||
|
|
||||||
|
refute conn.status
|
||||||
|
refute conn.halted
|
||||||
|
end
|
||||||
|
end
|
|
@ -100,6 +100,56 @@ test "returns statuses", %{conn: conn} do
|
||||||
|
|
||||||
assert length(response) == 10
|
assert length(response) == 10
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "returns 403 to unauthenticated request when the instance is not public" do
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:public, false)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> get("/api/statuses/public_timeline.json")
|
||||||
|
|> json_response(403)
|
||||||
|
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:public, true)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns 200 to unauthenticated request when the instance is public" do
|
||||||
|
conn
|
||||||
|
|> get("/api/statuses/public_timeline.json")
|
||||||
|
|> json_response(200)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "GET /statuses/public_and_external_timeline.json" do
|
||||||
|
test "returns 403 to unauthenticated request when the instance is not public" do
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:public, false)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> get("/api/statuses/public_and_external_timeline.json")
|
||||||
|
|> json_response(403)
|
||||||
|
|
||||||
|
instance =
|
||||||
|
Application.get_env(:pleroma, :instance)
|
||||||
|
|> Keyword.put(:public, true)
|
||||||
|
|
||||||
|
Application.put_env(:pleroma, :instance, instance)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns 200 to unauthenticated request when the instance is public" do
|
||||||
|
conn
|
||||||
|
|> get("/api/statuses/public_and_external_timeline.json")
|
||||||
|
|> json_response(200)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "GET /statuses/show/:id.json" do
|
describe "GET /statuses/show/:id.json" do
|
||||||
|
|
Loading…
Reference in a new issue