--- a/mod_auth_dovecot/mod_auth_dovecot.lua Sat Jan 08 17:08:20 2011 +0000
+++ b/mod_auth_dovecot/mod_auth_dovecot.lua Sat Jan 08 17:57:03 2011 +0000
@@ -7,16 +7,17 @@
local socket_unix = require "socket.unix";
local datamanager = require "util.datamanager";
+local usermanager = require "core.usermanager";
local log = require "util.logger".init("auth_dovecot");
local new_sasl = require "util.sasl".new;
local nodeprep = require "util.encodings".stringprep.nodeprep;
local base64 = require "util.encodings".base64;
local pposix = require "util.pposix";
-local prosody = _G.prosody;
+local prosody = prosody;
local socket_path = module:get_option_string("dovecot_auth_socket", "/var/run/dovecot/auth-login");
-function new_default_provider(host)
+function new_provider(host)
local provider = { name = "dovecot", request_id = 0 };
log("debug", "initializing dovecot authentication provider for host '%s'", host);
@@ -39,9 +40,9 @@
-- Create a connection to dovecot socket
log("debug", "connecting to dovecot socket at '%s'", socket_path);
- local r, e = conn:connect(socket_path);
- if (not r) then
- log("warn", "error connecting to dovecot socket at '%s'. error was '%s'. check permissions", socket_path, e);
+ local ok, err = conn:connect(socket_path);
+ if not ok then
+ log("error", "error connecting to dovecot socket at '%s'. error was '%s'. check permissions", socket_path, err);
provider:close();
return false;
end
@@ -52,22 +53,22 @@
if not provider:send("VERSION\t1\t1\n") then
return false
end
- if (not provider:send("CPID\t" .. pid .. "\n")) then
+ if not provider:send("CPID\t" .. pid .. "\n") then
return false
end
-- Parse Dovecot's handshake
local done = false;
while (not done) do
- local l = provider:receive();
- if (not l) then
+ local line = provider:receive();
+ if not line then
return false;
end
- log("debug", "dovecot handshake: '%s'", l);
- parts = string.gmatch(l, "[^\t]+");
- first = parts();
- if (first == "VERSION") then
+ log("debug", "dovecot handshake: '%s'", line);
+ local parts = line:gmatch("[^\t]+");
+ local first = parts();
+ if first == "VERSION" then
-- Version should be 1.1
local major_version = parts();
@@ -76,20 +77,20 @@
provider:close();
return false;
end
- elseif (first == "MECH") then
+ elseif first == "MECH" then
-- Mechanisms should include PLAIN
local ok = false;
- for p in parts do
- if p == "PLAIN" then
+ for part in parts do
+ if part == "PLAIN" then
ok = true;
end
end
- if (not ok) then
- log("warn", "server doesn't support PLAIN mechanism. It supports '%s'", l);
+ if not ok then
+ log("warn", "server doesn't support PLAIN mechanism. It supports '%s'", line);
provider:close();
return false;
end
- elseif (first == "DONE") then
+ elseif first == "DONE" then
done = true;
end
end
@@ -98,9 +99,9 @@
-- Wrapper for send(). Handles errors
function provider.send(self, data)
- local r, e = conn:send(data);
- if (not r) then
- log("warn", "error sending '%s' to dovecot. error was '%s'", data, e);
+ local ok, err = conn:send(data);
+ if not ok then
+ log("error", "error sending '%s' to dovecot. error was '%s'", data, err);
provider:close();
return false;
end
@@ -109,13 +110,13 @@
-- Wrapper for receive(). Handles errors
function provider.receive(self)
- local r, e = conn:receive();
- if (not r) then
- log("warn", "error receiving data from dovecot. error was '%s'", socket, e);
+ local line, err = conn:receive();
+ if not line then
+ log("error", "error receiving data from dovecot. error was '%s'", err);
provider:close();
return false;
end
- return r;
+ return line;
end
function provider.send_auth_request(self, username, password)
@@ -132,24 +133,24 @@
local msg = "AUTH\t" .. provider.request_id .. "\tPLAIN\tservice=XMPP\tresp=" .. b64;
log("debug", "sending auth request for '%s' with password '%s': '%s'", username, password, msg);
- if (not provider:send(msg .. "\n")) then
+ if not provider:send(msg .. "\n") then
return nil, "Auth failed. Dovecot communications error";
end
-- Get response
- local l = provider:receive();
- log("debug", "got auth response: '%s'", l);
- if (not l) then
+ local line = provider:receive();
+ log("debug", "got auth response: '%s'", line);
+ if not line then
return nil, "Auth failed. Dovecot communications error";
end
- local parts = string.gmatch(l, "[^\t]+");
+ local parts = line:gmatch("[^\t]+");
-- Check response
local status = parts();
local resp_id = tonumber(parts());
- if (resp_id ~= provider.request_id) then
+ if resp_id ~= provider.request_id then
log("warn", "dovecot response_id(%s) doesn't match request_id(%s)", resp_id, provider.request_id);
provider:close();
return nil, "Auth failed. Dovecot communications error";
@@ -163,7 +164,7 @@
local status, extra = provider:send_auth_request(username, password);
- if (status == "OK") then
+ if status == "OK" then
log("info", "login ok for '%s'", username);
return true;
else
@@ -188,19 +189,19 @@
local status, extra = provider:send_auth_request(username, "");
local param = extra();
- while (param) do
- parts = string.gmatch(param, "[^=]+");
- name = parts();
- value = parts();
- if (name == "user") then
- log("info", "user '%s' exists", username);
+ while param do
+ local parts = param:gmatch("[^=]+");
+ local name = parts();
+ local value = parts();
+ if name == "user" then
+ log("debug", "user '%s' exists", username);
return true;
end
param = extra();
end
- log("info", "user '%s' does not exists (or dovecot didn't send user=<username> parameter)", username);
+ log("debug", "user '%s' does not exists (or dovecot didn't send user=<username> parameter)", username);
return false;
end
@@ -226,4 +227,4 @@
return provider;
end
-module:add_item("auth-provider", new_default_provider(module.host));
+module:add_item("auth-provider", new_provider(module.host));