fix(contacts)_: fix trust status not being saved to cache when changed (#5965)
Fixes https://github.com/status-im/status-desktop/issues/16392
This commit is contained in:
parent
6ee62061bc
commit
d99fdf1b67
|
@ -24,6 +24,10 @@ import (
|
||||||
const minContactVerificationMessageLen = 1
|
const minContactVerificationMessageLen = 1
|
||||||
const maxContactVerificationMessageLen = 280
|
const maxContactVerificationMessageLen = 280
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrContactNotMutual = errors.New("must be a mutual contact")
|
||||||
|
)
|
||||||
|
|
||||||
func (m *Messenger) SendContactVerificationRequest(ctx context.Context, contactID string, challenge string) (*MessengerResponse, error) {
|
func (m *Messenger) SendContactVerificationRequest(ctx context.Context, contactID string, challenge string) (*MessengerResponse, error) {
|
||||||
if len(challenge) < minContactVerificationMessageLen || len(challenge) > maxContactVerificationMessageLen {
|
if len(challenge) < minContactVerificationMessageLen || len(challenge) > maxContactVerificationMessageLen {
|
||||||
return nil, errors.New("invalid verification request challenge length")
|
return nil, errors.New("invalid verification request challenge length")
|
||||||
|
@ -31,7 +35,7 @@ func (m *Messenger) SendContactVerificationRequest(ctx context.Context, contactI
|
||||||
|
|
||||||
contact, ok := m.allContacts.Load(contactID)
|
contact, ok := m.allContacts.Load(contactID)
|
||||||
if !ok || !contact.mutual() {
|
if !ok || !contact.mutual() {
|
||||||
return nil, errors.New("must be a mutual contact")
|
return nil, ErrContactNotMutual
|
||||||
}
|
}
|
||||||
|
|
||||||
verifRequest := &verification.Request{
|
verifRequest := &verification.Request{
|
||||||
|
@ -138,7 +142,7 @@ func (m *Messenger) SendContactVerificationRequest(ctx context.Context, contactI
|
||||||
func (m *Messenger) GetVerificationRequestSentTo(ctx context.Context, contactID string) (*verification.Request, error) {
|
func (m *Messenger) GetVerificationRequestSentTo(ctx context.Context, contactID string) (*verification.Request, error) {
|
||||||
_, ok := m.allContacts.Load(contactID)
|
_, ok := m.allContacts.Load(contactID)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("contact not found")
|
return nil, ErrContactNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.verificationDatabase.GetLatestVerificationRequestSentTo(contactID)
|
return m.verificationDatabase.GetLatestVerificationRequestSentTo(contactID)
|
||||||
|
@ -279,7 +283,7 @@ func (m *Messenger) AcceptContactVerificationRequest(ctx context.Context, id str
|
||||||
|
|
||||||
contact, ok := m.allContacts.Load(contactID)
|
contact, ok := m.allContacts.Load(contactID)
|
||||||
if !ok || !contact.mutual() {
|
if !ok || !contact.mutual() {
|
||||||
return nil, errors.New("must be a mutual contact")
|
return nil, ErrContactNotMutual
|
||||||
}
|
}
|
||||||
|
|
||||||
chat, ok := m.allChats.Load(contactID)
|
chat, ok := m.allChats.Load(contactID)
|
||||||
|
@ -394,7 +398,7 @@ func (m *Messenger) VerifiedTrusted(ctx context.Context, request *requests.Verif
|
||||||
|
|
||||||
contact, ok := m.allContacts.Load(contactID)
|
contact, ok := m.allContacts.Load(contactID)
|
||||||
if !ok || !contact.mutual() {
|
if !ok || !contact.mutual() {
|
||||||
return nil, errors.New("must be a mutual contact")
|
return nil, ErrContactNotMutual
|
||||||
}
|
}
|
||||||
|
|
||||||
err = m.setTrustStatusForContact(context.Background(), contactID, verification.TrustStatusTRUSTED)
|
err = m.setTrustStatusForContact(context.Background(), contactID, verification.TrustStatusTRUSTED)
|
||||||
|
@ -589,7 +593,7 @@ func (m *Messenger) DeclineContactVerificationRequest(ctx context.Context, id st
|
||||||
|
|
||||||
contact, ok := m.allContacts.Load(verifRequest.From)
|
contact, ok := m.allContacts.Load(verifRequest.From)
|
||||||
if !ok || !contact.mutual() {
|
if !ok || !contact.mutual() {
|
||||||
return nil, errors.New("must be a mutual contact")
|
return nil, ErrContactNotMutual
|
||||||
}
|
}
|
||||||
contactID := verifRequest.From
|
contactID := verifRequest.From
|
||||||
contact, err = m.setContactVerificationStatus(contactID, VerificationStatusVERIFIED)
|
contact, err = m.setContactVerificationStatus(contactID, VerificationStatusVERIFIED)
|
||||||
|
@ -686,7 +690,7 @@ func (m *Messenger) DeclineContactVerificationRequest(ctx context.Context, id st
|
||||||
func (m *Messenger) setContactVerificationStatus(contactID string, verificationStatus VerificationStatus) (*Contact, error) {
|
func (m *Messenger) setContactVerificationStatus(contactID string, verificationStatus VerificationStatus) (*Contact, error) {
|
||||||
contact, ok := m.allContacts.Load(contactID)
|
contact, ok := m.allContacts.Load(contactID)
|
||||||
if !ok || !contact.mutual() {
|
if !ok || !contact.mutual() {
|
||||||
return nil, errors.New("must be a mutual contact")
|
return nil, ErrContactNotMutual
|
||||||
}
|
}
|
||||||
|
|
||||||
contact.VerificationStatus = verificationStatus
|
contact.VerificationStatus = verificationStatus
|
||||||
|
@ -714,6 +718,11 @@ func (m *Messenger) setContactVerificationStatus(contactID string, verificationS
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Messenger) setTrustStatusForContact(ctx context.Context, contactID string, trustStatus verification.TrustStatus) error {
|
func (m *Messenger) setTrustStatusForContact(ctx context.Context, contactID string, trustStatus verification.TrustStatus) error {
|
||||||
|
contact, ok := m.allContacts.Load(contactID)
|
||||||
|
if !ok {
|
||||||
|
return ErrContactNotFound
|
||||||
|
}
|
||||||
|
|
||||||
currentTime := m.getTimesource().GetCurrentTime()
|
currentTime := m.getTimesource().GetCurrentTime()
|
||||||
|
|
||||||
err := m.verificationDatabase.SetTrustStatus(contactID, trustStatus, currentTime)
|
err := m.verificationDatabase.SetTrustStatus(contactID, trustStatus, currentTime)
|
||||||
|
@ -721,6 +730,9 @@ func (m *Messenger) setTrustStatusForContact(ctx context.Context, contactID stri
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
contact.TrustStatus = trustStatus
|
||||||
|
m.allContacts.Store(contactID, contact)
|
||||||
|
|
||||||
return m.SyncTrustedUser(ctx, contactID, trustStatus, m.dispatchMessage)
|
return m.SyncTrustedUser(ctx, contactID, trustStatus, m.dispatchMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,7 +796,7 @@ func (m *Messenger) HandleRequestContactVerification(state *ReceivedMessageState
|
||||||
contact := state.CurrentMessageState.Contact
|
contact := state.CurrentMessageState.Contact
|
||||||
if !contact.mutual() {
|
if !contact.mutual() {
|
||||||
m.logger.Debug("Received a verification request for a non added mutual contact", zap.String("contactID", contactID))
|
m.logger.Debug("Received a verification request for a non added mutual contact", zap.String("contactID", contactID))
|
||||||
return errors.New("must be a mutual contact")
|
return ErrContactNotMutual
|
||||||
}
|
}
|
||||||
|
|
||||||
persistedVR, err := m.verificationDatabase.GetVerificationRequest(id)
|
persistedVR, err := m.verificationDatabase.GetVerificationRequest(id)
|
||||||
|
@ -875,7 +887,7 @@ func (m *Messenger) HandleAcceptContactVerification(state *ReceivedMessageState,
|
||||||
contact := state.CurrentMessageState.Contact
|
contact := state.CurrentMessageState.Contact
|
||||||
if !contact.mutual() {
|
if !contact.mutual() {
|
||||||
m.logger.Debug("Received a verification response for a non mutual contact", zap.String("contactID", contactID))
|
m.logger.Debug("Received a verification response for a non mutual contact", zap.String("contactID", contactID))
|
||||||
return errors.New("must be a mutual contact")
|
return ErrContactNotMutual
|
||||||
}
|
}
|
||||||
|
|
||||||
persistedVR, err := m.verificationDatabase.GetVerificationRequest(request.Id)
|
persistedVR, err := m.verificationDatabase.GetVerificationRequest(request.Id)
|
||||||
|
@ -964,7 +976,7 @@ func (m *Messenger) HandleDeclineContactVerification(state *ReceivedMessageState
|
||||||
contact := state.CurrentMessageState.Contact
|
contact := state.CurrentMessageState.Contact
|
||||||
if !contact.mutual() {
|
if !contact.mutual() {
|
||||||
m.logger.Debug("Received a verification decline for a non mutual contact", zap.String("contactID", contactID))
|
m.logger.Debug("Received a verification decline for a non mutual contact", zap.String("contactID", contactID))
|
||||||
return errors.New("must be a mutual contact")
|
return ErrContactNotMutual
|
||||||
}
|
}
|
||||||
|
|
||||||
persistedVR, err := m.verificationDatabase.GetVerificationRequest(request.Id)
|
persistedVR, err := m.verificationDatabase.GetVerificationRequest(request.Id)
|
||||||
|
|
|
@ -769,3 +769,50 @@ func (s *MessengerVerificationRequests) newMessenger(shh types.Waku) *Messenger
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
return messenger
|
return messenger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *MessengerVerificationRequests) TestTrustStatus() {
|
||||||
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
defer TearDownMessenger(&s.Suite, theirMessenger)
|
||||||
|
|
||||||
|
s.mutualContact(theirMessenger)
|
||||||
|
|
||||||
|
theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
|
// Test Mark as Trusted
|
||||||
|
err := s.m.MarkAsTrusted(context.Background(), theirPk)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
contactFromCache, ok := s.m.allContacts.Load(theirPk)
|
||||||
|
s.Require().True(ok)
|
||||||
|
s.Require().Equal(verification.TrustStatusTRUSTED, contactFromCache.TrustStatus)
|
||||||
|
trustStatusFromDb, err := s.m.GetTrustStatus(theirPk)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Equal(verification.TrustStatusTRUSTED, trustStatusFromDb)
|
||||||
|
|
||||||
|
// Test Remove Trust Mark
|
||||||
|
err = s.m.RemoveTrustStatus(context.Background(), theirPk)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
contactFromCache, ok = s.m.allContacts.Load(theirPk)
|
||||||
|
s.Require().True(ok)
|
||||||
|
s.Require().Equal(verification.TrustStatusUNKNOWN, contactFromCache.TrustStatus)
|
||||||
|
trustStatusFromDb, err = s.m.GetTrustStatus(theirPk)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Equal(verification.TrustStatusUNKNOWN, trustStatusFromDb)
|
||||||
|
|
||||||
|
// Test Mark as Untrustoworthy
|
||||||
|
err = s.m.MarkAsUntrustworthy(context.Background(), theirPk)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
contactFromCache, ok = s.m.allContacts.Load(theirPk)
|
||||||
|
s.Require().True(ok)
|
||||||
|
s.Require().Equal(verification.TrustStatusUNTRUSTWORTHY, contactFromCache.TrustStatus)
|
||||||
|
trustStatusFromDb, err = s.m.GetTrustStatus(theirPk)
|
||||||
|
s.Require().NoError(err)
|
||||||
|
s.Require().Equal(verification.TrustStatusUNTRUSTWORTHY, trustStatusFromDb)
|
||||||
|
|
||||||
|
// Test calling with an unknown contact
|
||||||
|
err = s.m.MarkAsTrusted(context.Background(), "0x00000123")
|
||||||
|
s.Require().Error(err)
|
||||||
|
s.Require().Equal("contact not found", err.Error())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue