Mercurial > prosody-modules
comparison mod_auth_dovecot/auth_dovecot/sasl_dovecot.lib.lua @ 838:c9e2beec4ef6
mod_auth_dovecot: Improved error reporting.
author | Waqas Hussain <waqas20@gmail.com> |
---|---|
date | Fri, 28 Sep 2012 08:31:27 +0500 |
parents | d9a4e2f11b07 |
children | 853a382c9bd6 |
comparison
equal
deleted
inserted
replaced
837:0ef11dee7050 | 838:c9e2beec4ef6 |
---|---|
60 else | 60 else |
61 err = "luasocket was not compiled with UNIX sockets support"; | 61 err = "luasocket was not compiled with UNIX sockets support"; |
62 end | 62 end |
63 | 63 |
64 if not ok then | 64 if not ok then |
65 log("error", "error connecting to dovecot %s socket at '%s'. error was '%s'", socket_type, socket_path or socket_info, err); | 65 return false, "error connecting to dovecot "..tostring(socket_type).." socket at '" |
66 return false; | 66 ..tostring(socket_path or socket_info).."'. error was '"..tostring(err).."'"; |
67 end | 67 end |
68 | 68 |
69 -- Send our handshake | 69 -- Send our handshake |
70 pid = tonumber(tostring(conn):match("0x%x*$")); | 70 pid = tonumber(tostring(conn):match("0x%x*$")); |
71 log("debug", "sending handshake to dovecot. version 1.1, cpid '%d'", pid); | 71 log("debug", "sending handshake to dovecot. version 1.1, cpid '%d'", pid); |
72 if not conn:send("VERSION\t1\t1\n") then | 72 local success,err = conn:send("VERSION\t1\t1\n"); |
73 return false | 73 if not success then |
74 end | 74 return false, "Unable to send version data to socket: "..tostring(err); |
75 if not conn:send("CPID\t" .. pid .. "\n") then | 75 end |
76 return false | 76 local success,err = conn:send("CPID\t" .. pid .. "\n"); |
77 if not success then | |
78 return false, "Unable to send PID to socket: "..tostring(err); | |
77 end | 79 end |
78 | 80 |
79 -- Parse Dovecot's handshake | 81 -- Parse Dovecot's handshake |
80 local done = false; | 82 local done = false; |
81 supported_mechs = {}; | 83 supported_mechs = {}; |
82 while (not done) do | 84 while (not done) do |
83 local line = conn:receive(); | 85 local line, err = conn:receive(); |
84 if not line then | 86 if not line then |
85 return false; | 87 return false, "No data read from socket: "..tostring(err); |
86 end | 88 end |
87 | 89 |
88 --log("debug", "dovecot handshake: '%s'", line); | 90 --log("debug", "dovecot handshake: '%s'", line); |
89 local parts = line:gmatch("[^\t]+"); | 91 local parts = line:gmatch("[^\t]+"); |
90 local first = parts(); | 92 local first = parts(); |
91 if first == "VERSION" then | 93 if first == "VERSION" then |
92 -- Version should be 1.1 | 94 -- Version should be 1.1 |
93 local major_version = parts(); | 95 local major_version = parts(); |
94 | 96 |
95 if major_version ~= "1" then | 97 if major_version ~= "1" then |
96 log("error", "dovecot server version is not 1.x. it is %s.x", major_version); | |
97 conn:close(); | 98 conn:close(); |
98 return false; | 99 return false, "dovecot server version is not 1.x. it is "..tostring(major_version)..".x"; |
99 end | 100 end |
100 elseif first == "MECH" then | 101 elseif first == "MECH" then |
101 local mech = parts(); | 102 local mech = parts(); |
102 supported_mechs[mech] = true; | 103 supported_mechs[mech] = true; |
103 elseif first == "DONE" then | 104 elseif first == "DONE" then |
116 sasl_i.request_id = request_id; | 117 sasl_i.request_id = request_id; |
117 local conn, mechs = conn, supported_mechs; | 118 local conn, mechs = conn, supported_mechs; |
118 if not conn then | 119 if not conn then |
119 conn, mechs = connect(socket_info); | 120 conn, mechs = connect(socket_info); |
120 if not conn then | 121 if not conn then |
121 return nil, "Socket connection failure"; | 122 return nil, "Dovecot connection failure: "..tostring(mechs); |
122 end | 123 end |
123 end | 124 end |
124 sasl_i.conn, sasl_i.mechs = conn, mechs; | 125 sasl_i.conn, sasl_i.mechs = conn, mechs; |
125 return setmetatable(sasl_i, method); | 126 return setmetatable(sasl_i, method); |
126 end | 127 end |