mod_auth_dovecot/mod_auth_dovecot.lua
author Javier Torres <javitonino@gmail.com>
Sat, 30 Oct 2010 23:38:19 +0200
changeset 267 76f3310ec113
parent 261 0f46fb2dbc79
child 268 cfcd4efb0fa4
permissions -rw-r--r--
mod_auth_dovecot: Use PID in handshake
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
261
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
-- Dovecot authentication backend for Prosody
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
--
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
-- Copyright (C) 2010 Javier Torres
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
-- Copyright (C) 2008-2010 Matthew Wild
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
-- Copyright (C) 2008-2010 Waqas Hussain
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
--
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
local socket_unix = require "socket.unix";
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
local datamanager = require "util.datamanager";
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
local log = require "util.logger".init("auth_internal_plain");
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
local new_sasl = require "util.sasl".new;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
local nodeprep = require "util.encodings".stringprep.nodeprep;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
local base64 = require "util.encodings".base64;
267
76f3310ec113 mod_auth_dovecot: Use PID in handshake
Javier Torres <javitonino@gmail.com>
parents: 261
diff changeset
    14
local pposix = require "util.pposix";
261
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    15
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    16
local prosody = _G.prosody;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    17
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    18
function new_default_provider(host)
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    19
	local provider = { name = "dovecot" };
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    20
	log("debug", "initializing dovecot authentication provider for host '%s'", host);
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    21
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    22
	function provider.test_password(username, password)
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    23
		log("debug", "test password '%s' for user %s at host %s", password, username, module.host);
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
		
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
		c = assert(socket.unix());
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    26
		assert(c:connect("/var/run/dovecot/auth-login")); -- FIXME: Hardcoded is bad
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    27
		
267
76f3310ec113 mod_auth_dovecot: Use PID in handshake
Javier Torres <javitonino@gmail.com>
parents: 261
diff changeset
    28
		local pid = pposix.getpid();
261
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    29
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    30
		-- Send our handshake
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    31
        -- FIXME: Oh no! There are asserts everywhere
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
		assert(c:send("VERSION\t1\t1\n"));
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
		assert(c:send("CPID\t" .. pid .. "\n"));
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    34
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
		-- Check their handshake
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    36
		local done = false;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    37
		while (not done) do
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    38
			local l = assert(c:receive());
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    39
			parts = string.gmatch(l, "[^\t]+");
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    40
			first = parts();
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    41
			if (first == "VERSION") then
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    42
				assert(parts() == "1");
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    43
				assert(parts() == "1");
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    44
			elseif (first == "MECH") then
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    45
				local ok = false;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
				for p in parts do
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    47
					if p == "PLAIN" then
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    48
						ok = true;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    49
					end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    50
				end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    51
				assert(ok);
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    52
			elseif (first == "DONE") then
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    53
				done = true;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    54
			end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    55
		end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    56
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    57
		-- Send auth data
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    58
		username = username .. "@" .. module.host; -- FIXME: this is actually a hack for my server
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    59
		local b64 = base64.encode(username .. "\0" .. username .. "\0" .. password);
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    60
		local id = "54321"; -- FIXME: probably can just be a fixed value if making one request per connection
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    61
		assert(c:send("AUTH\t" .. id .. "\tPLAIN\tservice=XMPP\tresp=" .. b64 .. "\n"));
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    62
		local l = assert(c:receive());
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    63
		assert(c:close());
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    64
		local parts = string.gmatch(l, "[^\t]+");
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    65
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    66
		if (parts() == "OK") then
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    67
			return true;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    68
		else
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    69
			return nil, "Auth failed. Invalid username or password.";
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    70
		end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    71
	end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    72
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    73
	function provider.get_password(username)
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    74
		return nil, "Cannot get_password in dovecot backend.";
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    75
	end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    76
	
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    77
	function provider.set_password(username, password)
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    78
		return nil, "Cannot set_password in dovecot backend.";
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    79
	end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    80
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    81
	function provider.user_exists(username)
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    82
        --TODO: Send an auth request. If it returns FAIL <id> user=<user> then user exists.
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    83
		return nil, "user_exists not yet implemented in dovecot backend.";
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    84
	end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    85
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    86
	function provider.create_user(username, password)
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    87
		return nil, "Cannot create_user in dovecot backend.";
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    88
	end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    89
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    90
	function provider.get_sasl_handler()
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    91
		local realm = module:get_option("sasl_realm") or module.host;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    92
		local getpass_authentication_profile = {
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    93
			plain_test = function(username, password, realm)
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    94
                                local prepped_username = nodeprep(username);
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    95
                                if not prepped_username then
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    96
                                        log("debug", "NODEprep failed on username: %s", username);
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    97
                                        return "", nil;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    98
                                end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    99
                                return usermanager.test_password(prepped_username, realm, password), true;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   100
                        end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   101
		};
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   102
		return new_sasl(realm, getpass_authentication_profile);
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   103
	end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   104
	
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   105
	return provider;
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   106
end
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   107
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   108
module:add_item("auth-provider", new_default_provider(module.host));
0f46fb2dbc79 mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
   109