Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 3817

Show
Ignore:
Timestamp:
03/08/06 16:53:34 (3 years ago)
Author:
minam
Message:

Fix problem with unloaded ARStore sessions being loaded when they are garbage collected, causing problems if there were AR objects in the session.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/lib/action_controller/session/active_record_store.rb

    r3563 r3817  
    6060        self.data_column_name = 'data' 
    6161 
    62         # Don't try to save if we haven't loaded the session. 
    63         before_update :loaded? 
    64         before_save   :marshal_data! 
    65         before_save   :raise_on_session_data_overflow! 
     62        before_save :marshal_data! 
     63        before_save :raise_on_session_data_overflow! 
    6664 
    6765        class << self 
     
    123121        end 
    124122 
     123        # Has the session been loaded yet? 
     124        def loaded? 
     125          !! @data 
     126        end 
     127 
    125128        private 
    126129          attr_writer :data 
    127130 
    128131          def marshal_data! 
     132            return false if !loaded? 
    129133            write_attribute(@@data_column_name, self.class.marshal(self.data)) 
    130           end 
    131  
    132           # Has the session been loaded yet? 
    133           def loaded? 
    134             !! @data 
    135134          end 
    136135 
     
    139138          # ActionController::SessionOverflowError. 
    140139          def raise_on_session_data_overflow! 
     140            return false if !loaded? 
    141141            limit = self.class.data_column_size_limit 
    142142            if loaded? and limit and read_attribute(@@data_column_name).size > limit 
     
    233233        end 
    234234 
     235        def loaded? 
     236          !! @data 
     237        end 
     238 
    235239        def save 
     240          return false if !loaded? 
    236241          marshaled_data = self.class.marshal(data) 
    237242 
  • trunk/actionpack/test/activerecord/active_record_store_test.rb

    r3563 r3817  
    6363  end 
    6464 
     65  def session_id_column 
     66    "session_id" 
     67  end 
     68 
    6569  def setup 
    6670    session_class.create_table! 
     
    8387    assert_kind_of CGI::Session::ActiveRecordStore::Session, @new_session.model 
    8488    assert_equal({ 'foo' => 'bar' }, @new_session.model.data) 
     89  end 
     90 
     91  def test_save_unloaded_session 
     92    c = session_class.connection 
     93    bogus_class = c.quote(Base64.encode64("\004\010o:\vBlammo\000")) 
     94    c.insert("INSERT INTO #{session_class.table_name} ('#{session_id_column}', 'data') VALUES ('abcdefghijklmnop', #{bogus_class})") 
     95 
     96    sess = session_class.find_by_session_id('abcdefghijklmnop') 
     97    assert_not_nil sess 
     98    assert !sess.loaded? 
     99 
     100    # because the session is not loaded, the save should be a no-op. If it 
     101    # isn't, this'll try and unmarshall the bogus class, and should get an error. 
     102    assert_nothing_raised { sess.save } 
    85103  end 
    86104 
     
    111129 
    112130class DeprecatedActiveRecordStoreTest < ActiveRecordStoreTest 
     131  def session_id_column 
     132    "sessid" 
     133  end 
     134 
    113135  def setup 
    114136    session_class.connection.execute 'create table old_sessions (id integer primary key, sessid text unique, data text)'