Skip to content

Commit

Permalink
only update changed messages in LoadNonblock (#18872)
Browse files Browse the repository at this point in the history
  • Loading branch information
mmaxim committed Aug 10, 2019
1 parent b9225ae commit 2b9f747
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 15 deletions.
22 changes: 12 additions & 10 deletions go/chat/boxer.go
Expand Up @@ -748,12 +748,12 @@ func (b *Boxer) validatePairwiseMAC(ctx context.Context, boxed chat1.MessageBoxe
return senderEncryptionKID.ToBytes(), nil
}

func (b *Boxer) ResolveSkippedUnboxed(ctx context.Context, msg chat1.MessageUnboxed) (chat1.MessageUnboxed, types.UnboxingError) {
func (b *Boxer) ResolveSkippedUnboxed(ctx context.Context, msg chat1.MessageUnboxed) (res chat1.MessageUnboxed, modified bool, err types.UnboxingError) {
if !msg.IsValid() {
return msg, nil
return msg, false, nil
}
if msg.Valid().VerificationKey == nil {
return msg, nil
return msg, false, nil
}
// verify sender key
revokedAt, ierr := b.ValidSenderKey(ctx, msg.Valid().ClientHeader.Sender, *msg.Valid().VerificationKey,
Expand All @@ -763,24 +763,26 @@ func (b *Boxer) ResolveSkippedUnboxed(ctx context.Context, msg chat1.MessageUnbo
return b.makeErrorMessageFromPieces(ctx, ierr, msg.GetMessageID(), msg.GetMessageType(),
msg.Valid().ServerHeader.Ctime, msg.Valid().ClientHeader.Sender,
msg.Valid().ClientHeader.SenderDevice, msg.Valid().IsEphemeral(),
msg.Valid().IsEphemeralExpired(b.clock.Now()), msg.Valid().Etime()), nil
msg.Valid().IsEphemeralExpired(b.clock.Now()), msg.Valid().Etime()), true, nil
}
return msg, ierr
return msg, false, ierr
}
mvalid := msg.Valid()
mvalid.SenderDeviceRevokedAt = revokedAt
return chat1.NewMessageUnboxedWithValid(mvalid), nil
return chat1.NewMessageUnboxedWithValid(mvalid), revokedAt != nil, nil
}

func (b *Boxer) ResolveSkippedUnboxeds(ctx context.Context, msgs []chat1.MessageUnboxed) (res []chat1.MessageUnboxed, err types.UnboxingError) {
func (b *Boxer) ResolveSkippedUnboxeds(ctx context.Context, msgs []chat1.MessageUnboxed) (res []chat1.MessageUnboxed, modifiedMap map[chat1.MessageID]bool, err types.UnboxingError) {
modifiedMap = make(map[chat1.MessageID]bool)
for _, msg := range msgs {
rmsg, err := b.ResolveSkippedUnboxed(ctx, msg)
rmsg, modified, err := b.ResolveSkippedUnboxed(ctx, msg)
if err != nil {
return res, err
return res, modifiedMap, err
}
modifiedMap[rmsg.GetMessageID()] = modified
res = append(res, rmsg)
}
return res, nil
return res, modifiedMap, nil
}

func (b *Boxer) unboxV2orV3orV4(ctx context.Context, boxed chat1.MessageBoxed,
Expand Down
8 changes: 6 additions & 2 deletions go/chat/boxer_test.go
Expand Up @@ -754,9 +754,11 @@ func TestChatMessageRevokedKeyThenSent(t *testing.T) {
unboxed, ierr := boxer.unbox(ctx, boxed, convInfo, key, nil)
require.NoError(t, ierr)
require.NotNil(t, unboxed)
resolved, err := boxer.ResolveSkippedUnboxed(ctx, chat1.NewMessageUnboxedWithValid(*unboxed))
resolved, modified, err := boxer.ResolveSkippedUnboxed(ctx,
chat1.NewMessageUnboxedWithValid(*unboxed))
require.NoError(t, err)
require.True(t, resolved.IsError())
require.True(t, modified)
})
}

Expand Down Expand Up @@ -824,10 +826,12 @@ func TestChatMessageSentThenRevokedSenderKey(t *testing.T) {
unboxed, ierr = boxer.unbox(ctx, boxed, convInfo, key, nil)
require.NoError(t, ierr)
require.Nil(t, unboxed.SenderDeviceRevokedAt)
resolved, err := boxer.ResolveSkippedUnboxed(ctx, chat1.NewMessageUnboxedWithValid(*unboxed))
resolved, modified, err := boxer.ResolveSkippedUnboxed(ctx,
chat1.NewMessageUnboxedWithValid(*unboxed))
require.NoError(t, err)
require.True(t, resolved.IsValid())
require.NotNil(t, resolved.Valid().SenderDeviceRevokedAt)
require.True(t, modified)
})
}

Expand Down
16 changes: 13 additions & 3 deletions go/chat/uithreadloader.go
Expand Up @@ -452,7 +452,7 @@ func (t *UIThreadLoader) LoadNonblock(ctx context.Context, chatUI libkb.ChatUI,
ctx = globals.CtxModifyUnboxMode(ctx, types.UnboxModeFull)
t.Debug(ctx, "LoadNonblock: resolving message skips: convID: %s num: %d",
skip.ConvID, len(messages))
resolved, err := NewBoxer(t.G()).ResolveSkippedUnboxeds(ctx, messages)
resolved, modifiedMap, err := NewBoxer(t.G()).ResolveSkippedUnboxeds(ctx, messages)
if err != nil {
return err
}
Expand All @@ -463,18 +463,28 @@ func (t *UIThreadLoader) LoadNonblock(ctx context.Context, chatUI libkb.ChatUI,
// only deliver these updates for the current conv
continue
}
// filter resolved to only update changed messges
var changed []chat1.MessageUnboxed
for _, rmsg := range resolved {
if modifiedMap[rmsg.GetMessageID()] {
changed = append(changed, rmsg)
}
}
if len(changed) == 0 {
continue
}
conv, ierr := utils.GetUnverifiedConv(ctx, t.G(), uid, convID, types.InboxSourceDataSourceAll)
if ierr != nil {
return ierr
}
if resolved, ierr = t.G().ConvSource.TransformSupersedes(ctx, conv.Conv, uid, resolved,
if changed, ierr = t.G().ConvSource.TransformSupersedes(ctx, conv.Conv, uid, changed,
query, nil, nil); ierr != nil {
return ierr
}
notif := chat1.MessagesUpdated{
ConvID: convID,
}
for _, msg := range resolved {
for _, msg := range changed {
notif.Updates = append(notif.Updates, utils.PresentMessageUnboxed(ctx, t.G(), msg, uid,
convID))
}
Expand Down

0 comments on commit 2b9f747

Please sign in to comment.