restic/internal/fs
Aneesh N b9afdf795e
Some checks failed
Create and publish a Docker image / build-and-push-image (push) Has been cancelled
test / Linux Go 1.24.x (push) Has been cancelled
test / Linux (race) Go 1.25.x (push) Has been cancelled
test / Windows Go 1.25.x (push) Has been cancelled
test / macOS Go 1.25.x (push) Has been cancelled
test / Linux Go 1.25.x (push) Has been cancelled
test / Cross Compile for subset 0/3 (push) Has been cancelled
test / Cross Compile for subset 1/3 (push) Has been cancelled
test / Cross Compile for subset 2/3 (push) Has been cancelled
test / lint (push) Has been cancelled
test / docker (push) Has been cancelled
Create and publish a Docker image / provenance (push) Has been cancelled
test / Analyze results (push) Has been cancelled
Fix: Correctly restore ACL inheritance state (#5465)
* Fix: Correctly restore ACL inheritance state

When restoring a file or directory on Windows, the `IsInherited` property of its Access Control Entries (ACEs) was always being set to `False`, even if the ACEs were inherited in the original backup.

This was caused by the restore process calling the `SetNamedSecurityInfo` API without providing context about the object's inheritance policy. By default, this API applies the provided Discretionary Access Control List (DACL) as an explicit set of permissions, thereby losing the original inheritance state.

This commit fixes the issue by inspecting the `Control` flags of the saved Security Descriptor during restore. Based on whether the `SE_DACL_PROTECTED` flag is present, the code now adds the appropriate `PROTECTED_DACL_SECURITY_INFORMATION` or `UNPROTECTED_DACL_SECURITY_INFORMATION` flag to the `SetNamedSecurityInfo` API call.

By providing this crucial inheritance context, the Windows API can now correctly reconstruct the ACL, ensuring the `IsInherited` status of each ACE is preserved as it was at the time of backup.

* Fix: Correctly restore ACL inheritance flags

This commit resolves an issue where the ACL inheritance state (`IsInherited` property) was not being correctly restored for files and directories on Windows.

The root cause was that the `SECURITY_INFORMATION` flags used in the `SetNamedSecurityInfo` API call contained both the `PROTECTED_DACL_SECURITY_INFORMATION` and `UNPROTECTED_DACL_SECURITY_INFORMATION` flags simultaneously. When faced with this conflicting information, the Windows API defaulted to the more restrictive `PROTECTED` behavior, incorrectly disabling inheritance on restored items.

The fix modifies the `setNamedSecurityInfoHigh` function to first clear all existing inheritance-related flags from the `securityInfo` bitmask. It then adds the single, correct flag (`PROTECTED` or `UNPROTECTED`) based on the `SE_DACL_PROTECTED` control bit from the original, saved Security Descriptor.

This ensures that the API receives unambiguous instructions, allowing it to correctly preserve the inheritance state as it was at the time of backup. The accompanying test case for ACL inheritance now passes with this change.

* Fix inheritance flag handling in low-privilege security descriptor restore

When restoring files without admin privileges, the IsInherited property
of Access Control Entries (ACEs) was not being preserved correctly.
The low-privilege restore path (setNamedSecurityInfoLow) was using a
static PROTECTED_DACL_SECURITY_INFORMATION flag, which always marked
the restored DACL as explicitly set rather than inherited.

This commit updates setNamedSecurityInfoLow to dynamically determine
the correct inheritance flag based on the SE_DACL_PROTECTED control
flag from the original security descriptor, matching the behavior of
the high-privilege path (setNamedSecurityInfoHigh).

Changes:
- Update setNamedSecurityInfoLow to accept control flags parameter
- Add logic to set either PROTECTED_DACL_SECURITY_INFORMATION or
  UNPROTECTED_DACL_SECURITY_INFORMATION based on the original SD
- Add TestRestoreSecurityDescriptorInheritanceLowPrivilege to verify
  inheritance is correctly restored in low-privilege scenarios

This ensures that both admin and non-admin restore operations correctly
preserve the inheritance state of ACLs, maintaining the original
permissions flow on child objects.

Addresses review feedback on PR for issue #5427

* Refactor security flags into separate backup/restore variants

Split highSecurityFlags into highBackupSecurityFlags and
highRestoreSecurityFlags to avoid runtime bitwise operations.
This makes the code cleaner and more maintainable by using
appropriate flags for GET vs SET operations.

Addresses review feedback on PR for issue #5427

---------

Co-authored-by: Aneesh Nireshwalia <anireshw@akamai.com>
2025-11-28 19:22:47 +00:00
..
const.go fs: Add O_NONBLOCK 2018-04-30 15:34:58 +02:00
const_unix.go fs: stricter enforcement to only call readdir on a directory 2024-11-16 12:56:23 +01:00
const_windows.go fs: fix O_NOFOLLOW for metadata handles on Windows 2024-11-16 15:38:56 +01:00
doc.go Moves files 2017-07-23 14:19:13 +02:00
ea_windows.go Remove unnecessary type conversions. 2025-03-22 18:20:30 +00:00
ea_windows_test.go fs: move getVolumePathName function 2024-11-01 19:03:45 +01:00
file.go fs: fix O_NOFOLLOW for metadata handles on Windows 2024-11-16 15:38:56 +01:00
file_unix.go fs: unexport a several windows functions 2024-08-31 18:40:36 +02:00
file_unix_test.go fs: stricter enforcement to only call readdir on a directory 2024-11-16 12:56:23 +01:00
file_windows.go fs: Use backup privileges when reading extended attributes for files too. 2025-11-07 19:31:57 -05:00
file_windows_test.go Add simple test for fs.TempFile on windows 2022-04-09 23:37:58 +02:00
fs_local.go fs: Attempt to enable file system privileges on initialization. 2025-11-07 19:31:59 -05:00
fs_local_test.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
fs_local_unix_test.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
fs_local_vss.go fs: inline ExtendedStat 2024-11-30 16:19:16 +01:00
fs_local_vss_test.go node: report error on xattr retrieval using standard error logging 2025-10-03 18:55:46 +02:00
fs_reader.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
fs_reader_command.go reduce usages of globalOptions variable 2025-10-03 18:22:42 +02:00
fs_reader_command_test.go reduce usages of globalOptions variable 2025-10-03 18:22:42 +02:00
fs_reader_test.go Fix linter warnings 2025-09-21 22:24:15 +02:00
fs_track.go fs / archiver: convert to handle based interface 2024-11-16 12:56:23 +01:00
interface.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
mknod_unix.go fs: Include filename in mknod errors 2024-10-05 10:56:39 +02:00
node.go feat(internal/fs/node): Restore ownership by name 2025-11-16 16:40:58 +01:00
node_freebsd.go fs: Include filename in mknod errors 2024-10-05 10:56:39 +02:00
node_linux.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
node_linux_test.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
node_noxattr.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
node_test.go feat(internal/fs/node): Restore ownership by name 2025-11-16 16:40:58 +01:00
node_unix.go feat(internal/fs/node): Restore ownership by name 2025-11-16 16:40:58 +01:00
node_unix_notlinux.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
node_unix_test.go feat(internal/fs/node): Restore ownership by name 2025-11-16 16:40:58 +01:00
node_windows.go feat(internal/fs/node): Restore ownership by name 2025-11-16 16:40:58 +01:00
node_windows_test.go Fix: Correctly restore ACL inheritance state (#5465) 2025-11-28 19:22:47 +00:00
node_xattr.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
node_xattr_all_test.go data: split node and snapshot code from restic package 2025-10-03 19:10:39 +02:00
node_xattr_test.go Enable xattr support, on NetBSD 10+ 2024-12-18 16:52:44 +00:00
path_prefix.go fs: Make HasPathPrefix work with relative paths 2018-01-05 17:38:52 +01:00
path_prefix_test.go fs: Make HasPathPrefix work with relative paths 2018-01-05 17:38:52 +01:00
preallocate_darwin.go Move PreallocateFile to fs package 2023-06-09 11:49:06 +03:00
preallocate_linux.go fs: retry preallocate on Linux if interrupted by signal 2024-09-07 16:39:40 +02:00
preallocate_other.go Move PreallocateFile to fs package 2023-06-09 11:49:06 +03:00
preallocate_test.go Move PreallocateFile to fs package 2023-06-09 11:49:06 +03:00
priv.go fs: Attempt to enable file system privileges on initialization. 2025-11-07 19:31:59 -05:00
priv_windows.go fs: Attempt to enable file system privileges on initialization. 2025-11-07 19:31:59 -05:00
priv_windows_test.go fs: Clarified documentation 2025-11-16 11:53:13 -05:00
sd_windows.go Fix: Correctly restore ACL inheritance state (#5465) 2025-11-28 19:22:47 +00:00
sd_windows_test.go fs: unexport a several windows functions 2024-08-31 18:40:36 +02:00
sd_windows_test_helpers.go fs: unexport a several windows functions 2024-08-31 18:40:36 +02:00
setflags_linux.go Set O_NOATIME flag on Linux 2022-02-06 15:00:34 +01:00
setflags_linux_test.go minimize usage of internal/fs in tests 2024-08-31 18:20:41 +02:00
setflags_other.go Rename unused parameters to '_'. 2025-03-22 18:20:30 +00:00
stat.go feat(backup): add possibility to exclude macOS cloud-only files 2025-10-04 19:22:51 +02:00
stat_bsd.go feat(backup): add possibility to exclude macOS cloud-only files 2025-10-04 19:22:51 +02:00
stat_darwin.go feat(backup): add possibility to exclude macOS cloud-only files 2025-10-04 19:22:51 +02:00
stat_darwin_test.go feat(backup): add possibility to exclude macOS cloud-only files 2025-10-04 19:22:51 +02:00
stat_test.go feat(backup): add possibility to exclude macOS cloud-only files 2025-10-04 19:22:51 +02:00
stat_unix.go backup: allow excluding online-only cloud files 2025-01-13 21:11:23 +01:00
stat_windows.go backup: allow excluding online-only cloud files 2025-01-13 21:11:23 +01:00
stat_windows_test.go backup: allow excluding online-only cloud files 2025-01-13 21:11:23 +01:00
vss.go fs: unexport a several windows functions 2024-08-31 18:40:36 +02:00
vss_windows.go Remove import aliases that match package name. 2025-03-22 18:20:30 +00:00