Skip to content

Commit e5cf469

Browse files
committed
[IO-751] When deleting symlinks, File/PathUtils.deleteDirectory()
changes file permissions of the target. POSIX: Deleting a file requires write and execute on the parent. Listing a file also requires reading.
1 parent 7ce5d73 commit e5cf469

1 file changed

Lines changed: 14 additions & 12 deletions

File tree

src/main/java/org/apache/commons/io/file/PathUtils.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,7 +1319,7 @@ public static Path setReadOnly(final Path path, final boolean readOnly, final Li
13191319
if (readOnly) {
13201320
// RO
13211321
// File, then parent dir (if any).
1322-
final boolean set = setPosixReadOnly(path, readOnly, linkOptions);
1322+
final boolean set = setPosixReadOnlyFile(path, readOnly, linkOptions);
13231323
setPosixDeletePermissions(path.getParent(), false, linkOptions);
13241324
if (set) {
13251325
return path;
@@ -1335,17 +1335,17 @@ public static Path setReadOnly(final Path path, final boolean readOnly, final Li
13351335
throw new IOException(String.format("No DosFileAttributeView or PosixFileAttributeView for '%s' (linkOptions=%s)", path, Arrays.toString(linkOptions)));
13361336
}
13371337

1338-
private static boolean setPosixReadOnly(final Path path, final boolean readOnly, final LinkOption... linkOptions) throws IOException {
1338+
private static boolean setPosixReadOnlyFile(final Path path, final boolean readOnly, final LinkOption... linkOptions) throws IOException {
13391339
final PosixFileAttributeView posixFileAttributeView = getPosixFileAttributeView(path, linkOptions);
13401340
if (posixFileAttributeView != null) {
13411341
// Not Windows 10
13421342
final PosixFileAttributes readAttributes = posixFileAttributeView.readAttributes();
13431343
final Set<PosixFilePermission> permissions = readAttributes.permissions();
13441344
// @formatter:off
1345-
final List<PosixFilePermission> executePermissions = Arrays.asList(
1346-
PosixFilePermission.OWNER_EXECUTE
1347-
//PosixFilePermission.GROUP_EXECUTE,
1348-
//PosixFilePermission.OTHERS_EXECUTE
1345+
final List<PosixFilePermission> readPermissions = Arrays.asList(
1346+
PosixFilePermission.OWNER_READ
1347+
//PosixFilePermission.GROUP_READ,
1348+
//PosixFilePermission.OTHERS_READ
13491349
);
13501350
final List<PosixFilePermission> writePermissions = Arrays.asList(
13511351
PosixFilePermission.OWNER_WRITE
@@ -1354,10 +1354,12 @@ private static boolean setPosixReadOnly(final Path path, final boolean readOnly,
13541354
);
13551355
// @formatter:on
13561356
if (readOnly) {
1357-
permissions.removeAll(executePermissions);
1357+
// RO: We can read, we cannot write.
1358+
permissions.addAll(readPermissions);
13581359
permissions.removeAll(writePermissions);
13591360
} else {
1360-
permissions.addAll(executePermissions);
1361+
// Not RO: We can read, we can write.
1362+
permissions.addAll(readPermissions);
13611363
permissions.addAll(writePermissions);
13621364
}
13631365
Files.setPosixFilePermissions(path, permissions);
@@ -1416,13 +1418,13 @@ private static boolean setPosixPermissions(final Path path, final boolean addPer
14161418
if (path != null) {
14171419
final PosixFileAttributeView posixFileAttributeView = getPosixFileAttributeView(path, linkOptions);
14181420
if (posixFileAttributeView != null) {
1419-
final Set<PosixFilePermission> currentPermissions = posixFileAttributeView.readAttributes().permissions();
1421+
final Set<PosixFilePermission> permissions = posixFileAttributeView.readAttributes().permissions();
14201422
if (addPermissions) {
1421-
currentPermissions.addAll(updatePermissions);
1423+
permissions.addAll(updatePermissions);
14221424
} else {
1423-
currentPermissions.removeAll(updatePermissions);
1425+
permissions.removeAll(updatePermissions);
14241426
}
1425-
Files.setPosixFilePermissions(path, currentPermissions);
1427+
Files.setPosixFilePermissions(path, permissions);
14261428
return true;
14271429
}
14281430
}

0 commit comments

Comments
 (0)