[OStatus] adds status to pleroma instance if the url given is a status
authorSachin Joshi <satchin.joshi@gmail.com>
Mon, 1 Apr 2019 16:27:02 +0000 (22:12 +0545)
committerSachin Joshi <satchin.joshi@gmail.com>
Mon, 1 Apr 2019 16:41:58 +0000 (22:26 +0545)
lib/pleroma/web/twitter_api/controllers/util_controller.ex
test/fixtures/httpoison_mock/emelie.json [new file with mode: 0644]
test/fixtures/httpoison_mock/status.emelie.json [new file with mode: 0644]
test/support/http_request_mock.ex
test/web/twitter_api/util_controller_test.exs

index faa733fec5741f9f873716c8ec52e92ea7db4089..7f301a518075e67a57cb645c0c4601ac147d968a 100644 (file)
@@ -8,6 +8,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
   require Logger
 
   alias Comeonin.Pbkdf2
+  alias Pleroma.Activity
   alias Pleroma.Emoji
   alias Pleroma.Notification
   alias Pleroma.PasswordResetToken
@@ -73,26 +74,39 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
   end
 
   def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do
-    {err, followee} = OStatus.find_or_make_user(acct)
-    avatar = User.avatar_url(followee)
-    name = followee.nickname
-    id = followee.id
-
-    if !!user do
-      conn
-      |> render("follow.html", %{error: err, acct: acct, avatar: avatar, name: name, id: id})
-    else
-      conn
-      |> render("follow_login.html", %{
-        error: false,
-        acct: acct,
-        avatar: avatar,
-        name: name,
-        id: id
-      })
+    case is_status?(acct) do
+      true ->
+        {:ok, object} = ActivityPub.fetch_object_from_id(acct)
+        %Activity{id: activity_id} = Activity.get_create_by_object_ap_id(object.data["id"])
+        redirect(conn, to: "/notice/#{activity_id}")
+
+      false ->
+        {err, followee} = OStatus.find_or_make_user(acct)
+        avatar = User.avatar_url(followee)
+        name = followee.nickname
+        id = followee.id
+
+        if !!user do
+          conn
+          |> render("follow.html", %{error: err, acct: acct, avatar: avatar, name: name, id: id})
+        else
+          conn
+          |> render("follow_login.html", %{
+            error: false,
+            acct: acct,
+            avatar: avatar,
+            name: name,
+            id: id
+          })
+        end
     end
   end
 
+  defp is_status?(acct) do
+    %URI{path: path} = URI.parse(acct)
+    Regex.match?(~r/\/users\/[^\/]+\/statuses\/([0-9]+)$/, path)
+  end
+
   def do_remote_follow(conn, %{
         "authorization" => %{"name" => username, "password" => password, "id" => id}
       }) do
