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