Software / code / prosody
Annotate
plugins/mod_register_ibr.lua @ 13186:affaf6d08d26
util.datamanager: Pad list writes to avoid crossing block boundaries
By padding items so that they do not cross block boundaries, it becomes
eaiser to delete whole blocks with fallocate() without cutting items
in half, improving efficiency of such operations.
Since list stores are used for message archives, where the most common
deletion operation would be of the oldest entires, at the top of the
file. With this, all blocks that contain items to be removed could be
deleted without needing to read, delete and write out the whole file.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 07 Jun 2023 00:39:30 +0200 |
| parent | 13170:082c7d856e61 |
| child | 13232:e0ab20519ce5 |
| rev | line source |
|---|---|
|
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 | 5 -- This project is MIT/X11 licensed. Please see the |
| 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 |
|
12977
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12330
diff
changeset
|
10 local st = require "prosody.util.stanza"; |
|
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12330
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:
12330
diff
changeset
|
12 local usermanager_user_exists = require "prosody.core.usermanager".user_exists; |
|
13170
082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents:
12977
diff
changeset
|
13 local usermanager_create_user_with_role = require "prosody.core.usermanager".create_user_with_role; |
|
12977
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12330
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:
12330
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:
12330
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:
12330
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 |
|
4398
acc37e221940
mod_register: Add support for additional registration fields
Florian Zeitz <florob@babelmonkeys.de>
parents:
4270
diff
changeset
|
19 local additional_fields = module:get_option("additional_registration_fields", {}); |
|
8484
f591855f060d
mod_register: Split into mod_register_ibr and mod_user_account_management (#723)
Kim Alvefur <zash@zash.se>
parents:
8464
diff
changeset
|
20 local require_encryption = module:get_option_boolean("c2s_require_encryption", |
|
12330
38b5b05407be
various: Require encryption by default for real
Kim Alvefur <zash@zash.se>
parents:
10946
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 |
|
13170
082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents:
12977
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:
12977
diff
changeset
|
24 |
|
9608
3e44b8dc2cc0
mod_register: Move dependency on mod_register_limits into mod_register_ibr
Kim Alvefur <zash@zash.se>
parents:
9453
diff
changeset
|
25 pcall(function () |
|
3e44b8dc2cc0
mod_register: Move dependency on mod_register_limits into mod_register_ibr
Kim Alvefur <zash@zash.se>
parents:
9453
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:
9453
diff
changeset
|
27 end); |
|
3e44b8dc2cc0
mod_register: Move dependency on mod_register_limits into mod_register_ibr
Kim Alvefur <zash@zash.se>
parents:
9453
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 = { |
|
10281
f90abf142d53
mod_register_ibr: Add FORM_TYPE as required by XEP-0077.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9608
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 |
|
7812
2bc339352dcd
mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents:
7754
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:
7754
diff
changeset
|
50 "Creating a new account"); |
|
2bc339352dcd
mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents:
7754
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:
7754
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:
7754
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{ |
|
7812
2bc339352dcd
mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents:
7754
diff
changeset
|
55 title = title; |
|
2bc339352dcd
mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents:
7754
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 |
|
10281
f90abf142d53
mod_register_ibr: Add FORM_TYPE as required by XEP-0077.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9608
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"}) |
|
7812
2bc339352dcd
mod_register: Allow 'title' and 'instructions' fields to be customized
Kim Alvefur <zash@zash.se>
parents:
7754
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; |
|
7816
2624f4ee34a2
mod_register: Fix syntax errors
Kim Alvefur <zash@zash.se>
parents:
7815
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 |
|
7814
2120d71b0d56
mod_register: Strip '+' char from field names without using length
Kim Alvefur <zash@zash.se>
parents:
7812
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(); |
|
7815
f8d25a2e80ea
mod_register: Verify that fields are known to prevent traceback
Kim Alvefur <zash@zash.se>
parents:
7814
diff
changeset
|
79 else |
|
f8d25a2e80ea
mod_register: Verify that fields are known to prevent traceback
Kim Alvefur <zash@zash.se>
parents:
7814
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 | 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. |
|
8484
f591855f060d
mod_register: Split into mod_register_ibr and mod_user_account_management (#723)
Kim Alvefur <zash@zash.se>
parents:
8464
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 |
|
8194
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:
8192
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; |
|
7017
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 |
|
8484
f591855f060d
mod_register: Split into mod_register_ibr and mod_user_account_management (#723)
Kim Alvefur <zash@zash.se>
parents:
8464
diff
changeset
|
125 if session.type ~= "c2s_unauthed" then |
|
7709
0af1783d1592
mod_register: Additional logging for various registration failure cases
Kim Alvefur <zash@zash.se>
parents:
7570
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")); |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
diff
changeset
|
129 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
130 |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
131 if require_encryption and not session.secure then |
|
7916
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")); |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
diff
changeset
|
134 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
135 |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
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:
8583
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:
8583
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:
8583
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:
8583
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:
8583
diff
changeset
|
142 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
143 |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
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:
8583
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:
8583
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:
8583
diff
changeset
|
148 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
149 |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
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:
8583
diff
changeset
|
152 log("debug", "Error parsing registration form:"); |
|
8737
6d71845bf56f
mod_register_ibr: Return a textual error to the user for problems with parsing form data
Kim Alvefur <zash@zash.se>
parents:
8736
diff
changeset
|
153 local textual_errors = {}; |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
diff
changeset
|
155 log("debug", "Field %q: %s", field, err); |
|
8737
6d71845bf56f
mod_register_ibr: Return a textual error to the user for problems with parsing form data
Kim Alvefur <zash@zash.se>
parents:
8736
diff
changeset
|
156 table.insert(textual_errors, ("%s: %s"):format(field:gsub("^%a", string.upper), err)); |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
157 end |
|
8737
6d71845bf56f
mod_register_ibr: Return a textual error to the user for problems with parsing form data
Kim Alvefur <zash@zash.se>
parents:
8736
diff
changeset
|
158 session.send(st.error_reply(stanza, "modify", "not-acceptable", table.concat(textual_errors, "\n"))); |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
diff
changeset
|
160 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
161 |
|
10368
76eb79d372de
mod_register_ibr: Enforce strict JID validation
Kim Alvefur <zash@zash.se>
parents:
10363
diff
changeset
|
162 local username, password = nodeprep(data.username, true), data.password; |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
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:
8583
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:
8583
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:
8583
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:
8583
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:
8583
diff
changeset
|
169 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
170 |
|
13170
082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents:
12977
diff
changeset
|
171 local user = { |
|
082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents:
12977
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:
12977
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:
12977
diff
changeset
|
174 role = default_role; |
|
082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents:
12977
diff
changeset
|
175 allowed = true; |
|
082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents:
12977
diff
changeset
|
176 }; |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
diff
changeset
|
178 if not user.allowed then |
|
10363
1010a1ff8d21
mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents:
10290
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:
10290
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:
10290
diff
changeset
|
181 if err then |
|
1010a1ff8d21
mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents:
10290
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:
10290
diff
changeset
|
183 else |
|
1010a1ff8d21
mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents:
10290
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:
10290
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:
10290
diff
changeset
|
186 end |
|
10767
a0166932479f
mod_register_ibr: Fix reporting of registration rejection reason
Kim Alvefur <zash@zash.se>
parents:
10368
diff
changeset
|
187 log("debug", "Registration disallowed by module: %s", reason or "no reason given"); |
|
10363
1010a1ff8d21
mod_register_ibr: Allow registartion rejection reason as util.error object
Kim Alvefur <zash@zash.se>
parents:
10290
diff
changeset
|
188 session.send(st.error_reply(stanza, error_type or "modify", error_condition or "not-acceptable", reason)); |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
diff
changeset
|
190 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
191 |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
192 if usermanager_user_exists(username, host) then |
|
10939
99ae457c2459
mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents:
10767
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:
10767
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:
10767
diff
changeset
|
195 if ok then |
|
10946
84441c19750e
mod_register_ibr: Add event for successful password reset
Matthew Wild <mwild1@gmail.com>
parents:
10939
diff
changeset
|
196 module:fire_event("user-password-reset", user); |
|
10939
99ae457c2459
mod_register_ibr: Allow registration to reset an existing account password if permitted by a plugin
Matthew Wild <mwild1@gmail.com>
parents:
10767
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:
10767
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:
10767
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:
10767
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:
10767
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:
10767
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:
10767
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:
10767
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:
10767
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:
10767
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:
10767
diff
changeset
|
207 end |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
208 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
diff
changeset
|
209 |
|
13170
082c7d856e61
core, plugins: Split prosody:user role into prosody:{guest,registered,member}
Matthew Wild <mwild1@gmail.com>
parents:
12977
diff
changeset
|
210 local created, err = usermanager_create_user_with_role(username, password, host, user.role); |
|
10290
b2ce3300f26a
mod_register_ibr: Distinguish between failure to create account or save extra data
Kim Alvefur <zash@zash.se>
parents:
10287
diff
changeset
|
211 if created then |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
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:
8583
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:
8583
diff
changeset
|
215 usermanager_delete_user(username, host); |
|
10290
b2ce3300f26a
mod_register_ibr: Distinguish between failure to create account or save extra data
Kim Alvefur <zash@zash.se>
parents:
10287
diff
changeset
|
216 session.send(st.error_reply(stanza, "wait", "internal-server-error", "Failed to write data to disk.")); |
|
8736
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
diff
changeset
|
218 end |
|
a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
Kim Alvefur <zash@zash.se>
parents:
8583
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:
8583
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:
8583
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:
8583
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:
8583
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 |
|
10290
b2ce3300f26a
mod_register_ibr: Distinguish between failure to create account or save extra data
Kim Alvefur <zash@zash.se>
parents:
10287
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:
10287
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); |