plugins/mod_register_ibr.lua
author Kim Alvefur <zash@zash.se>
Wed, 27 Mar 2024 19:33:11 +0100
changeset 13471 c2a476f4712a
parent 13236 e0ab20519ce5
permissions -rw-r--r--
util.startup: Fix exiting on pidfile trouble prosody.shutdown() relies on prosody.main_thread, which has not been set yet at this point. Doing a clean shutdown might actually be harmful in case it tears down things set up by the conflicting Prosody, such as the very pidfile we were looking at. Thanks again SigmaTel71 for noticing
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 1189
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2448
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 2448
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 5763
diff changeset
     4
--
758
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 691
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
b1885732e979 GPL->MIT!
Matthew Wild <mwild1@gmail.com>
parents: 691
diff changeset
     6
-- COPYING file in the source package for more information.
519
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     7
--
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     8
cccd610a0ef9 Insert copyright/license headers
Matthew Wild <mwild1@gmail.com>
parents: 438
diff changeset
     9
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12334
diff changeset
    10
local st = require "prosody.util.stanza";
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12334
diff changeset
    11
local dataform_new = require "prosody.util.dataforms".new;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12334
diff changeset
    12
local usermanager_user_exists  = require "prosody.core.usermanager".user_exists;
13174
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
    13
local usermanager_create_user_with_role  = require "prosody.core.usermanager".create_user_with_role;
12981
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12334
diff changeset
    14
local usermanager_set_password = require "prosody.core.usermanager".create_user;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12334
diff changeset
    15
local usermanager_delete_user  = require "prosody.core.usermanager".delete_user;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12334
diff changeset
    16
local nodeprep = require "prosody.util.encodings".stringprep.nodeprep;
74b9e05af71e plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12334
diff changeset
    17
local util_error = require "prosody.util.error";
3995
e504b06492c6 mod_register: Add registration_compat config option to allow account remove requests addressed to='host' (defaults to true)
Matthew Wild <mwild1@gmail.com>
parents: 3540
diff changeset
    18
13236
e0ab20519ce5 plugins: Use get_option_array for some list shaped options
Kim Alvefur <zash@zash.se>
parents: 13174
diff changeset
    19
