github.com/status-im/status-go@v1.1.0/protocol/messenger_contact_verification_test.go (about)

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/status-im/status-go/eth-node/crypto"
     8  	"github.com/status-im/status-go/protocol/common"
     9  	"github.com/status-im/status-go/protocol/requests"
    10  	"github.com/status-im/status-go/protocol/verification"
    11  
    12  	"github.com/stretchr/testify/suite"
    13  
    14  	"github.com/status-im/status-go/eth-node/types"
    15  )
    16  
    17  func TestMessengerVerificationRequests(t *testing.T) { // nolint: deadcode,unused
    18  	suite.Run(t, new(MessengerVerificationRequests))
    19  }
    20  
    21  type MessengerVerificationRequests struct {
    22  	MessengerBaseTestSuite
    23  }
    24  
    25  func (s *MessengerVerificationRequests) mutualContact(theirMessenger *Messenger) {
    26  	messageText := "hello!"
    27  
    28  	contactID := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
    29  	request := &requests.SendContactRequest{
    30  		ID:      contactID,
    31  		Message: messageText,
    32  	}
    33  
    34  	// Send contact request
    35  	resp, err := s.m.SendContactRequest(context.Background(), request)
    36  	s.Require().NoError(err)
    37  
    38  	s.Require().NotNil(resp)
    39  	s.Require().Len(resp.Messages(), 2)
    40  
    41  	// Make sure it's not returned as coming from us
    42  	contactRequests, _, err := s.m.PendingContactRequests("", 10)
    43  	s.Require().NoError(err)
    44  	s.Require().Len(contactRequests, 0)
    45  
    46  	// Make sure contact is added on the sender side
    47  	contacts := s.m.AddedContacts()
    48  	s.Require().Len(contacts, 1)
    49  	s.Require().Equal(ContactRequestStateSent, contacts[0].ContactRequestLocalState)
    50  
    51  	// Wait for the message to reach its destination
    52  	resp, err = WaitOnMessengerResponse(
    53  		theirMessenger,
    54  		func(r *MessengerResponse) bool {
    55  			return len(r.Contacts) > 0 && len(r.Messages()) > 0 && len(r.ActivityCenterNotifications()) > 0
    56  		},
    57  		"no messages",
    58  	)
    59  
    60  	// Check contact request has been received
    61  	s.Require().NoError(err)
    62  
    63  	// Check activity center notification is of the right type
    64  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
    65  	s.Require().Equal(ActivityCenterNotificationTypeContactRequest, resp.ActivityCenterNotifications()[0].Type)
    66  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
    67  	s.Require().Equal(common.ContactRequestStatePending, resp.ActivityCenterNotifications()[0].Message.ContactRequestState)
    68  
    69  	// Check the contact state is correctly set
    70  	s.Require().Len(resp.Contacts, 1)
    71  	s.Require().Equal(ContactRequestStateReceived, resp.Contacts[0].ContactRequestRemoteState)
    72  
    73  	// Make sure it's the pending contact requests
    74  	contactRequests, _, err = theirMessenger.PendingContactRequests("", 10)
    75  	s.Require().NoError(err)
    76  	s.Require().Len(contactRequests, 1)
    77  	s.Require().Equal(contactRequests[0].ContactRequestState, common.ContactRequestStatePending)
    78  
    79  	// Accept contact request, receiver side
    80  	resp, err = theirMessenger.AcceptContactRequest(context.Background(), &requests.AcceptContactRequest{ID: types.Hex2Bytes(contactRequests[0].ID)})
    81  	s.Require().NoError(err)
    82  
    83  	// Make sure the message is updated
    84  	s.Require().NotNil(resp)
    85  	s.Require().Len(resp.Messages(), 2)
    86  
    87  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
    88  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), contactRequests[0].ID)
    89  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
    90  	s.Require().Equal(common.ContactRequestStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactRequestState)
    91  
    92  	// Check the contact state is correctly set
    93  	s.Require().Len(resp.Contacts, 1)
    94  	s.Require().True(resp.Contacts[0].mutual())
    95  
    96  	// Make sure the sender is added to our contacts
    97  	contacts = theirMessenger.AddedContacts()
    98  	s.Require().Len(contacts, 1)
    99  
   100  	// Make sure we consider them a mutual contact, receiver side
   101  	mutualContacts := theirMessenger.MutualContacts()
   102  	s.Require().Len(mutualContacts, 1)
   103  
   104  	// Wait for the message to reach its destination
   105  	resp, err = WaitOnMessengerResponse(
   106  		s.m,
   107  		func(r *MessengerResponse) bool {
   108  			return len(r.Contacts) == 1 && len(r.Messages()) == 2 && len(r.ActivityCenterNotifications()) == 1
   109  		},
   110  		"no messages",
   111  	)
   112  	s.Require().NoError(err)
   113  
   114  	// Check activity center notification is of the right type
   115  	s.Require().Equal(ActivityCenterNotificationTypeContactRequest, resp.ActivityCenterNotifications()[0].Type)
   116  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
   117  	s.Require().Equal(common.ContactRequestStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactRequestState)
   118  
   119  	// Make sure the message is updated, sender side
   120  	s.Require().NotNil(resp)
   121  	s.Require().Len(resp.Messages(), 2)
   122  
   123  	// Make sure we consider them a mutual contact, sender side
   124  	mutualContacts = s.m.MutualContacts()
   125  	s.Require().Len(mutualContacts, 1)
   126  
   127  	// Check the contact state is correctly set
   128  	s.Require().Len(resp.Contacts, 1)
   129  	s.Require().True(resp.Contacts[0].mutual())
   130  }
   131  
   132  func (s *MessengerVerificationRequests) TestAcceptVerificationRequests() {
   133  	theirMessenger := s.newMessenger(s.shh)
   134  	defer TearDownMessenger(&s.Suite, theirMessenger)
   135  
   136  	s.mutualContact(theirMessenger)
   137  
   138  	theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
   139  	challenge := "challenge"
   140  
   141  	resp, err := s.m.SendContactVerificationRequest(context.Background(), theirPk, challenge)
   142  	s.Require().NoError(err)
   143  	s.Require().Len(resp.VerificationRequests(), 1)
   144  	verificationRequestID := resp.VerificationRequests()[0].ID
   145  
   146  	s.Require().Len(resp.Messages(), 1)
   147  	s.Require().NotEmpty(resp.Messages()[0].OutgoingStatus)
   148  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   149  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   150  
   151  	// Wait for the message to reach its destination
   152  	resp, err = WaitOnMessengerResponse(
   153  		theirMessenger,
   154  		func(r *MessengerResponse) bool {
   155  			return len(r.VerificationRequests()) == 1 && len(r.ActivityCenterNotifications()) == 1
   156  		},
   157  		"no messages",
   158  	)
   159  	s.Require().NoError(err)
   160  	s.Require().Len(resp.VerificationRequests(), 1)
   161  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   162  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
   163  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusPENDING)
   164  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   165  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   166  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   167  
   168  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
   169  	s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
   170  	s.Require().Equal(common.ContactVerificationStatePending, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   171  	s.Require().Len(resp.Messages(), 1)
   172  	s.Require().Empty(resp.Messages()[0].OutgoingStatus)
   173  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   174  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   175  
   176  	resp, err = theirMessenger.AcceptContactVerificationRequest(context.Background(), verificationRequestID, "hello back")
   177  
   178  	s.Require().NoError(err)
   179  
   180  	s.Require().NoError(err)
   181  	s.Require().Len(resp.VerificationRequests(), 1)
   182  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   183  	s.Require().Equal(resp.VerificationRequests()[0].RequestStatus, verification.RequestStatusACCEPTED)
   184  	s.Require().NotEmpty(resp.VerificationRequests()[0].RepliedAt)
   185  
   186  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   187  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   188  
   189  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusACCEPTED)
   190  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   191  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, true)
   192  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   193  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   194  	s.Require().Len(resp.Messages(), 2)
   195  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.Messages()[0].ContactVerificationState)
   196  
   197  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].ReplyMessage)
   198  	s.Require().NotEmpty(resp.ActivityCenterNotifications()[0].ReplyMessage.OutgoingStatus)
   199  	s.Require().Equal("hello back", resp.ActivityCenterNotifications()[0].ReplyMessage.Text)
   200  
   201  	// Wait for the message to reach its destination
   202  	resp, err = WaitOnMessengerResponse(
   203  		s.m,
   204  		func(r *MessengerResponse) bool {
   205  			return len(r.VerificationRequests()) == 1
   206  		},
   207  		"no messages",
   208  	)
   209  	s.Require().NoError(err)
   210  	s.Require().Len(resp.VerificationRequests(), 1)
   211  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   212  
   213  	messages := resp.Messages()
   214  	s.Require().Len(messages, 2)
   215  	var originalMessage *common.Message
   216  	var replyMessage *common.Message
   217  
   218  	if messages[0].ID == resp.VerificationRequests()[0].ID {
   219  		originalMessage = messages[0]
   220  		replyMessage = messages[1]
   221  	} else {
   222  		originalMessage = messages[1]
   223  		replyMessage = messages[0]
   224  	}
   225  
   226  	s.Require().Equal(common.ContactVerificationStateAccepted, originalMessage.ContactVerificationState)
   227  	// Not sure this is the right state for this, it should probably be pendingtrustedverification or something
   228  	s.Require().Equal(common.ContactVerificationStateAccepted, replyMessage.ContactVerificationState)
   229  
   230  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   231  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   232  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusACCEPTED)
   233  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   234  
   235  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].ReplyMessage)
   236  	s.Require().Empty(resp.ActivityCenterNotifications()[0].ReplyMessage.OutgoingStatus)
   237  	s.Require().Equal("hello back", resp.ActivityCenterNotifications()[0].ReplyMessage.Text)
   238  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   239  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   240  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   241  
   242  	// Mark as tusted
   243  	resp, err = s.m.VerifiedTrusted(context.Background(), &requests.VerifiedTrusted{ID: types.FromHex(verificationRequestID)})
   244  	s.Require().NoError(err)
   245  	s.Require().NotNil(resp)
   246  
   247  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   248  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   249  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusTRUSTED)
   250  	s.Require().Equal(common.ContactVerificationStateTrusted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   251  
   252  	s.Require().Len(resp.Messages(), 1)
   253  	s.Require().Equal(common.ContactVerificationStateTrusted, resp.Messages()[0].ContactVerificationState)
   254  
   255  	s.Require().Len(resp.Contacts, 1)
   256  	s.Require().Equal(resp.Contacts[0].ID, theirPk)
   257  	s.Require().Equal(resp.Contacts[0].VerificationStatus, VerificationStatusVERIFIED)
   258  }
   259  
   260  func (s *MessengerVerificationRequests) TestTrustedVerificationRequests() {
   261  	theirMessenger := s.newMessenger(s.shh)
   262  	defer TearDownMessenger(&s.Suite, theirMessenger)
   263  
   264  	s.mutualContact(theirMessenger)
   265  
   266  	theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
   267  	challenge := "challenge"
   268  
   269  	resp, err := s.m.SendContactVerificationRequest(context.Background(), theirPk, challenge)
   270  	s.Require().NoError(err)
   271  	s.Require().Len(resp.VerificationRequests(), 1)
   272  	verificationRequestID := resp.VerificationRequests()[0].ID
   273  
   274  	s.Require().Len(resp.Messages(), 1)
   275  	s.Require().NotEmpty(resp.Messages()[0].OutgoingStatus)
   276  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   277  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   278  
   279  	// Wait for the message to reach its destination
   280  	resp, err = WaitOnMessengerResponse(
   281  		theirMessenger,
   282  		func(r *MessengerResponse) bool {
   283  			return len(r.VerificationRequests()) == 1 && len(r.ActivityCenterNotifications()) == 1
   284  		},
   285  		"no messages",
   286  	)
   287  	s.Require().NoError(err)
   288  	s.Require().Len(resp.VerificationRequests(), 1)
   289  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   290  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
   291  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusPENDING)
   292  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   293  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   294  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   295  
   296  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
   297  	s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
   298  	s.Require().Equal(common.ContactVerificationStatePending, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   299  	s.Require().Len(resp.Messages(), 1)
   300  	s.Require().Empty(resp.Messages()[0].OutgoingStatus)
   301  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   302  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   303  
   304  	resp, err = theirMessenger.AcceptContactVerificationRequest(context.Background(), verificationRequestID, "hello back")
   305  
   306  	s.Require().NoError(err)
   307  
   308  	s.Require().Len(resp.VerificationRequests(), 1)
   309  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   310  	s.Require().Equal(resp.VerificationRequests()[0].RequestStatus, verification.RequestStatusACCEPTED)
   311  	s.Require().NotEmpty(resp.VerificationRequests()[0].RepliedAt)
   312  
   313  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   314  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   315  
   316  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusACCEPTED)
   317  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   318  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, true)
   319  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   320  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   321  	s.Require().Len(resp.Messages(), 2)
   322  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.Messages()[0].ContactVerificationState)
   323  
   324  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].ReplyMessage)
   325  	s.Require().NotEmpty(resp.ActivityCenterNotifications()[0].ReplyMessage.OutgoingStatus)
   326  	s.Require().Equal("hello back", resp.ActivityCenterNotifications()[0].ReplyMessage.Text)
   327  
   328  	// Wait for the message to reach its destination
   329  	resp, err = WaitOnMessengerResponse(
   330  		s.m,
   331  		func(r *MessengerResponse) bool {
   332  			return len(r.VerificationRequests()) == 1
   333  		},
   334  		"no messages",
   335  	)
   336  	s.Require().NoError(err)
   337  	s.Require().Len(resp.VerificationRequests(), 1)
   338  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   339  
   340  	messages := resp.Messages()
   341  	s.Require().Len(messages, 2)
   342  
   343  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   344  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   345  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusACCEPTED)
   346  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   347  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   348  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   349  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   350  
   351  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].ReplyMessage)
   352  	s.Require().Empty(resp.ActivityCenterNotifications()[0].ReplyMessage.OutgoingStatus)
   353  	s.Require().Equal("hello back", resp.ActivityCenterNotifications()[0].ReplyMessage.Text)
   354  
   355  	resp, err = s.m.VerifiedTrusted(context.Background(), &requests.VerifiedTrusted{ID: types.FromHex(verificationRequestID)})
   356  	s.Require().NoError(err)
   357  	s.Require().NotNil(resp)
   358  
   359  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   360  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   361  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusTRUSTED)
   362  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   363  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, true)
   364  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   365  	s.Require().Equal(common.ContactVerificationStateTrusted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   366  
   367  	s.Require().Len(resp.Messages(), 1)
   368  	s.Require().Equal(common.ContactVerificationStateTrusted, resp.Messages()[0].ContactVerificationState)
   369  }
   370  
   371  func (s *MessengerVerificationRequests) TestUnthrustworthyVerificationRequests() {
   372  	theirMessenger := s.newMessenger(s.shh)
   373  	defer TearDownMessenger(&s.Suite, theirMessenger)
   374  
   375  	s.mutualContact(theirMessenger)
   376  
   377  	theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
   378  	challenge := "challenge"
   379  
   380  	resp, err := s.m.SendContactVerificationRequest(context.Background(), theirPk, challenge)
   381  	s.Require().NoError(err)
   382  	s.Require().Len(resp.VerificationRequests(), 1)
   383  	verificationRequestID := resp.VerificationRequests()[0].ID
   384  
   385  	s.Require().Len(resp.Messages(), 1)
   386  	s.Require().NotEmpty(resp.Messages()[0].OutgoingStatus)
   387  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   388  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   389  
   390  	// Wait for the message to reach its destination
   391  	resp, err = WaitOnMessengerResponse(
   392  		theirMessenger,
   393  		func(r *MessengerResponse) bool {
   394  			return len(r.VerificationRequests()) == 1 && len(r.ActivityCenterNotifications()) == 1
   395  		},
   396  		"no messages",
   397  	)
   398  	s.Require().NoError(err)
   399  	s.Require().Len(resp.VerificationRequests(), 1)
   400  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   401  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
   402  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusPENDING)
   403  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   404  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   405  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   406  
   407  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
   408  	s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
   409  	s.Require().Equal(common.ContactVerificationStatePending, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   410  	s.Require().Len(resp.Messages(), 1)
   411  	s.Require().Empty(resp.Messages()[0].OutgoingStatus)
   412  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   413  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   414  
   415  	resp, err = theirMessenger.AcceptContactVerificationRequest(context.Background(), verificationRequestID, "hello back")
   416  
   417  	s.Require().NoError(err)
   418  
   419  	s.Require().NoError(err)
   420  	s.Require().Len(resp.VerificationRequests(), 1)
   421  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   422  	s.Require().Equal(resp.VerificationRequests()[0].RequestStatus, verification.RequestStatusACCEPTED)
   423  	s.Require().NotEmpty(resp.VerificationRequests()[0].RepliedAt)
   424  
   425  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   426  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   427  
   428  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusACCEPTED)
   429  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   430  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, true)
   431  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   432  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   433  	s.Require().Len(resp.Messages(), 2)
   434  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.Messages()[0].ContactVerificationState)
   435  
   436  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].ReplyMessage)
   437  	s.Require().NotEmpty(resp.ActivityCenterNotifications()[0].ReplyMessage.OutgoingStatus)
   438  	s.Require().Equal("hello back", resp.ActivityCenterNotifications()[0].ReplyMessage.Text)
   439  
   440  	// Wait for the message to reach its destination
   441  	resp, err = WaitOnMessengerResponse(
   442  		s.m,
   443  		func(r *MessengerResponse) bool {
   444  			return len(r.VerificationRequests()) == 1
   445  		},
   446  		"no messages",
   447  	)
   448  	s.Require().NoError(err)
   449  	s.Require().Len(resp.VerificationRequests(), 1)
   450  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   451  
   452  	messages := resp.Messages()
   453  	s.Require().Len(messages, 2)
   454  	var originalMessage *common.Message
   455  	var replyMessage *common.Message
   456  
   457  	if messages[0].ID == resp.VerificationRequests()[0].ID {
   458  		originalMessage = messages[0]
   459  		replyMessage = messages[1]
   460  	} else {
   461  		originalMessage = messages[1]
   462  		replyMessage = messages[0]
   463  	}
   464  
   465  	s.Require().Equal(common.ContactVerificationStateAccepted, originalMessage.ContactVerificationState)
   466  	// Not sure this is the right state for this, it should probably be pendingtrustedverification or something
   467  	s.Require().Equal(common.ContactVerificationStateAccepted, replyMessage.ContactVerificationState)
   468  
   469  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   470  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   471  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusACCEPTED)
   472  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   473  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   474  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   475  	s.Require().Equal(common.ContactVerificationStateAccepted, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   476  
   477  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].ReplyMessage)
   478  	s.Require().Empty(resp.ActivityCenterNotifications()[0].ReplyMessage.OutgoingStatus)
   479  	s.Require().Equal("hello back", resp.ActivityCenterNotifications()[0].ReplyMessage.Text)
   480  
   481  	resp, err = s.m.VerifiedUntrustworthy(context.Background(), &requests.VerifiedUntrustworthy{ID: types.FromHex(verificationRequestID)})
   482  	s.Require().NoError(err)
   483  	s.Require().NotNil(resp)
   484  
   485  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   486  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   487  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusUNTRUSTWORTHY)
   488  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   489  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, true)
   490  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   491  	s.Require().Equal(common.ContactVerificationStateUntrustworthy, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   492  
   493  	s.Require().Len(resp.Messages(), 1)
   494  	s.Require().Equal(common.ContactVerificationStateUntrustworthy, resp.Messages()[0].ContactVerificationState)
   495  }
   496  
   497  func (s *MessengerVerificationRequests) TestRemoveTrustVerificationStatus() {
   498  	// GIVEN
   499  	theirMessenger := s.newMessenger(s.shh)
   500  	defer TearDownMessenger(&s.Suite, theirMessenger)
   501  
   502  	s.mutualContact(theirMessenger)
   503  
   504  	theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
   505  	challenge := "challenge"
   506  
   507  	resp, err := s.m.SendContactVerificationRequest(context.Background(), theirPk, challenge)
   508  	s.Require().NoError(err)
   509  	s.Require().Len(resp.VerificationRequests(), 1)
   510  	verificationRequestID := resp.VerificationRequests()[0].ID
   511  
   512  	// Wait for the message to reach its destination
   513  	resp, err = WaitOnMessengerResponse(
   514  		theirMessenger,
   515  		func(r *MessengerResponse) bool {
   516  			return len(r.VerificationRequests()) == 1 && len(r.ActivityCenterNotifications()) == 1
   517  		},
   518  		"no messages",
   519  	)
   520  	s.Require().NoError(err)
   521  	s.Require().Len(resp.VerificationRequests(), 1)
   522  
   523  	resp, err = theirMessenger.AcceptContactVerificationRequest(context.Background(), verificationRequestID, "hello back")
   524  	s.Require().NoError(err)
   525  	s.Require().Len(resp.VerificationRequests(), 1)
   526  
   527  	// Wait for the message to reach its destination
   528  	_, err = WaitOnMessengerResponse(
   529  		s.m,
   530  		func(r *MessengerResponse) bool {
   531  			return len(r.VerificationRequests()) == 1
   532  		},
   533  		"no messages",
   534  	)
   535  	s.Require().NoError(err)
   536  
   537  	// Mark as trusted
   538  	_, err = s.m.VerifiedTrusted(context.Background(), &requests.VerifiedTrusted{ID: types.FromHex(verificationRequestID)})
   539  	s.Require().NoError(err)
   540  
   541  	// WHEN
   542  	_, err = s.m.RemoveTrustVerificationStatus(context.Background(), theirPk)
   543  	s.Require().NoError(err)
   544  
   545  	// THEN
   546  	trustStatus, err := s.m.GetTrustStatus(theirPk)
   547  	s.Require().NoError(err)
   548  	s.Require().Equal(verification.TrustStatusUNKNOWN, trustStatus)
   549  
   550  	contact, _ := s.m.allContacts.Load(theirPk)
   551  	s.Require().NotNil(contact)
   552  	s.Require().Equal(VerificationStatusUNVERIFIED, contact.VerificationStatus)
   553  	s.Require().Equal(verification.TrustStatusUNKNOWN, contact.TrustStatus)
   554  }
   555  
   556  func (s *MessengerVerificationRequests) TestDeclineVerificationRequests() {
   557  	theirMessenger := s.newMessenger(s.shh)
   558  	defer TearDownMessenger(&s.Suite, theirMessenger)
   559  
   560  	s.mutualContact(theirMessenger)
   561  
   562  	theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
   563  	challenge := "challenge"
   564  
   565  	resp, err := s.m.SendContactVerificationRequest(context.Background(), theirPk, challenge)
   566  	s.Require().NoError(err)
   567  	s.Require().Len(resp.VerificationRequests(), 1)
   568  	verificationRequestID := resp.VerificationRequests()[0].ID
   569  
   570  	s.Require().Len(resp.Messages(), 1)
   571  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   572  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   573  
   574  	// Wait for the message to reach its destination
   575  	resp, err = WaitOnMessengerResponse(
   576  		theirMessenger,
   577  		func(r *MessengerResponse) bool {
   578  			return len(r.VerificationRequests()) == 1 && len(r.ActivityCenterNotifications()) == 1
   579  		},
   580  		"no messages",
   581  	)
   582  	s.Require().NoError(err)
   583  	s.Require().Len(resp.VerificationRequests(), 1)
   584  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   585  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
   586  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusPENDING)
   587  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   588  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   589  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   590  
   591  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
   592  	s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
   593  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStatePending)
   594  	s.Require().Len(resp.Messages(), 1)
   595  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   596  	s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStatePending)
   597  
   598  	// Make sure it's stored and retrieved correctly
   599  	notification, err := theirMessenger.ActivityCenterNotification(types.FromHex(verificationRequestID))
   600  
   601  	s.Require().NoError(err)
   602  	s.Require().NotNil(notification)
   603  	s.Require().Equal(notification.ContactVerificationStatus, verification.RequestStatusPENDING)
   604  	s.Require().Equal(notification.Message.ContactVerificationState, common.ContactVerificationStatePending)
   605  	s.Require().Equal(notification.Read, false)
   606  	s.Require().Equal(notification.Accepted, false)
   607  	s.Require().Equal(notification.Dismissed, false)
   608  
   609  	resp, err = theirMessenger.DeclineContactVerificationRequest(context.Background(), verificationRequestID)
   610  
   611  	s.Require().NoError(err)
   612  
   613  	s.Require().NotNil(resp)
   614  
   615  	s.Require().Len(resp.VerificationRequests(), 1)
   616  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   617  	s.Require().Equal(resp.VerificationRequests()[0].RequestStatus, verification.RequestStatusDECLINED)
   618  	s.Require().NotEmpty(resp.VerificationRequests()[0].RepliedAt)
   619  
   620  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   621  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   622  
   623  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusDECLINED)
   624  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStateDeclined)
   625  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   626  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   627  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, true)
   628  	s.Require().Len(resp.Messages(), 1)
   629  	s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStateDeclined)
   630  
   631  	// Make sure it's stored and retrieved correctly
   632  	notification, err = theirMessenger.ActivityCenterNotification(types.FromHex(verificationRequestID))
   633  
   634  	s.Require().NoError(err)
   635  	s.Require().NotNil(notification)
   636  	s.Require().Equal(notification.ContactVerificationStatus, verification.RequestStatusDECLINED)
   637  	s.Require().Equal(notification.Message.ContactVerificationState, common.ContactVerificationStateDeclined)
   638  	s.Require().Equal(notification.Read, true)
   639  	s.Require().Equal(notification.Accepted, false)
   640  	s.Require().Equal(notification.Dismissed, true)
   641  
   642  	// Wait for the message to reach its destination
   643  	resp, err = WaitOnMessengerResponse(
   644  		s.m,
   645  		func(r *MessengerResponse) bool {
   646  			return len(r.VerificationRequests()) == 1
   647  		},
   648  		"no messages",
   649  	)
   650  	s.Require().NoError(err)
   651  	s.Require().Len(resp.VerificationRequests(), 1)
   652  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   653  
   654  	s.Require().Len(resp.Messages(), 1)
   655  	s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStateDeclined)
   656  
   657  	s.Require().Len(resp.Contacts, 1)
   658  	s.Require().Equal(resp.Contacts[0].ID, theirPk)
   659  	s.Require().Equal(resp.Contacts[0].VerificationStatus, VerificationStatusUNVERIFIED)
   660  
   661  	s.Require().Len(resp.ActivityCenterNotifications(), 1)
   662  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
   663  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusDECLINED)
   664  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStateDeclined)
   665  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   666  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   667  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, true)
   668  }
   669  
   670  func (s *MessengerVerificationRequests) TestCancelVerificationRequest() {
   671  	theirMessenger := s.newMessenger(s.shh)
   672  	defer TearDownMessenger(&s.Suite, theirMessenger)
   673  
   674  	s.mutualContact(theirMessenger)
   675  
   676  	theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
   677  	challenge := "challenge"
   678  
   679  	resp, err := s.m.SendContactVerificationRequest(context.Background(), theirPk, challenge)
   680  	s.Require().NoError(err)
   681  	s.Require().Len(resp.VerificationRequests(), 1)
   682  	verificationRequestID := resp.VerificationRequests()[0].ID
   683  
   684  	s.Require().Len(resp.Messages(), 1)
   685  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   686  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   687  
   688  	// Wait for the message to reach its destination
   689  	resp, err = WaitOnMessengerResponse(
   690  		theirMessenger,
   691  		func(r *MessengerResponse) bool {
   692  			return len(r.VerificationRequests()) == 1 && len(r.ActivityCenterNotifications()) == 1
   693  		},
   694  		"no messages",
   695  	)
   696  	s.Require().NoError(err)
   697  	s.Require().Len(resp.VerificationRequests(), 1)
   698  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   699  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
   700  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusPENDING)
   701  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, false)
   702  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   703  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   704  
   705  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
   706  	s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
   707  	s.Require().Equal(common.ContactVerificationStatePending, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
   708  	s.Require().Len(resp.Messages(), 1)
   709  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   710  	s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
   711  
   712  	// Make sure it's stored and retrieved correctly
   713  	notifications, err := theirMessenger.ActivityCenterNotifications(
   714  		ActivityCenterNotificationsRequest{
   715  			Cursor:        "",
   716  			Limit:         4,
   717  			ActivityTypes: []ActivityCenterType{ActivityCenterNotificationTypeContactVerification},
   718  			ReadType:      ActivityCenterQueryParamsReadUnread,
   719  		},
   720  	)
   721  	s.Require().NoError(err)
   722  	s.Require().Greater(len(notifications.Notifications), 0)
   723  	s.Require().Equal(notifications.Notifications[0].ContactVerificationStatus, verification.RequestStatusPENDING)
   724  	s.Require().Equal(common.ContactVerificationStatePending, notifications.Notifications[0].Message.ContactVerificationState)
   725  
   726  	resp, err = s.m.CancelVerificationRequest(context.Background(), verificationRequestID)
   727  
   728  	s.Require().NoError(err)
   729  
   730  	s.Require().NotNil(resp)
   731  
   732  	s.Require().Len(resp.VerificationRequests(), 1)
   733  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   734  	s.Require().Equal(resp.VerificationRequests()[0].RequestStatus, verification.RequestStatusCANCELED)
   735  
   736  	s.Require().Len(resp.Contacts, 1)
   737  	s.Require().Equal(resp.Contacts[0].ID, theirPk)
   738  	s.Require().Equal(resp.Contacts[0].VerificationStatus, VerificationStatusUNVERIFIED)
   739  
   740  	// Check canceled state on the receiver's side
   741  	resp, err = WaitOnMessengerResponse(
   742  		theirMessenger,
   743  		func(r *MessengerResponse) bool {
   744  			return len(r.VerificationRequests()) == 1 && len(r.ActivityCenterNotifications()) == 1
   745  		},
   746  		"no messages",
   747  	)
   748  	s.Require().NoError(err)
   749  	s.Require().Len(resp.VerificationRequests(), 1)
   750  	s.Require().Equal(resp.VerificationRequests()[0].ID, verificationRequestID)
   751  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
   752  	s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusCANCELED)
   753  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Read, true)
   754  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Accepted, false)
   755  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Dismissed, false)
   756  
   757  	s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
   758  	s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
   759  	s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStateCanceled)
   760  	s.Require().Len(resp.Messages(), 1)
   761  	s.Require().Equal(challenge, resp.Messages()[0].Text)
   762  	s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStateCanceled)
   763  }
   764  
   765  func (s *MessengerVerificationRequests) newMessenger(shh types.Waku) *Messenger {
   766  	privateKey, err := crypto.GenerateKey()
   767  	s.Require().NoError(err)
   768  	messenger, err := newMessengerWithKey(s.shh, privateKey, s.logger, nil)
   769  	s.Require().NoError(err)
   770  	return messenger
   771  }