fix bug where preserved threepid user comes to sign up and server is mau blocked

This commit is contained in:
Neil Johnson 2018-08-31 10:49:14 +01:00
parent 14e4d4f4bf
commit ea068d6f3c
5 changed files with 38 additions and 3 deletions

View File

@ -775,7 +775,7 @@ class Auth(object):
) )
@defer.inlineCallbacks @defer.inlineCallbacks
def check_auth_blocking(self, user_id=None): def check_auth_blocking(self, user_id=None, threepid=None):
"""Checks if the user should be rejected for some external reason, """Checks if the user should be rejected for some external reason,
such as monthly active user limiting or global disable flag such as monthly active user limiting or global disable flag
@ -806,6 +806,14 @@ class Auth(object):
is_trial = yield self.store.is_trial_user(user_id) is_trial = yield self.store.is_trial_user(user_id)
if is_trial: if is_trial:
return return
elif threepid:
# If the user does not exist yet, but is signing up with a
# reserved threepid then pass auth check
for tp in self.hs.config.mau_limits_reserved_threepids:
if (threepid['medium'] == tp['medium']
and threepid['address'] == tp['address']):
return
# Else if there is no room in the MAU bucket, bail # Else if there is no room in the MAU bucket, bail
current_mau = yield self.store.get_monthly_active_count() current_mau = yield self.store.get_monthly_active_count()
if current_mau >= self.hs.config.max_mau_value: if current_mau >= self.hs.config.max_mau_value:

View File

@ -125,6 +125,7 @@ class RegistrationHandler(BaseHandler):
guest_access_token=None, guest_access_token=None,
make_guest=False, make_guest=False,
admin=False, admin=False,
threepid=None,
): ):
"""Registers a new client on the server. """Registers a new client on the server.
@ -145,7 +146,7 @@ class RegistrationHandler(BaseHandler):
RegistrationError if there was a problem registering. RegistrationError if there was a problem registering.
""" """
yield self.auth.check_auth_blocking() yield self.auth.check_auth_blocking(threepid=threepid)
password_hash = None password_hash = None
if password: if password:
password_hash = yield self.auth_handler().hash(password) password_hash = yield self.auth_handler().hash(password)

View File

@ -281,11 +281,15 @@ class RegisterRestServlet(ClientV1RestServlet):
register_json["user"].encode("utf-8") register_json["user"].encode("utf-8")
if "user" in register_json else None if "user" in register_json else None
) )
threepid = None
if session[LoginType.EMAIL_IDENTITY]:
threepid = session["threepidCreds"]
handler = self.handlers.registration_handler handler = self.handlers.registration_handler
(user_id, token) = yield handler.register( (user_id, token) = yield handler.register(
localpart=desired_user_id, localpart=desired_user_id,
password=password password=password,
threepid=threepid,
) )
if session[LoginType.EMAIL_IDENTITY]: if session[LoginType.EMAIL_IDENTITY]:

View File

@ -395,11 +395,16 @@ class RegisterRestServlet(RestServlet):
if desired_username is not None: if desired_username is not None:
desired_username = desired_username.lower() desired_username = desired_username.lower()
threepid = None
if auth_result:
threepid = auth_result.get(LoginType.EMAIL_IDENTITY)
(registered_user_id, _) = yield self.registration_handler.register( (registered_user_id, _) = yield self.registration_handler.register(
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, generate_token=False,
threepid=threepid,
) )
# remember that we've now registered that user account, and with # remember that we've now registered that user account, and with

View File

@ -467,6 +467,23 @@ class AuthTestCase(unittest.TestCase):
) )
yield self.auth.check_auth_blocking() yield self.auth.check_auth_blocking()
@defer.inlineCallbacks
def test_reserved_threepid(self):
self.hs.config.limit_usage_by_mau = True
self.hs.config.max_mau_value = 1
threepid = {'medium': 'email', 'address': 'reserved@server.com'}
unknown_threepid = {'medium': 'email', 'address': 'unreserved@server.com'}
self.hs.config.mau_limits_reserved_threepids = [threepid]
yield self.store.register(user_id='user1', token="123", password_hash=None)
with self.assertRaises(ResourceLimitError):
yield self.auth.check_auth_blocking()
with self.assertRaises(ResourceLimitError):
yield self.auth.check_auth_blocking(threepid=unknown_threepid)
yield self.auth.check_auth_blocking(threepid=threepid)
@defer.inlineCallbacks @defer.inlineCallbacks
def test_hs_disabled(self): def test_hs_disabled(self):
self.hs.config.hs_disabled = True self.hs.config.hs_disabled = True