From 94abf230d347cd3dd273fd80c11471d444e2e483 Mon Sep 17 00:00:00 2001 From: May Tusek Date: Thu, 13 Feb 2025 19:26:22 -0800 Subject: [PATCH] Adds deaction page and begins working on reactivation. --- assets/css/application.css | 3 ++- assets/css/views/deactivations.css | 4 ++++ lib/philomena/users.ex | 22 +++++++++++++++++++ lib/philomena/users/user.ex | 4 ++-- lib/philomena/users/user_notifier.ex | 21 ++++++++++++++++++ .../controllers/deactivation_controller.ex | 12 ++++++++++ .../controllers/reactivation_controller.ex | 7 ++++++ lib/philomena_web/router.ex | 1 + .../templates/deactivation/index.html.slime | 8 ++++--- .../templates/registration/edit.html.slime | 6 ++--- 10 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 assets/css/views/deactivations.css create mode 100644 lib/philomena_web/controllers/reactivation_controller.ex diff --git a/assets/css/application.css b/assets/css/application.css index 2f6aea6d..63fc3783 100644 --- a/assets/css/application.css +++ b/assets/css/application.css @@ -42,6 +42,7 @@ @import "views/comments"; @import "views/commissions"; @import "views/communications"; +@import "views/deactivations"; @import "views/duplicates"; @import "views/filters"; @import "views/galleries"; @@ -55,4 +56,4 @@ @import "views/search"; @import "views/staff"; @import "views/stats"; -@import "views/tags"; +@import "views/tags"; \ No newline at end of file diff --git a/assets/css/views/deactivations.css b/assets/css/views/deactivations.css new file mode 100644 index 00000000..d9c6ad47 --- /dev/null +++ b/assets/css/views/deactivations.css @@ -0,0 +1,4 @@ +.deactivations__button-container { + display: flex; + gap: 8px; +} \ No newline at end of file diff --git a/lib/philomena/users.ex b/lib/philomena/users.ex index 7c002257..82e708f1 100644 --- a/lib/philomena/users.ex +++ b/lib/philomena/users.ex @@ -479,6 +479,13 @@ defmodule Philomena.Users do UserNotifier.deliver_reset_password_instructions(user, reset_password_url_fun.(encoded_token)) end + def deliver_user_reactivation_instructions(%User{} = user, reactivation_url_fun) + when is_function(reactivation_url_fun, 1) do + {encoded_token, user_token} = UserToken.build_email_token(user, "reactivate") + Repo.insert!(user_token) + UserNotifier.deliver_reactivation_instructions(user, reactivation_url_fun.(encoded_token)) + end + @doc """ Gets the user by reset password token. @@ -811,6 +818,21 @@ defmodule Philomena.Users do |> Repo.update() end + @doc """ + Deactivates a user account with the user recorded performing the deactivation. + + ## Examples + + iex> deactivate_user(user) + {:ok, %User{}} + + """ + def deactivate_user(%User{} = user) do + user + |> User.deactivate_changeset(user) + |> Repo.update() + end + @doc """ Generates a new API key for the user. diff --git a/lib/philomena/users/user.ex b/lib/philomena/users/user.ex index 35fd14e3..1c84fbfa 100644 --- a/lib/philomena/users/user.ex +++ b/lib/philomena/users/user.ex @@ -419,10 +419,10 @@ defmodule Philomena.Users.User do change(user, deleted_at: nil, deleted_by_user_id: nil) end - def deactivate_changeset(user, moderator) do + def deactivate_changeset(user, deactivator) do now = DateTime.utc_now(:second) - change(user, deleted_at: now, deleted_by_user_id: moderator.id) + change(user, deleted_at: now, deleted_by_user_id: deactivator.id) end def api_key_changeset(user) do diff --git a/lib/philomena/users/user_notifier.ex b/lib/philomena/users/user_notifier.ex index 81f5329b..a9abded2 100644 --- a/lib/philomena/users/user_notifier.ex +++ b/lib/philomena/users/user_notifier.ex @@ -52,6 +52,27 @@ defmodule Philomena.Users.UserNotifier do """) end + @doc """ + Deliver instructions to reactivate a deactivated account. + """ + def deliver_reactivation_instructions(user, url) do + deliver(user.email, "Reactivation instructions for your account", """ + + ============================== + + Hi, + + Your account has been deactivated. If you wish to re-activate it, please click the following link: + + #{url} + + Sincerely, + The Derpibooru team. + + ============================== + """) + end + @doc """ Deliver instructions to update an account email. """ diff --git a/lib/philomena_web/controllers/deactivation_controller.ex b/lib/philomena_web/controllers/deactivation_controller.ex index e018f381..88dc9fa0 100644 --- a/lib/philomena_web/controllers/deactivation_controller.ex +++ b/lib/philomena_web/controllers/deactivation_controller.ex @@ -1,7 +1,19 @@ defmodule PhilomenaWeb.DeactivationController do use PhilomenaWeb, :controller + alias PhilomenaWeb.UserAuth + alias Philomena.Users def show(conn, _params) do render(conn, "index.html", title: "Deactivate Account") end + + def delete(conn, _params) do + user = conn.assigns.current_user + + Users.deactivate_user(user) + Users.deliver_user_reactivation_instructions(user, &url(~p"/reactivations/#{&1}")) + UserAuth.log_out_user(conn) + + conn |> redirect(to: "/") + end end diff --git a/lib/philomena_web/controllers/reactivation_controller.ex b/lib/philomena_web/controllers/reactivation_controller.ex new file mode 100644 index 00000000..c0ab82f2 --- /dev/null +++ b/lib/philomena_web/controllers/reactivation_controller.ex @@ -0,0 +1,7 @@ +defmodule PhilomenaWeb.ReactivationController do + use PhilomenaWeb, :controller + + def index(conn, _params) do + text(conn, "hello world") + end +end diff --git a/lib/philomena_web/router.ex b/lib/philomena_web/router.ex index 8753418d..d3777a6a 100644 --- a/lib/philomena_web/router.ex +++ b/lib/philomena_web/router.ex @@ -104,6 +104,7 @@ defmodule PhilomenaWeb.Router do resources "/registrations", RegistrationController, only: [:edit, :update], singleton: true resources "/sessions", SessionController, only: [:delete], singleton: true resources "/deactivations", DeactivationController, only: [:show, :delete], singleton: true + get "/deactivations/:id/reactivate", DeactivationController, :index scope "/registrations", Registration, as: :registration do resources "/totp", TotpController, only: [:edit, :update], singleton: true diff --git a/lib/philomena_web/templates/deactivation/index.html.slime b/lib/philomena_web/templates/deactivation/index.html.slime index 82078ab2..ceb3e4b0 100644 --- a/lib/philomena_web/templates/deactivation/index.html.slime +++ b/lib/philomena_web/templates/deactivation/index.html.slime @@ -1,7 +1,9 @@ h1 Deactivate Account +- contact_email = "ops@derpibooru.org" .block .block__content.warning p.walloftext - ' Deactivating your account will prevent you from logging into your account. If you ever wish to re-activate your account later on, you may do so at any time. If you wish to wipe your personally identifiable data per GDPR law, please contact ops@derpibooru.org -= button_to "Back", ~p"/registrations/edit", class: "button" -= button_to "Confirm", ~p"/deactivations", class: "button", method: :delete, data: [confirm: "Are you sure you want to deactivate your account?"] \ No newline at end of file + ' Deactivating your account will prevent you from logging into your account. If you ever wish to re-activate your account later on, you may do so at any time. If you wish to wipe your personally identifiable data as well, please contact #{contact_email} +.deactivations__button-container + = button_to "Back", ~p"/registrations/edit", class: "button" + = button_to "Confirm", ~p"/deactivations", class: ["button", "button--state-danger"], method: :delete, data: [confirm: "Are you sure you want to deactivate your account?"] \ No newline at end of file diff --git a/lib/philomena_web/templates/registration/edit.html.slime b/lib/philomena_web/templates/registration/edit.html.slime index 45133ee6..d72f7910 100644 --- a/lib/philomena_web/templates/registration/edit.html.slime +++ b/lib/philomena_web/templates/registration/edit.html.slime @@ -71,6 +71,6 @@ h3 Change password = submit "Change password", class: "button" h3 Deactivate Account -= button_to "Deactivate account", ~p"/deactivations" -p - ' Navigate to the account deactivation page \ No newline at end of file +p + ' Navigate to the account deactivation page. += button_to "Deactivate account", ~p"/deactivations", class: "button" \ No newline at end of file