test_register.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. # -*- coding: utf-8 -*-
  2. # Copyright 2015, 2016 OpenMarket Ltd
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. from mock import Mock
  16. from twisted.internet import defer
  17. from synapse.api.constants import UserTypes
  18. from synapse.api.errors import ResourceLimitError, SynapseError
  19. from synapse.handlers.register import RegistrationHandler
  20. from synapse.types import RoomAlias, UserID, create_requester
  21. from tests.utils import setup_test_homeserver
  22. from .. import unittest
  23. class RegistrationHandlers(object):
  24. def __init__(self, hs):
  25. self.registration_handler = RegistrationHandler(hs)
  26. class RegistrationTestCase(unittest.TestCase):
  27. """ Tests the RegistrationHandler. """
  28. @defer.inlineCallbacks
  29. def setUp(self):
  30. self.mock_distributor = Mock()
  31. self.mock_distributor.declare("registered_user")
  32. self.mock_captcha_client = Mock()
  33. self.hs = yield setup_test_homeserver(
  34. self.addCleanup,
  35. expire_access_token=True,
  36. )
  37. self.macaroon_generator = Mock(
  38. generate_access_token=Mock(return_value='secret')
  39. )
  40. self.hs.get_macaroon_generator = Mock(return_value=self.macaroon_generator)
  41. self.handler = self.hs.get_handlers().registration_handler
  42. self.store = self.hs.get_datastore()
  43. self.hs.config.max_mau_value = 50
  44. self.lots_of_users = 100
  45. self.small_number_of_users = 1
  46. self.requester = create_requester("@requester:test")
  47. @defer.inlineCallbacks
  48. def test_user_is_created_and_logged_in_if_doesnt_exist(self):
  49. frank = UserID.from_string("@frank:test")
  50. user_id = frank.to_string()
  51. requester = create_requester(user_id)
  52. result_user_id, result_token = yield self.handler.get_or_create_user(
  53. requester, frank.localpart, "Frankie"
  54. )
  55. self.assertEquals(result_user_id, user_id)
  56. self.assertTrue(result_token is not None)
  57. self.assertEquals(result_token, 'secret')
  58. @defer.inlineCallbacks
  59. def test_if_user_exists(self):
  60. store = self.hs.get_datastore()
  61. frank = UserID.from_string("@frank:test")
  62. yield store.register(
  63. user_id=frank.to_string(),
  64. token="jkv;g498752-43gj['eamb!-5",
  65. password_hash=None,
  66. )
  67. local_part = frank.localpart
  68. user_id = frank.to_string()
  69. requester = create_requester(user_id)
  70. result_user_id, result_token = yield self.handler.get_or_create_user(
  71. requester, local_part, None
  72. )
  73. self.assertEquals(result_user_id, user_id)
  74. self.assertTrue(result_token is not None)
  75. @defer.inlineCallbacks
  76. def test_mau_limits_when_disabled(self):
  77. self.hs.config.limit_usage_by_mau = False
  78. # Ensure does not throw exception
  79. yield self.handler.get_or_create_user(self.requester, 'a', "display_name")
  80. @defer.inlineCallbacks
  81. def test_get_or_create_user_mau_not_blocked(self):
  82. self.hs.config.limit_usage_by_mau = True
  83. self.store.count_monthly_users = Mock(
  84. return_value=defer.succeed(self.hs.config.max_mau_value - 1)
  85. )
  86. # Ensure does not throw exception
  87. yield self.handler.get_or_create_user(self.requester, 'c', "User")
  88. @defer.inlineCallbacks
  89. def test_get_or_create_user_mau_blocked(self):
  90. self.hs.config.limit_usage_by_mau = True
  91. self.store.get_monthly_active_count = Mock(
  92. return_value=defer.succeed(self.lots_of_users)
  93. )
  94. with self.assertRaises(ResourceLimitError):
  95. yield self.handler.get_or_create_user(self.requester, 'b', "display_name")
  96. self.store.get_monthly_active_count = Mock(
  97. return_value=defer.succeed(self.hs.config.max_mau_value)
  98. )
  99. with self.assertRaises(ResourceLimitError):
  100. yield self.handler.get_or_create_user(self.requester, 'b', "display_name")
  101. @defer.inlineCallbacks
  102. def test_register_mau_blocked(self):
  103. self.hs.config.limit_usage_by_mau = True
  104. self.store.get_monthly_active_count = Mock(
  105. return_value=defer.succeed(self.lots_of_users)
  106. )
  107. with self.assertRaises(ResourceLimitError):
  108. yield self.handler.register(localpart="local_part")
  109. self.store.get_monthly_active_count = Mock(
  110. return_value=defer.succeed(self.hs.config.max_mau_value)
  111. )
  112. with self.assertRaises(ResourceLimitError):
  113. yield self.handler.register(localpart="local_part")
  114. @defer.inlineCallbacks
  115. def test_auto_create_auto_join_rooms(self):
  116. room_alias_str = "#room:test"
  117. self.hs.config.auto_join_rooms = [room_alias_str]
  118. res = yield self.handler.register(localpart='jeff')
  119. rooms = yield self.store.get_rooms_for_user(res[0])
  120. directory_handler = self.hs.get_handlers().directory_handler
  121. room_alias = RoomAlias.from_string(room_alias_str)
  122. room_id = yield directory_handler.get_association(room_alias)
  123. self.assertTrue(room_id['room_id'] in rooms)
  124. self.assertEqual(len(rooms), 1)
  125. @defer.inlineCallbacks
  126. def test_auto_create_auto_join_rooms_with_no_rooms(self):
  127. self.hs.config.auto_join_rooms = []
  128. frank = UserID.from_string("@frank:test")
  129. res = yield self.handler.register(frank.localpart)
  130. self.assertEqual(res[0], frank.to_string())
  131. rooms = yield self.store.get_rooms_for_user(res[0])
  132. self.assertEqual(len(rooms), 0)
  133. @defer.inlineCallbacks
  134. def test_auto_create_auto_join_where_room_is_another_domain(self):
  135. self.hs.config.auto_join_rooms = ["#room:another"]
  136. frank = UserID.from_string("@frank:test")
  137. res = yield self.handler.register(frank.localpart)
  138. self.assertEqual(res[0], frank.to_string())
  139. rooms = yield self.store.get_rooms_for_user(res[0])
  140. self.assertEqual(len(rooms), 0)
  141. @defer.inlineCallbacks
  142. def test_auto_create_auto_join_where_auto_create_is_false(self):
  143. self.hs.config.autocreate_auto_join_rooms = False
  144. room_alias_str = "#room:test"
  145. self.hs.config.auto_join_rooms = [room_alias_str]
  146. res = yield self.handler.register(localpart='jeff')
  147. rooms = yield self.store.get_rooms_for_user(res[0])
  148. self.assertEqual(len(rooms), 0)
  149. @defer.inlineCallbacks
  150. def test_auto_create_auto_join_rooms_when_support_user_exists(self):
  151. room_alias_str = "#room:test"
  152. self.hs.config.auto_join_rooms = [room_alias_str]
  153. self.store.is_support_user = Mock(return_value=True)
  154. res = yield self.handler.register(localpart='support')
  155. rooms = yield self.store.get_rooms_for_user(res[0])
  156. self.assertEqual(len(rooms), 0)
  157. directory_handler = self.hs.get_handlers().directory_handler
  158. room_alias = RoomAlias.from_string(room_alias_str)
  159. with self.assertRaises(SynapseError):
  160. yield directory_handler.get_association(room_alias)
  161. @defer.inlineCallbacks
  162. def test_auto_create_auto_join_where_no_consent(self):
  163. self.hs.config.user_consent_at_registration = True
  164. self.hs.config.block_events_without_consent_error = "Error"
  165. room_alias_str = "#room:test"
  166. self.hs.config.auto_join_rooms = [room_alias_str]
  167. res = yield self.handler.register(localpart='jeff')
  168. yield self.handler.post_consent_actions(res[0])
  169. rooms = yield self.store.get_rooms_for_user(res[0])
  170. self.assertEqual(len(rooms), 0)
  171. @defer.inlineCallbacks
  172. def test_register_support_user(self):
  173. res = yield self.handler.register(localpart='user', user_type=UserTypes.SUPPORT)
  174. self.assertTrue(self.store.is_support_user(res[0]))
  175. @defer.inlineCallbacks
  176. def test_register_not_support_user(self):
  177. res = yield self.handler.register(localpart='user')
  178. self.assertFalse(self.store.is_support_user(res[0]))