Mercurial > prosody-hg
comparison plugins/mod_user_account_management.lua @ 13372:ffbd058bb232
mod_user_account_management: Fire events with a fake (not destroyed) session
Previously these events fired after the session had been destroyed, which
removes many of the useful properties. The ones I chose to preserve here are
the ones used by the community module mod_audit, which seems like a good
baseline.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Thu, 30 Nov 2023 17:46:18 +0000 |
| parents | 13a27043cd0f |
| children | e5ddae99faa8 |
comparison
equal
deleted
inserted
replaced
| 13371:a22e3a980178 | 13372:ffbd058bb232 |
|---|---|
| 15 local compat = module:get_option_boolean("registration_compat", true); | 15 local compat = module:get_option_boolean("registration_compat", true); |
| 16 local soft_delete_period = module:get_option_period("registration_delete_grace_period"); | 16 local soft_delete_period = module:get_option_period("registration_delete_grace_period"); |
| 17 local deleted_accounts = module:open_store("accounts_cleanup"); | 17 local deleted_accounts = module:open_store("accounts_cleanup"); |
| 18 | 18 |
| 19 module:add_feature("jabber:iq:register"); | 19 module:add_feature("jabber:iq:register"); |
| 20 | |
| 21 -- Allow us to 'freeze' a session and retrieve properties even after it is | |
| 22 -- destroyed | |
| 23 local function capture_session_properties(session) | |
| 24 return setmetatable({ | |
| 25 id = session.id; | |
| 26 ip = session.ip; | |
| 27 type = session.type; | |
| 28 client_id = session.client_id; | |
| 29 }, { __index = session }); | |
| 30 end | |
| 20 | 31 |
| 21 -- Password change and account deletion handler | 32 -- Password change and account deletion handler |
| 22 local function handle_registration_stanza(event) | 33 local function handle_registration_stanza(event) |
| 23 local session, stanza = event.origin, event.stanza; | 34 local session, stanza = event.origin, event.stanza; |
| 24 local log = session.log or module._log; | 35 local log = session.log or module._log; |
| 46 session.close = function(self, ...) | 57 session.close = function(self, ...) |
| 47 self.send(st.reply(stanza)); | 58 self.send(st.reply(stanza)); |
| 48 return old_session_close(self, ...); | 59 return old_session_close(self, ...); |
| 49 end | 60 end |
| 50 | 61 |
| 62 local old_session = capture_session_properties(session); | |
| 63 | |
| 51 if not soft_delete_period then | 64 if not soft_delete_period then |
| 52 local ok, err = usermanager.delete_user(username, host); | 65 local ok, err = usermanager.delete_user(username, host); |
| 53 | 66 |
| 54 if not ok then | 67 if not ok then |
| 55 log("debug", "Removing user account %s@%s failed: %s", username, host, err); | 68 log("debug", "Removing user account %s@%s failed: %s", username, host, err); |
| 57 session.send(st.error_reply(stanza, "cancel", "service-unavailable", err)); | 70 session.send(st.error_reply(stanza, "cancel", "service-unavailable", err)); |
| 58 return true; | 71 return true; |
| 59 end | 72 end |
| 60 | 73 |
| 61 log("info", "User removed their account: %s@%s (deleted)", username, host); | 74 log("info", "User removed their account: %s@%s (deleted)", username, host); |
| 62 module:fire_event("user-deregistered", { username = username, host = host, source = "mod_register", session = session }); | 75 module:fire_event("user-deregistered", { username = username, host = host, source = "mod_register", session = old_session }); |
| 63 else | 76 else |
| 64 local ok, err = usermanager.disable_user(username, host, { | 77 local ok, err = usermanager.disable_user(username, host, { |
| 65 reason = "ibr"; | 78 reason = "ibr"; |
| 66 comment = "Deletion requested by user"; | 79 comment = "Deletion requested by user"; |
| 67 when = os.time(); | 80 when = os.time(); |
| 72 session.close = old_session_close; | 85 session.close = old_session_close; |
| 73 session.send(st.error_reply(stanza, "cancel", "service-unavailable", err)); | 86 session.send(st.error_reply(stanza, "cancel", "service-unavailable", err)); |
| 74 return true; | 87 return true; |
| 75 end | 88 end |
| 76 | 89 |
| 77 deleted_accounts:set(username, { | 90 local status = { |
| 78 deleted_at = os.time(); | 91 deleted_at = os.time(); |
| 79 pending_until = os.time() + soft_delete_period; | 92 pending_until = os.time() + soft_delete_period; |
| 80 client_id = session.client_id; | 93 client_id = session.client_id; |
| 94 }; | |
| 95 deleted_accounts:set(username, status); | |
| 96 | |
| 97 log("info", "User removed their account: %s@%s (disabled, pending deletion)", username, host); | |
| 98 module:fire_event("user-deregistered-pending", { | |
| 99 username = username; | |
| 100 host = host; | |
| 101 source = "mod_register"; | |
| 102 session = old_session; | |
| 103 status = status; | |
| 81 }); | 104 }); |
| 82 | |
| 83 log("info", "User removed their account: %s@%s (disabled, pending deletion)", username, host); | |
| 84 end | 105 end |
| 85 else | 106 else |
| 86 local username = query:get_child_text("username"); | 107 local username = query:get_child_text("username"); |
| 87 local password = query:get_child_text("password"); | 108 local password = query:get_child_text("password"); |
| 88 if username and password then | 109 if username and password then |
