unis_crm/.workbuddy/memory/2026-09-08.md

3.7 KiB
Raw Blame History

2026-09-08 只读复检(未改代码)

  • 用户要求只检查不动代码。后端已重启(运行的是当日12:10编译的最新代码IDE加载target/classes)。
  • 复检结论9/3 报告的严重问题均未修复:
    1. X-User-Id 伪造身份仍可复现(普通用户带 X-User-Id:19 拿到管理员 profile
    2. /sys/api/admin 的 wecom-app-config(secret明文)/report-reminder-config/dashboard-analytics-config 普通用户仍可读
    3. JWT 默认密钥 change-me-please-change-me-32bytes 仍在(application.yml + application-prod.yml 第53/51行)
    4. 参数缺失仍返回 500仅补了 404 NoResourceFoundException 的 handler
    5. CORS 仍反射任意 Origin + Allow-Credentials:true
  • 新增改动9/3后工作区未提交57文件/约5.7k行ExpansionServiceImpl +566 行新增渠道↔CRM 互转(moveChannelToCrm/moveCrmToChannel结构合理有归属校验+关联迁移+事务)Opportunity OMS 反写阶段 normalizeStageValue、S5已签约同步Work 日报正文 stripCrmEditorBody前端 auth.ts/Expansion.tsx 等大改
  • 单测仍 113 个 2 失败ExpansionServiceImplTest 渠道重名校验 vs 联系人必填校验顺序与9/3相同根因测试改过仍不过
  • 前端 tsc --noEmit 通过
  • 核心读接口全 200互转/跟进等对不存在 id 错误处理正确
  • 测试账号 token 存 /tmp/crm_tokens2.env9/8新登录原9/3 token已过期/被刷新)

9/8 追加:商机名称查重功能只读复查(未改代码)

  • 用户新增"商机名称查重"请求复查。检查期间用户仍在改代码并反复编译target 14:11→14:15→14:16 更新最终磁盘版XML selectDuplicateOpportunities 去掉了 select distinct曾有一版 select distinct + order by coalesce(updated_at...) 在 PG 必报 InvalidColumnReferencepsycopg2 直连 202 库实测复现DTO 重构为 OpportunityDuplicateCheckDTO.Item 内嵌类(OpportunityDuplicateItemDTO 已删)Mapper/Service/Controller 全部配套。
  • 功能形态Controller /api/opportunities/duplicate-check(name, excludeId?, excludeStageCodes?) → Service 全表同名精确匹配(去空格+upper归档剔除excludeId/排除阶段支持) → 前端提交时才查,命中弹窗"仍然新增"可继续(软提示),编辑不查重。
  • 实证(运行实例):单值 excludeStageCodes=L 正常;excludeStageCodes 传≥2 个值(或逗号分隔) 接口 500overview 同病),前端 URLSearchParams 会逐个 append → 当前字典只有 1 个丢单阶段(L-已丢单) 所以线上不触发;字典一旦有 ≥2 个丢单/放弃阶段即致查重 500 且前端 catch 吞错放行(静默失效)。dashboard cardKeys 多值 200 排除 Spring 绑定问题 → 疑在商机 SQL/MyBatis foreach 路径,未拿到堆栈(无落盘日志)。
  • 其余发现:查重 SQL 无 userId/可见性过滤(对照列表/详情均带 visibility)→ 全库同名探测+返回他人商机明细(越权读取/泄露,中高);后端 create/update 无唯一校验、表无唯一约束,"仍然新增"按钮无 submitting 防抖,双击可并发建两条同名(2233 即在测试中被创建);编辑可改名但不查重且 excludeId 参数前端从不传(功能未闭环);查重谓词函数包裹列无索引(量级小暂可);规范化只去空格+ASCII大写全角字符/NBSP 可绕过。
  • 环境疑点:运行实例数据(id 2228/2229/2230/2231/2233 等)与 application.yml 指向的 192.168.124.202/unis_crm_dev 不一致(该库实为 2228/2229/2232) → IDE 运行配置数据源被覆盖(profile/env)测试库≠配置文件库发版前需核对。psycopg2-binary 已装入 ~/.workbuddy/binaries/python/envs/default202 库 postgres/unis@123 只读排查用)