diff --git a/telegram/utils.go b/telegram/utils.go index f29963d..c667d53 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -129,6 +129,8 @@ func NewMessageLimitSince(since int64) *MessageLimit { return &limit } +const AVATAR_SIZE_LIMIT int64 = 128 * 1024 + // GetContactByUsername resolves username to user id retrieves user and chat information func (c *Client) GetContactByUsername(username string) (*client.Chat, *client.User, error) { if !c.Online() { @@ -353,6 +355,12 @@ func (c *Client) getFileData(tgFile *client.File, typ byte) string { priority = 32 } + // avoid not-well-formed stanza errors + if typ == typeFileDataBase64 && c.GetPhotoSize(tgFile) > AVATAR_SIZE_LIMIT { + log.Warnf("Photo %v skipped as it's too huge", tgFile.Id) + return "" + } + file, path, err := c.ForceOpenFile(tgFile, priority) if err == nil { defer file.Close() @@ -395,16 +403,16 @@ func (c *Client) SetEmptyAvatarHash(chatId int64) { c.AvatarHashesLock.Unlock() } -// GetPhotoSha1AndSize obtains data for PEP -func (c *Client) GetPhotoSha1AndSize(photo *client.File, chatId int64) (string, int64) { - sha1 := c.GetPhotoSha1(photo, chatId) - +// GetPhotoSize return at least a rough size +func (c *Client) GetPhotoSize(photo *client.File) int64 { + if photo == nil { + return 0 + } size := photo.Size if size == 0 { size = photo.ExpectedSize } - - return sha1, size + return size } // GetPhotoSha1 computes the photo hash @@ -1684,7 +1692,8 @@ func (c *Client) SendMessageToGateway(chatId int64, message *client.Message, id if chat.Photo == nil { c.SetEmptyAvatarHash(chatId) } else { - sha1, size := c.GetPhotoSha1AndSize(chat.Photo.Small, chatId) + sha1 := c.GetPhotoSha1(chat.Photo.Small, chatId) + size := c.GetPhotoSize(chat.Photo.Small) for resource := range c.resourcesRange() { features, ok := c.XmppClientFeatures[resource] diff --git a/xmpp/handlers.go b/xmpp/handlers.go index d33c5d2..c0cf696 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -1803,7 +1803,8 @@ func sendPubSubAvatarNotifications(s xmpp.Sender, jid string, session *telegram. continue } - sha1, size := session.GetPhotoSha1AndSize(chat.Photo.Small, chat.Id) + sha1 := session.GetPhotoSha1(chat.Photo.Small, chat.Id) + size := session.GetPhotoSize(chat.Photo.Small) gateway.SendPubSubAvatarNotification(component, jid, chat.Id, sha1, size) }