util.iterators: Add skip() to skip the first n items of an iterator
[prosody.git] / util / sasl.lua
index 9c8fff7804a28edd6b7e4e430b846d3d23093696..5d1b9f17f3d5e2e8e76f517b522bf45ebfee20c7 100644 (file)
@@ -1,5 +1,5 @@
 -- sasl.lua v0.4
--- Copyright (C) 2008-2009 Tobias Markmann
+-- Copyright (C) 2008-2010 Tobias Markmann
 --
 --    All rights reserved.
 --
@@ -41,27 +41,6 @@ Authentication Backend Prototypes:
 state = false : disabled
 state = true : enabled
 state = nil : non-existant
-
-plain:
-       function(username, realm)
-               return password, state;
-       end
-
-plain-test:
-       function(username, realm, password)
-               return true or false, state;
-       end
-
-digest-md5:
-       function(username, domain, realm, encoding) -- domain and realm are usually the same; for some broken
-                                                                                               -- implementations it's not
-               return digesthash, state;
-       end
-
-digest-md5-test:
-       function(username, domain, realm, encoding, digesthash)
-               return true or false, state;
-       end
 ]]
 
 local method = {};
@@ -109,18 +88,21 @@ end
 
 -- get a list of possible SASL mechanims to use
 function method:mechanisms()
-       local mechanisms = {}
-       for backend, f in pairs(self.profile) do
-               if backend_mechanism[backend] then
-                       for _, mechanism in ipairs(backend_mechanism[backend]) do
-                               if not self.restrict:contains(mechanism) then
-                                       mechanisms[mechanism] = true;
+       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
+                                       if not self.restrict:contains(mechanism) then
+                                               mechanisms[mechanism] = true;
+                                       end
                                end
                        end
                end
+               self.mechs = mechanisms;
        end
-       self["possible_mechanisms"] = mechanisms;
-       return array.collect(keys(mechanisms));
+       return mechanisms;
 end
 
 -- select a mechanism to use
@@ -129,11 +111,8 @@ function method:select(mechanism)
                return false;
        end
        
-       self.mech_i = mechanisms[mechanism]
-       if self.mech_i == nil then 
-               return false;
-       end
-       return true;
+       self.mech_i = mechanisms[self:mechanisms()[mechanism] and mechanism];
+       return (self.mech_i ~= nil);
 end
 
 -- feed new messages to process into the library
@@ -143,7 +122,7 @@ function method:process(message)
 end
 
 -- load the mechanisms
-load_mechs = {"plain", "digest-md5", "anonymous", "scram"}
+local load_mechs = {"plain", "digest-md5", "anonymous", "scram"}
 for _, mech in ipairs(load_mechs) do
        local name = "util.sasl."..mech;
        local m = require(name);