From 0c1d6f446c32765dd0df9b4f91046c5b95939c29 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 3 Jul 2024 15:40:09 -0400 Subject: [PATCH 1/2] GH-9294: Set permissions to target file on rename Fixes: #9294 When the `deleteSourceFiles` property of `FileWritingMessageHandler` is `true`, the `chmod` is not set on the target file. * Fix `FileWritingMessageHandler.handleFileMessage()` logic to `setPermissions(resultFile)` after `move` operation **Auto-cherry-pick to `6.3.x` & `6.2.x`** --- .../file/FileWritingMessageHandler.java | 1 + .../file/FileWritingMessageHandlerTests.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java b/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java index 6568e2656db..0a24b651eb2 100644 --- a/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java +++ b/spring-integration-file/src/main/java/org/springframework/integration/file/FileWritingMessageHandler.java @@ -629,6 +629,7 @@ private File handleFileMessage(File sourceFile, File tempFile, File resultFile, if (!FileExistsMode.APPEND.equals(this.fileExistsMode) && this.deleteSourceFiles) { rename(sourceFile, resultFile); + setPermissions(resultFile); return resultFile; } else { diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java index b006fa0336f..33b621a89a7 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java @@ -36,6 +36,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; import org.junit.jupiter.api.io.TempDir; import org.springframework.beans.DirectFieldAccessor; @@ -301,6 +303,23 @@ public void deleteFilesTrueWithFilePayload() throws Exception { assertThat(sourceFile.exists()).isFalse(); } + @Test + @DisabledOnOs(OS.WINDOWS) + public void deleteFilesWithChmod() throws Exception { + QueueChannel output = new QueueChannel(); + handler.setDeleteSourceFiles(true); + handler.setOutputChannel(output); + handler.setChmod(0444); + Message message = MessageBuilder.withPayload(sourceFile).build(); + handler.handleMessage(message); + Message result = output.receive(0); + assertFileContentIsMatching(result); + File resultFile = messageToFile(result); + Set posixFilePermissions = Files.getPosixFilePermissions(resultFile.toPath()); + assertThat(posixFilePermissions).containsOnly(PosixFilePermission.OWNER_READ); + assertThat(sourceFile.exists()).isFalse(); + } + @Test public void deleteSourceFileWithStringPayloadAndFileInstanceHeader() throws Exception { QueueChannel output = new QueueChannel(); From dfbdd7f9ce3b971a28fa4bdf9ff2ad42e2ddfc0b Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Wed, 3 Jul 2024 15:46:50 -0400 Subject: [PATCH 2/2] * Set only `OWNER_READ` permission for file in unit test --- .../integration/file/FileWritingMessageHandlerTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java b/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java index 33b621a89a7..a6492c3569a 100644 --- a/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java +++ b/spring-integration-file/src/test/java/org/springframework/integration/file/FileWritingMessageHandlerTests.java @@ -309,7 +309,7 @@ public void deleteFilesWithChmod() throws Exception { QueueChannel output = new QueueChannel(); handler.setDeleteSourceFiles(true); handler.setOutputChannel(output); - handler.setChmod(0444); + handler.setChmod(0400); Message message = MessageBuilder.withPayload(sourceFile).build(); handler.handleMessage(message); Message result = output.receive(0);