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 <anco...@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(); }