170 lines
5.6 KiB
Python
170 lines
5.6 KiB
Python
import datetime
|
|
import hashlib
|
|
import mox
|
|
import random
|
|
|
|
from django import test
|
|
from django.conf import settings
|
|
from django.db.models.signals import post_save
|
|
from django_openstack import models as nova_models
|
|
from django_openstack import utils
|
|
from django_openstack.core import connection
|
|
from nova_adminclient import NovaAdminClient
|
|
|
|
|
|
TEST_USER = 'testUser'
|
|
TEST_PROJECT = 'testProject'
|
|
TEST_AUTH_TOKEN = hashlib.sha1('').hexdigest()
|
|
TEST_AUTH_DATE = utils.utcnow()
|
|
TEST_BAD_AUTH_TOKEN = 'badToken'
|
|
|
|
HOUR = datetime.timedelta(seconds=3600)
|
|
AUTH_EXPIRATION_LENGTH = \
|
|
datetime.timedelta(days=int(settings.CREDENTIAL_AUTHORIZATION_DAYS))
|
|
|
|
|
|
class CredentialsAuthorizationTests(test.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
# these post_save methods interact with external resources, shut them
|
|
# down to test credentials
|
|
post_save.disconnect(sender=nova_models.CredentialsAuthorization,
|
|
dispatch_uid='django_openstack.CredentialsAuthorization.post_save')
|
|
post_save.disconnect(sender=nova_models.CredentialsAuthorization,
|
|
dispatch_uid='django_openstack.User.post_save')
|
|
|
|
def setUp(self):
|
|
test_cred = nova_models.CredentialsAuthorization()
|
|
test_cred.username = TEST_USER
|
|
test_cred.project = TEST_PROJECT
|
|
test_cred.auth_date = TEST_AUTH_DATE
|
|
test_cred.auth_token = TEST_AUTH_TOKEN
|
|
test_cred.save()
|
|
|
|
badTestCred = nova_models.CredentialsAuthorization()
|
|
badTestCred.username = TEST_USER
|
|
badTestCred.project = TEST_PROJECT
|
|
badTestCred.auth_date = TEST_AUTH_DATE
|
|
badTestCred.auth_token = TEST_BAD_AUTH_TOKEN
|
|
badTestCred.save()
|
|
|
|
self.mox = mox.Mox()
|
|
|
|
def tearDown(self):
|
|
self.mox.UnsetStubs()
|
|
|
|
def test_get_by_token(self):
|
|
TEST_MISSING_AUTH_TOKEN = hashlib.sha1('notAToken').hexdigest()
|
|
|
|
# Token not a sha1, but exists in system
|
|
cred = nova_models.CredentialsAuthorization.get_by_token(
|
|
TEST_BAD_AUTH_TOKEN)
|
|
self.assertTrue(cred is None)
|
|
|
|
# Token doesn't exist
|
|
cred = nova_models.CredentialsAuthorization.get_by_token(
|
|
TEST_MISSING_AUTH_TOKEN)
|
|
self.assertTrue(cred is None)
|
|
|
|
# Good token
|
|
cred = nova_models.CredentialsAuthorization.get_by_token(
|
|
TEST_AUTH_TOKEN)
|
|
self.assertTrue(cred is not None)
|
|
|
|
# Expire the token
|
|
cred.auth_date = utils.utcnow() - AUTH_EXPIRATION_LENGTH \
|
|
- HOUR
|
|
cred.save()
|
|
|
|
# Expired token
|
|
cred = nova_models.CredentialsAuthorization.get_by_token(
|
|
TEST_AUTH_TOKEN)
|
|
self.assertTrue(cred is None)
|
|
|
|
def test_authorize(self):
|
|
TEST_USER2 = TEST_USER + '2'
|
|
TEST_AUTH_TOKEN_2 = hashlib.sha1('token2').hexdigest()
|
|
|
|
cred_class = nova_models.CredentialsAuthorization
|
|
self.mox.StubOutWithMock(cred_class, 'create_auth_token')
|
|
cred_class.create_auth_token(TEST_USER2).AndReturn(
|
|
TEST_AUTH_TOKEN_2)
|
|
|
|
self.mox.ReplayAll()
|
|
|
|
cred = cred_class.authorize(TEST_USER2, TEST_PROJECT)
|
|
|
|
self.mox.VerifyAll()
|
|
|
|
self.assertTrue(cred is not None)
|
|
self.assertEqual(cred.username, TEST_USER2)
|
|
self.assertEqual(cred.project, TEST_PROJECT)
|
|
self.assertEqual(cred.auth_token, TEST_AUTH_TOKEN_2)
|
|
self.assertFalse(cred.auth_token_expired())
|
|
|
|
cred = cred_class.get_by_token(TEST_AUTH_TOKEN_2)
|
|
self.assertTrue(cred is not None)
|
|
|
|
def test_create_auth_token(self):
|
|
rand_state = random.getstate()
|
|
expected_salt = hashlib.sha1(str(random.random())).hexdigest()[:5]
|
|
expected_token = hashlib.sha1(expected_salt + TEST_USER).hexdigest()
|
|
|
|
random.setstate(rand_state)
|
|
auth_token = \
|
|
nova_models.CredentialsAuthorization.create_auth_token(TEST_USER)
|
|
self.assertEqual(expected_token, auth_token)
|
|
|
|
def test_auth_token_expired(self):
|
|
'''
|
|
Test expired in past, expires in future, expires _right now_
|
|
'''
|
|
cred = \
|
|
nova_models.CredentialsAuthorization.get_by_token(TEST_AUTH_TOKEN)
|
|
|
|
cred.auth_date = utils.utcnow() - AUTH_EXPIRATION_LENGTH \
|
|
- HOUR
|
|
self.assertTrue(cred.auth_token_expired())
|
|
|
|
cred.auth_date = utils.utcnow()
|
|
|
|
self.assertFalse(cred.auth_token_expired())
|
|
|
|
# testing with time is tricky. Mock out "right now" test to avoid
|
|
# timing issues
|
|
time = utils.utcnow.override_time = utils.utcnow()
|
|
cred.auth_date = time - AUTH_EXPIRATION_LENGTH
|
|
|
|
self.assertTrue(cred.auth_token_expired())
|
|
|
|
utils.utcnow.override_time = None
|
|
|
|
def test_get_download_url(self):
|
|
cred = \
|
|
nova_models.CredentialsAuthorization.get_by_token(TEST_AUTH_TOKEN)
|
|
|
|
expected_url = settings.CREDENTIAL_DOWNLOAD_URL + TEST_AUTH_TOKEN
|
|
self.assertEqual(expected_url, cred.get_download_url())
|
|
|
|
def test_get_zip(self):
|
|
cred = \
|
|
nova_models.CredentialsAuthorization.get_by_token(TEST_AUTH_TOKEN)
|
|
|
|
admin_mock = self.mox.CreateMock(NovaAdminClient)
|
|
|
|
self.mox.StubOutWithMock(connection, 'get_nova_admin_connection')
|
|
connection.get_nova_admin_connection().AndReturn(admin_mock)
|
|
|
|
admin_mock.get_zip(TEST_USER, TEST_PROJECT)
|
|
|
|
self.mox.ReplayAll()
|
|
|
|
cred.get_zip()
|
|
|
|
self.mox.VerifyAll()
|
|
|
|
cred = \
|
|
nova_models.CredentialsAuthorization.get_by_token(TEST_AUTH_TOKEN)
|
|
|
|
self.assertTrue(cred is None)
|