plugins/mod_auth_internal_hashed.lua
author Matthew Wild <mwild1@gmail.com>
Tue, 04 Jan 2011 17:12:28 +0000
changeset 3994 42899d5efe3b
parent 3981 2b0b8fe68df2
child 4160 f08f649b898b
permissions -rw-r--r--
mod_auth_internal_*: Support for delete_user method
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     1
-- Prosody IM
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     4
-- Copyright (C) 2010 Jeff Mitchell
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     5
--
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     6
-- This project is MIT/X11 licensed. Please see the
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     7
-- COPYING file in the source package for more information.
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     8
--
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
     9
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    10
local datamanager = require "util.datamanager";
3269
342fd8f8ccd9 mod_auth_internal_hashed: Log as "auth_internal_hashed", not as "usermanager".
Waqas Hussain <waqas20@gmail.com>
parents: 3268
diff changeset
    11
local log = require "util.logger".init("auth_internal_hashed");
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    12
local type = type;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    13
local error = error;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    14
local ipairs = ipairs;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    15
local hashes = require "util.hashes";
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    16
local jid_bare = require "util.jid".bare;
3205
2dcd826bbbc6 mod_auth_internal_hashed: Store StoredKey and ServerKey instead of salted hashed password.
Tobias Markmann <tm@ayena.de>
parents: 3189
diff changeset
    17
local getAuthenticationDatabaseSHA1 = require "util.sasl.scram".getAuthenticationDatabaseSHA1;
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    18
local config = require "core.configmanager";
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    19
local usermanager = require "core.usermanager";
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    20
local generate_uuid = require "util.uuid".generate;
3186
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
    21
local new_sasl = require "util.sasl".new;
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
    22
local nodeprep = require "util.encodings".stringprep.nodeprep;
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    23
local hosts = hosts;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    24
3289
180a0b3b018d mod_auth_internal_hashed: Update TODO comments to COMPAT
Matthew Wild <mwild1@gmail.com>
parents: 3288
diff changeset
    25
-- COMPAT w/old trunk: remove these two lines before 0.8 release
3208
4b660bf61048 mod_auth_internal_hashed: Coverting salted password to stored_key and server_key.
Tobias Markmann <tm@ayena.de>
parents: 3207
diff changeset
    26
local hmac_sha1 = require "util.hmac".sha1;
4b660bf61048 mod_auth_internal_hashed: Coverting salted password to stored_key and server_key.
Tobias Markmann <tm@ayena.de>
parents: 3207
diff changeset
    27
local sha1 = require "util.hashes".sha1;
4b660bf61048 mod_auth_internal_hashed: Coverting salted password to stored_key and server_key.
Tobias Markmann <tm@ayena.de>
parents: 3207
diff changeset
    28
3288
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    29
local to_hex;
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    30
do
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    31
	local function replace_byte_with_hex(byte)
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    32
		return ("%02x"):format(byte:byte());
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    33
	end
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    34
	function to_hex(binary_string)
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    35
		return binary_string:gsub(".", replace_byte_with_hex);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    36
	end
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    37
end
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    38
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    39
local from_hex;
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    40
do
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    41
	local function replace_hex_with_byte(hex)
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    42
		return string.char(tonumber(hex, 16));
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    43
	end
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    44
	function from_hex(hex_string)
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    45
		return hex_string:gsub("..", replace_hex_with_byte);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    46
	end
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    47
end
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    48
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    49
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    50
local prosody = _G.prosody;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    51
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    52
-- Default; can be set per-user
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    53
local iteration_count = 4096;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    54
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    55
function new_hashpass_provider(host)
3180
99be525bcfb4 Rename mod_defaultauth -> mod_auth_internal, mod_hashpassauth -> mod_auth_internal_hashed, and the providers to internal and internal_hashed respectively. Also no longer auto-load defaultauth, but instead auto-load the plugin selected for each host at startup based on the provider name.
Matthew Wild <mwild1@gmail.com>
parents: 3167
diff changeset
    56
	local provider = { name = "internal_hashed" };
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    57
	log("debug", "initializing hashpass authentication provider for host '%s'", host);
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    58
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    59
	function provider.test_password(username, password)
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    60
		local credentials = datamanager.load(username, host, "accounts") or {};
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    61
	
