You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2018/08/24 08:39:59 UTC

[camel] 01/02: Improved the Slack Verifier Extension after the Slack Consumer has been implemented

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit d03f64f88631bedca07d16809dd9e6ac4d0ae115
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Fri Aug 24 10:36:23 2018 +0200

    Improved the Slack Verifier Extension after the Slack Consumer has been implemented
---
 .../slack/SlackComponentVerifierExtension.java     | 110 +++++++++++++++------
 .../slack/SlackComponentVerifierExtensionTest.java |  58 ++++++++++-
 .../camel/component/slack/SlackConsumerTest.java   |   2 +-
 3 files changed, 137 insertions(+), 33 deletions(-)

diff --git a/components/camel-slack/src/main/java/org/apache/camel/component/slack/SlackComponentVerifierExtension.java b/components/camel-slack/src/main/java/org/apache/camel/component/slack/SlackComponentVerifierExtension.java
index a4f3e88..0541f08 100644
--- a/components/camel-slack/src/main/java/org/apache/camel/component/slack/SlackComponentVerifierExtension.java
+++ b/components/camel-slack/src/main/java/org/apache/camel/component/slack/SlackComponentVerifierExtension.java
@@ -16,7 +16,14 @@
  */
 package org.apache.camel.component.slack;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension;
@@ -24,12 +31,16 @@ import org.apache.camel.component.extension.verifier.ResultBuilder;
 import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
 import org.apache.camel.component.extension.verifier.ResultErrorHelper;
 import org.apache.camel.component.slack.helper.SlackMessage;
+import org.apache.camel.util.ObjectHelper;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.message.BasicNameValuePair;
 import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
 
 public class SlackComponentVerifierExtension extends DefaultComponentVerifierExtension {
 
@@ -46,9 +57,14 @@ public class SlackComponentVerifierExtension extends DefaultComponentVerifierExt
     // *********************************
     @Override
     protected Result verifyParameters(Map<String, Object> parameters) {
-        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS)
-                .error(ResultErrorHelper.requiresOption("webhookUrl", parameters));
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS);
 
+        if (ObjectHelper.isEmpty(parameters.get("token")) && ObjectHelper.isEmpty(parameters.get("webhookUrl"))) {
+            builder.error(ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.GENERIC, "You must specify a webhookUrl (for producer) or a token (for consumer)").parameterKey("webhookUrl").parameterKey("token").build());
+        }
+        if (ObjectHelper.isNotEmpty(parameters.get("token")) && ObjectHelper.isNotEmpty(parameters.get("webhookUrl"))) {
+            builder.error(ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.GENERIC, "You must specify a webhookUrl (for producer) or a token (for consumer). You can't specify both.").parameterKey("webhookUrl").parameterKey("token").build());
+        }
         return builder.build();
     }
 
