mod_invites/mod_invites.lua
author Matthew Wild <mwild1@gmail.com>
Fri, 23 Sep 2022 22:41:15 +0100
changeset 5058 62480053c87b
parent 4426 2047dd56cc40
permissions -rw-r--r--
mod_cloud_notify_encrypted: Additional debug logging when enabling/skipping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local id = require "util.id";
4345
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
     2
local it = require "util.iterators";
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
local url = require "socket.url";
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
local jid_node = require "util.jid".node;
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
     5
local jid_split = require "util.jid".split;
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
4350
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
     7
local default_ttl = module:get_option_number("invite_expiry", 86400 * 7);
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
     9
local token_storage;
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
    10
if prosody.process_type == "prosody" or prosody.shutdown then
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
    11
	token_storage = module:open_store("invite_token", "map");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
    12
end
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
local function get_uri(action, jid, token, params) --> string
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
	return url.build({
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
			scheme = "xmpp",
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
			path = jid,
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
			query = action..";preauth="..token..(params and (";"..params) or ""),
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
		});
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
4350
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
    22
local function create_invite(invite_action, invite_jid, allow_registration, additional_data, ttl, reusable)
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
	local token = id.medium();
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
	local created_at = os.time();
4350
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
    26
	local expires = created_at + (ttl or default_ttl);
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    28
	local invite_params = (invite_action == "roster" and allow_registration) and "ibr=y" or nil;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
	local invite = {
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
		type = invite_action;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
		jid = invite_jid;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
		token = token;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
		allow_registration = allow_registration;
4081
f85ea76447dd mod_invites: Allow inclusion of 'additional data' in invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
    36
		additional_data = additional_data;
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
		uri = get_uri(invite_action, invite_jid, token, invite_params);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
		created_at = created_at;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
		expires = expires;
4350
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
    42
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
    43
		reusable = reusable;
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
	};
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
	module:fire_event("invite-created", invite);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
	if allow_registration then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
		local ok, err = token_storage:set(nil, token, invite);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
		if not ok then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
			module:log("warn", "Failed to store account invite: %s", err);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
			return nil, "internal-server-error";
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
		end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
	end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
	if invite_action == "roster" then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
		local username = jid_node(invite_jid);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
		local ok, err = token_storage:set(username, token, expires);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
		if not ok then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
			module:log("warn", "Failed to store subscription invite: %s", err);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
			return nil, "internal-server-error";
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
		end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
	end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
	return invite;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
-- Create invitation to register an account (optionally restricted to the specified username)
4381
a0f1fb5e7829 mod_invites: Add ttl to all public creation APIs
Matthew Wild <mwild1@gmail.com>
parents: 4380
diff changeset
    69
function create_account(account_username, additional_data, ttl) --luacheck: ignore 131/create_account
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
	local jid = account_username and (account_username.."@"..module.host) or module.host;
4381
a0f1fb5e7829 mod_invites: Add ttl to all public creation APIs
Matthew Wild <mwild1@gmail.com>
parents: 4380
diff changeset
    71
	return create_invite("register", jid, true, additional_data, ttl);
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
4082
2f0c8670d2fa mod_invites: Add API to create account reset invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4081
diff changeset
    74
-- Create invitation to reset the password for an account
4381
a0f1fb5e7829 mod_invites: Add ttl to all public creation APIs
Matthew Wild <mwild1@gmail.com>
parents: 4380
diff changeset
    75
function create_account_reset(account_username, ttl) --luacheck: ignore 131/create_account_reset
a0f1fb5e7829 mod_invites: Add ttl to all public creation APIs
Matthew Wild <mwild1@gmail.com>
parents: 4380
diff changeset
    76
	return create_account(account_username, { allow_reset = account_username }, ttl or 86400);
4082
2f0c8670d2fa mod_invites: Add API to create account reset invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4081
diff changeset
    77
end
2f0c8670d2fa mod_invites: Add API to create account reset invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4081
diff changeset
    78
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
-- Create invitation to become a contact of a local user
4381
a0f1fb5e7829 mod_invites: Add ttl to all public creation APIs
Matthew Wild <mwild1@gmail.com>
parents: 4380
diff changeset
    80
