Software /
code /
prosody
Comparison
plugins/mod_invites.lua @ 13674:1ba58459c919 13.0
mod_invites: Add shell commands to list, show and delete pending invitations
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 13 Feb 2025 13:04:37 +0000 |
parent | 13673:a186f1cfae75 |
child | 13701:1aa7efabeacb |
comparison
equal
deleted
inserted
replaced
13673:a186f1cfae75 | 13674:1ba58459c919 |
---|---|
287 if not invite then return nil, err; end | 287 if not invite then return nil, err; end |
288 return true, invite.landing_page or invite.uri; | 288 return true, invite.landing_page or invite.uri; |
289 end; | 289 end; |
290 }); | 290 }); |
291 | 291 |
292 module:add_item("shell-command", { | |
293 section = "invite"; | |
294 section_desc = "Create and manage invitations"; | |
295 name = "show"; | |
296 desc = "Show details of an account invitation token"; | |
297 args = { { name = "host", type = "string" }, { name = "token", type = "string" } }; | |
298 host_selector = "host"; | |
299 | |
300 handler = function (self, host, token) --luacheck: ignore 212/self 212/host | |
301 local invite, err = get_account_invite_info(token); | |
302 if not invite then return nil, err; end | |
303 | |
304 local print = self.session.print; | |
305 | |
306 if invite.type == "roster" then | |
307 print("Invitation to register and become a contact of "..invite.jid); | |
308 elseif invite.type == "register" then | |
309 local jid_user, jid_host = jid_split(invite.jid); | |
310 if invite.additional_data and invite.additional_data.allow_reset then | |
311 print("Password reset for "..invite.additional_data.allow_reset.."@"..jid_host); | |
312 elseif jid_user then | |
313 print("Invitation to register on "..jid_host.." with username '"..jid_user.."'"); | |
314 else | |
315 print("Invitation to register on "..jid_host); | |
316 end | |
317 else | |
318 print("Unknown invitation type"); | |
319 end | |
320 | |
321 if invite.inviter then | |
322 print("Creator:", invite.inviter); | |
323 end | |
324 | |
325 print("Created:", os.date("%Y-%m-%d %T", invite.created_at)); | |
326 print("Expires:", os.date("%Y-%m-%d %T", invite.expires)); | |
327 | |
328 print(""); | |
329 | |
330 if invite.uri then | |
331 print("XMPP URI:", invite.uri); | |
332 end | |
333 | |
334 if invite.landing_page then | |
335 print("Web link:", invite.landing_page); | |
336 end | |
337 | |
338 if invite.additional_data then | |
339 print(""); | |
340 if invite.additional_data.roles then | |
341 if invite.additional_data.roles[1] then | |
342 print("Role:", invite.additional_data.roles[1]); | |
343 end | |
344 if invite.additional_data.roles[2] then | |
345 print("Secondary roles:", table.concat(invite.additional_data.roles, ", ", 2, #invite.additional_data.roles)); | |
346 end | |
347 end | |
348 if invite.additional_data.groups then | |
349 print("Groups:", table.concat(invite.additional_data.groups, ", ")); | |
350 end | |
351 if invite.additional_data.note then | |
352 print("Comment:", invite.additional_data.note); | |
353 end | |
354 end | |
355 | |
356 return true, "Invitation valid"; | |
357 end; | |
358 }); | |
359 | |
360 module:add_item("shell-command", { | |
361 section = "invite"; | |
362 section_desc = "Create and manage invitations"; | |
363 name = "delete"; | |
364 desc = "Delete/revoke an invitation token"; | |
365 args = { { name = "host", type = "string" }, { name = "token", type = "string" } }; | |
366 host_selector = "host"; | |
367 | |
368 handler = function (self, host, token) --luacheck: ignore 212/self 212/host | |
369 local invite, err = delete_account_invite(token); | |
370 if not invite then return nil, err; end | |
371 return true, "Invitation deleted"; | |
372 end; | |
373 }); | |
374 | |
375 module:add_item("shell-command", { | |
376 section = "invite"; | |
377 section_desc = "Create and manage invitations"; | |
378 name = "list"; | |
379 desc = "List pending invitations which allow account registration"; | |
380 args = { { name = "host", type = "string" } }; | |
381 host_selector = "host"; | |
382 | |
383 handler = function (self, host) -- luacheck: ignore 212/host | |
384 local print_row = human_io.table({ | |
385 { | |
386 title = "Token"; | |
387 key = "invite"; | |
388 width = 24; | |
389 mapper = function (invite) | |
390 return invite.token; | |
391 end; | |
392 }; | |
393 { | |
394 title = "Expires"; | |
395 key = "invite"; | |
396 width = 20; | |
397 mapper = function (invite) | |
398 return os.date("%Y-%m-%dT%T", invite.expires); | |
399 end; | |
400 }; | |
401 { | |
402 title = "Description"; | |
403 key = "invite"; | |
404 width = "100%"; | |
405 mapper = function (invite) | |
406 if invite.type == "roster" then | |
407 return "Contact with "..invite.jid; | |
408 elseif invite.type == "register" then | |
409 local jid_user, jid_host = jid_split(invite.jid); | |
410 if invite.additional_data and invite.additional_data.allow_reset then | |
411 return "Password reset for "..invite.additional_data.allow_reset.."@"..jid_host; | |
412 end | |
413 if jid_user then | |
414 return "Register on "..jid_host.." with username "..jid_user; | |
415 end | |
416 return "Register on "..jid_host; | |
417 end | |
418 end; | |
419 }; | |
420 }, self.session.width); | |
421 | |
422 self.session.print(print_row()); | |
423 local count = 0; | |
424 for _, invite in pending_account_invites() do | |
425 count = count + 1; | |
426 self.session.print(print_row({ invite = invite })); | |
427 end | |
428 return true, ("%d pending invites"):format(count); | |
429 end; | |
430 }); | |
431 | |
292 local subcommands = {}; | 432 local subcommands = {}; |
293 | 433 |
294 --- prosodyctl command | 434 --- prosodyctl command |
295 function module.command(arg) | 435 function module.command(arg) |
296 local opts = argparse.parse(arg, { short_params = { h = "help"; ["?"] = "help" } }); | 436 local opts = argparse.parse(arg, { short_params = { h = "help"; ["?"] = "help" } }); |