3166
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    62
		if credentials.password ~= nil and string.len(credentials.password) ~= 0 then
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    63
			if credentials.password ~= password then
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    64
				return nil, "Auth failed. Provided password is incorrect.";
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    65
			end
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    66
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    67
			if provider.set_password(username, credentials.password) == nil then
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    68
				return nil, "Auth failed. Could not set hashed password from plaintext.";
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    69
			else
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    70
				return true;
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
    71
			end
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    72
		end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    73
3167
546695e80e0a Correct out of order logic in mod_hashpassauth
Jeff Mitchell <jeff@jefferai.org>
parents: 3166
diff changeset
    74
		if credentials.iteration_count == nil or credentials.salt == nil or string.len(credentials.salt) == 0 then
546695e80e0a Correct out of order logic in mod_hashpassauth
Jeff Mitchell <jeff@jefferai.org>
parents: 3166
diff changeset
    75
			return nil, "Auth failed. Stored salt and iteration count information is not complete.";
546695e80e0a Correct out of order logic in mod_hashpassauth
Jeff Mitchell <jeff@jefferai.org>
parents: 3166
diff changeset
    76
		end
3205
2dcd826bbbc6 mod_auth_internal_hashed: Store StoredKey and ServerKey instead of salted hashed password.
Tobias Markmann <tm@ayena.de>
parents: 3189
diff changeset
    77
		
3210
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
    78
		-- convert hexpass to stored_key and server_key
3289
180a0b3b018d mod_auth_internal_hashed: Update TODO comments to COMPAT
Matthew Wild <mwild1@gmail.com>
parents: 3288
diff changeset
    79
		-- COMPAT w/old trunk: remove before 0.8 release
3210
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
    80
		if credentials.hashpass then
3288
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    81
			local salted_password = from_hex(credentials.hashpass);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    82
			credentials.stored_key = sha1(hmac_sha1(salted_password, "Client Key"), true);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    83
			credentials.server_key = to_hex(hmac_sha1(salted_password, "Server Key"));
3213
c85bba8bd41a mod_auth_internal_hashed: Empty hashpass after conversion to stored_key/server_key and store new authentication database.
Tobias Markmann <tm@ayena.de>
parents: 3212
diff changeset
    84
			credentials.hashpass = nil
c85bba8bd41a mod_auth_internal_hashed: Empty hashpass after conversion to stored_key/server_key and store new authentication database.
Tobias Markmann <tm@ayena.de>
parents: 3212
diff changeset
    85
			datamanager.store(username, host, "accounts", credentials);
3208
4b660bf61048 mod_auth_internal_hashed: Coverting salted password to stored_key and server_key.
Tobias Markmann <tm@ayena.de>
parents: 3207
diff changeset
    86
		end
4b660bf61048 mod_auth_internal_hashed: Coverting salted password to stored_key and server_key.
Tobias Markmann <tm@ayena.de>
parents: 3207
diff changeset
    87
		
3210
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
    88
		local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, credentials.salt, credentials.iteration_count);
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
    89
		
3288
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    90
		local stored_key_hex = to_hex(stored_key);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
    91
		local server_key_hex = to_hex(server_key);
3205
2dcd826bbbc6 mod_auth_internal_hashed: Store StoredKey and ServerKey instead of salted hashed password.
Tobias Markmann <tm@ayena.de>
parents: 3189
diff changeset
    92
		