function create_contact(username, allow_registration, additional_data, ttl) --luacheck: ignore 131/create_contact
a0f1fb5e7829 mod_invites: Add ttl to all public creation APIs
Matthew Wild <mwild1@gmail.com>
parents: 4380
diff changeset
    81
	return create_invite("roster", username.."@"..module.host, allow_registration, additional_data, ttl);
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
4351
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    84
-- Create invitation to register an account and join a user group
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    85
-- If explicit ttl is passed, invite is valid for multiple signups
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    86
-- during that time period
4381
a0f1fb5e7829 mod_invites: Add ttl to all public creation APIs
Matthew Wild <mwild1@gmail.com>
parents: 4380
diff changeset
    87
function create_group(group_ids, additional_data, ttl) --luacheck: ignore 131/create_group
4351
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    88
	local merged_additional_data = {
4361
a49ca492e621 mod_invites, mod_http_admin_api: Allow specifying multiple groups when creating an invite
Matthew Wild <mwild1@gmail.com>
parents: 4351
diff changeset
    89
		groups = group_ids;
4351
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    90
	};
4380
4b617a246d81 mod_invites: Fix typo in variable name
Matthew Wild <mwild1@gmail.com>
parents: 4361
diff changeset
    91
	if additional_data then
4351
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    92
		for k, v in pairs(additional_data) do
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    93
			merged_additional_data[k] = v;
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    94
		end
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    95
	end
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    96
	return create_invite("register", module.host, true, merged_additional_data, ttl, not not ttl);
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    97
end
0ec482e617bb mod_invites: Add public API method for creating group invites
Matthew Wild <mwild1@gmail.com>
parents: 4350
diff changeset
    98
4345
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
    99
-- Iterates pending (non-expired, unused) invites that allow registration
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   100
function pending_account_invites() --luacheck: ignore 131/pending_account_invites
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   101
	local store = module:open_store("invite_token");
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   102
	local now = os.time();
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   103
	local function is_valid_invite(_, invite)
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   104
		return invite.expires > now;
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   105
	end
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   106
	return it.filter(is_valid_invite, pairs(store:get(nil) or {}));
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   107
end
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   108
4348
844cfc8c4039 mod_invites: Fix some more luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 4346
diff changeset
   109
function get_account_invite_info(token) --luacheck: ignore 131/get_account_invite_info
4345
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   110
	if not token then
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   111
		return nil, "no-token";
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   112
	end
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   113
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   114
	-- Fetch from host store (account invite)
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   115
	local token_info = token_storage:get(nil, token);
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   116
	if not token_info then
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   117
		return nil, "token-invalid";
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   118
	elseif os.time() > token_info.expires then
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   119
		return nil, "token-expired";
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   120
	end
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   121
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   122
	return token_info;
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   123
end
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   124
4348
844cfc8c4039 mod_invites: Fix some more luacheck warnings
Matthew Wild <mwild1@gmail.com>
parents: 4346
diff changeset
   125
function delete_account_invite(token) --luacheck: ignore 131/delete_account_invite
4345
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   126
	if not token then
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   127
		return nil, "no-token";
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   128
	end
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   129
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   130
	return token_storage:set(nil, token, nil);
a104440c20a4 mod_invites: Add internal API to list, read and delete account invites
Matthew Wild <mwild1@gmail.com>
parents: 4100
diff changeset
   131
