ypsdf1
|
e12a972ad7
|
第十六批:玩家端封禁公示卡片+AGPL合规页脚与开源地址.txt+封禁synced_at保序
|
2026-10-14 18:08:43 +08:00 |
|
ypsdf1
|
489b83f29d
|
land_api输出缓冲加固防HTML污染;admin前端apiCall容错HTML响应
|
2026-10-12 00:23:11 +08:00 |
|
ypsdf1
|
8a669b1e24
|
用户组新增二手交易上架数量限制与保底价格字段
- land_api.php 六处 web_user_groups 建表加 shop_max_listings/shop_min_price 列
- 三处 migrations 加 ALTER,handleUpdateUserGroup INSERT/bind 带两字段
- sync.php 建表/迁移/INSERT 同步两字段(配合Java推送)
- admin.php 用户组新建/编辑表单与提交、列表详情显示两字段(-1=跟随全局)
|
2026-10-11 21:24:25 +08:00 |
|
ypsdf1
|
fcc8f08ef7
|
push_shop_stock 返回回执单:回显 push_id/内容指纹fp/条数,供 Java 核验 PHP 确实收到
|
2026-10-11 10:37:26 +08:00 |
|
ypsdf1
|
ed55de014b
|
修复护栏体检方法名错误:SdfMySqlResult只有fetchArray没有fetch_assoc,MySQL模式下体检必抛异常被fail-open吞掉导致护栏静默失效
|
2026-10-10 22:35:26 +08:00 |
|
ypsdf1
|
b0e572d7ac
|
库存双向同步(分叉以Java为主):新增push_shop_stock接收插件本地库存改动,web购买补写last_modified支撑竞态护栏;数据安全护栏(盘上状态文件三态判定:清空自愈补推/指错库拒绝握手/登录页告警横幅)与MySQL表结构快照入库
|
2026-10-10 21:52:59 +08:00 |
|
ypsdf1
|
a758bde564
|
修复 dbSplit 切分三连环缺陷:索引名禁库前缀、并发文件锁、孤儿库自动重切
- 索引正则改为只给索引名加 jd. 前缀(SQLite 的 CREATE INDEX 不接受 ON jd.tbl,
旧写法 12 个索引全部 near ".": syntax error)
- 用 flock(LOCK_EX|LOCK_NB) 替代 static $done/$running,多 FPM worker 不再互删 Java.db.new
- 完成标记 Java.db.splitdone:只有表数校验通过 + rename 成功才写;
存在但无标记的孤儿库自动备份为 .orphan.<ts> 后重切
- 切分不完整(有 err 或表数不足)时作废 .new,绝不产出缺表的 Java.db
- 新增 SDF_SPLIT_FALLBACK_WEB:切分未完成期间 java 侧共用 web.db,
避免 dbOpen 提前建出空 Java.db 导致存量数据不可见
- MySQL 模式直接跳过 SQLite 切分(否则 11MB web.db 白切 18 秒)
|
2026-10-10 14:50:06 +08:00 |
|
ypsdf1
|
4bdefdab8c
|
修复 MySQL 方言层三处缺陷(test12 #1064/#1170/#1071)
1. sqlMySqlQuoteKeyCol 正则漏排 duplicate:section 4 已把 ON CONFLICT(key)
DO UPDATE 翻成 ON DUPLICATE KEY UPDATE,这里又把其中 KEY 反引号 →
ON DUPLICATE `key` UPDATE → #1064(线上 6 条,sync_config 写 web_area_config 必炸)
2. sqlMySqlRenderValue 的 FLOAT 分支 rtrim 吃掉有效数位:%.17G 对整数值
不产生小数点,0.0→"0"、10.0→"10"、100.0→"100",rtrim('0') 会吃成
""/1/1 → 空槽位 #1064(线上 15 条,syncLands 的 warp 坐标行),
且 10.0→1 属静默篡改坐标,比报错更危险。改为仅在有小数点且非指数时去尾零。
3. sqlMySqlColumnPart 用 ^KEY\b 一票判定表级约束:web_area_config 的
`key TEXT PRIMARY KEY` 以 key 开头被误判 → 整列跳过 TEXT→VARCHAR 转换
→ #1170(线上 137 条,建表失败连带 #1146)。改为 KEY/INDEX 须后接 (列清单) 才算表级。
4. applyIndexPrefix 只给 TEXT/BLOB 加索引前缀,但 SQLite 的 TEXT DEFAULT ''
在 MySQL 侧翻成 VARCHAR(500),utf8mb4 下 web_item_sn(owner,item_type)
两列 4000 字节 > InnoDB 3072 上限 → #1071(线上 9459 条,联合索引始终
建不出来,查询退化全表扫描)。改为按 information_schema 的字符集×实际长度
估算索引字节预算:装得下保留全列索引,装不下或撞 TEXT 族才均分加前缀。
验证:_verify_1064_fix.php 27/27、_verify_init_tables.php 本地全量 initTables
零错误、_test_mysql.php 63/63;已部署 test12。
|
2026-10-10 12:45:37 +08:00 |
|
ypsdf1
|
4be4f1f107
|
修复第四关「未知操作」:稍后再配按钮改原生提交,form.submit() 不带 act 导致落 default
|
2026-10-10 11:05:28 +08:00 |
|
ypsdf1
|
2cb48de453
|
安装锁改为文件+数据库双份:库内 _install_lock 四态门禁
- 文件锁在+库在 → 404;文件锁在+库明确丢失 → 数据丢失警告页(可确认重装)
- 文件锁没了+库内锁在 → 自动补写 install.lock 再 404;两者皆无 → 全新首跑
- 探测失败(MySQL 连不上/配置读不出)一律按「库在」从严
- n4 落盘时同步写库内 _install_lock;老站迁移幂等补写
- 扫库/清库 SQL 排除 _install_lock 标记表,避免误判非空
|
2026-10-10 00:16:18 +08:00 |
|
ypsdf1
|
6f13740cce
|
修复 MySQL 扫库 Unknown column:information_schema 库名补单引号
real_escape_string 只转义不加引号,裸拼 WHERE TABLE_SCHEMA = 库名会被 MySQL 当列名。
|
2026-10-09 23:16:14 +08:00 |
|
ypsdf1
|
1e60d31ffd
|
重构安装页为四步向导:扩展检测/数据库刹车/SMTP强校验/安全配置
- 第一关扩展检测:sqlite3/mysqli 缺失时第二关锁死对应模式(前端 disabled + instValidate 兜底)
- 第二关数据库:mysql 地址端口预填 127.0.0.1/3306;扫库非空立即刹车,列清单后手输「确认清空」二次确认,取消则退回重填
- 第三关 SMTP:四项要么全空要么全不空,全不空必须发送验证码且比对通过才放行
- 第四关安全配置:IP 白名单必填(可自动填充当前 IP),验证码留空即关闭,2FA 跳转 admin_2fa_setup.php
- 统一写盘:最后一关才落 config.php/sql.md/captcha_keys.php,写完生成 install.lock 并自删
|
2026-10-09 21:36:53 +08:00 |
|
ypsdf1
|
0b63a99719
|
install页去掉IP白名单门禁并修null告警, 新增0.0.0.0应急逃生通道
- install.php: sqlMdDbConfig 全新站 java/web 槽为 null, $val 闭包加 is_array 兜底,
消除每个输入框的 array offset on null 告警; 门禁只留令牌层(全新站无白名单可言);
安装成功页改为回显本次写入的完整配置供截图手抄, 背景自删
- admin_2fa_setup.php: 引导页白名单框上方显示当前访问IP; 应急模式免密进 boot 模式
并挂红徽标; secInstallPending 让位改为 !secIsEmergency(), 避免与全局应急路由
形成 install/引导页互跳死循环
- security.php: 新增 secIsEmergency() 判定白名单含 0.0.0.0; secIpAllowed 放行该条目;
新增 secEmergencyGate() 在限流层前把非引导页/非本机请求 302 锁回引导页(用302防浏览器缓存)
- config.php: 补 0.0.0.0 应急用法与用完必删的说明注释
|
2026-10-09 19:56:34 +08:00 |
|
ypsdf1
|
fc8c82b188
|
修复全新部署首跑顺序:装库先于2FA引导;install表单补令牌透传
- security.php 新增 secInstallPending():install.php 在场且无 install.lock = 装库未完成
- 引导模式下所有入口先 302 到 install.php,装完自删后才轮到 admin_2fa_setup.php
- admin_login/admin_2fa_setup 兜住本机直连与已引导未装库两种入口(secTokenUrl 带令牌)
- install.php 表单隐藏 token 字段,已引导站点 POST 也能过第三层门禁
|
2026-10-09 18:56:46 +08:00 |
|
ypsdf1
|
e1010927e5
|
PHP MySQL 适配层与双库切分收尾, 新增自毁式 install.php 配置安装页
- core.php: sqlDialectMySql 方言翻译 + SdfMySqlDb/Stmt/Result 复刻 SQLite3 API, SdfDbRouter 路由与侧别过滤器, 软依赖兜底; 修复 dbExtractTables 把 CREATE INDEX 索引名当表名导致 web 库 0 张表的真 bug
- security.php: sqlMdDbConfig/sqlDbDir/sqlDbFile 双库配置函数, web.db 给 PHP / Java.db 给 Java
- api/minecraft_auth.php, api/poller_online.php: Java 专属表改走 sqlDbFile('java')
- install.php: 自毁式数据库配置页, 只依赖 security.php, 哨兵块替换 + 备份原子写回读校验 + install.lock + unlink 自删, 门禁 404
- .gitignore: 屏蔽 .workbuddy/ 工作目录
- 测试: db 回归 26/26, MySQL 63/63, schema 对拍 11/11, install 端到端 32/32 全绿
|
2026-10-09 18:16:56 +08:00 |
|
ypsdf1
|
8a6755e725
|
新功能的预热
|
2026-10-09 17:11:20 +08:00 |
|
ypsdf1
|
ebcdeb6f09
|
添加 AGPL-3.0 开源协议:LICENSE 为 gnu.org 官方原文,readme 补充协议说明与网络服务开源义务
|
2026-10-09 11:30:55 +08:00 |
|
ypsdf1
|
d76ad12119
|
正版验证密钥契约统一:minecraft_auth.php 改用 config.php 的 SECRET_KEY,与 sync.php 一致(修 test12 占位符与 MC_AUTH_SECRET 分叉导致的403密钥错误)
|
2026-10-08 23:29:07 +08:00 |
|
ypsdf1
|
1188da01a9
|
修补单慢根因: queryOrder两条检测路径全失效——getPlatformDB未先加载pay_secrets致平台库Access denied; getPayKeys()未定义致query_order全500。补加载secrets+改用loadPayKeys+API查询包try/catch
|
2026-10-08 11:04:53 +08:00 |
|
ypsdf1
|
c1009088ce
|
补单器修正误用的getResult: execute()直接返回SQLite3Result(7.4/8.2/8.5实测), 接住返回值直接fetchArray
|
2026-10-08 10:04:37 +08:00 |
|
ypsdf1
|
7dc7d01cd0
|
补单/查询移除前缀归属门槛:本地已有完整订单号即认本端,平台按完整订单号精确匹配
|
2026-10-08 01:15:07 +08:00 |
|
ypsdf1
|
7932bd176c
|
修复补单器SQLite3Stmt::fetchArray致命错误: prepare().execute()在PHP7返回Stmt需getResult()再fetchArray, 修复后平台已付订单正常补单
|
2026-10-08 00:57:04 +08:00 |
|
ypsdf1
|
ba5352121e
|
订单号固定格式改递增序列(00000000→CYZJ00000001起);补单器改定向补单:查本地活跃完整订单号精确匹配平台,不再按前缀批量扫
|
2026-10-07 23:54:42 +08:00 |
|
ypsdf1
|
629c16ec84
|
修复payComposeOrderNo三段式实现:玩家名段由payGuardLen统一拼装裁剪,清除占位残留变量
|
2026-10-07 21:22:40 +08:00 |
|
ypsdf1
|
aadb3373e8
|
充值订单号改读pay.md配置区:固定格式(纯数字0随机/非纯数字6位递增保底)与组合规则双分支,前缀pay.md优先+历史前缀双兼容保补单,删CALLBACK_PORT/GAME_SERVER_HOST死配置
|
2026-10-07 21:03:35 +08:00 |
|
ypsdf1
|
eb01cb9ea8
|
新功能的预热
|
2026-10-07 20:46:35 +08:00 |
|
ypsdf1
|
e20d648b08
|
领地对账接入:alignmentCatConfig新增lands配置,与Java端72列指纹逐字对齐,多退少补
|
2026-10-07 17:37:50 +08:00 |
|
ypsdf1
|
e76b38cd7d
|
对账退侧修复:bans已过期封禁不再计入extra,消除每轮收回1条永不收敛
|
2026-10-07 16:21:40 +08:00 |
|
ypsdf1
|
59cca9e04a
|
修复syncPlayerIps变更比对bug:old_ip误比导致PHP端IP永不更新、对账changed恒大于0
|
2026-10-07 11:46:33 +08:00 |
|
ypsdf1
|
dbb4843db6
|
对账退侧:清理 player_ip_changes 中两边 users 都不存在的孤儿IP行
- 新增 prune_orphans 开关(仅 ips 类别开启):check_alignment 算出 extra 后,
把「Java 没有 且 PHP users 表也没有」的行直接删除,让两边对账真正收敛到 0。
- 三重保险:只清 extra、只清 PHP users 里也不存在的玩家、Java 上报 0 条时绝不动表。
- 背景:线上实测 203 条历史残留(玩家已删、IP 行还在),Java 侧无处可收,
导致每轮对账空转「收回203 / 实际写入本地0条」,两边永远差 203 条。
|
2026-10-07 11:17:09 +08:00 |
|
ypsdf1
|
6a6cb9ec3c
|
订单前缀配置化+新订单号格式,补单脚本同读前缀;新增online_heartbeat心跳与sync_webtx_receipts回执补推端点
|
2026-10-06 18:18:22 +08:00 |
|
ypsdf1
|
bd47d25165
|
修复领地同步500:老库web_area_lands缺y_min/y_max/synced_at三列,ALTER迁移补列
|
2026-10-06 00:04:40 +08:00 |
|
ypsdf1
|
a5871f6761
|
对账配套:credentials字段映射与online类别、admins去整表删除、canon null整数列归一
|
2026-10-05 22:29:51 +08:00 |
|
ypsdf1
|
6cc8dbf582
|
交易对账改双向:check_tx_alignment 返回 extra_ids(PHP有Java无的),新增 pull_tx 交还完整流水;关键接口 set_time_limit 13秒内必答复、busy_timeout 收紧到6秒
|
2026-10-05 17:46:34 +08:00 |
|
ypsdf1
|
d2f42bef62
|
补单/轮询日志收敛:只有报错或真正补到单/有数据才写debug.log,无合适数据静默返回
- poller_online.php:去掉每次轮询必写的「补单开始/正在连接MySQL/MySQL DSN/连接成功」4 行;「补单完成」改为 processed>0 才写;连接失败、补单处理、交易写入等成功/报错日志保留
- sync.php:checkWebLoginConfirmations、checkPendingWebLogins 的 count=0 轮询日志改为有数据才写(每 4 秒一次是膨胀主因);check_web_login_verified 去掉「插件查询/未找到/无验证记录」三条无数据日志;三处 catch 补 debugLog 让报错进 debug.log
|
2026-10-05 14:40:31 +08:00 |
|
ypsdf1
|
1bd51cbcdf
|
log_maintain 加 4.5MB 水位线:避免清理后贴着 5MB 上限导致每次写入都全量重建
|
2026-10-05 13:41:17 +08:00 |
|
ypsdf1
|
ce489d1450
|
debug.log 保留策略:只留最近3天+≤5MB,任一超标即清理到两条件同时满足
|
2026-10-05 13:35:39 +08:00 |
|
ypsdf1
|
e040e8c994
|
boot恢复模式不再404死胡同:持boot凭据的请求一律302回引导配置页
- security.php 新增 secBootRecoveryRedirect():secGatePage 遇到「不在 IP 白名单但持有效 boot 凭据」的请求,改 302 送回 admin_2fa_setup.php(唯一豁免页),不再返回 nginx 404;secBootAuthenticate 增加凭据预判(无 boot 参数、无会话 cookie、无活动会话则直接判失败),避免路由覆盖面变大后给每个探测请求都 session_start() 刷 session 文件。
- admin.php 令牌层改 secTokenGate(true):admin.php?boot=<引导令牌> 才能进入恢复路由(原先在令牌层就 404);页面对非白名单 IP 依旧不渲染。
- admin_2fa.php 持 boot 但不在白名单 → 直接送回配置页,不再掉进 admin_login.php / admin.php?token= 的 404 弹簧。
- admin_2fa_setup.php:boot 模式隐藏「← 返回」、顶部加恢复指引横幅、后台唯一入口下加 404 警告;新增 修正「刚保存白名单但 ADMIN_IP_WHITELIST 常量本请求内未刷新」导致横幅误报。
- 背景(db/security.log 实录):2026-10-05 09:35:58 boot_unlock 成功,09:35:59 即被 admin.php ip_block,09:42 只能靠宝塔手工改 config.php 脱困。
|
2026-10-05 10:56:35 +08:00 |
|
ypsdf1
|
99da971fbf
|
新增 check_tx_alignment 交易对账接口:返回PHP流水笔数/最大序列号,及指定序列号中缺失的部分,供Java只补中断批次
|
2026-10-04 23:52:35 +08:00 |
|
ypsdf1
|
f7aedc6fae
|
Web 端同步 bad_effects 负面效果字段
- land_api.php / sync.php:建表迁移、INSERT、bindValue 补 bad_effects
- convertEffectsForFrontend 增加负面效果的管道格式 → JSON 数组转换
- 字段白名单加 bad_effects,上限校验改为增益+负面合计口径
- player.php:负面效果独立 UI 区块,addGiveEffect 抽成通用 landEffectAdd,
新增 addBadEffect(效果档位与 Java 端同口径)
|
2026-10-04 22:57:37 +08:00 |
|
youpaishidifu
|
398a9db380
|
新增robots.json模板和关联文件(已脱敏)
|
2026-10-04 22:06:42 +08:00 |
|
ypsdf1
|
c880f1eb9e
|
修正药效生存上限表:村庄英雄5级、挖掘疲劳3级、伤害吸收4级、不祥类5级
|
2026-10-04 20:32:44 +08:00 |
|
ypsdf1
|
386c9d861e
|
药效等级上限改按各效果的生存可获取上限,同步 Java 端 b64e7e3
用户纠正口径:原版最大上限 = 生存模式正常探索/合成/建造能拿到的最大值,
不是 /effect 的作弊上限(amplifier 255 = 强度 256)。
· 抗性提升 信标最高 2 级
· 海豚的恩惠 只有潮涌能量块一个来源 → 最高 1 级
改动:
- api/land_api.php 新增 getSurvivalMaxLevel():39 个效果逐项查表
(可升 II 的 11 个 + 单一来源恒 1 的 + 生存无来源的 + 未知兜底 1),
与 Java 端 AreaProtection.getSurvivalMaxLevel() 134 个 case 标签
逐项对账一致
- 新增 getEffectLevelCap():min(生存上限, 用户组 max_effect_level)
两层同时生效;用户组配 256 也突破不了生存硬顶
- handleUpdateLandField 写入 give_effects 时改为逐个效果封顶,
此前是统一按 256 放行,等于没封
- getLandMaxEffectLevel 注释澄清它只是「用户组软顶」,真正封顶看 getEffectLevelCap
- admin.php 两处说明文案改为生存可获取上限口径,举例抗性提升 2 级、
海豚的恩惠 1 级
|
2026-10-04 19:57:23 +08:00 |
|
ypsdf1
|
4160c60aa6
|
新增用户组药效等级上限配置,与Java端双向打通
配合 Java 端 6f92028(原版药效强度上限 256)。原版 /effect 的
amplifier 硬上限是 255,即药效强度 1~256,此前 Web 侧封顶写死
255 且各建表点口径不一,本次统一为 max_effect_level 配置项。
改动:
- web_user_groups 增加 max_effect_level 列(默认 256)
· sync.php / land_api.php / core.php 全部 8 处建表块补列
· 3 处迁移表补 ALTER 条目,老库自动升级
- api/sync.php syncUserGroups:Java 推送时接收并写入 max_effect_level,
<=0 或超过 256 一律归一到 256(原版硬上限不可突破)
- api/land_api.php 新增 getLandMaxEffectLevel():按领地所有者所属
最高优先级用户组取上限,无组则 256;handleUpdateLandField 写入
give_effects 时改用该上限 clamp(原先硬编码 255)
- api/land_api.php update_user_group 读写补该字段
- admin.php 用户组新建/编辑弹窗补「药效等级上限」输入框
(1~256,默认 256),并附原版范围说明;两处提交参数同步带上
规则:普通玩家(未加入任何用户组)固定按 256 封顶,严禁超限;
加入用户组后按组配置封顶,填 256 即不额外限制。
|
2026-10-04 19:26:05 +08:00 |
|
ypsdf1
|
419b677aa9
|
修复工单上传图片误判+用户组max_effects配置同步
|
2026-10-04 14:48:43 +08:00 |
|
ypsdf1
|
fe1ed613ba
|
工单管理支持上传图片(兰空图床转存)
- 新增 lsky.php:兰空图床 API 客户端,token 缓存+提前60秒续签+401自动重签重试
- 新增 lsky_keys.php:图床凭据模板(仓库仅占位符,真值只在服务器,永不上传)
- api/ticket.php:新增 upload_image 动作,限 png/jpg、单张≤2048K、内容与后缀必须一致、同会话每分钟限12次;web_tickets 增 images 列(JSON 数组,上限3张,URL 仅限自家图床)
- core.php:权威建表补 images 列 + 老库幂等 ALTER 迁移
- player/admin 两端:上传即暂存、光标处插入 [图片N] 滚动占位符、上限3张;提交时随工单入库
- player/admin/service 三端详情:占位符还原为 markdown 图片,未引用图片补在末尾
|
2026-10-04 10:16:37 +08:00 |
|
ypsdf1
|
c6b05d72c8
|
安全:pay_poller.php 摘出仓库转为 release 模板,真实 MySQL 账密不再入库
- api/pay_poller.php 从 git 索引移除并加入 .gitignore(同 pay_secrets.php 处理)
- 本地文件改为 REPLACE_ME_* 占位符模板,硬编码的 kH3C3LLinNwYdTF5 /
sRhsdxrpHBhmSsp8 / PAY_MD5_KEY 全部摘除(原文件备份为 .orig_backup)
- deploy_php_only.py 补 pay_secrets.php / pay_poller.php 排除项,防止批量部署把
线上真值覆盖回旧密码
- 修复 should_exclude 通配符不生效:deploy_*.py 等 glob 原先字面比较永远不命中,
改为 fnmatch,避免部署脚本(含 FTP 明文账密)被传到公网站点根
|
2026-10-02 23:19:25 +08:00 |
|
ypsdf1
|
7f513b9fa1
|
充值补单只认本方RE订单:平台多商户库不再整表拉取,杜绝垃圾充值单刷屏
|
2026-10-02 21:43:23 +08:00 |
|
ypsdf1
|
9ee8023d90
|
领地权限与面积限制接口:补生物蛋/涂蜡刮蜡两权限字段,新增退费比例与面积限制配置项
|
2026-10-02 19:31:20 +08:00 |
|
ypsdf1
|
5912c6fd76
|
引导初始化:管理密码首次由部署者自设,解开占位符密码无法保存配置的死结
|
2026-10-02 17:10:39 +08:00 |
|