Skip to content

Commit fc93aef

Browse files
committed
NIFI-4175 - Add HTTP proxy support to *SFTP processors
1 parent a6e94de commit fc93aef

5 files changed

Lines changed: 67 additions & 5 deletions

File tree

nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/FetchSFTP.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
6666
properties.add(SFTPTransfer.HOST_KEY_FILE);
6767
properties.add(SFTPTransfer.STRICT_HOST_KEY_CHECKING);
6868
properties.add(SFTPTransfer.USE_COMPRESSION);
69+
properties.add(SFTPTransfer.PROXY_HOST);
70+
properties.add(SFTPTransfer.PROXY_PORT);
71+
properties.add(SFTPTransfer.PROXY_USERNAME);
72+
properties.add(SFTPTransfer.PROXY_PASSWORD);
6973
return properties;
7074
}
7175

nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/GetSFTP.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ protected void init(final ProcessorInitializationContext context) {
8181
properties.add(SFTPTransfer.USE_KEEPALIVE_ON_TIMEOUT);
8282
properties.add(SFTPTransfer.USE_COMPRESSION);
8383
properties.add(SFTPTransfer.USE_NATURAL_ORDERING);
84+
properties.add(SFTPTransfer.PROXY_HOST);
85+
properties.add(SFTPTransfer.PROXY_PORT);
86+
properties.add(SFTPTransfer.PROXY_USERNAME);
87+
properties.add(SFTPTransfer.PROXY_PASSWORD);
8488
this.properties = Collections.unmodifiableList(properties);
8589
}
8690

nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ListSFTP.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ protected List<PropertyDescriptor> getSupportedPropertyDescriptors() {
8282
properties.add(SFTPTransfer.CONNECTION_TIMEOUT);
8383
properties.add(SFTPTransfer.DATA_TIMEOUT);
8484
properties.add(SFTPTransfer.USE_KEEPALIVE_ON_TIMEOUT);
85+
properties.add(SFTPTransfer.PROXY_HOST);
86+
properties.add(SFTPTransfer.PROXY_PORT);
87+
properties.add(SFTPTransfer.PROXY_USERNAME);
88+
properties.add(SFTPTransfer.PROXY_PASSWORD);
8589
return properties;
8690
}
8791

nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/PutSFTP.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ protected void init(final ProcessorInitializationContext context) {
6969
properties.add(SFTPTransfer.STRICT_HOST_KEY_CHECKING);
7070
properties.add(SFTPTransfer.USE_KEEPALIVE_ON_TIMEOUT);
7171
properties.add(SFTPTransfer.USE_COMPRESSION);
72+
properties.add(SFTPTransfer.PROXY_HOST);
73+
properties.add(SFTPTransfer.PROXY_PORT);
74+
properties.add(SFTPTransfer.PROXY_USERNAME);
75+
properties.add(SFTPTransfer.PROXY_PASSWORD);
7276
this.properties = Collections.unmodifiableList(properties);
7377
}
7478

nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/util/SFTPTransfer.java

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@
3333
import java.util.concurrent.TimeUnit;
3434
import java.util.regex.Pattern;
3535

36+
import com.jcraft.jsch.ChannelSftp;
37+
import com.jcraft.jsch.JSch;
38+
import com.jcraft.jsch.JSchException;
39+
import com.jcraft.jsch.ProxyHTTP;
40+
import com.jcraft.jsch.Session;
41+
import com.jcraft.jsch.SftpException;
3642
import org.apache.nifi.components.PropertyDescriptor;
3743
import org.apache.nifi.components.PropertyValue;
3844
import org.apache.nifi.flowfile.FlowFile;
@@ -41,13 +47,8 @@
4147
import org.apache.nifi.processor.util.StandardValidators;
4248
import org.slf4j.LoggerFactory;
4349

44-
import com.jcraft.jsch.ChannelSftp;
4550
import com.jcraft.jsch.ChannelSftp.LsEntry;
4651
import com.jcraft.jsch.ChannelSftp.LsEntrySelector;
47-
import com.jcraft.jsch.JSch;
48-
import com.jcraft.jsch.JSchException;
49-
import com.jcraft.jsch.Session;
50-
import com.jcraft.jsch.SftpException;
5152

5253
public class SFTPTransfer implements FileTransfer {
5354

@@ -92,6 +93,39 @@ public class SFTPTransfer implements FileTransfer {
9293
.defaultValue("true")
9394
.required(true)
9495
.build();
96+
public static final PropertyDescriptor PROXY_HOST = new PropertyDescriptor.Builder()
97+
.name("PROXY_HOST")
98+
.displayName("Proxy Host")
99+
.description("The fully qualified hostname or IP address of the proxy server")
100+
.expressionLanguageSupported(true)
101+
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
102+
.build();
103+
public static final PropertyDescriptor PROXY_PORT = new PropertyDescriptor.Builder()
104+
.name("PROXY_PORT")
105+
.displayName("Proxy Port")
106+
.description("The port of the proxy server")
107+
.expressionLanguageSupported(true)
108+
.addValidator(StandardValidators.PORT_VALIDATOR)
109+
.build();
110+
public static final PropertyDescriptor PROXY_USERNAME = new PropertyDescriptor.Builder()
111+
.name("PROXY_USERNAME")
112+
.displayName("Proxy Username")
113+
.description("Proxy Username")
114+
.expressionLanguageSupported(true)
115+
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
116+
.required(false)
117+
.build();
118+
public static final PropertyDescriptor PROXY_PASSWORD = new PropertyDescriptor.Builder()
119+
.name("PROXY_PASSWORD")
120+
.displayName("Proxy Password")
121+
.description("Proxy Password")
122+
.expressionLanguageSupported(true)
123+
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
124+
.required(false)
125+
.sensitive(true)
126+
.build();
127+
128+
95129

96130
/**
97131
* 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 {
401435
ctx.getProperty(HOSTNAME).evaluateAttributeExpressions(flowFile).getValue(),
402436
ctx.getProperty(PORT).evaluateAttributeExpressions(flowFile).asInteger().intValue());
403437

438+
if (ctx.getProperty(PROXY_HOST).evaluateAttributeExpressions(flowFile).isSet()) {
439+
final ProxyHTTP proxy = new ProxyHTTP(
440+
ctx.getProperty(PROXY_HOST).evaluateAttributeExpressions(flowFile).getValue(),
441+
ctx.getProperty(PROXY_PORT).evaluateAttributeExpressions(flowFile).asInteger()
442+
);
443+
// Check if Username is set and populate the proxy accordingly
444+
if (ctx.getProperty(PROXY_USERNAME).evaluateAttributeExpressions(flowFile).isSet()) {
445+
proxy.setUserPasswd(ctx.getProperty(PROXY_USERNAME).evaluateAttributeExpressions(flowFile).getValue(), ctx.getProperty(PROXY_PASSWORD).evaluateAttributeExpressions(flowFile).getValue());
446+
}
447+
session.setProxy(proxy);
448+
}
449+
404450
final String hostKeyVal = ctx.getProperty(HOST_KEY_FILE).getValue();
405451
if (hostKeyVal != null) {
406452
jsch.setKnownHosts(hostKeyVal);

0 commit comments

Comments
 (0)