Skip to content

Commit 6f823ba

Browse files
github-actions[bot]zhichao-awsdankyalo599Hailong-amDarshitChanpura
committed
Adds webhook format check for Slack (#814)
* Microsoft teams (#676) * Added feature support for microsoft teams webhoo Signed-off-by: danielkyalo599 <johbiento@gmail.com> * Added feature support for microsoft teams webhook ,removed valid webhooks Signed-off-by: danielkyalo599 <johbiento@gmail.com> * Added feature support for Microsoft teams webhook Signed-off-by: danielkyalo599 <johbiento@gmail.com> * Refactored feature support for ms teams and added unit and integTest Signed-off-by: danielkyalo599 <johbiento@gmail.com> * fix build in core Signed-off-by: zhichao-aws <zhichaog@amazon.com> * fix core-spi build Signed-off-by: zhichao-aws <zhichaog@amazon.com> * fix notifications main code Signed-off-by: zhichao-aws <zhichaog@amazon.com> * fix mappings, add IT Signed-off-by: zhichao-aws <zhichaog@amazon.com> * add auto upgrade mapping logic Signed-off-by: zhichao-aws <zhichaog@amazon.com> * put load mapping to initialize step Signed-off-by: zhichao-aws <zhichaog@amazon.com> * add schema_version field Signed-off-by: zhichao-aws <zhichaog@amazon.com> * add integ test Signed-off-by: zhichao-aws <zhichaog@amazon.com> * adjust with auto upgrade mapping logic Signed-off-by: zhichao-aws <zhichaog@amazon.com> * add bwc Signed-off-by: zhichao-aws <zhichaog@amazon.com> * modify bwc Signed-off-by: zhichao-aws <zhichaog@amazon.com> * modify bwc Signed-off-by: zhichao-aws <zhichaog@amazon.com> * resolve comments Signed-off-by: zhichao-aws <zhichaog@amazon.com> * add license header Signed-off-by: zhichao-aws <zhichaog@amazon.com> * fix microsoft teams sample url in IT to adapt url validation Signed-off-by: zhichao-aws <zhichaog@amazon.com> --------- Signed-off-by: danielkyalo599 <johbiento@gmail.com> Signed-off-by: zhichao-aws <zhichaog@amazon.com> Co-authored-by: danielkyalo599 <johbiento@gmail.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Add microsoft teams validation error message (#746) * add validation failure message for Microsoft Teams Signed-off-by: zhichao-aws <zhichaog@amazon.com> * modify integtest Signed-off-by: zhichao-aws <zhichaog@amazon.com> --------- Signed-off-by: zhichao-aws <zhichaog@amazon.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * onboard system and hidden index (#742) Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Updates demo certs used in integ tests (#756) Signed-off-by: Darshit Chanpura <dchanp@amazon.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Add 2.10.0 release notes (#755) * Add 2.10.0 release notes Signed-off-by: Hailong Cui <ihailong@amazon.com> * update release notes Signed-off-by: Hailong Cui <ihailong@amazon.com> * Update opensearch-notifications.release-notes-2.10.0.0.md Signed-off-by: Hailong Cui <ihailong@amazon.com> * fix wrong PR number Signed-off-by: Hailong Cui <ihailong@amazon.com> --------- Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * bump bwc version to 2.11 (#763) Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Add 2.11 release notes (#774) Signed-off-by: yuye-aws <yuyezhu@amazon.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Fix integration test failure by allowing direct access to system index warning (#784) * Fix integration test failure by allowing direct access to system index warning Signed-off-by: gaobinlong <gbinlong@amazon.com> * Fix bwc test failure of throwing direct access to system index when getting mapping Signed-off-by: gaobinlong <gbinlong@amazon.com> --------- Signed-off-by: gaobinlong <gbinlong@amazon.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Re-enable detekt Bumped version of `io.gitlab.arturbosch.detekt:detekt-gradle-plugin` to `1.23.0` Signed-off-by: Aniruddh <63553175+Noir01@users.noreply.github.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * bump bwc version to 2.12 (#793) Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Update dependency org.json:json to v20231013 (#795) Signed-off-by: gaobinlong <gbinlong@amazon.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Impove security plugin enabling check (#792) Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Add github workflow to auto bump bwc version (#799) * Adding bump bwc version github workflow Signed-off-by: Hailong Cui <ihailong@amazon.com> * revert app id Signed-off-by: Hailong Cui <ihailong@amazon.com> --------- Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Replace the TestMailServer to GreenMail server (#801) * Add 2.11 release notes (#774) Signed-off-by: yuye-aws <yuyezhu@amazon.com> Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Fix integration test failure by allowing direct access to system index warning (#784) * Fix integration test failure by allowing direct access to system index warning Signed-off-by: gaobinlong <gbinlong@amazon.com> * Fix bwc test failure of throwing direct access to system index when getting mapping Signed-off-by: gaobinlong <gbinlong@amazon.com> --------- Signed-off-by: gaobinlong <gbinlong@amazon.com> Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Replace the TestMailServer to GreenMail server Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * bump bwc version to 2.12 (#793) Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Update dependency org.json:json to v20231013 (#795) Signed-off-by: gaobinlong <gbinlong@amazon.com> Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Re-enable detekt (#796) Bumped version of `io.gitlab.arturbosch.detekt:detekt-gradle-plugin` to `1.23.0` Signed-off-by: Aniruddh <63553175+Noir01@users.noreply.github.com> Co-authored-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Add assertion for retrieval of notification Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Update to stable version Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Update to stable version Signed-off-by: rdani <rachana_sudhindradani@intuit.com> * Update to suggested version Signed-off-by: rdani <rachana_sudhindradani@intuit.com> --------- Signed-off-by: yuye-aws <yuyezhu@amazon.com> Signed-off-by: rdani <rachana_sudhindradani@intuit.com> Signed-off-by: gaobinlong <gbinlong@amazon.com> Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Aniruddh <63553175+Noir01@users.noreply.github.com> Co-authored-by: Yuye Zhu <yuyezhu@amazon.com> Co-authored-by: gaobinlong <gbinlong@amazon.com> Co-authored-by: rdani <rachana_sudhindradani@intuit.com> Co-authored-by: Hailong Cui <ihailong@amazon.com> Co-authored-by: Aniruddh <63553175+Noir01@users.noreply.github.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Onboard prod jenkins docker image to github actions (#809) * Onboard prod jenkins docker image to github actions Signed-off-by: Peter Zhu <zhujiaxi@amazon.com> * Add more Signed-off-by: Peter Zhu <zhujiaxi@amazon.com> --------- Signed-off-by: Peter Zhu <zhujiaxi@amazon.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Added org.apache.logging.log4j:log4j-slf4j-impl to classpath (#791) * Added slf4j-jdk14.jar to classpath Adding binding for SLF4J that should fix StaticLoggerBinder being not loaded. Followed instructions from warning messages that appear. Signed-off-by: Noir <63553175+Noir01@users.noreply.github.com> * Undid 80fc198 Removed slf4j-jdk14.jar from classpath Signed-off-by: Aniruddh <63553175+Noir01@users.noreply.github.com> * Added org.apache.logging.log4j:log4j-slf4j-impl to classpath Signed-off-by: Aniruddh <63553175+Noir01@users.noreply.github.com> --------- Signed-off-by: Noir <63553175+Noir01@users.noreply.github.com> Signed-off-by: Aniruddh <63553175+Noir01@users.noreply.github.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Added Slack webhook URL validation regex Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Replaced wrongly formatted dummy Slack URL with properly formatted dummy Slack URL Signed-off-by: Aniruddh Srivastava <ansriv2005@gmail.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Replaced more wrongly formatted dummy Slack URL with properly formatted dummy Slack URL Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Replaced even more wrongly formatted dummy Slack URL with properly formatted dummy Slack URL Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Replace path of mock Slack URL with `sample_slack_url` Signed-off-by: Aniruddh <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Remove slackId from domainIds Signed-off-by: Aniruddh <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Replace wrongly formatted dummy Slack URL with properly formatted dummy Slack URL Signed-off-by: Aniruddh <aniruddh@purdue.edu> Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Add tests for wrong Slack URLs Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Add validation tests for Slack URL Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Format Signed-off-by: Aniruddh <ansriv2005@gmail.com> * GovSlack apps can use the slack-gov.com domain Signed-off-by: Aniruddh <ansriv2005@gmail.com> * Add validation for gov-slack.com domain Signed-off-by: Aniruddh <ansriv2005@gmail.com> --------- Signed-off-by: danielkyalo599 <johbiento@gmail.com> Signed-off-by: zhichao-aws <zhichaog@amazon.com> Signed-off-by: Aniruddh <ansriv2005@gmail.com> Signed-off-by: Hailong Cui <ihailong@amazon.com> Signed-off-by: Darshit Chanpura <dchanp@amazon.com> Signed-off-by: yuye-aws <yuyezhu@amazon.com> Signed-off-by: gaobinlong <gbinlong@amazon.com> Signed-off-by: Aniruddh Srivastava <aniruddh@purdue.edu> Signed-off-by: Aniruddh <63553175+Noir01@users.noreply.github.com> Signed-off-by: rdani <rachana_sudhindradani@intuit.com> Signed-off-by: Peter Zhu <zhujiaxi@amazon.com> Signed-off-by: Noir <63553175+Noir01@users.noreply.github.com> Signed-off-by: Aniruddh Srivastava <ansriv2005@gmail.com> Signed-off-by: Aniruddh <aniruddh@purdue.edu> Co-authored-by: zhichao-aws <zhichaog@amazon.com> Co-authored-by: danielkyalo599 <johbiento@gmail.com> Co-authored-by: Hailong Cui <ihailong@amazon.com> Co-authored-by: Darshit Chanpura <35282393+DarshitChanpura@users.noreply.github.com> Co-authored-by: Yuye Zhu <yuyezhu@amazon.com> Co-authored-by: gaobinlong <gbinlong@amazon.com> Co-authored-by: Rachana Dani <36135368+rachana-dani@users.noreply.github.com> Co-authored-by: rdani <rachana_sudhindradani@intuit.com> Co-authored-by: Peter Zhu <zhujiaxi@amazon.com> (cherry picked from commit 87109a0) Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent e008360 commit 6f823ba

12 files changed

+105
-23
lines changed

notifications/notifications/src/main/kotlin/org/opensearch/notifications/index/ConfigIndexingActions.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ object ConfigIndexingActions {
5656

5757
@Suppress("UnusedPrivateMember")
5858
private fun validateSlackConfig(slack: Slack, user: User?) {
59-
// TODO: URL validation with rules
59+
require(slack.url.contains(Regex("https://hooks\\.(?:gov-)?slack\\.com/services"))) {
60+
"Wrong Slack url. Should contain \"hooks.slack.com/services/\" or \"hooks.gov-slack.com/services/\""
61+
}
6062
}
6163

6264
@Suppress("UnusedPrivateMember")

notifications/notifications/src/test/kotlin/org/opensearch/integtest/IntegTestHelpers.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ fun getCreateNotificationRequestJsonString(
116116
.joinToString("")
117117
val configObjectString = when (configType) {
118118
ConfigType.SLACK -> """
119-
"slack":{"url":"https://slack.domain.com/sample_slack_url#$randomString"}
119+
"slack":{"url":"https://hooks.slack.com/services/sample_slack_url#$randomString"}
120120
""".trimIndent()
121121
ConfigType.CHIME -> """
122122
"chime":{"url":"https://chime.domain.com/sample_chime_url#$randomString"}

notifications/notifications/src/test/kotlin/org/opensearch/integtest/SecurityNotificationIT.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class SecurityNotificationIT : PluginRestTestCase() {
5353
createUserWithCustomRole(user, password, NOTIFICATION_CREATE_CONFIG_ACCESS, "", ROLE_TO_PERMISSION_MAPPING[NOTIFICATION_CREATE_CONFIG_ACCESS])
5454

5555
// Create sample config request reference
56-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
56+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
5757
val referenceObject = NotificationConfig(
5858
"this is a sample config name",
5959
"this is a sample config description",
@@ -96,7 +96,7 @@ class SecurityNotificationIT : PluginRestTestCase() {
9696
createUserWithCustomRole(user, password, NOTIFICATION_NO_ACCESS_ROLE, "", ROLE_TO_PERMISSION_MAPPING[NOTIFICATION_NO_ACCESS_ROLE])
9797

9898
// Create sample config request reference
99-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
99+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
100100
val referenceObject = NotificationConfig(
101101
"this is a sample config name",
102102
"this is a sample config description",
@@ -132,7 +132,7 @@ class SecurityNotificationIT : PluginRestTestCase() {
132132
createUserWithCustomRole(user, password, NOTIFICATION_UPDATE_CONFIG_ACCESS, "", ROLE_TO_PERMISSION_MAPPING[NOTIFICATION_UPDATE_CONFIG_ACCESS])
133133

134134
// Create sample config request reference
135-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
135+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
136136
val referenceObject = NotificationConfig(
137137
"this is a sample config name",
138138
"this is a sample config description",
@@ -209,7 +209,7 @@ class SecurityNotificationIT : PluginRestTestCase() {
209209
createUserWithCustomRole(user, password, NOTIFICATION_NO_ACCESS_ROLE, "", ROLE_TO_PERMISSION_MAPPING[NOTIFICATION_NO_ACCESS_ROLE])
210210

211211
// Create sample config request reference
212-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
212+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
213213
val referenceObject = NotificationConfig(
214214
"this is a sample config name",
215215
"this is a sample config description",
@@ -245,7 +245,7 @@ class SecurityNotificationIT : PluginRestTestCase() {
245245
createUserWithCustomRole(user, password, NOTIFICATION_GET_CONFIG_ACCESS, "", ROLE_TO_PERMISSION_MAPPING[NOTIFICATION_GET_CONFIG_ACCESS])
246246

247247
// Create sample config request reference
248-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
248+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
249249
val referenceObject = NotificationConfig(
250250
"this is a sample config name",
251251
"this is a sample config description",
@@ -301,7 +301,7 @@ class SecurityNotificationIT : PluginRestTestCase() {
301301
createUserWithCustomRole(user, password, NOTIFICATION_DELETE_CONFIG_ACCESS, "", ROLE_TO_PERMISSION_MAPPING[NOTIFICATION_DELETE_CONFIG_ACCESS])
302302

303303
// Create sample config request reference
304-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
304+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
305305
val referenceObject = NotificationConfig(
306306
"this is a sample config name",
307307
"this is a sample config description",

notifications/notifications/src/test/kotlin/org/opensearch/integtest/bwc/NotificationsBackwardsCompatibilityIT.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class NotificationsBackwardsCompatibilityIT : PluginRestTestCase() {
103103
"description": "This is a sample config description $configId",
104104
"config_type": "slack",
105105
"is_enabled": true,
106-
"slack": { "url": "https://slack.domain.com/sample_slack_url#$configId" }
106+
"slack": { "url": "https://hooks.slack.com/services/sample_slack_url#$configId" }
107107
}
108108
}
109109
""".trimIndent()

notifications/notifications/src/test/kotlin/org/opensearch/integtest/config/ChimeNotificationConfigCrudIT.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ class ChimeNotificationConfigCrudIT : PluginRestTestCase() {
142142
"description":"${referenceObject.description}",
143143
"config_type":"chime",
144144
"is_enabled":${referenceObject.isEnabled},
145-
"slack":{"url":"https://dummy.com"}
145+
"slack":{"url":"https://hooks.slack.com/services/sample_slack_url"}
146146
"chime":{"url":"${(referenceObject.configData as Chime).url}"}
147147
}
148148
}
@@ -190,7 +190,7 @@ class ChimeNotificationConfigCrudIT : PluginRestTestCase() {
190190
"description":"this is a updated config description",
191191
"config_type":"slack",
192192
"is_enabled":"true",
193-
"slack":{"url":"https://updated.domain.com/updated_slack_url#0987654321"}
193+
"slack":{"url":"https://hooks.slack.com/services/sample_slack_url"}
194194
}
195195
}
196196
""".trimIndent()

notifications/notifications/src/test/kotlin/org/opensearch/integtest/config/CreateNotificationConfigIT.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class CreateNotificationConfigIT : PluginRestTestCase() {
2727

2828
fun `test Create slack notification config`() {
2929
// Create sample config request reference
30-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
30+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
3131
val referenceObject = NotificationConfig(
3232
"this is a sample config name",
3333
"this is a sample config description",

notifications/notifications/src/test/kotlin/org/opensearch/integtest/config/EmailNotificationConfigCrudIT.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -908,7 +908,7 @@ class EmailNotificationConfigCrudIT : PluginRestTestCase() {
908908
"description":"${smtpAccountConfig.description}",
909909
"config_type":"smtp_account",
910910
"is_enabled":${smtpAccountConfig.isEnabled},
911-
"slack": {"url": "https://dummy.com"},
911+
"slack": {"url": "https://hooks.slack.com/services/sample_slack_url"},
912912
"smtp_account":{
913913
"host":"${sampleSmtpAccount.host}",
914914
"port":"${sampleSmtpAccount.port}",
@@ -949,7 +949,7 @@ class EmailNotificationConfigCrudIT : PluginRestTestCase() {
949949
"description":"${emailConfig.description}",
950950
"config_type":"email",
951951
"is_enabled":${emailConfig.isEnabled},
952-
"slack":{"url": "https://dummy.com"},
952+
"slack":{"url": "https://hooks.slack.com/services/sample_slack_url"},
953953
"email":{
954954
"email_account_id":"${sampleEmail.emailAccountID}",
955955
"default_recipients":[

notifications/notifications/src/test/kotlin/org/opensearch/integtest/config/QueryNotificationConfigIT.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ class QueryNotificationConfigIT : PluginRestTestCase() {
627627
val urlIds = setOf(slackId, chimeId, microsoftTeamsId, webhookId)
628628
val recipientIds = setOf(emailGroupId)
629629
val fromIds = setOf(emailGroupId, smtpAccountId)
630-
val domainIds = setOf(slackId, chimeId, microsoftTeamsId, webhookId, smtpAccountId)
630+
val domainIds = setOf(chimeId, microsoftTeamsId, webhookId, smtpAccountId)
631631
Thread.sleep(1000)
632632

633633
// Get notification configs using query=slack
@@ -702,7 +702,7 @@ class QueryNotificationConfigIT : PluginRestTestCase() {
702702
val urlIds = setOf(slackId, chimeId, microsoftTeamsId, webhookId)
703703
val recipientIds = setOf(emailGroupId)
704704
val fromIds = setOf(emailGroupId, smtpAccountId)
705-
val domainIds = setOf(slackId, chimeId, microsoftTeamsId, webhookId, smtpAccountId)
705+
val domainIds = setOf(chimeId, microsoftTeamsId, webhookId, smtpAccountId)
706706
Thread.sleep(1000)
707707

708708
// Get notification configs using text_query=slack should not return any item

notifications/notifications/src/test/kotlin/org/opensearch/integtest/config/SlackNotificationConfigCrudIT.kt

+44-3
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@
66
package org.opensearch.integtest.config
77

88
import org.junit.Assert
9+
import org.opensearch.client.Request
10+
import org.opensearch.client.RequestOptions
11+
import org.opensearch.client.ResponseException
912
import org.opensearch.commons.notifications.model.ConfigType
1013
import org.opensearch.commons.notifications.model.NotificationConfig
1114
import org.opensearch.commons.notifications.model.Slack
1215
import org.opensearch.core.rest.RestStatus
1316
import org.opensearch.integtest.PluginRestTestCase
17+
import org.opensearch.integtest.getResponseBody
18+
import org.opensearch.integtest.jsonify
1419
import org.opensearch.notifications.NotificationPlugin.Companion.PLUGIN_BASE_URI
1520
import org.opensearch.notifications.verifySingleConfigEquals
1621
import org.opensearch.rest.RestRequest
@@ -19,7 +24,7 @@ class SlackNotificationConfigCrudIT : PluginRestTestCase() {
1924

2025
fun `test Create, Get, Update, Delete slack notification config using REST client`() {
2126
// Create sample config request reference
22-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
27+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
2328
val referenceObject = NotificationConfig(
2429
"this is a sample config name",
2530
"this is a sample config description",
@@ -67,7 +72,7 @@ class SlackNotificationConfigCrudIT : PluginRestTestCase() {
6772
Thread.sleep(100)
6873

6974
// Updated notification config object
70-
val updatedSlack = Slack("https://updated.domain.com/updated_slack_url#0987654321")
75+
val updatedSlack = Slack("https://hooks.slack.com/services/updated_slack_url")
7176
val updatedObject = NotificationConfig(
7277
"this is a updated config name",
7378
"this is a updated config description",
@@ -126,7 +131,7 @@ class SlackNotificationConfigCrudIT : PluginRestTestCase() {
126131

127132
fun `test Bad Request for multiple config data for Slack using REST Client`() {
128133
// Create sample config request reference
129-
val sampleSlack = Slack("https://domain.com/sample_slack_url#1234567890")
134+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
130135
val referenceObject = NotificationConfig(
131136
"this is a sample config name",
132137
"this is a sample config description",
@@ -155,4 +160,40 @@ class SlackNotificationConfigCrudIT : PluginRestTestCase() {
155160
RestStatus.BAD_REQUEST.status
156161
)
157162
}
163+
164+
fun `test create config with wrong Slack url and get error text`() {
165+
val sampleSlack = Slack("https://webhook.slack.com/services/sample_slack_url")
166+
val referenceObject = NotificationConfig(
167+
"this is a sample config name",
168+
"this is a sample config description",
169+
ConfigType.SLACK,
170+
isEnabled = true,
171+
configData = sampleSlack
172+
)
173+
val createRequestJsonString = """
174+
{
175+
"config":{
176+
"name":"${referenceObject.name}",
177+
"description":"${referenceObject.description}",
178+
"config_type":"slack",
179+
"is_enabled":${referenceObject.isEnabled},
180+
"slack":{"url":"${(referenceObject.configData as Slack).url}"}
181+
}
182+
}
183+
""".trimIndent()
184+
val response = try {
185+
val request = Request(RestRequest.Method.POST.name, "$PLUGIN_BASE_URI/configs")
186+
request.setJsonEntity(createRequestJsonString)
187+
val restOptionsBuilder = RequestOptions.DEFAULT.toBuilder()
188+
restOptionsBuilder.addHeader("Content-Type", "application/json")
189+
request.setOptions(restOptionsBuilder)
190+
client().performRequest(request)
191+
fail("Expected wrong Slack URL.")
192+
} catch (exception: ResponseException) {
193+
Assert.assertEquals(
194+
"Wrong Slack url. Should contain \"hooks.slack.com/services/\" or \"hooks.gov-slack.com/services/\"",
195+
jsonify(getResponseBody(exception.response))["error"].asJsonObject["reason"].asString
196+
)
197+
}
198+
}
158199
}

notifications/notifications/src/test/kotlin/org/opensearch/integtest/config/WebhookNotificationConfigCrudIT.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ class WebhookNotificationConfigCrudIT : PluginRestTestCase() {
159159
"description":"${referenceObject.description}",
160160
"config_type":"webhook",
161161
"is_enabled":${referenceObject.isEnabled},
162-
"slack":{"url":"https://dummy.com"}
162+
"slack":{"url":"https://hooks.slack.com/services/sample_slack_url"}
163163
"webhook":{"url":"${(referenceObject.configData as Webhook).url}"}
164164
}
165165
}

notifications/notifications/src/test/kotlin/org/opensearch/notifications/index/ConfigIndexingActionsTests.kt

+39
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import org.junit.jupiter.api.BeforeAll
88
import org.junit.jupiter.api.Test
99
import org.opensearch.commons.authuser.User
1010
import org.opensearch.commons.notifications.model.MicrosoftTeams
11+
import org.opensearch.commons.notifications.model.Slack
1112
import java.lang.reflect.Method
1213
import kotlin.test.assertFails
1314

@@ -28,8 +29,42 @@ class ConfigIndexingActionsTests {
2829
assertFails { validateMicrosoftTeamsConfig.invoke(ConfigIndexingActions, microsoftTeams, user) }
2930
}
3031

32+
@Test
33+
fun `test validate slack`() {
34+
val user = User()
35+
var slack = Slack("https://hooks.slack.com/services/123456789/123456789/123456789")
36+
validateSlackConfig.invoke(ConfigIndexingActions, slack, user)
37+
slack = Slack("https://hooks.gov-slack.com/services/123456789/123456789/123456789")
38+
validateSlackConfig.invoke(ConfigIndexingActions, slack, user)
39+
slack = Slack("https://hooks.slack.com/services/samplesamplesamplesamplesamplesamplesamplesamplesample")
40+
validateSlackConfig.invoke(ConfigIndexingActions, slack, user)
41+
slack = Slack("https://hooks.gov-slack.com/services/samplesamplesamplesamplesamplesamplesamplesamplesample")
42+
validateSlackConfig.invoke(ConfigIndexingActions, slack, user)
43+
slack = Slack("http://hooks.slack.com/services/123456789/123456789/123456789/123456789")
44+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
45+
slack = Slack("http://hooks.gov-slack.com/services/123456789/123456789/123456789/123456789")
46+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
47+
slack = Slack("https://slack.com/services/123456789/123456789/123456789/123456789")
48+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
49+
slack = Slack("https://gov-slack.com/services/123456789/123456789/123456789/123456789")
50+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
51+
slack = Slack("https://hooks.slack.com/123456789/123456789/123456789/123456789/123456789")
52+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
53+
slack = Slack("https://hooks.gov-slack.com/123456789/123456789/123456789/123456789/123456789")
54+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
55+
slack = Slack("https://hook.slack.com/services/123456789/123456789/123456789/123456789/123456789")
56+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
57+
slack = Slack("https://hook.gov-slack.com/services/123456789/123456789/123456789/123456789/123456789")
58+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
59+
slack = Slack("https://hooks.slack.com/")
60+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
61+
slack = Slack("https://hooks.gov-slack.com/")
62+
assertFails { validateSlackConfig.invoke(ConfigIndexingActions, slack, user) }
63+
}
64+
3165
companion object {
3266
private lateinit var validateMicrosoftTeamsConfig: Method
67+
private lateinit var validateSlackConfig: Method
3368

3469
@BeforeAll
3570
@JvmStatic
@@ -38,8 +73,12 @@ class ConfigIndexingActionsTests {
3873
validateMicrosoftTeamsConfig = ConfigIndexingActions::class.java.getDeclaredMethod(
3974
"validateMicrosoftTeamsConfig", MicrosoftTeams::class.java, User::class.java
4075
)
76+
validateSlackConfig = ConfigIndexingActions::class.java.getDeclaredMethod(
77+
"validateSlackConfig", Slack::class.java, User::class.java
78+
)
4179

4280
validateMicrosoftTeamsConfig.isAccessible = true
81+
validateSlackConfig.isAccessible = true
4382
}
4483
}
4584
}

notifications/notifications/src/test/kotlin/org/opensearch/notifications/model/NotificationConfigDocTests.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ internal class NotificationConfigDocTests {
2525
createdTimeMs,
2626
listOf("br1", "br2", "br3")
2727
)
28-
val sampleSlack = Slack("https://domain.com/sample_url#1234567890")
28+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
2929
val config = NotificationConfig(
3030
"name",
3131
"description",
@@ -47,7 +47,7 @@ internal class NotificationConfigDocTests {
4747
createdTimeMs,
4848
listOf("br1", "br2", "br3")
4949
)
50-
val sampleSlack = Slack("https://domain.com/sample_url#1234567890")
50+
val sampleSlack = Slack("https://hooks.slack.com/services/sample_slack_url")
5151
val config = NotificationConfig(
5252
"name",
5353
"description",
@@ -67,7 +67,7 @@ internal class NotificationConfigDocTests {
6767
"description":"description",
6868
"config_type":"slack",
6969
"is_enabled":true,
70-
"slack":{"url":"https://domain.com/sample_url#1234567890"}
70+
"slack":{"url":"https://hooks.slack.com/services/sample_slack_url"}
7171
},
7272
"extra_field_1":["extra", "value"],
7373
"extra_field_2":{"extra":"value"},

0 commit comments

Comments
 (0)