gh-112713 : Add support for 'partitioned' attribute in http.cookies (GH-112714)

* Add support for 'partitioned' attribute in http.cookies

Co-authored-by: Giles Copp <gilesc@dropbox.com>
Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Co-authored-by: Gregory P. Smith [Google LLC] <greg@krypto.org>
This commit is contained in:
Giles Copp 2025-01-24 17:31:52 -05:00 committed by GitHub
parent 3a3a6b86f4
commit 9abbb58e3f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 28 additions and 1 deletions

View file

@ -142,6 +142,7 @@ Morsel Objects
version version
httponly httponly
samesite samesite
partitioned
The attribute :attr:`httponly` specifies that the cookie is only transferred The attribute :attr:`httponly` specifies that the cookie is only transferred
in HTTP requests, and is not accessible through JavaScript. This is intended in HTTP requests, and is not accessible through JavaScript. This is intended
@ -151,6 +152,19 @@ Morsel Objects
send the cookie along with cross-site requests. This helps to mitigate CSRF send the cookie along with cross-site requests. This helps to mitigate CSRF
attacks. Valid values for this attribute are "Strict" and "Lax". attacks. Valid values for this attribute are "Strict" and "Lax".
The attribute :attr:`partitioned` indicates to user agents that these
cross-site cookies *should* only be available in the same top-level context
that the cookie was first set in. For this to be accepted by the user agent,
you **must** also set ``Secure``.
In addition, it is recommended to use the ``__Host`` prefix when setting
partitioned cookies to make them bound to the hostname and not the
registrable domain. Read
`CHIPS (Cookies Having Independent Partitioned State)`_
for full details and examples.
.. _CHIPS (Cookies Having Independent Partitioned State): https://github.com/privacycg/CHIPS/blob/main/README.md
The keys are case-insensitive and their default value is ``''``. The keys are case-insensitive and their default value is ``''``.
.. versionchanged:: 3.5 .. versionchanged:: 3.5
@ -165,6 +179,9 @@ Morsel Objects
.. versionchanged:: 3.8 .. versionchanged:: 3.8
Added support for the :attr:`samesite` attribute. Added support for the :attr:`samesite` attribute.
.. versionchanged:: 3.14
Added support for the :attr:`partitioned` attribute.
.. attribute:: Morsel.value .. attribute:: Morsel.value

View file

@ -264,11 +264,12 @@ class Morsel(dict):
"httponly" : "HttpOnly", "httponly" : "HttpOnly",
"version" : "Version", "version" : "Version",
"samesite" : "SameSite", "samesite" : "SameSite",
"partitioned": "Partitioned",
} }
_reserved_defaults = dict.fromkeys(_reserved, "") _reserved_defaults = dict.fromkeys(_reserved, "")
_flags = {'secure', 'httponly'} _flags = {'secure', 'httponly', 'partitioned'}
def __init__(self): def __init__(self):
# Set defaults # Set defaults

View file

@ -205,6 +205,14 @@ class CookieTests(unittest.TestCase):
self.assertEqual(C.output(), self.assertEqual(C.output(),
'Set-Cookie: Customer="WILE_E_COYOTE"; HttpOnly; Secure') 'Set-Cookie: Customer="WILE_E_COYOTE"; HttpOnly; Secure')
def test_set_secure_httponly_partitioned_attrs(self):
C = cookies.SimpleCookie('Customer="WILE_E_COYOTE"')
C['Customer']['secure'] = True
C['Customer']['httponly'] = True
C['Customer']['partitioned'] = True
self.assertEqual(C.output(),
'Set-Cookie: Customer="WILE_E_COYOTE"; HttpOnly; Partitioned; Secure')
def test_samesite_attrs(self): def test_samesite_attrs(self):
samesite_values = ['Strict', 'Lax', 'strict', 'lax'] samesite_values = ['Strict', 'Lax', 'strict', 'lax']
for val in samesite_values: for val in samesite_values:

View file

@ -0,0 +1 @@
Added support for the ``Partitioned`` cookie flag in :mod:`http.cookies`.