Skip to content

Commit

Permalink
gh-99576: Fix cookiejar file that was not truncated for some classes (G…
Browse files Browse the repository at this point in the history
…H-99616)

Co-authored-by: Łukasz Langa <lukasz@langa.pl>
  • Loading branch information
sobolevn and ambv committed Dec 20, 2022
1 parent cb60b61 commit 44892d4
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 2 deletions.
10 changes: 8 additions & 2 deletions Lib/http/cookiejar.py
Original file line number Diff line number Diff line change
Expand Up @@ -1890,7 +1890,10 @@ def save(self, filename=None, ignore_discard=False, ignore_expires=False):
if self.filename is not None: filename = self.filename
else: raise ValueError(MISSING_FILENAME_TEXT)

with os.fdopen(os.open(filename, os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f:
with os.fdopen(
os.open(filename, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, 0o600),
'w',
) as f:
# There really isn't an LWP Cookies 2.0 format, but this indicates
# that there is extra information in here (domain_dot and
# port_spec) while still being compatible with libwww-perl, I hope.
Expand Down Expand Up @@ -2081,7 +2084,10 @@ def save(self, filename=None, ignore_discard=False, ignore_expires=False):
if self.filename is not None: filename = self.filename
else: raise ValueError(MISSING_FILENAME_TEXT)

with os.fdopen(os.open(filename, os.O_CREAT | os.O_WRONLY, 0o600), 'w') as f:
with os.fdopen(
os.open(filename, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, 0o600),
'w',
) as f:
f.write(NETSCAPE_HEADER_TEXT)
now = time.time()
for cookie in self:
Expand Down
26 changes: 26 additions & 0 deletions Lib/test/test_http_cookiejar.py
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,32 @@ def test_mozilla_filepermissions(self):
finally:
os_helper.unlink(filename)

@unittest.skipIf(mswindows, "windows file permissions are incompatible with file modes")
@os_helper.skip_unless_working_chmod
def test_cookie_files_are_truncated(self):
filename = os_helper.TESTFN
for cookiejar_class in (LWPCookieJar, MozillaCookieJar):
c = cookiejar_class(filename)

req = urllib.request.Request("http://www.acme.com/")
headers = ["Set-Cookie: pll_lang=en; Max-Age=31536000; path=/"]
res = FakeResponse(headers, "http://www.acme.com/")
c.extract_cookies(res, req)
self.assertEqual(len(c), 1)

try:
# Save the first version with contents:
c.save()
# Now, clear cookies and re-save:
c.clear()
c.save()
# Check that file was truncated:
c.load()
finally:
os_helper.unlink(filename)

self.assertEqual(len(c), 0)

def test_bad_magic(self):
# OSErrors (eg. file doesn't exist) are allowed to propagate
filename = os_helper.TESTFN
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix ``.save()`` method for ``LWPCookieJar`` and ``MozillaCookieJar``: saved
file was not truncated on repeated save.

0 comments on commit 44892d4

Please sign in to comment.