Software /
code /
prosody
Annotate
plugins/mod_invites.lua @ 13467:c2a476f4712a
util.startup: Fix exiting on pidfile trouble
prosody.shutdown() relies on prosody.main_thread, which has not been set
yet at this point.
Doing a clean shutdown might actually be harmful in case it tears down
things set up by the conflicting Prosody, such as the very pidfile we
were looking at.
Thanks again SigmaTel71 for noticing
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Wed, 27 Mar 2024 19:33:11 +0100 |
parent | 13413:992389af2372 |
child | 13520:662dfff658a0 |
rev | line source |
---|---|
12977
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12834
diff
changeset
|
1 local id = require "prosody.util.id"; |
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12834
diff
changeset
|
2 local it = require "prosody.util.iterators"; |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 local url = require "socket.url"; |
12977
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12834
diff
changeset
|
4 local jid_node = require "prosody.util.jid".node; |
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12834
diff
changeset
|
5 local jid_split = require "prosody.util.jid".split; |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
6 local argparse = require "prosody.util.argparse"; |
13410
7efdd143fdfc
mod_invites: Allow specifying invite ttl on command line
Kim Alvefur <zash@zash.se>
parents:
13355
diff
changeset
|
7 local human_io = require "prosody.util.human.io"; |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 |
13209
c8d949cf6b09
plugins: Switch to :get_option_period() for time range options
Kim Alvefur <zash@zash.se>
parents:
13161
diff
changeset
|
9 local default_ttl = module:get_option_period("invite_expiry", "1 week"); |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 local token_storage; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 if prosody.process_type == "prosody" or prosody.shutdown then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 token_storage = module:open_store("invite_token", "map"); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 local function get_uri(action, jid, token, params) --> string |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 return url.build({ |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 scheme = "xmpp", |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 path = jid, |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 query = action..";preauth="..token..(params and (";"..params) or ""), |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 }); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 local function create_invite(invite_action, invite_jid, allow_registration, additional_data, ttl, reusable) |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 local token = id.medium(); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 local created_at = os.time(); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 local expires = created_at + (ttl or default_ttl); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 local invite_params = (invite_action == "roster" and allow_registration) and "ibr=y" or nil; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 local invite = { |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 type = invite_action; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 jid = invite_jid; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 token = token; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
37 allow_registration = allow_registration; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 additional_data = additional_data; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 uri = get_uri(invite_action, invite_jid, token, invite_params); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 created_at = created_at; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 expires = expires; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 reusable = reusable; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 }; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 module:fire_event("invite-created", invite); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 if allow_registration then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 local ok, err = token_storage:set(nil, token, invite); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 if not ok then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 module:log("warn", "Failed to store account invite: %s", err); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 return nil, "internal-server-error"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 if invite_action == "roster" then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 local username = jid_node(invite_jid); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 local ok, err = token_storage:set(username, token, expires); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
61 if not ok then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 module:log("warn", "Failed to store subscription invite: %s", err); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 return nil, "internal-server-error"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 return invite; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 -- Create invitation to register an account (optionally restricted to the specified username) |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 function create_account(account_username, additional_data, ttl) --luacheck: ignore 131/create_account |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 local jid = account_username and (account_username.."@"..module.host) or module.host; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 return create_invite("register", jid, true, additional_data, ttl); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 -- Create invitation to reset the password for an account |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 function create_account_reset(account_username, ttl) --luacheck: ignore 131/create_account_reset |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 return create_account(account_username, { allow_reset = account_username }, ttl or 86400); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 -- Create invitation to become a contact of a local user |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 function create_contact(username, allow_registration, additional_data, ttl) --luacheck: ignore 131/create_contact |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 return create_invite("roster", username.."@"..module.host, allow_registration, additional_data, ttl); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 -- Create invitation to register an account and join a user group |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 -- If explicit ttl is passed, invite is valid for multiple signups |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 -- during that time period |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 function create_group(group_ids, additional_data, ttl) --luacheck: ignore 131/create_group |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 local merged_additional_data = { |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 groups = group_ids; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 }; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 if additional_data then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 for k, v in pairs(additional_data) do |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 merged_additional_data[k] = v; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 return create_invite("register", module.host, true, merged_additional_data, ttl, not not ttl); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 -- Iterates pending (non-expired, unused) invites that allow registration |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 function pending_account_invites() --luacheck: ignore 131/pending_account_invites |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 local store = module:open_store("invite_token"); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 local now = os.time(); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 local function is_valid_invite(_, invite) |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 return invite.expires > now; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 return it.filter(is_valid_invite, pairs(store:get(nil) or {})); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 function get_account_invite_info(token) --luacheck: ignore 131/get_account_invite_info |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 if not token then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 return nil, "no-token"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 -- Fetch from host store (account invite) |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 local token_info = token_storage:get(nil, token); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 if not token_info then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 return nil, "token-invalid"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 elseif os.time() > token_info.expires then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 return nil, "token-expired"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
122 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
124 return token_info; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
125 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
127 function delete_account_invite(token) --luacheck: ignore 131/delete_account_invite |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
128 if not token then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
129 return nil, "no-token"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 return token_storage:set(nil, token, nil); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
135 local valid_invite_methods = {}; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 local valid_invite_mt = { __index = valid_invite_methods }; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 function valid_invite_methods:use() |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 if self.reusable then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
140 return true; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
143 if self.username then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
144 -- Also remove the contact invite if present, on the |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
145 -- assumption that they now have a mutual subscription |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 token_storage:set(self.username, self.token, nil); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 token_storage:set(nil, self.token, nil); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 return true; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
152 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
153 -- Get a validated invite (or nil, err). Must call :use() on the |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 -- returned invite after it is actually successfully used |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 -- For "roster" invites, the username of the local user (who issued |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 -- the invite) must be passed. |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 -- If no username is passed, but the registration is a roster invite |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 -- from a local user, the "inviter" field of the returned invite will |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 -- be set to their username. |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 function get(token, username) |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 if not token then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 return nil, "no-token"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
164 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
165 local valid_until, inviter; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
166 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
167 -- Fetch from host store (account invite) |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
168 local token_info = token_storage:get(nil, token); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
169 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 if username then -- token being used for subscription |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 -- Fetch from user store (subscription invite) |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
172 valid_until = token_storage:get(username, token); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
173 else -- token being used for account creation |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
174 valid_until = token_info and token_info.expires; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 if token_info and token_info.type == "roster" then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
176 username = jid_node(token_info.jid); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
177 inviter = username; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
178 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
179 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
180 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
181 if not valid_until then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
182 module:log("debug", "Got unknown token: %s", token); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
183 return nil, "token-invalid"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
184 elseif os.time() > valid_until then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 module:log("debug", "Got expired token: %s", token); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
186 return nil, "token-expired"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
187 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
188 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
189 return setmetatable({ |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 token = token; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
191 username = username; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
192 inviter = inviter; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
193 type = token_info and token_info.type or "roster"; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
194 uri = token_info and token_info.uri or get_uri("roster", username.."@"..module.host, token); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
195 additional_data = token_info and token_info.additional_data or nil; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
196 reusable = token_info.reusable; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
197 }, valid_invite_mt); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 function use(token) --luacheck: ignore 131/use |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
201 local invite = get(token); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
202 return invite and invite:use(); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
203 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
204 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 --- shell command |
13353
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
206 module:add_item("shell-command", { |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
207 section = "invite"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
208 section_desc = "Create and manage invitations"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
209 name = "create_account"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
210 desc = "Create an invitation to make an account on this server with the specified JID (supply only a hostname to allow any username)"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
211 args = { { name = "user_jid", type = "string" } }; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
212 host_selector = "user_jid"; |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 |
13355
a6c8a50cdfb5
mod_invites: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents:
13353
diff
changeset
|
214 handler = function (self, user_jid) --luacheck: ignore 212/self |
a6c8a50cdfb5
mod_invites: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents:
13353
diff
changeset
|
215 local username = jid_split(user_jid); |
13353
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
216 local invite, err = create_account(username); |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 if not invite then return nil, err; end |
12834
dcbff9f038a0
mod_invites: Prefer landing page over xmpp URI in shell command
Kim Alvefur <zash@zash.se>
parents:
12151
diff
changeset
|
218 return true, invite.landing_page or invite.uri; |
13353
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
219 end; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
220 }); |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 |
13353
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
222 module:add_item("shell-command", { |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
223 section = "invite"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
224 section_desc = "Create and manage invitations"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
225 name = "create_contact"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
226 desc = "Create an invitation to become contacts with the specified user"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
227 args = { { name = "user_jid", type = "string" }, { name = "allow_registration" } }; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
228 host_selector = "user_jid"; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
229 |
13355
a6c8a50cdfb5
mod_invites: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents:
13353
diff
changeset
|
230 handler = function (self, user_jid, allow_registration) --luacheck: ignore 212/self |
a6c8a50cdfb5
mod_invites: Fix linter issues
Matthew Wild <mwild1@gmail.com>
parents:
13353
diff
changeset
|
231 local username = jid_split(user_jid); |
13353
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
232 local invite, err = create_contact(username, allow_registration); |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
233 if not invite then return nil, err; end |
12834
dcbff9f038a0
mod_invites: Prefer landing page over xmpp URI in shell command
Kim Alvefur <zash@zash.se>
parents:
12151
diff
changeset
|
234 return true, invite.landing_page or invite.uri; |
13353
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
235 end; |
27512ebcc8af
mod_invites: Use new shell-command API
Matthew Wild <mwild1@gmail.com>
parents:
13209
diff
changeset
|
236 }); |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
237 |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
238 local subcommands = {}; |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
239 |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 --- prosodyctl command |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 function module.command(arg) |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
242 local opts = argparse.parse(arg, { short_params = { h = "help"; ["?"] = "help" } }); |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
243 local cmd = table.remove(arg, 1); -- pop command |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
244 if opts.help or not cmd or not subcommands[cmd] then |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
245 print("usage: prosodyctl mod_"..module.name.." generate example.com"); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
246 return 2; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 end |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
248 return subcommands[cmd](arg); |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
249 end |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
250 |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
251 function subcommands.generate(arg) |
13412
0e96d6a29a12
mod_invites: Show short help instead of traceback on missing hostname
Kim Alvefur <zash@zash.se>
parents:
13411
diff
changeset
|
252 local function help(short) |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
253 print("usage: prosodyctl mod_" .. module.name .. " generate DOMAIN --reset USERNAME") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
254 print("usage: prosodyctl mod_" .. module.name .. " generate DOMAIN [--admin] [--role ROLE] [--group GROUPID]...") |
13412
0e96d6a29a12
mod_invites: Show short help instead of traceback on missing hostname
Kim Alvefur <zash@zash.se>
parents:
13411
diff
changeset
|
255 if short then return 2 end |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
256 print() |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
257 print("This command has two modes: password reset and new account.") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
258 print("If --reset is given, the command operates in password reset mode and in new account mode otherwise.") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
259 print() |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
260 print("required arguments in password reset mode:") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
261 print() |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
262 print(" --reset USERNAME Generate a password reset link for the given USERNAME.") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
263 print() |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
264 print("optional arguments in new account mode:") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
265 print() |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
266 print(" --admin Make the new user privileged") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
267 print(" Equivalent to --role prosody:admin") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
268 print(" --role ROLE Grant the given ROLE to the new user") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
269 print(" --group GROUPID Add the user to the group with the given ID") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
270 print(" Can be specified multiple times") |
13410
7efdd143fdfc
mod_invites: Allow specifying invite ttl on command line
Kim Alvefur <zash@zash.se>
parents:
13355
diff
changeset
|
271 print(" --expires-after T Time until the invite expires (e.g. '1 week')") |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
272 print() |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
273 print("--group can be specified multiple times; the user will be added to all groups.") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
274 print() |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
275 print("--reset and the other options cannot be mixed.") |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
276 return 2 |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
277 end |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
278 |
13411
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
279 local earlyopts = argparse.parse(arg, { short_params = { h = "help"; ["?"] = "help" } }); |
13413
992389af2372
mod_invites: Fix argument handling
Kim Alvefur <zash@zash.se>
parents:
13412
diff
changeset
|
280 if earlyopts.help or not earlyopts[1] then |
13411
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
281 return help(); |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
282 end |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
283 |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
284 local sm = require "prosody.core.storagemanager"; |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
285 local mm = require "prosody.core.modulemanager"; |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
286 |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
287 local host = table.remove(arg, 1); -- pop host |
13412
0e96d6a29a12
mod_invites: Show short help instead of traceback on missing hostname
Kim Alvefur <zash@zash.se>
parents:
13411
diff
changeset
|
288 if not host then return help(true) end |
13411
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
289 sm.initialize_host(host); |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
290 module.host = host; --luacheck: ignore 122/module |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
291 token_storage = module:open_store("invite_token", "map"); |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
292 |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
293 local opts = argparse.parse(arg, { |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
294 short_params = { h = "help"; ["?"] = "help"; g = "group" }; |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
295 value_params = { group = true; reset = true; role = true }; |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
296 array_params = { group = true; role = true }; |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
297 }); |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
298 |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
299 if opts.help then |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
300 return help(); |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
301 end |
d815882d2692
mod_invites: Show help if --help passed instead of hostname
Kim Alvefur <zash@zash.se>
parents:
13410
diff
changeset
|
302 |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
303 -- Load mod_invites |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
304 local invites = module:depends("invites"); |
12151
669d93f1db6a
mod_invites: Comment on module loading for HTTP invite URLs
Kim Alvefur <zash@zash.se>
parents:
12143
diff
changeset
|
305 -- Optional community module that if used, needs to be loaded here |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
306 local invites_page_module = module:get_option_string("invites_page_module", "invites_page"); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
307 if mm.get_modules_for_host(host):contains(invites_page_module) then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
308 module:depends(invites_page_module); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
309 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
310 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
311 local allow_reset; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
312 |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
313 if opts.reset then |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
314 local nodeprep = require "prosody.util.encodings".stringprep.nodeprep; |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
315 local username = nodeprep(opts.reset) |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
316 if not username then |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
317 print("Please supply a valid username to generate a reset link for"); |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
318 return 2; |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
319 end |
13161
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
320 allow_reset = username; |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
321 end |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
322 |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
323 local roles = opts.role or {}; |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
324 local groups = opts.groups or {}; |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
325 |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
326 if opts.admin then |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
327 -- Insert it first since we don't get order out of argparse |
9ba11ef91ce4
mod_invites: Refactor argument handling using util.argparse
Kim Alvefur <zash@zash.se>
parents:
13096
diff
changeset
|
328 table.insert(roles, 1, "prosody:admin"); |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
329 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
330 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
331 local invite; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
332 if allow_reset then |
13096
9638ff8b1c81
mod_invites: Fix password reset invites
Kim Alvefur <zash@zash.se>
parents:
13012
diff
changeset
|
333 if roles[1] then |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
334 print("--role/--admin and --reset are mutually exclusive") |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
335 return 2; |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
336 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
337 if #groups > 0 then |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
338 print("--group and --reset are mutually exclusive") |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
339 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
340 invite = assert(invites.create_account_reset(allow_reset)); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
341 else |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
342 invite = assert(invites.create_account(nil, { |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
343 roles = roles, |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
344 groups = groups |
13410
7efdd143fdfc
mod_invites: Allow specifying invite ttl on command line
Kim Alvefur <zash@zash.se>
parents:
13355
diff
changeset
|
345 }, opts.expires_after and human_io.parse_duration(opts.expires_after))); |
12142
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
346 end |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
347 |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
348 print(invite.landing_page or invite.uri); |
87532eebd0b8
mod_invites: Import from prosdy-modules@5fc306239db3
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
349 end |