Merge branch 'bugfix/share-mastodon' into 'develop'
authorlambda <lain@soykaf.club>
Tue, 2 Apr 2019 12:47:40 +0000 (12:47 +0000)
committerlambda <lain@soykaf.club>
Tue, 2 Apr 2019 12:47:40 +0000 (12:47 +0000)
[OStatus] adds status to pleroma instance if the url given is a status

See merge request pleroma/pleroma!1002

1  2 
lib/pleroma/web/twitter_api/controllers/util_controller.ex

index e817f0d7919445f0d5adfb3ea793ba10a253942b,b661c4363a668392ea57e3cad6c923fb08b52cd7..3cdd7a2f254693af44db3da09864b43cf292a831
@@@ -8,6 -8,7 +8,7 @@@ defmodule Pleroma.Web.TwitterAPI.UtilCo
    require Logger
  
    alias Comeonin.Pbkdf2
+   alias Pleroma.Activity
    alias Pleroma.Emoji
    alias Pleroma.Notification
    alias Pleroma.PasswordResetToken
@@@ -21,7 -22,7 +22,7 @@@
  
    def show_password_reset(conn, %{"token" => token}) do
      with %{used: false} = token <- Repo.get_by(PasswordResetToken, %{token: token}),
 -         %User{} = user <- Repo.get(User, token.user_id) do
 +         %User{} = user <- User.get_by_id(token.user_id) do
        render(conn, "password_reset.html", %{
          token: token,
          user: user
    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})
+     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
-       conn
-       |> render("follow_login.html", %{
-         error: false,
-         acct: acct,
-         avatar: avatar,
-         name: name,
-         id: id
-       })
+       {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
+     case ActivityPub.fetch_and_contain_remote_object_from_id(acct) do
+       {:ok, %{"type" => type}} when type in ["Article", "Note", "Video", "Page", "Question"] ->
+         true
+       _ ->
+         false
      end
    end
  
    def do_remote_follow(conn, %{
          "authorization" => %{"name" => username, "password" => password, "id" => id}
        }) do
 -    followee = Repo.get(User, id)
 +    followee = User.get_by_id(id)
      avatar = User.avatar_url(followee)
      name = followee.nickname
  
      with %User{} = user <- User.get_cached_by_nickname(username),
           true <- Pbkdf2.checkpw(password, user.password_hash),
 -         %User{} = _followed <- Repo.get(User, id),
 +         %User{} = _followed <- User.get_by_id(id),
           {:ok, follower} <- User.follow(user, followee),
           {:ok, _activity} <- ActivityPub.follow(follower, followee) do
        conn
    end
  
    def do_remote_follow(%{assigns: %{user: user}} = conn, %{"user" => %{"id" => id}}) do
 -    with %User{} = followee <- Repo.get(User, id),
 +    with %User{} = followee <- User.get_by_id(id),
           {:ok, follower} <- User.follow(user, followee),
           {:ok, _activity} <- ActivityPub.follow(follower, followee) do
        conn