Repository navigation
Releases
Releases · young-ski/campus-auth
v1.7.6
修复
- 探测 Python 时可能卡死:
-c的脚本以前拼在一个变量里,变量没展开就变成裸的
py -3.13—— 进交互式 REPL、一直等输入(同学实测卡了 10 分钟)。现在脚本内联,
且所有探测调用都带<nul,任何情况下都不会停在等输入上 - 从压缩包装的自启跑不起来:
install生成的是python -m campus_auth watch,可是
pyz 里的包没装进 site-packages,装完一跑就 import 失败。现在检测到自己在 pyz 里跑时,
改成python <pyz> watch,并把 pyz 复制到配置目录再指过去 —— 删掉解压出来的文件夹也不失效 - 重复卸载会报错:注册表项或文件本来就不在时,
uninstall现在照常成功并提示一句,
不再退 2 或抛 traceback install的密码来源检查从此前只认「空密码」扩展到「密码只在环境变量里」
变更
setup不再打开记事本:学号和密码都在窗口里问,问完直接写配置。学号只认数字,
手快把@cmcc抄进来的会自动取前面的数字;提示语里也不再教「别带 @」
文档
- 安装说明补「双击没反应 / 智能应用控制拦住」的处理:右键属性解除锁定,或
Unblock-File,以及最后的系统开关在哪
v1.7.5
修复
- 装了 Python 3.12,
install.cmd仍说找不到:旧脚本只试py -3和 PATH 上的python。
现在按顺序试py -3.13…-3.10、PATH、注册表(PythonCore的ExecutablePath)、
以及 python.org / uv / conda / scoop 的默认目录——「装了但没加 PATH」和 uv 装出来的
3.12 都能找到。仍找不到时不再只给一句「没装」,而是打印where python/py -0p的现场,
并支持显式指定:install.cmd "C:\...\python.exe" - Python 3.10 也能用了:代码里唯一的 3.11 依赖是
tomllib,内置一份tomli(MIT,
保留上游 LICENSE)给 3.10 兜底;requires-python降到>=3.10,CI 矩阵补 3.10
文档
- 安装说明写清「3.10 或更新」、查找顺序,以及找不到时怎么把现场发出来
v1.7.4
新增
setup:一条命令做完首次配置 —— 先讲清风险,再写配置、让人填学号、存密码
(钥匙串优先,进不去就写配置文件)、当场登一次、最后问要不要开机自启。重跑(--force)
会沿用的学号,不再反复问- 发给同学的 Windows 压缩包:
campus-auth-<版本>-win.zip,内含install.cmd
(查 Python、核 SHA256、调setup)、install-guide.txt、disclaimer.txt。发版自动挂到 Release - 配置默认位置统一成
~/.config/campus-auth/config.toml/%APPDATA%\campus-auth\config.toml,
和配置文件发现顺序的最后一项是同一个文件;删掉解压目录不影响自启
修复
campus-auth.pyz永远退 0:zipapp的main=生成的入口不调sys.exit,退出码契约
在单文件形态上整个失效(计划任务与check都靠它)。改成自己写入口cli.main里errno 22一律当断管:会写文件的命令自己catch OSError,init写不进去
时退 2 并说明install认不出「密码只来自环境变量」,装完 watch 必失败:现在 dry-run 就警告
文档
- README 安装段分成「不会命令行的同学」和「会命令行」,前者就是压缩包那条路,
并写明装之前要先连热点/流量 - CONTRIBUTING 发布段补压缩包的生成与自检要求
v1.7.2
修复
watch的每轮时间戳只有HH:MM:SS,日志跨夜就定位不了:改成带日期probe --retries一直挂在 help 里却没人用:接进取样,失败样本按退避重试- 补两处回归断言:登录确认成功后不再白等(本来如此,但没测过)
v1.7.1
修复
- Release 说明在标题带日期后整段切不出来,回退成了「v1.6.0」这样的空壳:切分逻辑抽成
tools/release_notes.py,按前缀匹配并要求版本号后不是数字;已回填 1.6.0 / 1.7.0 的说明
v1.7.0
新增
- 支持第三方适配层包:在
.dist-info里把名字注册到campus_auth.adaptersentry point 组,
--adapter <名字>就能选到;同名时内置优先。adapters列表也一并列出 - README 首屏加英文说明;
docs/schools.md补收录标准
v1.6.0
新增
new-adapter <代号>:生成可立即加载的适配层骨架,带必改清单、status="未验证"与验连通命令- 适配层的
status默认改成「未验证」(以前一出生就自称已验证),huuc显式标「已验证」
v1.5.0
新增
probe不给--url时会从校园网劫持页里找门户地址(两个公开探针,--no-discover可关)。
已经在线的网络捞不到东西,会明确让你改用--urlinit --url把门户地址直接写进配置;init同时打印它选的适配层与地址,适配层状态不是
「已验证」时会提示先 probe- README 首屏补「不是本校怎么办」的
--adapter generic --url分支 doctor命令:一次打出排障要的版本、配置路径、适配层、连通性与探测结论,密码只报来源SECURITY.md(私下通道 + 打码规则 + 哪些是设计取舍)、PR 模板、bug 模板的安装方式与
probe --json字段- CI 新增 Windows / macOS 的 install 真跑作业:装完去注册表 / launchd 里核实,卸载后断言干净
v1.4.0
破坏性:--json 的 stdout 现在是纯 JSON,面向人的文案全部改走 stderr。init /
adapters / urls / password / install / uninstall 不再接受 --json(会直接报
多余参数,退出码 2)。靠人读输出做管道的用法不受影响,只有 --json 的消费方需要改。
新增
--adapter现在也能直接给文件路径(路径.py:ADAPTER),module:attr的模块名照旧。
配套docs/schools.md:社区适配层目录,放外面跑通也登记得进去
发布
publish.yml现在先跑测试、校验版本三方一致(tag /pyproject.toml/__init__),
再构建、上传、自己建 Release 并挂上 pyz 与SHA256SUMS。workflow_dispatch不再能
整段绕过版本校验。- 单文件 pyz 改由
tools/build_zipapp.py构建,排除__pycache__/*.pyc/*.egg-info:
402 KB → 53 KB,条目 71 → 30。 - 新增
tools/check_version.py;CI 的冒烟步骤改用同一个打包脚本,避免发布与 CI 各走一套。
修复
watch在门户已判不在线后仍因 DNS 通顺直接返回、一次登录都不发(校园门户劫持 DNS,
这条快速路径恒为真)。现在以门户会话列表为准,DNS 只在被拒后用于归因;连续 3 轮
「被拒 + DNS 通」按健康处理,避免门户会话接口坏掉时退避到 8 倍间隔- Windows 自启装完即崩:
pythonw下sys.stdout is None,Tee未判空。现在丢弃空流并把
日志顶上,install生成的.cmd不再每 31 秒撞一次 - 超过 80 字符的密码密文会漏出尾巴(掩码正则写了
{1,80}上限) login --json在已在线时一个 JSON 都不输出,其余路径的人话还混在 stdout;probe --json
失败时同理check --json忽略 flag、直接吐online/offlineprobe失败一律退 3 并提示「先连校园网」;传输错误现在按约定退 4probe会把通用 nginx 登录页判成「是 Dr.COM」:wlan_user_ip+result+ nginx 三条谁都有
的信号刚好凑过门槛。nginx 信号减半、门槛 40→55,且判成 Dr.COM 必须命中enc_pwd/getkey- 配置里写
account = 81456789(不加引号)会TypeError并以 70 退出:字符串字段统一str() - 端口越界(
http://h:99999)以 70 + traceback 退出:现在归为配置错 2 local_mac用子串判 IP,查10.138.14.2会命中10.138.14.27那块、返回别的网卡的 MAC;
改为按 IPv4 行精确匹配,精确不到再退回子串- 非 ASCII 密码会发出与浏览器不同的密文:
validate直接拦下(退出码 2),提示改 ASCII - 钥匙串查询早于命令行覆盖:
login -a 学号拿空账号去查、永远查不到,配置里是另一个号时
还会静默用错密码。改为应用 overrides 之后再查 --mac只数长度,ZZZZZZZZZZZZ也放行:改成正则校验 12 位十六进制- 两个
watch --log写同一个文件时,轮转里的replace会抛 WinError 32 并带崩进程:
写入与轮转都改成尽力而为(失败留到下次重开),日志器不再打死主循环 - 配置里
verify_tls = true之后命令行无法关掉:--verify-tls改成双向,可用--no-verify-tls password --forget在后端报错时照样打印「已删除」:改为报「删不掉」并以 3 退出;
keyring.backends.fail也不再算「可用」probe --url写错时给的是「先连校园网」且退出码 3:地址类错误现在退 2,只提示地址怎么写
整理
- 清掉死代码与假 docstring:
portal.py队尾不可达的兜底、只被测试调用过的iter_retry_delays
(现已接进重试)、cli.py里「实现在 commands.py」的说法、schema 校验器的oneOf说法 CHANGELOG里整块重复的 1.3.0 / 1.2.1 / 1.2.0 已删,被拆成两半的 1.1.0 合并回一节- 500/502/504 不重试(只认 429/503),一次代理抖动就废掉整次登录
Retry-After头名大小写敏感:小写retry-after: 20被丢掉、走成 2 秒。头名统一小写化,
取值也忽略大小写