# HG changeset patch # User Kim Alvefur # Date 1339105285 -7200 # Node ID 0c130c45b7c17bf257bc95ef9ca872c86f908708 # Parent 7c88e09a07e73556f30548528fcfc7b1e7675084 mod_auth_dovecot: Old forgotten changes. Testing appreciated. diff -r 7c88e09a07e7 -r 0c130c45b7c1 mod_auth_dovecot/auth_dovecot/mod_auth_dovecot.lua --- a/mod_auth_dovecot/auth_dovecot/mod_auth_dovecot.lua Tue Jun 05 22:47:12 2012 +0200 +++ b/mod_auth_dovecot/auth_dovecot/mod_auth_dovecot.lua Thu Jun 07 23:41:25 2012 +0200 @@ -14,6 +14,7 @@ local service_realm = module:get_option("realm"); local service_name = module:get_option("service_name"); local append_host = module:get_option_boolean("auth_append_host"); +--assert(not append_host, "auth_append_host does not work"); local validate_domain = module:get_option_boolean("validate_append_host"); local handle_appended = module:get_option_string("handle_appended"); local util_sasl_new = require "util.sasl".new; @@ -25,7 +26,7 @@ service_realm or realm, service_name or "xmpp", - socket_port and { socket_path, socket_port } or socket_path, + socket_port and { socket_host, socket_port } or socket_path, { --config handle_domain = handle_appended or @@ -55,22 +56,6 @@ return new_sasl(module.host):plain_test(username, password); end -if append_host then - new_sasl = function(realm) - return util_sasl_new(realm, { - plain_test = function(sasl, username, password, realm) - local prepped_username = nodeprep(username); - if not prepped_username then - log("debug", "NODEprep failed on username: %s", username); - return "", nil; - end - prepped_username = prepped_username .. "@" .. module.host; - return provider.test_password(prepped_username, password), true; - end, - }); - end -end - function provider.get_password(username) return nil, "Passwords unavailable for "..name; end @@ -80,10 +65,13 @@ end function provider.user_exists(username) + return true -- FIXME +--[[ This, sadly, doesn't work. local user_test = new_sasl(module.host); user_test:select("PLAIN"); user_test:process(("\0%s\0"):format(username)); return user_test.username == username; +--]] end function provider.create_user(username, password) @@ -94,5 +82,13 @@ return new_sasl(module.host); end +if append_host then + function provider.test_password(username, password) + return new_sasl(module.host):plain_test(username .. "@".. (service_realm or module.host), password); + end + + provider.get_sasl_handler = nil +end + module:add_item("auth-provider", provider); diff -r 7c88e09a07e7 -r 0c130c45b7c1 mod_auth_dovecot/auth_dovecot/sasl_dovecot.lib.lua --- a/mod_auth_dovecot/auth_dovecot/sasl_dovecot.lib.lua Tue Jun 05 22:47:12 2012 +0200 +++ b/mod_auth_dovecot/auth_dovecot/sasl_dovecot.lib.lua Thu Jun 07 23:41:25 2012 +0200 @@ -44,17 +44,17 @@ local function connect(socket_info) --log("debug", "connect(%q)", socket_path); if conn then conn:close(); pid = nil; end - if not pid then pid = tonumber(tostring(conn):match("0x%x*$")) end local socket_type = (type(socket_info) == "string") and "UNIX" or "TCP"; - local ok, err; + local ok, err, socket_path; if socket_type == "TCP" then local socket_host, socket_port = unpack(socket_info); conn = socket.tcp(); ok, err = conn:connect(socket_host, socket_port); socket_path = ("%s:%d"):format(socket_host, socket_port); elseif socket.unix then + socket_path = socket_info; conn = socket.unix(); ok, err = conn:connect(socket_path); else @@ -62,11 +62,12 @@ end if not ok then - log("error", "error connecting to dovecot %s socket at '%s'. error was '%s'", socket_type, socket_path, err); + log("error", "error connecting to dovecot %s socket at '%s'. error was '%s'", socket_type, socket_path or socket_info, err); return false; end -- Send our handshake + pid = tonumber(tostring(conn):match("0x%x*$")); log("debug", "sending handshake to dovecot. version 1.1, cpid '%d'", pid); if not conn:send("VERSION\t1\t1\n") then return false @@ -127,7 +128,11 @@ -- [[ function method:send(...) local msg = t_concat({...}, "\t"); - local ok, err = self.conn:send(authmsg.."\n"); + if msg:sub(-1) ~= "\n" then + msg = msg .. "\n" + end + module:log("debug", "sending %q", msg:sub(1,-2)); + local ok, err = self.conn:send(msg); if not ok then log("error", "Could not write to socket: %s", err); return nil, err; @@ -136,13 +141,13 @@ end function method:recv() - local line, err = self.conn:receive(); --log("debug", "Sent %d bytes to socket", ok); local line, err = self.conn:receive(); if not line then log("error", "Could not read from socket: %s", err); return nil, err; end + module:log("debug", "received %q", line); return line; end -- ]] @@ -183,30 +188,30 @@ --end local request_id = self.request_id; local authmsg; + local ok, err; if not self.started then self.started = true; - authmsg = t_concat({ + ok, err = self:send( "AUTH", request_id, self.selected, "service="..self.service_name, "resp="..(message and b64(message) or "=") - }, "\t"); + ); else - authmsg = t_concat({ + ok, err = self:send( "CONT", request_id, (message and b64(message) or "=") - }, "\t"); + ); end --log("debug", "Sending %d bytes: %q", #authmsg, authmsg); - local ok, err = self.conn:send(authmsg.."\n"); if not ok then log("error", "Could not write to socket: %s", err); return "failure", "internal-server-error", err end --log("debug", "Sent %d bytes to socket", ok); - local line, err = self.conn:receive(); + local line, err = self:recv(); if not line then log("error", "Could not read from socket: %s", err); return "failure", "internal-server-error", err