Mercurial > prosody-modules
comparison mod_sasl2_fast/mod_sasl2_fast.lua @ 5076:eb46abc65dfd
mod_sasl2_fast: Improved logging
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sat, 15 Oct 2022 19:49:13 +0100 |
| parents | ba2f1292d5fe |
| children | e900bbd2e70d |
comparison
equal
deleted
inserted
replaced
| 5075:ba2f1292d5fe | 5076:eb46abc65dfd |
|---|---|
| 10 | 10 |
| 11 local xmlns_fast = "urn:xmpp:fast:0"; | 11 local xmlns_fast = "urn:xmpp:fast:0"; |
| 12 local xmlns_sasl2 = "urn:xmpp:sasl:2"; | 12 local xmlns_sasl2 = "urn:xmpp:sasl:2"; |
| 13 | 13 |
| 14 local token_store = module:open_store("fast_tokens", "map"); | 14 local token_store = module:open_store("fast_tokens", "map"); |
| 15 | |
| 16 local log = module._log; | |
| 15 | 17 |
| 16 local function make_token(username, client_id, mechanism) | 18 local function make_token(username, client_id, mechanism) |
| 17 local new_token = "secret-token:fast-"..id.long(); | 19 local new_token = "secret-token:fast-"..id.long(); |
| 18 local key = hash.sha256(client_id, true).."-new"; | 20 local key = hash.sha256(client_id, true).."-new"; |
| 19 local issued_at = now(); | 21 local issued_at = now(); |
| 33 return function (mechanism, username, client_id, token_hash, cb_data) | 35 return function (mechanism, username, client_id, token_hash, cb_data) |
| 34 local tried_current_token = false; | 36 local tried_current_token = false; |
| 35 local key = hash.sha256(client_id, true).."-new"; | 37 local key = hash.sha256(client_id, true).."-new"; |
| 36 local token; | 38 local token; |
| 37 repeat | 39 repeat |
| 40 log("debug", "Looking for %s token %s/%s", mechanism, username, key); | |
| 38 token = token_store:get(username, key); | 41 token = token_store:get(username, key); |
| 39 if token and token.mechanism == mechanism then | 42 if token and token.mechanism == mechanism then |
| 40 local expected_hash = hmac_f(token.secret, "Initiator"..cb_data); | 43 local expected_hash = hmac_f(token.secret, "Initiator"..cb_data); |
| 41 if hash.equals(expected_hash, token_hash) then | 44 if hash.equals(expected_hash, token_hash) then |
| 42 if token.expires_at < now() then | 45 if token.expires_at < now() then |
| 52 end | 55 end |
| 53 return true, username, hmac_f(token.secret, "Responder"..cb_data); | 56 return true, username, hmac_f(token.secret, "Responder"..cb_data); |
| 54 end | 57 end |
| 55 end | 58 end |
| 56 if not tried_current_token then | 59 if not tried_current_token then |
| 60 log("debug", "Trying next token..."); | |
| 57 -- Try again with the current token instead | 61 -- Try again with the current token instead |
| 58 tried_current_token = true; | 62 tried_current_token = true; |
| 59 key = key:sub(1, -4).."-cur"; | 63 key = key:sub(1, -4).."-cur"; |
| 60 else | 64 else |
| 65 log("debug", "No matching %s token found for %s/%s", mechanism, username, key); | |
| 61 return nil; | 66 return nil; |
| 62 end | 67 end |
| 63 until false; | 68 until false; |
| 64 end | 69 end |
| 65 end | 70 end |
| 105 fast_sasl_handler.profile._client_id = client_id; | 110 fast_sasl_handler.profile._client_id = client_id; |
| 106 fast_sasl_handler.profile.cb = session.sasl_handler.profile.cb; | 111 fast_sasl_handler.profile.cb = session.sasl_handler.profile.cb; |
| 107 fast_sasl_handler.userdata = session.sasl_handler.userdata; | 112 fast_sasl_handler.userdata = session.sasl_handler.userdata; |
| 108 session.sasl_handler = fast_sasl_handler; | 113 session.sasl_handler = fast_sasl_handler; |
| 109 else | 114 else |
| 110 session.log("warn", "Client asked to auth via FAST, but no SASL handler available"); | 115 session.log("warn", "Client asked to auth via FAST, but SASL handler or client id missing"); |
| 111 local failure = st.stanza("failure", { xmlns = xmlns_sasl2 }) | 116 local failure = st.stanza("failure", { xmlns = xmlns_sasl2 }) |
| 112 :tag("malformed-request"):up() | 117 :tag("malformed-request"):up() |
| 113 :text_tag("text", "FAST is not available on this stream"); | 118 :text_tag("text", "FAST is not available on this stream"); |
| 114 session.send(failure); | 119 session.send(failure); |
| 115 return true; | 120 return true; |
