Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into features/validators-audio
This commit is contained in:
commit
3998ef9d64
|
@ -1583,6 +1583,49 @@ def update_notification_settings(%User{} = user, settings) do
|
||||||
|> update_and_set_cache()
|
|> update_and_set_cache()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@spec purge_user_changeset(User.t()) :: Changeset.t()
|
||||||
|
def purge_user_changeset(user) do
|
||||||
|
# "Right to be forgotten"
|
||||||
|
# https://gdpr.eu/right-to-be-forgotten/
|
||||||
|
change(user, %{
|
||||||
|
bio: nil,
|
||||||
|
raw_bio: nil,
|
||||||
|
email: nil,
|
||||||
|
name: nil,
|
||||||
|
password_hash: nil,
|
||||||
|
keys: nil,
|
||||||
|
public_key: nil,
|
||||||
|
avatar: %{},
|
||||||
|
tags: [],
|
||||||
|
last_refreshed_at: nil,
|
||||||
|
last_digest_emailed_at: nil,
|
||||||
|
banner: %{},
|
||||||
|
background: %{},
|
||||||
|
note_count: 0,
|
||||||
|
follower_count: 0,
|
||||||
|
following_count: 0,
|
||||||
|
locked: false,
|
||||||
|
confirmation_pending: false,
|
||||||
|
password_reset_pending: false,
|
||||||
|
approval_pending: false,
|
||||||
|
registration_reason: nil,
|
||||||
|
confirmation_token: nil,
|
||||||
|
domain_blocks: [],
|
||||||
|
deactivated: true,
|
||||||
|
ap_enabled: false,
|
||||||
|
is_moderator: false,
|
||||||
|
is_admin: false,
|
||||||
|
mastofe_settings: nil,
|
||||||
|
mascot: nil,
|
||||||
|
emoji: %{},
|
||||||
|
pleroma_settings_store: %{},
|
||||||
|
fields: [],
|
||||||
|
raw_fields: [],
|
||||||
|
discoverable: false,
|
||||||
|
also_known_as: []
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
def delete(users) when is_list(users) do
|
def delete(users) when is_list(users) do
|
||||||
for user <- users, do: delete(user)
|
for user <- users, do: delete(user)
|
||||||
end
|
end
|
||||||
|
@ -1610,7 +1653,7 @@ defp delete_or_deactivate(%User{local: true} = user) do
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
user
|
user
|
||||||
|> change(%{deactivated: true, email: nil})
|
|> purge_user_changeset()
|
||||||
|> update_and_set_cache()
|
|> update_and_set_cache()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,16 +15,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnswerValidator do
|
||||||
|
|
||||||
embedded_schema do
|
embedded_schema do
|
||||||
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
||||||
field(:to, {:array, :string}, default: [])
|
field(:to, ObjectValidators.Recipients, default: [])
|
||||||
field(:cc, {:array, :string}, default: [])
|
field(:cc, ObjectValidators.Recipients, default: [])
|
||||||
|
field(:bto, ObjectValidators.Recipients, default: [])
|
||||||
# is this actually needed?
|
field(:bcc, ObjectValidators.Recipients, default: [])
|
||||||
field(:bto, {:array, :string}, default: [])
|
|
||||||
field(:bcc, {:array, :string}, default: [])
|
|
||||||
|
|
||||||
field(:type, :string)
|
field(:type, :string)
|
||||||
field(:name, :string)
|
field(:name, :string)
|
||||||
field(:inReplyTo, :string)
|
field(:inReplyTo, ObjectValidators.ObjectID)
|
||||||
field(:attributedTo, ObjectValidators.ObjectID)
|
field(:attributedTo, ObjectValidators.ObjectID)
|
||||||
|
|
||||||
# TODO: Remove actor on objects
|
# TODO: Remove actor on objects
|
||||||
|
|
|
@ -16,11 +16,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateNoteValidator do
|
||||||
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
||||||
field(:actor, ObjectValidators.ObjectID)
|
field(:actor, ObjectValidators.ObjectID)
|
||||||
field(:type, :string)
|
field(:type, :string)
|
||||||
field(:to, {:array, :string})
|
field(:to, ObjectValidators.Recipients, default: [])
|
||||||
field(:cc, {:array, :string})
|
field(:cc, ObjectValidators.Recipients, default: [])
|
||||||
field(:bto, {:array, :string}, default: [])
|
field(:bto, ObjectValidators.Recipients, default: [])
|
||||||
field(:bcc, {:array, :string}, default: [])
|
field(:bcc, ObjectValidators.Recipients, default: [])
|
||||||
|
|
||||||
embeds_one(:object, NoteValidator)
|
embeds_one(:object, NoteValidator)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do
|
||||||
field(:actor, ObjectValidators.ObjectID)
|
field(:actor, ObjectValidators.ObjectID)
|
||||||
field(:context, :string)
|
field(:context, :string)
|
||||||
field(:content, :string)
|
field(:content, :string)
|
||||||
field(:to, {:array, :string}, default: [])
|
field(:to, ObjectValidators.Recipients, default: [])
|
||||||
field(:cc, {:array, :string}, default: [])
|
field(:cc, ObjectValidators.Recipients, default: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def cast_and_validate(data) do
|
def cast_and_validate(data) do
|
||||||
|
|
|
@ -13,10 +13,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do
|
||||||
|
|
||||||
embedded_schema do
|
embedded_schema do
|
||||||
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
||||||
field(:to, {:array, :string}, default: [])
|
field(:to, ObjectValidators.Recipients, default: [])
|
||||||
field(:cc, {:array, :string}, default: [])
|
field(:cc, ObjectValidators.Recipients, default: [])
|
||||||
field(:bto, {:array, :string}, default: [])
|
field(:bto, ObjectValidators.Recipients, default: [])
|
||||||
field(:bcc, {:array, :string}, default: [])
|
field(:bcc, ObjectValidators.Recipients, default: [])
|
||||||
# TODO: Write type
|
# TODO: Write type
|
||||||
field(:tag, {:array, :map}, default: [])
|
field(:tag, {:array, :map}, default: [])
|
||||||
field(:type, :string)
|
field(:type, :string)
|
||||||
|
@ -34,7 +34,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do
|
||||||
field(:replies_count, :integer, default: 0)
|
field(:replies_count, :integer, default: 0)
|
||||||
field(:like_count, :integer, default: 0)
|
field(:like_count, :integer, default: 0)
|
||||||
field(:announcement_count, :integer, default: 0)
|
field(:announcement_count, :integer, default: 0)
|
||||||
field(:inReplyTo, :string)
|
field(:inReplyTo, ObjectValidators.ObjectID)
|
||||||
field(:uri, ObjectValidators.Uri)
|
field(:uri, ObjectValidators.Uri)
|
||||||
|
|
||||||
field(:likes, {:array, :string}, default: [])
|
field(:likes, {:array, :string}, default: [])
|
||||||
|
|
|
@ -19,10 +19,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
|
||||||
# Extends from NoteValidator
|
# Extends from NoteValidator
|
||||||
embedded_schema do
|
embedded_schema do
|
||||||
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
field(:id, ObjectValidators.ObjectID, primary_key: true)
|
||||||
field(:to, {:array, :string}, default: [])
|
field(:to, ObjectValidators.Recipients, default: [])
|
||||||
field(:cc, {:array, :string}, default: [])
|
field(:cc, ObjectValidators.Recipients, default: [])
|
||||||
field(:bto, {:array, :string}, default: [])
|
field(:bto, ObjectValidators.Recipients, default: [])
|
||||||
field(:bcc, {:array, :string}, default: [])
|
field(:bcc, ObjectValidators.Recipients, default: [])
|
||||||
# TODO: Write type
|
# TODO: Write type
|
||||||
field(:tag, {:array, :map}, default: [])
|
field(:tag, {:array, :map}, default: [])
|
||||||
field(:type, :string)
|
field(:type, :string)
|
||||||
|
@ -42,7 +42,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.QuestionValidator do
|
||||||
field(:replies_count, :integer, default: 0)
|
field(:replies_count, :integer, default: 0)
|
||||||
field(:like_count, :integer, default: 0)
|
field(:like_count, :integer, default: 0)
|
||||||
field(:announcement_count, :integer, default: 0)
|
field(:announcement_count, :integer, default: 0)
|
||||||
field(:inReplyTo, :string)
|
field(:inReplyTo, ObjectValidators.ObjectID)
|
||||||
field(:uri, ObjectValidators.Uri)
|
field(:uri, ObjectValidators.Uri)
|
||||||
# short identifier for PleromaFE to group statuses by context
|
# short identifier for PleromaFE to group statuses by context
|
||||||
field(:context_id, :integer)
|
field(:context_id, :integer)
|
||||||
|
@ -101,7 +101,7 @@ def changeset(struct, data) do
|
||||||
def validate_data(data_cng) do
|
def validate_data(data_cng) do
|
||||||
data_cng
|
data_cng
|
||||||
|> validate_inclusion(:type, ["Question"])
|
|> validate_inclusion(:type, ["Question"])
|
||||||
|> validate_required([:id, :actor, :attributedTo, :type, :context])
|
|> validate_required([:id, :actor, :attributedTo, :type, :context, :context_id])
|
||||||
|> CommonValidations.validate_any_presence([:cc, :to])
|
|> CommonValidations.validate_any_presence([:cc, :to])
|
||||||
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|
|> CommonValidations.validate_fields_match([:actor, :attributedTo])
|
||||||
|> CommonValidations.validate_actor_presence()
|
|> CommonValidations.validate_actor_presence()
|
||||||
|
|
|
@ -18,8 +18,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.UndoValidator do
|
||||||
field(:type, :string)
|
field(:type, :string)
|
||||||
field(:object, ObjectValidators.ObjectID)
|
field(:object, ObjectValidators.ObjectID)
|
||||||
field(:actor, ObjectValidators.ObjectID)
|
field(:actor, ObjectValidators.ObjectID)
|
||||||
field(:to, {:array, :string}, default: [])
|
field(:to, ObjectValidators.Recipients, default: [])
|
||||||
field(:cc, {:array, :string}, default: [])
|
field(:cc, ObjectValidators.Recipients, default: [])
|
||||||
end
|
end
|
||||||
|
|
||||||
def cast_and_validate(data) do
|
def cast_and_validate(data) do
|
||||||
|
|
|
@ -1417,7 +1417,6 @@ test "deactivates user when activation is not required", %{user: user} do
|
||||||
|
|
||||||
test "delete/1 when approval is pending deletes the user" do
|
test "delete/1 when approval is pending deletes the user" do
|
||||||
user = insert(:user, approval_pending: true)
|
user = insert(:user, approval_pending: true)
|
||||||
{:ok, user: user}
|
|
||||||
|
|
||||||
{:ok, job} = User.delete(user)
|
{:ok, job} = User.delete(user)
|
||||||
{:ok, _} = ObanHelpers.perform(job)
|
{:ok, _} = ObanHelpers.perform(job)
|
||||||
|
@ -1426,6 +1425,85 @@ test "delete/1 when approval is pending deletes the user" do
|
||||||
refute User.get_by_id(user.id)
|
refute User.get_by_id(user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "delete/1 purges a user when they wouldn't be fully deleted" do
|
||||||
|
user =
|
||||||
|
insert(:user, %{
|
||||||
|
bio: "eyy lmao",
|
||||||
|
name: "qqqqqqq",
|
||||||
|
password_hash: "pdfk2$1b3n159001",
|
||||||
|
keys: "RSA begin buplic key",
|
||||||
|
public_key: "--PRIVATE KEYE--",
|
||||||
|
avatar: %{"a" => "b"},
|
||||||
|
tags: ["qqqqq"],
|
||||||
|
banner: %{"a" => "b"},
|
||||||
|
background: %{"a" => "b"},
|
||||||
|
note_count: 9,
|
||||||
|
follower_count: 9,
|
||||||
|
following_count: 9001,
|
||||||
|
locked: true,
|
||||||
|
confirmation_pending: true,
|
||||||
|
password_reset_pending: true,
|
||||||
|
approval_pending: true,
|
||||||
|
registration_reason: "ahhhhh",
|
||||||
|
confirmation_token: "qqqq",
|
||||||
|
domain_blocks: ["lain.com"],
|
||||||
|
deactivated: true,
|
||||||
|
ap_enabled: true,
|
||||||
|
is_moderator: true,
|
||||||
|
is_admin: true,
|
||||||
|
mastofe_settings: %{"a" => "b"},
|
||||||
|
mascot: %{"a" => "b"},
|
||||||
|
emoji: %{"a" => "b"},
|
||||||
|
pleroma_settings_store: %{"q" => "x"},
|
||||||
|
fields: [%{"gg" => "qq"}],
|
||||||
|
raw_fields: [%{"gg" => "qq"}],
|
||||||
|
discoverable: true,
|
||||||
|
also_known_as: ["https://lol.olo/users/loll"]
|
||||||
|
})
|
||||||
|
|
||||||
|
{:ok, job} = User.delete(user)
|
||||||
|
{:ok, _} = ObanHelpers.perform(job)
|
||||||
|
user = User.get_by_id(user.id)
|
||||||
|
|
||||||
|
assert %User{
|
||||||
|
bio: nil,
|
||||||
|
raw_bio: nil,
|
||||||
|
email: nil,
|
||||||
|
name: nil,
|
||||||
|
password_hash: nil,
|
||||||
|
keys: nil,
|
||||||
|
public_key: nil,
|
||||||
|
avatar: %{},
|
||||||
|
tags: [],
|
||||||
|
last_refreshed_at: nil,
|
||||||
|
last_digest_emailed_at: nil,
|
||||||
|
banner: %{},
|
||||||
|
background: %{},
|
||||||
|
note_count: 0,
|
||||||
|
follower_count: 0,
|
||||||
|
following_count: 0,
|
||||||
|
locked: false,
|
||||||
|
confirmation_pending: false,
|
||||||
|
password_reset_pending: false,
|
||||||
|
approval_pending: false,
|
||||||
|
registration_reason: nil,
|
||||||
|
confirmation_token: nil,
|
||||||
|
domain_blocks: [],
|
||||||
|
deactivated: true,
|
||||||
|
ap_enabled: false,
|
||||||
|
is_moderator: false,
|
||||||
|
is_admin: false,
|
||||||
|
mastofe_settings: nil,
|
||||||
|
mascot: nil,
|
||||||
|
emoji: %{},
|
||||||
|
pleroma_settings_store: %{},
|
||||||
|
fields: [],
|
||||||
|
raw_fields: [],
|
||||||
|
discoverable: false,
|
||||||
|
also_known_as: []
|
||||||
|
} = user
|
||||||
|
end
|
||||||
|
|
||||||
test "get_public_key_for_ap_id fetches a user that's not in the db" do
|
test "get_public_key_for_ap_id fetches a user that's not in the db" do
|
||||||
assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin")
|
assert {:ok, _key} = User.get_public_key_for_ap_id("http://mastodon.example.org/users/admin")
|
||||||
end
|
end
|
||||||
|
|
|
@ -155,13 +155,30 @@ test "GET /api/pleroma/admin/users/:nickname requires " <>
|
||||||
|
|
||||||
describe "DELETE /api/pleroma/admin/users" do
|
describe "DELETE /api/pleroma/admin/users" do
|
||||||
test "single user", %{admin: admin, conn: conn} do
|
test "single user", %{admin: admin, conn: conn} do
|
||||||
user = insert(:user)
|
|
||||||
clear_config([:instance, :federating], true)
|
clear_config([:instance, :federating], true)
|
||||||
|
|
||||||
|
user =
|
||||||
|
insert(:user,
|
||||||
|
avatar: %{"url" => [%{"href" => "https://someurl"}]},
|
||||||
|
banner: %{"url" => [%{"href" => "https://somebanner"}]},
|
||||||
|
bio: "Hello world!",
|
||||||
|
name: "A guy"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create some activities to check they got deleted later
|
||||||
|
follower = insert(:user)
|
||||||
|
{:ok, _} = CommonAPI.post(user, %{status: "test"})
|
||||||
|
{:ok, _, _, _} = CommonAPI.follow(user, follower)
|
||||||
|
{:ok, _, _, _} = CommonAPI.follow(follower, user)
|
||||||
|
user = Repo.get(User, user.id)
|
||||||
|
assert user.note_count == 1
|
||||||
|
assert user.follower_count == 1
|
||||||
|
assert user.following_count == 1
|
||||||
refute user.deactivated
|
refute user.deactivated
|
||||||
|
|
||||||
with_mock Pleroma.Web.Federator,
|
with_mock Pleroma.Web.Federator,
|
||||||
publish: fn _ -> nil end do
|
publish: fn _ -> nil end,
|
||||||
|
perform: fn _, _ -> nil end do
|
||||||
conn =
|
conn =
|
||||||
conn
|
conn
|
||||||
|> put_req_header("accept", "application/json")
|
|> put_req_header("accept", "application/json")
|
||||||
|
@ -181,6 +198,14 @@ test "single user", %{admin: admin, conn: conn} do
|
||||||
user = Repo.get(User, user.id)
|
user = Repo.get(User, user.id)
|
||||||
assert user.deactivated
|
assert user.deactivated
|
||||||
|
|
||||||
|
assert user.avatar == %{}
|
||||||
|
assert user.banner == %{}
|
||||||
|
assert user.note_count == 0
|
||||||
|
assert user.follower_count == 0
|
||||||
|
assert user.following_count == 0
|
||||||
|
assert user.bio == nil
|
||||||
|
assert user.name == nil
|
||||||
|
|
||||||
assert called(Pleroma.Web.Federator.publish(:_))
|
assert called(Pleroma.Web.Federator.publish(:_))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -586,10 +586,16 @@ test "with proper permissions and wrong or missing password", %{conn: conn} do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "with proper permissions and valid password", %{conn: conn} do
|
test "with proper permissions and valid password", %{conn: conn, user: user} do
|
||||||
conn = post(conn, "/api/pleroma/delete_account", %{"password" => "test"})
|
conn = post(conn, "/api/pleroma/delete_account", %{"password" => "test"})
|
||||||
|
ObanHelpers.perform_all()
|
||||||
assert json_response(conn, 200) == %{"status" => "success"}
|
assert json_response(conn, 200) == %{"status" => "success"}
|
||||||
|
|
||||||
|
user = User.get_by_id(user.id)
|
||||||
|
assert user.deactivated == true
|
||||||
|
assert user.name == nil
|
||||||
|
assert user.bio == nil
|
||||||
|
assert user.password_hash == nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue