X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fsasl_cyrus.lua;h=57c6ba3cbb3b68c3ad6d1ef9f1b75e123ad94011;hb=095d291f5356ff2450c11608fda6bdabc4286f91;hp=7e689f624956438d482bec10f310ffd3356c602e;hpb=c5cfbd9496c392a8963ab37f5e788a6be2fe5806;p=prosody.git diff --git a/util/sasl_cyrus.lua b/util/sasl_cyrus.lua index 7e689f62..57c6ba3c 100644 --- a/util/sasl_cyrus.lua +++ b/util/sasl_cyrus.lua @@ -31,12 +31,25 @@ module "sasl_cyrus" local method = {}; method.__index = method; - -pcall(cyrussasl.server_init, "prosody") +local initialized = false; + +local function init(service_name) + if not initialized then + local st, errmsg = pcall(cyrussasl.server_init, service_name); + if st then + initialized = true; + else + log("error", "Failed to initialize CyrusSASL: %s", errmsg); + end + end +end -- create a new SASL object which can be used to authenticate clients function new(realm, service_name) local sasl_i = {}; + + init(service_name); + sasl_i.realm = realm; sasl_i.service_name = service_name; sasl_i.cyrus = cyrussasl.server_new(service_name, nil, nil, nil, nil) @@ -64,17 +77,17 @@ end function method:mechanisms() local mechanisms = {} local cyrus_mechs = cyrussasl.listmech(self.cyrus, nil, "", " ", "") - for w in s_gmatch(cyrus_mechs, "%a+") do + for w in s_gmatch(cyrus_mechs, "[^ ]+") do mechanisms[w] = true; end - self.mechanisms = mechanisms + self.mechs = mechanisms return array.collect(keys(mechanisms)); end -- select a mechanism to use function method:select(mechanism) self.mechanism = mechanism; - return self.mechanisms[mechanism]; + return self.mechs[mechanism]; end -- feed new messages to process into the library @@ -100,7 +113,7 @@ function method:process(message) "undefined-condition", "SASL mechanism not available" elseif (err == -13) then -- SASL_BADAUTH - return "failure", "not-authorized" + return "failure", "not-authorized", cyrussasl.get_message( self.cyrus ) else log("debug", "Got SASL error condition %d", err) return "failure",