Remove access-token support from RegistrationHandler.register (#5641)

Nothing uses this now, so we can remove the dead code, and clean up the
API.

Since we're changing the shape of the return value anyway, we take the
opportunity to give the method a better name.
This commit is contained in:
Richard van der Hoff 2019-07-08 19:01:08 +01:00 committed by GitHub
parent 43d175d17a
commit 824707383b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 44 additions and 81 deletions

1
changelog.d/5641.misc Normal file
View File

@ -0,0 +1 @@
Remove access-token support from RegistrationHandler.register, and rename it.

View File

@ -138,11 +138,10 @@ class RegistrationHandler(BaseHandler):
) )
@defer.inlineCallbacks @defer.inlineCallbacks
def register( def register_user(
self, self,
localpart=None, localpart=None,
password=None, password=None,
generate_token=True,
guest_access_token=None, guest_access_token=None,
make_guest=False, make_guest=False,
admin=False, admin=False,
@ -160,11 +159,6 @@ class RegistrationHandler(BaseHandler):
password (unicode) : The password to assign to this user so they can password (unicode) : The password to assign to this user so they can
login again. This can be None which means they cannot login again login again. This can be None which means they cannot login again
via a password (e.g. the user is an application service user). via a password (e.g. the user is an application service user).
generate_token (bool): Whether a new access token should be
generated. Having this be True should be considered deprecated,
since it offers no means of associating a device_id with the
access_token. Instead you should call auth_handler.issue_access_token
after registration.
user_type (str|None): type of user. One of the values from user_type (str|None): type of user. One of the values from
api.constants.UserTypes, or None for a normal user. api.constants.UserTypes, or None for a normal user.
default_display_name (unicode|None): if set, the new user's displayname default_display_name (unicode|None): if set, the new user's displayname
@ -172,7 +166,7 @@ class RegistrationHandler(BaseHandler):
address (str|None): the IP address used to perform the registration. address (str|None): the IP address used to perform the registration.
bind_emails (List[str]): list of emails to bind to this account. bind_emails (List[str]): list of emails to bind to this account.
Returns: Returns:
A tuple of (user_id, access_token). Deferred[str]: user_id
Raises: Raises:
RegistrationError if there was a problem registering. RegistrationError if there was a problem registering.
""" """
@ -206,12 +200,8 @@ class RegistrationHandler(BaseHandler):
elif default_display_name is None: elif default_display_name is None:
default_display_name = localpart default_display_name = localpart
token = None
if generate_token:
token = self.macaroon_gen.generate_access_token(user_id)
yield self.register_with_store( yield self.register_with_store(
user_id=user_id, user_id=user_id,
token=token,
password_hash=password_hash, password_hash=password_hash,
was_guest=was_guest, was_guest=was_guest,
make_guest=make_guest, make_guest=make_guest,
@ -230,21 +220,17 @@ class RegistrationHandler(BaseHandler):
else: else:
# autogen a sequential user ID # autogen a sequential user ID
attempts = 0 attempts = 0
token = None
user = None user = None
while not user: while not user:
localpart = yield self._generate_user_id(attempts > 0) localpart = yield self._generate_user_id(attempts > 0)
user = UserID(localpart, self.hs.hostname) user = UserID(localpart, self.hs.hostname)
user_id = user.to_string() user_id = user.to_string()
yield self.check_user_id_not_appservice_exclusive(user_id) yield self.check_user_id_not_appservice_exclusive(user_id)
if generate_token:
token = self.macaroon_gen.generate_access_token(user_id)
if default_display_name is None: if default_display_name is None:
default_display_name = localpart default_display_name = localpart
try: try:
yield self.register_with_store( yield self.register_with_store(
user_id=user_id, user_id=user_id,
token=token,
password_hash=password_hash, password_hash=password_hash,
make_guest=make_guest, make_guest=make_guest,
create_profile_with_displayname=default_display_name, create_profile_with_displayname=default_display_name,
@ -254,7 +240,6 @@ class RegistrationHandler(BaseHandler):
# if user id is taken, just generate another # if user id is taken, just generate another
user = None user = None
user_id = None user_id = None
token = None
attempts += 1 attempts += 1
if not self.hs.config.user_consent_at_registration: if not self.hs.config.user_consent_at_registration:
@ -278,7 +263,7 @@ class RegistrationHandler(BaseHandler):
# Bind email to new account # Bind email to new account
yield self._register_email_threepid(user_id, threepid_dict, None, False) yield self._register_email_threepid(user_id, threepid_dict, None, False)
defer.returnValue((user_id, token)) defer.returnValue(user_id)
@defer.inlineCallbacks @defer.inlineCallbacks
def _auto_join_rooms(self, user_id): def _auto_join_rooms(self, user_id):
@ -541,7 +526,6 @@ class RegistrationHandler(BaseHandler):
def register_with_store( def register_with_store(
self, self,
user_id, user_id,
token=None,
password_hash=None, password_hash=None,
was_guest=False, was_guest=False,
make_guest=False, make_guest=False,
@ -555,9 +539,6 @@ class RegistrationHandler(BaseHandler):
Args: Args:
user_id (str): The desired user ID to register. user_id (str): The desired user ID to register.
token (str): The desired access token to use for this user. If this
is not None, the given access token is associated with the user
id.
password_hash (str|None): Optional. The password hash for this user. password_hash (str|None): Optional. The password hash for this user.
was_guest (bool): Optional. Whether this is a guest account being was_guest (bool): Optional. Whether this is a guest account being
upgraded to a non-guest account. upgraded to a non-guest account.
@ -593,7 +574,6 @@ class RegistrationHandler(BaseHandler):
if self.hs.config.worker_app: if self.hs.config.worker_app:
return self._register_client( return self._register_client(
user_id=user_id, user_id=user_id,
token=token,
password_hash=password_hash, password_hash=password_hash,
was_guest=was_guest, was_guest=was_guest,
make_guest=make_guest, make_guest=make_guest,
@ -606,7 +586,6 @@ class RegistrationHandler(BaseHandler):
else: else:
return self.store.register( return self.store.register(
user_id=user_id, user_id=user_id,
token=token,
password_hash=password_hash, password_hash=password_hash,
was_guest=was_guest, was_guest=was_guest,
make_guest=make_guest, make_guest=make_guest,

View File

@ -103,7 +103,6 @@ class ModuleApi(object):
_, access_token = yield self.register_device(user_id) _, access_token = yield self.register_device(user_id)
defer.returnValue((user_id, access_token)) defer.returnValue((user_id, access_token))
@defer.inlineCallbacks
def register_user(self, localpart, displayname=None, emails=[]): def register_user(self, localpart, displayname=None, emails=[]):
"""Registers a new user with given localpart and optional displayname, emails. """Registers a new user with given localpart and optional displayname, emails.
@ -115,15 +114,10 @@ class ModuleApi(object):
Returns: Returns:
Deferred[str]: user_id Deferred[str]: user_id
""" """
user_id, _ = yield self.hs.get_registration_handler().register( return self.hs.get_registration_handler().register_user(
localpart=localpart, localpart=localpart, default_display_name=displayname, bind_emails=emails
default_display_name=displayname,
bind_emails=emails,
generate_token=False,
) )
defer.returnValue(user_id)
def register_device(self, user_id, device_id=None, initial_display_name=None): def register_device(self, user_id, device_id=None, initial_display_name=None):
"""Register a device for a user and generate an access token. """Register a device for a user and generate an access token.

View File

@ -38,7 +38,6 @@ class ReplicationRegisterServlet(ReplicationEndpoint):
@staticmethod @staticmethod
def _serialize_payload( def _serialize_payload(
user_id, user_id,
token,
password_hash, password_hash,
was_guest, was_guest,
make_guest, make_guest,
@ -51,9 +50,6 @@ class ReplicationRegisterServlet(ReplicationEndpoint):
""" """
Args: Args:
user_id (str): The desired user ID to register. user_id (str): The desired user ID to register.
token (str): The desired access token to use for this user. If this
is not None, the given access token is associated with the user
id.
password_hash (str|None): Optional. The password hash for this user. password_hash (str|None): Optional. The password hash for this user.
was_guest (bool): Optional. Whether this is a guest account being was_guest (bool): Optional. Whether this is a guest account being
upgraded to a non-guest account. upgraded to a non-guest account.
@ -68,7 +64,6 @@ class ReplicationRegisterServlet(ReplicationEndpoint):
address (str|None): the IP address used to perform the regitration. address (str|None): the IP address used to perform the regitration.
""" """
return { return {
"token": token,
"password_hash": password_hash, "password_hash": password_hash,
"was_guest": was_guest, "was_guest": was_guest,
"make_guest": make_guest, "make_guest": make_guest,
@ -85,7 +80,6 @@ class ReplicationRegisterServlet(ReplicationEndpoint):
yield self.registration_handler.register_with_store( yield self.registration_handler.register_with_store(
user_id=user_id, user_id=user_id,
token=content["token"],
password_hash=content["password_hash"], password_hash=content["password_hash"],
was_guest=content["was_guest"], was_guest=content["was_guest"],
make_guest=content["make_guest"], make_guest=content["make_guest"],

View File

@ -219,11 +219,10 @@ class UserRegisterServlet(RestServlet):
register = RegisterRestServlet(self.hs) register = RegisterRestServlet(self.hs)
(user_id, _) = yield register.registration_handler.register( user_id = yield register.registration_handler.register_user(
localpart=body["username"].lower(), localpart=body["username"].lower(),
password=body["password"], password=body["password"],
admin=bool(admin), admin=bool(admin),
generate_token=False,
user_type=user_type, user_type=user_type,
) )

View File

@ -314,10 +314,8 @@ class LoginRestServlet(RestServlet):
registered_user_id = yield self.auth_handler.check_user_exists(user_id) registered_user_id = yield self.auth_handler.check_user_exists(user_id)
if not registered_user_id: if not registered_user_id:
registered_user_id, _ = ( registered_user_id = yield self.registration_handler.register_user(
yield self.registration_handler.register( localpart=user
localpart=user, generate_token=False
)
) )
result = yield self._register_device_with_callback( result = yield self._register_device_with_callback(
@ -505,12 +503,8 @@ class SSOAuthHandler(object):
user_id = UserID(localpart, self._hostname).to_string() user_id = UserID(localpart, self._hostname).to_string()
registered_user_id = yield self._auth_handler.check_user_exists(user_id) registered_user_id = yield self._auth_handler.check_user_exists(user_id)
if not registered_user_id: if not registered_user_id:
registered_user_id, _ = ( registered_user_id = yield self._registration_handler.register_user(
yield self._registration_handler.register( localpart=localpart, default_display_name=user_display_name
localpart=localpart,
generate_token=False,
default_display_name=user_display_name,
)
) )
login_token = self._macaroon_gen.generate_short_term_login_token( login_token = self._macaroon_gen.generate_short_term_login_token(

View File

@ -464,11 +464,10 @@ class RegisterRestServlet(RestServlet):
Codes.THREEPID_IN_USE, Codes.THREEPID_IN_USE,
) )
(registered_user_id, _) = yield self.registration_handler.register( registered_user_id = yield self.registration_handler.register_user(
localpart=desired_username, localpart=desired_username,
password=new_password, password=new_password,
guest_access_token=guest_access_token, guest_access_token=guest_access_token,
generate_token=False,
threepid=threepid, threepid=threepid,
address=client_addr, address=client_addr,
) )
@ -542,8 +541,8 @@ class RegisterRestServlet(RestServlet):
if not compare_digest(want_mac, got_mac): if not compare_digest(want_mac, got_mac):
raise SynapseError(403, "HMAC incorrect") raise SynapseError(403, "HMAC incorrect")
(user_id, _) = yield self.registration_handler.register( user_id = yield self.registration_handler.register_user(
localpart=username, password=password, generate_token=False localpart=username, password=password
) )
result = yield self._create_registration_details(user_id, body) result = yield self._create_registration_details(user_id, body)
@ -577,8 +576,8 @@ class RegisterRestServlet(RestServlet):
def _do_guest_registration(self, params, address=None): def _do_guest_registration(self, params, address=None):
if not self.hs.config.allow_guest_access: if not self.hs.config.allow_guest_access:
raise SynapseError(403, "Guest access is disabled") raise SynapseError(403, "Guest access is disabled")
user_id, _ = yield self.registration_handler.register( user_id = yield self.registration_handler.register_user(
generate_token=False, make_guest=True, address=address make_guest=True, address=address
) )
# we don't allow guests to specify their own device_id, because # we don't allow guests to specify their own device_id, because

View File

@ -129,21 +129,21 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
return_value=defer.succeed(self.lots_of_users) return_value=defer.succeed(self.lots_of_users)
) )
self.get_failure( self.get_failure(
self.handler.register(localpart="local_part"), ResourceLimitError self.handler.register_user(localpart="local_part"), ResourceLimitError
) )
self.store.get_monthly_active_count = Mock( self.store.get_monthly_active_count = Mock(
return_value=defer.succeed(self.hs.config.max_mau_value) return_value=defer.succeed(self.hs.config.max_mau_value)
) )
self.get_failure( self.get_failure(
self.handler.register(localpart="local_part"), ResourceLimitError self.handler.register_user(localpart="local_part"), ResourceLimitError
) )
def test_auto_create_auto_join_rooms(self): def test_auto_create_auto_join_rooms(self):
room_alias_str = "#room:test" room_alias_str = "#room:test"
self.hs.config.auto_join_rooms = [room_alias_str] self.hs.config.auto_join_rooms = [room_alias_str]
res = self.get_success(self.handler.register(localpart="jeff")) user_id = self.get_success(self.handler.register_user(localpart="jeff"))
rooms = self.get_success(self.store.get_rooms_for_user(res[0])) rooms = self.get_success(self.store.get_rooms_for_user(user_id))
directory_handler = self.hs.get_handlers().directory_handler directory_handler = self.hs.get_handlers().directory_handler
room_alias = RoomAlias.from_string(room_alias_str) room_alias = RoomAlias.from_string(room_alias_str)
room_id = self.get_success(directory_handler.get_association(room_alias)) room_id = self.get_success(directory_handler.get_association(room_alias))
@ -154,25 +154,25 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
def test_auto_create_auto_join_rooms_with_no_rooms(self): def test_auto_create_auto_join_rooms_with_no_rooms(self):
self.hs.config.auto_join_rooms = [] self.hs.config.auto_join_rooms = []
frank = UserID.from_string("@frank:test") frank = UserID.from_string("@frank:test")
res = self.get_success(self.handler.register(frank.localpart)) user_id = self.get_success(self.handler.register_user(frank.localpart))
self.assertEqual(res[0], frank.to_string()) self.assertEqual(user_id, frank.to_string())
rooms = self.get_success(self.store.get_rooms_for_user(res[0])) rooms = self.get_success(self.store.get_rooms_for_user(user_id))
self.assertEqual(len(rooms), 0) self.assertEqual(len(rooms), 0)
def test_auto_create_auto_join_where_room_is_another_domain(self): def test_auto_create_auto_join_where_room_is_another_domain(self):
self.hs.config.auto_join_rooms = ["#room:another"] self.hs.config.auto_join_rooms = ["#room:another"]
frank = UserID.from_string("@frank:test") frank = UserID.from_string("@frank:test")
res = self.get_success(self.handler.register(frank.localpart)) user_id = self.get_success(self.handler.register_user(frank.localpart))
self.assertEqual(res[0], frank.to_string()) self.assertEqual(user_id, frank.to_string())
rooms = self.get_success(self.store.get_rooms_for_user(res[0])) rooms = self.get_success(self.store.get_rooms_for_user(user_id))
self.assertEqual(len(rooms), 0) self.assertEqual(len(rooms), 0)
def test_auto_create_auto_join_where_auto_create_is_false(self): def test_auto_create_auto_join_where_auto_create_is_false(self):
self.hs.config.autocreate_auto_join_rooms = False self.hs.config.autocreate_auto_join_rooms = False
room_alias_str = "#room:test" room_alias_str = "#room:test"
self.hs.config.auto_join_rooms = [room_alias_str] self.hs.config.auto_join_rooms = [room_alias_str]
res = self.get_success(self.handler.register(localpart="jeff")) user_id = self.get_success(self.handler.register_user(localpart="jeff"))
rooms = self.get_success(self.store.get_rooms_for_user(res[0])) rooms = self.get_success(self.store.get_rooms_for_user(user_id))
self.assertEqual(len(rooms), 0) self.assertEqual(len(rooms), 0)
def test_auto_create_auto_join_rooms_when_support_user_exists(self): def test_auto_create_auto_join_rooms_when_support_user_exists(self):
@ -180,8 +180,8 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
self.hs.config.auto_join_rooms = [room_alias_str] self.hs.config.auto_join_rooms = [room_alias_str]
self.store.is_support_user = Mock(return_value=True) self.store.is_support_user = Mock(return_value=True)
res = self.get_success(self.handler.register(localpart="support")) user_id = self.get_success(self.handler.register_user(localpart="support"))
rooms = self.get_success(self.store.get_rooms_for_user(res[0])) rooms = self.get_success(self.store.get_rooms_for_user(user_id))
self.assertEqual(len(rooms), 0) self.assertEqual(len(rooms), 0)
directory_handler = self.hs.get_handlers().directory_handler directory_handler = self.hs.get_handlers().directory_handler
room_alias = RoomAlias.from_string(room_alias_str) room_alias = RoomAlias.from_string(room_alias_str)
@ -209,27 +209,31 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
# When:- # When:-
# * the user is registered and post consent actions are called # * the user is registered and post consent actions are called
res = self.get_success(self.handler.register(localpart="jeff")) user_id = self.get_success(self.handler.register_user(localpart="jeff"))
self.get_success(self.handler.post_consent_actions(res[0])) self.get_success(self.handler.post_consent_actions(user_id))
# Then:- # Then:-
# * Ensure that they have not been joined to the room # * Ensure that they have not been joined to the room
rooms = self.get_success(self.store.get_rooms_for_user(res[0])) rooms = self.get_success(self.store.get_rooms_for_user(user_id))
self.assertEqual(len(rooms), 0) self.assertEqual(len(rooms), 0)
def test_register_support_user(self): def test_register_support_user(self):
res = self.get_success( user_id = self.get_success(
self.handler.register(localpart="user", user_type=UserTypes.SUPPORT) self.handler.register_user(localpart="user", user_type=UserTypes.SUPPORT)
) )
self.assertTrue(self.store.is_support_user(res[0])) d = self.store.is_support_user(user_id)
self.assertTrue(self.get_success(d))
def test_register_not_support_user(self): def test_register_not_support_user(self):
res = self.get_success(self.handler.register(localpart="user")) user_id = self.get_success(self.handler.register_user(localpart="user"))
self.assertFalse(self.store.is_support_user(res[0])) d = self.store.is_support_user(user_id)
self.assertFalse(self.get_success(d))
def test_invalid_user_id_length(self): def test_invalid_user_id_length(self):
invalid_user_id = "x" * 256 invalid_user_id = "x" * 256
self.get_failure(self.handler.register(localpart=invalid_user_id), SynapseError) self.get_failure(
self.handler.register_user(localpart=invalid_user_id), SynapseError
)
@defer.inlineCallbacks @defer.inlineCallbacks
def get_or_create_user(self, requester, localpart, displayname, password_hash=None): def get_or_create_user(self, requester, localpart, displayname, password_hash=None):
@ -267,13 +271,12 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
if need_register: if need_register:
yield self.handler.register_with_store( yield self.handler.register_with_store(
user_id=user_id, user_id=user_id,
token=token,
password_hash=password_hash, password_hash=password_hash,
create_profile_with_displayname=user.localpart, create_profile_with_displayname=user.localpart,
) )
else: else:
yield self.hs.get_auth_handler().delete_access_tokens_for_user(user_id) yield self.hs.get_auth_handler().delete_access_tokens_for_user(user_id)
yield self.store.add_access_token_to_user(user_id=user_id, token=token) yield self.store.add_access_token_to_user(user_id=user_id, token=token)
if displayname is not None: if displayname is not None:
# logger.info("setting user display name: %s -> %s", user_id, displayname) # logger.info("setting user display name: %s -> %s", user_id, displayname)