diff --git a/test/fixtures/httpoison_mock/emelie.json b/test/fixtures/httpoison_mock/emelie.json
new file mode 100644 (file)
index 0000000..2e164ff
--- /dev/null
@@ -0,0 +1,106 @@
+{
+    "@context": [
+        "https://www.w3.org/ns/activitystreams",
+        "https://w3id.org/security/v1",
+        {
+            "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+            "toot": "http://joinmastodon.org/ns#",
+            "featured": {
+                "@id": "toot:featured",
+                "@type": "@id"
+            },
+            "alsoKnownAs": {
+                "@id": "as:alsoKnownAs",
+                "@type": "@id"
+            },
+            "movedTo": {
+                "@id": "as:movedTo",
+                "@type": "@id"
+            },
+            "schema": "http://schema.org#",
+            "PropertyValue": "schema:PropertyValue",
+            "value": "schema:value",
+            "Hashtag": "as:Hashtag",
+            "Emoji": "toot:Emoji",
+            "IdentityProof": "toot:IdentityProof",
+            "focalPoint": {
+                "@container": "@list",
+                "@id": "toot:focalPoint"
+            }
+        }
+    ],
+    "id": "https://mastodon.social/users/emelie",
+    "type": "Person",
+    "following": "https://mastodon.social/users/emelie/following",
+    "followers": "https://mastodon.social/users/emelie/followers",
+    "inbox": "https://mastodon.social/users/emelie/inbox",
+    "outbox": "https://mastodon.social/users/emelie/outbox",
+    "featured": "https://mastodon.social/users/emelie/collections/featured",
+    "preferredUsername": "emelie",
+    "name": "emelie 🎨",
+    "summary": "<p>23 / <a href=\"https://mastodon.social/tags/sweden\" class=\"mention hashtag\" rel=\"tag\">#<span>Sweden</span></a> / <a href=\"https://mastodon.social/tags/artist\" class=\"mention hashtag\" rel=\"tag\">#<span>Artist</span></a> / <a href=\"https://mastodon.social/tags/equestrian\" class=\"mention hashtag\" rel=\"tag\">#<span>Equestrian</span></a> / <a href=\"https://mastodon.social/tags/gamedev\" class=\"mention hashtag\" rel=\"tag\">#<span>GameDev</span></a></p><p>If I ain&apos;t spending time with my pets, I&apos;m probably drawing. 🐴 🐱 🐰</p>",
+    "url": "https://mastodon.social/@emelie",
+    "manuallyApprovesFollowers": false,
+    "publicKey": {
+        "id": "https://mastodon.social/users/emelie#main-key",
+        "owner": "https://mastodon.social/users/emelie",
+        "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu3CWs1oAJPE3ZJ9sj6Ut\n/Mu+mTE7MOijsQc8/6c73XVVuhIEomiozJIH7l8a7S1n5SYL4UuiwcubSOi7u1bb\nGpYnp5TYhN+Cxvq/P80V4/ncNIPSQzS49it7nSLeG5pA21lGPDA44huquES1un6p\n9gSmbTwngVX9oe4MYuUeh0Z7vijjU13Llz1cRq/ZgPQPgfz+2NJf+VeXnvyDZDYx\nZPVBBlrMl3VoGbu0M5L8SjY35559KCZ3woIvqRolcoHXfgvJMdPcJgSZVYxlCw3d\nA95q9jQcn6s87CPSUs7bmYEQCrDVn5m5NER5TzwBmP4cgJl9AaDVWQtRd4jFZNTx\nlQIDAQAB\n-----END PUBLIC KEY-----\n"
+    },
+    "tag": [
+        {
+            "type": "Hashtag",
+            "href": "https://mastodon.social/explore/sweden",
+            "name": "#sweden"
+        },
+        {
+            "type": "Hashtag",
+            "href": "https://mastodon.social/explore/gamedev",
+            "name": "#gamedev"
+        },
+        {
+            "type": "Hashtag",
+            "href": "https://mastodon.social/explore/artist",
+            "name": "#artist"
+        },
+        {
+            "type": "Hashtag",
+            "href": "https://mastodon.social/explore/equestrian",
+            "name": "#equestrian"
+        }
+    ],
+    "attachment": [
+        {
+            "type": "PropertyValue",
+            "name": "Ko-fi",
+            "value": "<a href=\"https://ko-fi.com/emeliepng\" rel=\"me nofollow noopener\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">ko-fi.com/emeliepng</span><span class=\"invisible\"></span></a>"
+        },
+        {
+            "type": "PropertyValue",
+            "name": "Instagram",
+            "value": "<a href=\"https://www.instagram.com/emelie_png/\" rel=\"me nofollow noopener\" target=\"_blank\"><span class=\"invisible\">https://www.</span><span class=\"\">instagram.com/emelie_png/</span><span class=\"invisible\"></span></a>"
+        },
+        {
+            "type": "PropertyValue",
+            "name": "Carrd",
+            "value": "<a href=\"https://emelie.carrd.co/\" rel=\"me nofollow noopener\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">emelie.carrd.co/</span><span class=\"invisible\"></span></a>"
+        },
+        {
+            "type": "PropertyValue",
+            "name": "Artstation",
+            "value": "<a href=\"https://emiri.artstation.com\" rel=\"me nofollow noopener\" target=\"_blank\"><span class=\"invisible\">https://</span><span class=\"\">emiri.artstation.com</span><span class=\"invisible\"></span></a>"
+        }
+    ],
+    "endpoints": {
+        "sharedInbox": "https://mastodon.social/inbox"
+    },
+    "icon": {
+        "type": "Image",
+        "mediaType": "image/png",
+        "url": "https://files.mastodon.social/accounts/avatars/000/015/657/original/e7163f98280da1a4.png"
+    },
+    "image": {
+        "type": "Image",
+        "mediaType": "image/png",
+        "url": "https://files.mastodon.social/accounts/headers/000/015/657/original/847f331f3dd9e38b.png"
+    }
+}
diff --git a/test/fixtures/httpoison_mock/status.emelie.json b/test/fixtures/httpoison_mock/status.emelie.json
new file mode 100644 (file)
index 0000000..4aada03
--- /dev/null
@@ -0,0 +1,64 @@
+{
+    "@context": [
+        "https://www.w3.org/ns/activitystreams",
+        {
+            "ostatus": "http://ostatus.org#",
+            "atomUri": "ostatus:atomUri",
+            "inReplyToAtomUri": "ostatus:inReplyToAtomUri",
+            "conversation": "ostatus:conversation",
+            "sensitive": "as:sensitive",
+            "Hashtag": "as:Hashtag",
+            "toot": "http://joinmastodon.org/ns#",
+            "Emoji": "toot:Emoji",
+            "focalPoint": {
+                "@container": "@list",
+                "@id": "toot:focalPoint"
+            }
+        }
+    ],
+    "id": "https://mastodon.social/users/emelie/statuses/101849165031453009",
+    "type": "Note",
+    "summary": null,
+    "inReplyTo": null,
+    "published": "2019-04-01T05:02:05Z",
+    "url": "https://mastodon.social/@emelie/101849165031453009",
+    "attributedTo": "https://mastodon.social/users/emelie",
+    "to": [
+        "https://www.w3.org/ns/activitystreams#Public"
+    ],
+    "cc": [
+        "https://mastodon.social/users/emelie/followers"
+    ],
+    "sensitive": false,
+    "atomUri": "https://mastodon.social/users/emelie/statuses/101849165031453009",
+    "inReplyToAtomUri": null,
+    "conversation": "tag:mastodon.social,2019-04-01:objectId=94350309:objectType=Conversation",
+    "content": "<p>You gotta take whatever bellyrubbing opportunity you can get before she changes her mind 🦁 <a href=\"https://mastodon.social/tags/mastocats\" class=\"mention hashtag\" rel=\"tag\">#<span>mastocats</span></a></p>",
+    "contentMap": {
+        "en": "<p>You gotta take whatever bellyrubbing opportunity you can get before she changes her mind 🦁 <a href=\"https://mastodon.social/tags/mastocats\" class=\"mention hashtag\" rel=\"tag\">#<span>mastocats</span></a></p>"
+    },
+    "attachment": [
+        {
+            "type": "Document",
+            "mediaType": "video/mp4",
+            "url": "https://files.mastodon.social/media_attachments/files/013/049/816/original/e7831178a5e0d6d4.mp4",
+            "name": null
+        }
+    ],
+    "tag": [
+        {
+            "type": "Hashtag",
+            "href": "https://mastodon.social/tags/mastocats",
+            "name": "#mastocats"
+        }
+    ],
+    "replies": {
+        "id": "https://mastodon.social/users/emelie/statuses/101849165031453009/replies",
+        "type": "Collection",
+        "first": {
+            "type": "CollectionPage",
+            "partOf": "https://mastodon.social/users/emelie/statuses/101849165031453009/replies",
+            "items": []
+        }
+    }
+}
index 78e8efc9df77c1128d21bc73630e20b8752b4ec0..2148bd4e7c9cfb9cb66ee50bdf2ed54a8ef667d8 100644 (file)
@@ -36,6 +36,22 @@ defmodule HttpRequestMock do
      }}
   end
 
+  def get("https://mastodon.social/users/emelie/statuses/101849165031453009", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/status.emelie.json")
+     }}
+  end
+
+  def get("https://mastodon.social/users/emelie", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/emelie.json")
+     }}
+  end
+
   def get(
         "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com",
         _,
index 832fdc09692b118fe71a1e3d94a6e682ae254efb..f4a3ce501e43386ac767077af296bf7dea62dd67 100644 (file)
@@ -6,6 +6,11 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
   alias Pleroma.Web.CommonAPI
   import Pleroma.Factory
 
+  setup do
+    Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
+
   describe "POST /api/pleroma/follow_import" do
     test "it returns HTTP 200", %{conn: conn} do
       user1 = insert(:user)
@@ -164,4 +169,16 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do
       assert response == Jason.encode!(config |> Enum.into(%{})) |> Jason.decode!()
     end
   end
+
+  describe "GET /ostatus_subscribe?acct=...." do
+    test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do
+      conn =
+        get(
+          conn,
+          "/ostatus_subscribe?acct=https://mastodon.social/users/emelie/statuses/101849165031453009"
+        )
+
+      assert redirected_to(conn) =~ "/notice/"
+    end
+  end
 end