Skip to content

Commit 5989d31

Browse files
committed
Add namespace value to TokenRedis source
1 parent b6c02b1 commit 5989d31

File tree

2 files changed

+108
-14
lines changed

2 files changed

+108
-14
lines changed

tests/test_token_plugins.py

Lines changed: 83 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,13 +267,50 @@ def test_invalid_token(self, mock_redis):
267267
instance.get.assert_called_once_with('testhost')
268268
self.assertIsNone(result)
269269

270+
@patch('redis.Redis')
271+
def test_token_without_namespace(self, mock_redis):
272+
plugin = TokenRedis('127.0.0.1:1234')
273+
token = 'testhost'
274+
275+
def mock_redis_get(key):
276+
self.assertEqual(key, token)
277+
return b'remote_host:remote_port'
278+
279+
instance = mock_redis.return_value
280+
instance.get = mock_redis_get
281+
282+
result = plugin.lookup(token)
283+
284+
self.assertIsNotNone(result)
285+
self.assertEqual(result[0], 'remote_host')
286+
self.assertEqual(result[1], 'remote_port')
287+
288+
@patch('redis.Redis')
289+
def test_token_with_namespace(self, mock_redis):
290+
plugin = TokenRedis('127.0.0.1:1234:::namespace')
291+
token = 'testhost'
292+
293+
def mock_redis_get(key):
294+
self.assertEqual(key, "namespace:" + token)
295+
return b'remote_host:remote_port'
296+
297+
instance = mock_redis.return_value
298+
instance.get = mock_redis_get
299+
300+
result = plugin.lookup(token)
301+
302+
self.assertIsNotNone(result)
303+
self.assertEqual(result[0], 'remote_host')
304+
self.assertEqual(result[1], 'remote_port')
305+
270306
def test_src_only_host(self):
271307
plugin = TokenRedis('127.0.0.1')
272308

273309
self.assertEqual(plugin._server, '127.0.0.1')
274310
self.assertEqual(plugin._port, 6379)
275311
self.assertEqual(plugin._db, 0)
276312
self.assertEqual(plugin._password, None)
313+
self.assertEqual(plugin._namespace, "")
277314

278315
def test_src_with_host_port(self):
279316
plugin = TokenRedis('127.0.0.1:1234')
@@ -282,6 +319,7 @@ def test_src_with_host_port(self):
282319
self.assertEqual(plugin._port, 1234)
283320
self.assertEqual(plugin._db, 0)
284321
self.assertEqual(plugin._password, None)
322+
self.assertEqual(plugin._namespace, "")
285323

286324
def test_src_with_host_port_db(self):
287325
plugin = TokenRedis('127.0.0.1:1234:2')
@@ -290,6 +328,7 @@ def test_src_with_host_port_db(self):
290328
self.assertEqual(plugin._port, 1234)
291329
self.assertEqual(plugin._db, 2)
292330
self.assertEqual(plugin._password, None)
331+
self.assertEqual(plugin._namespace, "")
293332

294333
def test_src_with_host_port_db_pass(self):
295334
plugin = TokenRedis('127.0.0.1:1234:2:verysecret')
@@ -298,67 +337,103 @@ def test_src_with_host_port_db_pass(self):
298337
self.assertEqual(plugin._port, 1234)
299338
self.assertEqual(plugin._db, 2)
300339
self.assertEqual(plugin._password, 'verysecret')
340+
self.assertEqual(plugin._namespace, "")
341+
342+
def test_src_with_host_port_db_pass_namespace(self):
343+
plugin = TokenRedis('127.0.0.1:1234:2:verysecret:namespace')
344+
345+
self.assertEqual(plugin._server, '127.0.0.1')
346+
self.assertEqual(plugin._port, 1234)
347+
self.assertEqual(plugin._db, 2)
348+
self.assertEqual(plugin._password, 'verysecret')
349+
self.assertEqual(plugin._namespace, "namespace:")
301350

