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

Changeset 6294

Show
Ignore:
Timestamp:
03/03/07 08:18:30 (2 years ago)
Author:
bitsweat
Message:

Cookie store: test that >4K raises CookieOverflow and that unverifiable cookies are automatically deleted.

Files:

Legend:

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

    r6226 r6294  
    9090      if cookie 
    9191        data, digest = CGI.unescape(cookie).split('--') 
    92         raise TamperedWithCookie unless digest == generate_digest(data) 
     92        unless digest == generate_digest(data) 
     93          delete 
     94          raise TamperedWithCookie 
     95        end 
    9396        Marshal.load(Base64.decode64(data)) 
    9497      end 
  • trunk/actionpack/test/controller/session/cookie_store_test.rb

    r6226 r6294  
    6969  end 
    7070 
     71  def test_restore_deletes_tampered_cookies 
     72    set_cookie! 'a--b' 
     73    new_session do |session| 
     74      assert_raise(CGI::Session::CookieStore::TamperedWithCookie) { session['fail'] } 
     75      assert_cookie_deleted session 
     76    end 
     77  end 
     78 
    7179  def test_close_doesnt_write_cookie_if_data_is_blank 
    7280    new_session do |session| 
    73       assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     81      assert_no_cookies session 
    7482      session.close 
    75       assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     83      assert_no_cookies session 
    7684    end 
    7785  end 
     
    8088    set_cookie! Cookies::TYPICAL.first 
    8189    new_session do |session| 
    82       assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     90      assert_no_cookies session 
    8391      session['user_id'] = session['user_id'] 
    8492      session.close 
    85       assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     93      assert_no_cookies session 
     94    end 
     95  end 
     96 
     97  def test_close_raises_when_data_overflows 
     98    set_cookie! Cookies::EMPTY.first 
     99    new_session do |session| 
     100      session['overflow'] = 'bye!' * 1024 
     101      assert_raise(CGI::Session::CookieStore::CookieOverflow) { session.close } 
     102      assert_no_cookies session 
    86103    end 
    87104  end 
     
    90107    set_cookie! Cookies::TYPICAL.first 
    91108    new_session do |session| 
    92       assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     109      assert_no_cookies session 
    93110      session['flash'] = {} 
    94       assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     111      assert_no_cookies session 
    95112      session.close 
    96113      assert_equal 1, session.cgi.output_cookies.size 
     
    98115      assert_equal ['_myapp_session', [Cookies::FLASHED.first]], 
    99116                   [cookie.name, cookie.value] 
     117      assert_cookie cookie, Cookies::FLASHED.first 
    100118    end 
    101119  end 
     
    104122    set_cookie! Cookies::TYPICAL.first 
    105123    new_session do |session| 
    106       assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     124      assert_no_cookies session 
    107125      session.delete 
    108       assert_equal 1, session.cgi.output_cookies.size 
    109       cookie = session.cgi.output_cookies.first 
    110       assert_equal ['_myapp_session', [], 1.year.ago.to_date], 
    111                    [cookie.name, cookie.value, cookie.expires.to_date] 
     126      assert_cookie_deleted session 
    112127 
    113128      # @data is set to nil so #close doesn't send another cookie. 
    114129      session.close 
    115       assert_equal ['_myapp_session', [], 1.year.ago.to_date], 
    116                    [cookie.name, cookie.value, cookie.expires.to_date] 
     130      assert_cookie_deleted session 
    117131    end 
    118132  end 
    119133 
    120134  private 
     135    def assert_no_cookies(session) 
     136      assert_nil session.cgi.output_cookies, session.cgi.output_cookies.inspect 
     137    end 
     138 
     139    def assert_cookie_deleted(session, message = 'Expected session deletion cookie to be set') 
     140      assert_equal 1, session.cgi.output_cookies.size 
     141      cookie = session.cgi.output_cookies.first 
     142      assert_cookie cookie, nil, 1.year.ago.to_date, message 
     143    end 
     144 
     145    def assert_cookie(cookie, value = nil, expires = nil, message = nil) 
     146      assert_equal '_myapp_session', cookie.name, message 
     147      assert_equal [value].compact, cookie.value, message 
     148      assert_equal expires, cookie.expires ? cookie.expires.to_date : cookie.expires, message 
     149    end 
     150 
    121151    def set_cookie!(value) 
    122152      ENV['HTTP_COOKIE'] = "_myapp_session=#{value}"