forked from AkkomaGang/akkoma
Websub controller beginnings.
This commit is contained in:
parent
5e7ceeba94
commit
1b9cc721a0
7 changed files with 85 additions and 5 deletions
|
@ -20,7 +20,7 @@ def to_simple_form(user, activities, users) do
|
||||||
{:id, h.(OStatus.feed_path(user))},
|
{:id, h.(OStatus.feed_path(user))},
|
||||||
{:title, ['#{user.nickname}\'s timeline']},
|
{:title, ['#{user.nickname}\'s timeline']},
|
||||||
{:updated, h.(most_recent_update)},
|
{:updated, h.(most_recent_update)},
|
||||||
{:link, [rel: 'hub', href: h.(OStatus.pubsub_path)], []},
|
{:link, [rel: 'hub', href: h.(OStatus.pubsub_path(user))], []},
|
||||||
{:author, UserRepresenter.to_simple_form(user)}
|
{:author, UserRepresenter.to_simple_form(user)}
|
||||||
] ++ entries
|
] ++ entries
|
||||||
}]
|
}]
|
||||||
|
|
|
@ -5,8 +5,8 @@ def feed_path(user) do
|
||||||
"#{user.ap_id}/feed.atom"
|
"#{user.ap_id}/feed.atom"
|
||||||
end
|
end
|
||||||
|
|
||||||
def pubsub_path() do
|
def pubsub_path(user) do
|
||||||
"#{Web.base_url}/push/hub"
|
"#{Web.base_url}/push/hub/#{user.nickname}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_path(user) do
|
def user_path(user) do
|
||||||
|
|
|
@ -62,7 +62,7 @@ def user_fetcher(username) do
|
||||||
pipe_through :ostatus
|
pipe_through :ostatus
|
||||||
|
|
||||||
get "/users/:nickname/feed", OStatus.OStatusController, :feed
|
get "/users/:nickname/feed", OStatus.OStatusController, :feed
|
||||||
post "/push/hub", OStatus.OStatusController, :temp
|
post "/push/hub/:nickname", Websub.WebsubController, :websub_subscription_request
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/.well-known", Pleroma.Web do
|
scope "/.well-known", Pleroma.Web do
|
||||||
|
|
48
lib/pleroma/web/websub/websub_controller.ex
Normal file
48
lib/pleroma/web/websub/websub_controller.ex
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
defmodule Pleroma.Web.Websub.WebsubController do
|
||||||
|
use Pleroma.Web, :controller
|
||||||
|
alias Pleroma.Web.Websub.WebsubServerSubscription
|
||||||
|
alias Pleroma.{Repo, User}
|
||||||
|
alias Pleroma.Web.OStatus
|
||||||
|
def websub_subscription_request(conn, %{"nickname" => nickname} = params) do
|
||||||
|
user = User.get_cached_by_nickname(nickname)
|
||||||
|
|
||||||
|
with {:ok, topic} <- valid_topic(params, user),
|
||||||
|
{:ok, lease_time} <- lease_time(params),
|
||||||
|
secret <- params["hub.secret"]
|
||||||
|
do
|
||||||
|
data = %{
|
||||||
|
state: "requested",
|
||||||
|
topic: topic,
|
||||||
|
secret: secret
|
||||||
|
}
|
||||||
|
|
||||||
|
change = Ecto.Changeset.change(%WebsubServerSubscription{}, data)
|
||||||
|
websub = Repo.insert!(change)
|
||||||
|
|
||||||
|
change = Ecto.Changeset.change(websub, %{valid_until: NaiveDateTime.add(websub.inserted_at, lease_time)})
|
||||||
|
websub = Repo.update!(change)
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> send_resp(202, "Accepted")
|
||||||
|
else {:error, reason} ->
|
||||||
|
conn
|
||||||
|
|> send_resp(500, reason)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp lease_time(%{"hub.lease_seconds" => lease_seconds}) do
|
||||||
|
{:ok, lease_seconds}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp lease_time(_) do
|
||||||
|
{:ok, 60 * 60 * 24 * 3} # three days
|
||||||
|
end
|
||||||
|
|
||||||
|
defp valid_topic(%{"hub.topic" => topic}, user) do
|
||||||
|
if topic == OStatus.feed_path(user) do
|
||||||
|
{:ok, topic}
|
||||||
|
else
|
||||||
|
{:error, "Wrong topic requested, expected #{OStatus.feed_path(user)}, got #{topic}"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -7,5 +7,7 @@ defmodule Pleroma.Web.Websub.WebsubServerSubscription do
|
||||||
field :secret, :string
|
field :secret, :string
|
||||||
field :valid_until, :naive_datetime
|
field :valid_until, :naive_datetime
|
||||||
field :state, :string
|
field :state, :string
|
||||||
|
|
||||||
|
timestamps()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -26,7 +26,7 @@ test "returns a feed of the last 20 items of the user" do
|
||||||
<id>#{OStatus.feed_path(user)}</id>
|
<id>#{OStatus.feed_path(user)}</id>
|
||||||
<title>#{user.nickname}'s timeline</title>
|
<title>#{user.nickname}'s timeline</title>
|
||||||
<updated>#{most_recent_update}</updated>
|
<updated>#{most_recent_update}</updated>
|
||||||
<link rel="hub" href="#{OStatus.pubsub_path}" />
|
<link rel="hub" href="#{OStatus.pubsub_path(user)}" />
|
||||||
<author>
|
<author>
|
||||||
#{user_xml}
|
#{user_xml}
|
||||||
</author>
|
</author>
|
||||||
|
|
30
test/web/websub/websub_controller_test.exs
Normal file
30
test/web/websub/websub_controller_test.exs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
defmodule Pleroma.Web.Websub.WebsubControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
import Pleroma.Factory
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.Web.Websub.WebsubServerSubscription
|
||||||
|
|
||||||
|
test "websub subscription request", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
path = Pleroma.Web.OStatus.pubsub_path(user)
|
||||||
|
|
||||||
|
data = %{
|
||||||
|
"hub.callback": "http://example.org/sub",
|
||||||
|
"hub.mode": "subscription",
|
||||||
|
"hub.topic": Pleroma.Web.OStatus.feed_path(user),
|
||||||
|
"hub.secret": "a random secret",
|
||||||
|
"hub.lease_seconds": 100
|
||||||
|
}
|
||||||
|
|
||||||
|
conn = conn
|
||||||
|
|> post(path, data)
|
||||||
|
|
||||||
|
assert response(conn, 202) == "Accepted"
|
||||||
|
subscription = Repo.one!(WebsubServerSubscription)
|
||||||
|
assert subscription.topic == Pleroma.Web.OStatus.feed_path(user)
|
||||||
|
assert subscription.state == "requested"
|
||||||
|
assert subscription.secret == "a random secret"
|
||||||
|
assert subscription.valid_until == NaiveDateTime.add(subscription.inserted_at, 100)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue