Skip to content
Snippets Groups Projects
Commit 1b9cc721 authored by lain's avatar lain
Browse files

Websub controller beginnings.

parent 5e7ceeba
No related branches found
No related tags found
No related merge requests found
......@@ -20,7 +20,7 @@ defmodule Pleroma.Web.OStatus.FeedRepresenter 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 @@ defmodule Pleroma.Web.OStatus 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 @@ defmodule Pleroma.Web.Router 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
......
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 @@ defmodule Pleroma.Web.OStatus.FeedRepresenterTest 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>
......
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment