cookies_test.rb 42.5 KB
Newer Older
1 2 3 4
require "abstract_unit"
require "openssl"
require "active_support/key_generator"
require "active_support/message_verifier"
D
Initial  
David Heinemeier Hansson 已提交
5

6 7 8 9
class CookieJarTest < ActiveSupport::TestCase
  attr_reader :request

  def setup
E
eileencodes 已提交
10
    @request = ActionDispatch::Request.empty
11 12 13 14
  end

  def test_fetch
    x = Object.new
15 16 17
    assert_not request.cookie_jar.key?("zzzzzz")
    assert_equal x, request.cookie_jar.fetch("zzzzzz", x)
    assert_not request.cookie_jar.key?("zzzzzz")
18 19 20 21
  end

  def test_fetch_exists
    x = Object.new
22 23
    request.cookie_jar["foo"] = "bar"
    assert_equal "bar", request.cookie_jar.fetch("foo", x)
24 25 26 27
  end

  def test_fetch_block
    x = Object.new
28 29
    assert_not request.cookie_jar.key?("zzzzzz")
    assert_equal x, request.cookie_jar.fetch("zzzzzz") { x }
30 31 32
  end

  def test_key_is_to_s
33 34
    request.cookie_jar["foo"] = "bar"
    assert_equal "bar", request.cookie_jar.fetch(:foo)
35 36 37 38 39 40 41 42 43
  end

  def test_fetch_type_error
    assert_raises(KeyError) do
      request.cookie_jar.fetch(:omglolwut)
    end
  end

  def test_each
44
    request.cookie_jar["foo"] = :bar
45 46 47 48 49
    list = []
    request.cookie_jar.each do |k,v|
      list << [k, v]
    end

50
    assert_equal [["foo", :bar]], list
51 52 53
  end

  def test_enumerable
54
    request.cookie_jar["foo"] = :bar
55
    actual = request.cookie_jar.map { |k,v| [k.to_s, v.to_s] }
56
    assert_equal [["foo", "bar"]], actual
57 58 59 60 61 62 63 64 65 66 67 68 69 70
  end

  def test_key_methods
    assert !request.cookie_jar.key?(:foo)
    assert !request.cookie_jar.has_key?("foo")

    request.cookie_jar[:foo] = :bar
    assert request.cookie_jar.key?(:foo)
    assert request.cookie_jar.has_key?("foo")
  end

  def test_write_doesnt_set_a_nil_header
    headers = {}
    request.cookie_jar.write(headers)
71
    assert !headers.include?("Set-Cookie")
72 73 74
  end
end

75
class CookiesTest < ActionController::TestCase
76 77 78 79 80 81 82 83 84 85
  class CustomSerializer
    def self.load(value)
      value.to_s + " and loaded"
    end

    def self.dump(value)
      value.to_s + " was dumped"
    end
  end

D
Initial  
David Heinemeier Hansson 已提交
86
  class TestController < ActionController::Base
87 88
    def authenticate
      cookies["user_name"] = "david"
J
Jeremy Kemper 已提交
89
      head :ok
90 91
    end

92 93
    def set_with_with_escapable_characters
      cookies["that & guy"] = "foo & bar => baz"
J
Jeremy Kemper 已提交
94
      head :ok
95 96
    end

97
    def authenticate_for_fourteen_days
F
Frederick Cheung 已提交
98
      cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
J
Jeremy Kemper 已提交
99
      head :ok
100 101
    end

102
    def authenticate_for_fourteen_days_with_symbols
103
      cookies[:user_name] = { value: "david", expires: Time.utc(2005, 10, 10,5) }
J
Jeremy Kemper 已提交
104
      head :ok
105 106
    end

107
    def set_multiple_cookies
F
Frederick Cheung 已提交
108
      cookies["user_name"] = { "value" => "david", "expires" => Time.utc(2005, 10, 10,5) }
109
      cookies["login"]     = "XJ-122"
J
Jeremy Kemper 已提交
110
      head :ok
111
    end
J
Joshua Peek 已提交
112

113
    def access_frozen_cookies
J
Jeremy Kemper 已提交
114
      cookies["will"] = "work"
J
Jeremy Kemper 已提交
115
      head :ok
116 117
    end

118 119
    def logout
      cookies.delete("user_name")
J
Jeremy Kemper 已提交
120
      head :ok
121 122
    end

123 124
    alias delete_cookie logout

125
    def delete_cookie_with_path
126
      cookies.delete("user_name", path: "/beaten")
J
Jeremy Kemper 已提交
127
      head :ok
128 129
    end

130
    def authenticate_with_http_only
131
      cookies["user_name"] = { value: "david", httponly: true }
J
Jeremy Kemper 已提交
132
      head :ok
133
    end
134

135
    def authenticate_with_secure
136
      cookies["user_name"] = { value: "david", secure: true }
137 138
      head :ok
    end
139 140 141 142 143

    def set_permanent_cookie
      cookies.permanent[:user_name] = "Jamie"
      head :ok
    end
J
Joshua Peek 已提交
144

145 146 147 148
    def set_signed_cookie
      cookies.signed[:user_id] = 45
      head :ok
    end
J
Joshua Peek 已提交
149

150 151 152 153 154
    def get_signed_cookie
      cookies.signed[:user_id]
      head :ok
    end

155
    def set_encrypted_cookie
156
      cookies.encrypted[:foo] = "bar"
157 158 159
      head :ok
    end

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
    class JSONWrapper
      def initialize(obj)
        @obj = obj
      end

      def as_json(options = nil)
        "wrapped: #{@obj.as_json(options)}"
      end
    end

    def set_wrapped_signed_cookie
      cookies.signed[:user_id] = JSONWrapper.new(45)
      head :ok
    end

