X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fsasl.lua;h=afb3861b08f90d70db33d9657da4df77efe43036;hb=84c934632367eac822fb6af2663032b67fd0a596;hp=30e4b5df12ce95a1807f1ad8b4200bc1c2651a11;hpb=8e8f8f1cd0ed80047c4d4910448240923ee14351;p=prosody.git diff --git a/util/sasl.lua b/util/sasl.lua index 30e4b5df..afb3861b 100644 --- a/util/sasl.lua +++ b/util/sasl.lua @@ -35,7 +35,7 @@ local mechanisms = {}; local backend_mechanism = {}; -- register a new SASL mechanims -local function registerMechanism(name, backends, f) +function registerMechanism(name, backends, f) assert(type(name) == "string", "Parameter name MUST be a string."); assert(type(backends) == "string" or type(backends) == "table", "Parameter backends MUST be either a string or a table."); assert(type(f) == "function", "Parameter f MUST be a function."); @@ -48,7 +48,19 @@ end -- create a new SASL object which can be used to authenticate clients function new(realm, profile) - return setmetatable({ profile = profile, realm = realm }, method); + local mechanisms = profile.mechanisms; + if not mechanisms then + mechanisms = {}; + for backend, f in pairs(profile) do + if backend_mechanism[backend] then + for _, mechanism in ipairs(backend_mechanism[backend]) do + mechanisms[mechanism] = true; + end + end + end + profile.mechanisms = mechanisms; + end + return setmetatable({ profile = profile, realm = realm, mechs = mechanisms }, method); end -- get a fresh clone with the same realm and profile @@ -58,35 +70,21 @@ end -- get a list of possible SASL mechanims to use function method:mechanisms() - local mechanisms = self.mechs; - if not mechanisms then - mechanisms = {} - for backend, f in pairs(self.profile) do - if backend_mechanism[backend] then - for _, mechanism in ipairs(backend_mechanism[backend]) do - mechanisms[mechanism] = true; - end - end - end - self.mechs = mechanisms; - end - return mechanisms; + return self.mechs; end -- select a mechanism to use function method:select(mechanism) - if self.mech_i then - return false; + if not self.selected and self.mechs[mechanism] then + self.selected = mechanism; + return true; end - - self.mech_i = mechanisms[self:mechanisms()[mechanism] and mechanism]; - return (self.mech_i ~= nil); end -- feed new messages to process into the library function method:process(message) --if message == "" or message == nil then return "failure", "malformed-request" end - return self.mech_i(self, message); + return mechanisms[self.selected](self, message); end -- load the mechanisms