Software /
code /
prosody-modules
Comparison
mod_adhoc_blacklist/mod_adhoc_blacklist.lua @ 1734:d82b03e79d8b
mod_adhoc_blacklist: Provides the Edit Blacklist command described in XEP-0133 and uses this to block s2s connections
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 14 May 2015 00:33:32 +0200 |
child | 1736:efbb73851af9 |
comparison
equal
deleted
inserted
replaced
1733:9abd3dce619a | 1734:d82b03e79d8b |
---|---|
1 -- mod_adhoc_blacklist | |
2 -- | |
3 -- http://xmpp.org/extensions/xep-0133.html#edit-blacklist | |
4 -- | |
5 -- Copyright (C) 2015 Kim Alvefur | |
6 -- | |
7 -- This file is MIT/X11 licensed. | |
8 -- | |
9 | |
10 module:depends("adhoc"); | |
11 local adhoc = module:require "adhoc"; | |
12 local st = require"util.stanza"; | |
13 local set = require"util.set"; | |
14 local dataform = require"util.dataforms"; | |
15 local adhoc_inital_data = require "util.adhoc".new_initial_data_form; | |
16 | |
17 local blocklist_form = dataform.new { | |
18 title = "Editing the Blacklist"; | |
19 instructions = "Fill out this form to edit the list of entities with whom communications are disallowed."; | |
20 { | |
21 type = "hidden"; | |
22 name = "FORM_TYPE"; | |
23 value = "http://jabber.org/protocol/admin"; | |
24 }; | |
25 { | |
26 type = "jid-multi"; | |
27 name = "blacklistjids"; | |
28 label = "The blacklist"; | |
29 }; | |
30 } | |
31 | |
32 local blocklists = module:open_store("blocklist"); | |
33 | |
34 local blocklist_handler = adhoc_inital_data(blocklist_form, function () | |
35 local blacklistjids = {}; | |
36 local blacklist = blocklists:get(); | |
37 for jid in pairs(blacklist) do | |
38 table.insert(blacklistjids, jid); | |
39 end | |
40 return { blacklistjids = blacklistjids }; | |
41 end, function(fields, form_err) | |
42 if form_err then | |
43 return { status = "completed", error = { message = "Problem in submitted form" } }; | |
44 end | |
45 local blacklistjids = set.new(fields.blacklistjids); | |
46 local ok, err = blocklists:set(nil, blacklistjids._items); | |
47 if ok then | |
48 return { status = "completed", info = "Blacklist updated" }; | |
49 else | |
50 return { status = "completed", error = { message = "Error saving blacklist: "..err } }; | |
51 end | |
52 end); | |
53 | |
54 module:add_item("adhoc", adhoc.new("Edit Blacklist", "http://jabber.org/protocol/admin#edit-blacklist", blocklist_handler, "admin")); | |
55 | |
56 local function is_blocked(host) | |
57 local blacklistjids = blocklists:get(); | |
58 return blacklistjids and blacklistjids[host]; | |
59 end | |
60 | |
61 module:hook("route/remote", function (event) | |
62 local origin, stanza = event.origin, event.stanza; | |
63 if is_blocked(event.to_host) then | |
64 if origin and stanza then | |
65 origin.send(st.error_reply(stanza, "cancel", "not-allowed", "Communication with this domain is not allowed")); | |
66 return true; | |
67 end | |
68 return false; | |
69 end | |
70 end, 1000); | |
71 | |
72 | |
73 module:hook("s2s-stream-features", function (event) | |
74 local session = event.origin; | |
75 if is_blocked(session.from_host) then | |
76 session:close("policy-violation"); | |
77 return false; | |
78 end | |
79 end, 1000); | |
80 | |
81 module:hook("stanza/http://etherx.jabber.org/streams:features", function (event) | |
82 local session = event.origin; | |
83 if is_blocked(session.to_host) then | |
84 session:close("policy-violation"); | |
85 return true; | |
86 end | |
87 end, 1000); | |
88 |