Software /
code /
prosody
Comparison
plugins/mod_auth_internal_hashed.lua @ 5500:eeea0eb2602a
mod_auth_internal_hashed, mod_auth_internal_plain, mod_privacy, mod_private, mod_register, mod_vcard, mod_muc: Use module:open_store()
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 19 Apr 2013 16:14:06 +0200 |
parent | 5302:52fe5df91c65 |
child | 5776:bd0ff8ae98a8 |
comparison
equal
deleted
inserted
replaced
5498:2a67235e1d4d | 5500:eeea0eb2602a |
---|---|
5 -- | 5 -- |
6 -- This project is MIT/X11 licensed. Please see the | 6 -- This project is MIT/X11 licensed. Please see the |
7 -- COPYING file in the source package for more information. | 7 -- COPYING file in the source package for more information. |
8 -- | 8 -- |
9 | 9 |
10 local datamanager = require "util.datamanager"; | |
11 local log = require "util.logger".init("auth_internal_hashed"); | 10 local log = require "util.logger".init("auth_internal_hashed"); |
12 local getAuthenticationDatabaseSHA1 = require "util.sasl.scram".getAuthenticationDatabaseSHA1; | 11 local getAuthenticationDatabaseSHA1 = require "util.sasl.scram".getAuthenticationDatabaseSHA1; |
13 local usermanager = require "core.usermanager"; | 12 local usermanager = require "core.usermanager"; |
14 local generate_uuid = require "util.uuid".generate; | 13 local generate_uuid = require "util.uuid".generate; |
15 local new_sasl = require "util.sasl".new; | 14 local new_sasl = require "util.sasl".new; |
15 | |
16 local accounts = module:open_store("accounts"); | |
16 | 17 |
17 local to_hex; | 18 local to_hex; |
18 do | 19 do |
19 local function replace_byte_with_hex(byte) | 20 local function replace_byte_with_hex(byte) |
20 return ("%02x"):format(byte:byte()); | 21 return ("%02x"):format(byte:byte()); |
42 -- define auth provider | 43 -- define auth provider |
43 local provider = {}; | 44 local provider = {}; |
44 log("debug", "initializing internal_hashed authentication provider for host '%s'", host); | 45 log("debug", "initializing internal_hashed authentication provider for host '%s'", host); |
45 | 46 |
46 function provider.test_password(username, password) | 47 function provider.test_password(username, password) |
47 local credentials = datamanager.load(username, host, "accounts") or {}; | 48 local credentials = accounts:get(username) or {}; |
48 | 49 |
49 if credentials.password ~= nil and string.len(credentials.password) ~= 0 then | 50 if credentials.password ~= nil and string.len(credentials.password) ~= 0 then |
50 if credentials.password ~= password then | 51 if credentials.password ~= password then |
51 return nil, "Auth failed. Provided password is incorrect."; | 52 return nil, "Auth failed. Provided password is incorrect."; |
52 end | 53 end |
73 return nil, "Auth failed. Invalid username, password, or password hash information."; | 74 return nil, "Auth failed. Invalid username, password, or password hash information."; |
74 end | 75 end |
75 end | 76 end |
76 | 77 |
77 function provider.set_password(username, password) | 78 function provider.set_password(username, password) |
78 local account = datamanager.load(username, host, "accounts"); | 79 local account = accounts:get(username); |
79 if account then | 80 if account then |
80 account.salt = account.salt or generate_uuid(); | 81 account.salt = account.salt or generate_uuid(); |
81 account.iteration_count = account.iteration_count or iteration_count; | 82 account.iteration_count = account.iteration_count or iteration_count; |
82 local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, account.salt, account.iteration_count); | 83 local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, account.salt, account.iteration_count); |
83 local stored_key_hex = to_hex(stored_key); | 84 local stored_key_hex = to_hex(stored_key); |
85 | 86 |
86 account.stored_key = stored_key_hex | 87 account.stored_key = stored_key_hex |
87 account.server_key = server_key_hex | 88 account.server_key = server_key_hex |
88 | 89 |
89 account.password = nil; | 90 account.password = nil; |
90 return datamanager.store(username, host, "accounts", account); | 91 return accounts:set(username, account); |
91 end | 92 end |
92 return nil, "Account not available."; | 93 return nil, "Account not available."; |
93 end | 94 end |
94 | 95 |
95 function provider.user_exists(username) | 96 function provider.user_exists(username) |
96 local account = datamanager.load(username, host, "accounts"); | 97 local account = accounts:get(username); |
97 if not account then | 98 if not account then |
98 log("debug", "account not found for username '%s' at host '%s'", username, host); | 99 log("debug", "account not found for username '%s' at host '%s'", username, host); |
99 return nil, "Auth failed. Invalid username"; | 100 return nil, "Auth failed. Invalid username"; |
100 end | 101 end |
101 return true; | 102 return true; |
102 end | 103 end |
103 | 104 |
104 function provider.users() | 105 function provider.users() |
105 return datamanager.users(host, "accounts"); | 106 return accounts:users(); |
106 end | 107 end |
107 | 108 |
108 function provider.create_user(username, password) | 109 function provider.create_user(username, password) |
109 if password == nil then | 110 if password == nil then |
110 return datamanager.store(username, host, "accounts", {}); | 111 return accounts:set(username, {}); |
111 end | 112 end |
112 local salt = generate_uuid(); | 113 local salt = generate_uuid(); |
113 local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, salt, iteration_count); | 114 local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, salt, iteration_count); |
114 local stored_key_hex = to_hex(stored_key); | 115 local stored_key_hex = to_hex(stored_key); |
115 local server_key_hex = to_hex(server_key); | 116 local server_key_hex = to_hex(server_key); |
116 return datamanager.store(username, host, "accounts", {stored_key = stored_key_hex, server_key = server_key_hex, salt = salt, iteration_count = iteration_count}); | 117 return accounts:set(username, {stored_key = stored_key_hex, server_key = server_key_hex, salt = salt, iteration_count = iteration_count}); |
117 end | 118 end |
118 | 119 |
119 function provider.delete_user(username) | 120 function provider.delete_user(username) |
120 return datamanager.store(username, host, "accounts", nil); | 121 return accounts:set(username, nil); |
121 end | 122 end |
122 | 123 |
123 function provider.get_sasl_handler() | 124 function provider.get_sasl_handler() |
124 local testpass_authentication_profile = { | 125 local testpass_authentication_profile = { |
125 plain_test = function(sasl, username, password, realm) | 126 plain_test = function(sasl, username, password, realm) |
126 return usermanager.test_password(username, realm, password), true; | 127 return usermanager.test_password(username, realm, password), true; |
127 end, | 128 end, |
128 scram_sha_1 = function(sasl, username, realm) | 129 scram_sha_1 = function(sasl, username, realm) |
129 local credentials = datamanager.load(username, host, "accounts"); | 130 local credentials = accounts:get(username); |
130 if not credentials then return; end | 131 if not credentials then return; end |
131 if credentials.password then | 132 if credentials.password then |
132 usermanager.set_password(username, credentials.password, host); | 133 usermanager.set_password(username, credentials.password, host); |
133 credentials = datamanager.load(username, host, "accounts"); | 134 credentials = accounts:get(username); |
134 if not credentials then return; end | 135 if not credentials then return; end |
135 end | 136 end |
136 | 137 |
137 local stored_key, server_key, iteration_count, salt = credentials.stored_key, credentials.server_key, credentials.iteration_count, credentials.salt; | 138 local stored_key, server_key, iteration_count, salt = credentials.stored_key, credentials.server_key, credentials.iteration_count, credentials.salt; |
138 stored_key = stored_key and from_hex(stored_key); | 139 stored_key = stored_key and from_hex(stored_key); |