2020-05-20 14:00:41 +00:00
|
|
|
# Pleroma: A lightweight social networking server
|
2022-02-26 06:11:42 +00:00
|
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
2020-05-20 14:00:41 +00:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
defmodule Pleroma.Web.AdminAPI.StatusControllerTest do
|
2022-06-05 10:50:19 +00:00
|
|
|
use Pleroma.Web.ConnCase, async: false
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
import Pleroma.Factory
|
|
|
|
|
|
|
|
alias Pleroma.Activity
|
|
|
|
alias Pleroma.ModerationLog
|
|
|
|
alias Pleroma.Repo
|
|
|
|
alias Pleroma.User
|
|
|
|
alias Pleroma.Web.CommonAPI
|
|
|
|
|
|
|
|
setup do
|
|
|
|
admin = insert(:user, is_admin: true)
|
|
|
|
token = insert(:oauth_admin_token, user: admin)
|
|
|
|
|
|
|
|
conn =
|
|
|
|
build_conn()
|
|
|
|
|> assign(:user, admin)
|
|
|
|
|> assign(:token, token)
|
|
|
|
|
|
|
|
{:ok, %{admin: admin, token: token, conn: conn}}
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "GET /api/pleroma/admin/statuses/:id" do
|
2022-06-11 07:38:43 +00:00
|
|
|
setup do
|
2022-07-01 07:54:05 +00:00
|
|
|
clear_config([:instance, :admin_privileges], [:messages_read])
|
2022-06-11 07:38:43 +00:00
|
|
|
end
|
|
|
|
|
2020-05-20 14:00:41 +00:00
|
|
|
test "not found", %{conn: conn} do
|
|
|
|
assert conn
|
|
|
|
|> get("/api/pleroma/admin/statuses/not_found")
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(:not_found)
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
test "shows activity", %{conn: conn} do
|
|
|
|
activity = insert(:note_activity)
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
|
|
|
|> get("/api/pleroma/admin/statuses/#{activity.id}")
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(200)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
assert response["id"] == activity.id
|
2020-05-18 07:09:21 +00:00
|
|
|
|
|
|
|
account = response["account"]
|
|
|
|
actor = User.get_by_ap_id(activity.actor)
|
|
|
|
|
|
|
|
assert account["id"] == actor.id
|
|
|
|
assert account["nickname"] == actor.nickname
|
2020-10-12 22:42:27 +00:00
|
|
|
assert account["is_active"] == actor.is_active
|
2020-10-13 19:29:34 +00:00
|
|
|
assert account["is_confirmed"] == actor.is_confirmed
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
2022-06-11 07:38:43 +00:00
|
|
|
|
|
|
|
test "denies reading activity when not privileged", %{conn: conn} do
|
|
|
|
clear_config([:instance, :admin_privileges], [])
|
|
|
|
|
|
|
|
assert conn |> get("/api/pleroma/admin/statuses/some_id") |> json_response(:forbidden)
|
|
|
|
end
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe "PUT /api/pleroma/admin/statuses/:id" do
|
|
|
|
setup do
|
2022-07-01 07:54:05 +00:00
|
|
|
clear_config([:instance, :admin_privileges], [:messages_delete])
|
2020-05-20 14:00:41 +00:00
|
|
|
activity = insert(:note_activity)
|
|
|
|
|
|
|
|
%{id: activity.id}
|
|
|
|
end
|
|
|
|
|
|
|
|
test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do
|
|
|
|
response =
|
|
|
|
conn
|
2020-05-21 10:03:38 +00:00
|
|
|
|> put_req_header("content-type", "application/json")
|
2020-05-20 14:00:41 +00:00
|
|
|
|> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"})
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
assert response["sensitive"]
|
|
|
|
|
|
|
|
log_entry = Repo.one(ModerationLog)
|
|
|
|
|
|
|
|
assert ModerationLog.get_log_entry_message(log_entry) ==
|
|
|
|
"@#{admin.nickname} updated status ##{id}, set sensitive: 'true'"
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
2020-05-21 10:03:38 +00:00
|
|
|
|> put_req_header("content-type", "application/json")
|
2020-05-20 14:00:41 +00:00
|
|
|
|> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"})
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
refute response["sensitive"]
|
|
|
|
end
|
|
|
|
|
|
|
|
test "change visibility flag", %{conn: conn, id: id, admin: admin} do
|
|
|
|
response =
|
|
|
|
conn
|
2020-05-21 10:03:38 +00:00
|
|
|
|> put_req_header("content-type", "application/json")
|
2020-05-20 14:00:41 +00:00
|
|
|
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "public"})
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
assert response["visibility"] == "public"
|
|
|
|
|
|
|
|
log_entry = Repo.one(ModerationLog)
|
|
|
|
|
|
|
|
assert ModerationLog.get_log_entry_message(log_entry) ==
|
|
|
|
"@#{admin.nickname} updated status ##{id}, set visibility: 'public'"
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
2020-05-21 10:03:38 +00:00
|
|
|
|> put_req_header("content-type", "application/json")
|
2020-05-20 14:00:41 +00:00
|
|
|
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "private"})
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
assert response["visibility"] == "private"
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
2020-05-21 10:03:38 +00:00
|
|
|
|> put_req_header("content-type", "application/json")
|
2020-05-20 14:00:41 +00:00
|
|
|
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "unlisted"})
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
assert response["visibility"] == "unlisted"
|
|
|
|
end
|
|
|
|
|
|
|
|
test "returns 400 when visibility is unknown", %{conn: conn, id: id} do
|
2020-05-21 10:03:38 +00:00
|
|
|
conn =
|
|
|
|
conn
|
|
|
|
|> put_req_header("content-type", "application/json")
|
|
|
|
|> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "test"})
|
2020-05-20 14:00:41 +00:00
|
|
|
|
2020-05-21 10:03:38 +00:00
|
|
|
assert %{"error" => "test - Invalid value for enum."} =
|
|
|
|
json_response_and_validate_schema(conn, :bad_request)
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
2022-06-11 11:08:40 +00:00
|
|
|
|
2022-07-01 07:54:05 +00:00
|
|
|
test "it requires privileged role :messages_delete", %{conn: conn} do
|
2022-06-11 11:08:40 +00:00
|
|
|
clear_config([:instance, :admin_privileges], [])
|
|
|
|
|
|
|
|
assert conn
|
|
|
|
|> put_req_header("content-type", "application/json")
|
|
|
|
|> put("/api/pleroma/admin/statuses/some_id", %{})
|
|
|
|
|> json_response(:forbidden)
|
|
|
|
end
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe "DELETE /api/pleroma/admin/statuses/:id" do
|
|
|
|
setup do
|
2022-07-01 07:54:05 +00:00
|
|
|
clear_config([:instance, :admin_privileges], [:messages_delete])
|
2020-05-20 14:00:41 +00:00
|
|
|
activity = insert(:note_activity)
|
|
|
|
|
|
|
|
%{id: activity.id}
|
|
|
|
end
|
|
|
|
|
|
|
|
test "deletes status", %{conn: conn, id: id, admin: admin} do
|
|
|
|
conn
|
|
|
|
|> delete("/api/pleroma/admin/statuses/#{id}")
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(:ok)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
refute Activity.get_by_id(id)
|
|
|
|
|
|
|
|
log_entry = Repo.one(ModerationLog)
|
|
|
|
|
|
|
|
assert ModerationLog.get_log_entry_message(log_entry) ==
|
|
|
|
"@#{admin.nickname} deleted status ##{id}"
|
|
|
|
end
|
|
|
|
|
|
|
|
test "returns 404 when the status does not exist", %{conn: conn} do
|
|
|
|
conn = delete(conn, "/api/pleroma/admin/statuses/test")
|
|
|
|
|
2020-05-21 10:03:38 +00:00
|
|
|
assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"}
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
2022-06-11 11:08:40 +00:00
|
|
|
|
2022-07-01 07:54:05 +00:00
|
|
|
test "it requires privileged role :messages_delete", %{conn: conn} do
|
2022-06-11 11:08:40 +00:00
|
|
|
clear_config([:instance, :admin_privileges], [])
|
|
|
|
|
|
|
|
assert conn
|
|
|
|
|> put_req_header("content-type", "application/json")
|
|
|
|
|> delete("/api/pleroma/admin/statuses/some_id")
|
|
|
|
|> json_response(:forbidden)
|
|
|
|
end
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe "GET /api/pleroma/admin/statuses" do
|
2022-05-26 12:21:14 +00:00
|
|
|
setup do
|
2022-07-01 07:54:05 +00:00
|
|
|
clear_config([:instance, :admin_privileges], [:messages_read])
|
2022-05-26 12:21:14 +00:00
|
|
|
end
|
|
|
|
|
2020-05-20 14:00:41 +00:00
|
|
|
test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do
|
|
|
|
blocked = insert(:user)
|
|
|
|
user = insert(:user)
|
|
|
|
User.block(admin, blocked)
|
|
|
|
|
|
|
|
{:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"})
|
|
|
|
|
|
|
|
{:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"})
|
|
|
|
{:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"})
|
|
|
|
{:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"})
|
|
|
|
{:ok, _} = CommonAPI.post(blocked, %{status: ".", visibility: "public"})
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
|
|
|
|> get("/api/pleroma/admin/statuses")
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(200)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
refute "private" in Enum.map(response, & &1["visibility"])
|
|
|
|
assert length(response) == 3
|
|
|
|
end
|
|
|
|
|
|
|
|
test "returns only local statuses with local_only on", %{conn: conn} do
|
|
|
|
user = insert(:user)
|
|
|
|
remote_user = insert(:user, local: false, nickname: "archaeme@archae.me")
|
|
|
|
insert(:note_activity, user: user, local: true)
|
|
|
|
insert(:note_activity, user: remote_user, local: false)
|
|
|
|
|
|
|
|
response =
|
|
|
|
conn
|
|
|
|
|> get("/api/pleroma/admin/statuses?local_only=true")
|
2020-05-21 10:03:38 +00:00
|
|
|
|> json_response_and_validate_schema(200)
|
2020-05-20 14:00:41 +00:00
|
|
|
|
|
|
|
assert length(response) == 1
|
|
|
|
end
|
|
|
|
|
|
|
|
test "returns private and direct statuses with godmode on", %{conn: conn, admin: admin} do
|
|
|
|
user = insert(:user)
|
|
|
|
|
|
|
|
{:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"})
|
|
|
|
|
|
|
|
{:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"})
|
|
|
|
{:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"})
|
|
|
|
conn = get(conn, "/api/pleroma/admin/statuses?godmode=true")
|
2020-05-21 10:03:38 +00:00
|
|
|
assert json_response_and_validate_schema(conn, 200) |> length() == 3
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
2022-05-26 12:21:14 +00:00
|
|
|
|
2022-07-01 07:54:05 +00:00
|
|
|
test "it requires privileged role :messages_read", %{conn: conn} do
|
2022-05-26 12:21:14 +00:00
|
|
|
clear_config([:instance, :admin_privileges], [])
|
|
|
|
|
|
|
|
conn = get(conn, "/api/pleroma/admin/statuses")
|
|
|
|
|
|
|
|
assert json_response(conn, :forbidden)
|
|
|
|
end
|
2020-05-20 14:00:41 +00:00
|
|
|
end
|
|
|
|
end
|