Files
TPSchedule/docs/tpschedule-0.7.5-validation.md

44 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TPSchedule 0.7.5+23:本科排考未发布兼容与HTML反馈排查
2026-10-16,F:/program/app。用户提供三份0.7.4+22日志与截图,均为本科流程,浏览器Chromium138.0.7204.179。前两例显示完整课表但点击导入时报“教师、教室或课程序号缺失”;第三例有日期和考试时间,但考场/座位显示“考试情况尚未发布”,读取报“考试记录字段不完整”。本记录不包含原始学生HTML、账号或日志正文。
## 定位与范围
考试解析器原先以9个物理单元格判断完整性。截图提示考场、座位被合并为一个尚未发布的单元格;构造该结构的回归用例在原实现中稳定失败。现仅接受位于考场列的colspan=2且文本为“考试情况尚未发布”的已知结构,恢复逻辑列映射,保留日期、时间、情况及考试类型;座位留空供界面显示尚未安排。其他异常合并、类型/学期不一致和损坏页面继续拒绝,旧数据不被部分结果覆盖。
课表的笼统错误由教师为空、教室为空或课程序号后缀格式不符三种分支共同产生。日志不含这些字段,测试同学无法提供新HTML,因此目前不能判断其中哪一种是实际原因,也不宣称修复了这两例课表导入。现区分固定原因码teacher_missing、room_missing、course_sequence_invalid及活动序号;日志中不写课程/教师/教室值。
## 用户确认的HTML反馈功能
用户选择通过反馈邮件发送,而不是新增本地导出。反馈问题页面在日志下新增默认关闭的“附带最近一次本科导入页面HTML”,须先选择日志并同意个人信息提示。加入开发的申请不携带HTML。
只保存来源校验通过后、解析前得到的本科课表/课程名单或考试表格片段,最大2MiB,单份内存缓存最多10分钟;退出登录、重新认证、开始新流程及会话销毁清除,不写本地日志/文件。离开学校浏览器返回反馈页面会保留尚未过期的缓存。提交时冻结附件及编号,失败重试字节不变;冻结副本的生命周期是当前反馈表单。过期或不存在时明确提示重新尝试导入或取消附件,保留填写内容。
片段移除账号页头、表单、事件/URL属性、网络资源、无关脚本和认证参数,只保留课程/考试表格、数字学期/类型以及课程声明与节次赋值;课程脚本使用不执行的类型,HTML带禁止网络/表单的CSP。扫描器不要求声明字段有效,保留null、未知节次表达式和注释后的声明,避免过滤掉错误证据。个人课表信息仍可能敏感,学生需主动同意。
客户端新增独立multipart字段diagnostic_html;服务端限制一份2MiB UTF-8 HTML,校验固定前缀、平衡结构、标签/属性白名单、精确CSP和惰性脚本类型。拒绝活动脚本、网络资源和事件属性,作为TPSchedule-school-page.html附在邮件中,不占媒体名额,参与原幂等摘要。旧客户端兼容。
## 验证证据
- 考试合并单元格用例先失败、修复后通过,异常跨度仍拒绝。
- 课表错误分别报告固定原因;失败前捕获证据,退出后清除。HTML过期、来源限制和认证资料过滤通过。
- 原过滤器遗漏异常声明、未知节次及注释前缀的回归先失败;修正后导出仍保留原解析错误,正常合成课表重放为18条安排。
- 反馈默认关闭、提示确认、不可变附件及失败重试通过;服务端验证第5个附件、独立限额、无效MIME/UTF-8、超限、开发申请拒绝和幂等冲突。
- 使用Dart实际过滤器生成9387字节合成样本,Python服务接收并生成逐字节一致的邮件附件;样本中均为测试课程、教师和教室,不是学生原HTML。
- 完整Flutter测试281项通过;flutter analyze无问题;4项实际JavaScript采集脚本检查通过;Python反馈服务66项测试通过。
- 独立审查两项Important发现(错误证据丢失、服务端活动HTML)修正后复核,无未解决Critical/Important项。审查未代替真实账号测试。
## 部署与复测
反馈服务需更新同一容器代码,保留.env、SMTP密码、IDEMPOTENCY_SECRET和数据库卷。OpenResty及雷池请求体放行至少24MiB,原域名和端口链路保持。详见[0.7.5服务器更新说明](../server/feedback/html-diagnostic-update.md)。本次没有操作线上服务器或发送真实邮件。
覆盖安装后在校园网复测考试,核对待发布考场不会阻断导入;课表再尝试导入,在10分钟内返回反馈页勾选日志与HTML发送,取得具体缺失字段及页面后继续修复。真实手机、真实学校页面和线上SMTP仍需用户确认。
## 构建及签名
正式版与调试版构建通过。首次发布构建因生成的注册文件残留integration_test而失败,按完整发布构建流程重新生成配置后通过;该文件不入源码,未修改应用依赖或签名。正式APK的applicationId=com.tpschedule.app、versionName=0.7.5、versionCode=23,minSdk=24、targetSdk=36,60254031字节。
TPSchedule-0.7.5.apk与TPSchedule.apk相同,SHA256为A9BBBB1A64F14661A91D049D868309138DEBDD54D486363090B9AECEEC68CEF5。apksigner验证通过,与0.7.4证书逐字节相同,证书SHA256仍为AF5C21B1BA1E48E461D8EA38DF0FE1C3653F64EB7E8E7728BAE6E5D988BA0D0A。
API36测试模拟器安装此正式包成功,冷启动返回Status=ok、LaunchState=COLD、TotalTime=1312ms,进程存在。Windows模拟器沿用测试专用的软件渲染启动参数,未修改手机安装包的默认渲染配置;这不是用户手机启动耗时结论。测试后关闭本任务创建的emulator-5556。