Mercurial > prosody-modules
annotate mod_auth_dovecot/mod_auth_dovecot.lua @ 290:ee416b285802
mod_group_bookmarks: Always ensure bookmarks are injected, even if the user has no bookmarks already stored
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 22 Dec 2010 20:24:20 +0000 |
parents | cda4855863af |
children | 4c3abf1a9b5a |
rev | line source |
---|---|
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 -- Dovecot authentication backend for Prosody |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 -- |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2010 Javier Torres |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 -- Copyright (C) 2008-2010 Matthew Wild |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 -- Copyright (C) 2008-2010 Waqas Hussain |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 -- |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 local socket_unix = require "socket.unix"; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 local datamanager = require "util.datamanager"; |
270
853ae6ae87bf
mod_auth_dovecot: Use correct module name for logger
Javier Torres <javitonino@gmail.com>
parents:
269
diff
changeset
|
10 local log = require "util.logger".init("auth_dovecot"); |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 local new_sasl = require "util.sasl".new; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 local nodeprep = require "util.encodings".stringprep.nodeprep; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 local base64 = require "util.encodings".base64; |
267
76f3310ec113
mod_auth_dovecot: Use PID in handshake
Javier Torres <javitonino@gmail.com>
parents:
261
diff
changeset
|
14 local pposix = require "util.pposix"; |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 local prosody = _G.prosody; |
271
05ea4abb664d
mod_auth_dovecot: Load dovecot socket path form config
Javier Torres <javitonino@gmail.com>
parents:
270
diff
changeset
|
17 local socket_path = module:get_option_string("dovecot_auth_socket", "/var/run/dovecot/auth-login"); |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 function new_default_provider(host) |
272
6b35c23664db
mod_auth_dovecot: Use sequential (instead of fixed) id for messages
Javier Torres <javitonino@gmail.com>
parents:
271
diff
changeset
|
20 local provider = { name = "dovecot", c = nil, request_id = 0 }; |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 log("debug", "initializing dovecot authentication provider for host '%s'", host); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
22 |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
23 -- Closes the socket |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
24 function provider.close(self) |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
25 if (provider.c ~= nil) then |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
26 provider.c:close(); |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
27 end |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
28 provider.c = nil; |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
29 end |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
30 |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
31 -- The following connects to a new socket and send the handshake |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
32 function provider.connect(self) |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
33 -- Destroy old socket |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
34 provider:close(); |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
36 provider.c = socket.unix(); |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
38 -- Create a connection to dovecot socket |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
39 log("debug", "connecting to dovecot socket at '%s'", socket_path); |
271
05ea4abb664d
mod_auth_dovecot: Load dovecot socket path form config
Javier Torres <javitonino@gmail.com>
parents:
270
diff
changeset
|
40 local r, e = provider.c:connect(socket_path); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
41 if (not r) then |
271
05ea4abb664d
mod_auth_dovecot: Load dovecot socket path form config
Javier Torres <javitonino@gmail.com>
parents:
270
diff
changeset
|
42 log("warn", "error connecting to dovecot socket at '%s'. error was '%s'. check permissions", socket_path, e); |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
43 provider:close(); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
44 return false; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
45 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
46 |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 -- Send our handshake |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
48 local pid = pposix.getpid(); |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
49 log("debug", "sending handshake to dovecot. version 1.1, cpid '%d'", pid); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
50 if not provider:send("VERSION\t1\t1\n") then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
51 return false |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
52 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
53 if (not provider:send("CPID\t" .. pid .. "\n")) then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
54 return false |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
55 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
56 |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
57 -- Parse Dovecot's handshake |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 local done = false; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 while (not done) do |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
60 local l = provider:receive(); |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
61 if (not l) then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
62 return false; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
63 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
64 |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
65 log("debug", "dovecot handshake: '%s'", l); |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 parts = string.gmatch(l, "[^\t]+"); |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 first = parts(); |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 if (first == "VERSION") then |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
69 -- Version should be 1.1 |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
70 local v1 = parts(); |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
71 local v2 = parts(); |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
72 |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
73 if (not (v1 == "1" and v2 == "1")) then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
74 log("warn", "server version is not 1.1. it is %s.%s", v1, v2); |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
75 provider:close(); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
76 return false; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
77 end |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 elseif (first == "MECH") then |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
79 -- Mechanisms should include PLAIN |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 local ok = false; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 for p in parts do |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 if p == "PLAIN" then |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 ok = true; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 end |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 end |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
86 if (not ok) then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
87 log("warn", "server doesn't support PLAIN mechanism. It supports '%s'", l); |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
88 provider:close(); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
89 return false; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
90 end |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 elseif (first == "DONE") then |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 done = true; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 end |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 end |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
95 return true; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
96 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
97 |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
98 -- Wrapper for send(). Handles errors |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
99 function provider.send(self, data) |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
100 local r, e = provider.c:send(data); |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
101 if (not r) then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
102 log("warn", "error sending '%s' to dovecot. error was '%s'", data, e); |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
103 provider:close(); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
104 return false; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
105 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
106 return true; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
107 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
108 |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
109 -- Wrapper for receive(). Handles errors |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
110 function provider.receive(self) |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
111 local r, e = provider.c:receive(); |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
112 if (not r) then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
113 log("warn", "error receiving data from dovecot. error was '%s'", socket, e); |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
114 provider:close(); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
115 return false; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
116 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
117 return r; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
118 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
119 |
274
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
120 function provider.send_auth_request(self, username, password) |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
121 if (provider.c == nil) then |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
122 if (not provider:connect()) then |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
123 return nil, "Auth failed. Dovecot communications error"; |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
124 end |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
125 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
126 |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 -- Send auth data |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 username = username .. "@" .. module.host; -- FIXME: this is actually a hack for my server |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 local b64 = base64.encode(username .. "\0" .. username .. "\0" .. password); |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
130 provider.request_id = provider.request_id + 1 % 4294967296 |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
131 |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
132 local msg = "AUTH\t" .. provider.request_id .. "\tPLAIN\tservice=XMPP\tresp=" .. b64; |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
133 log("debug", "sending auth request for '%s' with password '%s': '%s'", username, password, msg); |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
134 if (not provider:send(msg .. "\n")) then |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
135 return nil, "Auth failed. Dovecot communications error"; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
136 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
137 |
272
6b35c23664db
mod_auth_dovecot: Use sequential (instead of fixed) id for messages
Javier Torres <javitonino@gmail.com>
parents:
271
diff
changeset
|
138 |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
139 -- Get response |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
140 local l = provider:receive(); |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
141 log("debug", "got auth response: '%s'", l); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
142 if (not l) then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
143 return nil, "Auth failed. Dovecot communications error"; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
144 end |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 local parts = string.gmatch(l, "[^\t]+"); |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
146 |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
147 -- Check response |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
148 local status = parts(); |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
149 local resp_id = tonumber(parts()); |
274
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
150 |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
151 if (resp_id ~= provider.request_id) then |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
152 log("warn", "dovecot response_id(%s) doesn't match request_id(%s)", resp_id, provider.request_id); |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
153 provider:close(); |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
154 return nil, "Auth failed. Dovecot communications error"; |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
155 end |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
156 |
274
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
157 return status, parts; |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
158 end |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
159 |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
160 function provider.test_password(username, password) |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
161 log("debug", "test password '%s' for user %s at host %s", password, username, module.host); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
162 |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
163 local status, extra = provider:send_auth_request(username, password); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
164 |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
165 if (status == "OK") then |
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
166 log("info", "login ok for '%s'", username); |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 return true; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 else |
273
8d283ae7f29d
mod_auth_dovecot: More debug messages
Javier Torres <javitonino@gmail.com>
parents:
272
diff
changeset
|
169 log("info", "login failed for '%s'", username); |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 return nil, "Auth failed. Invalid username or password."; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 end |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 end |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
173 |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 function provider.get_password(username) |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 return nil, "Cannot get_password in dovecot backend."; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 end |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 function provider.set_password(username, password) |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 return nil, "Cannot set_password in dovecot backend."; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 end |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
181 |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 function provider.user_exists(username) |
274
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
183 log("debug", "user_exists for user %s at host %s", username, module.host); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
184 |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
185 -- Send a request. If the response (FAIL) contains an extra |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
186 -- parameter like user=<username> then it exists. |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
187 local status, extra = provider:send_auth_request(username, ""); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
188 |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
189 local param = extra(); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
190 while (param) do |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
191 parts = string.gmatch(param, "[^=]+"); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
192 name = parts(); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
193 value = parts(); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
194 if (name == "user") then |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
195 log("info", "user '%s' exists", username); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
196 return true; |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
197 end |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
198 |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
199 param = extra(); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
200 end |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
201 |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
202 log("info", "user '%s' does not exists (or dovecot didn't send user=<username> parameter)", username); |
cda4855863af
mod_auth_dovecot: Implement user_exists
Javier Torres <javitonino@gmail.com>
parents:
273
diff
changeset
|
203 return false; |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 end |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
205 |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 function provider.create_user(username, password) |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
207 return nil, "Cannot create_user in dovecot backend."; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 end |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
209 |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 function provider.get_sasl_handler() |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 local realm = module:get_option("sasl_realm") or module.host; |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 local getpass_authentication_profile = { |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 plain_test = function(username, password, realm) |
268
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
214 local prepped_username = nodeprep(username); |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
215 if not prepped_username then |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
216 log("debug", "NODEprep failed on username: %s", username); |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
217 return "", nil; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
218 end |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
219 return usermanager.test_password(prepped_username, realm, password), true; |
cfcd4efb0fa4
mod_auth_dovecot: Remove asserts (use logger) and refactor socket code
Javier Torres <javitonino@gmail.com>
parents:
267
diff
changeset
|
220 end |
269
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
221 }; |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
222 return new_sasl(realm, getpass_authentication_profile); |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
223 end |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
224 |
74846ec9c29f
mod_auth_dovecot: Close socket on error
Javier Torres <javitonino@gmail.com>
parents:
268
diff
changeset
|
225 return provider; |
261
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
226 end |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
227 |
0f46fb2dbc79
mod_auth_dovecot: Initial commit of Dovecot authentication backend by Javier Torres
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
228 module:add_item("auth-provider", new_default_provider(module.host)); |