Websub controller beginnings.
This commit is contained in:
parent
5e7ceeba94
commit
1b9cc721a0
|
@ -20,7 +20,7 @@ def to_simple_form(user, activities, users) do
|
|||
{:id, h.(OStatus.feed_path(user))},
|
||||
{:title, ['#{user.nickname}\'s timeline']},
|
||||
{: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)}
|
||||
] ++ entries
|
||||
}]
|
||||
|
|
|
@ -5,8 +5,8 @@ def feed_path(user) do
|
|||
"#{user.ap_id}/feed.atom"
|
||||
end
|
||||
|
||||
def pubsub_path() do
|
||||
"#{Web.base_url}/push/hub"
|
||||
def pubsub_path(user) do
|
||||
"#{Web.base_url}/push/hub/#{user.nickname}"
|
||||
end
|
||||
|
||||
def user_path(user) do
|
||||
|
|
|
@ -62,7 +62,7 @@ def user_fetcher(username) do
|
|||
pipe_through :ostatus
|
||||
|
||||
get "/users/:nickname/feed", OStatus.OStatusController, :feed
|
||||
post "/push/hub", OStatus.OStatusController, :temp
|
||||
post "/push/hub/:nickname", Websub.WebsubController, :websub_subscription_request
|
||||
end
|
||||
|
||||
scope "/.well-known", Pleroma.Web do
|
||||
|
|
|
@ -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 :valid_until, :naive_datetime
|
||||
field :state, :string
|
||||
|
||||
timestamps()
|
||||
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>
|
||||
<title>#{user.nickname}'s timeline</title>
|
||||
<updated>#{most_recent_update}</updated>
|
||||
<link rel="hub" href="#{OStatus.pubsub_path}" />
|
||||
<link rel="hub" href="#{OStatus.pubsub_path(user)}" />
|
||||
<author>
|
||||
#{user_xml}
|
||||
</author>
|
||||
|
|
|
@ -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 New Issue