plugins/mod_register.lua
author Waqas Hussain <waqas20@gmail.com>
Sun, 23 Nov 2008 03:31:03 +0500
changeset 386 a47b6e8e133e
parent 311 513bd52e8e19
child 421 63be85693710
permissions -rw-r--r--
Account deletion support
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
local st = require "util.stanza";
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
local usermanager_user_exists = require "core.usermanager".user_exists;
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     4
local usermanager_create_user = require "core.usermanager".create_user;
386
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
     5
local datamanager_store = require "util.datamanager".store;
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
add_iq_handler("c2s", "jabber:iq:register", function (session, stanza)
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
	if stanza.tags[1].name == "query" then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
		local query = stanza.tags[1];
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
		if stanza.attr.type == "get" then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
			local reply = st.reply(stanza);
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
			reply:tag("query", {xmlns = "jabber:iq:register"})
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    13
				:tag("registered"):up()
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
				:tag("username"):text(session.username):up()
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    15
				:tag("password"):up();
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    16
			session.send(reply);
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    17
		elseif stanza.attr.type == "set" then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    18
			if query.tags[1] and query.tags[1].name == "remove" then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
				-- TODO delete user auth data, send iq response, kick all user resources with a <not-authorized/>, delete all user data
386
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    20
				--session.send(st.error_reply(stanza, "cancel", "not-allowed"));
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    21
				--return;
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    22
				usermanager_create_user(session.username, nil, session.host); -- Disable account
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    23
				-- FIXME the disabling currently allows a different user to recreate the account
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    24
				-- we should add an in-memory account block mode when we have threading
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    25
				session.send(st.reply(stanza));
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    26
				local roster = session.roster;
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    27
				for _, session in pairs(hosts[session.host].sessions[session.username].sessions) do -- disconnect all resources
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    28
					session:disconnect({condition = "not-authorized", text = "Account deleted"});
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    29
				end
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    30
				-- TODO datamanager should be able to delete all user data itself
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    31
				datamanager.store(session.username, session.host, "roster", nil);
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    32
				datamanager.store(session.username, session.host, "vCard", nil);
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    33
				datamanager.store(session.username, session.host, "private", nil);
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    34
				datamanager.store(session.username, session.host, "offline", nil);
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    35
				local bare = session.username.."@"..session.host;
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    36
				for jid, item in pairs(roster) do
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    37
					if jid ~= "pending" then
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    38
						if item.subscription == "both" or item.subscription == "to" then
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    39
							-- TODO unsubscribe
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    40
						end
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    41
						if item.subscription == "both" or item.subscription == "from" then
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    42
							-- TODO unsubscribe
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    43
						end
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    44
					end
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    45
				end
a47b6e8e133e Account deletion support
Waqas Hussain <waqas20@gmail.com>
parents: 311
diff changeset
    46
				datamanager.store(session.username, session.host, "accounts", nil); -- delete accounts datastore at the end
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
			else
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
				local username = query:child_with_name("username");
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
				local password = query:child_with_name("password");
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
				if username and password then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    51
					-- FIXME shouldn't use table.concat
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    52
					username = table.concat(username);
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    53
					password = table.concat(password);
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    54
					if username == session.username then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    55
						if usermanager_create_user(username, password, session.host) then -- password change -- TODO is this the right way?
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    56
							session.send(st.reply(stanza));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    57
						else
85
a115b99419ad Added: mod_register now replies with an error stanza when file write fails
Waqas Hussain <waqas20@gmail.com>
parents: 63
diff changeset
    58
							-- TODO unable to write file, file may be locked, etc, what's the correct error?
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    59
							session.send(st.error_reply(stanza, "wait", "internal-server-error"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
						end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    61
					else
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    62
						session.send(st.error_reply(stanza, "modify", "bad-request"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
					end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
				else
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    65
					session.send(st.error_reply(stanza, "modify", "bad-request"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
				end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
			end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
		end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
	else
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    70
		session.send(st.error_reply(stanza, "cancel", "service-unavailable"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
	end;
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
end);
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
add_iq_handler("c2s_unauthed", "jabber:iq:register", function (session, stanza)
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
	if stanza.tags[1].name == "query" then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
		local query = stanza.tags[1];
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
		if stanza.attr.type == "get" then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
			local reply = st.reply(stanza);
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
			reply:tag("query", {xmlns = "jabber:iq:register"})
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    80
				:tag("instructions"):text("Choose a username and password for use with this service."):up()
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    81
				:tag("username"):up()
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
				:tag("password"):up();
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    83
			session.send(reply);
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
		elseif stanza.attr.type == "set" then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
			if query.tags[1] and query.tags[1].name == "remove" then
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    86
				session.send(st.error_reply(stanza, "auth", "registration-required"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
			else
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    88
				local username = query:child_with_name("username");
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    89
				local password = query:child_with_name("password");
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
				if username and password then
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
					-- FIXME shouldn't use table.concat
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
					username = table.concat(username);
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
					password = table.concat(password);
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
					if usermanager_user_exists(username, session.host) then
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    95
						session.send(st.error_reply(stanza, "cancel", "conflict"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    96
					else
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    97
						if usermanager_create_user(username, password, session.host) then
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
    98
							session.send(st.reply(stanza)); -- user created!
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    99
						else
85
a115b99419ad Added: mod_register now replies with an error stanza when file write fails
Waqas Hussain <waqas20@gmail.com>
parents: 63
diff changeset
   100
							-- TODO unable to write file, file may be locked, etc, what's the correct error?
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
   101
							session.send(st.error_reply(stanza, "wait", "internal-server-error"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   102
						end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   103
					end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   104
				else
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
   105
					session.send(st.error_reply(stanza, "modify", "not-acceptable"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
				end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   107
			end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   108
		end
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   109
	else
311
513bd52e8e19 Fixed mod_register to use session.send for sending stanzas
Waqas Hussain <waqas20@gmail.com>
parents: 85
diff changeset
   110
		session.send(st.error_reply(stanza, "cancel", "service-unavailable"));
60
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   111
	end;
44800be871f5 User registration, etc (jabber:iq:register)
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   112
end);