Mercurial > prosody-modules
comparison mod_auth_external/mod_auth_external.lua @ 1161:b9e4d935867c
mod_auth_external: Support for multiple auth processes (set external_auth_processes = N) - requires non-blocking mode
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 14 Aug 2013 02:38:50 +0100 |
| parents | 05685fd07395 |
| children | f502cbffbdd4 |
comparison
equal
deleted
inserted
replaced
| 1160:05685fd07395 | 1161:b9e4d935867c |
|---|---|
| 17 | 17 |
| 18 local log = module._log; | 18 local log = module._log; |
| 19 local host = module.host; | 19 local host = module.host; |
| 20 | 20 |
| 21 local script_type = module:get_option_string("external_auth_protocol", "generic"); | 21 local script_type = module:get_option_string("external_auth_protocol", "generic"); |
| 22 assert(script_type == "ejabberd" or script_type == "generic", "Config error: external_auth_protocol must be 'ejabberd' or 'generic'"); | |
| 23 local command = module:get_option_string("external_auth_command", ""); | 22 local command = module:get_option_string("external_auth_command", ""); |
| 24 local read_timeout = module:get_option_number("external_auth_timeout", 5); | 23 local read_timeout = module:get_option_number("external_auth_timeout", 5); |
| 24 local blocking = module:get_option_boolean("external_auth_blocking", not(have_async and server.event and lpty.getfd)); | |
| 25 local auth_processes = module:get_option_number("external_auth_processes", 1); | |
| 26 | |
| 27 assert(script_type == "ejabberd" or script_type == "generic", "Config error: external_auth_protocol must be 'ejabberd' or 'generic'"); | |
| 25 assert(not host:find(":"), "Invalid hostname"); | 28 assert(not host:find(":"), "Invalid hostname"); |
| 26 | 29 |
| 27 local blocking = module:get_option_boolean("external_auth_blocking", not(have_async and server.event and lpty.getfd)); | |
| 28 | 30 |
| 29 if not blocking then | 31 if not blocking then |
| 30 log("debug", "External auth in non-blocking mode, yay!") | 32 log("debug", "External auth in non-blocking mode, yay!") |
| 31 waiter, guard = async.waiter, async.guarder(); | 33 waiter, guard = async.waiter, async.guarder(); |
| 34 elseif auth_processes > 1 then | |
| 35 log("warn", "external_auth_processes is greater than 1, but we are in blocking mode - reducing to 1"); | |
| 36 auth_processes = 1; | |
| 32 end | 37 end |
| 33 | 38 |
| 34 local ptys = { lpty.new({ throw_errors = false, no_local_echo = true, use_path = false }) }; | 39 local ptys = {}; |
| 35 | 40 |
| 41 local pty_options = { throw_errors = false, no_local_echo = true, use_path = false }; | |
| 42 for i = 1, auth_processes do | |
| 43 ptys[i] = lpty.new(pty_options); | |
| 44 end | |
| 45 | |
| 46 local curr_process = 0; | |
| 36 function send_query(text) | 47 function send_query(text) |
| 37 local pty = ptys[1]; | 48 curr_process = (curr_process%auth_processes)+1; |
| 49 local pty = ptys[curr_process]; | |
| 38 | 50 |
| 39 local finished_with_pty | 51 local finished_with_pty |
| 40 if not blocking then | 52 if not blocking then |
| 41 finished_with_pty = guard(pty); -- Prevent others from crossing this line while we're busy | 53 finished_with_pty = guard(pty); -- Prevent others from crossing this line while we're busy |
| 42 end | 54 end |
