Software /
code /
prosody
Diff
plugins/mod_hashpassauth.lua @ 3166:3c46cb94caed
Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
author | Jeff Mitchell <jeff@jefferai.org> |
---|---|
date | Thu, 27 May 2010 10:54:11 -0400 |
parent | 3164:db9def53fe9c |
child | 3167:546695e80e0a |
line wrap: on
line diff
--- a/plugins/mod_hashpassauth.lua Thu May 27 09:20:08 2010 -0400 +++ b/plugins/mod_hashpassauth.lua Thu May 27 10:54:11 2010 -0400 @@ -32,22 +32,28 @@ log("debug", "initializing hashpass authentication provider for host '%s'", host); function provider.test_password(username, password) - log("debug", "test password for user %s at host %s", username, module.host); if is_cyrus(host) then return nil, "Legacy auth not supported with Cyrus SASL."; end local credentials = datamanager.load(username, host, "accounts") or {}; - if credentials.hashpass == nil or credentials.iteration_count == nil or credentials.salt == nil then - return nil, "Auth failed. Stored credential information is not complete."; + if credentials.iteration_count == nil or credentials.salt == nil or string.len(credentials.salt) == 0 then + return nil, "Auth failed. Stored salt and iteration count information is not complete."; + end + + if credentials.password ~= nil and string.len(credentials.password) ~= 0 then + if credentials.password ~= password then + return nil, "Auth failed. Provided password is incorrect."; + end + + if provider.set_password(username, credentials.password) == nil then + return nil, "Auth failed. Could not set hashed password from plaintext."; + else + return true; + end end local valid, binpass = saltedPasswordSHA1(password, credentials.salt, credentials.iteration_count); local hexpass = binpass:gsub(".", function (c) return ("%02x"):format(c:byte()); end); - if valid then - log("debug", "salted password returned valid"); - else - log("debug", "salted password returned not valid"); - end - log("debug", "hexpass is '%s', stored pass is '%s'", hexpass, credentials.hashpass); + if valid and hexpass == credentials.hashpass then return true; else @@ -56,9 +62,16 @@ end function provider.get_password(username) - log("debug", "get_password for username '%s' at host '%s'", username, module.host); if is_cyrus(host) then return nil, "Passwords unavailable for Cyrus SASL."; end - return (datamanager.load(username, host, "accounts") or {}).hashpass; + local credentials = datamanager.load(username, host, "accounts") or {}; + if(credentials.password ~= nil or (credentials.password ~= nil and string.len(credentials.password) ~= 0)) then + if provider.set_password(username, credentials.password) == nil then + return nil, "Problem setting plaintext password to hashed password."; + end + credentials = datamanager.load(username, host, "accounts"); + return credentials.hashpass; + end + return credentials.hashpass; end function provider.set_password(username, password) @@ -77,6 +90,7 @@ local hexpass = binpass:gsub(".", function (c) return ("%02x"):format(c:byte()); end); account.hashpass = hexpass; + account.password = nil; return datamanager.store(username, host, "accounts", account); end return nil, "Account not available."; @@ -89,7 +103,7 @@ log("debug", "account not found for username '%s' at host '%s'", username, module.host); return nil, "Auth failed. Invalid username"; end - if account.hashpass == nil or string.len(account.hashpass) == 0 then + if (account.hashpass == nil or string.len(account.hashpass) == 0) and (account.password == nil or string.len(account.password) == 0) then log("debug", "account password not set or zero-length for username '%s' at host '%s'", username, module.host); return nil, "Auth failed. Password invalid."; end