summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/webhook_test.go100
-rw-r--r--app/webhook.go37
2 files changed, 79 insertions, 58 deletions
diff --git a/api/webhook_test.go b/api/webhook_test.go
index 5a0e44630..93d596bb1 100644
--- a/api/webhook_test.go
+++ b/api/webhook_test.go
@@ -1005,37 +1005,37 @@ func TestIncomingWebhooks(t *testing.T) {
}
attachmentPayload := `{
- "text": "this is a test",
- "attachments": [
- {
- "fallback": "Required plain-text summary of the attachment.",
+ "text": "this is a test",
+ "attachments": [
+ {
+ "fallback": "Required plain-text summary of the attachment.",
- "color": "#36a64f",
+ "color": "#36a64f",
- "pretext": "Optional text that appears above the attachment block",
+ "pretext": "Optional text that appears above the attachment block",
- "author_name": "Bobby Tables",
- "author_link": "http://flickr.com/bobby/",
- "author_icon": "http://flickr.com/icons/bobby.jpg",
+ "author_name": "Bobby Tables",
+ "author_link": "http://flickr.com/bobby/",
+ "author_icon": "http://flickr.com/icons/bobby.jpg",
- "title": "Slack API Documentation",
- "title_link": "https://api.slack.com/",
+ "title": "Slack API Documentation",
+ "title_link": "https://api.slack.com/",
- "text": "Optional text that appears within the attachment",
+ "text": "Optional text that appears within the attachment",
- "fields": [
- {
- "title": "Priority",
- "value": "High",
- "short": false
- }
- ],
+ "fields": [
+ {
+ "title": "Priority",
+ "value": "High",
+ "short": false
+ }
+ ],
- "image_url": "http://my-website.com/path/to/image.jpg",
- "thumb_url": "http://example.com/path/to/thumb.png"
- }
- ]
- }`
+ "image_url": "http://my-website.com/path/to/image.jpg",
+ "thumb_url": "http://example.com/path/to/thumb.png"
+ }
+ ]
+ }`
if _, err := Client.DoPost(url, attachmentPayload, "application/json"); err != nil {
t.Fatal(err)
@@ -1050,42 +1050,42 @@ func TestIncomingWebhooks(t *testing.T) {
tooLongText += "a"
}
- if _, err := Client.DoPost(url, "{\"text\":\""+tooLongText+"\"}", "application/json"); err == nil || err.StatusCode != http.StatusBadRequest {
- t.Fatal("should have failed - text too long")
+ if _, err := Client.DoPost(url, "{\"text\":\""+tooLongText+"\"}", "application/json"); err != nil {
+ t.Fatal(err)
}
attachmentPayload = `{
- "text": "this is a test",
- "attachments": [
- {
- "fallback": "Required plain-text summary of the attachment.",
+ "text": "this is a test",
+ "attachments": [
+ {
+ "fallback": "Required plain-text summary of the attachment.",
- "color": "#36a64f",
+ "color": "#36a64f",
- "pretext": "Optional text that appears above the attachment block",
+ "pretext": "Optional text that appears above the attachment block",
- "author_name": "Bobby Tables",
- "author_link": "http://flickr.com/bobby/",
- "author_icon": "http://flickr.com/icons/bobby.jpg",
+ "author_name": "Bobby Tables",
+ "author_link": "http://flickr.com/bobby/",
+ "author_icon": "http://flickr.com/icons/bobby.jpg",
- "title": "Slack API Documentation",
- "title_link": "https://api.slack.com/",
+ "title": "Slack API Documentation",
+ "title_link": "https://api.slack.com/",
- "text": "` + tooLongText + `",
+ "text": "` + tooLongText + `",
- "fields": [
- {
- "title": "Priority",
- "value": "High",
- "short": false
- }
- ],
+ "fields": [
+ {
+ "title": "Priority",
+ "value": "High",
+ "short": false
+ }
+ ],
- "image_url": "http://my-website.com/path/to/image.jpg",
- "thumb_url": "http://example.com/path/to/thumb.png"
- }
- ]
- }`
+ "image_url": "http://my-website.com/path/to/image.jpg",
+ "thumb_url": "http://example.com/path/to/thumb.png"
+ }
+ ]
+ }`
if _, err := Client.DoPost(url, attachmentPayload, "application/json"); err == nil || err.StatusCode != http.StatusBadRequest {
t.Fatal("should have failed with bad request - attachment too long")
diff --git a/app/webhook.go b/app/webhook.go
index 1ec96a32e..6a7bb16e1 100644
--- a/app/webhook.go
+++ b/app/webhook.go
@@ -150,11 +150,37 @@ func CreateWebhookPost(userId, teamId, channelId, text, overrideUsername, overri
}
}
- if _, err := CreatePost(post, teamId, false); err != nil {
- return nil, model.NewLocAppError("CreateWebhookPost", "api.post.create_webhook_post.creating.app_error", nil, "err="+err.Message)
+ splits := make([]string, 0)
+ remainingText := post.Message
+
+ for len(remainingText) > model.POST_MESSAGE_MAX_RUNES {
+ splits = append(splits, remainingText[:model.POST_MESSAGE_MAX_RUNES])
+ remainingText = remainingText[model.POST_MESSAGE_MAX_RUNES:]
+ }
+
+ splits = append(splits, remainingText)
+
+ var firstPost *model.Post = nil
+
+ for _, txt := range splits {
+ post.Id = ""
+ post.UpdateAt = 0
+ post.CreateAt = 0
+ post.Message = txt
+ if _, err := CreatePost(post, teamId, false); err != nil {
+ return nil, model.NewLocAppError("CreateWebhookPost", "api.post.create_webhook_post.creating.app_error", nil, "err="+err.Message)
+ }
+
+ if firstPost == nil {
+ if len(splits) > 1 {
+ firstPost = model.PostFromJson(strings.NewReader(post.ToJson()))
+ } else {
+ firstPost = post
+ }
+ }
}
- return post, nil
+ return firstPost, nil
}
func CreateIncomingWebhookForChannel(creatorId string, channel *model.Channel, hook *model.IncomingWebhook) (*model.IncomingWebhook, *model.AppError) {
@@ -430,11 +456,6 @@ func HandleIncomingWebhook(hookId string, req *model.IncomingWebhookRequest) *mo
return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.text.app_error", nil, "", http.StatusBadRequest)
}
- textSize := utf8.RuneCountInString(text)
- if textSize > model.POST_MESSAGE_MAX_RUNES {
- return model.NewAppError("HandleIncomingWebhook", "web.incoming_webhook.text.length.app_error", map[string]interface{}{"Max": model.POST_MESSAGE_MAX_RUNES, "Actual": textSize}, "", http.StatusBadRequest)
- }
-
channelName := req.ChannelName
webhookType := req.Type