local additional_fields = module:get_option_array("additional_registration_fields", {});
8487
f591855f060d mod_register: Split into mod_register_ibr and mod_user_account_management (#723)
Kim Alvefur <zash@zash.se>
parents: 8467
diff changeset
    20
local require_encryption = module:get_option_boolean("c2s_require_encryption",
12334
38b5b05407be various: Require encryption by default for real
Kim Alvefur <zash@zash.se>
parents: 10950
diff changeset
    21
	module:get_option_boolean("require_encryption", true));
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    22
13174
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
    23
local default_role = module:get_option_string("register_ibr_default_role", "prosody:registered");
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
    24
9612
3e44b8dc2cc0 mod_register: Move dependency on mod_register_limits into mod_register_ibr
Kim Alvefur <zash@zash.se>
parents: 9456
diff changeset
    25
pcall(function ()
3e44b8dc2cc0 mod_register: Move dependency on mod_register_limits into mod_register_ibr
Kim Alvefur <zash@zash.se>
parents: 9456
diff changeset
    26
	module:depends("register_limits");
3e44b8dc2cc0 mod_register: Move dependency on mod_register_limits into mod_register_ibr
Kim Alvefur <zash@zash.se>
parents: 9456
diff changeset
    27
end);
3e44b8dc2cc0 mod_register: Move dependency on mod_register_limits into mod_register_ibr
Kim Alvefur <zash@zash.se>
parents: 9456
diff changeset
    28
5500
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5371
diff changeset
    29
local account_details = module:open_store("account_details");
eeea0eb2602a mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
Kim Alvefur <zash@zash.se>
parents: 5371
diff changeset
    30
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    31
local field_map = {
10285
f90abf142d53 mod_register_ibr: Add FORM_TYPE as required by XEP-0077.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9612
diff changeset
    32
	FORM_TYPE = { name = "FORM_TYPE", type = "hidden", value = "jabber:iq:register" };
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    33
	username = { name = "username", type = "text-single", label = "Username", required = true };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    34
	password = { name = "password", type = "text-private", label = "Password", required = true };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    35
	nick = { name = "nick", type = "text-single", label = "Nickname" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    36
	name = { name = "name", type = "text-single", label = "Full Name" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    37
	first = { name = "first", type = "text-single", label = "Given Name" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    38
	last = { name = "last", type = "text-single", label = "Family Name" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    39
	email = { name = "email", type = "text-single", label = "Email" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    40
	address = { name = "address", type = "text-single", label = "Street" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    41
	city = { name = "city", type = "text-single", label = "City" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    42
	state = { name = "state", type = "text-single", label = "State" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    43
	zip = { name = "zip", type = "text-single", label = "Postal code" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    44
	phone = { name = "phone", type = "text-single", label = "Telephone number" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    45
	url = { name = "url", type = "text-single", label = "Webpage" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    46
	date = { name = "date", type = "text-single", label = "Birth date" };
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    47
};
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    48
7815
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    49
local title = module:get_option_string("registration_title",
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    50
	"Creating a new account");
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    51
local instructions = module:get_option_string("registration_instructions",
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    52
	"Choose a username and password for use with this service.");
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    53
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    54
local registration_form = dataform_new{
7815
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    55
	title = title;
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    56
	instructions = instructions;
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    57
10285
f90abf142d53 mod_register_ibr: Add FORM_TYPE as required by XEP-0077.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9612
diff changeset
    58
	field_map.FORM_TYPE;
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    59
	field_map.username;
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    60
	field_map.password;
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    61
};
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    62
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    63
local registration_query = st.stanza("query", {xmlns = "jabber:iq:register"})
7815
2bc339352dcd mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents: 7757
diff changeset
    64
	:tag("instructions"):text(instructions):up()
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    65
	:tag("username"):up()
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    66
	:tag("password"):up();
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    67
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    68
for _, field in ipairs(additional_fields) do
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    69
	if type(field) == "table" then
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    70
		registration_form[#registration_form + 1] = field;
7819
2624f4ee34a2 mod_register: Fix syntax errors
Kim Alvefur <zash@zash.se>
parents: 7818
diff changeset
    71
	elseif field_map[field] or field_map[field:sub(1, -2)] then
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    72
		if field:match("%+$") then
7817
2120d71b0d56 mod_register: Strip '+' char from field names without using length
Kim Alvefur <zash@zash.se>
parents: 7815
diff changeset
    73
			field = field:sub(1, -2);
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    74
			field_map[field].required = true;
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    75
		end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    76
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    77
		registration_form[#registration_form + 1] = field_map[field];
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    78
		registration_query:tag(field):up();
7818
f8d25a2e80ea mod_register: Verify that fields are known to prevent traceback
Kim Alvefur <zash@zash.se>
parents: 7817
diff changeset
    79
	else
f8d25a2e80ea mod_register: Verify that fields are known to prevent traceback
Kim Alvefur <zash@zash.se>
parents: 7817
diff changeset
    80
		module:log("error", "Unknown field %q", field);
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    81
	end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    82
end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    83
registration_query:add_child(registration_form:form());
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
4268
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    85
local register_stream_feature = st.stanza("register", {xmlns="http://jabber.org/features/iq-register"}):up();
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    86
module:hook("stream-features", function(event)
5707
36a289e9244c mod_register: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 5637
diff changeset
    87
	local session, features = event.origin, event.features;
4268
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    88
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    89
	-- Advertise registration to unauthorized clients only.
8487
f591855f060d mod_register: Split into mod_register_ibr and mod_user_account_management (#723)
Kim Alvefur <zash@zash.se>
parents: 8467
diff changeset
    90
	if session.type ~= "c2s_unauthed" or (require_encryption and not session.secure) then
4268
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    91
		return
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    92
	end
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    93
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    94
	features:add_child(register_stream_feature);
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    95
end);
c249f10eb9bb Advertise in-band registration support.
Glenn Maynard <glenn@zewt.org>
parents: 3997
diff changeset
    96
4398
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    97
local function parse_response(query)
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    98
	local form = query:get_child("x", "jabber:x:data");
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
    99
	if form then
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   100
		return registration_form:data(form);
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   101
	else
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   102
		local data = {};
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   103
		local errors = {};
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   104
		for _, field in ipairs(registration_form) do
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   105
			local name, required = field.name, field.required;
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   106
			if field_map[name] then
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   107
				data[name] = query:get_child_text(name);
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   108
				if (not data[name] or #data[name] == 0) and required then
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   109
					errors[name] = "Required value missing";
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   110
				end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   111
			end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   112
		end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   113
		if next(errors) then
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   114
			return data, errors;
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   115
		end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   116
		return data;
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   117
	end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   118
end
acc37e221940 mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents: 4270
diff changeset
   119
8197
ba9cd8447578 mod_register: Add comments saying which section handles password change, account deletion and which is in-band registration
Kim Alvefur <zash@zash.se>
parents: 8195
diff changeset
   120
-- In-band registration
3529
3f9cc12308aa mod_register: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3394
diff changeset
   121
module:hook("stanza/iq/jabber:iq:register:query", function(event)
3f9cc12308aa mod_register: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3394
diff changeset
   122
	local session, stanza = event.origin, event.stanza;
7020
ff734a602886 mod_register: Use session log instance to ease indentification
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
   123
	local log = session.log or module._log;
3529
3f9cc12308aa mod_register: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3394
diff changeset
   124
8487
f591855f060d mod_register: Split into mod_register_ibr and mod_user_account_management (#723)
Kim Alvefur <zash@zash.se>
parents: 8467
diff changeset
   125
	if session.type ~= "c2s_unauthed" then
7712
0af1783d1592 mod_register: Additional logging for various registration failure cases
Kim Alvefur <zash@zash.se>
parents: 7573
diff changeset
   126
		log("debug", "Attempted registration when disabled or already authenticated");
665
09e0e9c722a3 Add allow_registration option to disable account registration
Matthew Wild <mwild1@gmail.com>
parents: 615
diff changeset
   127
		session.send(st.error_reply(stanza, "cancel", "service-unavailable"));
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   128
		return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   129
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   130
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   131
	if require_encryption and not session.secure then
7919
72b6d5ab4137 mod_register: Require encryption before registration if c2s_require_encryption is set (fixes #595)
Kim Alvefur <zash@zash.se>
parents: 5637
diff changeset
   132
		session.send(st.error_reply(stanza, "modify", "policy-violation", "Encryption is required"));
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   133
		return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   134
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   135
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   136
	local query = stanza.tags[1];
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   137
	if stanza.attr.type == "get" then
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   138
		local reply = st.reply(stanza);
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   139
		reply:add_child(registration_query);
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   140
		session.send(reply);
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   141
		return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   142
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   143
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   144
	-- stanza.attr.type == "set"
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   145
	if query.tags[1] and query.tags[1].name == "remove" then
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   146
		session.send(st.error_reply(stanza, "auth", "registration-required"));
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   147
		return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   148
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   149
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   150
	local data, errors = parse_response(query);
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   151
	if errors then
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   152
		log("debug", "Error parsing registration form:");
8740
6d71845bf56f mod_register_ibr: Return a textual error to the user for problems with parsing form data
Kim Alvefur <zash@zash.se>
parents: 8739
diff changeset
   153
		local textual_errors = {};
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   154
		for field, err in pairs(errors) do
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   155
			log("debug", "Field %q: %s", field, err);
8740
6d71845bf56f mod_register_ibr: Return a textual error to the user for problems with parsing form data
Kim Alvefur <zash@zash.se>
parents: 8739
diff changeset
   156
			table.insert(textual_errors, ("%s: %s"):format(field:gsub("^%a", string.upper), err));
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   157
		end
8740
6d71845bf56f mod_register_ibr: Return a textual error to the user for problems with parsing form data
Kim Alvefur <zash@zash.se>
parents: 8739
diff changeset
   158
		session.send(st.error_reply(stanza, "modify", "not-acceptable", table.concat(textual_errors, "\n")));
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   159
		return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   160
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   161
10372
76eb79d372de mod_register_ibr: Enforce strict JID validation
Kim Alvefur <zash@zash.se>
parents: 10367
diff changeset
   162
	local username, password = nodeprep(data.username, true), data.password;
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   163
	data.username, data.password = nil, nil;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   164
	local host = module.host;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   165
	if not username or username == "" then
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   166
		log("debug", "The requested username is invalid.");
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   167
		session.send(st.error_reply(stanza, "modify", "not-acceptable", "The requested username is invalid."));
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   168
		return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   169
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   170
13174
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
   171
	local user = {
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
   172
		username = username, password = password, host = host;
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
   173
		additional = data, ip = session.ip, session = session;
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
   174
		role = default_role;
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
   175
		allowed = true;
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
   176
	};
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   177
	module:fire_event("user-registering", user);
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   178
	if not user.allowed then
10367
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   179
		local error_type, error_condition, reason;
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   180
		local err = user.error;
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   181
		if err then
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   182
			error_type, error_condition, reason = err.type, err.condition, err.text;
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   183
		else
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   184
			-- COMPAT pre-util.error
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   185
			error_type, error_condition, reason = user.error_type, user.error_condition, user.reason;
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   186
		end
10771
a0166932479f mod_register_ibr: Fix reporting of registration rejection reason
Kim Alvefur <zash@zash.se>
parents: 10372
diff changeset
   187
		log("debug", "Registration disallowed by module: %s", reason or "no reason given");
10367
1010a1ff8d21 mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents: 10294
diff changeset
   188
		session.send(st.error_reply(stanza, error_type or "modify", error_condition or "not-acceptable", reason));
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   189
		return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   190
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   191
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   192
	if usermanager_user_exists(username, host) then
10943
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   193
		if user.allow_reset == username then
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   194
			local ok, err = util_error.coerce(usermanager_set_password(username, password, host));
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   195
			if ok then
10950
84441c19750e mod_register_ibr: Add event for successful password reset
Matthew Wild <mwild1@gmail.com>
parents: 10943
diff changeset
   196
				module:fire_event("user-password-reset", user);
10943
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   197
				session.send(st.reply(stanza)); -- reset ok!
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   198
			else
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   199
				session.log("error", "Unable to reset password for %s@%s: %s", username, host, err);
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   200
				session.send(st.error_reply(stanza, err.type, err.condition, err.text));
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   201
			end
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   202
			return true;
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   203
		else
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   204
			log("debug", "Attempt to register with existing username");
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   205
			session.send(st.error_reply(stanza, "cancel", "conflict", "The requested username already exists."));
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   206
			return true;
99ae457c2459 mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents: 10771
diff changeset
   207
		end
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   208
	end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   209
13174
082c7d856e61 core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents: 12981
diff changeset
   210
	local created, err = usermanager_create_user_with_role(username, password, host, user.role);
10294
b2ce3300f26a mod_register_ibr: Distinguish between failure to create account or save extra data
Kim Alvefur <zash@zash.se>
parents: 10291
diff changeset
   211
	if created then
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   212
		data.registered = os.time();
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   213
		if not account_details:set(username, data) then
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   214
			log("debug", "Could not store extra details");
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   215
			usermanager_delete_user(username, host);
10294
b2ce3300f26a mod_register_ibr: Distinguish between failure to create account or save extra data
Kim Alvefur <zash@zash.se>
parents: 10291
diff changeset
   216
			session.send(st.error_reply(stanza, "wait", "internal-server-error", "Failed to write data to disk."));
8739
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   217
			return true;
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   218
		end
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   219
		session.send(st.reply(stanza)); -- user created!
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   220
		log("info", "User account created: %s@%s", username, host);
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   221
		module:fire_event("user-registered", {
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   222
			username = username, host = host, source = "mod_register",
a071c203a1a0 mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents: 8586
diff changeset
   223
			session = session });
3529
3f9cc12308aa mod_register: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3394
diff changeset
   224
	else
10294
b2ce3300f26a mod_register_ibr: Distinguish between failure to create account or save extra data
Kim Alvefur <zash@zash.se>
parents: 10291
diff changeset
   225
		log("debug", "Could not create user", err);
b2ce3300f26a mod_register_ibr: Distinguish between failure to create account or save extra data
Kim Alvefur <zash@zash.se>
parents: 10291
diff changeset
   226
		session.send(st.error_reply(stanza, "cancel", "feature-not-implemented", err));
3529
3f9cc12308aa mod_register: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3394
diff changeset
   227
	end
3f9cc12308aa mod_register: Updated to use the new events API.
Waqas Hussain <waqas20@gmail.com>
parents: 3394
diff changeset
   228
	return true;
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   229
end);