@@ -358,12 +358,38 @@ def setup
358
358
@request . env [ "action_dispatch.encrypted_signed_cookie_salt" ] = ENCRYPTED_SIGNED_COOKIE_SALT
359
359
@request . env [ "action_dispatch.authenticated_encrypted_cookie_salt" ] = AUTHENTICATED_ENCRYPTED_COOKIE_SALT
360
360
361
+ @request . env [ "action_dispatch.cookies_same_site_protection" ] = :lax
361
362
@request . host = "www.nextangle.com"
362
363
end
363
364
365
+ def test_setting_cookie_with_no_protection
366
+ @request . env [ "action_dispatch.cookies_same_site_protection" ] = :none
367
+
368
+ get :authenticate
369
+ assert_cookie_header "user_name=david; path=/" # TODO: append "; SameSite=None" when rack 2.1.0 is out and bump rack dependency version.
370
+ assert_equal ( { "user_name" => "david" } , @response . cookies )
371
+ end
372
+
373
+ def test_setting_cookie_with_misspelled_protection_raises
374
+ @request . env [ "action_dispatch.cookies_same_site_protection" ] = :funky
375
+
376
+ error = assert_raise ArgumentError do
377
+ get :authenticate
378
+ end
379
+ assert_match "Invalid SameSite value: :funky" , error . message
380
+ end
381
+
382
+ def test_setting_cookie_with_strict
383
+ @request . env [ "action_dispatch.cookies_same_site_protection" ] = :strict
384
+
385
+ get :authenticate
386
+ assert_cookie_header "user_name=david; path=/; SameSite=Strict"
387
+ assert_equal ( { "user_name" => "david" } , @response . cookies )
388
+ end
389
+
364
390
def test_setting_cookie
365
391
get :authenticate
366
- assert_cookie_header "user_name=david; path=/"
392
+ assert_cookie_header "user_name=david; path=/; SameSite=Lax "
367
393
assert_equal ( { "user_name" => "david" } , @response . cookies )
368
394
end
369
395
@@ -381,39 +407,39 @@ def test_setting_the_same_value_to_permanent_cookie
381
407
382
408
def test_setting_with_escapable_characters
383
409
get :set_with_with_escapable_characters
384
- assert_cookie_header "that+%26+guy=foo+%26+bar+%3D%3E+baz; path=/"
410
+ assert_cookie_header "that+%26+guy=foo+%26+bar+%3D%3E+baz; path=/; SameSite=Lax "
385
411
assert_equal ( { "that & guy" => "foo & bar => baz" } , @response . cookies )
386
412
end
387
413
388
414
def test_setting_cookie_for_fourteen_days
389
415
get :authenticate_for_fourteen_days
390
- assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
416
+ assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000; SameSite=Lax "
391
417
assert_equal ( { "user_name" => "david" } , @response . cookies )
392
418
end
393
419
394
420
def test_setting_cookie_for_fourteen_days_with_symbols
395
421
get :authenticate_for_fourteen_days_with_symbols
396
- assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
422
+ assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000; SameSite=Lax "
397
423
assert_equal ( { "user_name" => "david" } , @response . cookies )
398
424
end
399
425
400
426
def test_setting_cookie_with_http_only
401
427
get :authenticate_with_http_only
402
- assert_cookie_header "user_name=david; path=/; HttpOnly"
428
+ assert_cookie_header "user_name=david; path=/; HttpOnly; SameSite=Lax "
403
429
assert_equal ( { "user_name" => "david" } , @response . cookies )
404
430
end
405
431
406
432
def test_setting_cookie_with_secure
407
433
@request . env [ "HTTPS" ] = "on"
408
434
get :authenticate_with_secure
409
- assert_cookie_header "user_name=david; path=/; secure"
435
+ assert_cookie_header "user_name=david; path=/; secure; SameSite=Lax "
410
436
assert_equal ( { "user_name" => "david" } , @response . cookies )
411
437
end
412
438
413
439
def test_setting_cookie_with_secure_when_always_write_cookie_is_true
414
440
old_cookie , @request . cookie_jar . always_write_cookie = @request . cookie_jar . always_write_cookie , true
415
441
get :authenticate_with_secure
416
- assert_cookie_header "user_name=david; path=/; secure"
442
+ assert_cookie_header "user_name=david; path=/; secure; SameSite=Lax "
417
443
assert_equal ( { "user_name" => "david" } , @response . cookies )
418
444
ensure
419
445
@request . cookie_jar . always_write_cookie = old_cookie
@@ -428,7 +454,7 @@ def test_not_setting_cookie_with_secure
428
454
def test_multiple_cookies
429
455
get :set_multiple_cookies
430
456
assert_equal 2 , @response . cookies . size
431
- assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000\n login=XJ-122; path=/"
457
+ assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000; SameSite=Lax \n login=XJ-122; path=/; SameSite=Lax "
432
458
assert_equal ( { "login" => "XJ-122" , "user_name" => "david" } , @response . cookies )
433
459
end
434
460
@@ -439,14 +465,14 @@ def test_setting_test_cookie
439
465
def test_expiring_cookie
440
466
request . cookies [ :user_name ] = "Joe"
441
467
get :logout
442
- assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
468
+ assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000; SameSite=Lax "
443
469
assert_equal ( { "user_name" => nil } , @response . cookies )
444
470
end
445
471
446
472
def test_delete_cookie_with_path
447
473
request . cookies [ :user_name ] = "Joe"
448
474
get :delete_cookie_with_path
449
- assert_cookie_header "user_name=; path=/beaten; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
475
+ assert_cookie_header "user_name=; path=/beaten; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000; SameSite=Lax "
450
476
end
451
477
452
478
def test_delete_unexisting_cookie
@@ -723,7 +749,7 @@ def test_permanent_signed_cookie
723
749
def test_delete_and_set_cookie
724
750
request . cookies [ :user_name ] = "Joe"
725
751
get :delete_and_set_cookie
726
- assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000"
752
+ assert_cookie_header "user_name=david; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000; SameSite=Lax "
727
753
assert_equal ( { "user_name" => "david" } , @response . cookies )
728
754
end
729
755
@@ -909,134 +935,134 @@ def test_cookie_with_hash_value_not_modified_by_rotation
909
935
def test_cookie_with_all_domain_option
910
936
get :set_cookie_with_domain
911
937
assert_response :success
912
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/"
938
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/; SameSite=Lax "
913
939
end
914
940
915
941
def test_cookie_with_all_domain_option_using_a_non_standard_tld
916
942
@request . host = "two.subdomains.nextangle.local"
917
943
get :set_cookie_with_domain
918
944
assert_response :success
919
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
945
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/; SameSite=Lax "
920
946
end
921
947
922
948
def test_cookie_with_all_domain_option_using_australian_style_tld
923
949
@request . host = "nextangle.com.au"
924
950
get :set_cookie_with_domain
925
951
assert_response :success
926
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com.au; path=/"
952
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com.au; path=/; SameSite=Lax "
927
953
end
928
954
929
955
def test_cookie_with_all_domain_option_using_uk_style_tld
930
956
@request . host = "nextangle.co.uk"
931
957
get :set_cookie_with_domain
932
958
assert_response :success
933
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.co.uk; path=/"
959
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.co.uk; path=/; SameSite=Lax "
934
960
end
935
961
936
962
def test_cookie_with_all_domain_option_using_host_with_port
937
963
@request . host = "nextangle.local:3000"
938
964
get :set_cookie_with_domain
939
965
assert_response :success
940
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
966
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/; SameSite=Lax "
941
967
end
942
968
943
969
def test_cookie_with_all_domain_option_using_localhost
944
970
@request . host = "localhost"
945
971
get :set_cookie_with_domain
946
972
assert_response :success
947
- assert_cookie_header "user_name=rizwanreza; path=/"
973
+ assert_cookie_header "user_name=rizwanreza; path=/; SameSite=Lax "
948
974
end
949
975
950
976
def test_cookie_with_all_domain_option_using_ipv4_address
951
977
@request . host = "192.168.1.1"
952
978
get :set_cookie_with_domain
953
979
assert_response :success
954
- assert_cookie_header "user_name=rizwanreza; path=/"
980
+ assert_cookie_header "user_name=rizwanreza; path=/; SameSite=Lax "
955
981
end
956
982
957
983
def test_cookie_with_all_domain_option_using_ipv6_address
958
984
@request . host = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
959
985
get :set_cookie_with_domain
960
986
assert_response :success
961
- assert_cookie_header "user_name=rizwanreza; path=/"
987
+ assert_cookie_header "user_name=rizwanreza; path=/; SameSite=Lax "
962
988
end
963
989
964
990
def test_deleting_cookie_with_all_domain_option
965
991
request . cookies [ :user_name ] = "Joe"
966
992
get :delete_cookie_with_domain
967
993
assert_response :success
968
- assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
994
+ assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000; SameSite=Lax "
969
995
end
970
996
971
997
def test_cookie_with_all_domain_option_and_tld_length
972
998
get :set_cookie_with_domain_and_tld
973
999
assert_response :success
974
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/"
1000
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.com; path=/; SameSite=Lax "
975
1001
end
976
1002
977
1003
def test_cookie_with_all_domain_option_using_a_non_standard_tld_and_tld_length
978
1004
@request . host = "two.subdomains.nextangle.local"
979
1005
get :set_cookie_with_domain_and_tld
980
1006
assert_response :success
981
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
1007
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/; SameSite=Lax "
982
1008
end
983
1009
984
1010
def test_cookie_with_all_domain_option_using_a_non_standard_2_letter_tld
985
1011
@request . host = "admin.lvh.me"
986
1012
get :set_cookie_with_domain_and_tld
987
1013
assert_response :success
988
- assert_cookie_header "user_name=rizwanreza; domain=.lvh.me; path=/"
1014
+ assert_cookie_header "user_name=rizwanreza; domain=.lvh.me; path=/; SameSite=Lax "
989
1015
end
990
1016
991
1017
def test_cookie_with_all_domain_option_using_host_with_port_and_tld_length
992
1018
@request . host = "nextangle.local:3000"
993
1019
get :set_cookie_with_domain_and_tld
994
1020
assert_response :success
995
- assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/"
1021
+ assert_cookie_header "user_name=rizwanreza; domain=.nextangle.local; path=/; SameSite=Lax "
996
1022
end
997
1023
998
1024
def test_deleting_cookie_with_all_domain_option_and_tld_length
999
1025
request . cookies [ :user_name ] = "Joe"
1000
1026
get :delete_cookie_with_domain_and_tld
1001
1027
assert_response :success
1002
- assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
1028
+ assert_cookie_header "user_name=; domain=.nextangle.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000; SameSite=Lax "
1003
1029
end
1004
1030
1005
1031
def test_cookie_with_several_preset_domains_using_one_of_these_domains
1006
1032
@request . host = "example1.com"
1007
1033
get :set_cookie_with_domains
1008
1034
assert_response :success
1009
- assert_cookie_header "user_name=rizwanreza; domain=example1.com; path=/"
1035
+ assert_cookie_header "user_name=rizwanreza; domain=example1.com; path=/; SameSite=Lax "
1010
1036
end
1011
1037
1012
1038
def test_cookie_with_several_preset_domains_using_other_domain
1013
1039
@request . host = "other-domain.com"
1014
1040
get :set_cookie_with_domains
1015
1041
assert_response :success
1016
- assert_cookie_header "user_name=rizwanreza; path=/"
1042
+ assert_cookie_header "user_name=rizwanreza; path=/; SameSite=Lax "
1017
1043
end
1018
1044
1019
1045
def test_cookie_with_several_preset_domains_using_shared_domain
1020
1046
@request . host = "example3.com"
1021
1047
get :set_cookie_with_domains
1022
1048
assert_response :success
1023
- assert_cookie_header "user_name=rizwanreza; domain=.example3.com; path=/"
1049
+ assert_cookie_header "user_name=rizwanreza; domain=.example3.com; path=/; SameSite=Lax "
1024
1050
end
1025
1051
1026
1052
def test_deletings_cookie_with_several_preset_domains_using_one_of_these_domains
1027
1053
@request . host = "example2.com"
1028
1054
request . cookies [ :user_name ] = "Joe"
1029
1055
get :delete_cookie_with_domains
1030
1056
assert_response :success
1031
- assert_cookie_header "user_name=; domain=example2.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
1057
+ assert_cookie_header "user_name=; domain=example2.com; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000; SameSite=Lax "
1032
1058
end
1033
1059
1034
1060
def test_deletings_cookie_with_several_preset_domains_using_other_domain
1035
1061
@request . host = "other-domain.com"
1036
1062
request . cookies [ :user_name ] = "Joe"
1037
1063
get :delete_cookie_with_domains
1038
1064
assert_response :success
1039
- assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"
1065
+ assert_cookie_header "user_name=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000; SameSite=Lax "
1040
1066
end
1041
1067
1042
1068
def test_cookies_hash_is_indifferent_access
@@ -1062,7 +1088,7 @@ def test_setting_request_cookies_is_indifferent_access
1062
1088
1063
1089
def test_cookies_retained_across_requests
1064
1090
get :symbol_key
1065
- assert_cookie_header "user_name=david; path=/"
1091
+ assert_cookie_header "user_name=david; path=/; SameSite=Lax "
1066
1092
assert_equal "david" , cookies [ :user_name ]
1067
1093
1068
1094
get :noop
@@ -1181,7 +1207,7 @@ def test_encrypted_cookie_with_expires_set_relatively
1181
1207
def test_vanilla_cookie_with_expires_set_relatively
1182
1208
travel_to Time . utc ( 2017 , 8 , 15 ) do
1183
1209
get :cookie_expires_in_two_hours
1184
- assert_cookie_header "user_name=assain; path=/; expires=Tue, 15 Aug 2017 02:00:00 -0000"
1210
+ assert_cookie_header "user_name=assain; path=/; expires=Tue, 15 Aug 2017 02:00:00 -0000; SameSite=Lax "
1185
1211
end
1186
1212
end
1187
1213
0 commit comments