Fix profile url for funkwhale channels, removes one source_data use Closes #1653 See merge request pleroma/pleroma!2333tags/v2.0.2^2
@@ -276,16 +276,12 @@ defmodule Pleroma.User do | |||||
end | end | ||||
end | end | ||||
def profile_url(%User{source_data: %{"url" => url}}), do: url | |||||
def profile_url(%User{ap_id: ap_id}), do: ap_id | |||||
def profile_url(_), do: nil | |||||
def ap_id(%User{nickname: nickname}), do: "#{Web.base_url()}/users/#{nickname}" | def ap_id(%User{nickname: nickname}), do: "#{Web.base_url()}/users/#{nickname}" | ||||
def ap_followers(%User{follower_address: fa}) when is_binary(fa), do: fa | def ap_followers(%User{follower_address: fa}) when is_binary(fa), do: fa | ||||
def ap_followers(%User{} = user), do: "#{ap_id(user)}/followers" | def ap_followers(%User{} = user), do: "#{ap_id(user)}/followers" | ||||
@spec ap_following(User.t()) :: Sring.t() | |||||
@spec ap_following(User.t()) :: String.t() | |||||
def ap_following(%User{following_address: fa}) when is_binary(fa), do: fa | def ap_following(%User{following_address: fa}) when is_binary(fa), do: fa | ||||
def ap_following(%User{} = user), do: "#{ap_id(user)}/following" | def ap_following(%User{} = user), do: "#{ap_id(user)}/following" | ||||
@@ -1380,6 +1380,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do | |||||
end | end | ||||
end | end | ||||
@spec get_actor_url(any()) :: binary() | nil | |||||
defp get_actor_url(url) when is_binary(url), do: url | |||||
defp get_actor_url(%{"href" => href}) when is_binary(href), do: href | |||||
defp get_actor_url(url) when is_list(url) do | |||||
url | |||||
|> List.first() | |||||
|> get_actor_url() | |||||
end | |||||
defp get_actor_url(_url), do: nil | |||||
defp object_to_user_data(data) do | defp object_to_user_data(data) do | ||||
avatar = | avatar = | ||||
data["icon"]["url"] && | data["icon"]["url"] && | ||||
@@ -1409,6 +1421,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do | |||||
user_data = %{ | user_data = %{ | ||||
ap_id: data["id"], | ap_id: data["id"], | ||||
uri: get_actor_url(data["url"]), | |||||
ap_enabled: true, | ap_enabled: true, | ||||
source_data: data, | source_data: data, | ||||
banner: banner, | banner: banner, | ||||
@@ -27,7 +27,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
id: to_string(user.id), | id: to_string(user.id), | ||||
acct: user.nickname, | acct: user.nickname, | ||||
username: username_from_nickname(user.nickname), | username: username_from_nickname(user.nickname), | ||||
url: User.profile_url(user) | |||||
url: user.uri || user.ap_id | |||||
} | } | ||||
end | end | ||||
@@ -113,7 +113,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do | |||||
following_count: following_count, | following_count: following_count, | ||||
statuses_count: user.note_count, | statuses_count: user.note_count, | ||||
note: user.bio || "", | note: user.bio || "", | ||||
url: User.profile_url(user), | |||||
url: user.uri || user.ap_id, | |||||
avatar: image, | avatar: image, | ||||
avatar_static: image, | avatar_static: image, | ||||
header: header, | header: header, | ||||
@@ -68,7 +68,7 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraph do | |||||
property: "og:title", | property: "og:title", | ||||
content: Utils.user_name_string(user) | content: Utils.user_name_string(user) | ||||
], []}, | ], []}, | ||||
{:meta, [property: "og:url", content: User.profile_url(user)], []}, | |||||
{:meta, [property: "og:url", content: user.uri || user.ap_id], []}, | |||||
{:meta, [property: "og:description", content: truncated_bio], []}, | {:meta, [property: "og:description", content: truncated_bio], []}, | ||||
{:meta, [property: "og:type", content: "website"], []}, | {:meta, [property: "og:type", content: "website"], []}, | ||||
{:meta, [property: "og:image", content: Utils.attachment_url(User.avatar_url(user))], []}, | {:meta, [property: "og:image", content: Utils.attachment_url(User.avatar_url(user))], []}, | ||||
@@ -1,5 +1,5 @@ | |||||
<div class="p-author h-card"> | <div class="p-author h-card"> | ||||
<a class="u-url" rel="author noopener" href="<%= User.profile_url(@user) %>"> | |||||
<a class="u-url" rel="author noopener" href="<%= (@user.uri || @user.ap_id) %>"> | |||||
<div class="avatar"> | <div class="avatar"> | ||||
<img src="<%= User.avatar_url(@user) |> MediaProxy.url %>" width="48" height="48" alt=""> | <img src="<%= User.avatar_url(@user) |> MediaProxy.url %>" width="48" height="48" alt=""> | ||||
</div> | </div> | ||||
@@ -8,7 +8,7 @@ | |||||
<button type="submit" class="collapse">Remote follow</button> | <button type="submit" class="collapse">Remote follow</button> | ||||
</form> | </form> | ||||
<%= raw Formatter.emojify(@user.name, emoji_for_user(@user)) %> | | <%= raw Formatter.emojify(@user.name, emoji_for_user(@user)) %> | | ||||
<%= link "@#{@user.nickname}@#{Endpoint.host()}", to: User.profile_url(@user) %> | |||||
<%= link "@#{@user.nickname}@#{Endpoint.host()}", to: (@user.uri || @user.ap_id) %> | |||||
</h3> | </h3> | ||||
<p><%= raw @user.bio %></p> | <p><%= raw @user.bio %></p> | ||||
</header> | </header> | ||||
@@ -4,11 +4,19 @@ | |||||
defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | ||||
use Pleroma.DataCase | use Pleroma.DataCase | ||||
import Pleroma.Factory | |||||
alias Pleroma.User | alias Pleroma.User | ||||
alias Pleroma.Web.CommonAPI | alias Pleroma.Web.CommonAPI | ||||
alias Pleroma.Web.MastodonAPI.AccountView | alias Pleroma.Web.MastodonAPI.AccountView | ||||
import Pleroma.Factory | |||||
import Tesla.Mock | |||||
setup do | |||||
mock(fn env -> apply(HttpRequestMock, :request, [env]) end) | |||||
:ok | |||||
end | |||||
test "Represent a user account" do | test "Represent a user account" do | ||||
source_data = %{ | source_data = %{ | ||||
"tag" => [ | "tag" => [ | ||||
@@ -161,6 +169,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do | |||||
assert expected == AccountView.render("show.json", %{user: user}) | assert expected == AccountView.render("show.json", %{user: user}) | ||||
end | end | ||||
test "Represent a Funkwhale channel" do | |||||
{:ok, user} = | |||||
User.get_or_fetch_by_ap_id( | |||||
"https://channels.tests.funkwhale.audio/federation/actors/compositions" | |||||
) | |||||
assert represented = AccountView.render("show.json", %{user: user}) | |||||
assert represented.acct == "compositions@channels.tests.funkwhale.audio" | |||||
assert represented.url == "https://channels.tests.funkwhale.audio/channels/compositions" | |||||
end | |||||
test "Represent a deactivated user for an admin" do | test "Represent a deactivated user for an admin" do | ||||
admin = insert(:user, is_admin: true) | admin = insert(:user, is_admin: true) | ||||
deactivated_user = insert(:user, deactivated: true) | deactivated_user = insert(:user, deactivated: true) | ||||