mirror of
https://github.com/octoleo/restic.git
synced 2024-11-23 21:27:34 +00:00
restore: fix file encryption on windows
The assumption that a file is not readonly is no longer valid.
This commit is contained in:
parent
8aa3ab6ef8
commit
8733cd21b9
@ -275,17 +275,20 @@ func fixEncryptionAttribute(path string, attrs *uint32, pathPointer *uint16) (er
|
|||||||
// File should be encrypted.
|
// File should be encrypted.
|
||||||
err = encryptFile(pathPointer)
|
err = encryptFile(pathPointer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if fs.IsAccessDenied(err) {
|
if fs.IsAccessDenied(err) || errors.Is(err, windows.ERROR_FILE_READ_ONLY) {
|
||||||
// If existing file already has readonly or system flag, encrypt file call fails.
|
// If existing file already has readonly or system flag, encrypt file call fails.
|
||||||
// We have already cleared readonly flag, clearing system flag if needed.
|
|
||||||
// The readonly and system flags will be set again at the end of this func if they are needed.
|
// The readonly and system flags will be set again at the end of this func if they are needed.
|
||||||
|
err = fs.ResetPermissions(path)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to encrypt file: failed to reset permissions: %s : %v", path, err)
|
||||||
|
}
|
||||||
err = fs.ClearSystem(path)
|
err = fs.ClearSystem(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to encrypt file: failed to clear system flag: %s : %v", path, err)
|
return fmt.Errorf("failed to encrypt file: failed to clear system flag: %s : %v", path, err)
|
||||||
}
|
}
|
||||||
err = encryptFile(pathPointer)
|
err = encryptFile(pathPointer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to encrypt file: %s : %v", path, err)
|
return fmt.Errorf("failed retry to encrypt file: %s : %v", path, err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("failed to encrypt file: %s : %v", path, err)
|
return fmt.Errorf("failed to encrypt file: %s : %v", path, err)
|
||||||
@ -300,17 +303,20 @@ func fixEncryptionAttribute(path string, attrs *uint32, pathPointer *uint16) (er
|
|||||||
// File should not be encrypted, but its already encrypted. Decrypt it.
|
// File should not be encrypted, but its already encrypted. Decrypt it.
|
||||||
err = decryptFile(pathPointer)
|
err = decryptFile(pathPointer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if fs.IsAccessDenied(err) {
|
if fs.IsAccessDenied(err) || errors.Is(err, windows.ERROR_FILE_READ_ONLY) {
|
||||||
// If existing file already has readonly or system flag, decrypt file call fails.
|
// If existing file already has readonly or system flag, decrypt file call fails.
|
||||||
// We have already cleared readonly flag, clearing system flag if needed.
|
|
||||||
// The readonly and system flags will be set again after this func if they are needed.
|
// The readonly and system flags will be set again after this func if they are needed.
|
||||||
|
err = fs.ResetPermissions(path)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to encrypt file: failed to reset permissions: %s : %v", path, err)
|
||||||
|
}
|
||||||
err = fs.ClearSystem(path)
|
err = fs.ClearSystem(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to decrypt file: failed to clear system flag: %s : %v", path, err)
|
return fmt.Errorf("failed to decrypt file: failed to clear system flag: %s : %v", path, err)
|
||||||
}
|
}
|
||||||
err = decryptFile(pathPointer)
|
err = decryptFile(pathPointer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to decrypt file: %s : %v", path, err)
|
return fmt.Errorf("failed retry to decrypt file: %s : %v", path, err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return fmt.Errorf("failed to decrypt file: %s : %v", path, err)
|
return fmt.Errorf("failed to decrypt file: %s : %v", path, err)
|
||||||
|
Loading…
Reference in New Issue
Block a user