# HG changeset patch # User Kim Alvefur # Date 1565369975 -7200 # Node ID 2bbf655431be508f96f522a089aeb50afdf479c0 # Parent 58b49d883f0cd423cc7709d2a488d769336662f9 mod_turncredentials: Add parallel implementation of XEP-0215 v0.7 diff -r 58b49d883f0c -r 2bbf655431be mod_turncredentials/mod_turncredentials.lua --- 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);