feat(ActivityCenter): Add message for canceling contact requests (#2992)

* feat(ActivityCenter): Add message for canceling contact requests

* feat(Contacts): GetVerificationRequestSentTo returns last verification request

* Fix error message in protocol/messenger_contact_verification.go

Co-authored-by: Jonathan Rainville <rainville.jonathan@gmail.com>

Co-authored-by: Jonathan Rainville <rainville.jonathan@gmail.com>
This commit is contained in:
Mikhail Rogachev 2022-12-14 12:27:02 +04:00 committed by GitHub
parent f5dfa58602
commit cd9fb48579
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 359 additions and 110 deletions

View File

@ -67,6 +67,7 @@ const (
ContactVerificationStateDeclined ContactVerificationStateDeclined
ContactVerificationStateTrusted ContactVerificationStateTrusted
ContactVerificationStateUntrustworthy ContactVerificationStateUntrustworthy
ContactVerificationStateCanceled
) )
type CommandParameters struct { type CommandParameters struct {

View File

@ -3991,6 +3991,15 @@ func (m *Messenger) handleRetrievedMessages(chatWithMessages map[transport.Filte
continue continue
} }
case protobuf.CancelContactVerification:
logger.Debug("Handling CancelContactVerification")
err = m.HandleCancelContactVerification(messageState, msg.ParsedMessage.Interface().(protobuf.CancelContactVerification))
if err != nil {
logger.Warn("failed to handle CancelContactVerification", zap.Error(err))
allMessagesProcessed = false
continue
}
case protobuf.ContactVerificationTrusted: case protobuf.ContactVerificationTrusted:
logger.Debug("Handling ContactVerificationTrusted") logger.Debug("Handling ContactVerificationTrusted")
err = m.HandleContactVerificationTrusted(messageState, msg.ParsedMessage.Interface().(protobuf.ContactVerificationTrusted)) err = m.HandleContactVerificationTrusted(messageState, msg.ParsedMessage.Interface().(protobuf.ContactVerificationTrusted))

View File

@ -132,7 +132,7 @@ func (m *Messenger) GetVerificationRequestSentTo(ctx context.Context, contactID
return nil, errors.New("contact not found") return nil, errors.New("contact not found")
} }
return m.verificationDatabase.GetVerificationRequestSentTo(contactID) return m.verificationDatabase.GetLatestVerificationRequestSentTo(contactID)
} }
func (m *Messenger) GetReceivedVerificationRequests(ctx context.Context) ([]*verification.Request, error) { func (m *Messenger) GetReceivedVerificationRequests(ctx context.Context) ([]*verification.Request, error) {
@ -140,56 +140,101 @@ func (m *Messenger) GetReceivedVerificationRequests(ctx context.Context) ([]*ver
return m.verificationDatabase.GetReceivedVerificationRequests(myPubKey) return m.verificationDatabase.GetReceivedVerificationRequests(myPubKey)
} }
func (m *Messenger) CancelVerificationRequest(ctx context.Context, contactID string) error { func (m *Messenger) CancelVerificationRequest(ctx context.Context, id string) (*MessengerResponse, error) {
contact, ok := m.allContacts.Load(contactID) verifRequest, err := m.verificationDatabase.GetVerificationRequest(id)
if !ok || !contact.Added || !contact.HasAddedUs {
return errors.New("must be a mutual contact")
}
verifRequest, err := m.verificationDatabase.GetVerificationRequestSentTo(contactID)
if err != nil { if err != nil {
return err return nil, err
} }
if verifRequest == nil { if verifRequest == nil {
return errors.New("no contact verification found") m.logger.Error("could not find verification request with id", zap.String("id", id))
return nil, verification.ErrVerificationRequestNotFound
}
if verifRequest.From != common.PubkeyToHex(&m.identity.PublicKey) {
return nil, errors.New("Can cancel only outgoing contact request")
}
contactID := verifRequest.To
contact, ok := m.allContacts.Load(contactID)
if !ok || !contact.Added || !contact.HasAddedUs {
return nil, errors.New("Can't find contact for canceling verification request")
} }
if verifRequest.RequestStatus != verification.RequestStatusPENDING { if verifRequest.RequestStatus != verification.RequestStatusPENDING {
return errors.New("can't cancel a request already verified") return nil, errors.New("can cancel only pending verification request")
} }
verifRequest.RequestStatus = verification.RequestStatusCANCELED verifRequest.RequestStatus = verification.RequestStatusCANCELED
err = m.verificationDatabase.SaveVerificationRequest(verifRequest) err = m.verificationDatabase.SaveVerificationRequest(verifRequest)
if err != nil { if err != nil {
return err return nil, err
} }
contact.VerificationStatus = VerificationStatusUNVERIFIED contact.VerificationStatus = VerificationStatusUNVERIFIED
contact.LastUpdatedLocally = m.getTimesource().GetCurrentTime() contact.LastUpdatedLocally = m.getTimesource().GetCurrentTime()
err = m.persistence.SaveContact(contact, nil) err = m.persistence.SaveContact(contact, nil)
if err != nil { if err != nil {
return err return nil, err
} }
// We sync the contact with the other devices // We sync the contact with the other devices
err = m.syncContact(context.Background(), contact) err = m.syncContact(context.Background(), contact)
if err != nil { if err != nil {
return err return nil, err
}
err = m.SyncVerificationRequest(context.Background(), verifRequest)
if err != nil {
return err
} }
m.allContacts.Store(contact.ID, contact) m.allContacts.Store(contact.ID, contact)
return nil // NOTE: does we need it?
chat, ok := m.allChats.Load(verifRequest.To)
if !ok {
publicKey, err := contact.PublicKey()
if err != nil {
return nil, err
}
chat = OneToOneFromPublicKey(publicKey, m.getTimesource())
// We don't want to show the chat to the user
chat.Active = false
}
m.allChats.Store(chat.ID, chat)
clock, _ := chat.NextClockAndTimestamp(m.getTimesource())
response := &MessengerResponse{}
response.AddVerificationRequest(verifRequest)
err = m.SyncVerificationRequest(context.Background(), verifRequest)
if err != nil {
return nil, err
}
request := &protobuf.CancelContactVerification{
Id: id,
Clock: clock,
}
encodedMessage, err := proto.Marshal(request)
if err != nil {
return nil, err
}
_, err = m.dispatchMessage(ctx, common.RawMessage{
LocalChatID: chat.ID,
Payload: encodedMessage,
MessageType: protobuf.ApplicationMetadataMessage_CANCEL_CONTACT_VERIFICATION,
ResendAutomatically: true,
})
if err != nil {
return nil, err
}
return response, nil
} }
func (m *Messenger) AcceptContactVerificationRequest(ctx context.Context, id string, response string) (*MessengerResponse, error) { func (m *Messenger) AcceptContactVerificationRequest(ctx context.Context, id string, response string) (*MessengerResponse, error) {
verifRequest, err := m.verificationDatabase.GetVerificationRequest(id) verifRequest, err := m.verificationDatabase.GetVerificationRequest(id)
if err != nil { if err != nil {
return nil, err return nil, err
@ -293,7 +338,6 @@ func (m *Messenger) AcceptContactVerificationRequest(ctx context.Context, id str
} }
resp.AddActivityCenterNotification(notification) resp.AddActivityCenterNotification(notification)
} }
return resp, nil return resp, nil
@ -370,7 +414,7 @@ func (m *Messenger) VerifiedTrusted(ctx context.Context, request *requests.Verif
return nil, err return nil, err
} }
verifRequest, err := m.verificationDatabase.GetVerificationRequestSentTo(contactID) verifRequest, err := m.verificationDatabase.GetLatestVerificationRequestSentTo(contactID)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -889,6 +933,59 @@ func (m *Messenger) HandleDeclineContactVerification(state *ReceivedMessageState
return m.createContactVerificationNotification(contact, state, persistedVR, msg, nil) return m.createContactVerificationNotification(contact, state, persistedVR, msg, nil)
} }
func (m *Messenger) HandleCancelContactVerification(state *ReceivedMessageState, request protobuf.CancelContactVerification) error {
myPubKey := hexutil.Encode(crypto.FromECDSAPub(&m.identity.PublicKey))
contactID := hexutil.Encode(crypto.FromECDSAPub(state.CurrentMessageState.PublicKey))
contact := state.CurrentMessageState.Contact
persistedVR, err := m.verificationDatabase.GetVerificationRequest(request.Id)
if err != nil {
m.logger.Debug("Error obtaining verification request", zap.Error(err))
return err
}
if persistedVR != nil && persistedVR.RequestStatus != verification.RequestStatusPENDING {
m.logger.Debug("Only pending verification request can be canceled", zap.String("contactID", contactID))
return errors.New("must be a pending verification request")
}
if persistedVR == nil {
// This is a response for which we have not received its request before
persistedVR = &verification.Request{}
persistedVR.From = contactID
persistedVR.To = myPubKey
}
persistedVR.RequestStatus = verification.RequestStatusCANCELED
persistedVR.RepliedAt = request.Clock
err = m.verificationDatabase.SaveVerificationRequest(persistedVR)
if err != nil {
m.logger.Debug("Error storing verification request", zap.Error(err))
return err
}
err = m.SyncVerificationRequest(context.Background(), persistedVR)
if err != nil {
return err
}
state.AllVerificationRequests = append(state.AllVerificationRequests, persistedVR)
msg, err := m.persistence.MessageByID(request.Id)
if err != nil {
return err
}
if msg != nil {
msg.ContactVerificationState = common.ContactVerificationStateCanceled
state.Response.AddMessage(msg)
}
return m.createContactVerificationNotification(contact, state, persistedVR, msg, nil)
}
func (m *Messenger) HandleContactVerificationTrusted(state *ReceivedMessageState, request protobuf.ContactVerificationTrusted) error { func (m *Messenger) HandleContactVerificationTrusted(state *ReceivedMessageState, request protobuf.ContactVerificationTrusted) error {
if common.IsPubKeyEqual(state.CurrentMessageState.PublicKey, &m.identity.PublicKey) { if common.IsPubKeyEqual(state.CurrentMessageState.PublicKey, &m.identity.PublicKey) {
return nil // Is ours, do nothing return nil // Is ours, do nothing

View File

@ -428,17 +428,17 @@ func (s *MessengerVerificationRequests) TestDeclineVerificationRequests() {
s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message) s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text) s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
s.Require().Equal(common.ContactVerificationStatePending, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState) s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStatePending)
s.Require().Len(resp.Messages(), 1) s.Require().Len(resp.Messages(), 1)
s.Require().Equal(challenge, resp.Messages()[0].Text) s.Require().Equal(challenge, resp.Messages()[0].Text)
s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState) s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStatePending)
// Make sure it's stored and retrieved correctly // Make sure it's stored and retrieved correctly
notifications, err := theirMessenger.UnreadActivityCenterNotifications("", 4, ActivityCenterNotificationTypeContactVerification) notifications, err := theirMessenger.UnreadActivityCenterNotifications("", 4, ActivityCenterNotificationTypeContactVerification)
s.Require().NoError(err) s.Require().NoError(err)
s.Require().Len(notifications.Notifications, 1) s.Require().Len(notifications.Notifications, 1)
s.Require().Equal(notifications.Notifications[0].ContactVerificationStatus, verification.RequestStatusPENDING) s.Require().Equal(notifications.Notifications[0].ContactVerificationStatus, verification.RequestStatusPENDING)
s.Require().Equal(common.ContactVerificationStatePending, notifications.Notifications[0].Message.ContactVerificationState) s.Require().Equal(notifications.Notifications[0].Message.ContactVerificationState, common.ContactVerificationStatePending)
resp, err = theirMessenger.DeclineContactVerificationRequest(context.Background(), verificationRequestID) resp, err = theirMessenger.DeclineContactVerificationRequest(context.Background(), verificationRequestID)
@ -455,16 +455,16 @@ func (s *MessengerVerificationRequests) TestDeclineVerificationRequests() {
s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID) s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusDECLINED) s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusDECLINED)
s.Require().Equal(common.ContactVerificationStateDeclined, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState) s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStateDeclined)
s.Require().Len(resp.Messages(), 1) s.Require().Len(resp.Messages(), 1)
s.Require().Equal(common.ContactVerificationStateDeclined, resp.Messages()[0].ContactVerificationState) s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStateDeclined)
// Make sure it's stored and retrieved correctly // Make sure it's stored and retrieved correctly
notifications, err = theirMessenger.UnreadActivityCenterNotifications("", 4, ActivityCenterNotificationTypeContactVerification) notifications, err = theirMessenger.UnreadActivityCenterNotifications("", 4, ActivityCenterNotificationTypeContactVerification)
s.Require().NoError(err) s.Require().NoError(err)
s.Require().Len(notifications.Notifications, 1) s.Require().Len(notifications.Notifications, 1)
s.Require().Equal(notifications.Notifications[0].ContactVerificationStatus, verification.RequestStatusDECLINED) s.Require().Equal(notifications.Notifications[0].ContactVerificationStatus, verification.RequestStatusDECLINED)
s.Require().Equal(common.ContactVerificationStateDeclined, notifications.Notifications[0].Message.ContactVerificationState) s.Require().Equal(notifications.Notifications[0].Message.ContactVerificationState, common.ContactVerificationStateDeclined)
// Wait for the message to reach its destination // Wait for the message to reach its destination
resp, err = WaitOnMessengerResponse( resp, err = WaitOnMessengerResponse(
@ -479,12 +479,91 @@ func (s *MessengerVerificationRequests) TestDeclineVerificationRequests() {
s.Require().Equal(resp.VerificationRequests[0].ID, verificationRequestID) s.Require().Equal(resp.VerificationRequests[0].ID, verificationRequestID)
s.Require().Len(resp.Messages(), 1) s.Require().Len(resp.Messages(), 1)
s.Require().Equal(common.ContactVerificationStateDeclined, resp.Messages()[0].ContactVerificationState) s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStateDeclined)
s.Require().Len(resp.ActivityCenterNotifications(), 1) s.Require().Len(resp.ActivityCenterNotifications(), 1)
s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID) s.Require().Equal(resp.ActivityCenterNotifications()[0].ID.String(), verificationRequestID)
s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusDECLINED) s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusDECLINED)
s.Require().Equal(common.ContactVerificationStateDeclined, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState) s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStateDeclined)
}
func (s *MessengerVerificationRequests) TestCancelVerificationRequest() {
theirMessenger := s.newMessenger(s.shh)
_, err := theirMessenger.Start()
s.Require().NoError(err)
s.mutualContact(theirMessenger)
theirPk := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
challenge := "challenge"
resp, err := s.m.SendContactVerificationRequest(context.Background(), theirPk, challenge)
s.Require().NoError(err)
s.Require().Len(resp.VerificationRequests, 1)
verificationRequestID := resp.VerificationRequests[0].ID
s.Require().Len(resp.Messages(), 1)
s.Require().Equal(challenge, resp.Messages()[0].Text)
s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
// Wait for the message to reach its destination
resp, err = WaitOnMessengerResponse(
theirMessenger,
func(r *MessengerResponse) bool {
return len(r.VerificationRequests) > 0 && len(r.ActivityCenterNotifications()) > 0
},
"no messages",
)
s.Require().NoError(err)
s.Require().Len(resp.VerificationRequests, 1)
s.Require().Equal(resp.VerificationRequests[0].ID, verificationRequestID)
s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusPENDING)
s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
s.Require().Equal(common.ContactVerificationStatePending, resp.ActivityCenterNotifications()[0].Message.ContactVerificationState)
s.Require().Len(resp.Messages(), 1)
s.Require().Equal(challenge, resp.Messages()[0].Text)
s.Require().Equal(common.ContactVerificationStatePending, resp.Messages()[0].ContactVerificationState)
// Make sure it's stored and retrieved correctly
notifications, err := theirMessenger.UnreadActivityCenterNotifications("", 4, ActivityCenterNotificationTypeContactVerification)
s.Require().NoError(err)
s.Require().Len(notifications.Notifications, 1)
s.Require().Equal(notifications.Notifications[0].ContactVerificationStatus, verification.RequestStatusPENDING)
s.Require().Equal(common.ContactVerificationStatePending, notifications.Notifications[0].Message.ContactVerificationState)
resp, err = s.m.CancelVerificationRequest(context.Background(), verificationRequestID)
s.Require().NoError(err)
s.Require().NotNil(resp)
s.Require().Len(resp.VerificationRequests, 1)
s.Require().Equal(resp.VerificationRequests[0].ID, verificationRequestID)
s.Require().Equal(resp.VerificationRequests[0].RequestStatus, verification.RequestStatusCANCELED)
// Check canceled state on the receiver's side
resp, err = WaitOnMessengerResponse(
theirMessenger,
func(r *MessengerResponse) bool {
return len(r.VerificationRequests) > 0 && len(r.ActivityCenterNotifications()) > 0
},
"no messages",
)
s.Require().NoError(err)
s.Require().Len(resp.VerificationRequests, 1)
s.Require().Equal(resp.VerificationRequests[0].ID, verificationRequestID)
s.Require().Equal(resp.ActivityCenterNotifications()[0].Type, ActivityCenterNotificationTypeContactVerification)
s.Require().Equal(resp.ActivityCenterNotifications()[0].ContactVerificationStatus, verification.RequestStatusCANCELED)
s.Require().NotNil(resp.ActivityCenterNotifications()[0].Message)
s.Require().Equal(challenge, resp.ActivityCenterNotifications()[0].Message.Text)
s.Require().Equal(resp.ActivityCenterNotifications()[0].Message.ContactVerificationState, common.ContactVerificationStateCanceled)
s.Require().Len(resp.Messages(), 1)
s.Require().Equal(challenge, resp.Messages()[0].Text)
s.Require().Equal(resp.Messages()[0].ContactVerificationState, common.ContactVerificationStateCanceled)
} }
func (s *MessengerVerificationRequests) TearDownTest() { func (s *MessengerVerificationRequests) TearDownTest() {

View File

@ -84,6 +84,7 @@ const (
ApplicationMetadataMessage_SYNC_DELETE_FOR_ME_MESSAGE ApplicationMetadataMessage_Type = 58 ApplicationMetadataMessage_SYNC_DELETE_FOR_ME_MESSAGE ApplicationMetadataMessage_Type = 58
ApplicationMetadataMessage_SYNC_SAVED_ADDRESS ApplicationMetadataMessage_Type = 59 ApplicationMetadataMessage_SYNC_SAVED_ADDRESS ApplicationMetadataMessage_Type = 59
ApplicationMetadataMessage_COMMUNITY_CANCEL_REQUEST_TO_JOIN ApplicationMetadataMessage_Type = 60 ApplicationMetadataMessage_COMMUNITY_CANCEL_REQUEST_TO_JOIN ApplicationMetadataMessage_Type = 60
ApplicationMetadataMessage_CANCEL_CONTACT_VERIFICATION ApplicationMetadataMessage_Type = 61
) )
var ApplicationMetadataMessage_Type_name = map[int32]string{ var ApplicationMetadataMessage_Type_name = map[int32]string{
@ -148,6 +149,7 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{
58: "SYNC_DELETE_FOR_ME_MESSAGE", 58: "SYNC_DELETE_FOR_ME_MESSAGE",
59: "SYNC_SAVED_ADDRESS", 59: "SYNC_SAVED_ADDRESS",
60: "COMMUNITY_CANCEL_REQUEST_TO_JOIN", 60: "COMMUNITY_CANCEL_REQUEST_TO_JOIN",
61: "CANCEL_CONTACT_VERIFICATION",
} }
var ApplicationMetadataMessage_Type_value = map[string]int32{ var ApplicationMetadataMessage_Type_value = map[string]int32{
@ -212,6 +214,7 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{
"SYNC_DELETE_FOR_ME_MESSAGE": 58, "SYNC_DELETE_FOR_ME_MESSAGE": 58,
"SYNC_SAVED_ADDRESS": 59, "SYNC_SAVED_ADDRESS": 59,
"COMMUNITY_CANCEL_REQUEST_TO_JOIN": 60, "COMMUNITY_CANCEL_REQUEST_TO_JOIN": 60,
"CANCEL_CONTACT_VERIFICATION": 61,
} }
func (x ApplicationMetadataMessage_Type) String() string { func (x ApplicationMetadataMessage_Type) String() string {
@ -290,62 +293,63 @@ func init() {
} }
var fileDescriptor_ad09a6406fcf24c7 = []byte{ var fileDescriptor_ad09a6406fcf24c7 = []byte{
// 908 bytes of a gzipped FileDescriptorProto // 914 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x5b, 0x77, 0x13, 0x37, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x5b, 0x77, 0x13, 0x37,
0x10, 0x6e, 0x20, 0x4d, 0x40, 0xb9, 0xa0, 0x88, 0x5c, 0x9c, 0xbb, 0x31, 0x34, 0x04, 0x68, 0x4d, 0x10, 0x6e, 0x20, 0x4d, 0x40, 0xb9, 0x29, 0x22, 0x17, 0xe7, 0x6e, 0x0c, 0x0d, 0x01, 0x5a, 0xd3,
0x0b, 0xbd, 0xd3, 0x3e, 0xc8, 0xd2, 0xc4, 0x16, 0xde, 0x95, 0x16, 0x49, 0x6b, 0x8e, 0xfb, 0xa2, 0x42, 0xef, 0x94, 0x07, 0x59, 0x9a, 0xd8, 0xc2, 0xbb, 0xd2, 0x22, 0x69, 0xcd, 0x71, 0x5f, 0x74,
0xb3, 0x14, 0x97, 0x93, 0x73, 0x80, 0xf8, 0x10, 0xf3, 0x90, 0x9f, 0xda, 0x5f, 0xd1, 0xbf, 0xd0, 0x96, 0xe2, 0x72, 0x72, 0x0e, 0x10, 0x1f, 0x62, 0x1e, 0xf2, 0x2f, 0xfa, 0x7b, 0xfb, 0xd4, 0xa3,
0xa3, 0xbd, 0x3a, 0xb6, 0x43, 0x9e, 0x92, 0x9d, 0xf9, 0x34, 0xa3, 0xf9, 0xe6, 0xfb, 0x64, 0xd4, 0xbd, 0x3a, 0xb6, 0x53, 0x9e, 0x92, 0x9d, 0xf9, 0x34, 0xa3, 0xf9, 0xe6, 0xfb, 0x64, 0xd4, 0x48,
0x48, 0x86, 0xc3, 0xf7, 0xa7, 0x7f, 0x27, 0xa3, 0xd3, 0xb3, 0x8f, 0xee, 0xc3, 0x60, 0x94, 0xbc, 0x86, 0xc3, 0xf7, 0x67, 0x7f, 0x25, 0xa3, 0xb3, 0xf3, 0x8f, 0xee, 0xc3, 0x60, 0x94, 0xbc, 0x4d,
0x4d, 0x46, 0x89, 0xfb, 0x30, 0x38, 0x3f, 0x4f, 0xde, 0x0d, 0x9a, 0xc3, 0x4f, 0x67, 0xa3, 0x33, 0x46, 0x89, 0xfb, 0x30, 0xb8, 0xb8, 0x48, 0xde, 0x0d, 0x9a, 0xc3, 0x4f, 0xe7, 0xa3, 0x73, 0x72,
0x72, 0x2b, 0xfd, 0xf3, 0xe6, 0xf3, 0x3f, 0x8d, 0xff, 0x56, 0xd1, 0x0e, 0xad, 0x0e, 0x84, 0x39, 0x2b, 0xfd, 0xf3, 0xe6, 0xf3, 0xdf, 0x8d, 0x7f, 0xd6, 0xd0, 0x2e, 0xad, 0x0e, 0x84, 0x39, 0x3e,
0x3e, 0xcc, 0xe0, 0x64, 0x0f, 0xdd, 0x3e, 0x3f, 0x7d, 0xf7, 0x31, 0x19, 0x7d, 0xfe, 0x34, 0xa8, 0xcc, 0xe0, 0x64, 0x1f, 0xdd, 0xbe, 0x38, 0x7b, 0xf7, 0x31, 0x19, 0x7d, 0xfe, 0x34, 0xa8, 0xcd,
0xcd, 0xd5, 0xe7, 0x8e, 0x97, 0x75, 0x15, 0x20, 0x35, 0xb4, 0x38, 0x4c, 0x2e, 0xde, 0x9f, 0x25, 0xd5, 0xe7, 0x4e, 0x96, 0x75, 0x15, 0x20, 0x35, 0xb4, 0x38, 0x4c, 0x2e, 0xdf, 0x9f, 0x27, 0x6f,
0x6f, 0x6b, 0x37, 0xd2, 0x5c, 0xf1, 0x49, 0xfe, 0x44, 0xf3, 0xa3, 0x8b, 0xe1, 0xa0, 0x76, 0xb3, 0x6b, 0x37, 0xd2, 0x5c, 0xf1, 0x49, 0x5e, 0xa0, 0xf9, 0xd1, 0xe5, 0x70, 0x50, 0xbb, 0x59, 0x9f,
0x3e, 0x77, 0xbc, 0xfa, 0xec, 0x51, 0xb3, 0xe8, 0xd7, 0xbc, 0xba, 0x57, 0xd3, 0x5e, 0x0c, 0x07, 0x3b, 0x59, 0x7d, 0xfa, 0xb0, 0x59, 0xf4, 0x6b, 0x5e, 0xdf, 0xab, 0x69, 0x2f, 0x87, 0x03, 0x9d,
0x3a, 0x3d, 0xd6, 0xf8, 0x77, 0x05, 0xcd, 0xfb, 0x4f, 0xb2, 0x84, 0x16, 0x63, 0xd9, 0x95, 0xea, 0x1e, 0x6b, 0xfc, 0xbb, 0x82, 0xe6, 0xfd, 0x27, 0x59, 0x42, 0x8b, 0xb1, 0xec, 0x4a, 0xf5, 0x5a,
0xb5, 0xc4, 0x5f, 0x11, 0x8c, 0x96, 0x59, 0x87, 0x5a, 0x17, 0x82, 0x31, 0xb4, 0x0d, 0x78, 0x8e, 0xe2, 0xaf, 0x08, 0x46, 0xcb, 0xac, 0x43, 0xad, 0x0b, 0xc1, 0x18, 0xda, 0x06, 0x3c, 0x47, 0x08,
0x10, 0xb4, 0xca, 0x94, 0xb4, 0x94, 0x59, 0x17, 0x47, 0x9c, 0x5a, 0xc0, 0x37, 0xc8, 0x3e, 0xda, 0x5a, 0x65, 0x4a, 0x5a, 0xca, 0xac, 0x8b, 0x23, 0x4e, 0x2d, 0xe0, 0x1b, 0xe4, 0x00, 0xed, 0x84,
0x0e, 0x21, 0x6c, 0x81, 0x36, 0x1d, 0x11, 0xe5, 0xe1, 0xf2, 0xc8, 0x4d, 0xb2, 0x81, 0xd6, 0x22, 0x10, 0xb6, 0x40, 0x9b, 0x8e, 0x88, 0xf2, 0x70, 0x79, 0xe4, 0x26, 0xd9, 0x44, 0xeb, 0x11, 0x15,
0x2a, 0xb4, 0x13, 0xd2, 0x58, 0x1a, 0x04, 0xd4, 0x0a, 0x25, 0xf1, 0xbc, 0x0f, 0x9b, 0xbe, 0x64, 0xda, 0x09, 0x69, 0x2c, 0x0d, 0x02, 0x6a, 0x85, 0x92, 0x78, 0xde, 0x87, 0x4d, 0x5f, 0xb2, 0xab,
0x97, 0xc3, 0x5f, 0x93, 0xfb, 0xe8, 0x50, 0xc3, 0xab, 0x18, 0x8c, 0x75, 0x94, 0x73, 0x0d, 0xc6, 0xe1, 0xaf, 0xc9, 0x3d, 0x74, 0xa4, 0xe1, 0x55, 0x0c, 0xc6, 0x3a, 0xca, 0xb9, 0x06, 0x63, 0xdc,
0xb8, 0x13, 0xa5, 0x9d, 0xd5, 0x54, 0x1a, 0xca, 0x52, 0xd0, 0x02, 0x79, 0x8c, 0x8e, 0x28, 0x63, 0xa9, 0xd2, 0xce, 0x6a, 0x2a, 0x0d, 0x65, 0x29, 0x68, 0x81, 0x3c, 0x42, 0xc7, 0x94, 0x31, 0x88,
0x10, 0x59, 0x77, 0x1d, 0x76, 0x91, 0x3c, 0x41, 0x0f, 0x39, 0xb0, 0x40, 0x48, 0xb8, 0x16, 0x7c, 0xac, 0xfb, 0x12, 0x76, 0x91, 0x3c, 0x46, 0x0f, 0x38, 0xb0, 0x40, 0x48, 0xf8, 0x22, 0xf8, 0x16,
0x8b, 0x6c, 0xa1, 0xbb, 0x05, 0x68, 0x3c, 0x71, 0x9b, 0xac, 0x23, 0x6c, 0x40, 0xf2, 0x4b, 0x51, 0xd9, 0x46, 0x77, 0x0a, 0xd0, 0x78, 0xe2, 0x36, 0xd9, 0x40, 0xd8, 0x80, 0xe4, 0x57, 0xa2, 0x88,
0x44, 0x0e, 0xd1, 0xee, 0x64, 0xed, 0x71, 0xc0, 0x92, 0xa7, 0x66, 0x6a, 0x48, 0x97, 0x13, 0x88, 0x1c, 0xa1, 0xbd, 0xc9, 0xda, 0xe3, 0x80, 0x25, 0x4f, 0xcd, 0xd4, 0x90, 0x2e, 0x27, 0x10, 0x2f,
0x97, 0x67, 0xa7, 0x29, 0x63, 0x2a, 0x96, 0x16, 0xaf, 0x90, 0x7b, 0x68, 0x7f, 0x3a, 0x1d, 0xc5, 0xcf, 0x4e, 0x53, 0xc6, 0x54, 0x2c, 0x2d, 0x5e, 0x21, 0x77, 0xd1, 0xc1, 0x74, 0x3a, 0x8a, 0x5b,
0xad, 0x40, 0x30, 0xe7, 0xf7, 0x82, 0x57, 0xc9, 0x01, 0xda, 0x29, 0xf6, 0xc1, 0x14, 0x07, 0x47, 0x81, 0x60, 0xce, 0xef, 0x05, 0xaf, 0x92, 0x43, 0xb4, 0x5b, 0xec, 0x83, 0x29, 0x0e, 0x8e, 0xf2,
0x79, 0x0f, 0xb4, 0x15, 0x06, 0x42, 0x90, 0x16, 0xdf, 0x21, 0x0d, 0x74, 0x10, 0xc5, 0xa6, 0xe3, 0x1e, 0x68, 0x2b, 0x0c, 0x84, 0x20, 0x2d, 0x5e, 0x23, 0x0d, 0x74, 0x18, 0xc5, 0xa6, 0xe3, 0xa4,
0xa4, 0xb2, 0xe2, 0x44, 0xb0, 0xac, 0x84, 0x86, 0xb6, 0x30, 0x56, 0x67, 0x94, 0x63, 0xcf, 0xd0, 0xb2, 0xe2, 0x54, 0xb0, 0xac, 0x84, 0x86, 0xb6, 0x30, 0x56, 0x67, 0x94, 0x63, 0xcf, 0xd0, 0xff,
0x97, 0x31, 0x4e, 0x83, 0x89, 0x94, 0x34, 0x80, 0xd7, 0xc8, 0x2e, 0xda, 0x9a, 0x06, 0xbf, 0x8a, 0x63, 0x9c, 0x06, 0x13, 0x29, 0x69, 0x00, 0xaf, 0x93, 0x3d, 0xb4, 0x3d, 0x0d, 0x7e, 0x15, 0x83,
0x41, 0xf7, 0x31, 0x21, 0x0f, 0x50, 0xfd, 0x8a, 0x64, 0x55, 0xe2, 0xae, 0x9f, 0x7a, 0x56, 0xbf, 0xee, 0x63, 0x42, 0xee, 0xa3, 0xfa, 0x35, 0xc9, 0xaa, 0xc4, 0x1d, 0x3f, 0xf5, 0xac, 0x7e, 0x29,
0x94, 0x3f, 0xbc, 0xee, 0x47, 0x9a, 0x95, 0xce, 0x8f, 0x6f, 0x78, 0x09, 0x42, 0xa8, 0x5e, 0x0a, 0x7f, 0x78, 0xc3, 0x8f, 0x34, 0x2b, 0x9d, 0x1f, 0xdf, 0xf4, 0x12, 0x84, 0x50, 0xbd, 0x14, 0x4e,
0xa7, 0x21, 0xe7, 0x79, 0x93, 0x6c, 0xa3, 0x8d, 0xb6, 0x56, 0x71, 0x94, 0xd2, 0xe2, 0x84, 0xec, 0x43, 0xce, 0xf3, 0x16, 0xd9, 0x41, 0x9b, 0x6d, 0xad, 0xe2, 0x28, 0xa5, 0xc5, 0x09, 0xd9, 0x13,
0x09, 0x9b, 0x4d, 0xb7, 0x45, 0xd6, 0xd0, 0x4a, 0x16, 0xe4, 0x20, 0xad, 0xb0, 0x7d, 0x5c, 0xf3, 0x36, 0x9b, 0x6e, 0x9b, 0xac, 0xa3, 0x95, 0x2c, 0xc8, 0x41, 0x5a, 0x61, 0xfb, 0xb8, 0xe6, 0xd1,
0x68, 0xa6, 0xc2, 0x30, 0x96, 0xc2, 0xf6, 0x1d, 0x07, 0xc3, 0xb4, 0x88, 0x52, 0xf4, 0x36, 0xa9, 0x4c, 0x85, 0x61, 0x2c, 0x85, 0xed, 0x3b, 0x0e, 0x86, 0x69, 0x11, 0xa5, 0xe8, 0x1d, 0x52, 0x43,
0xa1, 0xf5, 0x2a, 0x35, 0x56, 0x67, 0xc7, 0xdf, 0xba, 0xca, 0x94, 0xdb, 0x56, 0xee, 0xa5, 0x12, 0x1b, 0x55, 0x6a, 0xac, 0xce, 0xae, 0xbf, 0x75, 0x95, 0x29, 0xb7, 0xad, 0xdc, 0x4b, 0x25, 0x24,
0x12, 0xef, 0x92, 0x3b, 0x68, 0x29, 0x12, 0xb2, 0x94, 0xfd, 0x9e, 0xf7, 0x0e, 0x70, 0x51, 0x79, 0xde, 0x23, 0x6b, 0x68, 0x29, 0x12, 0xb2, 0x94, 0xfd, 0xbe, 0xf7, 0x0e, 0x70, 0x51, 0x79, 0xe7,
0x67, 0xdf, 0xdf, 0xc4, 0x58, 0x6a, 0x63, 0x53, 0x58, 0xe7, 0xc0, 0xcf, 0xc2, 0x21, 0x80, 0x31, 0xc0, 0xdf, 0xc4, 0x58, 0x6a, 0x63, 0x53, 0x58, 0xe7, 0xd0, 0xcf, 0xc2, 0x21, 0x80, 0x31, 0xbf,
0xbf, 0x1c, 0x7a, 0x51, 0xcd, 0xd2, 0x4c, 0xde, 0x1a, 0xd7, 0xc9, 0x0e, 0xda, 0xa4, 0x52, 0xc9, 0x1c, 0x79, 0x51, 0xcd, 0xd2, 0x4c, 0xde, 0x1a, 0xd7, 0xc9, 0x2e, 0xda, 0xa2, 0x52, 0xc9, 0x7e,
0x7e, 0xa8, 0x62, 0xe3, 0x42, 0xb0, 0x5a, 0x30, 0xd7, 0xa2, 0x96, 0x75, 0xf0, 0xbd, 0xd2, 0x55, 0xa8, 0x62, 0xe3, 0x42, 0xb0, 0x5a, 0x30, 0xd7, 0xa2, 0x96, 0x75, 0xf0, 0xdd, 0xd2, 0x55, 0xe9,
0xe9, 0xc8, 0x1a, 0x42, 0xd5, 0x03, 0x8e, 0x1b, 0x7e, 0x6b, 0x55, 0x38, 0x6f, 0x65, 0x3c, 0x81, 0xc8, 0x1a, 0x42, 0xd5, 0x03, 0x8e, 0x1b, 0x7e, 0x6b, 0x55, 0x38, 0x6f, 0x65, 0x3c, 0x81, 0x1c,
0x1c, 0xdf, 0x27, 0x08, 0x2d, 0xb4, 0x28, 0xeb, 0xc6, 0x11, 0x7e, 0x50, 0x2a, 0xd2, 0x33, 0xdb, 0xdf, 0x23, 0x08, 0x2d, 0xb4, 0x28, 0xeb, 0xc6, 0x11, 0xbe, 0x5f, 0x2a, 0xd2, 0x33, 0xdb, 0xf3,
0xf3, 0x93, 0x32, 0x90, 0x16, 0x74, 0x06, 0xfd, 0xa6, 0x54, 0xe4, 0x64, 0x3a, 0x73, 0x23, 0x70, 0x93, 0x32, 0x90, 0x16, 0x74, 0x06, 0xfd, 0xa6, 0x54, 0xe4, 0x64, 0x3a, 0x73, 0x23, 0x70, 0x7c,
0x7c, 0xe4, 0x15, 0x37, 0x13, 0xc2, 0x85, 0x09, 0x85, 0x31, 0xc0, 0xf1, 0xc3, 0x94, 0x09, 0x8f, 0xec, 0x15, 0x37, 0x13, 0xc2, 0x85, 0x09, 0x85, 0x31, 0xc0, 0xf1, 0x83, 0x94, 0x09, 0x8f, 0x69,
0x69, 0x29, 0xd5, 0x0d, 0xa9, 0xee, 0xe2, 0x63, 0xb2, 0x89, 0x48, 0x76, 0xc3, 0x00, 0xa8, 0x76, 0x29, 0xd5, 0x0d, 0xa9, 0xee, 0xe2, 0x13, 0xb2, 0x85, 0x48, 0x76, 0xc3, 0x00, 0xa8, 0x76, 0x1d,
0x1d, 0x61, 0xac, 0xd2, 0x7d, 0xfc, 0xc8, 0xd3, 0x98, 0xc6, 0x0d, 0x58, 0x2b, 0x64, 0x1b, 0x3f, 0x61, 0xac, 0xd2, 0x7d, 0xfc, 0xd0, 0xd3, 0x98, 0xc6, 0x0d, 0x58, 0x2b, 0x64, 0x1b, 0x3f, 0x22,
0x26, 0x75, 0xb4, 0x57, 0x2d, 0x82, 0x6a, 0xd6, 0x11, 0x3d, 0x70, 0x21, 0x6d, 0x4b, 0xb0, 0x81, 0x75, 0xb4, 0x5f, 0x2d, 0x82, 0x6a, 0xd6, 0x11, 0x3d, 0x70, 0x21, 0x6d, 0x4b, 0xb0, 0x81, 0x90,
0x90, 0x5d, 0xfc, 0xc4, 0x2f, 0x31, 0x3d, 0x13, 0x69, 0x75, 0x22, 0x02, 0x70, 0x91, 0x60, 0x36, 0x5d, 0xfc, 0xd8, 0x2f, 0x31, 0x3d, 0x13, 0x69, 0x75, 0x2a, 0x02, 0x70, 0x91, 0x60, 0x36, 0xd6,
0xd6, 0x80, 0xbf, 0xf5, 0xfe, 0x4e, 0x33, 0xaf, 0x69, 0x10, 0x80, 0x2d, 0xad, 0xf6, 0x5d, 0xca, 0x80, 0xbf, 0xf5, 0xfe, 0x4e, 0x33, 0xaf, 0x69, 0x10, 0x80, 0x2d, 0xad, 0xf6, 0x5d, 0xca, 0x69,
0x69, 0xf6, 0xa2, 0x14, 0x76, 0x2a, 0x04, 0xd9, 0xf4, 0xe4, 0x69, 0xb0, 0x3a, 0xf3, 0xd8, 0xe5, 0xf6, 0xa2, 0x14, 0x76, 0x2a, 0x04, 0xd9, 0xf4, 0xe4, 0x69, 0xb0, 0x3a, 0xf3, 0xd8, 0xd5, 0xe4,
0xe4, 0x53, 0x72, 0x84, 0x1a, 0x57, 0xca, 0xa2, 0x52, 0xed, 0xf7, 0xd5, 0x06, 0x4a, 0x70, 0x3e, 0x13, 0x72, 0x8c, 0x1a, 0xd7, 0xca, 0xa2, 0x52, 0xed, 0xf7, 0xd5, 0x06, 0x4a, 0x70, 0x3e, 0x91,
0x91, 0xc1, 0x3f, 0xf8, 0x91, 0x8a, 0xa3, 0x45, 0x87, 0x1e, 0xe8, 0x52, 0xfd, 0xf8, 0x99, 0x17, 0xc1, 0x3f, 0xf8, 0x91, 0x8a, 0xa3, 0x45, 0x87, 0x1e, 0xe8, 0x52, 0xfd, 0xf8, 0xa9, 0x17, 0xc5,
0xc5, 0xc4, 0xfd, 0x2e, 0x01, 0x9e, 0xfb, 0x12, 0xc5, 0x53, 0x34, 0x13, 0xf1, 0x63, 0x29, 0x0d, 0xc4, 0xfd, 0xae, 0x00, 0x9e, 0xf9, 0x12, 0xc5, 0x53, 0x34, 0x13, 0xf1, 0x63, 0x29, 0x0d, 0xab,
0xab, 0x63, 0x63, 0x81, 0xbb, 0xd8, 0x80, 0xc6, 0x3f, 0x95, 0x1b, 0x1f, 0x47, 0x97, 0xf3, 0xfd, 0x63, 0x63, 0x81, 0xbb, 0xd8, 0x80, 0xc6, 0x3f, 0x95, 0x1b, 0x1f, 0x47, 0x97, 0xf3, 0xfd, 0x9c,
0x9c, 0xb1, 0x3d, 0x5d, 0xaf, 0xa8, 0x82, 0x7f, 0x29, 0x35, 0x31, 0xc1, 0x8d, 0xe3, 0xc0, 0x84, 0xb1, 0x3d, 0x5d, 0xaf, 0xa8, 0x82, 0x7f, 0x29, 0x35, 0x31, 0xc1, 0x8d, 0xe3, 0xc0, 0x84, 0xf1,
0xf1, 0xad, 0x7f, 0xcd, 0x5e, 0xa9, 0x19, 0x24, 0x05, 0x40, 0x7b, 0x80, 0x7f, 0xf3, 0xf9, 0xb4, 0xad, 0x7f, 0xcd, 0x5e, 0xa9, 0x19, 0x24, 0x05, 0x40, 0x7b, 0x80, 0x7f, 0xf3, 0xf9, 0xb4, 0x44,
0x44, 0xee, 0x05, 0xff, 0x2e, 0x87, 0x95, 0x25, 0x7e, 0x2f, 0xc5, 0x61, 0x68, 0x0f, 0x78, 0xf1, 0xee, 0x05, 0xff, 0x2e, 0x87, 0x95, 0x25, 0x7e, 0x2f, 0xc5, 0x61, 0x68, 0x0f, 0x78, 0xf1, 0x7c,
0x7c, 0xe3, 0x17, 0xfe, 0xbd, 0xa9, 0xea, 0x32, 0x2a, 0x19, 0x04, 0x53, 0xd6, 0xfc, 0xa3, 0xb5, 0xe3, 0xe7, 0xfe, 0xbd, 0xa9, 0xea, 0x32, 0x2a, 0x19, 0x04, 0x53, 0xd6, 0xfc, 0xc3, 0x73, 0x97,
0xf2, 0xd7, 0x52, 0xf3, 0xe9, 0x8b, 0xe2, 0x07, 0xf1, 0xcd, 0x42, 0xfa, 0xdf, 0xf3, 0xff, 0x03, 0xe7, 0x66, 0x32, 0xf3, 0xa2, 0xb5, 0xf2, 0xe7, 0x52, 0xf3, 0xc9, 0xf3, 0xe2, 0x17, 0xf3, 0xcd,
0x00, 0x00, 0xff, 0xff, 0xfb, 0xbe, 0x92, 0x1c, 0xb7, 0x07, 0x00, 0x00, 0x42, 0xfa, 0xdf, 0xb3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x1d, 0x3f, 0x82, 0xd8, 0x07,
0x00, 0x00,
} }

View File

@ -74,5 +74,6 @@ message ApplicationMetadataMessage {
SYNC_DELETE_FOR_ME_MESSAGE = 58; SYNC_DELETE_FOR_ME_MESSAGE = 58;
SYNC_SAVED_ADDRESS = 59; SYNC_SAVED_ADDRESS = 59;
COMMUNITY_CANCEL_REQUEST_TO_JOIN = 60; COMMUNITY_CANCEL_REQUEST_TO_JOIN = 60;
CANCEL_CONTACT_VERIFICATION = 61;
} }
} }

View File

@ -825,6 +825,7 @@ type ChatMessage struct {
// The type of the content of the message // The type of the content of the message
ContentType ChatMessage_ContentType `protobuf:"varint,8,opt,name=content_type,json=contentType,proto3,enum=protobuf.ChatMessage_ContentType" json:"content_type,omitempty"` ContentType ChatMessage_ContentType `protobuf:"varint,8,opt,name=content_type,json=contentType,proto3,enum=protobuf.ChatMessage_ContentType" json:"content_type,omitempty"`
// Types that are valid to be assigned to Payload: // Types that are valid to be assigned to Payload:
//
// *ChatMessage_Sticker // *ChatMessage_Sticker
// *ChatMessage_Image // *ChatMessage_Image
// *ChatMessage_Audio // *ChatMessage_Audio

View File

@ -216,11 +216,59 @@ func (m *DeclineContactVerification) GetId() string {
return "" return ""
} }
type CancelContactVerification struct {
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *CancelContactVerification) Reset() { *m = CancelContactVerification{} }
func (m *CancelContactVerification) String() string { return proto.CompactTextString(m) }
func (*CancelContactVerification) ProtoMessage() {}
func (*CancelContactVerification) Descriptor() ([]byte, []int) {
return fileDescriptor_d6997df64de39454, []int{4}
}
func (m *CancelContactVerification) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CancelContactVerification.Unmarshal(m, b)
}
func (m *CancelContactVerification) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CancelContactVerification.Marshal(b, m, deterministic)
}
func (m *CancelContactVerification) XXX_Merge(src proto.Message) {
xxx_messageInfo_CancelContactVerification.Merge(m, src)
}
func (m *CancelContactVerification) XXX_Size() int {
return xxx_messageInfo_CancelContactVerification.Size(m)
}
func (m *CancelContactVerification) XXX_DiscardUnknown() {
xxx_messageInfo_CancelContactVerification.DiscardUnknown(m)
}
var xxx_messageInfo_CancelContactVerification proto.InternalMessageInfo
func (m *CancelContactVerification) GetClock() uint64 {
if m != nil {
return m.Clock
}
return 0
}
func (m *CancelContactVerification) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func init() { func init() {
proto.RegisterType((*RequestContactVerification)(nil), "protobuf.RequestContactVerification") proto.RegisterType((*RequestContactVerification)(nil), "protobuf.RequestContactVerification")
proto.RegisterType((*AcceptContactVerification)(nil), "protobuf.AcceptContactVerification") proto.RegisterType((*AcceptContactVerification)(nil), "protobuf.AcceptContactVerification")
proto.RegisterType((*ContactVerificationTrusted)(nil), "protobuf.ContactVerificationTrusted") proto.RegisterType((*ContactVerificationTrusted)(nil), "protobuf.ContactVerificationTrusted")
proto.RegisterType((*DeclineContactVerification)(nil), "protobuf.DeclineContactVerification") proto.RegisterType((*DeclineContactVerification)(nil), "protobuf.DeclineContactVerification")
proto.RegisterType((*CancelContactVerification)(nil), "protobuf.CancelContactVerification")
} }
func init() { func init() {
@ -228,7 +276,7 @@ func init() {
} }
var fileDescriptor_d6997df64de39454 = []byte{ var fileDescriptor_d6997df64de39454 = []byte{
// 196 bytes of a gzipped FileDescriptorProto // 208 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xce, 0xcf, 0x2b, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xce, 0xcf, 0x2b,
0x49, 0x4c, 0x2e, 0x89, 0x2f, 0x4b, 0x2d, 0xca, 0x4c, 0xcb, 0x4c, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf, 0x49, 0x4c, 0x2e, 0x89, 0x2f, 0x4b, 0x2d, 0xca, 0x4c, 0xcb, 0x4c, 0x4e, 0x2c, 0xc9, 0xcc, 0xcf,
0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x4a, 0x01, 0x5c, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53, 0x49, 0xa5, 0x69, 0x4a, 0x01, 0x5c,
@ -239,7 +287,7 @@ var fileDescriptor_d6997df64de39454 = []byte{
0x06, 0xf2, 0x71, 0x31, 0x65, 0xa6, 0x48, 0x30, 0x81, 0x4d, 0x62, 0xca, 0x4c, 0x11, 0x92, 0xe2, 0x06, 0xf2, 0x71, 0x31, 0x65, 0xa6, 0x48, 0x30, 0x81, 0x4d, 0x62, 0xca, 0x4c, 0x11, 0x92, 0xe2,
0xe2, 0x28, 0x4a, 0x2d, 0x2e, 0xc8, 0xcf, 0x2b, 0x86, 0x99, 0x0f, 0xe7, 0x2b, 0x39, 0x71, 0x49, 0xe2, 0x28, 0x4a, 0x2d, 0x2e, 0xc8, 0xcf, 0x2b, 0x86, 0x99, 0x0f, 0xe7, 0x2b, 0x39, 0x71, 0x49,
0x61, 0x31, 0x38, 0xa4, 0xa8, 0xb4, 0xb8, 0x24, 0x35, 0x85, 0x38, 0xf3, 0x41, 0x66, 0xb8, 0xa4, 0x61, 0x31, 0x38, 0xa4, 0xa8, 0xb4, 0xb8, 0x24, 0x35, 0x85, 0x38, 0xf3, 0x41, 0x66, 0xb8, 0xa4,
0x26, 0xe7, 0x64, 0xe6, 0xa5, 0x92, 0xed, 0x46, 0x27, 0xde, 0x28, 0x6e, 0x3d, 0x7d, 0x6b, 0x58, 0x26, 0xe7, 0x64, 0xe6, 0xa5, 0x92, 0xed, 0x46, 0x25, 0x47, 0x2e, 0x49, 0xe7, 0xc4, 0xbc, 0xe4,
0x38, 0x26, 0xb1, 0x81, 0x59, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0x70, 0x15, 0x72, 0xc2, 0xd4, 0x1c, 0xb2, 0x8d, 0x70, 0xe2, 0x8d, 0xe2, 0xd6, 0xd3, 0xb7, 0x86, 0x45, 0x45, 0x12, 0x1b,
0x76, 0x01, 0x00, 0x00, 0x98, 0x65, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x91, 0x98, 0xa6, 0xb9, 0x01, 0x00, 0x00,
} }

View File

@ -23,3 +23,8 @@ message DeclineContactVerification {
uint64 clock = 1; uint64 clock = 1;
string id = 2; string id = 2;
} }
message CancelContactVerification {
uint64 clock = 1;
string id = 2;
}

View File

@ -166,6 +166,7 @@ type MembershipUpdateMessage struct {
// An optional chat message // An optional chat message
// //
// Types that are valid to be assigned to ChatEntity: // Types that are valid to be assigned to ChatEntity:
//
// *MembershipUpdateMessage_Message // *MembershipUpdateMessage_Message
// *MembershipUpdateMessage_EmojiReaction // *MembershipUpdateMessage_EmojiReaction
ChatEntity isMembershipUpdateMessage_ChatEntity `protobuf_oneof:"chat_entity"` ChatEntity isMembershipUpdateMessage_ChatEntity `protobuf_oneof:"chat_entity"`

View File

@ -55,16 +55,16 @@ func (StatusUpdate_StatusType) EnumDescriptor() ([]byte, []int) {
} }
// Specs: // Specs:
//:AUTOMATIC // :AUTOMATIC
//To Send - "AUTOMATIC" status ping every 5 minutes // To Send - "AUTOMATIC" status ping every 5 minutes
//Display - Online for up to 5 minutes from the last clock, after that Offline // Display - Online for up to 5 minutes from the last clock, after that Offline
//:ALWAYS_ONLINE // :ALWAYS_ONLINE
//To Send - "ALWAYS_ONLINE" status ping every 5 minutes // To Send - "ALWAYS_ONLINE" status ping every 5 minutes
//Display - Online for up to 2 weeks from the last clock, after that Offline // Display - Online for up to 2 weeks from the last clock, after that Offline
//:INACTIVE // :INACTIVE
//To Send - A single "INACTIVE" status ping // To Send - A single "INACTIVE" status ping
//Display - Offline forever // Display - Offline forever
//Note: Only send pings if the user interacted with the app in the last x minutes. // Note: Only send pings if the user interacted with the app in the last x minutes.
type StatusUpdate struct { type StatusUpdate struct {
Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"` Clock uint64 `protobuf:"varint,1,opt,name=clock,proto3" json:"clock,omitempty"`
StatusType StatusUpdate_StatusType `protobuf:"varint,2,opt,name=status_type,json=statusType,proto3,enum=protobuf.StatusUpdate_StatusType" json:"status_type,omitempty"` StatusType StatusUpdate_StatusType `protobuf:"varint,2,opt,name=status_type,json=statusType,proto3,enum=protobuf.StatusUpdate_StatusType" json:"status_type,omitempty"`

View File

@ -82,6 +82,7 @@ type SyncSetting struct {
Type SyncSetting_Type `protobuf:"varint,1,opt,name=type,proto3,enum=protobuf.SyncSetting_Type" json:"type,omitempty"` Type SyncSetting_Type `protobuf:"varint,1,opt,name=type,proto3,enum=protobuf.SyncSetting_Type" json:"type,omitempty"`
Clock uint64 `protobuf:"varint,2,opt,name=clock,proto3" json:"clock,omitempty"` Clock uint64 `protobuf:"varint,2,opt,name=clock,proto3" json:"clock,omitempty"`
// Types that are valid to be assigned to Value: // Types that are valid to be assigned to Value:
//
// *SyncSetting_ValueString // *SyncSetting_ValueString
// *SyncSetting_ValueBytes // *SyncSetting_ValueBytes
// *SyncSetting_ValueBool // *SyncSetting_ValueBool

View File

@ -306,6 +306,8 @@ func (m *StatusMessage) HandleApplication() error {
return m.unmarshalProtobufData(new(protobuf.RequestContactVerification)) return m.unmarshalProtobufData(new(protobuf.RequestContactVerification))
case protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_VERIFICATION: case protobuf.ApplicationMetadataMessage_ACCEPT_CONTACT_VERIFICATION:
return m.unmarshalProtobufData(new(protobuf.AcceptContactVerification)) return m.unmarshalProtobufData(new(protobuf.AcceptContactVerification))
case protobuf.ApplicationMetadataMessage_CANCEL_CONTACT_VERIFICATION:
return m.unmarshalProtobufData(new(protobuf.CancelContactVerification))
case protobuf.ApplicationMetadataMessage_CONTACT_VERIFICATION_TRUSTED: case protobuf.ApplicationMetadataMessage_CONTACT_VERIFICATION_TRUSTED:
return m.unmarshalProtobufData(new(protobuf.ContactVerificationTrusted)) return m.unmarshalProtobufData(new(protobuf.ContactVerificationTrusted))
case protobuf.ApplicationMetadataMessage_DECLINE_CONTACT_VERIFICATION: case protobuf.ApplicationMetadataMessage_DECLINE_CONTACT_VERIFICATION:

View File

@ -127,9 +127,9 @@ func (p *Persistence) GetReceivedVerificationRequests(myPublicKey string) ([]*Re
return response, nil return response, nil
} }
func (p *Persistence) GetVerificationRequestSentTo(contactID string) (*Request, error) { func (p *Persistence) GetLatestVerificationRequestSentTo(contactID string) (*Request, error) {
var vr Request var vr Request
err := p.db.QueryRow(`SELECT id, from_user, to_user, challenge, response, requested_at, verification_status, replied_at FROM verification_requests_individual WHERE to_user = ?`, contactID).Scan( err := p.db.QueryRow(`SELECT id, from_user, to_user, challenge, response, requested_at, verification_status, replied_at FROM verification_requests_individual WHERE to_user = ? ORDER BY requested_at DESC`, contactID).Scan(
&vr.ID, &vr.ID,
&vr.From, &vr.From,
&vr.To, &vr.To,

View File

@ -820,16 +820,16 @@ func (api *PublicAPI) GetVerificationRequestSentTo(ctx context.Context, contactI
return api.service.messenger.GetVerificationRequestSentTo(ctx, contactID) return api.service.messenger.GetVerificationRequestSentTo(ctx, contactID)
} }
func (api *PublicAPI) CancelVerificationRequest(ctx context.Context, contactID string) error { func (api *PublicAPI) CancelVerificationRequest(ctx context.Context, id string) (*protocol.MessengerResponse, error) {
return api.service.messenger.CancelVerificationRequest(ctx, contactID) return api.service.messenger.CancelVerificationRequest(ctx, id)
} }
func (api *PublicAPI) AcceptContactVerificationRequest(ctx context.Context, contactID string, response string) (*protocol.MessengerResponse, error) { func (api *PublicAPI) AcceptContactVerificationRequest(ctx context.Context, id string, response string) (*protocol.MessengerResponse, error) {
return api.service.messenger.AcceptContactVerificationRequest(ctx, contactID, response) return api.service.messenger.AcceptContactVerificationRequest(ctx, id, response)
} }
func (api *PublicAPI) DeclineContactVerificationRequest(ctx context.Context, contactID string) (*protocol.MessengerResponse, error) { func (api *PublicAPI) DeclineContactVerificationRequest(ctx context.Context, id string) (*protocol.MessengerResponse, error) {
return api.service.messenger.DeclineContactVerificationRequest(ctx, contactID) return api.service.messenger.DeclineContactVerificationRequest(ctx, id)
} }
func (api *PublicAPI) VerifiedTrusted(ctx context.Context, request *requests.VerifiedTrusted) (*protocol.MessengerResponse, error) { func (api *PublicAPI) VerifiedTrusted(ctx context.Context, request *requests.VerifiedTrusted) (*protocol.MessengerResponse, error) {