3210
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
    93
		if valid and stored_key_hex == credentials.stored_key and server_key_hex == credentials.server_key then
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    94
			return true;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    95
		else
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    96
			return nil, "Auth failed. Invalid username, password, or password hash information.";
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    97
		end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    98
	end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
    99
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   100
	function provider.set_password(username, password)
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   101
		local account = datamanager.load(username, host, "accounts");
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   102
		if account then
3210
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
   103
			account.salt = account.salt or generate_uuid();
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
   104
			account.iteration_count = account.iteration_count or iteration_count;
5e51f8a7179b mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on PLAIN login.
Tobias Markmann <tm@ayena.de>
parents: 3208
diff changeset
   105
			local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, account.salt, account.iteration_count);
3288
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   106
			local stored_key_hex = to_hex(stored_key);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   107
			local server_key_hex = to_hex(server_key);
3207
b350d9753804 mod_auth_internal_hashed: Store stored_key and server_key when setting a password.
Tobias Markmann <tm@ayena.de>
parents: 3205
diff changeset
   108
			
b350d9753804 mod_auth_internal_hashed: Store stored_key and server_key when setting a password.
Tobias Markmann <tm@ayena.de>
parents: 3205
diff changeset
   109
			account.stored_key = stored_key_hex
b350d9753804 mod_auth_internal_hashed: Store stored_key and server_key when setting a password.
Tobias Markmann <tm@ayena.de>
parents: 3205
diff changeset
   110
			account.server_key = server_key_hex
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   111
3166
3c46cb94caed Add mechanism for upgrading to hashed passwords from default. Remove some extra debug.
Jeff Mitchell <jeff@jefferai.org>
parents: 3164
diff changeset
   112
			account.password = nil;
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   113
			return datamanager.store(username, host, "accounts", account);
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   114
		end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   115
		return nil, "Account not available.";
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   116
	end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   117
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   118
	function provider.user_exists(username)
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   119
		local account = datamanager.load(username, host, "accounts");
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   120
		if not account then
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   121
			log("debug", "account not found for username '%s' at host '%s'", username, module.host);
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   122
			return nil, "Auth failed. Invalid username";
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   123
		end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   124
		return true;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   125
	end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   126
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   127
	function provider.create_user(username, password)
3454
8cf30367aa4f mod_auth_internal_hashed: Fix deleting users
Kim Alvefur <zash@zash.se>
parents: 3395
diff changeset
   128
		if password == nil then
8cf30367aa4f mod_auth_internal_hashed: Fix deleting users
Kim Alvefur <zash@zash.se>
parents: 3395
diff changeset
   129
			return datamanager.store(username, host, "accounts", {});
8cf30367aa4f mod_auth_internal_hashed: Fix deleting users
Kim Alvefur <zash@zash.se>
parents: 3395
diff changeset
   130
		end
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   131
		local salt = generate_uuid();
3243
dc7131d4e189 mod_auth_internal_hashed: Fixed a traceback in account creation.
Waqas Hussain <waqas20@gmail.com>
parents: 3219
diff changeset
   132
		local valid, stored_key, server_key = getAuthenticationDatabaseSHA1(password, salt, iteration_count);
3288
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   133
		local stored_key_hex = to_hex(stored_key);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   134
		local server_key_hex = to_hex(server_key);
3205
2dcd826bbbc6 mod_auth_internal_hashed: Store StoredKey and ServerKey instead of salted hashed password.
Tobias Markmann <tm@ayena.de>
parents: 3189
diff changeset
   135
		return datamanager.store(username, host, "accounts", {stored_key = stored_key_hex, server_key = server_key_hex, salt = salt, iteration_count = iteration_count});
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   136
	end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   137
3994
42899d5efe3b mod_auth_internal_*: Support for delete_user method
Matthew Wild <mwild1@gmail.com>
parents: 3981
diff changeset
   138
	function provider.delete_user(username)
42899d5efe3b mod_auth_internal_*: Support for delete_user method
Matthew Wild <mwild1@gmail.com>
parents: 3981
diff changeset
   139
		return datamanager.store(username, host, "accounts", nil);
