Software /
code /
prosody
Comparison
core/usermanager.lua @ 3160:9064dd006b21
First bit of work
author | Jeff Mitchell <jeff@jefferai.org> |
---|---|
date | Thu, 20 May 2010 11:51:24 -0400 |
parent | 3159:b01a699ddf64 |
child | 3161:73e93a48c0c1 |
comparison
equal
deleted
inserted
replaced
3159:b01a699ddf64 | 3160:9064dd006b21 |
---|---|
20 | 20 |
21 local prosody = _G.prosody; | 21 local prosody = _G.prosody; |
22 | 22 |
23 module "usermanager" | 23 module "usermanager" |
24 | 24 |
25 local new_default_provider; | |
26 | |
27 local function host_handler(host) | 25 local function host_handler(host) |
28 local host_session = hosts[host]; | 26 local host_session = hosts[host]; |
29 host_session.events.add_handler("item-added/auth-provider", function (provider) | 27 host_session.events.add_handler("item-added/auth-provider", function (provider) |
28 log("debug", "authentication provider = '%s'", config.get(host, "core", "authentication")); | |
30 if config.get(host, "core", "authentication") == provider.name then | 29 if config.get(host, "core", "authentication") == provider.name then |
31 host_session.users = provider; | 30 host_session.users = provider; |
32 end | 31 end |
33 end); | 32 end); |
34 host_session.events.add_handler("item-removed/auth-provider", function (provider) | 33 host_session.events.add_handler("item-removed/auth-provider", function (provider) |
35 if host_session.users == provider then | 34 if host_session.users == provider then |
36 host_session.users = new_default_provider(host); | 35 userplugins.new_default_provider(host); |
37 end | 36 end |
38 end); | 37 end); |
39 host_session.users = new_default_provider(host); -- Start with the default usermanager provider | 38 if host_session.users ~= nil then |
39 log("debug", "using non-default authentication provider"); | |
40 else | |
41 log("debug", "using default authentication provider"); | |
42 host_session.users = new_default_provider(host); -- Start with the default usermanager provider | |
43 end | |
40 end | 44 end |
41 prosody.events.add_handler("host-activated", host_handler); | 45 prosody.events.add_handler("host-activated", host_handler); |
42 prosody.events.add_handler("component-activated", host_handler); | 46 prosody.events.add_handler("component-activated", host_handler); |
43 | 47 |
44 local function is_cyrus(host) return config.get(host, "core", "sasl_backend") == "cyrus"; end | 48 local function is_cyrus(host) return config.get(host, "core", "sasl_backend") == "cyrus"; end |
45 | |
46 function new_default_provider(host) | |
47 local provider = { name = "default" }; | |
48 | |
49 function provider.test_password(username, password) | |
50 if is_cyrus(host) then return nil, "Legacy auth not supported with Cyrus SASL."; end | |
51 local credentials = datamanager.load(username, host, "accounts") or {}; | |
52 | |
53 if password == credentials.password then | |
54 return true; | |
55 else | |
56 return nil, "Auth failed. Invalid username or password."; | |
57 end | |
58 end | |
59 | |
60 function provider.get_password(username) | |
61 if is_cyrus(host) then return nil, "Passwords unavailable for Cyrus SASL."; end | |
62 return (datamanager.load(username, host, "accounts") or {}).password; | |
63 end | |
64 | |
65 function provider.set_password(username, password) | |
66 if is_cyrus(host) then return nil, "Passwords unavailable for Cyrus SASL."; end | |
67 local account = datamanager.load(username, host, "accounts"); | |
68 if account then | |
69 account.password = password; | |
70 return datamanager.store(username, host, "accounts", account); | |
71 end | |
72 return nil, "Account not available."; | |
73 end | |
74 | |
75 function provider.user_exists(username) | |
76 if not(require_provisioning) and is_cyrus(host) then return true; end | |
77 local account, err = datamanager.load(username, host, "accounts") ~= nil; -- FIXME also check for empty credentials | |
78 return (account or err) ~= nil; -- FIXME also check for empty credentials | |
79 end | |
80 | |
81 function provider.create_user(username, password) | |
82 if not(require_provisioning) and is_cyrus(host) then return nil, "Account creation/modification not available with Cyrus SASL."; end | |
83 return datamanager.store(username, host, "accounts", {password = password}); | |
84 end | |
85 | |
86 function provider.get_supported_methods() | |
87 return {["PLAIN"] = true, ["DIGEST-MD5"] = true}; -- TODO this should be taken from the config | |
88 end | |
89 | |
90 function provider.is_admin(jid) | |
91 local admins = config.get(host, "core", "admins"); | |
92 if admins ~= config.get("*", "core", "admins") then | |
93 if type(admins) == "table" then | |
94 jid = jid_bare(jid); | |
95 for _,admin in ipairs(admins) do | |
96 if admin == jid then return true; end | |
97 end | |
98 elseif admins then | |
99 log("error", "Option 'admins' for host '%s' is not a table", host); | |
100 end | |
101 end | |
102 return is_admin(jid); -- Test whether it's a global admin instead | |
103 end | |
104 return provider; | |
105 end | |
106 | 49 |
107 function validate_credentials(host, username, password, method) | 50 function validate_credentials(host, username, password, method) |
108 return hosts[host].users.test_password(username, password); | 51 return hosts[host].users.test_password(username, password); |
109 end | 52 end |
110 | 53 |