diff --git a/pkg/channels/base.go b/pkg/channels/base.go index bd4ced849..14063db21 100644 --- a/pkg/channels/base.go +++ b/pkg/channels/base.go @@ -259,7 +259,11 @@ func (c *BaseChannel) HandleMessage( } if sender.CanonicalID != "" || sender.PlatformID != "" { 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 { if !c.IsAllowed(senderID) { diff --git a/pkg/channels/qq/qq.go b/pkg/channels/qq/qq.go index 004b8c420..19ee09b1e 100644 --- a/pkg/channels/qq/qq.go +++ b/pkg/channels/qq/qq.go @@ -130,7 +130,9 @@ func (c *QQChannel) resolveAllowedSender(primaryOpenID, legacyID string) (bus.Se PlatformID: legacyID, } 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 } + allowCheckSenderID := senderID + if usedLegacyFallback && legacyAuthorID != "" { + allowCheckSenderID = legacyAuthorID + } + c.HandleMessage(c.ctx, bus.Peer{Kind: "direct", ID: chatID}, data.ID, - senderID, + allowCheckSenderID, chatID, content, mediaPaths, @@ -897,10 +904,15 @@ func (c *QQChannel) handleGroupATMessage() event.GroupATMessageEventHandler { metadata["legacy_account_id"] = legacyMemberID } + allowCheckSenderID := senderID + if usedLegacyFallback && legacyMemberID != "" { + allowCheckSenderID = legacyMemberID + } + c.HandleMessage(c.ctx, bus.Peer{Kind: "group", ID: chatID}, data.ID, - senderID, + allowCheckSenderID, chatID, content, mediaPaths, diff --git a/pkg/channels/qq/qq_test.go b/pkg/channels/qq/qq_test.go index 5ef2b403b..cd570bdc0 100644 --- a/pkg/channels/qq/qq_test.go +++ b/pkg/channels/qq/qq_test.go @@ -115,8 +115,14 @@ func TestHandleC2CMessage_AllowListFallsBackToLegacyID(t *testing.T) { } inbound := waitInboundMessage(t, messageBus) - if inbound.SenderID != "user-openid-123" { - t.Fatalf("inbound.SenderID = %q, want %q", inbound.SenderID, "user-openid-123") + if inbound.SenderID != "qq: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" { 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) - if inbound.SenderID != "member-openid-xyz" { - t.Fatalf("inbound.SenderID = %q, want %q", inbound.SenderID, "member-openid-xyz") + if inbound.SenderID != "qq: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" { t.Fatalf("account_id metadata = %q, want %q", inbound.Metadata["account_id"], "member-openid-xyz")