From d6173ba850a43eee5dc6677d66395b00920ec0cc Mon Sep 17 00:00:00 2001 From: Alexandre Jousset Date: Thu, 18 Apr 2024 17:41:55 +0300 Subject: [PATCH] XEP-0215: management of the field `expires` Add a field in `Xmpp.Xep.ExternalServiceDiscovery` to keep track of the `expires` TURN service value and use it (divided by 2) to restart periodically the external services discovery. --- plugins/ice/src/plugin.vala | 15 +++++++++++++++ .../xep/0215_external_service_discovery.vala | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/plugins/ice/src/plugin.vala b/plugins/ice/src/plugin.vala index 4abf042c..74295ce5 100644 --- a/plugins/ice/src/plugin.vala +++ b/plugins/ice/src/plugin.vala @@ -54,6 +54,21 @@ public class Dino.Plugins.Ice.Plugin : RootInterface, Object { ice_udp_module.stun_ip = ip.to_string(); ice_udp_module.stun_port = 7886; } + + if (ice_udp_module.turn_service != null) { + int64? expires = ice_udp_module.turn_service.expires; + if (expires != null) { + uint delay = (uint) (expires - new DateTime.now_utc().to_unix()) / 2; + + debug("Next server external service discovery in %us (because of TURN credentials' expiring time)", delay); + + Timeout.add_seconds(delay, () => { + if (app.stream_interactor.connection_manager.get_state(account) != ConnectionManager.ConnectionState.CONNECTED) return false; + on_stream_negotiated.begin(account, stream); + return false; + }); + } + } } public void shutdown() { diff --git a/xmpp-vala/src/module/xep/0215_external_service_discovery.vala b/xmpp-vala/src/module/xep/0215_external_service_discovery.vala index 07c3f71c..3c80ed9f 100644 --- a/xmpp-vala/src/module/xep/0215_external_service_discovery.vala +++ b/xmpp-vala/src/module/xep/0215_external_service_discovery.vala @@ -25,6 +25,9 @@ namespace Xmpp.Xep.ExternalServiceDiscovery { service.username = service_node.get_attribute("username", NS_URI); service.password = service_node.get_attribute("password", NS_URI); + string? expires_str = service_node.get_attribute("expires", NS_URI); + if (expires_str != null) service.expires = DateTimeProfiles.parse_string(expires_str).to_unix(); + service.transport = service_node.get_attribute("transport", NS_URI); service.name = service_node.get_attribute("name", NS_URI); string? restricted_str = service_node.get_attribute("restricted", NS_URI); @@ -41,6 +44,7 @@ namespace Xmpp.Xep.ExternalServiceDiscovery { public string username { get; set; } public string password { get; set; } + public int64? expires { get; set; } public string transport { get; set; } public string name { get; set; }