Software / code / prosody
Comparison
plugins/mod_pep.lua @ 12091:7a48ccb084dd
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Mon, 20 Dec 2021 23:12:08 +0100 |
| parent | 12022:eedd3eff0768 |
| parent | 12089:76b4e3f12b53 |
| child | 12153:26af75c20163 |
comparison
equal
deleted
inserted
replaced
| 12083:ec21e379c145 | 12091:7a48ccb084dd |
|---|---|
| 4 local jid_join = require "util.jid".join; | 4 local jid_join = require "util.jid".join; |
| 5 local set_new = require "util.set".new; | 5 local set_new = require "util.set".new; |
| 6 local st = require "util.stanza"; | 6 local st = require "util.stanza"; |
| 7 local calculate_hash = require "util.caps".calculate_hash; | 7 local calculate_hash = require "util.caps".calculate_hash; |
| 8 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; | 8 local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed; |
| 9 local cache = require "util.cache"; | |
| 9 local set = require "util.set"; | 10 local set = require "util.set"; |
| 10 local new_id = require "util.id".medium; | 11 local new_id = require "util.id".medium; |
| 11 local storagemanager = require "core.storagemanager"; | 12 local storagemanager = require "core.storagemanager"; |
| 13 local usermanager = require "core.usermanager"; | |
| 12 | 14 |
| 13 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; | 15 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; |
| 14 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; | 16 local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; |
| 15 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner"; | 17 local xmlns_pubsub_owner = "http://jabber.org/protocol/pubsub#owner"; |
| 16 | 18 |
| 17 local lib_pubsub = module:require "pubsub"; | 19 local lib_pubsub = module:require "pubsub"; |
| 18 | 20 |
| 19 local empty_set = set_new(); | 21 local empty_set = set_new(); |
| 20 | 22 |
| 23 -- username -> object passed to module:add_items() | |
| 24 local pep_service_items = {}; | |
| 25 | |
| 26 -- size of caches with full pubsub service objects | |
| 27 local service_cache_size = module:get_option_number("pep_service_cache_size", 1000); | |
| 28 | |
| 21 -- username -> util.pubsub service object | 29 -- username -> util.pubsub service object |
| 22 local services = {}; | 30 local services = cache.new(service_cache_size, function (username, _) |
| 31 local item = pep_service_items[username]; | |
| 32 pep_service_items[username] = nil; | |
| 33 if item then | |
| 34 module:remove_item("pep-service", item); | |
| 35 end | |
| 36 end):table(); | |
| 37 | |
| 38 -- size of caches with smaller objects | |
| 39 local info_cache_size = module:get_option_number("pep_info_cache_size", 10000); | |
| 23 | 40 |
| 24 -- username -> recipient -> set of nodes | 41 -- username -> recipient -> set of nodes |
| 25 local recipients = {}; | 42 local recipients = cache.new(info_cache_size):table(); |
| 26 | 43 |
| 27 -- caps hash -> set of nodes | 44 -- caps hash -> set of nodes |
| 28 local hash_map = {}; | 45 local hash_map = cache.new(info_cache_size):table(); |
| 29 | 46 |
| 30 local host = module.host; | 47 local host = module.host; |
| 31 | 48 |
| 32 local node_config = module:open_store("pep", "map"); | 49 local node_config = module:open_store("pep", "map"); |
| 33 local known_nodes = module:open_store("pep"); | 50 local known_nodes = module:open_store("pep"); |
| 48 end | 65 end |
| 49 end | 66 end |
| 50 | 67 |
| 51 function module.save() | 68 function module.save() |
| 52 return { | 69 return { |
| 53 services = services; | |
| 54 recipients = recipients; | 70 recipients = recipients; |
| 55 }; | 71 }; |
| 56 end | 72 end |
| 57 | 73 |
| 58 function module.restore(data) | 74 function module.restore(data) |
| 59 services = data.services; | |
| 60 recipients = data.recipients; | 75 recipients = data.recipients; |
| 61 for username, service in pairs(services) do | |
| 62 local user_bare = jid_join(username, host); | |
| 63 module:add_item("pep-service", { service = service, jid = user_bare }); | |
| 64 end | |
| 65 end | 76 end |
| 66 | 77 |
| 67 function is_item_stanza(item) | 78 function is_item_stanza(item) |
| 68 return st.is_stanza(item) and item.attr.xmlns == xmlns_pubsub and item.name == "item" and #item.tags == 1; | 79 return st.is_stanza(item) and item.attr.xmlns == xmlns_pubsub and item.name == "item" and #item.tags == 1; |
| 69 end | 80 end |
| 179 end | 190 end |
| 180 return broadcast_to; | 191 return broadcast_to; |
| 181 end | 192 end |
| 182 end | 193 end |
| 183 | 194 |
| 195 local nobody_service = pubsub.new({ | |
| 196 service = pubsub.new({ | |
| 197 node_defaults = { | |
| 198 ["max_items"] = 1; | |
| 199 ["persist_items"] = false; | |
| 200 ["access_model"] = "presence"; | |
| 201 ["send_last_published_item"] = "on_sub_and_presence"; | |
| 202 }; | |
| 203 }); | |
| 204 }); | |
| 205 | |
| 184 function get_pep_service(username) | 206 function get_pep_service(username) |
| 185 local user_bare = jid_join(username, host); | 207 local user_bare = jid_join(username, host); |
| 186 local service = services[username]; | 208 local service = services[username]; |
| 187 if service then | 209 if service then |
| 188 return service; | 210 return service; |
| 211 end | |
| 212 if not usermanager.user_exists(username, host) then | |
| 213 return nobody_service; | |
| 189 end | 214 end |
| 190 module:log("debug", "Creating pubsub service for user %q", username); | 215 module:log("debug", "Creating pubsub service for user %q", username); |
| 191 service = pubsub.new({ | 216 service = pubsub.new({ |
| 192 pep_username = username; | 217 pep_username = username; |
| 193 node_defaults = { | 218 node_defaults = { |
| 224 normalize_jid = jid_bare; | 249 normalize_jid = jid_bare; |
| 225 | 250 |
| 226 check_node_config = check_node_config; | 251 check_node_config = check_node_config; |
| 227 }); | 252 }); |
| 228 services[username] = service; | 253 services[username] = service; |
| 229 module:add_item("pep-service", { service = service, jid = user_bare }); | 254 local item = { service = service, jid = user_bare } |
| 255 pep_service_items[username] = item; | |
| 256 module:add_item("pep-service", item); | |
| 230 return service; | 257 return service; |
| 231 end | 258 end |
| 232 | 259 |
| 233 function handle_pubsub_iq(event) | 260 function handle_pubsub_iq(event) |
| 234 local origin, stanza = event.origin, event.stanza; | 261 local origin, stanza = event.origin, event.stanza; |
| 457 | 484 |
| 458 for node, node_obj in pairs(ret) do | 485 for node, node_obj in pairs(ret) do |
| 459 reply:tag("item", { jid = user_bare, node = node, name = node_obj.config.title }):up(); | 486 reply:tag("item", { jid = user_bare, node = node, name = node_obj.config.title }):up(); |
| 460 end | 487 end |
| 461 end); | 488 end); |
| 489 | |
| 490 module:hook_global("user-deleted", function(event) | |
| 491 if event.host ~= host then return end | |
| 492 local username = event.username; | |
| 493 local service = services[username]; | |
| 494 if not service then return end | |
| 495 for node in pairs(service.nodes) do service:delete(node, true); end | |
| 496 | |
| 497 local item = pep_service_items[username]; | |
| 498 pep_service_items[username] = nil; | |
| 499 if item then module:remove_item("pep-service", item); end | |
| 500 | |
| 501 recipients[username] = nil; | |
| 502 end); | |
| 503 |