Mercurial > prosody-modules
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 |