302-
def test_src_with_host_empty_port_empty_db_pass(self):
351+
def test_src_with_host_empty_port_empty_db_pass_no_namespace(self):
303352
plugin = TokenRedis('127.0.0.1:::verysecret')
304353

305354
self.assertEqual(plugin._server, '127.0.0.1')
306355
self.assertEqual(plugin._port, 6379)
307356
self.assertEqual(plugin._db, 0)
308357
self.assertEqual(plugin._password, 'verysecret')
358+
self.assertEqual(plugin._namespace, "")
359+
360+
def test_src_with_host_empty_port_empty_db_empty_pass_empty_namespace(self):
361+
plugin = TokenRedis('127.0.0.1::::')
309362

310-
def test_src_with_host_empty_port_empty_db_empty_pass(self):
363+
self.assertEqual(plugin._server, '127.0.0.1')
364+
self.assertEqual(plugin._port, 6379)
365+
self.assertEqual(plugin._db, 0)
366+
self.assertEqual(plugin._password, None)
367+
self.assertEqual(plugin._namespace, "")
368+
369+
def test_src_with_host_empty_port_empty_db_empty_pass_no_namespace(self):
311370
plugin = TokenRedis('127.0.0.1:::')
312371

313372
self.assertEqual(plugin._server, '127.0.0.1')
314373
self.assertEqual(plugin._port, 6379)
315374
self.assertEqual(plugin._db, 0)
316375
self.assertEqual(plugin._password, None)
376+
self.assertEqual(plugin._namespace, "")
317377

318-
def test_src_with_host_empty_port_empty_db_no_pass(self):
378+
def test_src_with_host_empty_port_empty_db_no_pass_no_namespace(self):
319379
plugin = TokenRedis('127.0.0.1::')
320380

321381
self.assertEqual(plugin._server, '127.0.0.1')
322382
self.assertEqual(plugin._port, 6379)
323383
self.assertEqual(plugin._db, 0)
324384
self.assertEqual(plugin._password, None)
385+
self.assertEqual(plugin._namespace, "")
325386

326-
def test_src_with_host_empty_port_no_db_no_pass(self):
387+
def test_src_with_host_empty_port_no_db_no_pass_no_namespace(self):
327388
plugin = TokenRedis('127.0.0.1:')
328389

329390
self.assertEqual(plugin._server, '127.0.0.1')
330391
self.assertEqual(plugin._port, 6379)
331392
self.assertEqual(plugin._db, 0)
332393
self.assertEqual(plugin._password, None)
394+
self.assertEqual(plugin._namespace, "")
395+
396+
def test_src_with_host_empty_port_empty_db_empty_pass_namespace(self):
397+
plugin = TokenRedis('127.0.0.1::::namespace')
398+
399+
self.assertEqual(plugin._server, '127.0.0.1')
400+
self.assertEqual(plugin._port, 6379)
401+
self.assertEqual(plugin._db, 0)
402+
self.assertEqual(plugin._password, None)
403+
self.assertEqual(plugin._namespace, "namespace:")
333404

334-
def test_src_with_host_empty_port_db_no_pass(self):
405+
def test_src_with_host_empty_port_db_no_pass_no_namespace(self):
335406
plugin = TokenRedis('127.0.0.1::2')
336407

337408
self.assertEqual(plugin._server, '127.0.0.1')
338409
self.assertEqual(plugin._port, 6379)
339410
self.assertEqual(plugin._db, 2)
340411
self.assertEqual(plugin._password, None)
412+
self.assertEqual(plugin._namespace, "")
341413

342-
def test_src_with_host_port_empty_db_pass(self):
414+
def test_src_with_host_port_empty_db_pass_no_namespace(self):
343415
plugin = TokenRedis('127.0.0.1:1234::verysecret')
344416

345417
self.assertEqual(plugin._server, '127.0.0.1')
346418
self.assertEqual(plugin._port, 1234)
347419
self.assertEqual(plugin._db, 0)
348420
self.assertEqual(plugin._password, 'verysecret')
421+
self.assertEqual(plugin._namespace, "")
349422

