diff --git a/integrations/access/accessrequest/message.go b/integrations/access/accessrequest/message.go index b09783b4104..32132cb19ff 100644 --- a/integrations/access/accessrequest/message.go +++ b/integrations/access/accessrequest/message.go @@ -37,7 +37,7 @@ import ( // for message section texts, so we truncate all reasons to a generous but // conservative limit const ( - requestInlineLimit = 500 + requestInlineLimit = 400 requestReasonLimit resolutionReasonLimit ReviewReasonLimit diff --git a/integrations/access/discord/testlib/suite.go b/integrations/access/discord/testlib/suite.go index bfd483d882d..e47ac987f86 100644 --- a/integrations/access/discord/testlib/suite.go +++ b/integrations/access/discord/testlib/suite.go @@ -164,7 +164,7 @@ func (s *DiscordSuiteOSS) TestMessagePosting() { matches := requestReasonRegexp.FindAllStringSubmatch(messages[0].Text, -1) require.Len(t, matches, 1) require.Len(t, matches[0], 3) - assert.Equal(t, "because of "+strings.Repeat("A", 489), matches[0][1]) + assert.Equal(t, "because of "+strings.Repeat("A", 389), matches[0][1]) assert.Equal(t, " (truncated)", matches[0][2]) status, err := parseMessageField(messages[0], "Status") @@ -690,7 +690,7 @@ func (s *DiscordSuiteOSS) TestMessagePostingWithAMR() { matches := requestReasonRegexp.FindAllStringSubmatch(messages[0].Text, -1) require.Len(t, matches, 1) require.Len(t, matches[0], 3) - assert.Equal(t, "because of "+strings.Repeat("A", 489), matches[0][1]) + assert.Equal(t, "because of "+strings.Repeat("A", 389), matches[0][1]) assert.Equal(t, " (truncated)", matches[0][2]) status, err := parseMessageField(messages[0], "Status") diff --git a/integrations/access/slack/bot.go b/integrations/access/slack/bot.go index e7fefa01071..9ad519a1b11 100644 --- a/integrations/access/slack/bot.go +++ b/integrations/access/slack/bot.go @@ -41,6 +41,11 @@ import ( ) const slackMaxConns = 100 + +// textObjectMaxCharLimit is the max length for a slack 'text' object. +// See https://api.slack.com/reference/block-kit/composition-objects#text for more details. +const textObjectMaxCharLimit = 3000 + const slackHTTPTimeout = 10 * time.Second const statusEmitTimeout = 10 * time.Second @@ -309,7 +314,7 @@ func (b Bot) slackAccessListReminderMsgSection(accessList *accesslist.AccessList sections := []BlockItem{ NewBlockItem(SectionBlock{ - Text: NewTextObjectItem(MarkdownObject{Text: msg}), + Text: NewTextObjectItem(MarkdownObject{Text: truncateTextObjectString(msg)}), }), } @@ -348,7 +353,7 @@ func (b Bot) slackAccessListBatchedReminderMsgSection(accessLists []*accesslist. sections := []BlockItem{ NewBlockItem(SectionBlock{ - Text: NewTextObjectItem(MarkdownObject{Text: fmt.Sprintf("%d Access Lists are due for reviews, %s\n%s", numOfReviewsRequired, dueDate, link)}), + Text: NewTextObjectItem(MarkdownObject{Text: truncateTextObjectString(fmt.Sprintf("%d Access Lists are due for reviews, %s\n%s", numOfReviewsRequired, dueDate, link))}), }), } @@ -365,14 +370,26 @@ func (b Bot) slackAccessRequestMsgSections(reqID string, reqData pd.AccessReques Text: NewTextObjectItem(MarkdownObject{Text: "You have a new Role Request:"}), }), NewBlockItem(SectionBlock{ - Text: NewTextObjectItem(MarkdownObject{Text: fields}), + Text: NewTextObjectItem(MarkdownObject{ + Text: truncateTextObjectString(fields), + }), }), NewBlockItem(ContextBlock{ ElementItems: []ContextElementItem{ - NewContextElementItem(MarkdownObject{Text: statusText}), + NewContextElementItem(MarkdownObject{ + Text: truncateTextObjectString(statusText), + }), }, }), } return sections } + +func truncateTextObjectString(s string) string { + truncateMsg := " (truncated)" + if len(s) <= textObjectMaxCharLimit { + return s + } + return s[:textObjectMaxCharLimit-len(truncateMsg)] + truncateMsg +} diff --git a/integrations/access/slack/testlib/suite.go b/integrations/access/slack/testlib/suite.go index 4103811ecc3..28f9a766ba9 100644 --- a/integrations/access/slack/testlib/suite.go +++ b/integrations/access/slack/testlib/suite.go @@ -184,7 +184,7 @@ func (s *SlackSuiteOSS) TestMessagePosting() { matches := requestReasonRegexp.FindAllStringSubmatch(block.Text.GetText(), -1) require.Len(t, matches, 1) require.Len(t, matches[0], 3) - assert.Equal(t, "because of "+strings.Repeat("A", 489), matches[0][1]) + assert.Equal(t, "because of "+strings.Repeat("A", 389), matches[0][1]) assert.Equal(t, " (truncated)", matches[0][2]) statusLine, err := getStatusLine(messages[0]) @@ -494,7 +494,7 @@ func (s *SlackSuiteOSS) TestDenial() { s.checkNewMessageUpdateByAPI(t, ctx, msgs, matchByTimestamp, func(t *testing.T, msgUpdate slack.Message) { statusLine, err := getStatusLine(msgUpdate) require.NoError(t, err) - assert.Equal(t, "*Status*: ❌ DENIED\n*Resolution reason*: ```\nnot okay "+strings.Repeat("A", 491)+"``` (truncated)", statusLine) + assert.Equal(t, "*Status*: ❌ DENIED\n*Resolution reason*: ```\nnot okay "+strings.Repeat("A", 391)+"``` (truncated)", statusLine) }) }