From 14ed6799d72c7807467456808aa08a6f376ebe14 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 23 Sep 2014 17:16:13 +0100 Subject: Add support for TURN servers as per the TURN REST API (http://tools.ietf.org/html/draft-uberti-behave-turn-rest-00) --- synapse/config/homeserver.py | 3 ++- synapse/config/voip.py | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 synapse/config/voip.py (limited to 'synapse/config') diff --git a/synapse/config/homeserver.py b/synapse/config/homeserver.py index 4b810a2302..5a11fd6c76 100644 --- a/synapse/config/homeserver.py +++ b/synapse/config/homeserver.py @@ -21,11 +21,12 @@ from .ratelimiting import RatelimitConfig from .repository import ContentRepositoryConfig from .captcha import CaptchaConfig from .email import EmailConfig +from .voip import VoipConfig class HomeServerConfig(TlsConfig, ServerConfig, DatabaseConfig, LoggingConfig, RatelimitConfig, ContentRepositoryConfig, CaptchaConfig, - EmailConfig): + EmailConfig, VoipConfig): pass diff --git a/synapse/config/voip.py b/synapse/config/voip.py new file mode 100644 index 0000000000..a47e81037a --- /dev/null +++ b/synapse/config/voip.py @@ -0,0 +1,41 @@ +# Copyright 2014 OpenMarket Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ._base import Config + + +class VoipConfig(Config): + + def __init__(self, args): + super(VoipConfig, self).__init__(args) + self.turn_uri = args.turn_uri + self.turn_shared_secret = args.turn_shared_secret + self.turn_user_lifetime = args.turn_user_lifetime + + @classmethod + def add_arguments(cls, parser): + super(VoipConfig, cls).add_arguments(parser) + group = parser.add_argument_group("voip") + group.add_argument( + "--turn-uri", type=str, default=None, + help="The public URI of the TURN server to give to clients" + ) + group.add_argument( + "--turn-shared-secret", type=str, default=None, + help="The shared secret used to compute passwords for the TURN server" + ) + group.add_argument( + "--turn-user-lifetime", type=int, default=(1000 * 60 * 60), + help="How long generated TURN credentials last, in ms" + ) -- cgit 1.4.1 From 5383ba55870079076277ee6e83458f6cd7ceee85 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 24 Sep 2014 16:01:36 +0100 Subject: rename endpoint to better reflect what it is and allow specifying multiple uris --- synapse/config/voip.py | 6 +++--- synapse/rest/voip.py | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) (limited to 'synapse/config') diff --git a/synapse/config/voip.py b/synapse/config/voip.py index a47e81037a..3a211ae6b6 100644 --- a/synapse/config/voip.py +++ b/synapse/config/voip.py @@ -19,7 +19,7 @@ class VoipConfig(Config): def __init__(self, args): super(VoipConfig, self).__init__(args) - self.turn_uri = args.turn_uri + self.turn_uris = args.turn_uris.split(",") self.turn_shared_secret = args.turn_shared_secret self.turn_user_lifetime = args.turn_user_lifetime @@ -28,8 +28,8 @@ class VoipConfig(Config): super(VoipConfig, cls).add_arguments(parser) group = parser.add_argument_group("voip") group.add_argument( - "--turn-uri", type=str, default=None, - help="The public URI of the TURN server to give to clients" + "--turn-uris", type=str, default=None, + help="The public URIs of the TURN server to give to clients" ) group.add_argument( "--turn-shared-secret", type=str, default=None, diff --git a/synapse/rest/voip.py b/synapse/rest/voip.py index bb0108cbd1..31f3fd100d 100644 --- a/synapse/rest/voip.py +++ b/synapse/rest/voip.py @@ -24,13 +24,13 @@ import base64 class VoipRestServlet(RestServlet): - PATTERN = client_path_pattern("/voip/turnuris$") + PATTERN = client_path_pattern("/voip/turnServers$") @defer.inlineCallbacks def on_GET(self, request): auth_user = yield self.auth.get_user_by_req(request) - turnUri = self.hs.config.turn_uri + turnUris = self.hs.config.turn_uris turnSecret = self.hs.config.turn_shared_secret userLifetime = self.hs.config.turn_user_lifetime if not turnUri or not turnSecret or not userLifetime: @@ -49,9 +49,7 @@ class VoipRestServlet(RestServlet): 'username': username, 'password': password, 'ttl': userLifetime / 1000, - 'uris': [ - turnUri, - ] + 'uris': turnUris, }) ) def on_OPTIONS(self, request): -- cgit 1.4.1 From a31bf7777694d794d8e861c2bfede4a8ebb8849e Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 25 Sep 2014 11:24:49 +0200 Subject: Make turn server endpoint return an empty object if no turn servers to match the normal response. Don't break if the turn_uris option isn't present. --- synapse/config/voip.py | 2 +- synapse/rest/voip.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'synapse/config') diff --git a/synapse/config/voip.py b/synapse/config/voip.py index 3a211ae6b6..c5131d9bcd 100644 --- a/synapse/config/voip.py +++ b/synapse/config/voip.py @@ -19,7 +19,7 @@ class VoipConfig(Config): def __init__(self, args): super(VoipConfig, self).__init__(args) - self.turn_uris = args.turn_uris.split(",") + self.turn_uris = args.turn_uris.split(",") if args.turn_uris else None self.turn_shared_secret = args.turn_shared_secret self.turn_user_lifetime = args.turn_user_lifetime diff --git a/synapse/rest/voip.py b/synapse/rest/voip.py index 7260ff0e8e..2e4627606f 100644 --- a/synapse/rest/voip.py +++ b/synapse/rest/voip.py @@ -34,7 +34,7 @@ class VoipRestServlet(RestServlet): turnSecret = self.hs.config.turn_shared_secret userLifetime = self.hs.config.turn_user_lifetime if not turnUris or not turnSecret or not userLifetime: - defer.returnValue( (200, {"uris": []}) ) + defer.returnValue( (200, {}) ) expiry = self.hs.get_clock().time_msec() + userLifetime username = "%d:%s" % (expiry, auth_user.to_string()) -- cgit 1.4.1