perf: sync protocol and core hardening updates

This commit is contained in:
A 2026-07-11 19:48:26 +08:00
parent 152fed3b87
commit 4390ebf5a9
283 changed files with 29231 additions and 2295 deletions

View file

@ -799,6 +799,82 @@ func TestConferenceInviteMessageResolvesInputGroupCallInviteMessage(t *testing.T
}
}
func TestConferenceInviteExactReplayConfirmsImmutableMessageWithoutFanout(t *testing.T) {
f := newConferenceFixture(t)
aliceCtx := f.userCtx(f.alice, 11)
create, err := f.router.onPhoneCreateConferenceCall(aliceCtx, &tg.PhoneCreateConferenceCallRequest{RandomID: 89})
if err != nil {
t.Fatalf("create conference: %v", err)
}
call := findUpdate[*tg.UpdateGroupCall](t, create).Call.(*tg.GroupCall)
request := &tg.PhoneInviteConferenceCallParticipantRequest{
Call: &tg.InputGroupCall{ID: call.ID, AccessHash: call.AccessHash},
UserID: &tg.InputUser{UserID: f.bob.ID, AccessHash: f.bob.AccessHash},
}
first, err := f.router.onPhoneInviteConferenceCallParticipant(aliceCtx, request)
if err != nil {
t.Fatalf("first conference invite: %v", err)
}
firstUpdate := findUpdate[*tg.UpdateNewMessage](t, first)
firstMessage, ok := firstUpdate.Message.(*tg.MessageService)
if !ok {
t.Fatalf("first conference message = %T, want MessageService", firstUpdate.Message)
}
bobHistory, err := f.messages.GetHistory(f.ctx, f.bob.ID, domain.MessageFilter{
HasPeer: true,
Peer: domain.Peer{Type: domain.PeerTypeUser, ID: f.alice.ID},
Limit: 10,
})
if err != nil || len(bobHistory.Messages) != 1 {
t.Fatalf("bob history after first invite len=%d err=%v, want one", len(bobHistory.Messages), err)
}
bobMessageID := bobHistory.Messages[0].ID
_, firstInvite, found, err := f.group.GetByInviteMessage(f.ctx, f.bob.ID, bobMessageID)
if err != nil || !found {
t.Fatalf("first durable invite = %+v found=%v err=%v", firstInvite, found, err)
}
f.sessions.reset()
replay, err := f.router.onPhoneInviteConferenceCallParticipant(aliceCtx, request)
if err != nil {
t.Fatalf("replay conference invite: %v", err)
}
replayed := findUpdate[*tg.UpdateNewMessage](t, replay)
replayedMessage, ok := replayed.Message.(*tg.MessageService)
if !ok || replayedMessage.ID != firstMessage.ID || replayed.Pts != firstUpdate.Pts || replayed.PtsCount != firstUpdate.PtsCount {
t.Fatalf("replay message = %+v (%T), want original confirmation %d pts %d/%d", replayed.Message, replayed.Message, firstMessage.ID, firstUpdate.Pts, firstUpdate.PtsCount)
}
mapping := findUpdate[*tg.UpdateMessageID](t, replay)
wantRandomID := conferenceInviteRandomID(call.ID, f.bob.ID, int(f.clock.Now().Unix()))
if mapping.ID != firstMessage.ID || mapping.RandomID != wantRandomID {
t.Fatalf("replay mapping = %+v, want id/random_id %d/%d", mapping, firstMessage.ID, wantRandomID)
}
if records := f.sessions.records(); len(records) != 0 {
t.Fatalf("replay must not fan out another invite, got %+v", records)
}
bobHistory, err = f.messages.GetHistory(f.ctx, f.bob.ID, domain.MessageFilter{
HasPeer: true,
Peer: domain.Peer{Type: domain.PeerTypeUser, ID: f.alice.ID},
Limit: 10,
})
if err != nil || len(bobHistory.Messages) != 1 {
t.Fatalf("bob history after replay len=%d err=%v, want original one", len(bobHistory.Messages), err)
}
_, replayInvite, found, err := f.group.GetByInviteMessage(f.ctx, f.bob.ID, bobMessageID)
if err != nil || !found || replayInvite != firstInvite {
t.Fatalf("durable invite after replay = %+v found=%v err=%v, want unchanged %+v", replayInvite, found, err, firstInvite)
}
conflict := *request
conflict.Video = true
if result, err := f.router.onPhoneInviteConferenceCallParticipant(aliceCtx, &conflict); result != nil || !tgerr.Is(err, "RANDOM_ID_DUPLICATE") {
t.Fatalf("conflicting replay = %+v err=%v, want RANDOM_ID_DUPLICATE", result, err)
}
if records := f.sessions.records(); len(records) != 0 {
t.Fatalf("conflicting replay must not fan out, got %+v", records)
}
}
func TestPhoneDiscardMigrateConferenceCarriesSlug(t *testing.T) {
f := newConferenceFixture(t)
aliceCtx := f.userCtx(f.alice, 11)