98 end |
98 end |
99 end |
99 end |
100 return jid_list; |
100 return jid_list; |
101 end |
101 end |
102 |
102 |
|
103 local function send_push_iqs(username, host, command_type, jids) |
|
104 local bare_jid = username.."@"..host; |
|
105 |
|
106 local stanza_content = st.stanza(command_type, { xmlns = xmlns_blocking }); |
|
107 for _, jid in ipairs(jids) do |
|
108 stanza_content:tag("item", { jid = jid }):up(); |
|
109 end |
|
110 |
|
111 for resource, session in pairs(prosody.bare_sessions[bare_jid].sessions) do |
|
112 local iq_push_stanza = st.iq({ type = "set", to = bare_jid.."/"..resource }); |
|
113 iq_push_stanza:add_child(stanza_content); |
|
114 session.send(iq_push_stanza); |
|
115 end |
|
116 end |
|
117 |
103 function handle_blocking_command(event) |
118 function handle_blocking_command(event) |
104 local session, stanza = event.origin, event.stanza; |
119 local session, stanza = event.origin, event.stanza; |
105 |
120 |
106 local username, host = jid_split(stanza.attr.from); |
121 local username, host = jid_split(stanza.attr.from); |
107 if stanza.attr.type == "set" then |
122 if stanza.attr.type == "set" then |
116 else |
131 else |
117 for _, jid in ipairs(block_jid_list) do |
132 for _, jid in ipairs(block_jid_list) do |
118 add_blocked_jid(username, host, jid); |
133 add_blocked_jid(username, host, jid); |
119 end |
134 end |
120 session.send(st.reply(stanza)); |
135 session.send(st.reply(stanza)); |
|
136 send_push_iqs(username, host, "block", block_jid_list); |
121 end |
137 end |
122 return true; |
138 return true; |
123 elseif stanza.tags[1].name == "unblock" then |
139 elseif stanza.tags[1].name == "unblock" then |
124 remove_all_blocked_jids(username, host); |
140 local unblock = stanza.tags[1]; |
|
141 local unblock_jid_list = {}; |
|
142 for item in unblock:childtags() do |
|
143 unblock_jid_list[#unblock_jid_list+1] = item.attr.jid; |
|
144 end |
|
145 if #unblock_jid_list == 0 then |
|
146 remove_all_blocked_jids(username, host); |
|
147 else |
|
148 for _, jid_to_unblock in ipairs(unblock_jid_list) do |
|
149 remove_blocked_jid(username, host, jid_to_unblock); |
|
150 end |
|
151 end |
125 session.send(st.reply(stanza)); |
152 session.send(st.reply(stanza)); |
|
153 send_push_iqs(username, host, "unblock", unblock_jid_list); |
126 return true; |
154 return true; |
127 end |
155 end |
128 elseif stanza.attr.type == "get" and stanza.tags[1].name == "blocklist" then |
156 elseif stanza.attr.type == "get" and stanza.tags[1].name == "blocklist" then |
129 local reply = st.reply(stanza):tag("blocklist", { xmlns = xmlns_blocking }); |
157 local reply = st.reply(stanza):tag("blocklist", { xmlns = xmlns_blocking }); |
130 local blocked_jids = get_blocked_jids(username, host); |
158 local blocked_jids = get_blocked_jids(username, host); |