rpc: add android login startup compat

(cherry picked from commit 53904e72f7c3b96e6ae5e24196d0e551fa8aebce)
This commit is contained in:
A 2026-06-08 21:56:51 +08:00
parent 82dd2996e6
commit 294e994272
7 changed files with 127 additions and 3 deletions

View file

@ -608,6 +608,7 @@ func clientMessageNeedsAck(typeID uint32) bool {
case proto.MessageContainerTypeID,
mt.MsgsAckTypeID,
mt.PingDelayDisconnectRequestTypeID,
mt.DestroySessionRequestTypeID,
mt.HTTPWaitRequestTypeID,
mt.BadMsgNotificationTypeID,
mt.BadServerSaltTypeID,

View file

@ -37,6 +37,9 @@ func (r *Router) registerAuth(d *tg.ServerDispatcher) {
d.OnAuthDropTempAuthKeys(func(ctx context.Context, exceptauthkeys []int64) (bool, error) {
return true, nil
})
d.OnAuthInitPasskeyLogin(func(ctx context.Context, req *tg.AuthInitPasskeyLoginRequest) (*tg.AuthPasskeyLoginOptions, error) {
return &tg.AuthPasskeyLoginOptions{Options: tg.DataJSON{Data: "{}"}}, nil
})
d.OnAuthSendCode(r.onAuthSendCode)
d.OnAuthResendCode(r.onAuthResendCode)
d.OnAuthCancelCode(r.onAuthCancelCode)

View file

@ -21,6 +21,12 @@ func (r *Router) dispatchCompat(ctx context.Context, b *bin.Buffer, id uint32) (
)
switch id {
case legacyLangpackGetLangPackTypeID:
name = "langpack.getLangPack#9ab5c58e"
enc, err = r.handleLegacyLangpackGetLangPack(ctx, b)
case legacyLangpackGetStringsTypeID:
name = "langpack.getStrings#2e1ee318"
enc, err = r.handleLegacyLangpackGetStrings(ctx, b)
case legacyLangpackGetLanguagesTypeID:
name = "langpack.getLanguages#800fd57d"
enc, err = r.handleLegacyLangpackGetLanguages(ctx, b)

View file

@ -8,7 +8,13 @@ import (
"github.com/gotd/td/tg"
)
const legacyLangpackGetLanguagesTypeID uint32 = 0x800fd57d
const (
legacyLangpackGetLangPackTypeID uint32 = 0x9ab5c58e
legacyLangpackGetStringsTypeID uint32 = 0x2e1ee318
legacyLangpackGetLanguagesTypeID uint32 = 0x800fd57d
maxLegacyLangpackStringKeys = 512
)
// registerLangpack 注册 langpack.* RPC handler。
func (r *Router) registerLangpack(d *tg.ServerDispatcher) {
@ -47,6 +53,59 @@ func (r *Router) registerLangpack(d *tg.ServerDispatcher) {
})
}
func (r *Router) handleLegacyLangpackGetLangPack(ctx context.Context, b *bin.Buffer) (bin.Encoder, error) {
if err := b.ConsumeID(legacyLangpackGetLangPackTypeID); err != nil {
return nil, err
}
langCode, err := b.String()
if err != nil {
return nil, err
}
langPack := langPackFromClient(ctx)
if r.deps.LangPack == nil {
return &tg.LangPackDifference{LangCode: langCode}, nil
}
pack, err := r.deps.LangPack.GetLangPack(ctx, langPack, langCode)
if err != nil {
return nil, internalErr()
}
return tgLangPackDifference(pack), nil
}
func (r *Router) handleLegacyLangpackGetStrings(ctx context.Context, b *bin.Buffer) (bin.Encoder, error) {
if err := b.ConsumeID(legacyLangpackGetStringsTypeID); err != nil {
return nil, err
}
langCode, err := b.String()
if err != nil {
return nil, err
}
headerLen, err := b.VectorHeader()
if err != nil {
return nil, err
}
if headerLen > maxLegacyLangpackStringKeys {
return nil, limitInvalidErr()
}
keys := make([]string, 0, headerLen)
for i := 0; i < headerLen; i++ {
key, err := b.String()
if err != nil {
return nil, err
}
keys = append(keys, key)
}
langPack := langPackFromClient(ctx)
if r.deps.LangPack == nil {
return &tg.LangPackStringClassVector{}, nil
}
pack, err := r.deps.LangPack.GetStrings(ctx, langPack, langCode, keys)
if err != nil {
return nil, internalErr()
}
return &tg.LangPackStringClassVector{Elems: tgLangPackStrings(pack.Strings)}, nil
}
func (r *Router) handleLegacyLangpackGetLanguages(ctx context.Context, b *bin.Buffer) (bin.Encoder, error) {
if err := b.ConsumeID(legacyLangpackGetLanguagesTypeID); err != nil {
return nil, err

View file

@ -34,6 +34,51 @@ func TestLangpackGetLanguagesCurrentAndLegacy(t *testing.T) {
})
}
func TestLegacyLangpackGetLangPack(t *testing.T) {
r := New(Config{DC: 2, IP: "127.0.0.1", Port: 2398}, Deps{}, zaptest.NewLogger(t), clock.System)
var in bin.Buffer
in.PutID(legacyLangpackGetLangPackTypeID)
in.PutString("en")
enc, err := r.Dispatch(androidClientContext(), [8]byte{}, 0, &in)
if err != nil {
t.Fatalf("dispatch legacy langpack.getLangPack: %v", err)
}
var out bin.Buffer
if err := enc.Encode(&out); err != nil {
t.Fatalf("encode response: %v", err)
}
var diff tg.LangPackDifference
if err := diff.Decode(&out); err != nil {
t.Fatalf("decode response: %v", err)
}
if diff.LangCode != "en" {
t.Fatalf("difference = %+v, want lang_code=en", diff)
}
}
func TestLegacyLangpackGetStrings(t *testing.T) {
r := New(Config{DC: 2, IP: "127.0.0.1", Port: 2398}, Deps{}, zaptest.NewLogger(t), clock.System)
var in bin.Buffer
in.PutID(legacyLangpackGetStringsTypeID)
in.PutString("en")
in.PutVectorHeader(1)
in.PutString("lng_intro_about")
enc, err := r.Dispatch(androidClientContext(), [8]byte{}, 0, &in)
if err != nil {
t.Fatalf("dispatch legacy langpack.getStrings: %v", err)
}
var out bin.Buffer
if err := enc.Encode(&out); err != nil {
t.Fatalf("encode response: %v", err)
}
var strings tg.LangPackStringClassVector
if err := strings.Decode(&out); err != nil {
t.Fatalf("decode response: %v", err)
}
}
func assertLangpackLanguages(t *testing.T, r *Router, ctx context.Context, in *bin.Buffer) {
t.Helper()
enc, err := r.Dispatch(ctx, [8]byte{}, 0, in)
@ -52,3 +97,11 @@ func assertLangpackLanguages(t *testing.T, r *Router, ctx context.Context, in *b
t.Fatalf("languages = %+v, want English entry", langs.Elems)
}
}
func androidClientContext() context.Context {
return WithClientInfo(context.Background(), ClientInfo{
DeviceModel: "Android",
AppVersion: "12.7.3",
LangCode: "en",
})
}

View file

@ -401,6 +401,7 @@ func TestTDesktopStartupRPCsEncode(t *testing.T) {
{name: "help.getPromoData", req: &tg.HelpGetPromoDataRequest{}},
{name: "help.getTermsOfServiceUpdate", req: &tg.HelpGetTermsOfServiceUpdateRequest{}},
{name: "help.getPremiumPromo", req: &tg.HelpGetPremiumPromoRequest{}},
{name: "auth.initPasskeyLogin", req: &tg.AuthInitPasskeyLoginRequest{APIID: 4, APIHash: "test"}},
{name: "account.getPassword", req: &tg.AccountGetPasswordRequest{}},
{name: "account.getNotifySettings", req: &tg.AccountGetNotifySettingsRequest{Peer: &tg.InputNotifyUsers{}}},
{name: "account.resetNotifySettings", req: &tg.AccountResetNotifySettingsRequest{}},