Mercurial > prosody-modules
comparison mod_muc_rtbl/mod_muc_rtbl.lua @ 4807:62a65c52c3f5
mod_muc_rtbl: Real-time blocklist checks for MUC services
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 05 Dec 2021 18:22:47 +0000 |
| parents | |
| children | 8a63a0daf129 |
comparison
equal
deleted
inserted
replaced
| 4806:80f871bedcdf | 4807:62a65c52c3f5 |
|---|---|
| 1 local jid = require "util.jid"; | |
| 2 local sha256 = require "util.hashes".sha256; | |
| 3 local st = require "util.stanza"; | |
| 4 | |
| 5 local rtbl_service_jid = assert(module:get_option_string("muc_rtbl_jid"), "No RTBL JID supplied"); | |
| 6 local rtbl_node = module:get_option_string("muc_rtbl_node", "muc_bans_sha256"); | |
| 7 | |
| 8 local banned_hashes = module:shared("banned_hashes"); | |
| 9 | |
| 10 module:depends("pubsub_subscription"); | |
| 11 | |
| 12 module:add_item("pubsub-subscription", { | |
| 13 service = rtbl_service_jid; | |
| 14 node = rtbl_node; | |
| 15 | |
| 16 -- Callbacks: | |
| 17 on_subscribed = function() | |
| 18 module:log("info", "RTBL active"); | |
| 19 end; | |
| 20 | |
| 21 on_error = function(err) | |
| 22 module:log("error", "Failed to subscribe to RTBL: %s::%s: %s", err.type, err.condition, err.text); | |
| 23 end; | |
| 24 | |
| 25 on_item = function(event) | |
| 26 local hash = event.item.attr.id; | |
| 27 if not hash then return; end | |
| 28 module:log("debug", "Received new hash: %s", hash); | |
| 29 banned_hashes[hash] = hash; | |
| 30 end; | |
| 31 | |
| 32 on_retract = function (event) | |
| 33 local hash = event.item.attr.id; | |
| 34 if not hash then return; end | |
| 35 module:log("debug", "Retracted hash: %s", hash); | |
| 36 banned_hashes[hash] = nil; | |
| 37 end; | |
| 38 }); | |
| 39 | |
| 40 module:hook("muc-occupant-pre-join", function (event) | |
| 41 local from_bare = jid.bare(event.stanza.attr.from); | |
| 42 local hash = sha256(jid.bare(event.stanza.attr.from), true); | |
| 43 if banned_hashes[hash] then | |
| 44 module:log("info", "Blocked user <%s> from room <%s> due to RTBL match", from_bare, event.stanza.attr.to); | |
| 45 local error_reply = st.error_reply(event.stanza, "cancel", "forbidden", "You are banned from this service", event.room.jid); | |
| 46 event.origin.send(error_reply); | |
| 47 return true; | |
| 48 end | |
| 49 end); |
