From 65e5969c13cf8bf66be3a910d8984f2a52620309 Mon Sep 17 00:00:00 2001 From: RRosio Date: Mon, 14 Apr 2025 23:56:37 -0700 Subject: [PATCH 1/4] check file permissions before making tmp file --- jupyter_server/services/contents/fileio.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/jupyter_server/services/contents/fileio.py b/jupyter_server/services/contents/fileio.py index 5799b57497..2ac7d3602f 100644 --- a/jupyter_server/services/contents/fileio.py +++ b/jupyter_server/services/contents/fileio.py @@ -39,6 +39,12 @@ def copy2_safe(src, dst, log=None): like shutil.copy2, but log errors in copystat instead of raising """ + # if src file is not writable, avoid creating a back-up + if not os.access(src, os.W_OK): + if log: + log.debug("Source file is not writeable: ", src) + raise PermissionError(errno.EACCES, f"File is not writable: {src}") + shutil.copyfile(src, dst) try: shutil.copystat(src, dst) @@ -52,6 +58,11 @@ async def async_copy2_safe(src, dst, log=None): like shutil.copy2, but log errors in copystat instead of raising """ + if not os.access(src, os.W_OK): + if log: + log.debug("Source file is not writeable: ", src) + raise PermissionError(errno.EACCES, f"File is not writable: {src}") + await run_sync(shutil.copyfile, src, dst) try: await run_sync(shutil.copystat, src, dst) From d8e0d13c1ba119df58a195249927876916e553a0 Mon Sep 17 00:00:00 2001 From: RRosio Date: Sun, 20 Apr 2025 09:52:46 -0700 Subject: [PATCH 2/4] fix added logs --- jupyter_server/services/contents/fileio.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jupyter_server/services/contents/fileio.py b/jupyter_server/services/contents/fileio.py index 2ac7d3602f..ef72e207bb 100644 --- a/jupyter_server/services/contents/fileio.py +++ b/jupyter_server/services/contents/fileio.py @@ -42,7 +42,7 @@ def copy2_safe(src, dst, log=None): # if src file is not writable, avoid creating a back-up if not os.access(src, os.W_OK): if log: - log.debug("Source file is not writeable: ", src) + log.debug("Source file, %s, is not writeable", src, exc_info=True) raise PermissionError(errno.EACCES, f"File is not writable: {src}") shutil.copyfile(src, dst) @@ -60,7 +60,7 @@ async def async_copy2_safe(src, dst, log=None): """ if not os.access(src, os.W_OK): if log: - log.debug("Source file is not writeable: ", src) + log.debug("Source file, %s, is not writeable", src, exc_info=True) raise PermissionError(errno.EACCES, f"File is not writable: {src}") await run_sync(shutil.copyfile, src, dst) From 9bedfb5cdfb1ef318c879a5b43aad584151bcaf7 Mon Sep 17 00:00:00 2001 From: Rosio Date: Thu, 24 Apr 2025 09:09:25 -0700 Subject: [PATCH 3/4] Update jupyter_server/services/contents/fileio.py Co-authored-by: Afshin Taylor Darian --- jupyter_server/services/contents/fileio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyter_server/services/contents/fileio.py b/jupyter_server/services/contents/fileio.py index ef72e207bb..a6cb424ac0 100644 --- a/jupyter_server/services/contents/fileio.py +++ b/jupyter_server/services/contents/fileio.py @@ -42,7 +42,7 @@ def copy2_safe(src, dst, log=None): # if src file is not writable, avoid creating a back-up if not os.access(src, os.W_OK): if log: - log.debug("Source file, %s, is not writeable", src, exc_info=True) + log.debug("Source file, %s, is not writable", src, exc_info=True) raise PermissionError(errno.EACCES, f"File is not writable: {src}") shutil.copyfile(src, dst) From 8a76a48991803160acfcc309061ae9f816cf3e85 Mon Sep 17 00:00:00 2001 From: Rosio Date: Thu, 24 Apr 2025 09:09:30 -0700 Subject: [PATCH 4/4] Update jupyter_server/services/contents/fileio.py Co-authored-by: Afshin Taylor Darian --- jupyter_server/services/contents/fileio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jupyter_server/services/contents/fileio.py b/jupyter_server/services/contents/fileio.py index a6cb424ac0..6afe6b6524 100644 --- a/jupyter_server/services/contents/fileio.py +++ b/jupyter_server/services/contents/fileio.py @@ -60,7 +60,7 @@ async def async_copy2_safe(src, dst, log=None): """ if not os.access(src, os.W_OK): if log: - log.debug("Source file, %s, is not writeable", src, exc_info=True) + log.debug("Source file, %s, is not writable", src, exc_info=True) raise PermissionError(errno.EACCES, f"File is not writable: {src}") await run_sync(shutil.copyfile, src, dst)