From 3e5bf3a4e0324d499fbc0847000d09a6006161ef Mon Sep 17 00:00:00 2001 From: hawklin2017 <32898629+hawklin2017@users.noreply.github.com> Date: Wed, 13 May 2026 17:28:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81bugfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/rpc/msg/send.go | 22 ++++++++++------------ internal/rpc/msg/verify.go | 10 ++++++---- protocol | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/internal/rpc/msg/send.go b/internal/rpc/msg/send.go index e96f0d935..99c4e908f 100644 --- a/internal/rpc/msg/send.go +++ b/internal/rpc/msg/send.go @@ -164,18 +164,16 @@ func (m *msgServer) sendMsgSingleChat(ctx context.Context, req *pbmsg.SendMsgReq isNotification := msgprocessor.IsNotificationByMsg(req.MsgData) log.ZInfo(ctx, "sendMsgSingleChat", "isNotification", isNotification, "msgdata", req.MsgData) - if !isNotification { - // 非通知类消息:执行发送权限校验 + 接收偏好校验(含 blacklist / MsgReceiveSetting / webhook / FriendVerify / globalOpt / convOpt) - isSend, err = m.modifyMessageByUserMessageReceiveOpt( - ctx, - req.MsgData.RecvID, - conversationutil.GenConversationIDForSingle(req.MsgData.SendID, req.MsgData.RecvID), - constant.SingleChatType, - req, - ) - if err != nil { - return nil, err - } + // 单聊一律校验接收方消息设置(含「仅好友可发」)、黑名单、会话接收偏好等;不再因通知类 Options 跳过 + isSend, err = m.modifyMessageByUserMessageReceiveOpt( + ctx, + req.MsgData.RecvID, + conversationutil.GenConversationIDForSingle(req.MsgData.SendID, req.MsgData.RecvID), + constant.SingleChatType, + req, + ) + if err != nil { + return nil, err } if !isSend { prommetrics.SingleChatMsgProcessFailedCounter.Inc() diff --git a/internal/rpc/msg/verify.go b/internal/rpc/msg/verify.go index e0028e10b..05d440e7a 100644 --- a/internal/rpc/msg/verify.go +++ b/internal/rpc/msg/verify.go @@ -226,7 +226,7 @@ func (m *msgServer) modifyMessageByUserMessageReceiveOpt(ctx context.Context, us } // 第二优先级:单聊发送权限校验(从 messageVerification 迁移) - // 仅对非通知类消息生效(调用方已通过 !isNotification 做过前置过滤) + // 单聊路径下由 sendMsgSingleChat 始终调用本函数(含通知类),以校验接收方 MsgReceiveSetting 等 if sessionType == constant.SingleChatType { // 管理员跳过发送权限拦截,直接进入接收偏好校验 if !datautil.Contain(pb.MsgData.SendID, m.config.Share.IMAdminUserID...) { @@ -255,10 +255,12 @@ func (m *msgServer) modifyMessageByUserMessageReceiveOpt(ctx context.Context, us // skipFriendVerify: MsgReceiveSetting=1 已确认好友关系,无需再做 FriendVerify 重复查询 skipFriendVerify := false switch recvUserInfo.MsgReceiveSetting { - case 2: // MsgReceiveSettingNobody + case model.MsgReceiveSettingNobody: return false, servererrs.ErrMsgReceiveNotAllowed.Wrap() - case 1: // MsgReceiveSettingFriends - isFriend, err := m.FriendLocalCache.IsFriend(ctx, pb.MsgData.RecvID, pb.MsgData.SendID) + case model.MsgReceiveSettingFriends: + // FriendLocalCache.IsFriend(possibleFriendUserID, userID) 对应「userID 的好友列表里是否有 possibleFriendUserID」 + // 此处须判断:接收方 recv 的好友列表里是否有发送方 send + isFriend, err := m.FriendLocalCache.IsFriend(ctx, pb.MsgData.SendID, pb.MsgData.RecvID) if err != nil { log.ZError(ctx, "modifyMessageByUserMessageReceiveOpt: IsFriend failed (MsgReceiveSetting)", err, "sendID", pb.MsgData.SendID, "recvID", pb.MsgData.RecvID, diff --git a/protocol b/protocol index 2e1f23fe0..eaf121f66 160000 --- a/protocol +++ b/protocol @@ -1 +1 @@ -Subproject commit 2e1f23fe06d15adcabf07ef72c1e8b08bca0f2c1 +Subproject commit eaf121f66a1529357897cf48f0a19643deb043f6