175
    def set_wrapped_encrypted_cookie
176
      cookies.encrypted[:foo] = JSONWrapper.new("bar")
177 178 179
      head :ok
    end

180 181 182 183 184
    def get_encrypted_cookie
      cookies.encrypted[:foo]
      head :ok
    end

185
    def set_invalid_encrypted_cookie
186
      cookies[:invalid_cookie] = "invalid--9170e00a57cfc27083363b5c75b835e477bd90cf"
187 188 189
      head :ok
    end

190
    def raise_data_overflow
191
      cookies.signed[:foo] = "bye!" * 1024
192 193 194 195 196 197 198 199 200
      head :ok
    end

    def tampered_cookies
      cookies[:tampered] = "BAh7BjoIZm9vIghiYXI%3D--123456780"
      cookies.signed[:tampered]
      head :ok
    end

201 202 203 204
    def set_permanent_signed_cookie
      cookies.permanent.signed[:remember_me] = 100
      head :ok
    end
205 206 207

    def delete_and_set_cookie
      cookies.delete :user_name
208
      cookies[:user_name] = { value: "david", expires: Time.utc(2005, 10, 10,5) }
209 210
      head :ok
    end
211 212

    def set_cookie_with_domain
213
      cookies[:user_name] = {value: "rizwanreza", domain: :all}
214 215 216
      head :ok
    end

217
    def set_cookie_with_domain_all_as_string
218
      cookies[:user_name] = {value: "rizwanreza", domain: "all"}
219 220 221
      head :ok
    end

222
    def delete_cookie_with_domain
223
      cookies.delete(:user_name, domain: :all)
224 225
      head :ok
    end
226

227
    def delete_cookie_with_domain_all_as_string
228
      cookies.delete(:user_name, domain: "all")
229 230 231
      head :ok
    end

232
    def set_cookie_with_domain_and_tld
233
      cookies[:user_name] = {value: "rizwanreza", domain: :all, tld_length: 2}
234 235 236 237
      head :ok
    end

    def delete_cookie_with_domain_and_tld
238
      cookies.delete(:user_name, domain: :all, tld_length: 2)
239 240 241
      head :ok
    end

242
    def set_cookie_with_domains
243
      cookies[:user_name] = {value: "rizwanreza", domain: %w(example1.com example2.com .example3.com)}
244 245 246 247
      head :ok
    end

    def delete_cookie_with_domains
248
      cookies.delete(:user_name, domain: %w(example1.com example2.com .example3.com))
249 250 251
      head :ok
    end

252 253 254 255 256 257
    def symbol_key
      cookies[:user_name] = "david"
      head :ok
    end

    def string_key
258
      cookies["user_name"] = "dhh"
259 260
      head :ok
    end
261 262 263 264 265 266 267

    def symbol_key_mock
      cookies[:user_name] = "david" if cookies[:user_name] == "andrew"
      head :ok
    end

    def string_key_mock
268
      cookies["user_name"] = "david" if cookies["user_name"] == "andrew"
269 270 271 272 273 274
      head :ok
    end

    def noop
      head :ok
    end
D
Initial  
David Heinemeier Hansson 已提交
275 276
  end

277
  tests TestController
D
Initial  
David Heinemeier Hansson 已提交
278

279
  SALT = "b3c631c314c0bbca50c1b2843150fe33"
280

281
  def setup
282
    super
A
Aaron Patterson 已提交
283

284
    @request.env["action_dispatch.key_generator"] = ActiveSupport::KeyGenerator.new(SALT, iterations: 2)
A
Aaron Patterson 已提交
285

286 287 288
    @request.env["action_dispatch.signed_cookie_salt"] =
      @request.env["action_dispatch.encrypted_cookie_salt"] =
      @request.env["action_dispatch.encrypted_signed_cookie_salt"] = SALT
A
Aaron Patterson 已提交
289

290
    @request.host = "www.nextangle.com"
291 292
  end

D
Initial  
David Heinemeier Hansson 已提交
293
  def test_setting_cookie
294
    get :authenticate
J
Jeremy Kemper 已提交
295
    assert_cookie_header "user_name=david; path=/"
296
    assert_equal({"user_name" => "david"}, @response.cookies)
D
Initial  
David Heinemeier Hansson 已提交
297 298
  end

299
  def test_setting_the_same_value_to_cookie
300
    request.cookies[:user_name] = "david"
301
    get :authenticate
302
    assert_predicate response.cookies, :empty?
303 304 305
  end

  def test_setting_the_same_value_to_permanent_cookie
306
    request.cookies[:user_name] = "Jamie"
307
    get :set_permanent_cookie
308
    assert_equal({"user_name" => "Jamie"}, response.cookies)
309 310
  end

311 312
  def test_setting_with_escapable_characters
    get :set_with_with_escapable_characters
J
Jeremy Kemper 已提交
313
    assert_cookie_header "that+%26+guy=foo+%26+bar+%3D%3E+baz; path=/"
314 315 316
    assert_equal({"that & guy" => "foo & bar => baz"}, @response.cookies)
  end

317
  def test_setting_cookie_for_fourteen_days
318
    get :authenticate_for_fourteen_days
319
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
320
    assert_equal({"user_name" => "david"}, @response.cookies)
321
  end
322

323
  def test_setting_cookie_for_fourteen_days_with_symbols
P
Pratik Naik 已提交
324
    get :authenticate_for_fourteen_days_with_symbols
