Return keys in webfinger.
authorRoger Braun <roger@rogerbraun.net>
Sun, 30 Apr 2017 13:00:04 +0000 (15:00 +0200)
committerRoger Braun <roger@rogerbraun.net>
Sun, 30 Apr 2017 13:00:04 +0000 (15:00 +0200)
lib/pleroma/user.ex
lib/pleroma/web/web_finger/web_finger.ex
test/web/web_finger/web_finger_test.exs

index cd61046802bfbfcbe1bfaaa0b936b87b04012d24..49ba9b22ed1fa727b192e6c42044332d5450abd2 100644 (file)
@@ -16,7 +16,7 @@ defmodule Pleroma.User do
     field :ap_id, :string
     field :avatar, :map
     field :local, :boolean, default: true
-    field :info, :map
+    field :info, :map, default: %{}
 
     timestamps()
   end
index 49796dab83b43180c4bcb4b07e506d6b025a2b07..13e3baad6b27be7d3fb8a3c4fb20fc79cd7ee0d1 100644 (file)
@@ -1,8 +1,7 @@
 defmodule Pleroma.Web.WebFinger do
   alias Pleroma.XmlBuilder
-  alias Pleroma.User
-  alias Pleroma.Web.OStatus
-  alias Pleroma.Web.XML
+  alias Pleroma.{Repo, User}
+  alias Pleroma.Web.{XML, Salmon, OStatus}
   require Logger
 
   def host_meta() do
@@ -28,18 +27,33 @@ defmodule Pleroma.Web.WebFinger do
   end
 
   def represent_user(user) do
+    {:ok, user} = ensure_keys_present(user)
+    {:ok, _private, public} = Salmon.keys_from_pem(user.info["keys"])
+    magic_key = Salmon.encode_key(public)
     {
       :XRD, %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"},
       [
         {:Subject, "acct:#{user.nickname}@#{Pleroma.Web.host}"},
         {:Alias, user.ap_id},
         {:Link, %{rel: "http://schemas.google.com/g/2010#updates-from", type: "application/atom+xml", href: OStatus.feed_path(user)}},
-        {:Link, %{rel: "salmon", href: OStatus.salmon_path(user)}}
+        {:Link, %{rel: "salmon", href: OStatus.salmon_path(user)}},
+        {:Link, %{rel: "magic-public-key", href: "data:application/magic-public-key,#{magic_key}"}}
       ]
     }
     |> XmlBuilder.to_doc
   end
 
+  def ensure_keys_present(user) do
+    info = user.info || %{}
+    if info["keys"] do
+      {:ok, user}
+    else
+      {:ok, pem} = Salmon.generate_rsa_pem
+      info = Map.put(info, "keys", pem)
+      Repo.update(Ecto.Changeset.change(user, info: info))
+    end
+  end
+
   # FIXME: Make this call the host-meta to find the actual address.
   defp webfinger_address(domain) do
     "//#{domain}/.well-known/webfinger"
index e5347a2b0fddd17505280a261ae3f013f3f4726b..303abe5294c78ca4eabb75615d04bbf202f00474 100644 (file)
@@ -1,6 +1,7 @@
 defmodule Pleroma.Web.WebFingerTest do
   use Pleroma.DataCase
   alias Pleroma.Web.WebFinger
+  import Pleroma.Factory
 
   describe "host meta" do
     test "returns a link to the xml lrdd" do
@@ -26,4 +27,19 @@ defmodule Pleroma.Web.WebFingerTest do
       assert data.salmon == "https://social.heldscal.la/main/salmon/user/29191"
     end
   end
+
+  describe "ensure_keys_present" do
+    test "it creates keys for a user and stores them in info" do
+      user = insert(:user)
+      refute is_binary(user.info["keys"])
+      {:ok, user} = WebFinger.ensure_keys_present(user)
+      assert is_binary(user.info["keys"])
+    end
+
+    test "it doesn't create keys if there already are some" do
+      user = insert(:user, %{info: %{"keys" => "xxx"}})
+      {:ok, user} = WebFinger.ensure_keys_present(user)
+      assert user.info["keys"] == "xxx"
+    end
+  end
 end