From 558ab6e74e631842e39002dffdb99a2867b5acbd Mon Sep 17 00:00:00 2001
From: Roger Braun <roger@rogerbraun.net>
Date: Tue, 1 Aug 2017 14:05:18 +0200
Subject: [PATCH] Display html links correctly for remote activies.

---
 .../web/ostatus/activity_representer.ex       | 27 ++++++++++++++++---
 .../web/ostatus/activity_representer_test.exs | 14 ++++++++++
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/lib/pleroma/web/ostatus/activity_representer.ex b/lib/pleroma/web/ostatus/activity_representer.ex
index 03e3d26bd..a129fac23 100644
--- a/lib/pleroma/web/ostatus/activity_representer.ex
+++ b/lib/pleroma/web/ostatus/activity_representer.ex
@@ -24,6 +24,29 @@ defp get_mentions(to) do
     end)
   end
 
+  defp get_links(%{local: true, data: data}) do
+    h = fn(str) -> [to_charlist(str)] end
+    [
+      {:link, [type: ['application/atom+xml'], href: h.(data["object"]["id"]), rel: 'self'], []},
+      {:link, [type: ['text/html'], href: h.(data["object"]["id"]), rel: 'alternate'], []}
+    ]
+  end
+
+  defp get_links(%{local: false,
+                   data: %{
+                     "object" => %{
+                       "external_url" => external_url
+                     }
+                   }}) do
+
+    h = fn(str) -> [to_charlist(str)] end
+    [
+      {:link, [type: ['text/html'], href: h.(external_url), rel: 'alternate'], []}
+    ]
+  end
+
+  defp get_links(_activity), do: []
+
   def to_simple_form(activity, user, with_author \\ false)
   def to_simple_form(%{data: %{"object" => %{"type" => "Note"}}} = activity, user, with_author) do
     h = fn(str) -> [to_charlist(str)] end
@@ -53,9 +76,7 @@ def to_simple_form(%{data: %{"object" => %{"type" => "Note"}}} = activity, user,
       {:updated, h.(updated_at)},
       {:"ostatus:conversation", [], h.(activity.data["context"])},
       {:link, [ref: h.(activity.data["context"]), rel: 'ostatus:conversation'], []},
-      {:link, [type: ['application/atom+xml'], href: h.(activity.data["object"]["id"]), rel: 'self'], []},
-      {:link, [type: ['text/html'], href: h.(activity.data["object"]["id"]), rel: 'alternate'], []}
-    ] ++ categories ++ attachments ++ in_reply_to ++ author ++ mentions
+    ] ++ get_links(activity) ++ categories ++ attachments ++ in_reply_to ++ author ++ mentions
   end
 
   def to_simple_form(%{data: %{"type" => "Like"}} = activity, user, with_author) do
diff --git a/test/web/ostatus/activity_representer_test.exs b/test/web/ostatus/activity_representer_test.exs
index c706c1e07..171a8bae7 100644
--- a/test/web/ostatus/activity_representer_test.exs
+++ b/test/web/ostatus/activity_representer_test.exs
@@ -4,9 +4,23 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
   alias Pleroma.Web.OStatus.ActivityRepresenter
   alias Pleroma.{User, Activity, Object}
   alias Pleroma.Web.ActivityPub.ActivityPub
+  alias Pleroma.Web.OStatus
 
   import Pleroma.Factory
 
+  test "an external note activity" do
+    incoming = File.read!("test/fixtures/mastodon-note-cw.xml")
+    {:ok, [activity]} = OStatus.handle_incoming(incoming)
+
+    user = User.get_cached_by_ap_id(activity.data["actor"])
+
+    tuple = ActivityRepresenter.to_simple_form(activity, user)
+
+    res = :xmerl.export_simple_content(tuple, :xmerl_xml) |> IO.iodata_to_binary
+
+    assert String.contains?(res, ~s{<link type="text/html" href="https://mastodon.social/users/lambadalambda/updates/2314748" rel="alternate"/>})
+  end
+
   test "a note activity" do
     note_activity = insert(:note_activity)
 
-- 
GitLab