Allow password providers to bind emails (#4947)

This PR allows password provider modules to bind email addresses when a user is registering and is motivated by matrix-org/matrix-synapse-ldap3#58
neilj/remove_logging_password
Andrew Morgan 2019-03-28 15:48:07 +00:00 committed by GitHub
parent 248014379e
commit 7a91b9d81c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 4 deletions

1
changelog.d/4947.feature Normal file
View File

@ -0,0 +1 @@
Add ability for password provider modules to bind email addresses to users upon registration.

View File

@ -153,6 +153,7 @@ class RegistrationHandler(BaseHandler):
user_type=None, user_type=None,
default_display_name=None, default_display_name=None,
address=None, address=None,
bind_emails=[],
): ):
"""Registers a new client on the server. """Registers a new client on the server.
@ -172,6 +173,7 @@ class RegistrationHandler(BaseHandler):
default_display_name (unicode|None): if set, the new user's displayname default_display_name (unicode|None): if set, the new user's displayname
will be set to this. Defaults to 'localpart'. will be set to this. Defaults to 'localpart'.
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.
Returns: Returns:
A tuple of (user_id, access_token). A tuple of (user_id, access_token).
Raises: Raises:
@ -261,6 +263,21 @@ class RegistrationHandler(BaseHandler):
if not self.hs.config.user_consent_at_registration: if not self.hs.config.user_consent_at_registration:
yield self._auto_join_rooms(user_id) yield self._auto_join_rooms(user_id)
# Bind any specified emails to this account
current_time = self.hs.get_clock().time_msec()
for email in bind_emails:
# generate threepid dict
threepid_dict = {
"medium": "email",
"address": email,
"validated_at": current_time,
}
# Bind email to new account
yield self._register_email_threepid(
user_id, threepid_dict, None, False,
)
defer.returnValue((user_id, token)) defer.returnValue((user_id, token))
@defer.inlineCallbacks @defer.inlineCallbacks

View File

@ -74,14 +74,14 @@ class ModuleApi(object):
return self._auth_handler.check_user_exists(user_id) return self._auth_handler.check_user_exists(user_id)
@defer.inlineCallbacks @defer.inlineCallbacks
def register(self, localpart, displayname=None): def register(self, localpart, displayname=None, emails=[]):
"""Registers a new user with given localpart and optional """Registers a new user with given localpart and optional
displayname. displayname, emails.
Args: Args:
localpart (str): The localpart of the new user. localpart (str): The localpart of the new user.
displayname (str|None): The displayname of the new user. If None, displayname (str|None): The displayname of the new user.
the user's displayname will default to `localpart`. emails (List[str]): Emails to bind to the new user.
Returns: Returns:
Deferred: a 2-tuple of (user_id, access_token) Deferred: a 2-tuple of (user_id, access_token)
@ -90,6 +90,7 @@ class ModuleApi(object):
reg = self.hs.get_registration_handler() reg = self.hs.get_registration_handler()
user_id, access_token = yield reg.register( user_id, access_token = yield reg.register(
localpart=localpart, default_display_name=displayname, localpart=localpart, default_display_name=displayname,
bind_emails=emails,
) )
defer.returnValue((user_id, access_token)) defer.returnValue((user_id, access_token))