42899d5efe3b mod_auth_internal_*: Support for delete_user method
Matthew Wild <mwild1@gmail.com>
parents: 3981
diff changeset
   140
	end
42899d5efe3b mod_auth_internal_*: Support for delete_user method
Matthew Wild <mwild1@gmail.com>
parents: 3981
diff changeset
   141
3186
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   142
	function provider.get_sasl_handler()
3187
a475fbce1990 mod_auth_internal, mod_auth_internal_hashed: Fixed a global access.
Waqas Hussain <waqas20@gmail.com>
parents: 3186
diff changeset
   143
		local realm = module:get_option("sasl_realm") or module.host;
3186
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   144
		local testpass_authentication_profile = {
3981
2b0b8fe68df2 util.sasl.*, mod_auth_*, mod_saslauth: Pass SASL handler as first parameter to SASL profile callbacks.
Waqas Hussain <waqas20@gmail.com>
parents: 3454
diff changeset
   145
			plain_test = function(sasl, username, password, realm)
3186
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   146
				local prepped_username = nodeprep(username);
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   147
				if not prepped_username then
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   148
					log("debug", "NODEprep failed on username: %s", username);
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   149
					return "", nil;
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   150
				end
3395
e736f68c1047 usermanager, mod_auth_internal_hashed, mod_legacyauth: New order of parameters for usermanager.test_password - username, host, password
Matthew Wild <mwild1@gmail.com>
parents: 3389
diff changeset
   151
				return usermanager.test_password(prepped_username, realm, password), true;
3189
d686abb6b069 mod_auth_internal_hashed: Added SCRAM-SHA-1 support for SASL.
Waqas Hussain <waqas20@gmail.com>
parents: 3187
diff changeset
   152
			end,
3981
2b0b8fe68df2 util.sasl.*, mod_auth_*, mod_saslauth: Pass SASL handler as first parameter to SASL profile callbacks.
Waqas Hussain <waqas20@gmail.com>
parents: 3454
diff changeset
   153
			scram_sha_1 = function(sasl, username, realm)
3389
9e2485880cd6 mod_auth_internal_hashed: Fixed SCRAM-SHA-1 mechanism to not traceback on non-existent users.
Waqas Hussain <waqas20@gmail.com>
parents: 3335
diff changeset
   154
				local credentials = datamanager.load(username, host, "accounts");
9e2485880cd6 mod_auth_internal_hashed: Fixed SCRAM-SHA-1 mechanism to not traceback on non-existent users.
Waqas Hussain <waqas20@gmail.com>
parents: 3335
diff changeset
   155
				if not credentials then return; end
3189
d686abb6b069 mod_auth_internal_hashed: Added SCRAM-SHA-1 support for SASL.
Waqas Hussain <waqas20@gmail.com>
parents: 3187
diff changeset
   156
				if credentials.password then
3204
7a15cbf23c5b Fix missing parameter in mod_auth_internal_hashed.
Kim Alvefur <zash@zash.se>
parents: 3189
diff changeset
   157
					usermanager.set_password(username, credentials.password, host);
3389
9e2485880cd6 mod_auth_internal_hashed: Fixed SCRAM-SHA-1 mechanism to not traceback on non-existent users.
Waqas Hussain <waqas20@gmail.com>
parents: 3335
diff changeset
   158
					credentials = datamanager.load(username, host, "accounts");
9e2485880cd6 mod_auth_internal_hashed: Fixed SCRAM-SHA-1 mechanism to not traceback on non-existent users.
Waqas Hussain <waqas20@gmail.com>
parents: 3335
diff changeset
   159
					if not credentials then return; end
3189
d686abb6b069 mod_auth_internal_hashed: Added SCRAM-SHA-1 support for SASL.
Waqas Hussain <waqas20@gmail.com>
parents: 3187
diff changeset
   160
				end
3211
d69e90ffbc09 mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on SCRAM-SHA-1 login.
Tobias Markmann <tm@ayena.de>
parents: 3210
diff changeset
   161
				
d69e90ffbc09 mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on SCRAM-SHA-1 login.
Tobias Markmann <tm@ayena.de>
parents: 3210
diff changeset
   162
				-- convert hexpass to stored_key and server_key
3289
180a0b3b018d mod_auth_internal_hashed: Update TODO comments to COMPAT
Matthew Wild <mwild1@gmail.com>
parents: 3288
diff changeset
   163
				-- COMPAT w/old trunk: remove before 0.8 release
3211
d69e90ffbc09 mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on SCRAM-SHA-1 login.
Tobias Markmann <tm@ayena.de>
parents: 3210
diff changeset
   164
				if credentials.hashpass then
3288
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   165
					local salted_password = from_hex(credentials.hashpass);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   166
					credentials.stored_key = sha1(hmac_sha1(salted_password, "Client Key"), true);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   167
					credentials.server_key = to_hex(hmac_sha1(salted_password, "Server Key"));
3213
c85bba8bd41a mod_auth_internal_hashed: Empty hashpass after conversion to stored_key/server_key and store new authentication database.
Tobias Markmann <tm@ayena.de>
parents: 3212
diff changeset
   168
					credentials.hashpass = nil
c85bba8bd41a mod_auth_internal_hashed: Empty hashpass after conversion to stored_key/server_key and store new authentication database.
Tobias Markmann <tm@ayena.de>
parents: 3212
diff changeset
   169
					datamanager.store(username, host, "accounts", credentials);
3211
d69e90ffbc09 mod_auth_internal_hashed: Convert hashpass to server_key/stored_key on SCRAM-SHA-1 login.
Tobias Markmann <tm@ayena.de>
parents: 3210
diff changeset
   170
				end
3389
9e2485880cd6 mod_auth_internal_hashed: Fixed SCRAM-SHA-1 mechanism to not traceback on non-existent users.
Waqas Hussain <waqas20@gmail.com>
parents: 3335
diff changeset
   171
			
3205
2dcd826bbbc6 mod_auth_internal_hashed: Store StoredKey and ServerKey instead of salted hashed password.
Tobias Markmann <tm@ayena.de>
parents: 3189
diff changeset
   172
				local stored_key, server_key, iteration_count, salt = credentials.stored_key, credentials.server_key, credentials.iteration_count, credentials.salt;
3288
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   173
				stored_key = stored_key and from_hex(stored_key);
1a84d7d6f667 mod_auth_internal_hashed: Remove far too many instances of inline hex conversion using gsub, which was creating useless closures and what-not
Matthew Wild <mwild1@gmail.com>
parents: 3287
diff changeset
   174
				server_key = server_key and from_hex(server_key);
3205
2dcd826bbbc6 mod_auth_internal_hashed: Store StoredKey and ServerKey instead of salted hashed password.
Tobias Markmann <tm@ayena.de>
parents: 3189
diff changeset
   175
				return stored_key, server_key, iteration_count, salt, true;
3186
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   176
			end
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   177
		};
b5f261123013 mod_auth_internal, mod_auth_internal_hashed: Updated to provide get_sasl_handler.
Waqas Hussain <waqas20@gmail.com>
parents: 3180
diff changeset
   178
		return new_sasl(realm, testpass_authentication_profile);
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   179
	end
3287
e425e27c12be mod_auth_internal, mod_auth_internal_hashed: Remove is_admin method from providers
Matthew Wild <mwild1@gmail.com>
parents: 3269
diff changeset
   180
	
3164
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   181
	return provider;
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   182
end
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   183
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   184
module:add_item("auth-provider", new_hashpass_provider(module.host));
db9def53fe9c Check in mod_hashpassauth -- works!
Jeff Mitchell <jeff@jefferai.org>
parents:
diff changeset
   185