comparison mod_auth_ldap/mod_auth_ldap.lua @ 1609:5f139770061e

mod_auth_ldap: Connect to LDAP lazily, and add support for reconnects on error.
author Waqas Hussain <waqas20@gmail.com>
date Thu, 12 Feb 2015 18:57:06 -0500
parents 9a0a0cfd3710
children 062ed39a1805
comparison
equal deleted inserted replaced
1608:59fdf4f12343 1609:5f139770061e
14 local ldap_base = assert(module:get_option_string("ldap_base"), "ldap_base is a required option for ldap"); 14 local ldap_base = assert(module:get_option_string("ldap_base"), "ldap_base is a required option for ldap");
15 local ldap_mode = module:get_option_string("ldap_mode", "bind"); 15 local ldap_mode = module:get_option_string("ldap_mode", "bind");
16 local host = ldap_filter_escape(module:get_option_string("realm", module.host)); 16 local host = ldap_filter_escape(module:get_option_string("realm", module.host));
17 17
18 -- Initiate connection 18 -- Initiate connection
19 local ld = assert(lualdap.open_simple(ldap_server, ldap_rootdn, ldap_password, ldap_tls)); 19 local ld = nil;
20 module.unload = function() ld:close(); end 20 module.unload = function() if ld then pcall(ld, ld.close); end end
21
22 function ldap_search_once(args)
23 if ld == nil then
24 local err;
25 ld, err = lualdap.open_simple(ldap_server, ldap_rootdn, ldap_password, ldap_tls);
26 if not ld then return nil, err, "reconnect"; end
27 end
28
29 local success, iterator, invariant, initial = pcall(ld.search, ld, args);
30 if not success then ld = nil; return nil, iterator, "search"; end
31
32 local success, dn, attr = pcall(iterator, invariant, initial);
33 if not success then ld = nil; return success, dn, "iter"; end
34
35 return dn, attr, "return";
36 end
37
38 function ldap_search(args, retry_count)
39 local dn, attr, where;
40 for i=1,1+retry_count do
41 dn, attr, where = ldap_search_once(args);
42 if dn or not(attr) then break; end -- nothing or something found
43 module:log("warn", "LDAP: %s %s (in %s)", tostring(dn), tostring(attr), where);
44 -- otherwise retry
45 end
46 if not dn and attr then
47 module:log("error", "LDAP: %s", tostring(attr));
48 end
49 return dn, attr;
50 end
21 51
22 local function get_user(username) 52 local function get_user(username)
23 module:log("debug", "get_user(%q)", username); 53 module:log("debug", "get_user(%q)", username);
24 for dn, attr in ld:search({ 54 for dn, attr in ld:search({
25 base = ldap_base; 55 base = ldap_base;