comparison mod_auth_ldap/mod_auth_ldap.lua @ 2056:e16593e7d482

mod_auth_ldap: Add support for having admin status indicated in LDAP
author Kim Alvefur <zash@zash.se>
date Tue, 01 Mar 2016 10:40:25 +0100
parents 6d7699eda594
children 41565a743cad
comparison
equal deleted inserted replaced
2055:2c6d84fb82d9 2056:e16593e7d482
1 -- mod_auth_ldap 1 -- mod_auth_ldap
2 2
3 local jid_split = require "util.jid".split;
3 local new_sasl = require "util.sasl".new; 4 local new_sasl = require "util.sasl".new;
4 local lualdap = require "lualdap"; 5 local lualdap = require "lualdap";
5 local function ldap_filter_escape(s) return (s:gsub("[*()\\%z]", function(c) return ("\\%02x"):format(c:byte()) end)); end 6 local function ldap_filter_escape(s) return (s:gsub("[*()\\%z]", function(c) return ("\\%02x"):format(c:byte()) end)); end
6 7
7 -- Config options 8 -- Config options
11 local ldap_tls = module:get_option_boolean("ldap_tls"); 12 local ldap_tls = module:get_option_boolean("ldap_tls");
12 local ldap_scope = module:get_option_string("ldap_scope", "subtree"); 13 local ldap_scope = module:get_option_string("ldap_scope", "subtree");
13 local ldap_filter = module:get_option_string("ldap_filter", "(uid=$user)"):gsub("%%s", "$user", 1); 14 local ldap_filter = module:get_option_string("ldap_filter", "(uid=$user)"):gsub("%%s", "$user", 1);
14 local ldap_base = assert(module:get_option_string("ldap_base"), "ldap_base is a required option for ldap"); 15 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"); 16 local ldap_mode = module:get_option_string("ldap_mode", "bind");
17 local ldap_admins = module:get_option_string("ldap_admin_filter");
16 local host = ldap_filter_escape(module:get_option_string("realm", module.host)); 18 local host = ldap_filter_escape(module:get_option_string("realm", module.host));
17 19
18 -- Initiate connection 20 -- Initiate connection
19 local ld = nil; 21 local ld = nil;
20 module.unload = function() if ld then pcall(ld, ld.close); end end 22 module.unload = function() if ld then pcall(ld, ld.close); end end
120 end 122 end
121 else 123 else
122 module:log("error", "Unsupported ldap_mode %s", tostring(ldap_mode)); 124 module:log("error", "Unsupported ldap_mode %s", tostring(ldap_mode));
123 end 125 end
124 126
127 if ldap_admins then
128 function provider.is_admin(jid)
129 local username = jid_split(jid);
130 return ldap_do("search", 2, {
131 base = ldap_base;
132 scope = ldap_scope;
133 sizelimit = 1;
134 filter = ldap_admins:gsub("%$(%a+)", {
135 user = ldap_filter_escape(username);
136 host = host;
137 });
138 });
139 end
140 end
141
125 module:provides("auth", provider); 142 module:provides("auth", provider);