PageRenderTime 68ms CodeModel.GetById 39ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/core/tests/authentication.py

https://github.com/johncosta/django-jcosta-tastypie
Python | 166 lines | 107 code | 37 blank | 22 comment | 1 complexity | 629d5ac872f7773cc78f90b886241680 MD5 | raw file
  1. import base64
  2. from django.contrib.auth.models import User
  3. from django.core import mail
  4. from django.http import HttpRequest
  5. from django.test import TestCase
  6. from tastypie.authentication import Authentication, BasicAuthentication, ApiKeyAuthentication, DigestAuthentication
  7. from tastypie.http import HttpUnauthorized
  8. from tastypie.models import ApiKey, create_api_key
  9. # Be tricky.
  10. from tastypie.authentication import python_digest
  11. if python_digest is None:
  12. import warnings
  13. warnings.warn("Running tests without python_digest! Bad news!")
  14. class AuthenticationTestCase(TestCase):
  15. def test_is_authenticated(self):
  16. auth = Authentication()
  17. request = HttpRequest()
  18. # Doesn't matter. Always true.
  19. self.assertTrue(auth.is_authenticated(None))
  20. self.assertTrue(auth.is_authenticated(request))
  21. def test_get_identifier(self):
  22. auth = Authentication()
  23. request = HttpRequest()
  24. self.assertEqual(auth.get_identifier(request), 'noaddr_nohost')
  25. request = HttpRequest()
  26. request.META['REMOTE_ADDR'] = '127.0.0.1'
  27. request.META['REMOTE_HOST'] = 'nebula.local'
  28. self.assertEqual(auth.get_identifier(request), '127.0.0.1_nebula.local')
  29. class BasicAuthenticationTestCase(TestCase):
  30. fixtures = ['note_testdata.json']
  31. def test_is_authenticated(self):
  32. auth = BasicAuthentication()
  33. request = HttpRequest()
  34. # No HTTP Basic auth details should fail.
  35. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  36. # HttpUnauthorized with auth type and realm
  37. self.assertEqual(auth.is_authenticated(request)['WWW-Authenticate'], 'Basic Realm="django-tastypie"')
  38. # Wrong basic auth details.
  39. request.META['HTTP_AUTHORIZATION'] = 'abcdefg'
  40. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  41. # No password.
  42. request.META['HTTP_AUTHORIZATION'] = base64.b64encode('daniel')
  43. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  44. # Wrong user/password.
  45. request.META['HTTP_AUTHORIZATION'] = base64.b64encode('daniel:pass')
  46. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  47. # Correct user/password.
  48. john_doe = User.objects.get(username='johndoe')
  49. john_doe.set_password('pass')
  50. john_doe.save()
  51. request.META['HTTP_AUTHORIZATION'] = 'Basic %s' % base64.b64encode('johndoe:pass')
  52. self.assertEqual(auth.is_authenticated(request), True)
  53. # Regression: Password with colon.
  54. john_doe = User.objects.get(username='johndoe')
  55. john_doe.set_password('pass:word')
  56. john_doe.save()
  57. request.META['HTTP_AUTHORIZATION'] = 'Basic %s' % base64.b64encode('johndoe:pass:word')
  58. self.assertEqual(auth.is_authenticated(request), True)
  59. class ApiKeyAuthenticationTestCase(TestCase):
  60. fixtures = ['note_testdata.json']
  61. def setUp(self):
  62. super(ApiKeyAuthenticationTestCase, self).setUp()
  63. ApiKey.objects.all().delete()
  64. def test_is_authenticated(self):
  65. auth = ApiKeyAuthentication()
  66. request = HttpRequest()
  67. # Simulate sending the signal.
  68. john_doe = User.objects.get(username='johndoe')
  69. create_api_key(User, instance=john_doe, created=True)
  70. # No username/api_key details should fail.
  71. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  72. # Wrong username details.
  73. request.GET['username'] = 'foo'
  74. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  75. # No api_key.
  76. request.GET['username'] = 'daniel'
  77. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  78. # Wrong user/api_key.
  79. request.GET['username'] = 'daniel'
  80. request.GET['api_key'] = 'foo'
  81. self.assertEqual(isinstance(auth.is_authenticated(request), HttpUnauthorized), True)
  82. # Correct user/api_key.
  83. john_doe = User.objects.get(username='johndoe')
  84. request.GET['username'] = 'johndoe'
  85. request.GET['api_key'] = john_doe.api_key.key
  86. self.assertEqual(auth.is_authenticated(request), True)
  87. class DigestAuthenticationTestCase(TestCase):
  88. fixtures = ['note_testdata.json']
  89. def setUp(self):
  90. super(DigestAuthenticationTestCase, self).setUp()
  91. ApiKey.objects.all().delete()
  92. def test_is_authenticated(self):
  93. auth = DigestAuthentication()
  94. request = HttpRequest()
  95. # Simulate sending the signal.
  96. john_doe = User.objects.get(username='johndoe')
  97. create_api_key(User, instance=john_doe, created=True)
  98. # No HTTP Basic auth details should fail.
  99. auth_request = auth.is_authenticated(request)
  100. self.assertEqual(isinstance(auth_request, HttpUnauthorized), True)
  101. # HttpUnauthorized with auth type and realm
  102. self.assertEqual(auth_request['WWW-Authenticate'].find('Digest'), 0)
  103. self.assertEqual(auth_request['WWW-Authenticate'].find(' realm="django-tastypie"') > 0, True)
  104. self.assertEqual(auth_request['WWW-Authenticate'].find(' opaque=') > 0, True)
  105. self.assertEqual(auth_request['WWW-Authenticate'].find('nonce=') > 0, True)
  106. # Wrong basic auth details.
  107. request.META['HTTP_AUTHORIZATION'] = 'abcdefg'
  108. auth_request = auth.is_authenticated(request)
  109. self.assertEqual(isinstance(auth_request, HttpUnauthorized), True)
  110. # No password.
  111. request.META['HTTP_AUTHORIZATION'] = base64.b64encode('daniel')
  112. auth_request = auth.is_authenticated(request)
  113. self.assertEqual(isinstance(auth_request, HttpUnauthorized), True)
  114. # Wrong user/password.
  115. request.META['HTTP_AUTHORIZATION'] = base64.b64encode('daniel:pass')
  116. auth_request = auth.is_authenticated(request)
  117. self.assertEqual(isinstance(auth_request, HttpUnauthorized), True)
  118. # Correct user/password.
  119. john_doe = User.objects.get(username='johndoe')
  120. request.META['HTTP_AUTHORIZATION'] = python_digest.build_authorization_request(
  121. john_doe.username,
  122. request.method,
  123. '/', # uri
  124. 1, # nonce_count
  125. digest_challenge=auth_request['WWW-Authenticate'],
  126. password=john_doe.api_key.key
  127. )
  128. auth_request = auth.is_authenticated(request)
  129. self.assertEqual(auth_request, True)