mod_auth_imap/auth_imap/sasl_imap.lib.lua
changeset 1593 3e4d15ae2133
parent 1343 7dbde05b48a9
--- a/mod_auth_imap/auth_imap/sasl_imap.lib.lua	Tue Jan 20 11:02:14 2015 +0000
+++ b/mod_auth_imap/auth_imap/sasl_imap.lib.lua	Sun Jan 25 13:04:02 2015 +0100
@@ -112,7 +112,7 @@
 end
 
 -- create a new SASL object which can be used to authenticate clients
-function _M.new(realm, service_name, host, port, ssl_params, append_host)
+function _M.new(realm, service_name, host, port, ssl_params, append_host, strip_host)
 	log("debug", "new(%q, %q, %q, %d)", realm or "", service_name or "", host or "", port or 0);
 	local sasl_i = {
 		realm = realm;
@@ -121,13 +121,14 @@
 		_port = port;
 		_ssl_params = ssl_params;
 		_append_host = append_host;
+		_strip_host = strip_host;
 	};
 
 	local conn, mechs = connect(host, port, ssl_params);
 	if not conn then
 		return nil, "Socket connection failure";
 	end
-	if append_host then
+	if append_host or strip_host then
 		mechs = { PLAIN = mechs.PLAIN };
 	end
 	sasl_i.conn, sasl_i.mechs = conn, mechs;
@@ -141,7 +142,7 @@
 		self.conn = nil;
 	end
 	log("debug", "method:clean_clone()");
-	return _M.new(self.realm, self.service_name, self._host, self._port, self._ssl_params, self._append_host)
+	return _M.new(self.realm, self.service_name, self._host, self._port, self._ssl_params, self._append_host, self._strip_host)
 end
 
 -- get a list of possible SASL mechanisms to use
@@ -177,8 +178,12 @@
 function method:process(message)
 	local username = mitm[self.selected](message);
 	if username then self.username = username; end
-	if self._append_host and self.selected == "PLAIN" then
-		message = message:gsub("^([^%z]*%z[^%z]+)(%z[^%z]+)$", "%1@"..self.realm.."%2");
+	if self.selected == "PLAIN" then
+		if self._append_host then
+			message = message:gsub("^%Z*(%z[^%z@]+)@?%Z*(%z%Z+)$", "%1@"..self.realm.."%2");
+		elseif self._strip_host then
+			message = message:gsub("^(%Z*%z[^@%z]+)@%Z+", "%1");
+		end
 	end
 	log("debug", "method:process(%d bytes): %q", #message, message:gsub("%z", "."));
 	local ok, err = self.conn:send(b64(message).."\n");