add basic federation to websub.
authorRoger Braun <roger@rogerbraun.net>
Sat, 22 Apr 2017 10:07:51 +0000 (12:07 +0200)
committerRoger Braun <roger@rogerbraun.net>
Sat, 22 Apr 2017 10:07:51 +0000 (12:07 +0200)
lib/pleroma/web/websub/websub.ex
test/web/websub/websub_test.exs

index c7752487c296bde7e32571d21fbdc849d0a08d61..26a10788ae38a245752fec70d81a7952dc190ab7 100644 (file)
@@ -1,15 +1,26 @@
 defmodule Pleroma.Web.Websub do
   alias Pleroma.Repo
+  alias Pleroma.Websub
+  alias Pleroma.Web.Websub.WebsubServerSubscription
+  alias Pleroma.Web.OStatus.FeedRepresenter
+
+  import Ecto.Query
 
   def verify(subscription, getter \\ &HTTPoison.get/3 ) do
     challenge = Base.encode16(:crypto.strong_rand_bytes(8))
-    lease_seconds = NaiveDateTime.diff(subscription.inserted_at, subscription.valid_until)
-    with {:ok, response} <- getter.(subscription.callback, [], [params: %{
-                                                              "hub.challenge": challenge,
-                                                              "hub.lease_seconds": lease_seconds,
-                                                              "hub.topic": subscription.topic,
-                                                              "hub.mode": "subscribe"
-                                                                }]),
+    lease_seconds = NaiveDateTime.diff(subscription.valid_until, subscription.inserted_at) |> to_string
+
+    params = %{
+      "hub.challenge": challenge,
+      "hub.lease_seconds": lease_seconds,
+      "hub.topic": subscription.topic,
+      "hub.mode": "subscribe"
+    }
+
+    url = hd(String.split(subscription.callback, "?"))
+    query = URI.parse(subscription.callback).query || ""
+    params = Map.merge(params, URI.decode_query(query))
+    with {:ok, response} <- getter.(url, [], [params: params]),
          ^challenge <- response.body
     do
       changeset = Ecto.Changeset.change(subscription, %{state: "active"})
@@ -20,4 +31,21 @@ defmodule Pleroma.Web.Websub do
       {:error, subscription}
     end
   end
+
+  def publish(topic, user, activity) do
+    query = from sub in WebsubServerSubscription,
+    where: sub.topic == ^topic and sub.state == "active"
+    subscriptions = Repo.all(query)
+    Enum.each(subscriptions, fn(sub) ->
+      response = FeedRepresenter.to_simple_form(user, [activity], [user])
+      |> :xmerl.export_simple(:xmerl_xml)
+
+      signature = :crypto.hmac(:sha, sub.secret, response) |> Base.encode16
+
+      HTTPoison.post(sub.callback, response, [
+            {"Content-Type", "application/atom+xml"},
+            {"X-Hub-Signature", "sha1=#{signature}"}
+          ])
+    end)
+  end
 end
index 93a44fe46635210dacc3c14be8d91478aea7a74d..36ea822990959574ddbbbad54d2a7628e45cdcca 100644 (file)
@@ -15,7 +15,7 @@ defmodule Pleroma.Web.WebsubTest do
         "hub.mode": "subscribe"
       } = Keyword.get(options, :params)
 
-      assert is_number(seconds)
+      assert String.to_integer(seconds) > 0
 
       {:ok, %HTTPoison.Response{
         status_code: 200,