325
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
326
    assert_equal({"user_name" => "david"}, @response.cookies)
327 328
  end

329 330
  def test_setting_cookie_with_http_only
    get :authenticate_with_http_only
J
Jeremy Kemper 已提交
331
    assert_cookie_header "user_name=david; path=/; HttpOnly"
332
    assert_equal({"user_name" => "david"}, @response.cookies)
333
  end
334

335
  def test_setting_cookie_with_secure
336
    @request.env["HTTPS"] = "on"
337 338 339 340
    get :authenticate_with_secure
    assert_cookie_header "user_name=david; path=/; secure"
    assert_equal({"user_name" => "david"}, @response.cookies)
  end
341

L
lest 已提交
342
  def test_setting_cookie_with_secure_when_always_write_cookie_is_true
343
    old_cookie, @request.cookie_jar.always_write_cookie = @request.cookie_jar.always_write_cookie, true
344 345 346
    get :authenticate_with_secure
    assert_cookie_header "user_name=david; path=/; secure"
    assert_equal({"user_name" => "david"}, @response.cookies)
347 348
  ensure
    @request.cookie_jar.always_write_cookie = old_cookie
349 350 351 352 353 354 355 356
  end

  def test_not_setting_cookie_with_secure
    get :authenticate_with_secure
    assert_not_cookie_header "user_name=david; path=/; secure"
    assert_not_equal({"user_name" => "david"}, @response.cookies)
  end

357
  def test_multiple_cookies
358 359
    get :set_multiple_cookies
    assert_equal 2, @response.cookies.size
360
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000\nlogin=XJ-122; path=/"
361
    assert_equal({"login" => "XJ-122", "user_name" => "david"}, @response.cookies)
362
  end
363

364
  def test_setting_test_cookie
365 366
    assert_nothing_raised { get :access_frozen_cookies }
  end
J
Joshua Peek 已提交
367

368
  def test_expiring_cookie
369
    request.cookies[:user_name] = "Joe"
370
    get :logout
371
    assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
372
    assert_equal({"user_name" => nil}, @response.cookies)
373
  end
J
Joshua Peek 已提交
374

375
  def test_delete_cookie_with_path
376
    request.cookies[:user_name] = "Joe"
377
    get :delete_cookie_with_path
378
    assert_cookie_header "user_name=; path=/beaten; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
379
  end
J
Jeremy Kemper 已提交
380

381 382 383
  def test_delete_unexisting_cookie
    request.cookies.clear
    get :delete_cookie
384
    assert_predicate @response.cookies, :empty?
385 386
  end

387
  def test_deleted_cookie_predicate
388
    cookies[:user_name] = "Joe"
389 390 391 392 393 394
    cookies.delete("user_name")
    assert cookies.deleted?("user_name")
    assert_equal false, cookies.deleted?("another")
  end

  def test_deleted_cookie_predicate_with_mismatching_options
395
    cookies[:user_name] = "Joe"
396 397
    cookies.delete("user_name", path: "/path")
    assert_equal false, cookies.deleted?("user_name", path: "/different")
398 399
  end

400
  def test_cookies_persist_throughout_request
Y
Yehuda Katz 已提交
401
    response = get :authenticate
402
    assert_match(/user_name=david/, response.headers["Set-Cookie"])
403
  end
404

405
  def test_set_permanent_cookie
406
    get :set_permanent_cookie
407 408
    assert_match(/Jamie/, @response.headers["Set-Cookie"])
    assert_match(%r(#{20.years.from_now.utc.year}), @response.headers["Set-Cookie"])
409
  end
J
Joshua Peek 已提交
410

411 412
  def test_read_permanent_cookie
    get :set_permanent_cookie
413
    assert_equal "Jamie", @controller.send(:cookies).permanent[:user_name]
414 415
  end

416 417 418 419 420 421 422 423 424 425
  def test_signed_cookie_using_default_digest
    get :set_signed_cookie
    cookies = @controller.send :cookies
    assert_not_equal 45, cookies[:user_id]
    assert_equal 45, cookies.signed[:user_id]

    key_generator = @request.env["action_dispatch.key_generator"]
    signed_cookie_salt = @request.env["action_dispatch.signed_cookie_salt"]
    secret = key_generator.generate_key(signed_cookie_salt)

426
    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: Marshal, digest: "SHA1")
427 428 429 430
    assert_equal verifier.generate(45), cookies[:user_id]
  end

  def test_signed_cookie_using_custom_digest
431
    @request.env["action_dispatch.cookies_digest"] = "SHA256"
432 433 434 435 436 437 438 439 440
    get :set_signed_cookie
    cookies = @controller.send :cookies
    assert_not_equal 45, cookies[:user_id]
    assert_equal 45, cookies.signed[:user_id]

    key_generator = @request.env["action_dispatch.key_generator"]
    signed_cookie_salt = @request.env["action_dispatch.signed_cookie_salt"]
    secret = key_generator.generate_key(signed_cookie_salt)

441
    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: Marshal, digest: "SHA256")
442 443 444
    assert_equal verifier.generate(45), cookies[:user_id]
  end

445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
  def test_signed_cookie_using_default_serializer
    get :set_signed_cookie
    cookies = @controller.send :cookies
    assert_not_equal 45, cookies[:user_id]
    assert_equal 45, cookies.signed[:user_id]
  end

  def test_signed_cookie_using_marshal_serializer
    @request.env["action_dispatch.cookies_serializer"] = :marshal
    get :set_signed_cookie
    cookies = @controller.send :cookies
    assert_not_equal 45, cookies[:user_id]
    assert_equal 45, cookies.signed[:user_id]
  end

  def test_signed_cookie_using_json_serializer
    @request.env["action_dispatch.cookies_serializer"] = :json
    get :set_signed_cookie
    cookies = @controller.send :cookies
    assert_not_equal 45, cookies[:user_id]
    assert_equal 45, cookies.signed[:user_id]
  end

