package echomeet import ( "yunyan/comm" "yunyan/pb" ) /* 按 id 操作会议记录的接口,统一在这里取会话 uid 并做归属校验。 在此之前 getrecord / getrecords / modifyrecords / delrecords / readrecord / summary / starttask / uprecord 八个接口**全部只按 id 查库**,没有一处比对 record.Uid 与会话 uid(starttask 用了 GetUserId(),但只拿去扣算力和查 VIP)。 后果是任何登录用户改一个 id 就能读别人纪要全文、删改别人的记录、 给别人的记录发起总结(扣自己的算力,但覆盖对方 summary 并触发对方的拾忆抽取)。 写法照 memory 模块(每个接口 requireUID + rec.Uid != uid)。 回调接口 BackCall / AliBackCall 是第三方来的、没有 session,不在此列。 */ // requireUID 取会话 uid。所有按 id 操作记录的接口第一步。 func requireUID(session comm.IUserSession) (string, *pb.ErrorData) { uid := session.GetUserId() if uid == "" { return "", &pb.ErrorData{Code: pb.ErrorCode_NoLogin, Message: pb.ErrorCode_NoLogin.String()} } return uid, nil } // recordErr 把 model 层的查询错误转成对外错误。 // // ⚠️ 「不存在」与「不是你的」回同一个错误码同一句话:分开回等于给出一个 // 探测他人记录 id 的接口。DBError 也正是改动前记录真的不存在时客户端拿到的码, // 这样合法用户看到的行为没有任何变化。 func recordErr(err error) *pb.ErrorData { if err == ErrRecordNotFound { return &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: ErrRecordNotFound.Error()} } return &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()} }