Django

Code

Changeset 7001

Show
Ignore:
Timestamp:
01/06/08 06:53:09 (8 months ago)
Author:
mtredinnick
Message:

Fixed a subtle corner case whereby sending a bad session ID generates new (unused) session entries in the database table.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/contrib/sessions/backends/db.py

    r6333 r7001  
    1111    def __init__(self, session_key=None): 
    1212        super(SessionStore, self).__init__(session_key) 
    13      
     13 
    1414    def load(self): 
    1515        try: 
    1616            s = Session.objects.get( 
    17                 session_key = self.session_key,  
     17                session_key = self.session_key, 
    1818                expire_date__gt=datetime.datetime.now() 
    1919            ) 
    2020            return self.decode(s.session_data) 
    2121        except (Session.DoesNotExist, SuspiciousOperation): 
    22              
     22 
    2323            # Create a new session_key for extra security. 
    2424            self.session_key = self._get_new_session_key() 
     
    2727            # Save immediately to minimize collision 
    2828            self.save() 
     29            # Ensure the user is notified via a new cookie. 
     30            self.modified = True 
    2931            return {} 
    30              
     32 
    3133    def exists(self, session_key): 
    3234        try: 
     
    3537            return False 
    3638        return True 
    37              
     39 
    3840    def save(self): 
    3941        Session.objects.create( 
     
    4244            expire_date = datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE) 
    4345        ) 
    44      
     46 
    4547    def delete(self, session_key): 
    4648        try: 
  • django/trunk/django/contrib/sessions/backends/file.py

    r6889 r7001  
    1111    def __init__(self, session_key=None): 
    1212        self.storage_path = getattr(settings, "SESSION_FILE_PATH", tempfile.gettempdir()) 
    13          
     13 
    1414        # Make sure the storage path is valid. 
    1515        if not os.path.isdir(self.storage_path): 
     
    1818                                       "to an existing directory in which Django "\ 
    1919                                       "can store session data." % self.storage_path) 
    20          
    21         self.file_prefix = settings.SESSION_COOKIE_NAME     
     20 
     21        self.file_prefix = settings.SESSION_COOKIE_NAME 
    2222        super(SessionStore, self).__init__(session_key) 
    23      
     23 
    2424    def _key_to_file(self, session_key=None): 
    2525        """ 
     
    2828        if session_key is None: 
    2929            session_key = self.session_key 
    30          
     30 
    3131        # Make sure we're not vulnerable to directory traversal. Session keys 
    3232        # should always be md5s, so they should never contain directory components. 
    3333        if os.path.sep in session_key: 
    3434            raise SuspiciousOperation("Invalid characters (directory components) in session key") 
    35              
     35 
    3636        return os.path.join(self.storage_path, self.file_prefix + session_key) 
    37              
     37 
    3838    def load(self): 
    3939        session_data = {} 
     
    4747                    self._session_cache = {} 
    4848                    self.save() 
     49                    # Ensure the user is notified via a new cookie. 
     50                    self.modified = True 
    4951            finally: 
    5052                session_file.close() 
     
    6769            return True 
    6870        return False 
    69          
     71 
    7072    def delete(self, session_key): 
    7173        try: 
     
    7375        except OSError: 
    7476            pass 
    75              
     77 
    7678    def clean(self): 
    7779        pass