diff options
author | Roger Braun <roger@rogerbraun.net> | 2017-04-22 13:44:21 +0200 |
---|---|---|
committer | Roger Braun <roger@rogerbraun.net> | 2017-04-22 13:44:21 +0200 |
commit | 8fb73c28bbeccb6a7462e4a0e9fb58726b68bcf5 (patch) | |
tree | 13f5fbc61181607aea2d1f4843c5417ed1512ffc /lib | |
parent | 1feb193731881f87efda0dd3c08d554d2ef22971 (diff) | |
download | pleroma-8fb73c28bbeccb6a7462e4a0e9fb58726b68bcf5.tar.gz |
Only have one subscription per callback.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/web/websub/websub.ex | 54 | ||||
-rw-r--r-- | lib/pleroma/web/websub/websub_controller.ex | 41 |
2 files changed, 56 insertions, 39 deletions
diff --git a/lib/pleroma/web/websub/websub.ex b/lib/pleroma/web/websub/websub.ex index 26a10788a..50878e3c4 100644 --- a/lib/pleroma/web/websub/websub.ex +++ b/lib/pleroma/web/websub/websub.ex @@ -3,12 +3,15 @@ defmodule Pleroma.Web.Websub do alias Pleroma.Websub alias Pleroma.Web.Websub.WebsubServerSubscription alias Pleroma.Web.OStatus.FeedRepresenter + alias Pleroma.Web.OStatus import Ecto.Query + @websub_verifier Application.get_env(:pleroma, :websub_verifier) + def verify(subscription, getter \\ &HTTPoison.get/3 ) do challenge = Base.encode16(:crypto.strong_rand_bytes(8)) - lease_seconds = NaiveDateTime.diff(subscription.valid_until, subscription.inserted_at) |> to_string + lease_seconds = NaiveDateTime.diff(subscription.valid_until, subscription.updated_at) |> to_string params = %{ "hub.challenge": challenge, @@ -48,4 +51,53 @@ defmodule Pleroma.Web.Websub do ]) end) end + + def incoming_subscription_request(user, params) do + with {:ok, topic} <- valid_topic(params, user), + {:ok, lease_time} <- lease_time(params), + secret <- params["hub.secret"], + callback <- params["hub.callback"] + do + subscription = get_subscription(topic, callback) + data = %{ + state: subscription.state || "requested", + topic: topic, + secret: secret, + callback: callback + } + + change = Ecto.Changeset.change(subscription, data) + websub = Repo.insert_or_update!(change) + + change = Ecto.Changeset.change(websub, %{valid_until: NaiveDateTime.add(websub.updated_at, lease_time)}) + websub = Repo.update!(change) + + # Just spawn that for now, maybe pool later. + spawn(fn -> @websub_verifier.verify(websub) end) + + {:ok, websub} + else {:error, reason} -> + {:error, reason} + end + end + + defp get_subscription(topic, callback) do + Repo.get_by(WebsubServerSubscription, topic: topic, callback: callback) || %WebsubServerSubscription{} + end + + defp lease_time(%{"hub.lease_seconds" => lease_seconds}) do + {:ok, String.to_integer(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 diff --git a/lib/pleroma/web/websub/websub_controller.ex b/lib/pleroma/web/websub/websub_controller.ex index 5766dff64..5d54c6ef5 100644 --- a/lib/pleroma/web/websub/websub_controller.ex +++ b/lib/pleroma/web/websub/websub_controller.ex @@ -1,32 +1,13 @@ defmodule Pleroma.Web.Websub.WebsubController do use Pleroma.Web, :controller - alias Pleroma.Web.Websub.WebsubServerSubscription - alias Pleroma.{Repo, User} - alias Pleroma.Web.OStatus + alias Pleroma.User alias Pleroma.Web.Websub + 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"] + with {:ok, _websub} <- Websub.incoming_subscription_request(user, params) do - data = %{ - state: "requested", - topic: topic, - secret: secret, - callback: params["hub.callback"] - } - - 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) - - # Just spawn that for now, maybe pool later. - spawn(fn -> Websub.verify(websub) end) - conn |> send_resp(202, "Accepted") else {:error, reason} -> @@ -34,20 +15,4 @@ defmodule Pleroma.Web.Websub.WebsubController do |> send_resp(500, reason) end end - - defp lease_time(%{"hub.lease_seconds" => lease_seconds}) do - {:ok, String.to_integer(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 |