comparison mod_auth_ldap/mod_auth_ldap.lua @ 1611:770236ea9678

mod_auth_ldap: Fix use of ldap_search, and generalize it to support password modification as well.
author Waqas Hussain <waqas20@gmail.com>
date Fri, 13 Feb 2015 11:06:06 -0500
parents 062ed39a1805
children 6d7699eda594
comparison
equal deleted inserted replaced
1610:062ed39a1805 1611:770236ea9678
17 17
18 -- Initiate connection 18 -- Initiate connection
19 local ld = nil; 19 local ld = nil;
20 module.unload = function() if ld then pcall(ld, ld.close); end end 20 module.unload = function() if ld then pcall(ld, ld.close); end end
21 21
22 function ldap_search_once(args) 22 function ldap_do_once(method, ...)
23 if ld == nil then 23 if ld == nil then
24 local err; 24 local err;
25 ld, err = lualdap.open_simple(ldap_server, ldap_rootdn, ldap_password, ldap_tls); 25 ld, err = lualdap.open_simple(ldap_server, ldap_rootdn, ldap_password, ldap_tls);
26 if not ld then return nil, err, "reconnect"; end 26 if not ld then return nil, err, "reconnect"; end
27 end 27 end
28 28
29 local success, iterator, invariant, initial = pcall(ld.search, ld, args); 29 local success, iterator, invariant, initial = pcall(ld[method], ld, ...);
30 if not success then ld = nil; return nil, iterator, "search"; end 30 if not success then ld = nil; return nil, iterator, "search"; end
31 31
32 local success, dn, attr = pcall(iterator, invariant, initial); 32 local success, dn, attr = pcall(iterator, invariant, initial);
33 if not success then ld = nil; return success, dn, "iter"; end 33 if not success then ld = nil; return success, dn, "iter"; end
34 34
35 return dn, attr, "return"; 35 return dn, attr, "return";
36 end 36 end
37 37
38 function ldap_search(args, retry_count) 38 function ldap_do(method, retry_count, ...)
39 local dn, attr, where; 39 local dn, attr, where;
40 for i=1,1+retry_count do 40 for i=1,1+retry_count do
41 dn, attr, where = ldap_search_once(args); 41 dn, attr, where = ldap_do_once(method, ...);
42 if dn or not(attr) then break; end -- nothing or something found 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); 43 module:log("warn", "LDAP: %s %s (in %s)", tostring(dn), tostring(attr), where);
44 -- otherwise retry 44 -- otherwise retry
45 end 45 end
46 if not dn and attr then 46 if not dn and attr then
49 return dn, attr; 49 return dn, attr;
50 end 50 end
51 51
52 local function get_user(username) 52 local function get_user(username)
53 module:log("debug", "get_user(%q)", username); 53 module:log("debug", "get_user(%q)", username);
54 for dn, attr in ldap_search({ 54 return ldap_do("search", 2, {
55 base = ldap_base; 55 base = ldap_base;
56 scope = ldap_scope; 56 scope = ldap_scope;
57 sizelimit = 1; 57 sizelimit = 1;
58 filter = ldap_filter:gsub("%$(%a+)", { 58 filter = ldap_filter:gsub("%$(%a+)", {
59 user = ldap_filter_escape(username); 59 user = ldap_filter_escape(username);
60 host = host; 60 host = host;
61 }); 61 });
62 }, 3) do return dn, attr; end 62 });
63 end 63 end
64 64
65 local provider = {}; 65 local provider = {};
66 66
67 function provider.create_user(username, password) 67 function provider.create_user(username, password)
74 74
75 function provider.set_password(username, password) 75 function provider.set_password(username, password)
76 local dn, attr = get_user(username); 76 local dn, attr = get_user(username);
77 if not dn then return nil, attr end 77 if not dn then return nil, attr end
78 if attr.userPassword == password then return true end 78 if attr.userPassword == password then return true end
79 return ld:modify(dn, { '=', userPassword = password })(); 79 return ldap_do("modify", 2, dn, { '=', userPassword = password });
80 end 80 end
81 81
82 if ldap_mode == "getpasswd" then 82 if ldap_mode == "getpasswd" then
83 function provider.get_password(username) 83 function provider.get_password(username)
84 local dn, attr = get_user(username); 84 local dn, attr = get_user(username);