mod_invites/mod_invites.lua
author Jonas Schäfer <jonas@wielicki.name>
Sun, 31 Jan 2021 19:16:36 +0100
changeset 4425 94805a7e7b30
parent 4381 a0f1fb5e7829
child 4426 2047dd56cc40
permissions -rw-r--r--
mod_invites: rework CLI parsing to support groups To make this sensible, the code had to move from rather simple parsing to something which looks more like getopt or your typical shell script.
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);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   265
		if value == "--reset" then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   266
			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
   267
			local username = nodeprep(arg[1])
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   268
			table.remove(arg, 1);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   269
			if not username then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   270
				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
   271
				return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   272
			end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   273
			allow_reset = username;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   274
		elseif value == "--admin" then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   275
			roles = { ["prosody:admin"] = true };
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   276
		elseif value == "--role" then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   277
			local rolename = arg[1];
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   278
			if not rolename then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   279
				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
   280
				return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   281
			end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   282
			roles = { [rolename] = true };
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   283
			table.remove(arg, 1);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   284
		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
   285
			local groupid = arg[1];
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   286
			if not groupid then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   287
				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
   288
				return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   289
			end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   290
			table.insert(groups, groupid);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   291
			table.remove(arg, 1);
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   292
		else
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   293
			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
   294
		end
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   295
	end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   296
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   297
	local invite;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   298
	if allow_reset then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   299
		if roles then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   300
			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
   301
			return 2;
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   302
		end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   303
		if #groups > 0 then
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   304
			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
   305
		end
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   306
		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
   307
	else
4425
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   308
		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
   309
			roles = roles,
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   310
			groups = groups
94805a7e7b30 mod_invites: rework CLI parsing to support groups
Jonas Schäfer <jonas@wielicki.name>
parents: 4381
diff changeset
   311
		}));
4100
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   312
	end
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   313
24f4eb35ab60 mod_invites: Absorb shell and prosodyctl commands from mod_easy_invite
Matthew Wild <mwild1@gmail.com>
parents: 4085
diff changeset
   314
	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
   315
end