Software /
code /
prosody-modules
Changeset
6036:1ef53e0264f4
mod_sasl2: hook for modules to implement tasks
author | Stephen Paul Weber <singpolyma@singpolyma.net> |
---|---|
date | Fri, 01 Nov 2024 11:09:49 -0500 |
parents | 6035:9b50ee822638 |
children | 6037:277ccafb4826 |
files | mod_sasl2/mod_sasl2.lua |
diffstat | 1 files changed, 41 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mod_sasl2/mod_sasl2.lua Fri Nov 01 11:08:26 2024 -0500 +++ b/mod_sasl2/mod_sasl2.lua Fri Nov 01 11:09:49 2024 -0500 @@ -155,9 +155,27 @@ handle_status(session, "failure", err); return true; end - event.success = st.stanza("success", { xmlns = xmlns_sasl2 }); - if event.message then - event.success:text_tag("additional-data", base64.encode(event.message)); + local tasks = module:fire_event("sasl2/c2s/tasks", { session = session }) + if tasks then + local continue = st.stanza("continue", { xmlns = xmlns_sasl2 }); + if event.message then + continue:text_tag("additional-data", base64.encode(event.message)); + end + if tasks.text then + continue:text_tag("text", tasks.text) + end + continue:tag("tasks"); + for task in pairs(tasks.tasks) do + continue:text_tag("task", task) + end + session.tasks = tasks.tasks; + session.send(continue); + return true; + else + event.success = st.stanza("success", { xmlns = xmlns_sasl2 }); + if event.message then + event.success:text_tag("additional-data", base64.encode(event.message)); + end end end, 1000); @@ -226,3 +244,23 @@ end return process_cdata(session, response:get_text()); end); + +module:hook_tag(xmlns_sasl2, "next", function (session, next) + if not session.tasks or not next.attr.task or not session.tasks[next.attr.task] then + return handle_status(session, "failure", "invalid-mechanism"); + end + + session.task = session.tasks[next.attr.task]; + session.tasks = nil; + session.task(session, next); + return true; +end); + +module:hook_tag(xmlns_sasl2, "task-data", function (session, data) + if not session.task then + return handle_status(session, "failure", "invalid-mechanism"); + end + + session.task(session, data); + return true; +end);