# HG changeset patch # User Andrew Shadura # Date 2015-05-16 17:03:51 # Node ID b75f1d0753d60db4924191e63811840f368e5ecd # Parent de9a3152c2064c08e6c7bc2f0066b2c5b064ad60 privacy: don't tell users what is the reason for a failed login Makes it harder for strangers to probe the instance for presence of certain users. This can make it harder to break in, as it is now harder to tell is a username or a password are wrong, so bruteforcing should probably take a bit longer if you don't know what exactly are you doing. diff --git a/kallithea/model/validators.py b/kallithea/model/validators.py --- a/kallithea/model/validators.py +++ b/kallithea/model/validators.py @@ -298,9 +298,7 @@ def ValidPasswordsMatch(password_field, def ValidAuth(): class _validator(formencode.validators.FancyValidator): messages = { - 'invalid_password': _('Invalid password'), - 'invalid_username': _('Invalid username'), - 'disabled_account': _('Account has been disabled') + 'invalid_auth': _(u'Invalid username or password'), } def validate_python(self, value, state): @@ -315,16 +313,15 @@ def ValidAuth(): user = User.get_by_username(username) if user and not user.active: log.warning('user %s is disabled' % username) - msg = M(self, 'disabled_account', state) + msg = M(self, 'invalid_auth', state) raise formencode.Invalid(msg, value, state, - error_dict=dict(username=msg) + error_dict=dict(username=' ', password=msg) ) else: log.warning('user %s failed to authenticate' % username) - msg = M(self, 'invalid_username', state) - msg2 = M(self, 'invalid_password', state) + msg = M(self, 'invalid_auth', state) raise formencode.Invalid(msg, value, state, - error_dict=dict(username=msg, password=msg2) + error_dict=dict(username=' ', password=msg) ) return _validator diff --git a/kallithea/tests/__init__.py b/kallithea/tests/__init__.py --- a/kallithea/tests/__init__.py +++ b/kallithea/tests/__init__.py @@ -215,7 +215,7 @@ class TestController(BaseTestCase): {'username': username, 'password': password}) - if 'invalid user name' in response.body: + if 'Invalid username or password' in response.body: self.fail('could not login using %s %s' % (username, password)) self.assertEqual(response.status, '302 Found') diff --git a/kallithea/tests/functional/test_login.py b/kallithea/tests/functional/test_login.py --- a/kallithea/tests/functional/test_login.py +++ b/kallithea/tests/functional/test_login.py @@ -129,8 +129,7 @@ class TestLoginController(TestController {'username': 'error', 'password': 'test12'}) - response.mustcontain('Invalid username') - response.mustcontain('Invalid password') + response.mustcontain('Invalid username or password') # verify that get arguments are correctly passed along login redirection @@ -187,8 +186,7 @@ class TestLoginController(TestController {'username': 'error', 'password': 'test12'}) - response.mustcontain('Invalid username') - response.mustcontain('Invalid password') + response.mustcontain('Invalid username or password') for encoded in args_encoded: self.assertIn(encoded, response.form.action)