468 469 470 471
  def test_wrapped_signed_cookie_using_json_serializer
    @request.env["action_dispatch.cookies_serializer"] = :json
    get :set_wrapped_signed_cookie
    cookies = @controller.send :cookies
472 473
    assert_not_equal "wrapped: 45", cookies[:user_id]
    assert_equal "wrapped: 45", cookies.signed[:user_id]
474 475
  end

476 477 478 479
  def test_signed_cookie_using_custom_serializer
    @request.env["action_dispatch.cookies_serializer"] = CustomSerializer
    get :set_signed_cookie
    assert_not_equal 45, cookies[:user_id]
480
    assert_equal "45 was dumped and loaded", cookies.signed[:user_id]
481 482
  end

483
  def test_signed_cookie_using_hybrid_serializer_can_migrate_marshal_dumped_value_to_json
484 485 486 487 488
    @request.env["action_dispatch.cookies_serializer"] = :hybrid

    key_generator = @request.env["action_dispatch.key_generator"]
    signed_cookie_salt = @request.env["action_dispatch.signed_cookie_salt"]
    secret = key_generator.generate_key(signed_cookie_salt)
489 490 491

    marshal_value = ActiveSupport::MessageVerifier.new(secret, serializer: Marshal).generate(45)
    @request.headers["Cookie"] = "user_id=#{marshal_value}"
492 493 494 495 496 497

    get :get_signed_cookie

    cookies = @controller.send :cookies
    assert_not_equal 45, cookies[:user_id]
    assert_equal 45, cookies.signed[:user_id]
498

499
    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: JSON)
500
    assert_equal 45, verifier.verify(@response.cookies["user_id"])
501 502 503 504 505 506 507 508
  end

  def test_signed_cookie_using_hybrid_serializer_can_read_from_json_dumped_value
    @request.env["action_dispatch.cookies_serializer"] = :hybrid

    key_generator = @request.env["action_dispatch.key_generator"]
    signed_cookie_salt = @request.env["action_dispatch.signed_cookie_salt"]
    secret = key_generator.generate_key(signed_cookie_salt)
509 510
    json_value = ActiveSupport::MessageVerifier.new(secret, serializer: JSON).generate(45)
    @request.headers["Cookie"] = "user_id=#{json_value}"
511 512 513 514 515 516

    get :get_signed_cookie

    cookies = @controller.send :cookies
    assert_not_equal 45, cookies[:user_id]
    assert_equal 45, cookies.signed[:user_id]
517 518

    assert_nil @response.cookies["user_id"]
519 520
  end

M
Melissa Xie 已提交
521
  def test_accessing_nonexistent_signed_cookie_should_not_raise_an_invalid_signature
522
    get :set_signed_cookie
A
Abhishek Jain 已提交
523
    assert_nil @controller.send(:cookies).signed[:non_existent_attribute]
524 525
  end

526
  def test_encrypted_cookie_using_default_serializer
527 528
    get :set_encrypted_cookie
    cookies = @controller.send :cookies
529
    assert_not_equal "bar", cookies[:foo]
530
    assert_raise TypeError do
531 532
      cookies.signed[:foo]
    end
533
    assert_equal "bar", cookies.encrypted[:foo]
534 535
  end

536 537
  def test_encrypted_cookie_using_marshal_serializer
    @request.env["action_dispatch.cookies_serializer"] = :marshal
538
    get :set_encrypted_cookie
539
    cookies = @controller.send :cookies
540
    assert_not_equal "bar", cookies[:foo]
541 542 543
    assert_raises TypeError do
      cookies.signed[:foo]
    end
544
    assert_equal "bar", cookies.encrypted[:foo]
545 546 547
  end

  def test_encrypted_cookie_using_json_serializer
548
    @request.env["action_dispatch.cookies_serializer"] = :json
549 550
    get :set_encrypted_cookie
    cookies = @controller.send :cookies
551
    assert_not_equal "bar", cookies[:foo]
552
    assert_raises ::JSON::ParserError do
553 554
      cookies.signed[:foo]
    end
555
    assert_equal "bar", cookies.encrypted[:foo]
556 557
  end

558 559 560 561
  def test_wrapped_encrypted_cookie_using_json_serializer
    @request.env["action_dispatch.cookies_serializer"] = :json
    get :set_wrapped_encrypted_cookie
    cookies = @controller.send :cookies
562
    assert_not_equal "wrapped: bar", cookies[:foo]
563 564 565
    assert_raises ::JSON::ParserError do
      cookies.signed[:foo]
    end
566
    assert_equal "wrapped: bar", cookies.encrypted[:foo]
567 568
  end

569 570 571
  def test_encrypted_cookie_using_custom_serializer
    @request.env["action_dispatch.cookies_serializer"] = CustomSerializer
    get :set_encrypted_cookie
572 573
    assert_not_equal "bar", cookies.encrypted[:foo]
    assert_equal "bar was dumped and loaded", cookies.encrypted[:foo]
574 575
  end

576
  def test_encrypted_cookie_using_custom_digest
577
    @request.env["action_dispatch.cookies_digest"] = "SHA256"
578 579
    get :set_encrypted_cookie
    cookies = @controller.send :cookies
