From 1d01e8e656c364b97b9ee36a6173a830d3f5f4fc Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Mon, 1 Apr 2019 22:12:02 +0545 Subject: [PATCH 1/3] [OStatus] adds status to pleroma instance if the url given is a status --- .../controllers/util_controller.ex | 46 +++++--- test/fixtures/httpoison_mock/emelie.json | 106 ++++++++++++++++++ .../httpoison_mock/status.emelie.json | 64 +++++++++++ test/support/http_request_mock.ex | 16 +++ test/web/twitter_api/util_controller_test.exs | 17 +++ 5 files changed, 233 insertions(+), 16 deletions(-) create mode 100644 test/fixtures/httpoison_mock/emelie.json create mode 100644 test/fixtures/httpoison_mock/status.emelie.json diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index faa733fec..7f301a518 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -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 @@ def remote_subscribe(conn, %{"user" => %{"nickname" => nick, "profile" => profil 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 + 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}") - 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 - }) + 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 index 000000000..2e164ffdf --- /dev/null +++ b/test/fixtures/httpoison_mock/emelie.json @@ -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": "

23 / #Sweden / #Artist / #Equestrian / #GameDev

If I ain't spending time with my pets, I'm probably drawing. 🐴 🐱 🐰

", + "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": "https://ko-fi.com/emeliepng" + }, + { + "type": "PropertyValue", + "name": "Instagram", + "value": "https://www.instagram.com/emelie_png/" + }, + { + "type": "PropertyValue", + "name": "Carrd", + "value": "https://emelie.carrd.co/" + }, + { + "type": "PropertyValue", + "name": "Artstation", + "value": "https://emiri.artstation.com" + } + ], + "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 index 000000000..4aada0377 --- /dev/null +++ b/test/fixtures/httpoison_mock/status.emelie.json @@ -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": "

You gotta take whatever bellyrubbing opportunity you can get before she changes her mind 🦁 #mastocats

", + "contentMap": { + "en": "

You gotta take whatever bellyrubbing opportunity you can get before she changes her mind 🦁 #mastocats

" + }, + "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": [] + } + } +} diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 78e8efc9d..2148bd4e7 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -36,6 +36,22 @@ def get("https://osada.macgirvin.com/channel/mike", _, _, _) 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", _, diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 832fdc096..f4a3ce501 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -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 @@ test "returns everything in :pleroma, :frontend_configurations", %{conn: conn} d 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 From 6386c1c9c1ff971c784744922a479ae38e5fdbad Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Tue, 2 Apr 2019 10:26:09 +0545 Subject: [PATCH 2/3] fetch url for OStatus to know if it is a/c or status --- .../controllers/util_controller.ex | 6 +- test/fixtures/httpoison_mock/emelie.atom | 306 ++++++++++++++++++ test/fixtures/httpoison_mock/emelie.json | 106 ------ .../httpoison_mock/webfinger_emelie.json | 36 +++ test/support/http_request_mock.ex | 21 ++ test/web/twitter_api/util_controller_test.exs | 10 + 6 files changed, 377 insertions(+), 108 deletions(-) create mode 100644 test/fixtures/httpoison_mock/emelie.atom delete mode 100644 test/fixtures/httpoison_mock/emelie.json create mode 100644 test/fixtures/httpoison_mock/webfinger_emelie.json diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 7f301a518..2a1c73111 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -103,8 +103,10 @@ def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do end defp is_status?(acct) do - %URI{path: path} = URI.parse(acct) - Regex.match?(~r/\/users\/[^\/]+\/statuses\/([0-9]+)$/, path) + case ActivityPub.fetch_and_contain_remote_object_from_id(acct) do + {:ok, %{"type" => "Note"}} -> true + _ -> false + end end def do_remote_follow(conn, %{ diff --git a/test/fixtures/httpoison_mock/emelie.atom b/test/fixtures/httpoison_mock/emelie.atom new file mode 100644 index 000000000..ddaa1c6ca --- /dev/null +++ b/test/fixtures/httpoison_mock/emelie.atom @@ -0,0 +1,306 @@ + + + https://mastodon.social/users/emelie.atom + emelie 🎨 + 23 / #Sweden / #Artist / #Equestrian / #GameDev + +If I ain't spending time with my pets, I'm probably drawing. 🐴 🐱 🐰 + 2019-02-04T20:22:19Z + https://files.mastodon.social/accounts/avatars/000/015/657/original/e7163f98280da1a4.png + + https://mastodon.social/users/emelie + http://activitystrea.ms/schema/1.0/person + https://mastodon.social/users/emelie + emelie + emelie@mastodon.social + <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> + + + + emelie + emelie 🎨 + 23 / #Sweden / #Artist / #Equestrian / #GameDev + +If I ain't spending time with my pets, I'm probably drawing. 🐴 🐱 🐰 + public + + + + + + + https://mastodon.social/users/emelie/statuses/101850331907006641 + 2019-04-01T09:58:50Z + 2019-04-01T09:58:50Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>Me: I&apos;m going to make this vital change to my world building in the morning, no way I&apos;ll forget this, it&apos;s too big of a deal<br />Also me: forgets</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101849626603073336 + 2019-04-01T06:59:28Z + 2019-04-01T06:59:28Z + New status by emelie + http://activitystrea.ms/schema/1.0/comment + http://activitystrea.ms/schema/1.0/post + + <p><span class="h-card"><a href="https://mastodon.social/@Fergant" class="u-url mention">@<span>Fergant</span></a></span> Dom är i stort sett religiös skrift vid det här laget 👏👏</p><p>har dock bara läst svenska översättningen, kanske är dags att jag läser dom på engelska</p> + + + public + + + + + + + https://mastodon.social/users/emelie/statuses/101849580030237068 + 2019-04-01T06:47:37Z + 2019-04-01T06:47:37Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>What&apos;s you people&apos;s favourite fantasy books? Give me some hot tips 🌞</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101849550599949363 + 2019-04-01T06:40:08Z + 2019-04-01T06:40:08Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>Stick them legs out 💃 <a href="https://mastodon.social/tags/mastocats" class="mention hashtag" rel="tag">#<span>mastocats</span></a></p> + + + + public + + + + + + https://mastodon.social/users/emelie/statuses/101849191533152720 + 2019-04-01T05:08:49Z + 2019-04-01T05:08:49Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>long 🐱 <a href="https://mastodon.social/tags/mastocats" class="mention hashtag" rel="tag">#<span>mastocats</span></a></p> + + + + public + + + + + + https://mastodon.social/users/emelie/statuses/101849165031453009 + 2019-04-01T05:02:05Z + 2019-04-01T05:02:05Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <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> + + + + public + + + + + + https://mastodon.social/users/emelie/statuses/101846512530748693 + 2019-03-31T17:47:31Z + 2019-03-31T17:47:31Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>Hello look at this boy having a decent haircut for once <a href="https://mastodon.social/tags/mastohorses" class="mention hashtag" rel="tag">#<span>mastohorses</span></a> <a href="https://mastodon.social/tags/equestrian" class="mention hashtag" rel="tag">#<span>equestrian</span></a></p> + + + + + public + + + + + + https://mastodon.social/users/emelie/statuses/101846181093805500 + 2019-03-31T16:23:14Z + 2019-03-31T16:23:14Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>Sorry did I disturb the who-is-the-longest-cat competition ? <a href="https://mastodon.social/tags/mastocats" class="mention hashtag" rel="tag">#<span>mastocats</span></a></p> + + + + public + + + + + + https://mastodon.social/users/emelie/statuses/101845897513133849 + 2019-03-31T15:11:07Z + 2019-03-31T15:11:07Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + more earthsea ramblings + <p>I&apos;m re-watching Tales from Earthsea for the first time since I read the books, and that Therru doesn&apos;t squash Cob like a spider, as Orm Embar did is a wasted opportunity tbh</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101841219051533307 + 2019-03-30T19:21:19Z + 2019-03-30T19:21:19Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>I gave my cats some mackerel and they ate it all in 0.3 seconds, and now they won&apos;t stop meowing for more, and I&apos;m tired plz shut up</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101839949762341381 + 2019-03-30T13:58:31Z + 2019-03-30T13:58:31Z + New status by emelie + http://activitystrea.ms/schema/1.0/comment + http://activitystrea.ms/schema/1.0/post + + <p>yet I&apos;m confused about this american dude with a gun, like the heck r ya doin in mah ghibli</p> + + public + + + + + + + https://mastodon.social/users/emelie/statuses/101839928677863590 + 2019-03-30T13:53:09Z + 2019-03-30T13:53:09Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>2 hours into Ni no Kuni 2 and I&apos;ve already sold my soul to this game</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101836329521599438 + 2019-03-29T22:37:51Z + 2019-03-29T22:37:51Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>Pippi Longstocking the original one-punch /man</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101835905282948341 + 2019-03-29T20:49:57Z + 2019-03-29T20:49:57Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>I&apos;ve had so much wine I thought I had a 3rd brother</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101835878059204660 + 2019-03-29T20:43:02Z + 2019-03-29T20:43:02Z + New status by emelie + http://activitystrea.ms/schema/1.0/note + http://activitystrea.ms/schema/1.0/post + + <p>ååååhhh booi</p> + + public + + + + + + https://mastodon.social/users/emelie/statuses/101835848050598939 + 2019-03-29T20:35:24Z + 2019-03-29T20:35:24Z + New status by emelie + http://activitystrea.ms/schema/1.0/comment + http://activitystrea.ms/schema/1.0/post + + <p><span class="h-card"><a href="https://thraeryn.net/@thraeryn" class="u-url mention">@<span>thraeryn</span></a></span> if I spent 1 hour and a half watching this monstrosity, I need to</p> + + + public + + + + + + + https://mastodon.social/users/emelie/statuses/101835823138262290 + 2019-03-29T20:29:04Z + 2019-03-29T20:29:04Z + New status by emelie + http://activitystrea.ms/schema/1.0/comment + http://activitystrea.ms/schema/1.0/post + + medical, fluids mention + <p><span class="h-card"><a href="https://icosahedron.website/@Trev" class="u-url mention">@<span>Trev</span></a></span> *hugs* ✨</p> + + + public + + + + + + diff --git a/test/fixtures/httpoison_mock/emelie.json b/test/fixtures/httpoison_mock/emelie.json deleted file mode 100644 index 2e164ffdf..000000000 --- a/test/fixtures/httpoison_mock/emelie.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "@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": "

23 / #Sweden / #Artist / #Equestrian / #GameDev

If I ain't spending time with my pets, I'm probably drawing. 🐴 🐱 🐰

", - "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": "https://ko-fi.com/emeliepng" - }, - { - "type": "PropertyValue", - "name": "Instagram", - "value": "https://www.instagram.com/emelie_png/" - }, - { - "type": "PropertyValue", - "name": "Carrd", - "value": "https://emelie.carrd.co/" - }, - { - "type": "PropertyValue", - "name": "Artstation", - "value": "https://emiri.artstation.com" - } - ], - "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/webfinger_emelie.json b/test/fixtures/httpoison_mock/webfinger_emelie.json new file mode 100644 index 000000000..0b61cb618 --- /dev/null +++ b/test/fixtures/httpoison_mock/webfinger_emelie.json @@ -0,0 +1,36 @@ +{ + "aliases": [ + "https://mastodon.social/@emelie", + "https://mastodon.social/users/emelie" + ], + "links": [ + { + "href": "https://mastodon.social/@emelie", + "rel": "http://webfinger.net/rel/profile-page", + "type": "text/html" + }, + { + "href": "https://mastodon.social/users/emelie.atom", + "rel": "http://schemas.google.com/g/2010#updates-from", + "type": "application/atom+xml" + }, + { + "href": "https://mastodon.social/users/emelie", + "rel": "self", + "type": "application/activity+json" + }, + { + "href": "https://mastodon.social/api/salmon/15657", + "rel": "salmon" + }, + { + "href": "data:application/magic-public-key,RSA.u3CWs1oAJPE3ZJ9sj6Ut_Mu-mTE7MOijsQc8_6c73XVVuhIEomiozJIH7l8a7S1n5SYL4UuiwcubSOi7u1bbGpYnp5TYhN-Cxvq_P80V4_ncNIPSQzS49it7nSLeG5pA21lGPDA44huquES1un6p9gSmbTwngVX9oe4MYuUeh0Z7vijjU13Llz1cRq_ZgPQPgfz-2NJf-VeXnvyDZDYxZPVBBlrMl3VoGbu0M5L8SjY35559KCZ3woIvqRolcoHXfgvJMdPcJgSZVYxlCw3dA95q9jQcn6s87CPSUs7bmYEQCrDVn5m5NER5TzwBmP4cgJl9AaDVWQtRd4jFZNTxlQ==.AQAB", + "rel": "magic-public-key" + }, + { + "rel": "http://ostatus.org/schema/1.0/subscribe", + "template": "https://mastodon.social/authorize_interaction?uri={uri}" + } + ], + "subject": "acct:emelie@mastodon.social" +} diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 2148bd4e7..d3b547d91 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -52,6 +52,27 @@ def get("https://mastodon.social/users/emelie", _, _, _) do }} end + def get( + "https://mastodon.social/.well-known/webfinger?resource=https://mastodon.social/users/emelie", + _, + _, + _ + ) do + {:ok, + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/httpoison_mock/webfinger_emelie.json") + }} + end + + def get("https://mastodon.social/users/emelie.atom", _, _, _) do + {:ok, + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/httpoison_mock/emelie.atom") + }} + end + def get( "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com", _, diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index f4a3ce501..e4dd97d46 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -180,5 +180,15 @@ test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} assert redirected_to(conn) =~ "/notice/" end + + test "show follow account page if the `acct` is a account link", %{conn: conn} do + response = + get( + conn, + "/ostatus_subscribe?acct=https://mastodon.social/users/emelie" + ) + + assert html_response(response, 200) =~ "Log in to follow" + end end end From f20e8d28de97e154ec43120cb4fc07e2792e955a Mon Sep 17 00:00:00 2001 From: Sachin Joshi Date: Tue, 2 Apr 2019 12:15:41 +0545 Subject: [PATCH 3/3] add support for all status type (ostatus) and replase case with if --- .../controllers/util_controller.ex | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index 2a1c73111..b661c4363 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -74,38 +74,39 @@ def remote_subscribe(conn, %{"user" => %{"nickname" => nick, "profile" => profil end def remote_follow(%{assigns: %{user: user}} = conn, %{"acct" => acct}) do - 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}") + if is_status?(acct) do + {: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}") + else + {err, followee} = OStatus.find_or_make_user(acct) + avatar = User.avatar_url(followee) + name = followee.nickname + id = followee.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 + 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 case ActivityPub.fetch_and_contain_remote_object_from_id(acct) do - {:ok, %{"type" => "Note"}} -> true - _ -> false + {:ok, %{"type" => type}} when type in ["Article", "Note", "Video", "Page", "Question"] -> + true + + _ -> + false end end