aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Jousset <mid@gtmp.org>2023-11-12 13:58:01 +0100
committerfiaxh <git@lightrise.org>2024-09-22 11:39:13 +0100
commit63439cd206aaf3548228e915bd1744389cd2fc54 (patch)
tree54e8c8b5045bab2bcd353ef4eb069cd852b2bf7c
parenta7f7b1ceeb78533d1c5856ed2f2adaf0bf386340 (diff)
downloaddino-63439cd206aaf3548228e915bd1744389cd2fc54.tar.gz
dino-63439cd206aaf3548228e915bd1744389cd2fc54.zip
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.
-rw-r--r--plugins/ice/src/plugin.vala19
-rw-r--r--xmpp-vala/src/module/xep/0215_external_service_discovery.vala4
2 files changed, 21 insertions, 2 deletions
diff --git a/plugins/ice/src/plugin.vala b/plugins/ice/src/plugin.vala
index ec4fe9cb..17090d26 100644
--- a/plugins/ice/src/plugin.vala
+++ b/plugins/ice/src/plugin.vala
@@ -22,10 +22,10 @@ public class Dino.Plugins.Ice.Plugin : RootInterface, Object {
stream.get_module(JingleRawUdp.Module.IDENTITY).set_local_ip_address_handler(get_local_ip_addresses);
}
});
- app.stream_interactor.stream_negotiated.connect(on_stream_negotiated);
+ app.stream_interactor.stream_negotiated.connect(external_discovery_refresh_services);
}
- private async void on_stream_negotiated(Account account, XmppStream stream) {
+ private async void external_discovery_refresh_services(Account account, XmppStream stream) {
Module? ice_udp_module = stream.get_module(JingleIceUdp.Module.IDENTITY) as Module;
if (ice_udp_module == null) return;
Gee.List<Xep.ExternalServiceDiscovery.Service> services = yield ExternalServiceDiscovery.request_services(stream);
@@ -59,6 +59,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) {
+ DateTime? expires = ice_udp_module.turn_service.expires;
+ if (expires != null) {
+ uint delay = (uint) (expires.to_unix() - 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..6d41a288 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);
+
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 DateTime? expires { get; set; }
public string transport { get; set; }
public string name { get; set; }