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

5.6 KiB
Raw Permalink Blame History

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服务器更新说明。本次没有操作线上服务器或发送真实邮件。

覆盖安装后在校园网复测考试,核对待发布考场不会阻断导入;课表再尝试导入,在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。