Skip to content

Commit

Permalink
cmd/fscrypt: fix up path formatting in ErrDirNotEmpty suggestion (#229)
Browse files Browse the repository at this point in the history
Use %q, in case the paths contain whitespace.  Also clean the directory
path to remove trailing slashes before appending the ".new" suffix.
  • Loading branch information
ebiggers committed May 15, 2020
1 parent bc9f5e5 commit 636698b
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 13 deletions.
34 changes: 28 additions & 6 deletions cli-tests/t_encrypt.out
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,34 @@ ext4 filesystem "MNT" has 0 protectors and 0 policies
Files cannot be encrypted in-place. Instead, encrypt a new directory, copy the
files into it, and securely delete the original directory. For example:

mkdir MNT/dir.new
fscrypt encrypt MNT/dir.new
cp -a -T MNT/dir MNT/dir.new
find MNT/dir -type f -print0 | xargs -0 shred -n1 --remove=unlink
rm -rf MNT/dir
mv MNT/dir.new MNT/dir
mkdir "MNT/dir.new"
fscrypt encrypt "MNT/dir.new"
cp -a -T "MNT/dir" "MNT/dir.new"
find "MNT/dir" -type f -print0 | xargs -0 shred -n1 --remove=unlink
rm -rf "MNT/dir"
mv "MNT/dir.new" "MNT/dir"

Caution: due to the nature of modern storage devices and filesystems, the
original data may still be recoverable from disk. It's much better to encrypt
your files from the start.
ext4 filesystem "MNT" has 0 protectors and 0 policies

[ERROR] fscrypt status: file or directory "MNT/dir" is not
encrypted

# => with trailing slash
[ERROR] fscrypt encrypt: Directory "MNT/dir/" cannot be
encrypted because it is non-empty.

Files cannot be encrypted in-place. Instead, encrypt a new directory, copy the
files into it, and securely delete the original directory. For example:

mkdir "MNT/dir.new"
fscrypt encrypt "MNT/dir.new"
cp -a -T "MNT/dir" "MNT/dir.new"
find "MNT/dir" -type f -print0 | xargs -0 shred -n1 --remove=unlink
rm -rf "MNT/dir"
mv "MNT/dir.new" "MNT/dir"

Caution: due to the nature of modern storage devices and filesystems, the
original data may still be recoverable from disk. It's much better to encrypt
Expand Down
3 changes: 3 additions & 0 deletions cli-tests/t_encrypt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ begin "Try to encrypt a nonempty directory"
touch "$dir/file"
_expect_failure "echo hunter2 | fscrypt encrypt --quiet '$dir'"
show_status false
_print_header "=> with trailing slash"
_expect_failure "echo hunter2 | fscrypt encrypt --quiet '$dir/'"
show_status false

begin "Encrypt a directory as non-root user"
chown "$TEST_USER" "$dir"
Expand Down
14 changes: 7 additions & 7 deletions cmd/fscrypt/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,18 +179,18 @@ func getErrorSuggestions(err error) string {
> fscrypt lock %q`, e.DirPath, e.DirPath)
case *ErrDirNotEmpty:
dir := e.DirPath
dir := filepath.Clean(e.DirPath)
newDir := dir + ".new"
return fmt.Sprintf(`Files cannot be encrypted in-place. Instead,
encrypt a new directory, copy the files into it, and securely
delete the original directory. For example:
> mkdir %s
> fscrypt encrypt %s
> cp -a -T %s %s
> find %s -type f -print0 | xargs -0 shred -n1 --remove=unlink
> rm -rf %s
> mv %s %s
> mkdir %q
> fscrypt encrypt %q
> cp -a -T %q %q
> find %q -type f -print0 | xargs -0 shred -n1 --remove=unlink
> rm -rf %q
> mv %q %q
Caution: due to the nature of modern storage devices and filesystems,
the original data may still be recoverable from disk. It's much better
Expand Down

0 comments on commit 636698b

Please sign in to comment.