Eryk Sun <eryk...@gmail.com> added the comment:

In Windows, I wouldn't expect shutil.copy2 to preserve the owner and ACLs. They 
change whenever a file gets copied via CopyFileExW [1]. Keeping them exactly as 
in the source file generally requires a privileged backup and restore 
operation, such as via BackupRead [2] and BackupWrite [3]. Unless the caller 
has SeRestorePrivilege, the owner can only be set to one of the SIDs in the 
caller's groups that are flagged as SE_GROUP_OWNER, which is usually just the 
user's SID or, for an admin, the Administrators SID. Also, for copying the 
system ACL, adding or removing audit and scoped-policy-identifier entries 
requires SeSecurityPrivilege.

CopyFileExW copies all data streams in a file, which is typically just the 
anonymous data stream, but an NTFS/ReFS file can have multiple named data 
streams. For metadata, it copies the change and modify timestamps (but not the 
create and access timestamps), file attributes (readonly, hidden, system, 
archive, temporary, not-content-indexed), extended attributes, and resource 
attributes [4]. 

Separating this functionality into shutil.copy and shutil.copystat would be 
fairly involved. These functions could be left as is and just document the 
discrepancy in shutil.copy2, or new functions could be implemented in the nt or 
_winapi module to list the data streams in a file and get/set file attributes 
and system resource attributes. Supporting extended attributes would require 
the native NT API, and for little benefit since they're mostly used for 
"$Kernel." prefixed attributes that can only be set by kernel-mode callers such 
as drivers.

---

[1]: 
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-copyfileexw
[2]: 
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-backupread
[3]: 
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-backupwrite
[4]: Resource attributes are like extended attributes, but a named resource 
attribute is a tuple of one or more items with a given data type (integer, 
string, or bytes) that's stored as an entry in the file's system ACL. Keeping 
them in the SACL allows conditional access/audit entries to reference them in 
an access check or access audit. Unlike audit entries in the SACL, reading and 
writing resource attributes doesn't require SeSecurityPrivilege.

----------
nosy: +eryksun

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue30044>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to