350-
def test_src_with_host_empty_port_db_pass(self):
423+
def test_src_with_host_empty_port_db_pass_no_namespace(self):
351424
plugin = TokenRedis('127.0.0.1::2:verysecret')
352425

353426
self.assertEqual(plugin._server, '127.0.0.1')
354427
self.assertEqual(plugin._port, 6379)
355428
self.assertEqual(plugin._db, 2)
356429
self.assertEqual(plugin._password, 'verysecret')
430+
self.assertEqual(plugin._namespace, "")
357431

358-
def test_src_with_host_empty_port_db_empty_pass(self):
432+
def test_src_with_host_empty_port_db_empty_pass_no_namespace(self):
359433
plugin = TokenRedis('127.0.0.1::2:')
360434

361435
self.assertEqual(plugin._server, '127.0.0.1')
362436
self.assertEqual(plugin._port, 6379)
363437
self.assertEqual(plugin._db, 2)
364438
self.assertEqual(plugin._password, None)
439+
self.assertEqual(plugin._namespace, "")

websockify/token_plugins.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ class TokenRedis(BasePlugin):
178178
179179
The token source is in the format:
180180
181-
host[:port[:db[:password]]]
181+
host[:port[:db[:password[:namespace]]]]
182182
183-
where port, db and password are optional. If port or db are left empty
183+
where port, db, password and namespace are optional. If port or db are left empty
184184
they will take its default value, ie. 6379 and 0 respectively.
185185
186186
If your redis server is using the default port (6379) then you can use:
@@ -192,9 +192,14 @@ class TokenRedis(BasePlugin):
192192
193193
my-redis-host:::verysecretpass
194194
195+
You can also specify a namespace. In this case, the tokens
196+
will be stored in the format '{namespace}:{token}'
197+
198+
my-redis-host::::my-app-namespace
199+
195200
In the more general case you will use:
196201
197-
my-redis-host:6380:1:verysecretpass
202+
my-redis-host:6380:1:verysecretpass:my-app-namespace
198203
199204
The TokenRedis plugin expects the format of the target in one of these two
200205
formats:
@@ -234,6 +239,7 @@ def __init__(self, src):
234239
self._port = 6379
235240
self._db = 0
236241
self._password = None
242+
self._namespace = ""
237243
try:
238244
fields = src.split(":")
239245
if len(fields) == 1:
@@ -256,15 +262,28 @@ def __init__(self, src):
256262
self._db = 0
257263
if not self._password:
258264
self._password = None
265+
elif len(fields) == 5:
266+
self._server, self._port, self._db, self._password, self._namespace = fields
267+
if not self._port:
268+
self._port = 6379
269+
if not self._db:
270+
self._db = 0
271+
if not self._password:
272+
self._password = None
273+
if not self._namespace:
274+
self._namespace = ""
259275
else:
260276
raise ValueError
261277
self._port = int(self._port)
262278
self._db = int(self._db)
263-
logger.info("TokenRedis backend initilized (%s:%s)" %
279+
if self._namespace:
280+
self._namespace += ":"
281+
282+
logger.info("TokenRedis backend initialized (%s:%s)" %
264283
(self._server, self._port))
265284
except ValueError:
266285
logger.error("The provided --token-source='%s' is not in the "
267-
"expected format <host>[:<port>[:<db>[:<password>]]]" %
286+
"expected format <host>[:<port>[:<db>[:<password>[:<namespace>]]]]" %
268287
src)
269288
sys.exit()
270289

@@ -278,7 +297,7 @@ def lookup(self, token):
278297
logger.info("resolving token '%s'" % token)
279298
client = redis.Redis(host=self._server, port=self._port,
280299
db=self._db, password=self._password)
281-
stuff = client.get(token)
300+
stuff = client.get(self._namespace + token)
282301
if stuff is None:
283302
return None
284303
else:

0 commit comments

Comments
 (0)