backup: fix reading xattrs on Windows for root disks as regular user
Unprivileged users cannot open the root disks with write permissions for xattrs. Thus, only request read permissions for reading the xattrs.
This commit is contained in:
parent
20a6c526e5
commit
c01b655229
2 changed files with 10 additions and 7 deletions
|
@ -105,17 +105,20 @@ func ClearAttribute(path string, attribute uint32) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenHandleForEA return a file handle for file or dir for setting/getting EAs
|
// OpenHandleForEA return a file handle for file or dir for setting/getting EAs
|
||||||
func OpenHandleForEA(nodeType, path string) (handle windows.Handle, err error) {
|
func OpenHandleForEA(nodeType, path string, writeAccess bool) (handle windows.Handle, err error) {
|
||||||
path = fixpath(path)
|
path = fixpath(path)
|
||||||
|
fileAccess := windows.FILE_READ_EA
|
||||||
|
if writeAccess {
|
||||||
|
fileAccess = fileAccess | windows.FILE_WRITE_EA
|
||||||
|
}
|
||||||
|
|
||||||
switch nodeType {
|
switch nodeType {
|
||||||
case "file":
|
case "file":
|
||||||
utf16Path := windows.StringToUTF16Ptr(path)
|
utf16Path := windows.StringToUTF16Ptr(path)
|
||||||
fileAccessRightReadWriteEA := (0x8 | 0x10)
|
handle, err = windows.CreateFile(utf16Path, uint32(fileAccess), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL, 0)
|
||||||
handle, err = windows.CreateFile(utf16Path, uint32(fileAccessRightReadWriteEA), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL, 0)
|
|
||||||
case "dir":
|
case "dir":
|
||||||
utf16Path := windows.StringToUTF16Ptr(path)
|
utf16Path := windows.StringToUTF16Ptr(path)
|
||||||
fileAccessRightReadWriteEA := (0x8 | 0x10)
|
handle, err = windows.CreateFile(utf16Path, uint32(fileAccess), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL|windows.FILE_FLAG_BACKUP_SEMANTICS, 0)
|
||||||
handle, err = windows.CreateFile(utf16Path, uint32(fileAccessRightReadWriteEA), 0, nil, windows.OPEN_EXISTING, windows.FILE_ATTRIBUTE_NORMAL|windows.FILE_FLAG_BACKUP_SEMANTICS, 0)
|
|
||||||
default:
|
default:
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,7 +88,7 @@ func (node Node) restoreExtendedAttributes(path string) (err error) {
|
||||||
// fill extended attributes in the node. This also includes the Generic attributes for windows.
|
// fill extended attributes in the node. This also includes the Generic attributes for windows.
|
||||||
func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) {
|
func (node *Node) fillExtendedAttributes(path string, _ bool) (err error) {
|
||||||
var fileHandle windows.Handle
|
var fileHandle windows.Handle
|
||||||
if fileHandle, err = fs.OpenHandleForEA(node.Type, path); fileHandle == 0 {
|
if fileHandle, err = fs.OpenHandleForEA(node.Type, path, false); fileHandle == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -130,7 +130,7 @@ func closeFileHandle(fileHandle windows.Handle, path string) {
|
||||||
// The Windows API requires setting of all the Extended Attributes in one call.
|
// The Windows API requires setting of all the Extended Attributes in one call.
|
||||||
func restoreExtendedAttributes(nodeType, path string, eas []fs.ExtendedAttribute) (err error) {
|
func restoreExtendedAttributes(nodeType, path string, eas []fs.ExtendedAttribute) (err error) {
|
||||||
var fileHandle windows.Handle
|
var fileHandle windows.Handle
|
||||||
if fileHandle, err = fs.OpenHandleForEA(nodeType, path); fileHandle == 0 {
|
if fileHandle, err = fs.OpenHandleForEA(nodeType, path, true); fileHandle == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in a new issue