This is an automated email from the ASF dual-hosted git repository.
exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new b2c4baf429 NIFI-12277 Added SSLContextService to Slack Processors
b2c4baf429 is described below
commit b2c4baf429d8bf360babc69ae0aec5a963520d38
Author: Mark Bathori <[email protected]>
AuthorDate: Thu Oct 26 16:51:57 2023 +0200
NIFI-12277 Added SSLContextService to Slack Processors
This closes #7936
Signed-off-by: David Handermann <[email protected]>
---
.../nifi-slack-processors/pom.xml | 1 -
.../apache/nifi/processors/slack/PostSlack.java | 36 ++++++++++++++++++----
.../org/apache/nifi/processors/slack/PutSlack.java | 22 +++++++++++--
3 files changed, 50 insertions(+), 9 deletions(-)
diff --git a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/pom.xml
b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/pom.xml
index 2bfd150885..f75f089f76 100644
--- a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/pom.xml
+++ b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/pom.xml
@@ -96,7 +96,6 @@
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-ssl-context-service-api</artifactId>
- <scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.nifi</groupId>
diff --git
a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PostSlack.java
b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PostSlack.java
index 6d7e9ce54b..37bdc590f1 100644
---
a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PostSlack.java
+++
b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PostSlack.java
@@ -33,10 +33,17 @@ import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonString;
import javax.json.stream.JsonParsingException;
+import javax.net.ssl.SSLContext;
+
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
@@ -65,6 +72,7 @@ import org.apache.nifi.processor.ProcessSession;
import org.apache.nifi.processor.Relationship;
import org.apache.nifi.processor.exception.ProcessException;
import org.apache.nifi.processor.util.StandardValidators;
+import org.apache.nifi.ssl.SSLContextService;
@Tags({"slack", "post", "notify", "upload", "message"})
@CapabilityDescription("Sends a message on Slack. The FlowFile content (e.g.
an image) can be uploaded and attached to the message.")
@@ -180,6 +188,12 @@ public class PostSlack extends AbstractProcessor {
.expressionLanguageSupported(ExpressionLanguageScope.FLOWFILE_ATTRIBUTES)
.build();
+ public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new
PropertyDescriptor.Builder()
+ .name("SSL Context Service")
+ .description("Specifies an optional SSL Context Service that, if
provided, will be used to create connections")
+ .identifiesControllerService(SSLContextService.class)
+ .build();
+
public static final Relationship REL_SUCCESS = new Relationship.Builder()
.name("success")
.description("FlowFiles are routed to success after being
successfully sent to Slack")
@@ -199,7 +213,8 @@ public class PostSlack extends AbstractProcessor {
UPLOAD_FLOWFILE,
FILE_TITLE,
FILE_NAME,
- FILE_MIME_TYPE);
+ FILE_MIME_TYPE,
+ SSL_CONTEXT_SERVICE);
public static final Set<Relationship> relationships = Set.of(REL_SUCCESS,
REL_FAILURE);
@@ -235,18 +250,27 @@ public class PostSlack extends AbstractProcessor {
}
@OnScheduled
- public void initDynamicProperties(ProcessContext context) {
+ public void onScheduled(ProcessContext context) {
attachmentProperties.clear();
attachmentProperties.addAll(
context.getProperties().keySet()
.stream()
.filter(PropertyDescriptor::isDynamic)
.toList());
- }
- @OnScheduled
- public void initHttpResources() {
- connManager = new PoolingHttpClientConnectionManager();
+ final SSLContextService sslService =
context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
+
+ if (sslService != null) {
+ final SSLContext sslContext = sslService.createContext();
+ final Registry<ConnectionSocketFactory> socketFactoryRegistry =
RegistryBuilder.<ConnectionSocketFactory>create()
+ .register("http",
PlainConnectionSocketFactory.getSocketFactory())
+ .register("https", new
SSLConnectionSocketFactory(sslContext))
+ .build();
+
+ connManager = new
PoolingHttpClientConnectionManager(socketFactoryRegistry);
+ } else {
+ connManager = new PoolingHttpClientConnectionManager();
+ }
client = HttpClientBuilder.create()
.setConnectionManager(connManager)
diff --git
a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PutSlack.java
b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PutSlack.java
index 78ad4b65ce..5f4c9faa0b 100644
---
a/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PutSlack.java
+++
b/nifi-nar-bundles/nifi-slack-bundle/nifi-slack-processors/src/main/java/org/apache/nifi/processors/slack/PutSlack.java
@@ -38,6 +38,9 @@ import javax.json.JsonObjectBuilder;
import javax.json.JsonReader;
import javax.json.JsonWriter;
import javax.json.stream.JsonParsingException;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+
import org.apache.nifi.annotation.behavior.DynamicProperty;
import org.apache.nifi.annotation.behavior.InputRequirement;
import org.apache.nifi.annotation.documentation.CapabilityDescription;
@@ -55,6 +58,7 @@ import org.apache.nifi.processor.ProcessContext;
import org.apache.nifi.processor.ProcessSession;
import org.apache.nifi.processor.Relationship;
import org.apache.nifi.processor.util.StandardValidators;
+import org.apache.nifi.ssl.SSLContextService;
@Tags({"put", "slack", "notify"})
@CapabilityDescription("Publishes a message to Slack")
@@ -137,6 +141,12 @@ public class PutSlack extends AbstractProcessor {
.addValidator(new EmojiValidator())
.build();
+ public static final PropertyDescriptor SSL_CONTEXT_SERVICE = new
PropertyDescriptor.Builder()
+ .name("SSL Context Service")
+ .description("Specifies an optional SSL Context Service that, if
provided, will be used to create connections")
+ .identifiesControllerService(SSLContextService.class)
+ .build();
+
public static final Relationship REL_SUCCESS = new Relationship.Builder()
.name("success")
.description("FlowFiles are routed to success after being
successfully sent to Slack")
@@ -156,7 +166,8 @@ public class PutSlack extends AbstractProcessor {
USERNAME,
THREAD_TS,
ICON_URL,
- ICON_EMOJI);
+ ICON_EMOJI,
+ SSL_CONTEXT_SERVICE);
private static final Set<Relationship> relationships = Set.of(REL_SUCCESS,
REL_FAILURE);
@@ -236,6 +247,8 @@ public class PutSlack extends AbstractProcessor {
builder.add("icon_emoji", iconEmoji);
}
+ final SSLContextService sslService =
context.getProperty(SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
+
try {
// Get Attachments Array
if (!attachmentDescriptors.isEmpty()) {
@@ -261,12 +274,17 @@ public class PutSlack extends AbstractProcessor {
conn.setRequestMethod("POST");
conn.setDoOutput(true);
+ if (sslService != null) {
+ final SSLContext sslContext = sslService.createContext();
+ ((HttpsURLConnection)
conn).setSSLSocketFactory(sslContext.getSocketFactory());
+ }
+
final DataOutputStream outputStream = new
DataOutputStream(conn.getOutputStream());
final String payload = "payload=" +
URLEncoder.encode(stringWriter.getBuffer().toString(), StandardCharsets.UTF_8);
outputStream.writeBytes(payload);
outputStream.close();
- final int responseCode = conn.getResponseCode();
+ int responseCode = conn.getResponseCode();
if (responseCode >= 200 && responseCode < 300) {
getLogger().info("Successfully posted message to Slack");
session.transfer(flowFile, REL_SUCCESS);