580 581
    assert_not_equal "bar", cookies[:foo]
    assert_equal "bar", cookies.encrypted[:foo]
582 583 584

    sign_secret = @request.env["action_dispatch.key_generator"].generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])

585 586
    sha1_verifier   = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer, digest: "SHA1")
    sha256_verifier = ActiveSupport::MessageVerifier.new(sign_secret, serializer: ActiveSupport::MessageEncryptor::NullSerializer, digest: "SHA256")
587 588 589 590 591 592 593 594 595 596

    assert_raises(ActiveSupport::MessageVerifier::InvalidSignature) do
      sha1_verifier.verify(cookies[:foo])
    end

    assert_nothing_raised do
      sha256_verifier.verify(cookies[:foo])
    end
  end

597
  def test_encrypted_cookie_using_hybrid_serializer_can_migrate_marshal_dumped_value_to_json
598 599 600 601 602 603 604
    @request.env["action_dispatch.cookies_serializer"] = :hybrid

    key_generator = @request.env["action_dispatch.key_generator"]
    encrypted_cookie_salt = @request.env["action_dispatch.encrypted_cookie_salt"]
    encrypted_signed_cookie_salt = @request.env["action_dispatch.encrypted_signed_cookie_salt"]
    secret = key_generator.generate_key(encrypted_cookie_salt)
    sign_secret = key_generator.generate_key(encrypted_signed_cookie_salt)
605

606 607
    marshal_value = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: Marshal).encrypt_and_sign("bar")
    @request.headers["Cookie"] = "foo=#{marshal_value}"
608 609 610 611

    get :get_encrypted_cookie

    cookies = @controller.send :cookies
612 613
    assert_not_equal "bar", cookies[:foo]
    assert_equal "bar", cookies.encrypted[:foo]
614

615 616
    encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: JSON)
    assert_equal "bar", encryptor.decrypt_and_verify(@response.cookies["foo"])
617 618
  end

G
Godfrey Chan 已提交
619
  def test_encrypted_cookie_using_hybrid_serializer_can_read_from_json_dumped_value
620 621 622 623 624 625 626
    @request.env["action_dispatch.cookies_serializer"] = :hybrid

    key_generator = @request.env["action_dispatch.key_generator"]
    encrypted_cookie_salt = @request.env["action_dispatch.encrypted_cookie_salt"]
    encrypted_signed_cookie_salt = @request.env["action_dispatch.encrypted_signed_cookie_salt"]
    secret = key_generator.generate_key(encrypted_cookie_salt)
    sign_secret = key_generator.generate_key(encrypted_signed_cookie_salt)
627 628
    json_value = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: JSON).encrypt_and_sign("bar")
    @request.headers["Cookie"] = "foo=#{json_value}"
629 630 631 632

    get :get_encrypted_cookie

    cookies = @controller.send :cookies
633 634 635 636
    assert_not_equal "bar", cookies[:foo]
    assert_equal "bar", cookies.encrypted[:foo]

    assert_nil @response.cookies["foo"]
637 638
  end

M
Melissa Xie 已提交
639
  def test_accessing_nonexistent_encrypted_cookie_should_not_raise_invalid_message
640
    get :set_encrypted_cookie
A
Abhishek Jain 已提交
641
    assert_nil @controller.send(:cookies).encrypted[:non_existent_attribute]
642 643 644 645 646
  end

  def test_setting_invalid_encrypted_cookie_should_return_nil_when_accessing_it
    get :set_invalid_encrypted_cookie
    assert_nil @controller.send(:cookies).encrypted[:invalid_cookie]
647 648
  end

649 650
  def test_permanent_signed_cookie
    get :set_permanent_signed_cookie
