390 self.info('sql cache usage: %s/%s (%s%%)', hits+ misses, nocache, |
390 self.info('sql cache usage: %s/%s (%s%%)', hits+ misses, nocache, |
391 ((hits + misses) * 100) / (hits + misses + nocache)) |
391 ((hits + misses) * 100) / (hits + misses + nocache)) |
392 except ZeroDivisionError: |
392 except ZeroDivisionError: |
393 pass |
393 pass |
394 |
394 |
|
395 def _login_from_email(self, login): |
|
396 session = self.internal_session() |
|
397 try: |
|
398 rset = session.execute('Any L WHERE U login L, U primary_email M, ' |
|
399 'M address %(login)s', {'login': login}) |
|
400 if rset.rowcount == 1: |
|
401 login = rset[0][0] |
|
402 finally: |
|
403 session.close() |
|
404 return login |
|
405 |
395 def authenticate_user(self, session, login, password): |
406 def authenticate_user(self, session, login, password): |
396 """validate login / password, raise AuthenticationError on failure |
407 """validate login / password, raise AuthenticationError on failure |
397 return associated CWUser instance on success |
408 return associated CWUser instance on success |
398 """ |
409 """ |
|
410 if self.vreg.config['allow-email-login'] and '@' in login: |
|
411 login = self._login_from_email(login) |
399 for source in self.sources: |
412 for source in self.sources: |
400 if source.support_entity('CWUser'): |
413 if source.support_entity('CWUser'): |
401 try: |
414 try: |
402 eid = source.authenticate(session, login, password) |
415 eid = source.authenticate(session, login, password) |
403 break |
416 break |