10 -- |
10 -- |
11 |
11 |
12 |
12 |
13 local nodeprep = require "util.encodings".stringprep.nodeprep; |
13 local nodeprep = require "util.encodings".stringprep.nodeprep; |
14 --local process = require "process"; |
14 --local process = require "process"; |
15 local lpc = require "lpc"; |
15 local lpc; pcall(function() lpc = require "lpc"; end); |
16 |
16 |
17 local config = require "core.configmanager"; |
17 local config = require "core.configmanager"; |
18 local log = module._log; |
18 local log = module._log; |
19 local host = module.host; |
19 local host = module.host; |
20 local script_type = config.get(host, "core", "external_auth_protocol") or "generic"; |
20 local script_type = config.get(host, "core", "external_auth_protocol") or "generic"; |
24 assert(not host:find(":")); |
24 assert(not host:find(":")); |
25 local usermanager = require "core.usermanager"; |
25 local usermanager = require "core.usermanager"; |
26 local jid_bare = require "util.jid".bare; |
26 local jid_bare = require "util.jid".bare; |
27 local new_sasl = require "util.sasl".new; |
27 local new_sasl = require "util.sasl".new; |
28 |
28 |
29 --local proc; |
29 local function send_query(text) |
30 local pid; |
30 local tmpname = os.tmpname(); |
31 local readfile; |
31 local tmpfile = io.open(tmpname, "wb"); |
32 local writefile; |
32 tmpfile:write(text); |
|
33 tmpfile:close(); |
|
34 local p = io.popen(command.." < "..tmpname, "r"); |
|
35 local result; |
|
36 if script_type == "ejabberd" then |
|
37 result = p:read(4); |
|
38 elseif script_type == "generic" then |
|
39 result = p:read(); |
|
40 end |
|
41 os.remove(tmpname); |
|
42 p:close(); |
|
43 return result; |
|
44 end |
33 |
45 |
34 local function send_query(text) |
46 if lpc then |
35 if pid and lpc.wait(pid,1) ~= nil then |
47 --local proc; |
36 log("debug","error, process died, force reopen"); |
48 local pid; |
37 pid=nil; |
49 local readfile; |
38 end |
50 local writefile; |
39 if not pid then |
|
40 log("debug", "Opening process " .. command); |
|
41 -- proc = process.popen(command); |
|
42 pid, writefile, readfile = lpc.run(command); |
|
43 end |
|
44 -- if not proc then |
|
45 if not pid then |
|
46 log("debug", "Process failed to open"); |
|
47 return nil; |
|
48 end |
|
49 -- proc:write(text); |
|
50 -- proc:flush(); |
|
51 |
51 |
52 writefile:write(text); |
52 function send_query(text) |
53 writefile:flush(); |
53 if pid and lpc.wait(pid,1) ~= nil then |
54 if script_type == "ejabberd" then |
54 log("debug","error, process died, force reopen"); |
55 -- return proc:read(4); -- FIXME do properly |
55 pid=nil; |
56 return readfile:read(4); -- FIXME do properly |
56 end |
57 elseif script_type == "generic" then |
57 if not pid then |
58 -- return proc:read(1); |
58 log("debug", "Opening process " .. command); |
59 return readfile:read(); |
59 -- proc = process.popen(command); |
|
60 pid, writefile, readfile = lpc.run(command); |
|
61 end |
|
62 -- if not proc then |
|
63 if not pid then |
|
64 log("debug", "Process failed to open"); |
|
65 return nil; |
|
66 end |
|
67 -- proc:write(text); |
|
68 -- proc:flush(); |
|
69 |
|
70 writefile:write(text); |
|
71 writefile:flush(); |
|
72 if script_type == "ejabberd" then |
|
73 -- return proc:read(4); -- FIXME do properly |
|
74 return readfile:read(4); -- FIXME do properly |
|
75 elseif script_type == "generic" then |
|
76 -- return proc:read(1); |
|
77 return readfile:read(); |
|
78 end |
60 end |
79 end |
61 end |
80 end |
62 |
81 |
63 function do_query(kind, username, password) |
82 function do_query(kind, username, password) |
64 if not username then return nil, "not-acceptable"; end |
83 if not username then return nil, "not-acceptable"; end |