Software / code / prosody
Comparison
plugins/mod_auth_internal_hashed.lua @ 10563:e8db377a2983
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Tue, 24 Dec 2019 00:39:45 +0100 |
| parent | 10522:b1ca849b8e3a |
| parent | 10219:d58925bb74ca |
| child | 10916:c7ed8f754033 |
comparison
equal
deleted
inserted
replaced
| 10562:670afc079f68 | 10563:e8db377a2983 |
|---|---|
| 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 max = math.max; | 10 local max = math.max; |
| 11 | 11 |
| 12 local getAuthenticationDatabaseSHA1 = require "util.sasl.scram".getAuthenticationDatabaseSHA1; | 12 local scram_hashers = require "util.sasl.scram".hashers; |
| 13 local usermanager = require "core.usermanager"; | 13 local usermanager = require "core.usermanager"; |
| 14 local generate_uuid = require "util.uuid".generate; | 14 local generate_uuid = require "util.uuid".generate; |
| 15 local new_sasl = require "util.sasl".new; | 15 local new_sasl = require "util.sasl".new; |
| 16 local hex = require"util.hex"; | 16 local hex = require"util.hex"; |
| 17 local to_hex, from_hex = hex.to, hex.from; | 17 local to_hex, from_hex = hex.to, hex.from; |
| 19 local log = module._log; | 19 local log = module._log; |
| 20 local host = module.host; | 20 local host = module.host; |
| 21 | 21 |
| 22 local accounts = module:open_store("accounts"); | 22 local accounts = module:open_store("accounts"); |
| 23 | 23 |
| 24 | 24 local hash_name = module:get_option_string("password_hash", "SHA-1"); |
| 25 local get_auth_db = assert(scram_hashers[hash_name], "SCRAM-"..hash_name.." not supported by SASL library"); | |
| 26 local scram_name = "scram_"..hash_name:gsub("%-","_"):lower(); | |
| 25 | 27 |
| 26 -- Default; can be set per-user | 28 -- Default; can be set per-user |
| 27 local default_iteration_count = 4096; | 29 local default_iteration_count = 4096; |
| 28 | 30 |
| 29 -- define auth provider | 31 -- define auth provider |
| 47 | 49 |
| 48 if credentials.iteration_count == nil or credentials.salt == nil or string.len(credentials.salt) == 0 then | 50 if credentials.iteration_count == nil or credentials.salt == nil or string.len(credentials.salt) == 0 then |
| 49 return nil, "Auth failed. Stored salt and iteration count information is not complete."; | 51 return nil, "Auth failed. Stored salt and iteration count information is not complete."; |
| 50 end | 52 end |
| 51 | 53 |
| 52 local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, credentials.salt, credentials.iteration_count); | 54 local valid, stored_key, server_key = get_auth_db(password, credentials.salt, credentials.iteration_count); |
| 53 | 55 |
| 54 local stored_key_hex = to_hex(stored_key); | 56 local stored_key_hex = to_hex(stored_key); |
| 55 local server_key_hex = to_hex(server_key); | 57 local server_key_hex = to_hex(server_key); |
| 56 | 58 |
| 57 if valid and stored_key_hex == credentials.stored_key and server_key_hex == credentials.server_key then | 59 if valid and stored_key_hex == credentials.stored_key and server_key_hex == credentials.server_key then |
| 65 log("debug", "set_password for username '%s'", username); | 67 log("debug", "set_password for username '%s'", username); |
| 66 local account = accounts:get(username); | 68 local account = accounts:get(username); |
| 67 if account then | 69 if account then |
| 68 account.salt = generate_uuid(); | 70 account.salt = generate_uuid(); |
| 69 account.iteration_count = max(account.iteration_count or 0, default_iteration_count); | 71 account.iteration_count = max(account.iteration_count or 0, default_iteration_count); |
| 70 local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, account.salt, account.iteration_count); | 72 local valid, stored_key, server_key = get_auth_db(password, account.salt, account.iteration_count); |
| 71 if not valid then | 73 if not valid then |
| 72 return valid, stored_key; | 74 return valid, stored_key; |
| 73 end | 75 end |
| 74 local stored_key_hex = to_hex(stored_key); | 76 local stored_key_hex = to_hex(stored_key); |
| 75 local server_key_hex = to_hex(server_key); | 77 local server_key_hex = to_hex(server_key); |
| 99 function provider.create_user(username, password) | 101 function provider.create_user(username, password) |
| 100 if password == nil then | 102 if password == nil then |
| 101 return accounts:set(username, {}); | 103 return accounts:set(username, {}); |
| 102 end | 104 end |
| 103 local salt = generate_uuid(); | 105 local salt = generate_uuid(); |
| 104 local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, salt, default_iteration_count); | 106 local valid, stored_key, server_key = get_auth_db(password, salt, default_iteration_count); |
| 105 if not valid then | 107 if not valid then |
| 106 return valid, stored_key; | 108 return valid, stored_key; |
| 107 end | 109 end |
| 108 local stored_key_hex = to_hex(stored_key); | 110 local stored_key_hex = to_hex(stored_key); |
| 109 local server_key_hex = to_hex(server_key); | 111 local server_key_hex = to_hex(server_key); |
| 120 function provider.get_sasl_handler() | 122 function provider.get_sasl_handler() |
| 121 local testpass_authentication_profile = { | 123 local testpass_authentication_profile = { |
| 122 plain_test = function(_, username, password, realm) | 124 plain_test = function(_, username, password, realm) |
| 123 return usermanager.test_password(username, realm, password), true; | 125 return usermanager.test_password(username, realm, password), true; |
| 124 end, | 126 end, |
| 125 scram_sha_1 = function(_, username) | 127 [scram_name] = function(_, username) |
| 126 local credentials = accounts:get(username); | 128 local credentials = accounts:get(username); |
| 127 if not credentials then return; end | 129 if not credentials then return; end |
| 128 if credentials.password then | 130 if credentials.password then |
| 129 if provider.set_password(username, credentials.password) == nil then | 131 if provider.set_password(username, credentials.password) == nil then |
| 130 return nil, "Auth failed. Could not set hashed password from plaintext."; | 132 return nil, "Auth failed. Could not set hashed password from plaintext."; |