Comparison

util/sasl.lua @ 5841:1b0c7e7c6be8

Only advertise mechanisms needing channel binding if a channel binding backend is avaliable.
author Tobias Markmann <tm@ayena.de>
date Mon, 07 Feb 2011 13:24:42 +0100
parent 5831:aa4bdabd3c0f
child 5843:fb6573e191cf
comparison
equal deleted inserted replaced
5840:4b484e8feafc 5841:1b0c7e7c6be8
16 local t_insert = table.insert; 16 local t_insert = table.insert;
17 local type = type 17 local type = type
18 local setmetatable = setmetatable; 18 local setmetatable = setmetatable;
19 local assert = assert; 19 local assert = assert;
20 local require = require; 20 local require = require;
21 local print = print
21 22
22 module "sasl" 23 module "sasl"
23 24
24 --[[ 25 --[[
25 Authentication Backend Prototypes: 26 Authentication Backend Prototypes:
42 43
43 local method = {}; 44 local method = {};
44 method.__index = method; 45 method.__index = method;
45 local mechanisms = {}; 46 local mechanisms = {};
46 local backend_mechanism = {}; 47 local backend_mechanism = {};
48 local mechanism_channelbindings = {};
47 49
48 -- register a new SASL mechanims 50 -- register a new SASL mechanims
49 local function registerMechanism(name, backends, f) 51 local function registerMechanism(name, backends, f, cb_backends)
50 assert(type(name) == "string", "Parameter name MUST be a string."); 52 assert(type(name) == "string", "Parameter name MUST be a string.");
51 assert(type(backends) == "string" or type(backends) == "table", "Parameter backends MUST be either a string or a table."); 53 assert(type(backends) == "string" or type(backends) == "table", "Parameter backends MUST be either a string or a table.");
52 assert(type(f) == "function", "Parameter f MUST be a function."); 54 assert(type(f) == "function", "Parameter f MUST be a function.");
55 if cb_backends then assert(type(cb_backends) == "table"); end
53 mechanisms[name] = f 56 mechanisms[name] = f
57 if cb_backends then
58 mechanism_channelbindings[name] = {};
59 for _, cb_name in ipairs(cb_backends) do
60 mechanism_channelbindings[name][cb_name] = true;
61 end
62 end
54 for _, backend_name in ipairs(backends) do 63 for _, backend_name in ipairs(backends) do
55 if backend_mechanism[backend_name] == nil then backend_mechanism[backend_name] = {}; end 64 if backend_mechanism[backend_name] == nil then backend_mechanism[backend_name] = {}; end
56 t_insert(backend_mechanism[backend_name], name); 65 t_insert(backend_mechanism[backend_name], name);
57 end 66 end
58 end 67 end
84 return new(self.realm, self.profile) 93 return new(self.realm, self.profile)
85 end 94 end
86 95
87 -- get a list of possible SASL mechanims to use 96 -- get a list of possible SASL mechanims to use
88 function method:mechanisms() 97 function method:mechanisms()
89 return self.mechs; 98 local current_mechs = {};
99 for mech, _ in pairs(self.mechs) do
100 if mechanism_channelbindings[mech] and self.profile.cb then
101 local ok = false;
102 for cb_name, _ in pairs(self.profile.cb) do
103 if mechanism_channelbindings[mech][cb_name] then
104 ok = true;
105 end
106 end
107 if ok == true then current_mechs[mech] = true; end
108 else
109 current_mechs[mech] = true;
110 end
111 end
112 return current_mechs;
90 end 113 end
91 114
92 -- select a mechanism to use 115 -- select a mechanism to use
93 function method:select(mechanism) 116 function method:select(mechanism)
94 if not self.selected and self.mechs[mechanism] then 117 if not self.selected and self.mechs[mechanism] then