# HG changeset patch # User sylvain.thenault@logilab.fr # Date 1240921456 -7200 # Node ID 099e479e34bfa652aaa3d57d100ecdeba98d099f # Parent fd8751c3f3ee0ea17545eaf34a5b13b0cff9633a# Parent 6b024694d493d4314ed863b99e343edf78bcfcd1 merge fcayre's changes diff -r fd8751c3f3ee -r 099e479e34bf web/test/unittest_application.py --- a/web/test/unittest_application.py Tue Apr 28 11:22:43 2009 +0200 +++ b/web/test/unittest_application.py Tue Apr 28 14:24:16 2009 +0200 @@ -333,6 +333,26 @@ self.assertRaises(AuthenticationError, self.publish, req, 'logout') self.assertEquals(len(self.open_sessions), 0) + def test_login_by_email(self): + login = self.request().user.login + address = login + u'@localhost' + self.execute('INSERT EmailAddress X: X address %(address)s, U primary_email X ' + 'WHERE U login %(login)s', {'address': address, 'login': login}) + self.commit() + # option allow-email-login not set + req, origcnx = self._init_auth('cookie') + req.form['__login'] = address + req.form['__password'] = origcnx.password + self._test_auth_fail(req) + # option allow-email-login set + self.set_option('allow-email-login', True) + req, origcnx = self._init_auth('cookie') + req.form['__login'] = address + req.form['__password'] = origcnx.password + self._test_auth_succeed(req, origcnx) + self.assertRaises(AuthenticationError, self.publish, req, 'logout') + self.assertEquals(len(self.open_sessions), 0) + def _test_auth_anon(self, req): self.app.connect(req) acnx = req.cnx @@ -384,8 +404,6 @@ self.assertRaises(AuthenticationError, self.publish, req, 'logout') self.assertEquals(len(self.open_sessions), 0) - - if __name__ == '__main__': unittest_main() diff -r fd8751c3f3ee -r 099e479e34bf web/views/authentication.py --- a/web/views/authentication.py Tue Apr 28 11:22:43 2009 +0200 +++ b/web/views/authentication.py Tue Apr 28 14:24:16 2009 +0200 @@ -51,10 +51,18 @@ # associate the connection to the current request req.set_connection(cnx, user) return cnx - + + def login_from_email(self, login): + session = self.repo.internal_session() + rset = session.execute('Any L WHERE U login L, U primary_email M, ' + 'M address %(login)s', {'login': login}) + if rset.rowcount == 1: + login = rset[0][0] + return login + def authenticate(self, req, _login=None, _password=None): """authenticate user and return corresponding user object - + :raise ExplicitLogin: if authentication is required (no authentication info found or wrong user/password) @@ -66,6 +74,8 @@ login, password = _login, _password else: login, password = req.get_authorization() + if self.vreg.config['allow-email-login'] and '@' in (login or u''): + login = self.login_from_email(login) if not login: # No session and no login -> try anonymous login, password = self.vreg.config.anonymous_user() diff -r fd8751c3f3ee -r 099e479e34bf web/webconfig.py --- a/web/webconfig.py Tue Apr 28 11:22:43 2009 +0200 +++ b/web/webconfig.py Tue Apr 28 14:24:16 2009 +0200 @@ -79,6 +79,12 @@ 'if anonymous-user is set', 'group': 'main', 'inputlevel': 1, }), + ('allow-email-login', + {'type' : 'yn', + 'default': False, + 'help': 'allow users to login with their primary email if set', + 'group': 'main', 'inputlevel': 2, + }), ('query-log-file', {'type' : 'string', 'default': None,