forked from AkkomaGang/akkoma
Show local-only statuses in public timeline for authenticated users
Ref: fix-local-public
This commit is contained in:
parent
214ef7ff73
commit
c48be59f58
4 changed files with 96 additions and 14 deletions
|
@ -501,9 +501,18 @@ def fetch_activities(recipients, opts \\ %{}, pagination \\ :keyset) do
|
||||||
|
|
||||||
@spec fetch_public_or_unlisted_activities(map(), Pagination.type()) :: [Activity.t()]
|
@spec fetch_public_or_unlisted_activities(map(), Pagination.type()) :: [Activity.t()]
|
||||||
def fetch_public_or_unlisted_activities(opts \\ %{}, pagination \\ :keyset) do
|
def fetch_public_or_unlisted_activities(opts \\ %{}, pagination \\ :keyset) do
|
||||||
|
includes_local_public = Map.get(opts, :includes_local_public, false)
|
||||||
|
|
||||||
opts = Map.delete(opts, :user)
|
opts = Map.delete(opts, :user)
|
||||||
|
|
||||||
[Constants.as_public()]
|
intended_recipients =
|
||||||
|
if includes_local_public do
|
||||||
|
[Constants.as_public(), as_local_public()]
|
||||||
|
else
|
||||||
|
[Constants.as_public()]
|
||||||
|
end
|
||||||
|
|
||||||
|
intended_recipients
|
||||||
|> fetch_activities_query(opts)
|
|> fetch_activities_query(opts)
|
||||||
|> restrict_unlisted(opts)
|
|> restrict_unlisted(opts)
|
||||||
|> fetch_paginated_optimized(opts, pagination)
|
|> fetch_paginated_optimized(opts, pagination)
|
||||||
|
|
|
@ -112,6 +112,8 @@ def public(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> Map.put(:muting_user, user)
|
|> Map.put(:muting_user, user)
|
||||||
|> Map.put(:reply_filtering_user, user)
|
|> Map.put(:reply_filtering_user, user)
|
||||||
|> Map.put(:instance, params[:instance])
|
|> Map.put(:instance, params[:instance])
|
||||||
|
# Restricts unfederated content to authenticated users
|
||||||
|
|> Map.put(:includes_local_public, not is_nil(user))
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -1901,23 +1901,53 @@ test "expires_at is nil for another user" do
|
||||||
|> json_response_and_validate_schema(:ok)
|
|> json_response_and_validate_schema(:ok)
|
||||||
end
|
end
|
||||||
|
|
||||||
test "posting a local only status" do
|
describe "local-only statuses" do
|
||||||
%{user: _user, conn: conn} = oauth_access(["write:statuses"])
|
test "posting a local only status" do
|
||||||
|
%{user: _user, conn: conn} = oauth_access(["write:statuses"])
|
||||||
|
|
||||||
conn_one =
|
conn_one =
|
||||||
conn
|
conn
|
||||||
|> put_req_header("content-type", "application/json")
|
|> put_req_header("content-type", "application/json")
|
||||||
|> post("/api/v1/statuses", %{
|
|> post("/api/v1/statuses", %{
|
||||||
"status" => "cofe",
|
"status" => "cofe",
|
||||||
"visibility" => "local"
|
"visibility" => "local"
|
||||||
})
|
})
|
||||||
|
|
||||||
local = Utils.as_local_public()
|
local = Utils.as_local_public()
|
||||||
|
|
||||||
assert %{"content" => "cofe", "id" => id, "visibility" => "local"} =
|
assert %{"content" => "cofe", "id" => id, "visibility" => "local"} =
|
||||||
json_response_and_validate_schema(conn_one, 200)
|
json_response_and_validate_schema(conn_one, 200)
|
||||||
|
|
||||||
assert %Activity{id: ^id, data: %{"to" => [^local]}} = Activity.get_by_id(id)
|
assert %Activity{id: ^id, data: %{"to" => [^local]}} = Activity.get_by_id(id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "other users can read local-only posts" do
|
||||||
|
user = insert(:user)
|
||||||
|
%{user: reader, conn: conn} = oauth_access(["read:statuses"])
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
|
||||||
|
|
||||||
|
received =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/statuses/#{activity.id}")
|
||||||
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
|
assert received["id"] == activity.id
|
||||||
|
end
|
||||||
|
|
||||||
|
test "other users can see local-only posts" do
|
||||||
|
user = insert(:user)
|
||||||
|
%{user: _reader, conn: conn} = oauth_access(["read:statuses"])
|
||||||
|
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
|
||||||
|
|
||||||
|
received =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/statuses/#{activity.id}")
|
||||||
|
|> json_response_and_validate_schema(:ok)
|
||||||
|
|
||||||
|
assert received["id"] == activity.id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "muted reactions" do
|
describe "muted reactions" do
|
||||||
|
|
|
@ -367,6 +367,47 @@ test "muted emotions", %{conn: conn} do
|
||||||
}
|
}
|
||||||
] = result
|
] = result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "should return local-only posts for authenticated users" do
|
||||||
|
user = insert(:user)
|
||||||
|
%{user: _reader, conn: conn} = oauth_access(["read:statuses"])
|
||||||
|
|
||||||
|
{:ok, %{id: id}} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
|
||||||
|
|
||||||
|
result =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/timelines/public")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
assert [%{"id" => ^id}] = result
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should not return local-only posts for users without read:statuses" do
|
||||||
|
user = insert(:user)
|
||||||
|
%{user: _reader, conn: conn} = oauth_access([])
|
||||||
|
|
||||||
|
{:ok, _activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
|
||||||
|
|
||||||
|
result =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/timelines/public")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
assert [] = result
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should not return local-only posts for anonymous users" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
{:ok, _activity} = CommonAPI.post(user, %{status: "#2hu #2HU", visibility: "local"})
|
||||||
|
|
||||||
|
result =
|
||||||
|
build_conn()
|
||||||
|
|> get("/api/v1/timelines/public")
|
||||||
|
|> json_response_and_validate_schema(200)
|
||||||
|
|
||||||
|
assert [] = result
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp local_and_remote_activities do
|
defp local_and_remote_activities do
|
||||||
|
|
Loading…
Reference in a new issue