651
    assert_match(%r(#{20.years.from_now.utc.year}), @response.headers["Set-Cookie"])
652 653 654
    assert_equal 100, @controller.send(:cookies).signed[:remember_me]
  end

655
  def test_delete_and_set_cookie
656
    request.cookies[:user_name] = "Joe"
657
    get :delete_and_set_cookie
658
    assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
659 660
    assert_equal({"user_name" => "david"}, @response.cookies)
  end
J
Joshua Peek 已提交
661

662 663 664 665 666 667 668 669 670 671 672 673 674
  def test_raise_data_overflow
    assert_raise(ActionDispatch::Cookies::CookieOverflow) do
      get :raise_data_overflow
    end
  end

  def test_tampered_cookies
    assert_nothing_raised do
      get :tampered_cookies
      assert_response :success
    end
  end

675 676 677 678 679 680 681 682 683
  def test_cookie_jar_mutated_by_request_persists_on_future_requests
    get :authenticate
    cookie_jar = @request.cookie_jar
    cookie_jar.signed[:user_id] = 123
    assert_equal ["user_name", "user_id"], @request.cookie_jar.instance_variable_get(:@cookies).keys
    get :get_signed_cookie
    assert_equal ["user_name", "user_id"], @request.cookie_jar.instance_variable_get(:@cookies).keys
  end

684 685
  def test_raises_argument_error_if_missing_secret
    assert_raise(ArgumentError, nil.inspect) {
686
      @request.env["action_dispatch.key_generator"] = ActiveSupport::LegacyKeyGenerator.new(nil)
687 688 689
      get :set_signed_cookie
    }

690
    assert_raise(ArgumentError, "".inspect) {
691
      @request.env["action_dispatch.key_generator"] = ActiveSupport::LegacyKeyGenerator.new("")
692 693 694 695 696 697
      get :set_signed_cookie
    }
  end

  def test_raises_argument_error_if_secret_is_probably_insecure
    assert_raise(ArgumentError, "password".inspect) {
698
      @request.env["action_dispatch.key_generator"] = ActiveSupport::LegacyKeyGenerator.new("password")
699 700 701 702
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, "secret".inspect) {
703
      @request.env["action_dispatch.key_generator"] = ActiveSupport::LegacyKeyGenerator.new("secret")
704 705 706 707
      get :set_signed_cookie
    }

    assert_raise(ArgumentError, "12345678901234567890123456789".inspect) {
708
      @request.env["action_dispatch.key_generator"] = ActiveSupport::LegacyKeyGenerator.new("12345678901234567890123456789")
709 710 711 712
      get :set_signed_cookie
    }
  end

713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733
  def test_signed_uses_signed_cookie_jar_if_only_secret_token_is_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = nil
    get :set_signed_cookie
    assert_kind_of ActionDispatch::Cookies::SignedCookieJar, cookies.signed
  end

  def test_signed_uses_signed_cookie_jar_if_only_secret_key_base_is_set
    @request.env["action_dispatch.secret_token"] = nil
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :set_signed_cookie
    assert_kind_of ActionDispatch::Cookies::SignedCookieJar, cookies.signed
  end

  def test_signed_uses_upgrade_legacy_signed_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :set_signed_cookie
    assert_kind_of ActionDispatch::Cookies::UpgradeLegacySignedCookieJar, cookies.signed
  end

734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769
  def test_signed_or_encrypted_uses_signed_cookie_jar_if_only_secret_token_is_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = nil
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::SignedCookieJar, cookies.signed_or_encrypted
  end

  def test_signed_or_encrypted_uses_encrypted_cookie_jar_if_only_secret_key_base_is_set
    @request.env["action_dispatch.secret_token"] = nil
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::EncryptedCookieJar, cookies.signed_or_encrypted
  end

  def test_signed_or_encrypted_uses_upgrade_legacy_encrypted_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::UpgradeLegacyEncryptedCookieJar, cookies.signed_or_encrypted
  end

  def test_encrypted_uses_encrypted_cookie_jar_if_only_secret_key_base_is_set
    @request.env["action_dispatch.secret_token"] = nil
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::EncryptedCookieJar, cookies.encrypted
  end

  def test_encrypted_uses_upgrade_legacy_encrypted_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    get :get_encrypted_cookie
    assert_kind_of ActionDispatch::Cookies::UpgradeLegacyEncryptedCookieJar, cookies.encrypted
  end

  def test_legacy_signed_cookie_is_read_and_transparently_upgraded_by_signed_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33").generate(45)

    @request.headers["Cookie"] = "user_id=#{legacy_value}"
    get :get_signed_cookie

    assert_equal 45, @controller.send(:cookies).signed[:user_id]

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.signed_cookie_salt"])
    verifier = ActiveSupport::MessageVerifier.new(secret)
    assert_equal 45, verifier.verify(@response.cookies["user_id"])
  end

786 787 788 789 790 791
  def test_legacy_signed_cookie_is_read_and_transparently_encrypted_by_encrypted_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    @request.env["action_dispatch.encrypted_cookie_salt"] = "4433796b79d99a7735553e316522acee"
    @request.env["action_dispatch.encrypted_signed_cookie_salt"] = "00646eb40062e1b1deff205a27cd30f9"

792
    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33").generate("bar")
793 794 795 796

    @request.headers["Cookie"] = "foo=#{legacy_value}"
    get :get_encrypted_cookie

797
    assert_equal "bar", @controller.send(:cookies).encrypted[:foo]
798 799 800 801 802

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_cookie_salt"])
    sign_secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])
    encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret)
803
    assert_equal "bar", encryptor.decrypt_and_verify(@response.cookies["foo"])
804 805
  end

806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830
  def test_legacy_json_signed_cookie_is_read_and_transparently_upgraded_by_signed_json_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.cookies_serializer"] = :json
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33", serializer: JSON).generate(45)

    @request.headers["Cookie"] = "user_id=#{legacy_value}"
    get :get_signed_cookie

    assert_equal 45, @controller.send(:cookies).signed[:user_id]

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.signed_cookie_salt"])
    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: JSON)
    assert_equal 45, verifier.verify(@response.cookies["user_id"])
  end

  def test_legacy_json_signed_cookie_is_read_and_transparently_encrypted_by_encrypted_json_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.cookies_serializer"] = :json
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    @request.env["action_dispatch.encrypted_cookie_salt"] = "4433796b79d99a7735553e316522acee"
    @request.env["action_dispatch.encrypted_signed_cookie_salt"] = "00646eb40062e1b1deff205a27cd30f9"

831
    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33", serializer: JSON).generate("bar")
832 833 834 835

    @request.headers["Cookie"] = "foo=#{legacy_value}"
    get :get_encrypted_cookie

836
    assert_equal "bar", @controller.send(:cookies).encrypted[:foo]
837 838 839 840 841

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_cookie_salt"])
    sign_secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])
    encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: JSON)
842
    assert_equal "bar", encryptor.decrypt_and_verify(@response.cookies["foo"])
843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
  end

  def test_legacy_json_signed_cookie_is_read_and_transparently_upgraded_by_signed_json_hybrid_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.cookies_serializer"] = :hybrid
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33", serializer: JSON).generate(45)

    @request.headers["Cookie"] = "user_id=#{legacy_value}"
    get :get_signed_cookie

    assert_equal 45, @controller.send(:cookies).signed[:user_id]

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.signed_cookie_salt"])
    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: JSON)
    assert_equal 45, verifier.verify(@response.cookies["user_id"])
  end

  def test_legacy_json_signed_cookie_is_read_and_transparently_encrypted_by_encrypted_hybrid_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.cookies_serializer"] = :hybrid
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    @request.env["action_dispatch.encrypted_cookie_salt"] = "4433796b79d99a7735553e316522acee"
    @request.env["action_dispatch.encrypted_signed_cookie_salt"] = "00646eb40062e1b1deff205a27cd30f9"

