comparison mod_auth_dovecot/mod_auth_dovecot.lua @ 274:cda4855863af

mod_auth_dovecot: Implement user_exists
author Javier Torres <javitonino@gmail.com>
date Sun, 31 Oct 2010 00:27:56 +0200
parents 8d283ae7f29d
children 4c3abf1a9b5a
comparison
equal deleted inserted replaced
273:8d283ae7f29d 274:cda4855863af
115 return false; 115 return false;
116 end 116 end
117 return r; 117 return r;
118 end 118 end
119 119
120 function provider.test_password(username, password) 120 function provider.send_auth_request(self, username, password)
121 log("debug", "test password '%s' for user %s at host %s", password, username, module.host); 121 if (provider.c == nil) then
122
123 local tries = 0;
124
125 if (provider.c == nil or tries > 0) then
126 if (not provider:connect()) then 122 if (not provider:connect()) then
127 return nil, "Auth failed. Dovecot communications error"; 123 return nil, "Auth failed. Dovecot communications error";
128 end 124 end
129 end 125 end
130 126
149 local parts = string.gmatch(l, "[^\t]+"); 145 local parts = string.gmatch(l, "[^\t]+");
150 146
151 -- Check response 147 -- Check response
152 local status = parts(); 148 local status = parts();
153 local resp_id = tonumber(parts()); 149 local resp_id = tonumber(parts());
150
154 if (resp_id ~= provider.request_id) then 151 if (resp_id ~= provider.request_id) then
155 log("warn", "dovecot response_id(%s) doesn't match request_id(%s)", resp_id, provider.request_id); 152 log("warn", "dovecot response_id(%s) doesn't match request_id(%s)", resp_id, provider.request_id);
156 provider:close(); 153 provider:close();
157 return nil, "Auth failed. Dovecot communications error"; 154 return nil, "Auth failed. Dovecot communications error";
158 end 155 end
156
157 return status, parts;
158 end
159
160 function provider.test_password(username, password)
161 log("debug", "test password '%s' for user %s at host %s", password, username, module.host);
162
163 local status, extra = provider:send_auth_request(username, password);
159 164
160 if (status == "OK") then 165 if (status == "OK") then
161 log("info", "login ok for '%s'", username); 166 log("info", "login ok for '%s'", username);
162 return true; 167 return true;
163 else 168 else
173 function provider.set_password(username, password) 178 function provider.set_password(username, password)
174 return nil, "Cannot set_password in dovecot backend."; 179 return nil, "Cannot set_password in dovecot backend.";
175 end 180 end
176 181
177 function provider.user_exists(username) 182 function provider.user_exists(username)
178 --TODO: Send an auth request. If it returns FAIL <id> user=<user> then user exists. 183 log("debug", "user_exists for user %s at host %s", username, module.host);
179 return nil, "user_exists not yet implemented in dovecot backend."; 184
185 -- Send a request. If the response (FAIL) contains an extra
186 -- parameter like user=<username> then it exists.
187 local status, extra = provider:send_auth_request(username, "");
188
189 local param = extra();
190 while (param) do
191 parts = string.gmatch(param, "[^=]+");
192 name = parts();
193 value = parts();
194 if (name == "user") then
195 log("info", "user '%s' exists", username);
196 return true;
197 end
198
199 param = extra();
200 end
201
202 log("info", "user '%s' does not exists (or dovecot didn't send user=<username> parameter)", username);
203 return false;
180 end 204 end
181 205
182 function provider.create_user(username, password) 206 function provider.create_user(username, password)
183 return nil, "Cannot create_user in dovecot backend."; 207 return nil, "Cannot create_user in dovecot backend.";
184 end 208 end