Mercurial > prosody-modules
view mod_log_slow_events/mod_log_slow_events.lua @ 5549:01a0b67a9afd
mod_http_oauth2: Add TODO about disabling password grant
Per recommendation in draft-ietf-oauth-security-topics-23 it should at
the very least be disabled by default.
However since this is used by the Snikket web portal some care needs to
be taken not to break this, unless it's already broken by other changes
to this module.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 16 Jun 2023 00:06:53 +0200 |
parents | 3ba8fd1a297e |
children |
line wrap: on
line source
module:set_global(); local time = require "socket".gettime; local base64_decode = require "util.encodings".base64.decode; local max_seconds = module:get_option_number("log_slow_events_threshold", 0.5); local measure_slow_event = module:measure("slow_events", "rate"); function event_wrapper(handlers, event_name, event_data) local start = time(); local ret = handlers(event_name, event_data); local duration = time()-start; if duration > max_seconds then local data = {}; if event_data then local function log_data(name, value) if value then table.insert(data, ("%s=%q"):format(name, value)); return true; end end local sess = event_data.origin or event_data.session; if sess then log_data("ip", sess.ip); if not log_data("full_jid", sess.full_jid) then log_data("username", sess.username); end log_data("type", sess.type); log_data("host", sess.host); end local stanza = event_data.stanza; if stanza then log_data("stanza", tostring(stanza)); else local request = event_data.request; if request then log_data("http_method", request.method); log_data("http_path", request.path); local auth = request.headers.authorization; if auth then local creds = auth:match("^Basic +(.+)$"); if creds then local user = string.match(base64_decode(creds) or "", "^([^:]+):"); log_data("http_user", user); end end end end end measure_slow_event(); module:log("warn", "Slow event '%s' took %0.2fs: %s", event_name, duration, next(data) and table.concat(data, ", ") or "no recognised data"); end return ret; end local http_events = require "net.http.server"._events; module:wrap_object_event(http_events, false, event_wrapper); module:wrap_event(false, event_wrapper); function module.add_host(module) module:wrap_event(false, event_wrapper); end