Merge branch 'authorize-interaction' into 'develop'

Support /authorize-interaction route used by Mastodon

See merge request pleroma/pleroma!3957
This commit is contained in:
lain 2023-12-11 09:31:18 +00:00
commit 41c02b3d16
5 changed files with 45 additions and 0 deletions

View File

@ -0,0 +1 @@
Support /authorize-interaction route used by Mastodon

View File

@ -471,6 +471,8 @@ defmodule Pleroma.Web.Router do
get("/main/ostatus", UtilController, :show_subscribe_form) get("/main/ostatus", UtilController, :show_subscribe_form)
get("/ostatus_subscribe", RemoteFollowController, :follow) get("/ostatus_subscribe", RemoteFollowController, :follow)
post("/ostatus_subscribe", RemoteFollowController, :do_follow) post("/ostatus_subscribe", RemoteFollowController, :do_follow)
get("/authorize_interaction", RemoteFollowController, :authorize_interaction)
end end
scope "/api/pleroma", Pleroma.Web.TwitterAPI do scope "/api/pleroma", Pleroma.Web.TwitterAPI do

View File

@ -121,6 +121,13 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowController do
render(conn, "followed.html", %{error: "Insufficient permissions: follow | write:follows."}) render(conn, "followed.html", %{error: "Insufficient permissions: follow | write:follows."})
end end
# GET /authorize_interaction
#
def authorize_interaction(conn, %{"uri" => uri}) do
conn
|> redirect(to: Routes.remote_follow_path(conn, :follow, %{acct: uri}))
end
defp handle_follow_error(conn, {:mfa_token, followee, _} = _) do defp handle_follow_error(conn, {:mfa_token, followee, _} = _) do
render(conn, "follow_login.html", %{error: "Wrong username or password", followee: followee}) render(conn, "follow_login.html", %{error: "Wrong username or password", followee: followee})
end end

View File

@ -82,6 +82,7 @@ defmodule Pleroma.Web.Plugs.FrontendStaticPlugTest do
"api", "api",
"main", "main",
"ostatus_subscribe", "ostatus_subscribe",
"authorize_interaction",
"oauth", "oauth",
"objects", "objects",
"activities", "activities",

View File

@ -455,4 +455,38 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do
assert avatar_url == "#{Pleroma.Web.Endpoint.url()}/localuser/avatar.png" assert avatar_url == "#{Pleroma.Web.Endpoint.url()}/localuser/avatar.png"
end end
end end
describe "GET /authorize_interaction - authorize_interaction/2" do
test "redirects to /ostatus_subscribe", %{conn: conn} do
Tesla.Mock.mock(fn
%{method: :get, url: "https://mastodon.social/users/emelie"} ->
%Tesla.Env{
status: 200,
headers: [{"content-type", "application/activity+json"}],
body: File.read!("test/fixtures/tesla_mock/emelie.json")
}
%{method: :get, url: "https://mastodon.social/users/emelie/collections/featured"} ->
%Tesla.Env{
status: 200,
headers: [{"content-type", "application/activity+json"}],
body:
File.read!("test/fixtures/users_mock/masto_featured.json")
|> String.replace("{{domain}}", "mastodon.social")
|> String.replace("{{nickname}}", "emelie")
}
end)
conn =
conn
|> get(
remote_follow_path(conn, :authorize_interaction, %{
uri: "https://mastodon.social/users/emelie"
})
)
assert redirected_to(conn) ==
remote_follow_path(conn, :follow, %{acct: "https://mastodon.social/users/emelie"})
end
end
end end