diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchSFTP.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchSFTP.java index 79eb1e617aea..44ac18d2e7b7 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchSFTP.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchSFTP.java @@ -66,6 +66,10 @@ protected List getSupportedPropertyDescriptors() { properties.add(SFTPTransfer.HOST_KEY_FILE); properties.add(SFTPTransfer.STRICT_HOST_KEY_CHECKING); properties.add(SFTPTransfer.USE_COMPRESSION); + properties.add(SFTPTransfer.PROXY_HOST); + properties.add(SFTPTransfer.PROXY_PORT); + properties.add(SFTPTransfer.PROXY_USERNAME); + properties.add(SFTPTransfer.PROXY_PASSWORD); return properties; } diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/GetSFTP.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/GetSFTP.java index e155019eb776..3108ded249cb 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/GetSFTP.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/GetSFTP.java @@ -81,6 +81,10 @@ protected void init(final ProcessorInitializationContext context) { properties.add(SFTPTransfer.USE_KEEPALIVE_ON_TIMEOUT); properties.add(SFTPTransfer.USE_COMPRESSION); properties.add(SFTPTransfer.USE_NATURAL_ORDERING); + properties.add(SFTPTransfer.PROXY_HOST); + properties.add(SFTPTransfer.PROXY_PORT); + properties.add(SFTPTransfer.PROXY_USERNAME); + properties.add(SFTPTransfer.PROXY_PASSWORD); this.properties = Collections.unmodifiableList(properties); } diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListSFTP.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListSFTP.java index cb5a7e75e79e..d0c592bf3dde 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListSFTP.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListSFTP.java @@ -82,6 +82,10 @@ protected List getSupportedPropertyDescriptors() { properties.add(SFTPTransfer.CONNECTION_TIMEOUT); properties.add(SFTPTransfer.DATA_TIMEOUT); properties.add(SFTPTransfer.USE_KEEPALIVE_ON_TIMEOUT); + properties.add(SFTPTransfer.PROXY_HOST); + properties.add(SFTPTransfer.PROXY_PORT); + properties.add(SFTPTransfer.PROXY_USERNAME); + properties.add(SFTPTransfer.PROXY_PASSWORD); return properties; } diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSFTP.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSFTP.java index 48cfc269e71f..6c91ef3410e9 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSFTP.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSFTP.java @@ -69,6 +69,10 @@ protected void init(final ProcessorInitializationContext context) { properties.add(SFTPTransfer.STRICT_HOST_KEY_CHECKING); properties.add(SFTPTransfer.USE_KEEPALIVE_ON_TIMEOUT); properties.add(SFTPTransfer.USE_COMPRESSION); + properties.add(SFTPTransfer.PROXY_HOST); + properties.add(SFTPTransfer.PROXY_PORT); + properties.add(SFTPTransfer.PROXY_USERNAME); + properties.add(SFTPTransfer.PROXY_PASSWORD); this.properties = Collections.unmodifiableList(properties); } diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java index a6a9e4b70b9c..31c4c766f707 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java @@ -46,6 +46,7 @@ import com.jcraft.jsch.ChannelSftp.LsEntrySelector; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.ProxyHTTP; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; @@ -92,6 +93,39 @@ public class SFTPTransfer implements FileTransfer { .defaultValue("true") .required(true) .build(); + public static final PropertyDescriptor PROXY_HOST = new PropertyDescriptor.Builder() + .name("PROXY_HOST") + .displayName("Proxy Host") + .description("The fully qualified hostname or IP address of the proxy server") + .expressionLanguageSupported(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .build(); + public static final PropertyDescriptor PROXY_PORT = new PropertyDescriptor.Builder() + .name("PROXY_PORT") + .displayName("Proxy Port") + .description("The port of the proxy server") + .expressionLanguageSupported(true) + .addValidator(StandardValidators.PORT_VALIDATOR) + .build(); + public static final PropertyDescriptor PROXY_USERNAME = new PropertyDescriptor.Builder() + .name("PROXY_USERNAME") + .displayName("Proxy Username") + .description("Proxy Username") + .expressionLanguageSupported(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .build(); + public static final PropertyDescriptor PROXY_PASSWORD = new PropertyDescriptor.Builder() + .name("PROXY_PASSWORD") + .displayName("Proxy Password") + .description("Proxy Password") + .expressionLanguageSupported(true) + .addValidator(StandardValidators.NON_EMPTY_VALIDATOR) + .required(false) + .sensitive(true) + .build(); + + /** * Dynamic property which is used to decide if the {@link #ensureDirectoryExists(FlowFile, File)} method should perform a {@link ChannelSftp#ls(String)} before calling @@ -401,6 +435,18 @@ private ChannelSftp getChannel(final FlowFile flowFile) throws IOException { ctx.getProperty(HOSTNAME).evaluateAttributeExpressions(flowFile).getValue(), ctx.getProperty(PORT).evaluateAttributeExpressions(flowFile).asInteger().intValue()); + if (ctx.getProperty(PROXY_HOST).evaluateAttributeExpressions(flowFile).isSet()) { + final ProxyHTTP proxy = new ProxyHTTP( + ctx.getProperty(PROXY_HOST).evaluateAttributeExpressions(flowFile).getValue(), + ctx.getProperty(PROXY_PORT).evaluateAttributeExpressions(flowFile).asInteger() + ); + // Check if Username is set and populate the proxy accordingly + if (ctx.getProperty(PROXY_USERNAME).evaluateAttributeExpressions(flowFile).isSet()) { + proxy.setUserPasswd(ctx.getProperty(PROXY_USERNAME).evaluateAttributeExpressions(flowFile).getValue(), ctx.getProperty(PROXY_PASSWORD).evaluateAttributeExpressions(flowFile).getValue()); + } + session.setProxy(proxy); + } + final String hostKeyVal = ctx.getProperty(HOST_KEY_FILE).getValue(); if (hostKeyVal != null) { jsch.setKnownHosts(hostKeyVal);