fix_:still return the image when handleAccountInitialsImpl is unable to get public key to generate color hash to generate ring (#5409)

* fix_:still return the image when handleAccountInitialsImpl unable to get public key

* test_:add unit test for handleAccountInitialsImpl

* test_:improve unit test

* fix_:still return the image when handleAccountImagesImpl unable to get public key
This commit is contained in:
frank 2024-07-19 16:41:45 +08:00 committed by GitHub
parent dc62171219
commit 4a43b2b2be
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 134 additions and 18 deletions

Binary file not shown.

View File

@ -353,22 +353,22 @@ func handleAccountImagesImpl(multiaccountsDB *multiaccounts.Database, logger *za
if accColorHash == nil {
if parsed.PublicKey == "" {
logger.Error("handleAccountImagesImpl: no public key for color hash", zap.String("keyUid", parsed.KeyUID))
return
}
accColorHash, err = colorhash.GenerateFor(parsed.PublicKey)
if err != nil {
logger.Error("handleAccountImagesImpl: could not generate color hash", zap.String("keyUid", parsed.KeyUID), zap.Error(err))
return
}
}
payload, err = ring.DrawRing(&ring.DrawRingParam{
Theme: parsed.Theme, ColorHash: accColorHash, ImageBytes: payload, Height: identityImage.Height, Width: identityImage.Width, RingWidth: parsed.RingWidth * enlargeRatio,
})
if err != nil {
logger.Error("handleAccountImagesImpl: failed to draw ring for account identity", zap.Error(err))
return
if accColorHash != nil {
payload, err = ring.DrawRing(&ring.DrawRingParam{
Theme: parsed.Theme, ColorHash: accColorHash, ImageBytes: payload, Height: identityImage.Height, Width: identityImage.Width, RingWidth: parsed.RingWidth * enlargeRatio,
})
if err != nil {
logger.Error("handleAccountImagesImpl: failed to draw ring for account identity", zap.Error(err))
return
}
}
}
@ -499,23 +499,23 @@ func handleAccountInitialsImpl(multiaccountsDB *multiaccounts.Database, logger *
if accColorHash == nil {
if parsed.PublicKey == "" {
logger.Error("handleAccountInitialsImpl: no public key, can't draw ring", zap.String("keyUid", parsed.KeyUID), zap.Error(err))
return
}
accColorHash, err = colorhash.GenerateFor(parsed.PublicKey)
if err != nil {
logger.Error("handleAccountInitialsImpl: failed to generate color hash from pubkey", zap.String("keyUid", parsed.KeyUID), zap.Error(err))
return
}
}
payload, err = ring.DrawRing(&ring.DrawRingParam{
Theme: parsed.Theme, ColorHash: accColorHash, ImageBytes: payload, Height: parsed.BgSize, Width: parsed.BgSize, RingWidth: parsed.RingWidth,
})
if accColorHash != nil {
payload, err = ring.DrawRing(&ring.DrawRingParam{
Theme: parsed.Theme, ColorHash: accColorHash, ImageBytes: payload, Height: parsed.BgSize, Width: parsed.BgSize, RingWidth: parsed.RingWidth,
})
if err != nil {
logger.Error("failed to draw ring for account identity", zap.Error(err))
return
if err != nil {
logger.Error("handleAccountInitialsImpl: failed to draw ring for account identity", zap.Error(err))
return
}
}
}
@ -642,7 +642,7 @@ func handleContactImages(db *sql.DB, logger *zap.Logger) http.HandlerFunc {
}
if parsed.Ring && parsed.RingWidth == 0 {
logger.Error("handleAccountImagesImpl: no ringWidth.")
logger.Error("handleContactImages: no ringWidth.")
return
}
@ -692,7 +692,7 @@ func handleContactImages(db *sql.DB, logger *zap.Logger) http.HandlerFunc {
if parsed.IndicatorSize != 0 {
payload, err = images.AddStatusIndicatorToImage(payload, parsed.IndicatorColor, parsed.IndicatorSize*enlargeRatio, parsed.IndicatorBorder*enlargeRatio, parsed.IndicatorCenterToEdge*enlargeRatio)
if err != nil {
logger.Error("handleAccountImagesImpl: failed to draw status-indicator for initials", zap.Error(err))
logger.Error("handleContactImages: failed to draw status-indicator for initials", zap.Error(err))
return
}
}

View File

@ -3,11 +3,21 @@ package server
import (
"database/sql"
"encoding/json"
"image/color"
"net/http"
"net/http/httptest"
"net/url"
"path/filepath"
"testing"
"github.com/status-im/status-go/images"
"github.com/status-im/status-go/eth-node/crypto"
"github.com/status-im/status-go/common/dbsetup"
"github.com/status-im/status-go/multiaccounts"
mc "github.com/status-im/status-go/multiaccounts/common"
"github.com/golang/protobuf/proto"
"github.com/stretchr/testify/suite"
"go.uber.org/zap"
@ -545,3 +555,109 @@ func (s *HandlersSuite) TestHandleStatusLinkPreviewThumbnail() {
})
}
}
func (s *HandlersSuite) validateResponse(w *httptest.ResponseRecorder) {
s.Require().Equal(http.StatusOK, w.Code)
s.Require().Equal("image/png", w.Header().Get("Content-Type"))
n, err := w.Result().Body.Read(make([]byte, 100))
s.Require().NoError(err)
s.Require().Greater(n, 0)
}
// TestHandleAccountInitialsImpl tests the handleAccountInitialsImpl function
func (s *HandlersSuite) TestHandleAccountInitialsImpl() {
// given an account without public key, and request to generate ring with keyUID of the account,
// it should still response with a valid image without ring rather than response with empty image
dbFile := filepath.Join(s.T().TempDir(), "accounts-tests-")
db, err := multiaccounts.InitializeDB(dbFile)
s.Require().NoError(err)
defer db.Close()
keyUID := "0x1"
name := "Lopsided Goodnatured Bedbug"
expected := multiaccounts.Account{Name: name, KeyUID: keyUID, CustomizationColor: mc.CustomizationColorBlue, ColorHash: nil, ColorID: 10, KDFIterations: dbsetup.ReducedKDFIterationsNumber, Timestamp: 1712856359}
s.Require().NoError(db.SaveAccount(expected))
accounts, err := db.GetAccounts()
s.Require().NoError(err)
s.Require().Len(accounts, 1)
s.Require().Equal(expected, accounts[0])
w := httptest.NewRecorder()
f, err := filepath.Abs("../_assets/tests/UbuntuMono-Regular.ttf")
s.Require().NoError(err)
p := ImageParams{
Ring: true,
RingWidth: 1,
KeyUID: keyUID,
InitialsLength: 2,
BgColor: color.Transparent,
Color: color.Transparent,
FontFile: f,
BgSize: 1,
FontSize: 1,
UppercaseRatio: 1.0,
}
handleAccountInitialsImpl(db, s.logger, w, p)
s.validateResponse(w)
// pass a public key to generate ring
k, err := crypto.GenerateKey()
s.Require().NoError(err)
p.PublicKey = common.PubkeyToHex(&k.PublicKey)
w = httptest.NewRecorder()
handleAccountInitialsImpl(db, s.logger, w, p)
s.Require().Equal(http.StatusOK, w.Code)
}
// TestHandleAccountImagesImpl tests the handleAccountImagesImpl function
func (s *HandlersSuite) TestHandleAccountImagesImpl() {
// given an account with identity images and without public key, and request to generate ring with keyUID of the account,
// it should still response with a valid image without ring rather than response with empty image
dbFile := filepath.Join(s.T().TempDir(), "accounts-tests-")
db, err := multiaccounts.InitializeDB(dbFile)
s.Require().NoError(err)
defer db.Close()
keyUID := "0x1"
name := "Lopsided Goodnatured Bedbug"
expected := multiaccounts.Account{
Name: name,
KeyUID: keyUID,
CustomizationColor: mc.CustomizationColorBlue,
ColorHash: nil,
ColorID: 10,
KDFIterations: dbsetup.ReducedKDFIterationsNumber,
Timestamp: 1712856359,
Images: images.SampleIdentityImageForQRCode(),
}
s.Require().NoError(db.SaveAccount(expected))
accounts, err := db.GetAccounts()
s.Require().NoError(err)
s.Require().Len(accounts, 1)
s.Require().Equal(expected, accounts[0])
w := httptest.NewRecorder()
f, err := filepath.Abs("../_assets/tests/UbuntuMono-Regular.ttf")
s.Require().NoError(err)
p := ImageParams{
Ring: true,
RingWidth: 1,
KeyUID: keyUID,
InitialsLength: 2,
BgColor: color.Transparent,
Color: color.Transparent,
FontFile: f,
BgSize: 1,
FontSize: 1,
UppercaseRatio: 1.0,
ImageName: images.LargeDimName,
}
handleAccountImagesImpl(db, s.logger, w, p)
s.validateResponse(w)
// pass a public key to generate ring
k, err := crypto.GenerateKey()
s.Require().NoError(err)
p.PublicKey = common.PubkeyToHex(&k.PublicKey)
w = httptest.NewRecorder()
handleAccountImagesImpl(db, s.logger, w, p)
s.Require().Equal(http.StatusOK, w.Code)
}