end
4084
14a3f5223074 mod_invites: Whitespace (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4083
diff changeset
   132
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   133
local valid_invite_methods = {};
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   134
local valid_invite_mt = { __index = valid_invite_methods };
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   135
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   136
function valid_invite_methods:use()
4350
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   137
	if self.reusable then
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   138
		return true;
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   139
	end
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   140
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   141
	if self.username then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   142
		-- Also remove the contact invite if present, on the
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   143
		-- assumption that they now have a mutual subscription
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   144
		token_storage:set(self.username, self.token, nil);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   145
	end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   146
	token_storage:set(nil, self.token, nil);
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   147
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   148
	return true;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   149
end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   150
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   151
-- Get a validated invite (or nil, err). Must call :use() on the
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   152
-- returned invite after it is actually successfully used
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   153
-- For "roster" invites, the username of the local user (who issued
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   154
-- the invite) must be passed.
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   155
-- If no username is passed, but the registration is a roster invite
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   156
-- from a local user, the "inviter" field of the returned invite will
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   157
-- be set to their username.
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   158
function get(token, username)
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   159
	if not token then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   160
		return nil, "no-token";
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   161
	end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   162
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   163
	local valid_until, inviter;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   164
4083
b68b917e568f mod_invites: Include invite type and uri in validated invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4082
diff changeset
   165
	-- Fetch from host store (account invite)
b68b917e568f mod_invites: Include invite type and uri in validated invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4082
diff changeset
   166
	local token_info = token_storage:get(nil, token);
b68b917e568f mod_invites: Include invite type and uri in validated invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4082
diff changeset
   167
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   168
	if username then -- token being used for subscription
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   169
		-- Fetch from user store (subscription invite)
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   170
		valid_until = token_storage:get(username, token);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   171
	else -- token being used for account creation
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   172
		valid_until = token_info and token_info.expires;
4085
3c18d8deeb38 mod_invites: Fix potential traceback when invalid token used (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4084
diff changeset
   173
		if token_info and token_info.type == "roster" then
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   174
			username = jid_node(token_info.jid);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   175
			inviter = username;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   176
		end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   177
	end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   178
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   179
	if not valid_until then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   180
		module:log("debug", "Got unknown token: %s", token);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   181
		return nil, "token-invalid";
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   182
	elseif os.time() > valid_until then
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   183
		module:log("debug", "Got expired token: %s", token);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   184
		return nil, "token-expired";
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   185
	end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   186
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   187
	return setmetatable({
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   188
		token = token;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   189
		username = username;
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   190
		inviter = inviter;
4083
b68b917e568f mod_invites: Include invite type and uri in validated invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4082
diff changeset
   191
		type = token_info and token_info.type or "roster";
b68b917e568f mod_invites: Include invite type and uri in validated invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 4082
diff changeset
   192
		uri = token_info and token_info.uri or get_uri("roster", username.."@"..module.host, token);
4081
f85ea76447dd mod_invites: Allow inclusion of 'additional data' in invites (from Snikket)
Matthew Wild <mwild1@gmail.com>
parents: 3780
diff changeset
   193
		additional_data = token_info and token_info.additional_data or nil;
4350
671bc55f0fc9 mod_invites: Add support to internal API for creating reusable and custom-TTL invites
Matthew Wild <mwild1@gmail.com>
parents: 4348
diff changeset
   194
		reusable = token_info.reusable;
3780
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   195
	}, valid_invite_mt);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   196
end
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   197
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   198
function use(token) --luacheck: ignore 131/use
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   199
	local invite = get(token);
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   200
	return invite and invite:use();
80830d97da81 mod_invites: New module providing an API to create/manage invite tokens
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   201
end
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   202
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   203
--- shell command
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   204
do
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   205
	-- Since the console is global this overwrites the command for
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   206
	-- each host it's loaded on, but this should be fine.
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   207
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   208
	local get_module = require "core.modulemanager".get_module;
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   209
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   210
	local console_env = module:shared("/*/admin_shell/env");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   211
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   212
	-- luacheck: ignore 212/self
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   213
	console_env.invite = {};
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   214
	function console_env.invite:create_account(user_jid)
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   215
		local username, host = jid_split(user_jid);
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   216
		local mod_invites, err = get_module(host, "invites");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   217
		if not mod_invites then return nil, err or "mod_invites not loaded on this host"; end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   218
		local invite, err = mod_invites.create_account(username);
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   219
		if not invite then return nil, err; end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   220
		return true, invite.uri;
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   221
	end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   222
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   223
	function console_env.invite:create_contact(user_jid, allow_registration)
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   224
		local username, host = jid_split(user_jid);
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   225
		local mod_invites, err = get_module(host, "invites");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   226
		if not mod_invites then return nil, err or "mod_invites not loaded on this host"; end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   227
		local invite, err = mod_invites.create_contact(username, allow_registration);
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   228
		if not invite then return nil, err; end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   229
		return true, invite.uri;
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   230
	end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   231
end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   232
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   233
--- prosodyctl command
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   234
function module.command(arg)
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   235
	if #arg < 2 or arg[1] ~= "generate" then
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   236
		print("usage: prosodyctl mod_"..module.name.." generate example.com");
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   237
		return 2;
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   238
	end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   239
	table.remove(arg, 1); -- pop command
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   240
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   241
	local sm = require "core.storagemanager";
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   242
	local mm = require "core.modulemanager";
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   243
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   244
	local host = arg[1];
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   245
	assert(hosts[host], "Host "..tostring(host).." does not exist");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   246
	sm.initialize_host(host);
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   247
	table.remove(arg, 1); -- pop host
4346
84e60c3d6e61 mod_invites: Fix luacheck warning
Matthew Wild <mwild1@gmail.com>
parents: 4345
diff changeset
   248
	module.host = host; --luacheck: ignore 122/module
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   249
	token_storage = module:open_store("invite_token", "map");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   250
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   251
	-- Load mod_invites
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   252
	local invites = module:depends("invites");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   253
	local invites_page_module = module:get_option_string("invites_page_module", "invites_page");
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   254
	if mm.get_modules_for_host(host):contains(invites_page_module) then
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   255
		module:depends(invites_page_module);
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   256
	end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   257
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   258
	local allow_reset;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   259
	local roles;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   260
	local groups = {};
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   261
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   262
	while #arg > 0 do
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   263
		local value = arg[1];
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   264
		table.remove(arg, 1);
4426
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   265
		if value == "--help" then
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   266
			print("usage: prosodyctl mod_"..module.name.." generate DOMAIN --reset USERNAME")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   267
			print("usage: prosodyctl mod_"..module.name.." generate DOMAIN [--admin] [--role ROLE] [--group GROUPID]...")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   268
			print()
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   269
			print("This command has two modes: password reset and new account.")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   270
			print("If --reset is given, the command operates in password reset mode and in new account mode otherwise.")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   271
			print()
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   272
			print("required arguments in password reset mode:")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   273
			print()
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   274
			print("    --reset USERNAME  Generate a password reset link for the given USERNAME.")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   275
			print()
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   276
			print("optional arguments in new account mode:")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   277
			print()
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   278
			print("    --admin           Make the new user privileged")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   279
			print("                      Equivalent to --role prosody:admin")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   280
			print("    --role ROLE       Grant the given ROLE to the new user")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   281
			print("    --group GROUPID   Add the user to the group with the given ID")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   282
			print("                      Can be specified multiple times")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   283
			print()
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   284
			print("--role and --admin override each other; the last one wins")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   285
			print("--group can be specified multiple times; the user will be added to all groups.")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   286
			print()
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   287
			print("--reset and the other options cannot be mixed.")
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   288
			return 2
2047dd56cc40 mod_invites: add extensive help message
Jonas Schäfer <jonas@wielicki.name>
parents: 4425
diff changeset
   289
		elseif value == "--reset" then
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   290
			local nodeprep = require "util.encodings".stringprep.nodeprep;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   291
			local username = nodeprep(arg[1])
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   292
			table.remove(arg, 1);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   293
			if not username then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   294
				print("Please supply a valid username to generate a reset link for");
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   295
				return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   296
			end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   297
			allow_reset = username;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   298
		elseif value == "--admin" then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   299
			roles = { ["prosody:admin"] = true };
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   300
		elseif value == "--role" then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   301
			local rolename = arg[1];
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   302
			if not rolename then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   303
				print("Please supply a role name");
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   304
				return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   305
			end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   306
			roles = { [rolename] = true };
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   307
			table.remove(arg, 1);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   308
		elseif value == "--group" or value == "-g" then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   309
			local groupid = arg[1];
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   310
			if not groupid then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   311
				print("Please supply a group ID")
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   312
				return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   313
			end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   314
			table.insert(groups, groupid);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   315
			table.remove(arg, 1);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   316
		else
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   317
			print("unexpected argument: "..value)
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   318
		end
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   319
	end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   320
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   321
	local invite;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   322
	if allow_reset then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   323
		if roles then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   324
			print("--role/--admin and --reset are mutually exclusive")
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   325
			return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   326
		end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   327
		if #groups > 0 then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   328
			print("--group and --reset are mutually exclusive")
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   329
		end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   330
		invite = assert(invites.create_account_reset(allow_reset));
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   331
	else
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   332
		invite = assert(invites.create_account(nil, {
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   333
			roles = roles,
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   334
			groups = groups
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   335
		}));
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   336
	end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   337
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   338
	print(invite.landing_page or invite.uri);
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   339
end