Comparison

mod_presence_cache/mod_presence_cache.lua @ 3183:b718092e442f

mod_presence_cache: Forget cached presence on s2s close This should remove stale entries from unclean shutdowns and similar.
author Kim Alvefur <zash@zash.se>
date Fri, 13 Jul 2018 00:47:29 +0200
parent 2292:54f44365a378
child 3373:322e8e7ba7d4
comparison
equal deleted inserted replaced
3182:9e5616a49d59 3183:b718092e442f
4 -- This file is MIT/X11 licensed. 4 -- This file is MIT/X11 licensed.
5 5
6 local is_contact_subscribed = require"core.rostermanager".is_contact_subscribed; 6 local is_contact_subscribed = require"core.rostermanager".is_contact_subscribed;
7 local jid_split = require"util.jid".split; 7 local jid_split = require"util.jid".split;
8 local jid_bare = require"util.jid".bare; 8 local jid_bare = require"util.jid".bare;
9 local jid_host = require"util.jid".host;
9 local st = require"util.stanza"; 10 local st = require"util.stanza";
10 local datetime = require"util.datetime"; 11 local datetime = require"util.datetime";
11 local cache = require "util.cache"; 12 local cache = require "util.cache";
12 13
13 local cache_size = module:get_option_number("presence_cache_size", 100); 14 local cache_size = module:get_option_number("presence_cache_size", 100);
96 origin.send(presence); 97 origin.send(presence);
97 end 98 end
98 end 99 end
99 100
100 module:hook("pre-presence/bare", answer_probe_from_cache, 10); 101 module:hook("pre-presence/bare", answer_probe_from_cache, 10);
102
103 local function clear_cache_from_s2s(remote, reason)
104 if not remote then return end
105 if reason and reason:find("timeout") then return end -- Ignore connections closed for being idle
106
107 module:log("debug", "Dropping cached presence from host %s", remote);
108
109 for bare, cached in pairs(bare_cache) do
110 if jid_host(bare) == remote then
111 for jid in pairs(cached) do
112 presence_cache:set(jid, nil);
113 end
114 bare_cache[bare] = nil;
115 end
116 end
117 end
118
119 module:hook("s2sin-destroyed", function (event)
120 return clear_cache_from_s2s(event.session.from_host, event.reason);
121 end);
122
123 module:hook("s2sout-destroyed", function (event)
124 return clear_cache_from_s2s(event.session.to_host, event.reason);
125 end);