| 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; |