From 60547f384c377f966fddd5b79755032f70473d08 Mon Sep 17 00:00:00 2001 From: DmitryZagorulko Date: Fri, 12 Oct 2018 13:39:55 +0300 Subject: [PATCH 1/4] add tags in sentry --- src/error_handler.go | 24 ++++++++++++++++++++++++ src/routing.go | 24 ++---------------------- src/run.go | 42 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 24 deletions(-) diff --git a/src/error_handler.go b/src/error_handler.go index 4f0b05e..56c0368 100644 --- a/src/error_handler.go +++ b/src/error_handler.go @@ -67,6 +67,30 @@ func ErrorCaptureHandler(client *raven.Client, errorsStacktrace bool) ErrorHandl "endpoint": c.Request.RequestURI, } + var ( + ok bool + conn Connection + ) + + connection, ok := c.Get("connection") + if ok { + conn = connection.(Connection) + } + + b, ok := c.Get("bot") + if ok { + tags["bot"] = b.(Bot).Token + conn = *getConnectionById(b.(Bot).ConnectionID) + } + + if conn.APIURL != "" { + tags["crm"] = conn.APIURL + } + + if conn.ClientID != "" { + tags["clientID"] = conn.ClientID + } + if recovery != nil { stacktrace := raven.NewStacktrace(4, 3, nil) recStr := fmt.Sprint(recovery) diff --git a/src/routing.go b/src/routing.go index 9024953..35120f4 100644 --- a/src/routing.go +++ b/src/routing.go @@ -406,17 +406,7 @@ func updateBots(conn *Connection, hashSettings string) { } func telegramWebhookHandler(c *gin.Context) { - token := c.Param("token") - b, err := getBotByToken(token) - if err != nil { - c.Error(err) - return - } - - if b.ID == 0 { - c.AbortWithStatus(http.StatusOK) - return - } + b := c.MustGet("bot").(Bot) conn := getConnectionById(b.ConnectionID) if !conn.Active { @@ -559,17 +549,7 @@ func telegramWebhookHandler(c *gin.Context) { } func mgWebhookHandler(c *gin.Context) { - clientID := c.GetHeader("Clientid") - if clientID == "" { - c.AbortWithStatus(http.StatusBadRequest) - return - } - - conn := getConnection(clientID) - if !conn.Active { - c.AbortWithStatus(http.StatusBadRequest) - return - } + conn := c.MustGet("connection").(Connection) var msg v1.WebhookRequest if err := c.ShouldBindJSON(&msg); err != nil { diff --git a/src/run.go b/src/run.go index 74fd3db..a7b3c50 100644 --- a/src/run.go +++ b/src/run.go @@ -1,6 +1,7 @@ package main import ( + "net/http" "os" "os/signal" "syscall" @@ -92,8 +93,8 @@ func setup() *gin.Engine { r.POST("/delete-bot/", checkBotForRequest(), deleteBotHandler) r.POST("/set-lang/", checkBotForRequest(), setLangBotHandler) r.POST("/actions/activity", activityHandler) - r.POST("/telegram/:token", telegramWebhookHandler) - r.POST("/webhook/", mgWebhookHandler) + r.POST("/telegram/:token", checkBotForWebhook(), telegramWebhookHandler) + r.POST("/webhook/", checkConnectionForWebhook(), mgWebhookHandler) return r } @@ -147,3 +148,40 @@ func checkConnectionForRequest() gin.HandlerFunc { c.Set("connection", conn) } } + +func checkConnectionForWebhook() gin.HandlerFunc { + return func(c *gin.Context) { + clientID := c.GetHeader("Clientid") + if clientID == "" { + c.AbortWithStatus(http.StatusBadRequest) + return + } + + conn := getConnection(clientID) + if !conn.Active { + c.AbortWithStatus(http.StatusBadRequest) + return + } + + c.Set("connection", *conn) + } +} + +func checkBotForWebhook() gin.HandlerFunc { + return func(c *gin.Context) { + token := c.Param("token") + + b, err := getBotByToken(token) + if err != nil { + c.Error(err) + return + } + + if b.ID == 0 { + c.AbortWithStatus(http.StatusOK) + return + } + + c.Set("bot", *b) + } +} From 2a308bc66062e96eebdc191e6b71320dbc8ff22b Mon Sep 17 00:00:00 2001 From: Alex Lushpai Date: Wed, 24 Oct 2018 17:21:55 +0300 Subject: [PATCH 2/4] handle http 402 status --- go.mod | 2 +- go.sum | 4 ++-- src/routing.go | 6 ++++++ translate/translate.en.yml | 1 + translate/translate.es.yml | 1 + translate/translate.ru.yml | 1 + 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e6d2520..71cd701 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 github.com/pkg/errors v0.8.0 github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/retailcrm/api-client-go v1.0.7 + github.com/retailcrm/api-client-go v1.1.0 github.com/retailcrm/mg-transport-api-client-go v1.1.11 github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf // indirect github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect diff --git a/go.sum b/go.sum index c459b47..64e8d2b 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,8 @@ github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/retailcrm/api-client-go v1.0.7 h1:j4C2PvPUDP9nAuYWDvJPnYNpkj+LDBgn71kHvxJmSPg= -github.com/retailcrm/api-client-go v1.0.7/go.mod h1:QRoPE2SM6ST7i2g0yEdqm7Iw98y7cYuq3q14Ot+6N8c= +github.com/retailcrm/api-client-go v1.1.0 h1:APPO6ccJAeMV7Jz7BhrtDKSOm2r1j5Ft6fuEXNP2ij4= +github.com/retailcrm/api-client-go v1.1.0/go.mod h1:QRoPE2SM6ST7i2g0yEdqm7Iw98y7cYuq3q14Ot+6N8c= github.com/retailcrm/mg-transport-api-client-go v1.1.11 h1:jAIOKqkjA2r0v/V6lTHYQsD8q0lFpfpqzAffHAJlhCQ= github.com/retailcrm/mg-transport-api-client-go v1.1.11/go.mod h1:AWV6BueE28/6SCoyfKURTo4lF0oXYoOKmHTzehd5vAI= github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf h1:6V1qxN6Usn4jy8unvggSJz/NC790tefw8Zdy6OZS5co= diff --git a/src/routing.go b/src/routing.go index 35120f4..fcfc9e6 100644 --- a/src/routing.go +++ b/src/routing.go @@ -187,6 +187,12 @@ func createHandler(c *gin.Context) { return } + if status == http.StatusPaymentRequired { + c.AbortWithStatusJSON(BadRequest("error_payment_mg")) + logger.Error(conn.APIURL, status, errr.ApiErr, data) + return + } + if status >= http.StatusBadRequest { c.AbortWithStatusJSON(BadRequest("error_activity_mg")) logger.Error(conn.APIURL, status, errr.ApiErr, data) diff --git a/translate/translate.en.yml b/translate/translate.en.yml index e40bdb4..5deae0b 100644 --- a/translate/translate.en.yml +++ b/translate/translate.en.yml @@ -27,6 +27,7 @@ incorrect_token: Create the correct token error_creating_webhook: Error when creating a webhook error_adding_bot: Error when adding a bot error_save: Error while saving, contact technical support +error_payment_mg: Your account has insufficient funds to activate integration module missing_credentials: "Required methods: {{.Credentials}}" error_activity_mg: Check if the integration with retailCRM Chat is enabled in retailCRM settings info_bot: "If you have a problem with connecting a bot, please, refer to the documentation" diff --git a/translate/translate.es.yml b/translate/translate.es.yml index e205ca0..13bcc87 100644 --- a/translate/translate.es.yml +++ b/translate/translate.es.yml @@ -28,6 +28,7 @@ incorrect_token: Crear el token correcto error_creating_webhook: Error al crear el webhook error_adding_bot: Error al añadir el bot error_save: Error al guardar, contacte con el soporte técnico +error_payment_mg: Su cuenta no tiene fondos suficientes para activar el módulo de integración. missing_credentials: "Métodos requeridos: {{.Credenciales}}" error_activity_mg: Revisar si la integración con retailCRM Chat está habilitada en Ajustes de retailCRM info_bot: "Si tiene dificultades para conectar el bot, por favor, consulte la documentación" diff --git a/translate/translate.ru.yml b/translate/translate.ru.yml index 5b14854..52d7a3e 100644 --- a/translate/translate.ru.yml +++ b/translate/translate.ru.yml @@ -27,6 +27,7 @@ incorrect_token: Установите корректный токен error_creating_webhook: Ошибка при создании webhook error_adding_bot: Ошибка при добавлении бота error_save: Ошибка при сохранении, обратитесь в службу технической поддержки +error_payment_mg: На Вашем счете недостаточно средств для активации данного модуля missing_credentials: "Необходимые методы: {{.Credentials}}" error_activity_mg: Проверьте активность интеграции с retailCRM Chat в настройках retailCRM info_bot: "Если у вас возникли трудности при подключении бота, изучите, пожалуйста, документацию" From 187a797648bc17f9350e408c6a2c5203437937f5 Mon Sep 17 00:00:00 2001 From: DmitryZagorulko Date: Tue, 6 Nov 2018 13:55:34 +0300 Subject: [PATCH 3/4] replace markdown symbols --- src/routing.go | 18 +++++++++--------- src/utils.go | 9 +++++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/routing.go b/src/routing.go index fcfc9e6..1d321b7 100644 --- a/src/routing.go +++ b/src/routing.go @@ -591,7 +591,7 @@ func mgWebhookHandler(c *gin.Context) { var mb string switch msg.Data.Type { case v1.MsgTypeProduct: - mb = fmt.Sprintf("*%s*\n", msg.Data.Product.Name) + mb = fmt.Sprintf("*%s*\n", replaceMarkdownSymbols(msg.Data.Product.Name)) if msg.Data.Product.Cost != nil && msg.Data.Product.Cost.Value != 0 { mb += fmt.Sprintf( @@ -608,9 +608,9 @@ func mgWebhookHandler(c *gin.Context) { } if msg.Data.Product.Url != "" { - mb += msg.Data.Product.Url + mb += replaceMarkdownSymbols(msg.Data.Product.Url) } else { - mb += msg.Data.Product.Img + mb += replaceMarkdownSymbols(msg.Data.Product.Img) } case v1.MsgTypeOrder: mb = getOrderMessage(msg.Data.Order) @@ -678,7 +678,7 @@ func getOrderMessage(dataOrder *v1.MessageDataOrder) string { mb := "*" + getLocalizedMessage("order") if dataOrder.Number != "" { - mb += " " + dataOrder.Number + mb += " " + replaceMarkdownSymbols(dataOrder.Number) } if dataOrder.Date != "" { @@ -691,7 +691,7 @@ func getOrderMessage(dataOrder *v1.MessageDataOrder) string { mb += fmt.Sprintf( "%d. %s", k+1, - v.Name, + replaceMarkdownSymbols(v.Name), ) if v.Quantity != nil { @@ -727,7 +727,7 @@ func getOrderMessage(dataOrder *v1.MessageDataOrder) string { mb += fmt.Sprintf( "\n*%s:*\n%s", getLocalizedMessage("delivery"), - dataOrder.Delivery.Name, + replaceMarkdownSymbols(dataOrder.Delivery.Name), ) } @@ -747,7 +747,7 @@ func getOrderMessage(dataOrder *v1.MessageDataOrder) string { } if dataOrder.Delivery.Address != "" { - mb += ";\n" + dataOrder.Delivery.Address + mb += ";\n" + replaceMarkdownSymbols(dataOrder.Delivery.Address) } mb += "\n" @@ -759,7 +759,7 @@ func getOrderMessage(dataOrder *v1.MessageDataOrder) string { getLocalizedMessage("payment"), ) for _, v := range dataOrder.Payments { - mb += v.Name + mb += replaceMarkdownSymbols(v.Name) if v.Amount != nil { if val, ok := currency[strings.ToLower(v.Amount.Currency)]; ok && v.Amount.Value != 0 { @@ -779,7 +779,7 @@ func getOrderMessage(dataOrder *v1.MessageDataOrder) string { if v.Status != nil && v.Status.Name != "" { mb += fmt.Sprintf( " (%s)", - v.Status.Name, + replaceMarkdownSymbols(v.Status.Name), ) } diff --git a/src/utils.go b/src/utils.go index bb93420..b922617 100644 --- a/src/utils.go +++ b/src/utils.go @@ -24,6 +24,7 @@ var ( "/api/integration-modules/{code}", "/api/integration-modules/{code}/edit", } + markdownSymbols = []string{"*", "_", "`", "["} ) // GenerateToken function @@ -133,3 +134,11 @@ func getChannelSettingsHash() (hash string, err error) { return } + +func replaceMarkdownSymbols(s string) string { + for _, v := range markdownSymbols { + s = strings.Replace(s, v, "\\"+v, -1) + } + + return s +} From 2bdd42d20c40d312f75bb04a2640166625b1d0b8 Mon Sep 17 00:00:00 2001 From: DmitryZagorulko Date: Tue, 6 Nov 2018 14:35:52 +0300 Subject: [PATCH 4/4] add fields validation --- src/models.go | 20 ++++++++++---------- templates/form.html | 6 +++--- templates/home.html | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/models.go b/src/models.go index b7f5310..51893d3 100644 --- a/src/models.go +++ b/src/models.go @@ -6,10 +6,10 @@ import "time" type Connection struct { ID int `gorm:"primary_key"` ClientID string `gorm:"client_id type:varchar(70);not null;unique" json:"clientId,omitempty"` - APIKEY string `gorm:"api_key type:varchar(100);not null" json:"api_key,omitempty" binding:"required"` - APIURL string `gorm:"api_url type:varchar(255);not null" json:"api_url,omitempty" binding:"required,validatecrmurl"` - MGURL string `gorm:"mg_url type:varchar(255);not null;" json:"mg_url,omitempty"` - MGToken string `gorm:"mg_token type:varchar(100);not null;unique" json:"mg_token,omitempty"` + APIKEY string `gorm:"api_key type:varchar(100);not null" json:"api_key,omitempty" binding:"required,max=100"` + APIURL string `gorm:"api_url type:varchar(255);not null" json:"api_url,omitempty" binding:"required,validatecrmurl,max=255"` + MGURL string `gorm:"mg_url type:varchar(255);not null;" json:"mg_url,omitempty" binding:"max=255"` + MGToken string `gorm:"mg_token type:varchar(100);not null;unique" json:"mg_token,omitempty" binding:"max=100"` CreatedAt time.Time UpdatedAt time.Time Active bool `json:"active,omitempty"` @@ -21,10 +21,10 @@ type Bot struct { ID int `gorm:"primary_key"` ConnectionID int `gorm:"connection_id" json:"connectionId,omitempty"` Channel uint64 `gorm:"channel;not null;unique" json:"channel,omitempty"` - ChannelSettingsHash string `gorm:"channel_settings_hash type:varchar(70)"` - Token string `gorm:"token type:varchar(100);not null;unique" json:"token,omitempty"` - Name string `gorm:"name type:varchar(40)" json:"name,omitempty"` - Lang string `gorm:"lang type:varchar(2)" json:"lang,omitempty"` + ChannelSettingsHash string `gorm:"channel_settings_hash type:varchar(70)" binding:"max=70"` + Token string `gorm:"token type:varchar(100);not null;unique" json:"token,omitempty" binding:"max=100"` + Name string `gorm:"name type:varchar(40)" json:"name,omitempty" binding:"max=40"` + Lang string `gorm:"lang type:varchar(2)" json:"lang,omitempty" binding:"max=2"` CreatedAt time.Time UpdatedAt time.Time } @@ -33,8 +33,8 @@ type Bot struct { type User struct { ID int `gorm:"primary_key"` ExternalID int `gorm:"external_id;not null;unique"` - UserPhotoURL string `gorm:"user_photo_url type:varchar(255)"` - UserPhotoID string `gorm:"user_photo_id type:varchar(100)"` + UserPhotoURL string `gorm:"user_photo_url type:varchar(255)" binding:"max=255"` + UserPhotoID string `gorm:"user_photo_id type:varchar(100)" binding:"max=100"` CreatedAt time.Time UpdatedAt time.Time } diff --git a/templates/form.html b/templates/form.html index 988f6fa..708098b 100644 --- a/templates/form.html +++ b/templates/form.html @@ -12,12 +12,12 @@
- +
- +
@@ -40,7 +40,7 @@
- +
diff --git a/templates/home.html b/templates/home.html index ac7b2d5..d1489fe 100644 --- a/templates/home.html +++ b/templates/home.html @@ -4,13 +4,13 @@
-
- +