core/usermanager.lua

1
-- Prosody IM
2
-- Copyright (C) 2008-2010 Matthew Wild
3
-- Copyright (C) 2008-2010 Waqas Hussain
4
--
5
-- This project is MIT/X11 licensed. Please see the
6
-- COPYING file in the source package for more information.
7
--
8
 
9
local modulemanager = require "core.modulemanager";
10
local log = require "util.logger".init("usermanager");
11
local type = type;
12
local ipairs = ipairs;
13
local jid_bare = require "util.jid".bare;
14
local config = require "core.configmanager";
15
local hosts = hosts;
16
local sasl_new = require "util.sasl".new;
17
 
18
local prosody = _G.prosody;
19
 
20
local setmetatable = setmetatable;
21
 
22
local default_provider = "internal_plain";
23
 
24
module "usermanager"
25
 
26
function new_null_provider()
27
	local function dummy() end;
28
	local function dummy_get_sasl_handler() return sasl_new(nil, {}); end
29
	return setmetatable({name = "null", get_sasl_handler = dummy_get_sasl_handler}, { __index = function() return dummy; end });
30
end
31
 
32
function initialize_host(host)
33
	local host_session = hosts[host];
34
	if host_session.type ~= "local" then return; end
35
	
36
	host_session.events.add_handler("item-added/auth-provider", function (event)
37
		local provider = event.item;
38
		local auth_provider = config.get(host, "core", "authentication") or default_provider;
39
		if config.get(host, "core", "anonymous_login") then auth_provider = "anonymous"; end -- COMPAT 0.7
40
		if provider.name == auth_provider then
41
			host_session.users = provider;
42
		end
43
		if host_session.users ~= nil and host_session.users.name ~= nil then
44
			log("debug", "host '%s' now set to use user provider '%s'", host, host_session.users.name);
45
		end
46
	end);
47
	host_session.events.add_handler("item-removed/auth-provider", function (event)
48
		local provider = event.item;
49
		if host_session.users == provider then
50
			host_session.users = new_null_provider();
51
		end
52
	end);
53
	host_session.users = new_null_provider(); -- Start with the default usermanager provider
54
	local auth_provider = config.get(host, "core", "authentication") or default_provider;
55
	if config.get(host, "core", "anonymous_login") then auth_provider = "anonymous"; end -- COMPAT 0.7
56
	if auth_provider ~= "null" then
57
		modulemanager.load(host, "auth_"..auth_provider);
58
	end
59
end;
60
prosody.events.add_handler("host-activated", initialize_host, 100);
61
 
62
function test_password(username, host, password)
63
	return hosts[host].users.test_password(username, password);
64
end
65
 
66
function get_password(username, host)
67
	return hosts[host].users.get_password(username);
68
end
69
 
70
function set_password(username, password, host)
71
	return hosts[host].users.set_password(username, password);
72
end
73
 
74
function user_exists(username, host)
75
	return hosts[host].users.user_exists(username);
76
end
77
 
78
function create_user(username, password, host)
79
	return hosts[host].users.create_user(username, password);
80
end
81
 
82
function get_sasl_handler(host)
83
	return hosts[host].users.get_sasl_handler();
84
end
85
 
86
function get_provider(host)
87
	return hosts[host].users;
88
end
89
 
90
function is_admin(jid, host)
91
	local is_admin;
92
	jid = jid_bare(jid);
93
	host = host or "*";
94
	
95
	local host_admins = config.get(host, "core", "admins");
96
	local global_admins = config.get("*", "core", "admins");
97
	
98
	if host_admins and host_admins ~= global_admins then
99
		if type(host_admins) == "table" then
100
			for _,admin in ipairs(host_admins) do
101
				if admin == jid then
102
					is_admin = true;
103
					break;
104
				end
105
			end
106
		elseif host_admins then
107
			log("error", "Option 'admins' for host '%s' is not a list", host);
108
		end
109
	end
110
	
111
	if not is_admin and global_admins then
112
		if type(global_admins) == "table" then
113
			for _,admin in ipairs(global_admins) do
114
				if admin == jid then
115
					is_admin = true;
116
					break;
117
				end
118
			end
119
		elseif global_admins then
120
			log("error", "Global option 'admins' is not a list");
121
		end
122
	end
123
	
124
	-- Still not an admin, check with auth provider
125
	if not is_admin and host ~= "*" and hosts[host].users and hosts[host].users.is_admin then
126
		is_admin = hosts[host].users.is_admin(jid);
127
	end
128
	return is_admin or false;
129
end
130
 
131
return _M;