This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 60cc46c CAMEL-17037: added for sftp producer chmodDirectory
functionality (#6199)
60cc46c is described below
commit 60cc46ccb97758227cf2742be0cb9e453725a042
Author: Michael R <[email protected]>
AuthorDate: Mon Oct 4 06:55:06 2021 +0200
CAMEL-17037: added for sftp producer chmodDirectory functionality (#6199)
* CAMEL-17037: added for sftp producer chmodDirectory functionality
* added unittest
* fixed typo in unittest
---
.../component/file/remote/SftpConfiguration.java | 13 +++++++
.../camel/component/file/remote/SftpEndpoint.java | 2 +-
.../component/file/remote/SftpOperations.java | 24 ++++++++++++
.../sftp/integration/SftpChmodDirectoryIT.java | 43 ++++++++++++++++++++++
4 files changed, 81 insertions(+), 1 deletion(-)
diff --git
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConfiguration.java
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConfiguration.java
index 9183e72..e1643b5 100644
---
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConfiguration.java
+++
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConfiguration.java
@@ -75,6 +75,8 @@ public class SftpConfiguration extends
RemoteFileConfiguration {
private boolean existDirCheckUsingLs = true;
@UriParam(label = "security")
private String keyExchangeProtocols;
+ @UriParam(label = "producer, advanced")
+ private String chmodDirectory;
public SftpConfiguration() {
setProtocol("sftp");
@@ -250,6 +252,17 @@ public class SftpConfiguration extends
RemoteFileConfiguration {
}
/**
+ * Allows you to set chmod during path creation. For example chmod=640.
+ */
+ public void setChmodDirectory(String chmodDirectory) {
+ this.chmodDirectory = chmodDirectory;
+ }
+
+ public String getChmodDirectory() {
+ return chmodDirectory;
+ }
+
+ /**
* Set a comma separated list of ciphers that will be used in order of
preference. Possible cipher names are defined
* by JCraft JSCH. Some examples include:
*
aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc. If
not specified the default list
diff --git
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
index b079dcc..ba1b7b4 100644
---
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
+++
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpEndpoint.java
@@ -34,7 +34,7 @@ import org.apache.camel.spi.UriParam;
syntax = "sftp:host:port/directoryName", label = "file")
@Metadata(excludeProperties = "appendChars,bufferSize,siteCommand,"
+
"directoryMustExist,extendedAttributes,probeContentType,startingDirectoryMustExist,"
- +
"startingDirectoryMustHaveAccess,chmodDirectory,forceWrites,copyAndDeleteOnRenameFail,"
+ +
"startingDirectoryMustHaveAccess,forceWrites,copyAndDeleteOnRenameFail,"
+ "renameUsingCopy")
public class SftpEndpoint extends RemoteFileEndpoint<SftpRemoteFile> {
diff --git
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
index ba31d31..1bf3ce7 100644
---
a/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
+++
b/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpOperations.java
@@ -553,6 +553,9 @@ public class SftpOperations implements
RemoteFileOperations<SftpRemoteFile> {
// so create the folder one by one
success = buildDirectoryChunks(directory);
}
+
+ // after creating directory, we may set chmod on the file
+ chmodOfDirectory(directory);
}
} catch (SftpException e) {
throw new GenericFileOperationFailedException("Cannot build
directory: " + directory, e);
@@ -592,6 +595,9 @@ public class SftpOperations implements
RemoteFileOperations<SftpRemoteFile> {
} catch (SftpException e) {
// ignore keep trying to create the rest of the path
}
+
+ // after creating directory, we may set chmod on the file
+ chmodOfDirectory(directory);
}
}
@@ -1199,4 +1205,22 @@ public class SftpOperations implements
RemoteFileOperations<SftpRemoteFile> {
exchange.getIn().setHeader(FtpConstants.FTP_REPLY_STRING,
sftpException.getMessage());
}
}
+
+ /**
+ * Helper method which sets the path permissions
+ */
+ private void chmodOfDirectory(String directory) {
+
+ String chmodDirectory =
endpoint.getConfiguration().getChmodDirectory();
+ if (ObjectHelper.isNotEmpty(chmodDirectory)) {
+ LOG.trace("Setting permission: {} on directory: {}",
chmodDirectory, directory);
+ // parse to int using 8bit mode
+ int permissions = Integer.parseInt(chmodDirectory, 8);
+ try {
+ channel.chmod(permissions, directory);
+ } catch (SftpException e) {
+ throw new GenericFileOperationFailedException("Cannot set
permission on directory: " + directory, e);
+ }
+ }
+ }
}
diff --git
a/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/integration/SftpChmodDirectoryIT.java
b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/integration/SftpChmodDirectoryIT.java
new file mode 100644
index 0000000..8242db1
--- /dev/null
+++
b/components/camel-ftp/src/test/java/org/apache/camel/component/file/remote/sftp/integration/SftpChmodDirectoryIT.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.file.remote.sftp.integration;
+
+import java.io.File;
+
+import org.apache.camel.Exchange;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledIf;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+@EnabledIf(value =
"org.apache.camel.component.file.remote.services.SftpEmbeddedService#hasRequiredAlgorithms")
+public class SftpChmodDirectoryIT extends SftpServerTestSupport {
+
+ @Test
+ public void testSftpChmodDirectoryWriteable() {
+ template.sendBodyAndHeader(
+ "sftp://localhost:{{ftp.server.port}}/{{ftp.root.dir}}/folder"
+
+
"?username=admin&password=admin&chmod=777&chmodDirectory=770",
+ "Hello World", Exchange.FILE_NAME,
+ "hello.txt");
+
+ File path = ftpFile("folder/hello.txt").getParent().toFile();
+ assertTrue(path.canRead(), "Path should have permission readable: " +
path);
+ assertTrue(path.canWrite(), "Path should have permission writeable: "
+ path);
+ }
+
+}