These changes mostly revolve around the change in ObjectId constructor when running on Python 3.6. Where on 2.7 the constructor would accept 12- and 24-byte strings, now only 12-byte bytes and 24-character strings are accepted. Good thing, but required some changes in our code. Other changes include hashing of strings, which isn't supported, so they are converted to bytes first, and sometimes converted back afterwards.
89 lines
3.3 KiB
Python
89 lines
3.3 KiB
Python
import json
|
|
import datetime
|
|
|
|
from bson import tz_util
|
|
|
|
from pillar.tests import AbstractPillarTest
|
|
|
|
|
|
class LocalAuthTest(AbstractPillarTest):
|
|
def create_test_user(self):
|
|
from pillar.api import local_auth
|
|
with self.app.test_request_context():
|
|
user_id = local_auth.create_local_user('koro@example.com', 'oti')
|
|
return user_id
|
|
|
|
def test_create_local_user(self):
|
|
user_id = self.create_test_user()
|
|
|
|
with self.app.test_request_context():
|
|
users = self.app.data.driver.db['users']
|
|
db_user = users.find_one(user_id)
|
|
self.assertIsNotNone(db_user)
|
|
|
|
def test_login_existing_user(self):
|
|
user_id = self.create_test_user()
|
|
|
|
resp = self.client.post('/api/auth/make-token',
|
|
data={'username': 'koro',
|
|
'password': 'oti'})
|
|
self.assertEqual(200, resp.status_code, resp.data)
|
|
|
|
token_info = json.loads(resp.data)
|
|
token = token_info['token']
|
|
|
|
headers = {'Authorization': self.make_header(token)}
|
|
resp = self.client.get('/api/users/%s' % user_id,
|
|
headers=headers)
|
|
self.assertEqual(200, resp.status_code, resp.data)
|
|
|
|
def test_login_expired_token(self):
|
|
user_id = self.create_test_user()
|
|
|
|
resp = self.client.post('/api/auth/make-token',
|
|
data={'username': 'koro',
|
|
'password': 'oti'})
|
|
self.assertEqual(200, resp.status_code, resp.data)
|
|
|
|
token_info = json.loads(resp.data)
|
|
token = token_info['token']
|
|
|
|
with self.app.test_request_context():
|
|
tokens = self.app.data.driver.db['tokens']
|
|
|
|
exp = datetime.datetime.now(tz=tz_util.utc) - datetime.timedelta(1)
|
|
result = tokens.update_one({'token': token},
|
|
{'$set': {'expire_time': exp}})
|
|
self.assertEqual(1, result.modified_count)
|
|
|
|
# Do something restricted.
|
|
headers = {'Authorization': self.make_header(token)}
|
|
resp = self.client.put('/api/users/%s' % user_id,
|
|
headers=headers)
|
|
self.assertEqual(403, resp.status_code, resp.data)
|
|
|
|
def test_login_nonexistant_user(self):
|
|
resp = self.client.post('/api/auth/make-token',
|
|
data={'username': 'proog',
|
|
'password': 'oti'})
|
|
|
|
self.assertEqual(403, resp.status_code, resp.data)
|
|
|
|
def test_login_bad_pwd(self):
|
|
resp = self.client.post('/api/auth/make-token',
|
|
data={'username': 'koro',
|
|
'password': 'koro'})
|
|
|
|
self.assertEqual(403, resp.status_code, resp.data)
|
|
|
|
def test_hash_password(self):
|
|
from pillar.api.local_auth import hash_password
|
|
|
|
salt = b'$2b$12$cHdK4M8/yJ7SWp2Q.PYW0O'
|
|
self.assertEqual(hash_password('© 2017 je moeder™', salt),
|
|
'$2b$12$cHdK4M8/yJ7SWp2Q.PYW0OAU1gE3DIVdeehq0XIzOMM0Vp3ldPMb6')
|
|
self.assertIsInstance(hash_password('Резиновая уточка', salt), str)
|
|
|
|
# The password should be encodable as ASCII.
|
|
hash_password('Резиновая уточка', salt).encode('ascii')
|