Mercurial > prosody-modules
view mod_throttle_unsolicited/mod_throttle_unsolicited.lua @ 5264:d3ebaef1ea7a
mod_http_oauth2: Correctly verify OAuth client credentials on revocation
Makes no sense to validate against username and password here, or using
a token to revoke another token, or itself?
In fact, upon further discussion, why do you need credentials to revoke
a token? If you are not supposed to have the token, revoking it seems
the most responsible thing to do with it, so it should be allowed, while
if you are supposed to have it, you should be allowed to revoke it.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 21 Mar 2023 21:57:18 +0100 |
parents | 4d8a68557941 |
children |
line wrap: on
line source
local st = require"util.stanza"; local jid_split = require "util.jid".split; local jid_bare = require "util.jid".bare; local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; local throttle = require "util.throttle"; local gettime = require "socket".gettime; local max = module:get_option_number("unsolicited_messages_per_minute", 10); local s2s_max = module:get_option_number("unsolicited_s2s_messages_per_minute"); local multiplier = module:get_option_number("throttle_unsolicited_burst", 1); function check_subscribed(event) local stanza, origin = event.stanza, event.origin; local log = origin.log or module._log; if stanza.attr.type == "error" then return end local to_orig = stanza.attr.to; if to_orig == nil or to_orig == origin.full_jid then return end -- to self local to_bare = jid_bare(to_orig); local from_jid = jid_bare(stanza.attr.from); if to_bare == from_jid then return end -- to own resource -- Check if it's a message to a joined room local rooms = origin.rooms_joined; if rooms and rooms[to_bare] then return end -- Retrieve or create throttle object local lim = origin.throttle_unsolicited; if not lim then lim = throttle.create(max * multiplier, 60 * multiplier); origin.throttle_unsolicited = lim; end local to_user, to_host = jid_split(to_orig); if to_user and not is_contact_subscribed(to_user, to_host, from_jid) then log("debug", "[unsolicited] %s is not subscribed to %s@%s", from_jid, to_user, to_host); if not lim:poll(1) then log("warn", "[unsolicited] Sent too many messages to non-contacts, bouncing message"); origin.firewall_mark_unsolicited = gettime(); origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); return true; end end end module:hook("pre-message/bare", check_subscribed, 200); module:hook("pre-message/full", check_subscribed, 200); local full_sessions = prosody.full_sessions; -- Rooms and throttle creation will differ for s2s function check_subscribed_s2s(event) local stanza, origin = event.stanza, event.origin; local log = origin.log or module._log; if origin.type ~= "s2sin" then return end local to_orig = stanza.attr.to; local from_orig = stanza.attr.from; local from_bare = jid_bare(from_orig); local target = full_sessions[to_orig]; if target then local rooms = target.rooms_joined; if rooms and rooms[from_bare] then log("debug", "Message to joined room, no limit"); return end end -- Retrieve or create throttle object local lim = origin.throttle_unsolicited; if not lim then log("debug", "New s2s throttle"); lim = throttle.create(s2s_max * multiplier, 60 * multiplier); origin.throttle_unsolicited = lim; end return check_subscribed(event); end if s2s_max then module:hook("message/bare", check_subscribed_s2s, 200); module:hook("message/full", check_subscribed_s2s, 200); end module:depends("track_muc_joins");