in Allura/allura/lib/plugin.py [0:0]
def login(self, user: M.User = None, multifactor_success: bool = False) -> M.User | None:
from allura import model as M
if user is None:
try:
user = self._login() # raises exception if auth fails
except exc.HTTPUnauthorized:
h.auditlog_user('Failed login', user=M.User.by_username(self.request.params['username']))
raise
if user.get_pref('multifactor') and not multifactor_success:
self.session['multifactor-username'] = user.username
h.auditlog_user('Multifactor login - password ok, code not entered yet', user=user)
self.session.save()
return None
else:
self.session.pop('multifactor-username', None)
login_details = self.get_login_detail(self.request, user)
# check if the user doesn't have mfa enabled but is logging in from an unknown location
# they'll get an authentication code via email
skip_after_login = False
if asbool(config.get('auth.email_auth_code.enabled', False)) and not user.get_pref('multifactor') and not self.trusted_login_source(user, login_details) and not multifactor_success:
h.auditlog_user('User without MFA attempted to login from untrusted location', user=user)
self.session['multifactor-username'] = user.username
self.session['mode'] = 'email_code'
self.session.save()
user.send_email_auth_code()
return None
else:
# Validate if we used an auth code to skip the `after_login` which sends a foreign login email
skip_after_login = self.session.get('mode') == 'email_code'
self.session.pop('multifactor-username', None)
self.session.pop('mode', None)
expire_reason = None
if self.is_password_expired(user):
h.auditlog_user('Successful login; Password expired', user=user)
expire_reason = 'via expiration process'
if not expire_reason:
expire_reason = self.login_check_password_change_needed(user, self.request.params.get('password'),
login_details)
if expire_reason:
self.session['pwd-expired'] = True
self.session['expired-username'] = user.username
self.session['expired-reason'] = expire_reason
else:
self.session['username'] = user.username
h.auditlog_user('Successful login', user=user)
if not skip_after_login:
self.after_login(user, self.request)
if 'rememberme' in self.request.params:
remember_for = int(config.get('auth.remember_for', 365))
self.session['login_expires'] = datetime.utcnow() + timedelta(remember_for)
else:
self.session['login_expires'] = True
self.session.save()
g.statsUpdater.addUserLogin(user)
user.add_login_detail(login_details)
user.track_login(self.request)
user.track_session(self.session.id)
return user