@@ -57,45 +73,79 @@ public class SlackComponentVerifierExtension extends DefaultComponentVerifierExt
     // *********************************
     @Override
     protected Result verifyConnectivity(Map<String, Object> parameters) {
-        return ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY)
-                .error(parameters, this::verifyCredentials).build();
+        return ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY).error(parameters, this::verifyCredentials).build();
     }
 
     private void verifyCredentials(ResultBuilder builder, Map<String, Object> parameters) {
 
-        String webhookUrl = (String) parameters.get("webhookUrl");
+        String webhookUrl = (String)parameters.get("webhookUrl");
 
-        try {
-            HttpClient client = HttpClientBuilder.create().useSystemProperties().build();
-            HttpPost httpPost = new HttpPost(webhookUrl);
+        if (ObjectHelper.isNotEmpty(webhookUrl)) {
 
-            // Build Helper object
-            SlackMessage slackMessage;
-            slackMessage = new SlackMessage();
-            slackMessage.setText("Test connection");
+            try {
+                HttpClient client = HttpClientBuilder.create().useSystemProperties().build();
+                HttpPost httpPost = new HttpPost(webhookUrl);
 
-            // Set the post body
-            String json = asJson(slackMessage);
-            StringEntity body = new StringEntity(json);
+                // Build Helper object
+                SlackMessage slackMessage;
+                slackMessage = new SlackMessage();
+                slackMessage.setText("Test connection");
 
-            // Do the post
-            httpPost.setEntity(body);
+                // Set the post body
+                String json = asJson(slackMessage);
+                StringEntity body = new StringEntity(json);
 
-            HttpResponse response = client.execute(httpPost);
+                // Do the post
+                httpPost.setEntity(body);
+                
+                HttpResponse response = client.execute(httpPost);
 
-            // 2xx is OK, anything else we regard as failure
-            if (response.getStatusLine().getStatusCode() < 200 || response.getStatusLine().getStatusCode() > 299) {
-                builder.error(ResultErrorBuilder
-                        .withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION,
-                                "Invalid webhookUrl")
-                        .parameterKey("webhookUrl").build());
+                // 2xx is OK, anything else we regard as failure
+                if (response.getStatusLine().getStatusCode() < 200 || response.getStatusLine().getStatusCode() > 299) {
+                    builder
+                        .error(ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, "Invalid webhookUrl").parameterKey("webhookUrl").build());
+                }
+            } catch (Exception e) {
+                builder.error(ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, "Invalid webhookUrl").parameterKey("webhookUrl").build());
             }
-        } catch (Exception e) {
-            builder.error(ResultErrorBuilder
-                    .withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION,
-                            "Invalid webhookUrl")
-                    .parameterKey("webhookUrl").build());
+        } else if (ObjectHelper.isNotEmpty((String)parameters.get("token"))) {
+            String token = (String)parameters.get("token");
+
+            try {
+                HttpClient client = HttpClientBuilder.create().useSystemProperties().build();
+                HttpPost httpPost = new HttpPost("https://slack.com/api/channels.list");
+
+                List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();
+                params.add(new BasicNameValuePair("token", token));
+                httpPost.setEntity(new UrlEncodedFormEntity(params));
+
+                HttpResponse response = client.execute(httpPost);
+
+                String jsonString = readResponse(response.getEntity().getContent());
+                if (response.getStatusLine().getStatusCode() < 200 || response.getStatusLine().getStatusCode() > 299) {
+                    builder.error(ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, "Invalid token").parameterKey("token").build());
+                }
+                JSONParser parser = new JSONParser();
+                JSONObject obj = (JSONObject)parser.parse(jsonString);
+                if (obj.get("ok") != null && obj.get("ok").equals(false)) {
+                    builder.error(ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, "Invalid token").parameterKey("token").build());
+                }
+            } catch (Exception e) {
+                builder.error(ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, "Invalid token").parameterKey("token").build());
+            }
+
+        }
+    }
+
+    private String readResponse(InputStream s) throws IOException, UnsupportedEncodingException {
+        ByteArrayOutputStream result = new ByteArrayOutputStream();
+        byte[] buffer = new byte[1024];
+        int length;
+        while ((length = s.read(buffer)) != -1) {
+            result.write(buffer, 0, length);
         }
+        String jsonString = result.toString(StandardCharsets.UTF_8.name());
+        return jsonString;
     }
 
     protected String asJson(SlackMessage message) {
@@ -111,4 +161,4 @@ public class SlackComponentVerifierExtension extends DefaultComponentVerifierExt
         return JSONObject.toJSONString(jsonObject);
     }
 
-}
\ No newline at end of file
+}
diff --git a/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackComponentVerifierExtensionTest.java b/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackComponentVerifierExtensionTest.java
index 74418c5..2b546b3 100644
--- a/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackComponentVerifierExtensionTest.java
+++ b/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackComponentVerifierExtensionTest.java
@@ -36,7 +36,7 @@ public class SlackComponentVerifierExtensionTest extends CamelTestSupport {
     }
 
     @Test
-    public void testParameters() throws Exception {
+    public void testParametersWebhook() throws Exception {
         Component component = context().getComponent("slack");
 
         ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
@@ -48,9 +48,51 @@ public class SlackComponentVerifierExtensionTest extends CamelTestSupport {
 
         Assert.assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
     }
+    
+    @Test
+    public void testParametersToken() throws Exception {
+        Component component = context().getComponent("slack");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("token", "l");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
+    }
+    
+    @Test
+    public void testParametersEmpty() throws Exception {
+        Component component = context().getComponent("slack");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
+    
+    @Test
+    public void testParametersWebhookUrlTokenBoth() throws Exception {
+        Component component = context().getComponent("slack");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("token", "l");
+        parameters.put("webhookUrl", "l");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
 
     @Test
-    public void testConnectivity() throws Exception {
+    public void testConnectivityWebhook() throws Exception {
         Component component = context().getComponent("slack");
         ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
 
@@ -62,4 +104,16 @@ public class SlackComponentVerifierExtensionTest extends CamelTestSupport {
         Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
     }
 
+    @Test
+    public void testConnectivityToken() throws Exception {
+        Component component = context().getComponent("slack");
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("token", "l");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
 }
diff --git a/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackConsumerTest.java b/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackConsumerTest.java
index 21f393d..2a439cd 100644
--- a/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackConsumerTest.java
+++ b/components/camel-slack/src/test/java/org/apache/camel/component/slack/SlackConsumerTest.java
@@ -28,7 +28,7 @@ public class SlackConsumerTest extends CamelTestSupport {
     @Test
     public void testConsumePrefixedMessages() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
-        mock.expectedMessageCount(1);
+        mock.expectedMessageCount(9);
         
         assertMockEndpointsSatisfied();
     }