fix(channels): ensure OpenID consistency and fix legacy auth fallback

This commit is contained in:
Sakurapainting 2026-03-27 23:40:46 +08:00
parent 028c4bf71d
commit 7ea4f4d8e2
3 changed files with 36 additions and 8 deletions

View file

@ -259,7 +259,11 @@ func (c *BaseChannel) HandleMessage(
} }
if sender.CanonicalID != "" || sender.PlatformID != "" { if sender.CanonicalID != "" || sender.PlatformID != "" {
if !c.IsAllowedSender(sender) { if !c.IsAllowedSender(sender) {
return // Backward-compatible fallback for channels that already resolved sender
// via a legacy identifier before publishing.
if !c.IsAllowed(senderID) {
return
}
} }
} else { } else {
if !c.IsAllowed(senderID) { if !c.IsAllowed(senderID) {

View file

@ -130,7 +130,9 @@ func (c *QQChannel) resolveAllowedSender(primaryOpenID, legacyID string) (bus.Se
PlatformID: legacyID, PlatformID: legacyID,
} }
if c.IsAllowedSender(legacy) { if c.IsAllowedSender(legacy) {
return legacy, true, true // Keep openid/canonical sender identity in published messages,
// while recording that allow_from matched via legacy fallback.
return primary, true, true
} }
} }
@ -781,10 +783,15 @@ func (c *QQChannel) handleC2CMessage() event.C2CMessageEventHandler {
metadata["legacy_account_id"] = legacyAuthorID metadata["legacy_account_id"] = legacyAuthorID
} }
allowCheckSenderID := senderID
if usedLegacyFallback && legacyAuthorID != "" {
allowCheckSenderID = legacyAuthorID
}
c.HandleMessage(c.ctx, c.HandleMessage(c.ctx,
bus.Peer{Kind: "direct", ID: chatID}, bus.Peer{Kind: "direct", ID: chatID},
data.ID, data.ID,
senderID, allowCheckSenderID,
chatID, chatID,
content, content,
mediaPaths, mediaPaths,
@ -897,10 +904,15 @@ func (c *QQChannel) handleGroupATMessage() event.GroupATMessageEventHandler {
metadata["legacy_account_id"] = legacyMemberID metadata["legacy_account_id"] = legacyMemberID
} }
allowCheckSenderID := senderID
if usedLegacyFallback && legacyMemberID != "" {
allowCheckSenderID = legacyMemberID
}
c.HandleMessage(c.ctx, c.HandleMessage(c.ctx,
bus.Peer{Kind: "group", ID: chatID}, bus.Peer{Kind: "group", ID: chatID},
data.ID, data.ID,
senderID, allowCheckSenderID,
chatID, chatID,
content, content,
mediaPaths, mediaPaths,

View file

@ -115,8 +115,14 @@ func TestHandleC2CMessage_AllowListFallsBackToLegacyID(t *testing.T) {
} }
inbound := waitInboundMessage(t, messageBus) inbound := waitInboundMessage(t, messageBus)
if inbound.SenderID != "user-openid-123" { if inbound.SenderID != "qq:user-openid-123" {
t.Fatalf("inbound.SenderID = %q, want %q", inbound.SenderID, "user-openid-123") t.Fatalf("inbound.SenderID = %q, want %q", inbound.SenderID, "qq:user-openid-123")
}
if inbound.Sender.PlatformID != "user-openid-123" {
t.Fatalf("inbound.Sender.PlatformID = %q, want %q", inbound.Sender.PlatformID, "user-openid-123")
}
if inbound.Sender.CanonicalID != "qq:user-openid-123" {
t.Fatalf("inbound.Sender.CanonicalID = %q, want %q", inbound.Sender.CanonicalID, "qq:user-openid-123")
} }
if inbound.Metadata["account_id"] != "user-openid-123" { if inbound.Metadata["account_id"] != "user-openid-123" {
t.Fatalf("account_id metadata = %q, want %q", inbound.Metadata["account_id"], "user-openid-123") t.Fatalf("account_id metadata = %q, want %q", inbound.Metadata["account_id"], "user-openid-123")
@ -183,8 +189,14 @@ func TestHandleGroupATMessage_AllowListFallsBackToLegacyMemberID(t *testing.T) {
} }
inbound := waitInboundMessage(t, messageBus) inbound := waitInboundMessage(t, messageBus)
if inbound.SenderID != "member-openid-xyz" { if inbound.SenderID != "qq:member-openid-xyz" {
t.Fatalf("inbound.SenderID = %q, want %q", inbound.SenderID, "member-openid-xyz") t.Fatalf("inbound.SenderID = %q, want %q", inbound.SenderID, "qq:member-openid-xyz")
}
if inbound.Sender.PlatformID != "member-openid-xyz" {
t.Fatalf("inbound.Sender.PlatformID = %q, want %q", inbound.Sender.PlatformID, "member-openid-xyz")
}
if inbound.Sender.CanonicalID != "qq:member-openid-xyz" {
t.Fatalf("inbound.Sender.CanonicalID = %q, want %q", inbound.Sender.CanonicalID, "qq:member-openid-xyz")
} }
if inbound.Metadata["account_id"] != "member-openid-xyz" { if inbound.Metadata["account_id"] != "member-openid-xyz" {
t.Fatalf("account_id metadata = %q, want %q", inbound.Metadata["account_id"], "member-openid-xyz") t.Fatalf("account_id metadata = %q, want %q", inbound.Metadata["account_id"], "member-openid-xyz")