diff options
author | Adam Young <ayoung@redhat.com> | 2012-09-06 11:54:04 -0400 |
---|---|---|
committer | Adam Young <ayoung@redhat.com> | 2012-09-06 16:33:17 -0400 |
commit | 150413cc4ba8ec854cf6fa30efeb7a653ad5e17a (patch) | |
tree | 7f2762e8e02fe45e2b2851f44bbba1788f7853cd | |
parent | fd6d2f1b1184c5b8da1ded3a560ef57795863fb5 (diff) | |
download | keystone-150413cc4ba8ec854cf6fa30efeb7a653ad5e17a.tar.gz keystone-150413cc4ba8ec854cf6fa30efeb7a653ad5e17a.tar.xz keystone-150413cc4ba8ec854cf6fa30efeb7a653ad5e17a.zip |
List tokens for memcached backend
Creates and updates an index of tokens in a memcache entry keyed
by the user id
Bug 1046905
Change-Id: If11d6b87b0a8ae5f8349f1ebb31790e943c70fbf
-rw-r--r-- | keystone/token/backends/memcache.py | 20 | ||||
-rw-r--r-- | tests/test_backend.py | 40 | ||||
-rw-r--r-- | tests/test_backend_memcache.py | 5 |
3 files changed, 59 insertions, 6 deletions
diff --git a/keystone/token/backends/memcache.py b/keystone/token/backends/memcache.py index b5cae2a0..437431bc 100644 --- a/keystone/token/backends/memcache.py +++ b/keystone/token/backends/memcache.py @@ -67,6 +67,15 @@ class Token(token.Driver): expires_ts = utils.unixtime(data_copy['expires']) kwargs['time'] = expires_ts self.client.set(ptk, data_copy, **kwargs) + if 'id' in data['user']: + token_data = jsonutils.dumps(token_id) + user_id = data['user']['id'] + user_key = 'usertokens-%s' % user_id + if not self.client.append(user_key, ',%s' % token_data): + if not self.client.add(user_key, token_data): + if not self.client.append(user_key, ',%s' % token_data): + msg = _('Unable to add token user list.') + raise exception.UnexpectedError(msg) return copy.deepcopy(data_copy) def _add_to_revocation_list(self, data): @@ -86,6 +95,17 @@ class Token(token.Driver): self._add_to_revocation_list(data) return result + def list_tokens(self, user_id): + tokens = [] + user_record = self.client.get('usertokens-%s' % user_id) or "" + token_list = jsonutils.loads('[%s]' % user_record) + for token_id in token_list: + ptk = self._prefix_token_id(token_id) + token = self.client.get(ptk) + if token: + tokens.append(token_id) + return tokens + def list_revoked_tokens(self): list_json = self.client.get(self.revocation_key) if list_json: diff --git a/tests/test_backend.py b/tests/test_backend.py index e142c9ab..dd843808 100644 --- a/tests/test_backend.py +++ b/tests/test_backend.py @@ -612,7 +612,8 @@ class IdentityTests(object): class TokenTests(object): def test_token_crud(self): token_id = uuid.uuid4().hex - data = {'id': token_id, 'id_hash': token_id, 'a': 'b'} + data = {'id': token_id, 'a': 'b', + 'user': {'id': 'testuserid'}} data_ref = self.token_api.create_token(token_id, data) expires = data_ref.pop('expires') self.assertTrue(isinstance(expires, datetime.datetime)) @@ -629,6 +630,34 @@ class TokenTests(object): self.assertRaises(exception.TokenNotFound, self.token_api.delete_token, token_id) + def create_token_sample_data(self): + token_id = uuid.uuid4().hex + data = {'id': token_id, 'a': 'b', + 'user': {'id': 'testuserid'}} + self.token_api.create_token(token_id, data) + return token_id + + def test_token_list(self): + tokens = self.token_api.list_tokens('testuserid') + self.assertEquals(len(tokens), 0) + token_id1 = self.create_token_sample_data() + tokens = self.token_api.list_tokens('testuserid') + self.assertEquals(len(tokens), 1) + self.assertIn(token_id1, tokens) + token_id2 = self.create_token_sample_data() + tokens = self.token_api.list_tokens('testuserid') + self.assertEquals(len(tokens), 2) + self.assertIn(token_id2, tokens) + self.assertIn(token_id1, tokens) + self.token_api.delete_token(token_id1) + tokens = self.token_api.list_tokens('testuserid') + self.assertIn(token_id2, tokens) + self.assertNotIn(token_id1, tokens) + self.token_api.delete_token(token_id2) + tokens = self.token_api.list_tokens('testuserid') + self.assertNotIn(token_id2, tokens) + self.assertNotIn(token_id1, tokens) + def test_get_token_404(self): self.assertRaises(exception.TokenNotFound, self.token_api.get_token, @@ -643,7 +672,8 @@ class TokenTests(object): token_id = uuid.uuid4().hex expire_time = timeutils.utcnow() - datetime.timedelta(minutes=1) data = {'id_hash': token_id, 'id': token_id, 'a': 'b', - 'expires': expire_time} + 'expires': expire_time, + 'user': {'id': 'testuserid'}} data_ref = self.token_api.create_token(token_id, data) self.assertDictEqual(data_ref, data) self.assertRaises(exception.TokenNotFound, @@ -651,7 +681,8 @@ class TokenTests(object): def test_null_expires_token(self): token_id = uuid.uuid4().hex - data = {'id': token_id, 'id_hash': token_id, 'a': 'b', 'expires': None} + data = {'id': token_id, 'id_hash': token_id, 'a': 'b', 'expires': None, + 'user': {'id': 'testuserid'}} data_ref = self.token_api.create_token(token_id, data) self.assertDictEqual(data_ref, data) new_data_ref = self.token_api.get_token(token_id) @@ -664,7 +695,8 @@ class TokenTests(object): def delete_token(self): token_id = uuid.uuid4().hex - data = {'id_hash': token_id, 'id': token_id, 'a': 'b'} + data = {'id_hash': token_id, 'id': token_id, 'a': 'b', + 'user': {'id': 'testuserid'}} data_ref = self.token_api.create_token(token_id, data) self.token_api.delete_token(token_id) self.assertRaises( diff --git a/tests/test_backend_memcache.py b/tests/test_backend_memcache.py index 613cec1e..884a94ac 100644 --- a/tests/test_backend_memcache.py +++ b/tests/test_backend_memcache.py @@ -36,7 +36,7 @@ class MemcacheClient(object): def add(self, key, value): if self.get(key): return False - self.set(key, value) + return self.set(key, value) def append(self, key, value): existing_value = self.get(key) @@ -80,6 +80,7 @@ class MemcacheToken(test.TestCase, test_backend.TokenTests): def test_get_unicode(self): token_id = unicode(uuid.uuid4().hex) - data = {'id': token_id, 'a': 'b'} + data = {'id': token_id, 'a': 'b', + 'user': {'id': 'testuserid'}} self.token_api.create_token(token_id, data) self.token_api.get_token(token_id) |