test_pagure_lib_git_auth.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2015-2018 - Copyright Red Hat Inc
  4. Authors:
  5. Pierre-Yves Chibon <pingou@pingoured.fr>
  6. Patrick Uiterwijk <patrick@puiterwijk.org>
  7. """
  8. from __future__ import unicode_literals, absolute_import
  9. import datetime
  10. import os
  11. import shutil
  12. import sys
  13. import tempfile
  14. import time
  15. import unittest
  16. import pygit2
  17. import six
  18. from mock import patch, MagicMock
  19. sys.path.insert(
  20. 0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
  21. )
  22. import pagure.lib.git
  23. import pagure.lib.query
  24. import tests
  25. from pagure.lib.repo import PagureRepo
  26. class PagureLibGitAuthtests(tests.Modeltests):
  27. """ Tests for pagure.lib.git_auth """
  28. config_values = {"authbackend": "test_auth"}
  29. def setUp(self):
  30. super(PagureLibGitAuthtests, self).setUp()
  31. tests.create_projects(self.session)
  32. tests.create_tokens(self.session)
  33. tests.create_tokens_acl(self.session)
  34. self.create_project_full("hooktest")
  35. def test_edit_with_all_allowed(self):
  36. """Tests that editing a file is possible if ACLs say allowed."""
  37. user = tests.FakeUser()
  38. user.username = "pingou"
  39. with tests.user_set(self.app.application, user):
  40. # Add some content to the git repo
  41. tests.add_content_git_repo(
  42. os.path.join(self.path, "repos", "hooktest.git")
  43. )
  44. data = {
  45. "content": "foo\n bar\n baz",
  46. "commit_title": "test commit",
  47. "commit_message": "Online commits from the gure.lib.get",
  48. "email": "bar@pingou.com",
  49. "branch": "master",
  50. "csrf_token": self.get_csrf(),
  51. }
  52. output = self.app.post(
  53. "/hooktest/edit/master/f/sources",
  54. data=data,
  55. follow_redirects=True,
  56. )
  57. self.assertEqual(output.status_code, 200)
  58. output_text = output.get_data(as_text=True)
  59. self.assertIn(
  60. "<title>Commits - hooktest - Pagure</title>", output_text
  61. )
  62. self.assertIn("test commit", output_text)
  63. # Check file after the commit
  64. output = self.app.get("/hooktest/raw/master/f/sources")
  65. self.assertEqual(output.status_code, 200)
  66. output_text = output.get_data(as_text=True)
  67. self.assertEqual(output_text, "foo\n bar\n baz")
  68. def test_edit_with_all_denied(self):
  69. """Tests that editing a file is not possible if ACLs say denied."""
  70. self.set_auth_status(False)
  71. user = tests.FakeUser()
  72. user.username = "pingou"
  73. with tests.user_set(self.app.application, user):
  74. # Add some content to the git repo
  75. tests.add_content_git_repo(
  76. os.path.join(self.path, "repos", "hooktest.git")
  77. )
  78. data = {
  79. "content": "foo\n bar\n baz",
  80. "commit_title": "test commit",
  81. "commit_message": "Online commits from the gure.lib.get",
  82. "email": "bar@pingou.com",
  83. "branch": "master",
  84. "csrf_token": self.get_csrf(),
  85. }
  86. output = self.app.post(
  87. "/hooktest/edit/master/f/sources",
  88. data=data,
  89. follow_redirects=True,
  90. )
  91. self.assertEqual(output.status_code, 200)
  92. output_text = output.get_data(as_text=True)
  93. self.assertIn(
  94. "Remote hook declined the push: "
  95. "Denied push for ref &#39;refs/heads/master&#39; for user &#39;pingou&#39;",
  96. output_text,
  97. )
  98. self.assertIn("All changes have been rejected", output_text)
  99. # Check file after the commit:
  100. output = self.app.get("/hooktest/raw/master/f/sources")
  101. self.assertEqual(output.status_code, 200)
  102. output_text = output.get_data(as_text=True)
  103. self.assertEqual(output_text, "foo\n bar")
  104. def test_edit_pr(self):
  105. """Tests the ACLs if they only accept PRs."""
  106. self.set_auth_status(
  107. {"refs/heads/master": "pronly", "refs/heads/source": True}
  108. )
  109. user = tests.FakeUser()
  110. user.username = "pingou"
  111. with tests.user_set(self.app.application, user):
  112. # Add some content to the git repo
  113. tests.add_content_git_repo(
  114. os.path.join(self.path, "repos", "hooktest.git")
  115. )
  116. # Try editing master branch, should fail (only PRs allowed)
  117. data = {
  118. "content": "foo\n bar\n baz",
  119. "commit_title": "test commit",
  120. "commit_message": "Online commits from the gure.lib.get",
  121. "email": "bar@pingou.com",
  122. "branch": "master",
  123. "csrf_token": self.get_csrf(),
  124. }
  125. output = self.app.post(
  126. "/hooktest/edit/master/f/sources",
  127. data=data,
  128. follow_redirects=True,
  129. )
  130. self.assertEqual(output.status_code, 200)
  131. output_text = output.get_data(as_text=True)
  132. self.assertIn(
  133. "Remote hook declined the push: "
  134. "Denied push for ref &#39;refs/heads/master&#39; for user &#39;pingou&#39;",
  135. output_text,
  136. )
  137. self.assertIn("All changes have been rejected", output_text)
  138. # Change something in the "source" branch
  139. data = {
  140. "content": "foo\n bar\n baz",
  141. "commit_title": "test commit",
  142. "commit_message": "Online commits from the gure.lib.get",
  143. "email": "bar@pingou.com",
  144. "branch": "source",
  145. "csrf_token": self.get_csrf(),
  146. }
  147. output = self.app.post(
  148. "/hooktest/edit/master/f/sources",
  149. data=data,
  150. follow_redirects=True,
  151. )
  152. self.assertEqual(output.status_code, 200)
  153. output_text = output.get_data(as_text=True)
  154. self.assertIn(
  155. "<title>Commits - hooktest - Pagure</title>", output_text
  156. )
  157. self.assertIn("test commit", output_text)
  158. # Check file after the commit:
  159. output = self.app.get("/hooktest/raw/source/f/sources")
  160. self.assertEqual(output.status_code, 200)
  161. output_text = output.get_data(as_text=True)
  162. self.assertEqual(output_text, "foo\n bar\n baz")
  163. # Create the PRs
  164. project = pagure.lib.query.get_authorized_project(
  165. self.session, "hooktest"
  166. )
  167. req = pagure.lib.query.new_pull_request(
  168. session=self.session,
  169. repo_from=project,
  170. branch_from="source",
  171. repo_to=project,
  172. branch_to="master",
  173. title="PR to master",
  174. user="pingou",
  175. )
  176. self.session.add(req)
  177. self.session.commit()
  178. # Check file before the merge
  179. output = self.app.get("/hooktest/raw/master/f/sources")
  180. self.assertEqual(output.status_code, 200)
  181. output_text = output.get_data(as_text=True)
  182. self.assertEqual(output_text, "foo\n bar")
  183. # Try to merge (should work)
  184. output = self.app.post(
  185. "/hooktest/pull-request/1/merge",
  186. data=data,
  187. follow_redirects=True,
  188. )
  189. self.assertEqual(output.status_code, 200)
  190. output_text = output.get_data(as_text=True)
  191. self.assertIn(
  192. "<title>PR#1: PR to master - hooktest\n - Pagure</title>",
  193. output_text,
  194. )
  195. # Check file after the merge
  196. output = self.app.get("/hooktest/raw/master/f/sources")
  197. self.assertEqual(output.status_code, 200)
  198. output_text = output.get_data(as_text=True)
  199. self.assertEqual(output_text, "foo\n bar\n baz")