test_views.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. # coding: utf-8
  2. """
  3. Test DM claim interface
  4. """
  5. from __future__ import print_function
  6. from __future__ import absolute_import
  7. from __future__ import division
  8. from __future__ import unicode_literals
  9. from django.test import TestCase
  10. from django.core.urlresolvers import reverse
  11. from backend.models import Person, Fingerprint
  12. from backend import const
  13. from backend.unittest import PersonFixtureMixin
  14. from keyring.models import Key
  15. test_fingerprint1 = "1793D6AB75663E6BF104953A634F4BD1E7AD5568"
  16. test_fingerprint2 = "66B4DFB68CB24EBBD8650BC4F4B4B0CC797EBFAB"
  17. # Signed with key 1793D6AB75663E6BF104953A634F4BD1E7AD5568
  18. test_fpr1_signed_invalid_text = """
  19. -----BEGIN PGP SIGNED MESSAGE-----
  20. Hash: SHA256
  21. This is a test string
  22. -----BEGIN PGP SIGNATURE-----
  23. Version: GnuPG v1
  24. iQIcBAEBCAAGBQJXO5CSAAoJEAPWVoyDcnWpArgP/3EBdxc4gu5iQX7HQdmc93p8
  25. 4BSd/6evtqNtSJehQtZIRiJIqP3pcKDgnWQ+PqkEDkrMnlp7hQyLLXqENcwU54l1
  26. Pj3OiS4O5EMkF4rvteIajX/GXO/qou7+zJYny/DBJUaDg9Dem7Zr8TzVoQsEMOcs
  27. 3VPdKQTZHOYcKvCoBMv34ZD9cKRsLACt7x+MTQIIZg62oaaCoHEraT6KSkkcn28P
  28. IC5LTZaMRJm8di3zpxxHpM6RHhJpLEjmZNgRFaGPKam9ba7OeQy96tgTRYs4yKvx
  29. gO2zcDLoXC2s/vhF7A0VTbg7GGfvFlQpRr6tempK39UbUaGGDlaPkyYeRdIXhxoP
  30. yOUZS+ejGI2lxiECYWR5hVUO+Py+sHM2FWwphaRF226yPdq3bIIobQ22FgDaEiPw
  31. bWrRVNG35TRJYSn4xb3XovIrcY8rmgOV5gSCpZh4Iy/92PuVg5gp1y2fFHp42PrC
  32. OQqk1JXE1PHAX6ZqWQJW3MUcyBqKyEnz5Ylez7yyDqCWobey/s62dybYtdtQ/aZO
  33. xBT0EeU3M5W1yBzEWVCLUUBIsmzFI+uUqZwO20XWmdMYFtWyvxmVQ9JCXo3ncWwf
  34. a+KEa+sSqB8ZN0fIzGLL2uOOPdQGoVHxnObCJ5gBKjZ73JajY3cfLysY0UW45/eh
  35. +5lxImpwauF6Tf+pMHKD
  36. =86an
  37. -----END PGP SIGNATURE-----
  38. """
  39. # Signed with key 1793D6AB75663E6BF104953A634F4BD1E7AD5568
  40. test_fpr1_signed_valid_text = """
  41. -----BEGIN PGP SIGNED MESSAGE-----
  42. Hash: SHA256
  43. I agree to uphold the Social Contract and the Debian Free Software Guidelines in my Debian work.
  44. I have read the Debian Machine Usage Policy and I accept them.
  45. -----BEGIN PGP SIGNATURE-----
  46. Version: GnuPG v1
  47. iQIcBAEBCAAGBQJXPCbAAAoJEAPWVoyDcnWpmtYQAJo8r4Ve1xSYKs2s9MwAZLiD
  48. q5XWRo9SFmIOyu7jq4giTGA5GMOFiGOMDHMWSNDnraVfhAZ2CrtwvyvaHcsYMDLb
  49. kumcBqE2wYJNVMlgDX7celUMeeSeIVXvk1ef3/m0R2L0b/f+p/6/4IzaR3ZVCbkv
  50. JwqZ7XJLH0YKih50fpnKjYnKEzVNOKGXcwm9I7XXJkl9a8c9TkC7IXnbHyL2AuZX
  51. /kvOv+Y0EWXLEBgQx2PbxxZoM31nFIIa+MNLdz8dEOgc7g1aR8CCT0XyGTViL8W5
  52. rrZSGMxdTXLPf3v+GqfehCUMCvy6/R4oqny2ijYVlaPFrMhPlpa7ydtgstySxc8Z
  53. bCNFbSQM1ZSZUhcyFLhq5SbXW3T74jUHF0ApeM6n92erb02HDmv1uqsNBnFJCqdt
  54. Zhg0mm1YPlAEPx7RSCwt0Zyu0Cuj/wK1d6YakWkxZwj5wkRvejsuMjcjWA5q/84I
  55. zGoXT7GlqGdrvczrecoE1nzvqF8m5QXxOthaSjPqEviEde4YhQWxJfItULsLzGEb
  56. OD+WdwaUol7byxcxmUIy60lFYsl2ryTvvxaRX1eUZtBkeeyP70SNqIgm+pbz2yba
  57. 0YW/mUIu3a+Dct/X/b05acQNRFcEWu0YWF6neBxR3Xd4cX1TJ2+9ICxSe2B8auxr
  58. lsFwsnOvPjKD0iEMVmGe
  59. =zlA9
  60. -----END PGP SIGNATURE-----
  61. """
  62. # Signed with key 66B4DFB68CB24EBBD8650BC4F4B4B0CC797EBFAB
  63. test_fpr2_signed_valid_text = """
  64. -----BEGIN PGP SIGNED MESSAGE-----
  65. Hash: SHA256
  66. I agree to uphold the Social Contract and the Debian Free Software Guidelines in my Debian work.
  67. I have read the Debian Machine Usage Policy and I accept them.
  68. -----BEGIN PGP SIGNATURE-----
  69. Version: GnuPG v1
  70. iQIcBAEBCAAGBQJXPCcaAAoJEB5qw/OH8O2sbD8QAMrbXQYAGA/8EmXkSMKcAisk
  71. jSqxkBDbnNeXn+Vso5aT/aVY/n63v/uDh2YDlz9Q4rC1GWS23KaQAf35spkyLCua
  72. NSw3gbRJWByTuPxp+E3M2+9N56ZJGFwHAeatxbZJUeP88Dtsp7F+he9FaT2BUFCb
  73. zYV9IbR8g47B8BDSTxjURWg34gVxsghUnYW6kYT8ATI1xls5zweiOt1UCe7UKVqo
  74. PFNgaEPjdsuqE8pYIcLNjwx/adXjbXVsu3U7aYXCfZNZfi9FocCBUL2w0Ry8RqQa
  75. tw/Ag6nQY7e7T8eIu3n49qVV9QarfiqB4JoaH9KTDZn6BHM+IgIxYbZabMVq/+9H
  76. O0yeJGt/Pj1SISchDcDzebsXZfLl4HYhtncKwjLVwlPcV6Iopmw7uXklzOgD1xim
  77. eqj0s84751kt/68TU3Hps/7PzQfCOfs2GZ4XCUzRcnluKJROBWX+xg3z3zEa0Luy
  78. 7Kn2Pq+AYNc0T9r6Ii4ioxraq3o/4G8mNCo6HVEFAC6jEejxyBjN3xFb5hAAKzPM
  79. qNOSwQp380PzgE1L8eYcvNaUPgPqRVdPJzLX04NRsAyFgxPkBCo5V3WRSQpbEozi
  80. vEKSopp/HEL4wBq8JYlvA0DuHTB7+X91XI6LreJQAe+6Jo07iuqmeZd9/pl1Anch
  81. 1hXsFK826L36Be03CwGL
  82. =io+s
  83. -----END PGP SIGNATURE-----
  84. """
  85. class TestPersonFingerprints(PersonFixtureMixin, TestCase):
  86. @classmethod
  87. def setUpClass(cls):
  88. super(TestPersonFingerprints, cls).setUpClass()
  89. cls.persons.create("am", status=const.STATUS_DD_NU)
  90. cls.ams.create("am", person=cls.persons.am)
  91. @classmethod
  92. def __add_extra_tests__(cls):
  93. # Anonymous cannot see or edit anyone's keys
  94. for person in ("pending", "dc", "dc_ga", "dm", "dm_ga", "dd_nu", "dd_u", "fd", "dam"):
  95. cls._add_method(cls._test_get_forbidden, None, person)
  96. cls._add_method(cls._test_post_forbidden, None, person)
  97. # Only confirmed people with no entries in LDAP can see and edit their own keys
  98. for person in ("dc", "dm"):
  99. cls._add_method(cls._test_get_success, person, person)
  100. cls._add_method(cls._test_post_success, person, person)
  101. for person in ("pending", "dc_ga", "dm_ga", "dd_nu", "dd_u", "fd", "dam"):
  102. cls._add_method(cls._test_get_forbidden, person, person)
  103. cls._add_method(cls._test_post_forbidden, person, person)
  104. # active ams, fd and dam can see and edit the keys of anyone who is not in LDAP
  105. for visitor in ("am", "fd", "dam"):
  106. for visited in ("dc", "dm"):
  107. cls._add_method(cls._test_get_success, visitor, visited)
  108. cls._add_method(cls._test_post_success, visitor, visited)
  109. for visitor in ("pending", "dc", "dc_ga", "dm", "dm_ga", "dd_nu", "dd_u"):
  110. for visited in ("dc", "dm"):
  111. if visitor == visited: continue
  112. cls._add_method(cls._test_get_forbidden, visitor, visited)
  113. cls._add_method(cls._test_post_forbidden, visitor, visited)
  114. def _test_get_success(self, visitor, visited):
  115. client = self.make_test_client(visitor)
  116. response = client.get(reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}))
  117. self.assertEquals(response.status_code, 200)
  118. def _test_post_success(self, visitor, visited):
  119. client = self.make_test_client(visitor)
  120. # Add one fingerprint
  121. response = client.post(reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}), data={"fpr": test_fingerprint1})
  122. self.assertRedirectMatches(response, reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}))
  123. fpr1 = Fingerprint.objects.get(fpr=test_fingerprint1)
  124. self.assertEquals(fpr1.is_active, True)
  125. self.assertEquals(fpr1.person, self.persons[visited])
  126. # Add a second one, it becomes the active one
  127. response = client.post(reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}), data={"fpr": test_fingerprint2})
  128. self.assertRedirectMatches(response, reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}))
  129. fpr2 = Fingerprint.objects.get(fpr=test_fingerprint2)
  130. self.assertEquals(fpr2.is_active, True)
  131. self.assertEquals(fpr2.person, self.persons[visited])
  132. fpr1 = Fingerprint.objects.get(fpr=test_fingerprint1)
  133. self.assertEquals(fpr1.is_active, False)
  134. # Activate the first one
  135. response = client.post(reverse("fprs_person_activate", kwargs={"key": self.persons[visited].lookup_key, "fpr": test_fingerprint1}))
  136. self.assertRedirectMatches(response, reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}))
  137. fpr1 = Fingerprint.objects.get(fpr=test_fingerprint1)
  138. fpr2 = Fingerprint.objects.get(fpr=test_fingerprint2)
  139. self.assertEquals(fpr1.is_active, True)
  140. self.assertEquals(fpr2.is_active, False)
  141. def _test_get_forbidden(self, visitor, visited):
  142. client = self.make_test_client(visitor)
  143. response = client.get(reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}))
  144. self.assertPermissionDenied(response)
  145. def _test_post_forbidden(self, visitor, visited):
  146. client = self.make_test_client(visitor)
  147. response = client.post(reverse("fprs_person_list", kwargs={"key": self.persons[visited].lookup_key}), data={"fpr": test_fingerprint1})
  148. self.assertPermissionDenied(response)