module "plain"
---=========================
---SASL PLAIN according to RFC 4616
+-- ================================
+-- SASL PLAIN according to RFC 4616
local function plain(self, message)
- local response = message
- local authorization = s_match(response, "([^%z]+)")
- local authentication = s_match(response, "%z([^%z]+)%z")
- local password = s_match(response, "%z[^%z]+%z([^%z]+)")
+ if not message then
+ return "failure", "malformed-request";
+ end
+
+ local authorization, authentication, password = s_match(message, "^([^%z]*)%z([^%z]+)%z([^%z]+)");
- if authentication == nil or password == nil then
+ if not authorization then
return "failure", "malformed-request";
end
-
+
-- SASLprep password and authentication
authentication = saslprep(authentication);
password = saslprep(password);
-
+
if (not password) or (password == "") or (not authentication) or (authentication == "") then
log("debug", "Username or password violates SASLprep.");
- return "failure", "malformed-request";
+ return "failure", "malformed-request", "Invalid username or password.";
end
local correct, state = false, false;
if correct then
return "success";
else
- return "failure", "not-authorized";
+ return "failure", "not-authorized", "Unable to authorize you with the authentication credentials you've sent.";
end
end
registerMechanism("PLAIN", {"plain", "plain_test"}, plain);
end
-return _M;
\ No newline at end of file
+return _M;