comparison mod_pubsub_serverinfo/mod_pubsub_serverinfo.lua @ 5817:7905766d01f6

mod_pubsub_serverinfo: Treat public providers as public The opt-in mechanism is to prevent leaking domain names or relationships between small private servers. These are not considerations relevant to public servers. We use the providers.xmpp.net API to fetch a list of known public provider domains.
author Matthew Wild <mwild1@gmail.com>
date Mon, 08 Jan 2024 15:56:11 +0000
parents 45d0802d0787
children
comparison
equal deleted inserted replaced
5816:45d0802d0787 5817:7905766d01f6
1 local http = require "net.http";
2 local json = require "util.json";
1 local st = require "util.stanza"; 3 local st = require "util.stanza";
2 local new_id = require"util.id".medium; 4 local new_id = require"util.id".medium;
3 local dataform = require "util.dataforms".new; 5 local dataform = require "util.dataforms".new;
4 6
5 local local_domain = module:get_host(); 7 local local_domain = module:get_host();
6 local service = module:get_option(module.name .. "_service") or "pubsub." .. local_domain; 8 local service = module:get_option(module.name .. "_service") or "pubsub." .. local_domain;
7 local node = module:get_option(module.name .. "_node") or "serverinfo"; 9 local node = module:get_option(module.name .. "_node") or "serverinfo";
8 local actor = module.host .. "/modules/" .. module.name; 10 local actor = module.host .. "/modules/" .. module.name;
9 local publication_interval = module:get_option(module.name .. "_publication_interval") or 300; 11 local publication_interval = module:get_option(module.name .. "_publication_interval") or 300;
10 local cache_ttl = module:get_option(module.name .. "_cache_ttl") or 3600; 12 local cache_ttl = module:get_option(module.name .. "_cache_ttl") or 3600;
13 local public_providers_url = module:get_option_string(module.name.."_public_providers_url", "https://data.xmpp.net/providers/v2/providers-Ds.json");
11 local delete_node_on_unload = module:get_option_boolean(module.name.."_delete_node_on_unload", false); 14 local delete_node_on_unload = module:get_option_boolean(module.name.."_delete_node_on_unload", false);
12 local persist_items = module:get_option_boolean(module.name.."_persist_items", true); 15 local persist_items = module:get_option_boolean(module.name.."_persist_items", true);
13 16
14 local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; 17 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
15 18
219 return publication_interval; 222 return publication_interval;
220 end 223 end
221 224
222 local opt_in_cache = {} 225 local opt_in_cache = {}
223 226
227 -- Public providers are already public, so we fetch the list of providers
228 -- registered on providers.xmpp.net so we don't have to disco them individually
229 local function update_public_providers()
230 return http.request(public_providers_url)
231 :next(function (response)
232 assert(
233 response.headers["content-type"] == "application/json",
234 "invalid mimetype: "..tostring(response.headers["content-type"])
235 );
236 return json.decode(response.body);
237 end)
238 :next(function (public_server_domains)
239 module:log("debug", "Retrieved list of %d public providers", #public_server_domains);
240 for _, domain in ipairs(public_server_domains) do
241 opt_in_cache[domain] = {
242 opt_in = true;
243 expires = os.time() + (86400 * 1.5);
244 };
245 end
246 end, function (err)
247 module:log("warn", "Failed to fetch/decode provider list: %s", err);
248 end);
249 end
250
251 module:daily("update public provider list", update_public_providers);
252
224 function cache_warm_up() 253 function cache_warm_up()
225 module:log("debug", "Warming up opt-in cache") 254 module:log("debug", "Warming up opt-in cache")
226 local domains_by_host = get_remote_domain_names() 255
227 local remotes = domains_by_host[local_domain] 256 update_public_providers():finally(function ()
228 if remotes ~= nil then 257 module:log("debug", "Querying known domains for opt-in cache...");
229 for remote, _ in pairs(remotes) do 258 local domains_by_host = get_remote_domain_names()
230 does_opt_in(remote) 259 local remotes = domains_by_host[local_domain]
231 end 260 if remotes ~= nil then
232 end 261 for remote in pairs(remotes) do
262 does_opt_in(remote)
263 end
264 end
265 end);
233 end 266 end
234 267
235 function does_opt_in(remoteDomain) 268 function does_opt_in(remoteDomain)
236 269
237 -- try to read answer from cache. 270 -- try to read answer from cache.