870
    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33", serializer: JSON).generate("bar")
871 872 873 874

    @request.headers["Cookie"] = "foo=#{legacy_value}"
    get :get_encrypted_cookie

875
    assert_equal "bar", @controller.send(:cookies).encrypted[:foo]
876 877 878 879 880

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_cookie_salt"])
    sign_secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])
    encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: JSON)
881
    assert_equal "bar", encryptor.decrypt_and_verify(@response.cookies["foo"])
882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908
  end

  def test_legacy_marshal_signed_cookie_is_read_and_transparently_upgraded_by_signed_json_hybrid_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.cookies_serializer"] = :hybrid
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33").generate(45)

    @request.headers["Cookie"] = "user_id=#{legacy_value}"
    get :get_signed_cookie

    assert_equal 45, @controller.send(:cookies).signed[:user_id]

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.signed_cookie_salt"])
    verifier = ActiveSupport::MessageVerifier.new(secret, serializer: JSON)
    assert_equal 45, verifier.verify(@response.cookies["user_id"])
  end

  def test_legacy_marshal_signed_cookie_is_read_and_transparently_encrypted_by_encrypted_hybrid_cookie_jar_if_both_secret_token_and_secret_key_base_are_set
    @request.env["action_dispatch.cookies_serializer"] = :hybrid
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"
    @request.env["action_dispatch.encrypted_cookie_salt"] = "4433796b79d99a7735553e316522acee"
    @request.env["action_dispatch.encrypted_signed_cookie_salt"] = "00646eb40062e1b1deff205a27cd30f9"

909
    legacy_value = ActiveSupport::MessageVerifier.new("b3c631c314c0bbca50c1b2843150fe33").generate("bar")
910 911 912 913

    @request.headers["Cookie"] = "foo=#{legacy_value}"
    get :get_encrypted_cookie

914
    assert_equal "bar", @controller.send(:cookies).encrypted[:foo]
915 916 917 918 919

    key_generator = @request.env["action_dispatch.key_generator"]
    secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_cookie_salt"])
    sign_secret = key_generator.generate_key(@request.env["action_dispatch.encrypted_signed_cookie_salt"])
    encryptor = ActiveSupport::MessageEncryptor.new(secret, sign_secret, serializer: JSON)
920
    assert_equal "bar", encryptor.decrypt_and_verify(@response.cookies["foo"])
921 922
  end

923
  def test_legacy_signed_cookie_is_treated_as_nil_by_signed_cookie_jar_if_tampered
924 925 926 927 928 929 930 931 932 933
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    @request.headers["Cookie"] = "user_id=45"
    get :get_signed_cookie

    assert_equal nil, @controller.send(:cookies).signed[:user_id]
    assert_equal nil, @response.cookies["user_id"]
  end

934 935 936 937 938 939 940 941 942 943 944
  def test_legacy_signed_cookie_is_treated_as_nil_by_encrypted_cookie_jar_if_tampered
    @request.env["action_dispatch.secret_token"] = "b3c631c314c0bbca50c1b2843150fe33"
    @request.env["action_dispatch.secret_key_base"] = "c3b95688f35581fad38df788add315ff"

    @request.headers["Cookie"] = "foo=baz"
    get :get_encrypted_cookie

    assert_equal nil, @controller.send(:cookies).encrypted[:foo]
    assert_equal nil, @response.cookies["foo"]
  end

945 946 947 948 949 950
  def test_cookie_with_all_domain_option
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/"
  end

951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978
  def test_cookie_with_all_domain_option_using_a_non_standard_tld
    @request.host = "two.subdomains.nextangle.local"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

  def test_cookie_with_all_domain_option_using_australian_style_tld
    @request.host = "nextangle.com.au"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com.au; path=/"
  end

  def test_cookie_with_all_domain_option_using_uk_style_tld
    @request.host = "nextangle.co.uk"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.co.uk; path=/"
  end

  def test_cookie_with_all_domain_option_using_host_with_port
    @request.host = "nextangle.local:3000"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999
  def test_cookie_with_all_domain_option_using_localhost
    @request.host = "localhost"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

  def test_cookie_with_all_domain_option_using_ipv4_address
    @request.host = "192.168.1.1"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

  def test_cookie_with_all_domain_option_using_ipv6_address
    @request.host = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
    get :set_cookie_with_domain
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

1000
  def test_deleting_cookie_with_all_domain_option
1001
    request.cookies[:user_name] = "Joe"
1002 1003
    get :delete_cookie_with_domain
    assert_response :success
1004
    assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
1005 1006
  end

1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
  def test_cookie_with_all_domain_option_and_tld_length
    get :set_cookie_with_domain_and_tld
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/"
  end

  def test_cookie_with_all_domain_option_using_a_non_standard_tld_and_tld_length
    @request.host = "two.subdomains.nextangle.local"
    get :set_cookie_with_domain_and_tld
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

1020 1021 1022 1023 1024 1025 1026
  def test_cookie_with_all_domain_option_using_a_non_standard_2_letter_tld
    @request.host = "admin.lvh.me"
    get :set_cookie_with_domain_and_tld
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.lvh.me; path=/"
  end

