forked from AkkomaGang/akkoma
activitypub: represent relay actor at instance root
This commit is contained in:
parent
4807a52284
commit
00e890264c
3 changed files with 44 additions and 0 deletions
|
@ -107,6 +107,17 @@ def inbox(conn, params) do
|
||||||
json(conn, "ok")
|
json(conn, "ok")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def relay(conn, params) do
|
||||||
|
with %User{} = user <- User.get_or_create_instance_user(),
|
||||||
|
{:ok, user} <- Pleroma.Web.WebFinger.ensure_keys_present(user) do
|
||||||
|
conn
|
||||||
|
|> put_resp_header("content-type", "application/activity+json")
|
||||||
|
|> json(UserView.render("user.json", %{user: user}))
|
||||||
|
else
|
||||||
|
nil -> {:error, :not_found}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def errors(conn, {:error, :not_found}) do
|
def errors(conn, {:error, :not_found}) do
|
||||||
conn
|
conn
|
||||||
|> put_status(404)
|
|> put_status(404)
|
||||||
|
|
|
@ -9,6 +9,33 @@ defmodule Pleroma.Web.ActivityPub.UserView do
|
||||||
alias Pleroma.Web.ActivityPub.Utils
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
|
# the instance itself is not a Person, but instead an Application
|
||||||
|
def render("user.json", %{user: %{nickname: nil} = user}) do
|
||||||
|
{:ok, user} = WebFinger.ensure_keys_present(user)
|
||||||
|
{:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"])
|
||||||
|
public_key = :public_key.pem_entry_encode(:SubjectPublicKeyInfo, public_key)
|
||||||
|
public_key = :public_key.pem_encode([public_key])
|
||||||
|
|
||||||
|
%{
|
||||||
|
"@context" => "https://www.w3.org/ns/activitystreams",
|
||||||
|
"id" => user.ap_id,
|
||||||
|
"type" => "Application",
|
||||||
|
"inbox" => "#{user.ap_id}/inbox",
|
||||||
|
"name" => "Pleroma",
|
||||||
|
"summary" => "Virtual actor for Pleroma relay",
|
||||||
|
"url" => user.ap_id,
|
||||||
|
"manuallyApprovesFollowers" => false,
|
||||||
|
"publicKey" => %{
|
||||||
|
"id" => "#{user.ap_id}#main-key",
|
||||||
|
"owner" => user.ap_id,
|
||||||
|
"publicKeyPem" => public_key
|
||||||
|
},
|
||||||
|
"endpoints" => %{
|
||||||
|
"sharedInbox" => "#{Pleroma.Web.Endpoint.url()}/inbox"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def render("user.json", %{user: user}) do
|
def render("user.json", %{user: user}) do
|
||||||
{:ok, user} = WebFinger.ensure_keys_present(user)
|
{:ok, user} = WebFinger.ensure_keys_present(user)
|
||||||
{:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"])
|
{:ok, _, public_key} = Salmon.keys_from_pem(user.info["keys"])
|
||||||
|
|
|
@ -318,6 +318,12 @@ def user_fetcher(username) do
|
||||||
end
|
end
|
||||||
|
|
||||||
if @federating do
|
if @federating do
|
||||||
|
scope "/", Pleroma.Web.ActivityPub do
|
||||||
|
# XXX: not really ostatus either
|
||||||
|
pipe_through(:ostatus)
|
||||||
|
get("/", ActivityPubController, :relay)
|
||||||
|
end
|
||||||
|
|
||||||
scope "/", Pleroma.Web.ActivityPub do
|
scope "/", Pleroma.Web.ActivityPub do
|
||||||
pipe_through(:activitypub)
|
pipe_through(:activitypub)
|
||||||
post("/users/:nickname/inbox", ActivityPubController, :inbox)
|
post("/users/:nickname/inbox", ActivityPubController, :inbox)
|
||||||
|
|
Loading…
Reference in a new issue