forked from MirrorHub/synapse
fix bug where preserved threepid user comes to sign up and server is mau blocked
This commit is contained in:
parent
14e4d4f4bf
commit
ea068d6f3c
5 changed files with 38 additions and 3 deletions
|
@ -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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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]:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue