XIUNOX 更新记录贴 202600718

管理
  • [边界未校验] 修复 admin_thread_build_cond 未校验 uid 空字符串,导致 user_read_by_username('') 匹配到 username 为空的脏数据用户(uid=3)

  • [逻辑错误] 重构用户删除策略为方案 C(匿名化):user_delete 改匿名化保留帖子,新增 user_purge 承接物理删除,user_format 处理「已注销用户」显示,删除弹窗提供两个选项

  • [JS符号漏迁] 补齐 XNNodeList.prototype.filter 方法(支持函数/选择器/元素/NodeList),修复 user_list.htm 批量删除/封禁/解禁报 find(...).filter is not a function

  • [逻辑错误] 修复 xnx_feeds hook user_create_post_end.php 顶层 return 违规:编译到 route/user.php 顶层跳过注册后的 message() 提示和跳转

  • [逻辑错误] 修复 xnx_hidden hook post_create_htmx_reply_end.php 顶层 return 违规(4 处):跳过 hook 后的 exit 导致 htmx 响应被默认输出污染

  • [组件混用] 移除 xnx_hidden 快速回复后刷新隐藏内容块的 hook(post_create_htmx_reply_end.php),回复后用户可手动刷新查看

  • [逻辑错误] 修复帖子列表空提示判定:toplist 与 threadlist 是独立区域,空提示只看 threadlist 是否为空(前台+后台 thread_list.inc.htm)

  • [逻辑错误] 修复高级回复页右侧显示隐藏内容模块:4 个 hook 共用 post.htm 未区分发帖/回复场景,加 if ($route == "thread" && $action == "create") 判断

  • [逻辑错误] 修复 xnx_moments_theme hook 在 threadlist 空列表时 return 终止整个 thread_list.inc.htm 渲染导致空提示被跳过(改 if 包裹)

  • [语言包不同步] 个人主页 4 个 tab 空状态文案区分:主题/回复/点赞/收藏(新增 no_my_thread/no_my_post/no_my_like/no_my_favorite 键,三语言包同步)

  • [样式不同步] 用户主页(user 路由)6 个 tab 空状态统一为 py-12 + 大图标 + 文案风格(与 my_thread.htm 一致)

  • [JS符号漏迁] 修复 xiuno-modern.js 的 html() 方法不支持节点/NodeList/XNNodeList 入参,导致 admin/thread_list.htm 分页区显示 [object Object](仿 jQuery 语义,字符串走 innerHTML,其他走 empty()+append())

  • [审计加固] 全量扫描 .html()/.text()/.wrap()/.replaceWith()/XN.html() 等 jQuery shim 方法的非字符串入参调用点(结论:仅 thread_list.htm:239 一处,已修复)

  • [语言包不同步] 修复后台附件日志页面(log-attach.htm)操作列直接显示原始 key 未翻译(log.php 未准备 $action_labels 变量)

  • [语言包不同步] 修复后台操作日志页面(log-operation.htm)user_anonymize/user_purge 操作显示原始 key($action_options 缺定义+三语言包缺键)

  • [信息泄露] 精简附件日志详情列:去掉硬编码中文描述只保留文件名(attach.php/attach.func.php 三处日志)

  • [逻辑错误] 修复管理员编辑用户积分输入纯数字/英文理由时积分日志显示 lang[credits_event_xx] 字面量(CreditsService::add/sub 增 $reasonIsRaw 参数+raw: 前缀+credits_event_name fallback 判断修正)

  • [伪静态路径] 修复顶部导航/侧边导航/发现页直接 echo url 字段未走 url() 转换导致点击跳转到 user-login.htm?rank.htm 等错误 URL(NavService 新增 href()+normalize(),7 处 href 改用)

  • [信息泄露/数据覆盖] 修复 admin/?user-update-XX.htm 浏览器自动填充导致用户信息被覆盖(form 加 autocomplete=off + password 字段改原生 input 加 autocomplete=new-password)

  • [信息泄露] 优化插件上传报错:细分 4 种 conf.json 解析失败原因(多顶层目录/缺失/BOM/空结构),自动忽略 macOS __MACOSX 干扰目录

  • [逻辑错误] 修复待审回帖 pid 丢失:xnx_feeds 和 xnx_hidden 的 model_post_create_end.php hook 中 return 直接终止 post_create() 函数导致 route/post.php 收到 pid=NULL

  • [逻辑错误] 全量扫描修复所有 hook 文件中的 return 违规(xnx_feeds 6 个+xnx_maintenance 5 个 return+1 个 exit,含 runlevel 拦截失效严重 bug;保留 4 个终止性 exit 加 ponytail 注释)

  • [文档优化] 删除 install.md 第 8.4 节「跨版本迁移注意事项」(4.0.4 旧版升级手工指南),替换为简短官方协助流程说明

  • [逻辑错误] xnx_hidden 指定用户可见逻辑修复:实现 user-search API + UI 搜索下拉,params 存 UID 列表(不再存用户名),后端按 UID 匹配优先+username 兜底兼容旧数据

  • [状态不同步] xnx_hidden 解锁后状态同步:API 返回 unlocked_users_html + balance + credit_type,前端购买成功后刷新已解锁用户头像列表+侧边栏金币余额

  • [逻辑错误] xnx_hidden 已解锁提示优化:文案改为「已解锁,无需重复解锁」,toast 类型从 danger 改为 info(后端 code=2 区分已解锁与真正失败)

  • [变量未定义] xnx_hidden 清理 5 个 hook 文件违规 return(model_post_format_end/model_thread_format_end/model_post_update_end/model_thread_create_end/model_thread_find_preload)

  • [配置不同步] 递增 conf.php static_version ?1.0.7 -> ?1.0.8,强制浏览器刷新 hidden.js 缓存

  • [逻辑错误] 修复 xnx_feeds 抽奖中奖动态通知文案「用户兑换了 」后跟空字符串(hook 用 prize["name"] 但 credits/medal 类型无 name 字段,改用 LotteryService::formatPrizeName)

  • [UI 优化] 抽奖卡片参与人头像列表从叠加(margin-left:-8px)改为水平 gap-1 间隔(头像 24px→22px,+N 改 badge 样式)

  • [逻辑错误] 摇骰子插件金额展示优化:结果区从中奖显示总奖金改为并列「净赢 +N」「总奖金 N」,消除与历史记录净盈亏不一致的误解;历史记录格式 2-5-4=11 改为 2+5+4=11

  • [逻辑错误] 修复帖子抽奖中奖人数 >5 时 carousel 中奖名单完全空白(ltidxwinner.id从1开始永远不等于0,改用独立计数器_lt_carousel_idx)

  • [状态不同步] 修复侧边栏抽奖后右侧栏用户卡片金币余额不更新(hx-preserve 不重渲染,路由层带 data-new-golds,lottery.js 新增 refreshSidebarCredits 更新两种结构)

  • [配置不同步] conf.php static_version ?1.0.8 → ?1.0.9 强制浏览器加载新版 lottery.js

  • [功能优化] 验证码有效期从 5 分钟延长至 10 分钟,新增「已过期,点击刷新」浮层提示(CaptchaService CAPTCHA_EXPIRE 300→600,5 场景接入)

  • [新功能] xnx_avatar_ai 后台积分设置页(Task 6):新增 setting.php + view/htm/setting.htm,6 项配置,POST 走 PRG

  • [逻辑错误] 修复插件升级上传报"文件移动失败":升级流程中 plugin_disable() 在 rmove_dir() 之前调用,其内部 plugin_clear_tmp_dir() 清空 tmp/ 把刚解压的 $srcDir 一起删掉(调整顺序为 rename→rmove_dir→清理→plugin_disable)

  • [新功能] xnx_avatar_ai AI 头像生成插件 v1.0.0:用户花积分调用 AI 生成专属头像(核心扩展 AIService callImage 系列方法+插件完整结构+7 项配置+5 预设+GD 缩放转 jpg+复用 route/my.php 头像存储)

  • [逻辑错误] 修复 xnx_appcenter 后台设置页「添加标签」按钮无响应(setting.js 遗漏标签库管理的镜像逻辑,与 07-17 JS 漏迁同类)

  • [功能优化] 帖子详情页新增"已解锁用户走马灯"展示(xnx_hidden + xnx_attach_access 共用样式,纯 CSS @keyframes 横向滚动+hover 暂停+暗黑模式兼容)

  • [新功能] 新增 CLI 脚本 import_plugins_to_appcenter.php:一键导入 plugin/ 目录下所有插件到应用中心

  • [新功能] xnx_private_reply 后台设置页(Task 13-14):新增 setting.php + view/htm/setting.htm,5 项配置(enabled/admin_bypass/default_on/show_list_badge/allow_groups)

  • [新功能] xnx_private_reply 楼主可见插件 v1.0:发帖时开启"回复仅楼主可见",开启后只有楼主、回复作者本人、管理员/版主能看到回复(新建表+13 个 hook+Service 类 11 方法+缓存)

  • [新功能] xnx_appcenter v1.6.0 升级 Task 1(基础配置):新增 thread_tid 字段 + forum_fid 配置键,为「审核通过后自动发帖」铺底(upgrade.php 幂等迁移+install.php 同步)

  • [新功能] xnx_appcenter v1.6.0 升级 Task 5(插件包扫描后端接口):新增 scan action 返回 JSON + publish POST 校验 scan_passed 阻断 fatal

  • [新功能] xnx_appcenter v1.6.0 升级 Task 3(自动发帖逻辑):AppCenterService 新增 createForumThread 方法,updateAppStatus 审核通过时触发(含 [hidden] 标签解析+try/catch 不阻塞审核)

  • [新功能] xnx_appcenter v1.6.0 Task 2: 后台设置新增「发布版块 fid」配置项(setting.php + setting.htm)

  • [组件混用] xnx_appcenter v1.6.0 前端扫描交互:发布页接入 appcenter-scan 接口(原生 fetch,扫描结果卡片 fatal 禁用提交/warning/通过绿色徽章)

  • [逻辑错误] 修复 xnx_avatar_ai/hook/header_nav_admin_page_before.htm 第 8 行 } 后未闭合 ?> 导致下一个 hook 开头 <?php 嵌套触发 ParseError(影响所有前台页面)

  • [UI 调整] xnx_private_reply 发帖页"楼主可见"开关从主题标题下方移到右侧栏(post_subject_after.htm → post_ref_thread_after.htm,卡片样式与"引用帖子"一致)

  • [UI 优化] xnx_attach_access 发帖页附件权限卡片样式与"引用帖子"卡片统一(card x-card → x-card card,header 用 h6 fw-semibold)

  • [Skill 规则] xiunox-plugin-dev SKILL.md 新增"发帖页新增功能放右侧栏"硬规则(必须挂 post_ref_thread_after.htm,禁止 post_subject_after.htm/post_message_after.htm)

  • [样式不一致] 调整置顶区 thread_top_list.inc.htm 的 badge 顺序与普通帖子列表一致(仅 top/digest 放标题前,audit/image/video/attachment/closed 放标题后)

  • [逻辑错误] 修复扫描器 splitContentByLanguage 的多 <script> 块替换 offset 错位 bug(改按 offset 降序从后往前替换)

  • [XSS风险] 扩展扫描器 suppress 机制,支持 raw_htmlspecialchars 的 @suppress 注释(文件级抑制+特殊检测分支加 suppress 区间检查)

  • [XSS风险] 给 Parsedown.php 顶部加 // @suppress raw_htmlspecialchars 白名单注释(第三方库精细 flags 控制)

  • [XSS风险] 修复 xnx_duel/static/js/duel.js:82 未转义的 submittingText(改 innerHTML 设置 spinner + appendChild(textNode) 自动转义)

  • [XSS风险] 给 6 处已审计的 innerHTML 加 // 保留 innerHTML 注释抑制误报(xnx_appcenter/xnx_fields/xnx_moments_theme 共 11 处)

  • [配置不同步] 递增 conf/conf.php 的 static_version ?1.1.3 → ?1.1.4 强制浏览器刷新 JS 缓存

  • 验证: 全量扫描 34 个插件,fatal=0 warning=0 total=0,所有告警清零

  • [新功能] 后台显示设置增加「发帖页版块过滤」(admin/?setting-display.htm):新增 conf.post_forum_ids 白名单(空=全部,管理员组豁免)+ forum_list_post_filter() 函数+级联隐藏空分区

  • [逻辑错误] 修复 xnx_ai_reply @ 触发不工作:v1.0.0 用 stripos 匹配关键词但 AIEditor 生成 HTML mention 格式匹配不上(新增 checkMentionTrigger 解析 data-id/href UID+回复机器人+关键词三种场景+hasNewAction 检测新动作,conf.json 1.0.0→1.0.1)

  • [xnx_avatar_ai] 修复后台设置保存失败:setting_set 对 bbs_kv 表 REPLACE 返回 last_insert_id 恒为 0,saveSettings 用 (bool)$ok 误判失败(改 !== false 判断)

  • [xnx_avatar_ai] 修复积分类型名称显示原始 value(credits/golds/rmbs)而非后台自定义名称

  • [根因类型] setting_set 返回值误用 (bool) 判断(kv 表 REPLACE 返回 last_insert_id=0)

  • [调试增强] xnx_avatar_ai 所有 provider 均调用失败时聚合每个 provider 的具体错误到 message

  • [功能精简] 移除 xnx_avatar_ai 主体自定义描述(subject=custom)功能(Service/route/view/js/语言包全链路删除)

  • [缓存清理] 清理 tmp 编译缓存(model.inc.php/lang_zh-cn_bbs.php/plugin_xnx_avatar_ai_*)

  • [调试增强] callImageByConfig 失败时打印完整响应头和请求 URL 便于排查 Cloudflare 403(CURLOPT_HEADERFUNCTION 收集关键头)

  • [配置不同步] 修复 AIService curl 请求缺少 User-Agent 导致 Cloudflare Bot Protection 403 拦截(修正 Agnes API base64 返回参数 extra_body.response_format → return_base64)

  • [逻辑错误] 修复 Agnes API 400 UnsupportedParamsError:移除顶层 response_format 参数,仅用 return_base64 控制 base64 返回

  • [HTMX事件冲突] 修复 xnx_avatar_ai 设为头像 toast 不显示:hx-swap="none" 时 htmx 不执行响应

  • [逻辑错误] 生成头像过程加全屏遮罩 + "正在生成中..." 提示

  • [逻辑错误] 重构 AIService::callImageByConfig:新增 api_style 自动探测机制 + registerImageAdapter 插件扩展点(内置 openai+agnes 两种 adapter)

  • [配置不同步] ai-providers.htm 新增「API URL 写法说明」可折叠卡片,列出 5 个主流 provider 的 URL 写法(三语言包同步)

  • [逻辑错误] 修复 AIService URL 拼接:用户填完整路径时重复拼接导致 404(新增 buildEndpointUrl() 统一处理,三处调用替换)

  • [配置不同步] ai-providers.htm 说明卡片:Azure OpenAI 替换为 DeepSeek(https://api.deepseek.com/v1

  • [新功能] 新增 xnx_related 相关帖子插件(thread 详情页正文底部+右侧栏展示+后台设置)

  • [文档优化] 更新 xiunox-plugin-dev skill 的 hooks-catalog.md,补充 thread 详情页 hook 点

  • [变量未定义] 修复 more 页面报 Class "NavService" not found(route/more.php 未在路由层加载,_include 不比较 mtime 旧 tmp 缓存跳过兜底加载,顶部显式 include)

最新回复
  • Laity 内测用户2级用户连续签到7天 Lv2
    我的帖子还不审核
    7小时前

请先登录后再回复 登录