forked from AkkomaGang/akkoma
refetch user on incoming add/remove activity
if featured_address is nil
This commit is contained in:
parent
d1d2744ee3
commit
3adb43cc20
4 changed files with 90 additions and 2 deletions
|
@ -558,6 +558,8 @@ def handle_incoming(
|
||||||
|
|
||||||
def handle_incoming(%{"type" => type} = data, _options) when type in ~w(Add Remove) do
|
def handle_incoming(%{"type" => type} = data, _options) when type in ~w(Add Remove) do
|
||||||
with {:ok, %User{} = user} <- ObjectValidator.fetch_actor(data),
|
with {:ok, %User{} = user} <- ObjectValidator.fetch_actor(data),
|
||||||
|
# maybe locally user doesn't have featured_address
|
||||||
|
{:ok, user} <- maybe_refetch_user(user),
|
||||||
%Object{} <- Object.normalize(data["object"], fetch: true) do
|
%Object{} <- Object.normalize(data["object"], fetch: true) do
|
||||||
# Mastodon sends pin/unpin objects without id, to, cc fields
|
# Mastodon sends pin/unpin objects without id, to, cc fields
|
||||||
data =
|
data =
|
||||||
|
@ -669,6 +671,12 @@ def handle_incoming(
|
||||||
|
|
||||||
def handle_incoming(_, _), do: :error
|
def handle_incoming(_, _), do: :error
|
||||||
|
|
||||||
|
defp maybe_refetch_user(%User{featured_address: address} = user) when is_binary(address) do
|
||||||
|
{:ok, user}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_refetch_user(%User{ap_id: ap_id}), do: upgrade_user_from_ap_id(ap_id)
|
||||||
|
|
||||||
@spec get_obj_helper(String.t(), Keyword.t()) :: {:ok, Object.t()} | nil
|
@spec get_obj_helper(String.t(), Keyword.t()) :: {:ok, Object.t()} | nil
|
||||||
def get_obj_helper(id, options \\ []) do
|
def get_obj_helper(id, options \\ []) do
|
||||||
options = Keyword.put(options, :fetch, true)
|
options = Keyword.put(options, :fetch, true)
|
||||||
|
|
|
@ -152,7 +152,7 @@ def render(
|
||||||
|> Enum.filter(& &1)
|
|> Enum.filter(& &1)
|
||||||
|> Enum.map(fn user -> AccountView.render("mention.json", %{user: user}) end)
|
|> Enum.map(fn user -> AccountView.render("mention.json", %{user: user}) end)
|
||||||
|
|
||||||
{pinned?, pinned_at} = pin_data(activity_object, user)
|
{pinned?, pinned_at} = pin_data(object, user)
|
||||||
|
|
||||||
%{
|
%{
|
||||||
id: to_string(activity.id),
|
id: to_string(activity.id),
|
||||||
|
|
|
@ -191,6 +191,84 @@ test "it accepts Add/Remove activities" do
|
||||||
user = refresh_record(user)
|
user = refresh_record(user)
|
||||||
refute user.pinned_objects[object_url]
|
refute user.pinned_objects[object_url]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "Add/Remove activities for remote users without featured address" do
|
||||||
|
user = insert(:user, local: false, domain: "example.com")
|
||||||
|
|
||||||
|
user =
|
||||||
|
user
|
||||||
|
|> Ecto.Changeset.change(featured_address: nil)
|
||||||
|
|> Repo.update!()
|
||||||
|
|
||||||
|
%{host: host} = URI.parse(user.ap_id)
|
||||||
|
|
||||||
|
user_data =
|
||||||
|
"test/fixtures/users_mock/user.json"
|
||||||
|
|> File.read!()
|
||||||
|
|> String.replace("{{nickname}}", user.nickname)
|
||||||
|
|
||||||
|
object_id = "c61d6733-e256-4fe1-ab13-1e369789423f"
|
||||||
|
|
||||||
|
object =
|
||||||
|
"test/fixtures/statuses/note.json"
|
||||||
|
|> File.read!()
|
||||||
|
|> String.replace("{{nickname}}", user.nickname)
|
||||||
|
|> String.replace("{{object_id}}", object_id)
|
||||||
|
|
||||||
|
object_url = "https://#{host}/objects/#{object_id}"
|
||||||
|
|
||||||
|
actor = "https://#{host}/users/#{user.nickname}"
|
||||||
|
|
||||||
|
featured = "https://#{host}/users/#{user.nickname}/collections/featured"
|
||||||
|
|
||||||
|
Tesla.Mock.mock(fn
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url: ^actor
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body: user_data,
|
||||||
|
headers: [{"content-type", "application/activity+json"}]
|
||||||
|
}
|
||||||
|
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url: ^object_url
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body: object,
|
||||||
|
headers: [{"content-type", "application/activity+json"}]
|
||||||
|
}
|
||||||
|
|
||||||
|
%{method: :get, url: ^featured} ->
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body:
|
||||||
|
"test/fixtures/users_mock/masto_featured.json"
|
||||||
|
|> File.read!()
|
||||||
|
|> String.replace("{{domain}}", "#{host}")
|
||||||
|
|> String.replace("{{nickname}}", user.nickname),
|
||||||
|
headers: [{"content-type", "application/activity+json"}]
|
||||||
|
}
|
||||||
|
end)
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"id" => "https://#{host}/objects/d61d6733-e256-4fe1-ab13-1e369789423f",
|
||||||
|
"actor" => actor,
|
||||||
|
"object" => object_url,
|
||||||
|
"target" => "https://#{host}/users/#{user.nickname}/collections/featured",
|
||||||
|
"type" => "Add",
|
||||||
|
"to" => [Pleroma.Constants.as_public()],
|
||||||
|
"cc" => ["https://#{host}/users/#{user.nickname}/followers"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert {:ok, activity} = Transmogrifier.handle_incoming(message)
|
||||||
|
assert activity.data == message
|
||||||
|
user = User.get_cached_by_ap_id(actor)
|
||||||
|
assert user.pinned_objects[object_url]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "prepare outgoing" do
|
describe "prepare outgoing" do
|
||||||
|
|
|
@ -41,7 +41,7 @@ def user_factory(attrs \\ %{}) do
|
||||||
|
|
||||||
urls =
|
urls =
|
||||||
if attrs[:local] == false do
|
if attrs[:local] == false do
|
||||||
base_domain = Enum.random(["domain1.com", "domain2.com", "domain3.com"])
|
base_domain = attrs[:domain] || Enum.random(["domain1.com", "domain2.com", "domain3.com"])
|
||||||
|
|
||||||
ap_id = "https://#{base_domain}/users/#{user.nickname}"
|
ap_id = "https://#{base_domain}/users/#{user.nickname}"
|
||||||
|
|
||||||
|
@ -60,6 +60,8 @@ def user_factory(attrs \\ %{}) do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
attrs = Map.delete(attrs, :domain)
|
||||||
|
|
||||||
user
|
user
|
||||||
|> Map.put(:raw_bio, user.bio)
|
|> Map.put(:raw_bio, user.bio)
|
||||||
|> Map.merge(urls)
|
|> Map.merge(urls)
|
||||||
|
|
Loading…
Reference in a new issue