Force password reset for multiple users
authorMaxim Filippov <colixer@gmail.com>
Fri, 1 Nov 2019 15:45:47 +0000 (18:45 +0300)
committerMaxim Filippov <colixer@gmail.com>
Fri, 1 Nov 2019 15:45:47 +0000 (18:45 +0300)
CHANGELOG.md
lib/pleroma/moderation_log.ex
lib/pleroma/web/admin_api/admin_api_controller.ex
lib/pleroma/web/router.ex
test/web/admin_api/admin_api_controller_test.exs

index 51e5424c6bfe861ff5fff70a431fb870536e9d87..34f46f98aefbf9ae592d4443c620fb55c2089122 100644 (file)
@@ -67,6 +67,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Mastodon API: Mark the direct conversation as read for the author when they send a new direct message
 </details>
 - Deprecated `User.Info` embedded schema (fields moved to `User`)
+- Admin API: `PATCH /api/pleroma/admin/users/:nickname/force_password_reset` is now `PATCH /api/pleroma/admin/users/force_password_reset` (accepts `nicknames` array in the request body)
 
 ### Fixed
 - Report emails now include functional links to profiles of remote user accounts
index e8884e6e81c01bf15a3e0247fb4320831647af1c..9031102edc464bc713f6092331eb0c7af6326ad8 100644 (file)
@@ -540,6 +540,17 @@ defmodule Pleroma.ModerationLog do
     "@#{actor_nickname} deleted status ##{subject_id}"
   end
 
+  @spec get_log_entry_message(ModerationLog) :: String.t()
+  def get_log_entry_message(%ModerationLog{
+        data: %{
+          "actor" => %{"nickname" => actor_nickname},
+          "action" => "force_password_reset",
+          "subject" => subjects
+        }
+      }) do
+    "@#{actor_nickname} force password reset for users: #{users_to_nicknames_string(subjects)}"
+  end
+
   defp nicknames_to_string(nicknames) do
     nicknames
     |> Enum.map(&"@#{&1}")
index 7ffbb23e7c77d83ce773f5a31120b64d4dc762be..b08011b4c4dfeecf4145050e32f5fe7e2bbf180c 100644 (file)
@@ -595,10 +595,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
   end
 
   @doc "Force password reset for a given user"
-  def force_password_reset(conn, %{"nickname" => nickname}) do
-    (%User{local: true} = user) = User.get_cached_by_nickname(nickname)
+  def force_password_reset(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do
+    users = nicknames |> Enum.map(&User.get_cached_by_nickname/1)
 
-    User.force_password_reset_async(user)
+    Enum.map(users, &User.force_password_reset_async/1)
+
+    ModerationLog.insert_log(%{
+      actor: admin,
+      subject: users,
+      action: "force_password_reset"
+    })
 
     json_response(conn, :no_content, "")
   end
index f69c5c2bc610799d8725efcbb63852a83de3105c..8fb4aec13efab07ad5f7ef3da4da368469d75481 100644 (file)
@@ -171,7 +171,7 @@ defmodule Pleroma.Web.Router do
     post("/users/email_invite", AdminAPIController, :email_invite)
 
     get("/users/:nickname/password_reset", AdminAPIController, :get_password_reset)
-    patch("/users/:nickname/force_password_reset", AdminAPIController, :force_password_reset)
+    patch("/users/force_password_reset", AdminAPIController, :force_password_reset)
 
     get("/users", AdminAPIController, :list_users)
     get("/users/:nickname", AdminAPIController, :user_show)
index 22c989892a976593df08ec619dcc31db985653cb..9204297230f3061fbf73d21dad0c5ac1cf62ff8a 100644 (file)
@@ -2538,7 +2538,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
       conn =
         build_conn()
         |> assign(:user, admin)
-        |> patch("/api/pleroma/admin/users/#{user.nickname}/force_password_reset")
+        |> patch("/api/pleroma/admin/users/force_password_reset", %{nicknames: [user.nickname]})
 
       assert json_response(conn, 204) == ""