Remove webfinger support, these are not properly formatted URIs, more consideration of syntax needs to be done

strip userinfo from URI, if present
This commit is contained in:
smitten 2023-07-27 15:55:05 -04:00
parent 44cc0966a0
commit 0f2c707ad1
Signed by: smitten
GPG key ID: 1DDD22F13552A07A
2 changed files with 18 additions and 37 deletions

View file

@ -38,19 +38,12 @@ def handle(%{assigns: %{user: user}} = conn, %{"target" => "web+ap://" <> identi
def handle(conn, _), do: conn |> json_response(:bad_request, "Could not handle protocol URL") def handle(conn, _), do: conn |> json_response(:bad_request, "Could not handle protocol URL")
# Should webfinger handles even be accepted? They are not ActivityPub URLs
defp find_and_redirect(conn, "@" <> identifier) do
with {:error, _err} <- User.get_or_fetch(identifier) do
conn |> json_response(:not_found, "Not Found - @#{identifier}")
else
{:ok, %User{} = found_user} -> conn |> redirect(to: "/users/#{found_user.id}")
end
end
defp find_and_redirect(%{assigns: %{user: user}} = conn, identifier) do defp find_and_redirect(%{assigns: %{user: user}} = conn, identifier) do
with {:error, _err} <- User.get_or_fetch("https://" <> identifier), # Remove userinfo if present (username:password@)
[] <- DatabaseSearch.maybe_fetch([], user, "https://" <> identifier) do cleaned = String.replace(identifier, ~r/^[^\/]*?@/, "")
conn |> json_response(:not_found, "Not Found - #{identifier}") with {:error, _err} <- User.get_or_fetch("https://" <> cleaned),
[] <- DatabaseSearch.maybe_fetch([], user, "https://" <> cleaned) do
conn |> json_response(:not_found, "Not Found - #{cleaned}")
else else
{:ok, %User{} = found_user} -> conn |> redirect(to: "/users/#{found_user.id}") {:ok, %User{} = found_user} -> conn |> redirect(to: "/users/#{found_user.id}")

View file

@ -42,18 +42,6 @@ test "should return bad_request when target prefix has unknown protocol" do
assert resp =~ "Could not handle protocol URL" assert resp =~ "Could not handle protocol URL"
end end
test "should return forbidden for unauthed user when target is webfinger handle" do
clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")
%{conn: conn} = oauth_access([])
resp =
conn
|> get("/api/v1/akkoma/protocol-handler?target=web%2Bap%3A%2F%2F%40akkoma%40ihatebeinga.live")
|> json_response(403)
assert resp =~ "Invalid credentials."
end
test "should return forbidden for unauthed user when target is remote" do test "should return forbidden for unauthed user when target is remote" do
clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com") clear_config([Pleroma.Web.Endpoint, :url, :host], "sub.example.com")
%{conn: conn} = oauth_access([]) %{conn: conn} = oauth_access([])
@ -118,19 +106,6 @@ test "should return redirect for unauthed user when target is local AP ID for no
assert resp =~ "<a href=\"/notice/#{activity.id}\">" assert resp =~ "<a href=\"/notice/#{activity.id}\">"
end end
test "should return redirect for authed user when target is webfinger handle" do
%{conn: conn} = oauth_access(["read:search"])
remote_user = insert(:user, %{nickname: "akkoma@ihatebeinga.live", local: false})
resp =
conn
|> get("/api/v1/akkoma/protocol-handler?target=web%2Bap%3A%2F%2F%40akkoma%40ihatebeinga.live")
|> html_response(302)
assert resp =~ "You are being"
assert resp =~ "<a href=\"/users/#{remote_user.id}\">"
end
test "should return redirect for authed user when target is AP ID for user" do test "should return redirect for authed user when target is AP ID for user" do
%{conn: conn} = oauth_access(["read:search"]) %{conn: conn} = oauth_access(["read:search"])
remote_user = insert(:user, %{nickname: "akkoma@ihatebeinga.live", local: false, ap_id: "https://ihatebeinga.live/users/akkoma"}) remote_user = insert(:user, %{nickname: "akkoma@ihatebeinga.live", local: false, ap_id: "https://ihatebeinga.live/users/akkoma"})
@ -144,6 +119,19 @@ test "should return redirect for authed user when target is AP ID for user" do
assert resp =~ "<a href=\"/users/#{remote_user.id}\">" assert resp =~ "<a href=\"/users/#{remote_user.id}\">"
end end
test "should return redirect for authed user when target is AP ID for user, stripping userinfo" do
%{conn: conn} = oauth_access(["read:search"])
remote_user = insert(:user, %{nickname: "akkoma@ihatebeinga.live", local: false, ap_id: "https://ihatebeinga.live/users/akkoma"})
resp =
conn
|> get("/api/v1/akkoma/protocol-handler?target=web%2Bap%3A%2F%2Fusername%3Apassword%40ihatebeinga.live/users/akkoma")
|> html_response(302)
assert resp =~ "You are being"
assert resp =~ "<a href=\"/users/#{remote_user.id}\">"
end
test "should return redirect for authed user when target is AP ID for note activity" do test "should return redirect for authed user when target is AP ID for note activity" do
Tesla.Mock.mock(fn Tesla.Mock.mock(fn
%{method: :get, url: "https://mastodon.social/users/emelie/statuses/101849165031453009"} -> %{method: :get, url: "https://mastodon.social/users/emelie/statuses/101849165031453009"} ->