Skip to content

Commit 8121a52

Browse files
author
Javier Cacheiro
committed
Token Redis source: add optional redis port, redis database and redis password
1 parent 5dd81a0 commit 8121a52

File tree

2 files changed

+77
-10
lines changed

2 files changed

+77
-10
lines changed

tests/test_token_plugins.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,35 @@ def test_simple(self, mock_redis):
203203
self.assertIsNotNone(result)
204204
self.assertEqual(result[0], 'remote_host')
205205
self.assertEqual(result[1], 'remote_port')
206+
207+
def test_src_only_host(self):
208+
plugin = TokenRedis('127.0.0.1')
209+
210+
self.assertEqual(plugin._server, '127.0.0.1')
211+
self.assertEqual(plugin._port, 6379)
212+
self.assertEqual(plugin._db, 0)
213+
self.assertEqual(plugin._password, None)
214+
215+
def test_src_with_host_port(self):
216+
plugin = TokenRedis('127.0.0.1:1234')
217+
218+
self.assertEqual(plugin._server, '127.0.0.1')
219+
self.assertEqual(plugin._port, 1234)
220+
self.assertEqual(plugin._db, 0)
221+
self.assertEqual(plugin._password, None)
222+
223+
def test_src_with_host_port_db(self):
224+
plugin = TokenRedis('127.0.0.1:1234:2')
225+
226+
self.assertEqual(plugin._server, '127.0.0.1')
227+
self.assertEqual(plugin._port, 1234)
228+
self.assertEqual(plugin._db, 2)
229+
self.assertEqual(plugin._password, None)
230+
231+
def test_src_with_host_port_db_pass(self):
232+
plugin = TokenRedis('127.0.0.1:1234:2:verysecret')
233+
234+
self.assertEqual(plugin._server, '127.0.0.1')
235+
self.assertEqual(plugin._port, 1234)
236+
self.assertEqual(plugin._db, 2)
237+
self.assertEqual(plugin._password, 'verysecret')

websockify/token_plugins.py

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,25 @@ def lookup(self, token):
155155
logger.error("package jwcrypto not found, are you sure you've installed it correctly?")
156156
return None
157157

158-
class TokenRedis():
159-
"""
158+
159+
class TokenRedis(BasePlugin):
160+
"""Token plugin based on the Redis in-memory data store.
161+
162+
The token source is in the format:
163+
164+
host[:port[:db[:password]]]
165+
166+
where port and password are optional.
167+
168+
If your redis server is using the default port (6379) then you can use:
169+
170+
my-redis-host
171+
172+
In case you need to authenticate with the redis server you will have to
173+
specify also the port and db:
174+
175+
my-redis-host:6379:0:verysecretpass
176+
160177
The TokenRedis plugin expects the format of the data in a form of json.
161178
162179
Prepare data with:
@@ -173,17 +190,34 @@ class TokenRedis():
173190
"""
174191
def __init__(self, src):
175192
try:
176-
# import those ahead of time so we provide error earlier
177193
import redis
178-
self._server, self._port = src.split(":")
194+
except ImportError:
195+
logger.error("Unable to load redis module")
196+
sys.exit()
197+
# Default values
198+
self._port = 6379
199+
self._db = 0
200+
self._password = None
201+
try:
202+
fields = src.split(":")
203+
if len(fields) == 1:
204+
self._server = fields[0]
205+
elif len(fields) == 2:
206+
self._server, self._port = fields
207+
elif len(fields) == 3:
208+
self._server, self._port, self._db = fields
209+
elif len(fields) == 4:
210+
self._server, self._port, self._db, self._password = fields
211+
else:
212+
raise ValueError
213+
self._port = int(self._port)
214+
self._db = int(self._db)
179215
logger.info("TokenRedis backend initilized (%s:%s)" %
180216
(self._server, self._port))
181217
except ValueError:
182-
logger.error("The provided --token-source='%s' is not in an expected format <host>:<port>" %
183-
src)
184-
sys.exit()
185-
except ImportError:
186-
logger.error("package redis not found, are you sure you've installed them correctly?")
218+
logger.error("The provided --token-source='%s' is not in the "
219+
"expected format <host>[:<port>[:<db>[:<password>]]]" %
220+
src)
187221
sys.exit()
188222

189223
def lookup(self, token):
@@ -194,7 +228,8 @@ def lookup(self, token):
194228
sys.exit()
195229

196230
logger.info("resolving token '%s'" % token)
197-
client = redis.Redis(host=self._server, port=self._port)
231+
client = redis.Redis(host=self._server, port=self._port,
232+
db=self._db, password=self._password)
198233
stuff = client.get(token)
199234
if stuff is None:
200235
return None

0 commit comments

Comments
 (0)