Software /
code /
prosody
Comparison
plugins/mod_flags.lua @ 13583:e77ef9a4604f
mod_flags: New module to view and manage flags on user accounts via shell/API
This will be useful for server operators to easily identify flagged accounts,
etc.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Fri, 03 Jan 2025 11:45:48 +0000 |
comparison
equal
deleted
inserted
replaced
13582:67c9fc643873 | 13583:e77ef9a4604f |
---|---|
1 local jid_node = require "prosody.util.jid".node; | |
2 | |
3 local flags = module:open_store("account_flags", "keyval+"); | |
4 | |
5 -- API | |
6 | |
7 function add_flag(username, flag, comment) | |
8 local flag_data = { | |
9 when = os.time(); | |
10 comment = comment; | |
11 }; | |
12 | |
13 local ok, err = flags:set_key(username, flag, flag_data); | |
14 if not ok then | |
15 return nil, err; | |
16 end | |
17 | |
18 module:fire_event("user-flag-added/"..flag, { | |
19 user = username; | |
20 flag = flag; | |
21 data = flag_data; | |
22 }); | |
23 | |
24 return true; | |
25 end | |
26 | |
27 function remove_flag(username, flag) | |
28 local ok, err = flags:set_key(username, flag, nil); | |
29 if not ok then | |
30 return nil, err; | |
31 end | |
32 | |
33 module:fire_event("user-flag-removed/"..flag, { | |
34 user = username; | |
35 flag = flag; | |
36 }); | |
37 | |
38 return true; | |
39 end | |
40 | |
41 function has_flag(username, flag) -- luacheck: ignore 131/has_flag | |
42 local ok, err = flags:get_key(username, flag); | |
43 if not ok and err then | |
44 error("Failed to check flags for user: "..err); | |
45 end | |
46 return not not ok; | |
47 end | |
48 | |
49 function get_flag_info(username, flag) -- luacheck: ignore 131/get_flag_info | |
50 return flags:get_key(username, flag); | |
51 end | |
52 | |
53 -- Shell commands | |
54 | |
55 local function get_username(jid) | |
56 return (assert(jid_node(jid), "please supply a valid user JID")); | |
57 end | |
58 | |
59 module:add_item("shell-command", { | |
60 section = "flags"; | |
61 section_desc = "View and manage flags on user accounts"; | |
62 name = "list"; | |
63 desc = "List flags for the given user account"; | |
64 args = { | |
65 { name = "jid", type = "string" }; | |
66 }; | |
67 host_selector = "jid"; | |
68 handler = function(self, jid) --luacheck: ignore 212/self | |
69 local c = 0; | |
70 | |
71 local user_flags, err = flags:get(get_username(jid)); | |
72 | |
73 if not user_flags and err then | |
74 return false, "Unable to list flags: "..err; | |
75 end | |
76 | |
77 if user_flags then | |
78 local print = self.session.print; | |
79 | |
80 for flag_name, flag_data in pairs(user_flags) do | |
81 print(flag_name, os.date("%Y-%m-%d %R", flag_data.when), flag_data.comment); | |
82 c = c + 1; | |
83 end | |
84 end | |
85 | |
86 return true, ("%d flags listed"):format(c); | |
87 end; | |
88 }); | |
89 | |
90 module:add_item("shell-command", { | |
91 section = "flags"; | |
92 section_desc = "View and manage flags on user accounts"; | |
93 name = "add"; | |
94 desc = "Add a flag to the given user account, with optional comment"; | |
95 args = { | |
96 { name = "jid", type = "string" }; | |
97 { name = "flag", type = "string" }; | |
98 { name = "comment", type = "string" }; | |
99 }; | |
100 host_selector = "jid"; | |
101 handler = function(self, jid, flag, comment) --luacheck: ignore 212/self | |
102 local username = get_username(jid); | |
103 | |
104 local ok, err = add_flag(username, flag, comment); | |
105 if not ok then | |
106 return false, "Failed to add flag: "..err; | |
107 end | |
108 | |
109 return true, "Flag added"; | |
110 end; | |
111 }); | |
112 | |
113 module:add_item("shell-command", { | |
114 section = "flags"; | |
115 section_desc = "View and manage flags on user accounts"; | |
116 name = "remove"; | |
117 desc = "Remove a flag from the given user account"; | |
118 args = { | |
119 { name = "jid", type = "string" }; | |
120 { name = "flag", type = "string" }; | |
121 }; | |
122 host_selector = "jid"; | |
123 handler = function(self, jid, flag) --luacheck: ignore 212/self | |
124 local username = get_username(jid); | |
125 | |
126 local ok, err = remove_flag(username, flag); | |
127 if not ok then | |
128 return false, "Failed to remove flag: "..err; | |
129 end | |
130 | |
131 return true, "Flag removed"; | |
132 end; | |
133 }); | |
134 | |
135 module:add_item("shell-command", { | |
136 section = "flags"; | |
137 section_desc = "View and manage flags on user accounts"; | |
138 name = "find"; | |
139 desc = "Find all user accounts with a given flag on the specified host"; | |
140 args = { | |
141 { name = "host", type = "string" }; | |
142 { name = "flag", type = "string" }; | |
143 }; | |
144 host_selector = "host"; | |
145 handler = function(self, host, flag) --luacheck: ignore 212/self 212/host | |
146 local users_with_flag = flags:get_key_from_all(flag); | |
147 | |
148 local print = self.session.print; | |
149 local c = 0; | |
150 for user, flag_data in pairs(users_with_flag) do | |
151 print(user, os.date("%Y-%m-%d %R", flag_data.when), flag_data.comment); | |
152 c = c + 1; | |
153 end | |
154 | |
155 return true, ("%d accounts listed"):format(c); | |
156 end; | |
157 }); |