Diff

mod_turncredentials/mod_turncredentials.lua @ 3642:2bbf655431be

mod_turncredentials: Add parallel implementation of XEP-0215 v0.7
author Kim Alvefur <zash@zash.se>
date Fri, 09 Aug 2019 18:59:35 +0200
parent 3561:deb5ece56c49
child 3773:915c7bd5f754
line wrap: on
line diff
--- a/mod_turncredentials/mod_turncredentials.lua	Fri Aug 09 18:41:51 2019 +0200
+++ b/mod_turncredentials/mod_turncredentials.lua	Fri Aug 09 18:59:35 2019 +0200
@@ -6,6 +6,7 @@
 local hmac_sha1 = require "util.hashes".hmac_sha1;
 local base64 = require "util.encodings".base64;
 local os_time = os.time;
+local datetime = require "util.datetime".datetime;
 local secret = module:get_option_string("turncredentials_secret");
 local host = module:get_option_string("turncredentials_host"); -- use ip addresses here to avoid further dns lookup latency
 local port = module:get_option_number("turncredentials_port", 3478);
@@ -31,3 +32,20 @@
     );
     return true;
 end);
+
+module:add_feature("urn:xmpp:extdisco:2");
+
+module:hook("iq-get/host/urn:xmpp:extdisco:2:services", function(event)
+    local origin, stanza = event.origin, event.stanza;
+    if origin.type ~= "c2s" then
+        return;
+    end
+    local now = os_time() + ttl;
+    local userpart = tostring(now);
+    local nonce = base64.encode(hmac_sha1(secret, tostring(userpart), false));
+    origin.send(st.reply(stanza):tag("services", {xmlns = "urn:xmpp:extdisco:2"})
+        :tag("service", { type = "stun", host = host, port = ("%d"):format(port) }):up()
+        :tag("service", { type = "turn", host = host, port = ("%d"):format(port), username = userpart, password = nonce, expires = datetime(ttl), restricted = "1"  }):up()
+    );
+    return true;
+end);