From 39be25bf3cdb857a5e1ab87ba2bae96372bef375 Mon Sep 17 00:00:00 2001 From: miraikumiko Date: Wed, 18 Jun 2025 18:55:27 +0200 Subject: [PATCH] Update webfinger --- lib/nulla/activitypub.ex | 27 ++++++++++++++----- .../controllers/webfinger_controller.ex | 20 +++++++++----- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/lib/nulla/activitypub.ex b/lib/nulla/activitypub.ex index 838aae4..0f7dd73 100644 --- a/lib/nulla/activitypub.ex +++ b/lib/nulla/activitypub.ex @@ -209,7 +209,7 @@ defmodule Nulla.ActivityPub do @spec webfinger(Actor.t()) :: Jason.OrderedObject.t() def webfinger(actor) do - Jason.OrderedObject.new( + data = [ subject: "#{actor.preferredUsername}@#{actor.domain}", aliases: [ "https://#{actor.domain}/@#{actor.preferredUsername}", @@ -225,14 +225,27 @@ defmodule Nulla.ActivityPub do rel: "self", type: "application/activity+json", href: "https://#{actor.domain}/users/#{actor.preferredUsername}" - ), - Jason.OrderedObject.new( - rel: "http://webfinger.net/rel/avatar", - type: actor.icon.mediaType, - href: actor.icon.url ) ] - ) + ] + + data = + if actor.icon do + Keyword.update!(data, :links, fn links -> + links ++ + [ + Jason.OrderedObject.new( + rel: "http://webfinger.net/rel/avatar", + type: Map.get(actor.icon, :mediaType), + href: Map.get(actor.icon, :url) + ) + ] + end) + else + data + end + + Jason.OrderedObject.new(data) end @spec nodeinfo(String.t()) :: Jason.OrderedObject.t() diff --git a/lib/nulla_web/controllers/webfinger_controller.ex b/lib/nulla_web/controllers/webfinger_controller.ex index cc7854f..a36e6b3 100644 --- a/lib/nulla_web/controllers/webfinger_controller.ex +++ b/lib/nulla_web/controllers/webfinger_controller.ex @@ -5,13 +5,13 @@ defmodule NullaWeb.WebfingerController do alias Nulla.Models.InstanceSettings def index(conn, %{"resource" => resource}) do - case Regex.run(~r/^acct:([^@]+)@(.+)$/, resource) do + case Regex.run(~r/^acct:(.+)@(.+)$/, resource) do [_, username, domain] -> case Actor.get_actor(username, domain) do nil -> conn - |> put_status(:not_found) - |> json(%{error: "Not Found"}) + |> put_resp_content_type("text/plain") + |> send_resp(404, "") %Actor{} = actor -> instance_settings = InstanceSettings.get_instance_settings!() @@ -20,15 +20,21 @@ defmodule NullaWeb.WebfingerController do json(conn, ActivityPub.webfinger(actor)) else conn - |> put_status(:not_found) - |> json(%{error: "Not Found"}) + |> put_resp_content_type("text/plain") + |> send_resp(404, "") end end _ -> conn - |> put_status(:bad_request) - |> json(%{error: "Bad Request"}) + |> put_resp_content_type("text/plain") + |> send_resp(400, "") end end + + def index(conn, _params) do + conn + |> put_resp_content_type("text/plain") + |> send_resp(400, "") + end end