1027 1028 1029 1030 1031 1032 1033 1034
  def test_cookie_with_all_domain_option_using_host_with_port_and_tld_length
    @request.host = "nextangle.local:3000"
    get :set_cookie_with_domain_and_tld
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
  end

  def test_deleting_cookie_with_all_domain_option_and_tld_length
1035
    request.cookies[:user_name] = "Joe"
1036 1037
    get :delete_cookie_with_domain_and_tld
    assert_response :success
1038
    assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
1039 1040
  end

1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
  def test_cookie_with_several_preset_domains_using_one_of_these_domains
    @request.host = "example1.com"
    get :set_cookie_with_domains
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=example1.com; path=/"
  end

  def test_cookie_with_several_preset_domains_using_other_domain
    @request.host = "other-domain.com"
    get :set_cookie_with_domains
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; path=/"
  end

  def test_cookie_with_several_preset_domains_using_shared_domain
    @request.host = "example3.com"
    get :set_cookie_with_domains
    assert_response :success
    assert_cookie_header "user_name=rizwanreza; domain=.example3.com; path=/"
  end

  def test_deletings_cookie_with_several_preset_domains_using_one_of_these_domains
    @request.host = "example2.com"
1064
    request.cookies[:user_name] = "Joe"
1065 1066
    get :delete_cookie_with_domains
    assert_response :success
1067
    assert_cookie_header "user_name=; domain=example2.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
1068 1069 1070 1071
  end

  def test_deletings_cookie_with_several_preset_domains_using_other_domain
    @request.host = "other-domain.com"
1072
    request.cookies[:user_name] = "Joe"
1073 1074
    get :delete_cookie_with_domains
    assert_response :success
1075
    assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
1076 1077
  end

1078
  def test_cookies_hash_is_indifferent_access
1079 1080
    get :symbol_key
    assert_equal "david", cookies[:user_name]
1081
    assert_equal "david", cookies["user_name"]
1082 1083
    get :string_key
    assert_equal "dhh", cookies[:user_name]
1084
    assert_equal "dhh", cookies["user_name"]
1085 1086
  end

1087
  def test_setting_request_cookies_is_indifferent_access
1088 1089
    cookies.clear
    cookies[:user_name] = "andrew"
1090
    get :string_key_mock
1091
    assert_equal "david", cookies["user_name"]
1092

1093
    cookies.clear
1094
    cookies["user_name"] = "andrew"
1095
    get :symbol_key_mock
1096
    assert_equal "david", cookies[:user_name]
1097 1098 1099 1100
  end

  def test_cookies_retained_across_requests
    get :symbol_key
1101
    assert_cookie_header "user_name=david; path=/"
1102 1103 1104
    assert_equal "david", cookies[:user_name]

    get :noop
1105
    assert !@response.headers.include?("Set-Cookie")
1106 1107 1108
    assert_equal "david", cookies[:user_name]

    get :noop
1109
    assert !@response.headers.include?("Set-Cookie")
1110 1111 1112 1113 1114 1115 1116
    assert_equal "david", cookies[:user_name]
  end

  def test_cookies_can_be_cleared
    get :symbol_key
    assert_equal "david", cookies[:user_name]

1117
    cookies.clear
1118 1119 1120 1121 1122 1123 1124
    get :noop
    assert_nil cookies[:user_name]

    get :symbol_key
    assert_equal "david", cookies[:user_name]
  end

1125
  def test_can_set_http_cookie_header
1126
    @request.env["HTTP_COOKIE"] = "user_name=david"
1127
    get :noop
1128 1129
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1130 1131

    get :noop
1132 1133
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1134

1135
    @request.env["HTTP_COOKIE"] = "user_name=andrew"
1136
    get :noop
1137 1138
    assert_equal "andrew", cookies["user_name"]
    assert_equal "andrew", cookies[:user_name]
1139 1140 1141
  end

  def test_can_set_request_cookies
1142
    @request.cookies["user_name"] = "david"
1143
    get :noop
1144 1145
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1146 1147

    get :noop
1148 1149
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1150

1151
    @request.cookies[:user_name] = "andrew"
1152
    get :noop
1153 1154
    assert_equal "andrew", cookies["user_name"]
    assert_equal "andrew", cookies[:user_name]
1155 1156 1157
  end

  def test_cookies_precedence_over_http_cookie
1158
    @request.env["HTTP_COOKIE"] = "user_name=andrew"
1159
    get :authenticate
1160 1161
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1162 1163

    get :noop
1164 1165
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1166 1167 1168
  end

  def test_cookies_precedence_over_request_cookies
1169
    @request.cookies["user_name"] = "andrew"
1170
    get :authenticate
1171 1172
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1173

1174
    get :noop
1175 1176
    assert_equal "david", cookies["user_name"]
    assert_equal "david", cookies[:user_name]
1177 1178
  end

J
Jeremy Kemper 已提交
1179 1180 1181 1182
  private
    def assert_cookie_header(expected)
      header = @response.headers["Set-Cookie"]
      if header.respond_to?(:to_str)
1183
        assert_equal expected.split("\n").sort, header.split("\n").sort
J
Jeremy Kemper 已提交
1184 1185 1186 1187
      else
        assert_equal expected.split("\n"), header
      end
    end
1188 1189 1190 1191 1192 1193 1194 1195 1196

    def assert_not_cookie_header(expected)
      header = @response.headers["Set-Cookie"]
      if header.respond_to?(:to_str)
        assert_not_equal expected.split("\n").sort, header.split("\n").sort
      else
        assert_not_equal expected.split("\n"), header
      end
    end
1197
end