Fix for bug #184 and related user login issues.
author"Miks Kalnins <MiksKalnins@MaikuMori.com>"
Fri, 13 Jul 2012 19:43:23 +0300
changeset 1419690fdcf93ac9
parent 1418 25f390d1c829
child 1422 7acb182186e2
Fix for bug #184 and related user login issues.
MoinMoin/apps/frontend/views.py
MoinMoin/auth/__init__.py
MoinMoin/user.py
MoinMoin/util/crypto.py
     1.1 --- a/MoinMoin/apps/frontend/views.py	Wed Jul 11 11:35:45 2012 +0300
     1.2 +++ b/MoinMoin/apps/frontend/views.py	Fri Jul 13 19:43:23 2012 +0300
     1.3 @@ -1296,16 +1296,10 @@
     1.4                            )
     1.5  
     1.6  
     1.7 -def _logout():
     1.8 -    for key in ['user.itemid', 'user.trusted', 'user.auth_method', 'user.auth_attribs', ]:
     1.9 -        if key in session:
    1.10 -            del session[key]
    1.11 -
    1.12 -
    1.13  @frontend.route('/+logout')
    1.14  def logout():
    1.15      flash(_("You are now logged out."), "info")
    1.16 -    _logout()
    1.17 +    flaskg.user.logout_session()
    1.18      return redirect(url_for('.show_root'))
    1.19  
    1.20  
    1.21 @@ -1470,8 +1464,7 @@
    1.22                              # send verification mail
    1.23                              is_ok, msg = flaskg.user.mail_email_verification()
    1.24                              if is_ok:
    1.25 -                                _logout()
    1.26 -                                flaskg.user.save()
    1.27 +                                flaskg.user.logout_session()
    1.28                                  response['flash'].append((_('Your account has been disabled because you changed your email address. Please see the email we sent to your address to reactivate it.'), "info"))
    1.29                                  response['redirect'] = url_for('.show_root')
    1.30                              else:
     2.1 --- a/MoinMoin/auth/__init__.py	Wed Jul 11 11:35:45 2012 +0300
     2.2 +++ b/MoinMoin/auth/__init__.py	Fri Jul 13 19:43:23 2012 +0300
     2.3 @@ -444,6 +444,9 @@
     2.4                                  trusted=trusted)
     2.5              if userobj.valid and not userobj.validate_session(session_token):
     2.6                  logging.debug("session token doesn't validate")
     2.7 +                # Destroy current session since it's no longer valid.
     2.8 +                userobj.logout_session(False)
     2.9 +                # We didn't find user in session data.
    2.10                  userobj = None
    2.11      logging.debug("session started for user {0!r}".format(userobj))
    2.12      return userobj
     3.1 --- a/MoinMoin/user.py	Wed Jul 11 11:35:45 2012 +0300
     3.2 +++ b/MoinMoin/user.py	Fri Jul 13 19:43:23 2012 +0300
     3.3 @@ -662,6 +662,15 @@
     3.4  
     3.5      # Sessions ---------------------------------------------------
     3.6  
     3.7 +    def logout_session(self, all_browsers=True):
     3.8 +        """ Terminate session in all browsers unless all_browsers is set to False """
     3.9 +        if all_browsers:
    3.10 +            self.generate_session_token(False)
    3.11 +
    3.12 +        for key in ['user.itemid', 'user.trusted', 'user.auth_method', 'user.auth_attribs', 'user.session_token', ]:
    3.13 +            if key in session:
    3.14 +                del session[key]
    3.15 +
    3.16      def generate_session_token(self, save=True):
    3.17          """ Generate new session token and key pair. Used to validate sessions. """
    3.18          key, token = generate_token()
    3.19 @@ -681,7 +690,8 @@
    3.20  
    3.21      def validate_session(self, token):
    3.22          """ Check if the session token is valid. """
    3.23 -        return valid_token(self.profile[SESSION_KEY], token)
    3.24 +        # Ignore timeout, it's already handled by session cookie and session key should never timeout.
    3.25 +        return valid_token(self.profile[SESSION_KEY], token, None)
    3.26  
    3.27      # Account verification / Password recovery -------------------------------
    3.28  
     4.1 --- a/MoinMoin/util/crypto.py	Wed Jul 11 11:35:45 2012 +0300
     4.2 +++ b/MoinMoin/util/crypto.py	Fri Jul 13 19:43:23 2012 +0300
     4.3 @@ -194,6 +194,7 @@
     4.4  
     4.5      :param key: give the secret key to verify the token
     4.6      :param token: the token to verify
     4.7 +    :param timeout: timeout seconds, set to None to ignore timeout
     4.8      :rtype: bool
     4.9      :returns: token is valid and not timed out
    4.10      """
    4.11 @@ -204,7 +205,7 @@
    4.12          stamp = int(parts[0])
    4.13      except ValueError:
    4.14          return False
    4.15 -    if stamp + timeout < time.time():
    4.16 +    if timeout and stamp + timeout < time.time():
    4.17          return False
    4.18      expected_token = generate_token(key, stamp)[1]
    4.19      return token == expected_token