Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
179 commits
Select commit Hold shift + click to select a range
af0821b
fix(k8s): 集群列表与详情不再返回 kubeconfig 明文
GoSimplicity Oct 23, 2026
db9acee
fix(terminal): exec 结束时先发送关闭帧(正常 1000、异常 1011)再断开连接
GoSimplicity Oct 23, 2026
2d07ff6
chore(security): SEC-01A 移除已提交的 kubeconfig 并接入 gitleaks
GoSimplicity Oct 23, 2026
6e2e71b
fix(terminal): 关闭等待期间 Pong 不再把读期限延长回 pongWait
GoSimplicity Oct 23, 2026
9c93347
fix(hooks): setup-git-hooks.sh 只给钩子脚本加可执行位,不改动文档文件模式
GoSimplicity Oct 23, 2026
4cc85e5
fix(config): SEC-02A 敏感配置移出 yaml,改由环境变量注入
GoSimplicity Oct 23, 2026
8f4cc5c
fix(config): SEC-22 移除内置默认密钥,缺少必需密钥环境变量时启动即失败
GoSimplicity Oct 23, 2026
b7f1fc4
chore(security): .gitignore 忽略 kubeconfig 与 .env.* 备份,保留 *.example 模板跟踪
GoSimplicity Oct 23, 2026
696cd6a
fix(cron): SEC-03A 本地任务环境隔离并新增 cron.allow_local_exec 开关(默认关闭)
GoSimplicity Oct 23, 2026
77bd84a
feat(cron): CRON-A 任务列表响应附带只读字段 allow_local_exec
GoSimplicity Oct 23, 2026
fef95ed
fix(config): SEC-22B jwt.issuer 回到 yaml 普通配置,不再是必需密钥环境变量
GoSimplicity Oct 23, 2026
74f3f29
fix(cron): CRON-03B 去掉 cl_cron_jobs.job_type 的列默认值 2(仅改代码)
GoSimplicity Oct 23, 2026
2a350c3
fix(config): SEC-02B webhook MySQL DSN 移出 webhook.yaml,改由 WEBHOOK_MYS…
GoSimplicity Oct 23, 2026
ef7d9e1
test(cron): CRON-03C 崩溃恢复冒烟脚本保留本地命令任务并显式要求 CRON_ALLOW_LOCAL_EXEC=true
GoSimplicity Oct 23, 2026
93dbd28
chore(security): RFC6455 示例 nonce 误报改为 .gitleaksignore 指纹精确忽略,删除按路径的 …
GoSimplicity Oct 23, 2026
5218cee
ci(security): 后端 gitleaks workflow 开启工作树扫描(GITLEAKS_SCAN_TREE=true)
GoSimplicity Oct 23, 2026
36c4952
docs(env): env.example 删除 JWT_ISSUER 并按 W1 必需变量清单标注必填/条件必填/可选,补 CRON_…
GoSimplicity Oct 23, 2026
8c62bdb
fix(security): SEC-27 移除 deploy/mysql/init.sql 注释中的明文口令,改为占位符
GoSimplicity Oct 23, 2026
1b2bb98
docs(cron): REL-01 job_type DDL 与回滚语句带上与模型一致的 COMMENT
GoSimplicity Oct 23, 2026
e14c054
Revert "fix(cron): CRON-03B 去掉 cl_cron_jobs.job_type 的列默认值 2(仅改代码)"
GoSimplicity Oct 23, 2026
9905ad7
chore(env): JWT_ISSUER 改为注释的可选项(覆盖 yaml,一般不要设)
GoSimplicity Oct 23, 2026
5ddfab1
docs(readme): JWT_ISSUER 不再列为必需的 JWT 环境变量
GoSimplicity Oct 23, 2026
abb8728
docs(auth): SEC-24/SEC-07 权限码v2契约与超管角色迁移说明
GoSimplicity Oct 23, 2026
bca2c3e
fix(user): SEC-28 change_password 强制使用 token uid 并放宽 user_id/username…
GoSimplicity Oct 23, 2026
89f3efc
fix(user): SEC-28 添加改密越权与兼容性回归测试
GoSimplicity Oct 23, 2026
619d759
fix(k8s): SEC-25 Secret 默认脱敏并新增带审计的 reveal 接口
GoSimplicity Oct 23, 2026
c615128
docs(k8s): SEC-25 Secret 脱敏与 reveal 接口契约
GoSimplicity Oct 23, 2026
437af6d
feat(release): REL-03A release-env.py 生成 WEBHOOK_MYSQL_ADDR
GoSimplicity Oct 23, 2026
e467571
feat(release): REL-03A 发布栈加入告警 webhook 服务与可选 alertmanager profile
GoSimplicity Oct 23, 2026
775dc8c
fix(auth): SEC-07 以内置超管角色取代 admin 用户名特判
GoSimplicity Oct 23, 2026
f4d21c7
fix(release): REL-03A webhook 端口按代码实际行为改为 8889
GoSimplicity Oct 23, 2026
616e209
fix(config): SEC-27 生产环境默认关闭 mock,移除 mock 管理员内置口令
GoSimplicity Oct 23, 2026
15c0277
docs(gitleaks): 更正 .gitleaksignore 历史扫描注释,CI 只扫新增提交区间
GoSimplicity Oct 23, 2026
38a0cdf
fix(auth): SEC-24 鉴权改为方法+gin路由模板精确比较并新增权限码v2接口
GoSimplicity Oct 23, 2026
e7cc525
docs(auth): SEC-24 补充通配写法与真实路径授予的上线盘点说明
GoSimplicity Oct 23, 2026
6f855b4
fix(security): pre-commit 不再自动 go fmt + git add,改为只检查暂存版本的 gofmt(SEC-…
GoSimplicity Oct 23, 2026
475d905
fix(ci): gitleaks 扫描 merge 提交自身的差异(--diff-merges=first-parent,SEC-01A…
GoSimplicity Oct 23, 2026
34e363e
fix(ci): gitleaks 的 push 运行不再被 concurrency 取消(SEC-01A 审查 P2-2)
GoSimplicity Oct 23, 2026
f2b5714
fix(k8s): SEC-25 stringData 空值写回保护、审计失败状态码、显式授权精确匹配
GoSimplicity Oct 23, 2026
148390d
fix(ci): 首推 / force-push 不再退化为只扫 HEAD,范围计算抽到 .github/scripts/gitleaks…
GoSimplicity Oct 23, 2026
1fdc992
chore(ci): gitleaks 工作流 actions/checkout 固定到 commit SHA 并关闭 persist-c…
GoSimplicity Oct 23, 2026
26f6941
fix(config): SEC-27 规范化 ENV 判定,未设置或未知取值拒绝启动
GoSimplicity Oct 23, 2026
711052c
test(cron): CRON-03C 崩溃冒烟脚本先做 recovery-timeout 范围校验再检查开关,补未设开关被拒用例
GoSimplicity Oct 23, 2026
07864b3
docs(readme): 快速开始先复制并填写 .env,再 docker compose up -d(SEC-01A 审查 P3)
GoSimplicity Oct 23, 2026
def52b6
fix(security): .gitignore 把 "!*.example" 收窄为逐个放行被跟踪的模板(SEC-01A 审查 P3)
GoSimplicity Oct 23, 2026
38bff7f
fix(app): SEC-27 启动时检测 admin 是否仍在使用旧内置弱口令
GoSimplicity Oct 23, 2026
d252570
fix(config): SEC-22C JWT 密钥强度检查扩展到所有环境,按 sha256 拒绝历史示例值
GoSimplicity Oct 23, 2026
fb7d5fc
fix(jwt): SEC-22D 刷新令牌写入并校验 issuer,拒绝其他 issuer 的刷新令牌
GoSimplicity Oct 23, 2026
94207a9
fix(main): SEC-22E .env 解析失败时输出固定文案(不含原值)并以非零码退出
GoSimplicity Oct 23, 2026
00cc906
fix(app): SEC-27 统一管理员 AccountType,读取口令后清除环境变量,非生产短口令仅告警
GoSimplicity Oct 23, 2026
08fbc93
docs(release): REL-03A prometheus-scrape-auth 中 webhook 端口更正为 8889
GoSimplicity Oct 23, 2026
4a1add0
fix(cron): SEC-03C 开关关闭时拒绝启用命令行/脚本任务,调度器不再登记这两类任务
GoSimplicity Oct 23, 2026
b8565a6
fix(k8s): SEC-29 ServiceAccount token 归属校验、显式授权与同步审计
GoSimplicity Oct 23, 2026
ca92816
test(release): REL-03A 补 release-env.py WEBHOOK_MYSQL_ADDR 与新参数回归
GoSimplicity Oct 23, 2026
38b0356
fix(webhook): 配置改用独立 viper 实例加载,DSN 经参数注入 InitDB,不再写入全局 mysql.addr
GoSimplicity Oct 23, 2026
63977a2
docs(release): SEC-27 admin 口令重置途径方案草稿(CLI 与 BOOTSTRAP 开关对比,待审批)
GoSimplicity Oct 23, 2026
281f2cf
docs(security): SEC-27 补充 test/testing 复用开发配置与非生产弱口令检测查库失败仅告警(中英)
GoSimplicity Oct 23, 2026
c042623
docs(release): SEC-35 存量 admin account_type 更正方案草稿(只读核对/UPDATE/回滚,待批准)
GoSimplicity Oct 23, 2026
d237eb5
fix(cron): 命令行任务自定义环境变量拒绝 LD_*/DYLD_*/BASH_ENV/ENV/IFS(创建、更新、执行前均校验)
GoSimplicity Oct 23, 2026
c823d42
docs: 说明关闭本地执行开关不会终止已运行进程、JWT_EXPIRATION 单位为分钟(发布配置 30)
GoSimplicity Oct 23, 2026
125bc27
test: 修复 retry 并发测试自身的数据竞争;标注 RFC 6455 示例 nonce 为 gitleaks 误报
GoSimplicity Oct 23, 2026
d133484
chore(dev): SEC-27 本地开发显式 ENV=development
GoSimplicity Oct 23, 2026
e206bec
chore(deploy): SEC-27 后端镜像运行阶段默认 ENV=production
GoSimplicity Oct 23, 2026
2cd8851
docs(env): SEC-27 env.example 注明 ENV 取值与拒绝启动行为
GoSimplicity Oct 23, 2026
64450dd
fix(k8s): SEC-29 TokenRequest 有效期校验(默认3600,600~3600,越界400并审计)
GoSimplicity Oct 23, 2026
833293e
fix(k8s): SEC-29 ServiceAccount 更新改用 RetryOnConflict,基于最新版本应用可编辑字段并保留…
GoSimplicity Oct 23, 2026
44d6f88
fix(app): SEC-29 权限目录改名同时校验自动说明,插入被跳过的权限码记 Warn
GoSimplicity Oct 23, 2026
9ef1acb
fix(k8s): SEC-29 SA YAML 乐观锁 409、token 读取复用 SA、过期时间转 UTC、路由绕过测试
GoSimplicity Oct 23, 2026
b3d43d3
fix(k8s): SEC-25 Secret 更新时 data 缺省保留、stringData 空串只恢复请求 data 中的键
GoSimplicity Oct 23, 2026
037588c
fix(config): 收紧 JWT 密钥校验并将访问令牌默认有效期改为30分钟
GoSimplicity Oct 23, 2026
ed683ef
docs(release): SEC-29/SEC-25 启动迁移说明、回滚 SQL 草案、乐观锁 409 与 Secret 更新语义
GoSimplicity Oct 23, 2026
d9d98e5
fix(jwt): issuer 为空时 NewJWTHandler 返回错误
GoSimplicity Oct 23, 2026
e5d39ae
fix(cron): 命令行任务环境变量空行放行并扩充拒绝名单
GoSimplicity Oct 23, 2026
4e02876
docs(release): 补充 W1 JWT 配置发布说明与定时任务环境变量审计草稿
GoSimplicity Oct 23, 2026
7314f49
docs(release): SEC-27 说明镜像默认 ENV=production 启用严格 SSH 主机密钥校验,本地 docker…
GoSimplicity Oct 23, 2026
8bb2307
test(middleware): 运行时构造 RFC 6455 示例 nonce,移除 gitleaks:allow 行内豁免
GoSimplicity Oct 23, 2026
427f098
test(security): SEC-01A 第三轮 P3-3 回归测试 macOS 兼容与判定加严
GoSimplicity Oct 23, 2026
0cdbf0c
fix(config): JWT_EXPIRATION 超过1440分钟时生产环境拒绝启动、其他环境告警;密钥拒绝 unicode.Cf …
GoSimplicity Oct 23, 2026
3c53799
fix(security): SEC-01A 第三轮 P2-1 login_test.go 示例 nonce 改为按值 allowlist…
GoSimplicity Oct 23, 2026
376e3b2
fix(cron): 命令行任务环境变量名先按 ^[A-Za-z_][A-Za-z0-9_]*$ 白名单格式校验再过拒绝名单,补充 PRO…
GoSimplicity Oct 23, 2026
6d9f9f0
docs: 补充 JWT 有效期上限与待对齐项、密钥按字节计与示例值检查范围、cron 变量名白名单与审计 SQL 草稿、webhook …
GoSimplicity Oct 23, 2026
ab926a5
fix(security): SEC-01A 第三轮 P3-1 不再信任行内 gitleaks:allow 与 PR 自带的 gitlea…
GoSimplicity Oct 23, 2026
3af04aa
fix(config): 统一用 runenv.IsProduction 判断生产环境(去空白、忽略大小写);JWT_EXPIRATION…
GoSimplicity Oct 23, 2026
fef8218
fix(cron): NormalizeTaskEnv 保存前去掉变量名首尾空白;ValidateTaskEnv 拒绝去空白后重复的变量名…
GoSimplicity Oct 23, 2026
70bf9fc
docs: 定时任务环境变量拒绝条件改为三条并补充去空白入库与变量名重复规则;生产环境判断、JWT_EXPIRATION<=0 告警与生产…
GoSimplicity Oct 23, 2026
33e2cca
docs(env): env.example 端口改为 8889,注明 WEBHOOK_PORT 不生效、REDIS_PASSWORD 在…
GoSimplicity Oct 23, 2026
93ee93f
docs(env): 按实测改写 WEBHOOK_PORT 说明,分合入前/后写清默认端口与改法
GoSimplicity Oct 23, 2026
09be571
docs(env): JWT_EXPIRATION 示例改为 30 并写明单位为分钟
GoSimplicity Oct 23, 2026
bb410eb
fix(webhook): cfg 改为从逐键合并后的值解码,WEBHOOK_PORT 等环境变量与默认值真正进入 cfg;校验 webh…
GoSimplicity Oct 23, 2026
4a88f5c
test(gitleaks): 固化“历史 nonce 不加提交指纹”的依据,并更正 .gitleaksignore 注释
GoSimplicity Oct 23, 2026
5f95584
docs(env): 按馒头 bb410eb 实测改写 WEBHOOK_PORT/WEBHOOK_MYSQL_ADDR 合入前后说明
GoSimplicity Oct 23, 2026
5e91246
test(env): test-env-example.sh 可在合入 sched/w1-mantou 后的工作区运行
GoSimplicity Oct 23, 2026
ca43788
docs(env): WEBHOOK_MYSQL_ADDR/WEBHOOK_PORT 注释补 REL-03A 合入顺序与发布栈端口说明(r…
GoSimplicity Oct 23, 2026
9d46160
fix(webhook): 不再支持没有 webhook 根节点的旧平铺格式,根节点下出现 port/fixed_workers 等字段时…
GoSimplicity Oct 23, 2026
5e9d1f6
docs(env): WEBHOOK_PORT 的 --config 副本须保留 webhook: 根节点(review3d P3-3)
GoSimplicity Oct 23, 2026
10628cd
test(env): test-env-example.sh 加 pipefail、逐行读文件名、精确匹配(review3d P3-4)
GoSimplicity Oct 23, 2026
e7833ab
docs(env): env.example 的 JWT_EXPIRATION / WEBHOOK_PORT / 告警地址注释与 w1-s…
GoSimplicity Oct 23, 2026
0ba841f
fix(release): backend 设 PROMETHEUS_ALERT_WEBHOOK_ADDR 指向 webhook:8889…
GoSimplicity Oct 23, 2026
0396d3d
docs(env): env.example 的 JWT_EXPIRATION / WEBHOOK_PORT / 告警地址注释与 w1-s…
GoSimplicity Oct 23, 2026
e1c57de
fix(webhook): im_feishu 为 null 时子键环境变量随机丢失:合并值只保留叶子键并按键名排序,解码 cfg 与发布…
GoSimplicity Oct 23, 2026
7424848
fix(webhook): 端口校验先去前导零再查长度和范围(000080 视为 80 并规范化,全零仍拒绝);文档写明整数字段不再接受 …
GoSimplicity Oct 23, 2026
9ddbb12
feat(webhook): 配置文件存在但没有 webhook 根节点(含 webhook: 为 null、空文件)时记配置告警,只列文…
GoSimplicity Oct 23, 2026
9ef349e
test(webhook): 补充大写 PORT 键用例:根节点下的 PORT/Port 按旧平铺格式启动失败(报错列小写键名 port、…
GoSimplicity Oct 23, 2026
0146077
fix(webhook): 收紧全部整数字段:负数一律启动失败,fixed_workers/default_upgrade_minutes…
GoSimplicity Oct 23, 2026
07bb205
docs(env): WEBHOOK_* 注释按 w1-mantou 0146077 实测更正根节点与整数字段规则(review3f)
GoSimplicity Oct 23, 2026
ee6ab0f
feat(scripts): 新增只读检查 check-webhook-env.sh 与测试(review3f)
GoSimplicity Oct 23, 2026
ee753b4
feat(scripts): check-webhook-env.sh 对任意仅大小写不同/完全相同的同层键判不合规(review3g)
GoSimplicity Oct 23, 2026
9714796
fix(ci): gitleaks 策略来源与扫描起点分离,非默认分支一律用默认分支的配置(review3g N2)
GoSimplicity Oct 23, 2026
9910737
fix(ci): 基准 .gitleaks.toml 的 [extend] path 检查改用 tomllib 解析,不区分大小写(rev…
GoSimplicity Oct 23, 2026
313714c
fix(hooks): pre-commit 的 gitleaks 策略只取暂存区版本,拒绝未跟踪/未暂存的 .gitleaks.toml…
GoSimplicity Oct 23, 2026
2e34d8e
test(security): 历史全量扫描 T1 移走 .gitleaksignore 并加无 allowlist 对照(review3…
GoSimplicity Oct 23, 2026
6c46903
docs(security): 修正 .gitleaks.toml 中 RFC 6455 allowlist “可删除”的错误注释(rev…
GoSimplicity Oct 23, 2026
8d203df
fix(security): 本地 gitleaks 最低版本 8.25.0,删除 protect --staged 回退(review3…
GoSimplicity Oct 23, 2026
e4c43a2
fix(webhook): 按反射生成的父键白名单与叶子类型表校验配置,标量叶子写成 map/列表、父键写成标量/列表一律启动失败(修复 …
GoSimplicity Oct 23, 2026
0b8bfe5
test(release): compose 探测与执行共用隔离环境,透传 DOCKER_CONFIG(r3inc P2-1)
GoSimplicity Oct 23, 2026
835d82d
test(release): 告警地址与 webhook.yaml 端口解析补边界(r3inc P3-3)
GoSimplicity Oct 23, 2026
f55fb0c
fix(release): backend 告警推送地址可用 PROMETHEUS_ALERT_WEBHOOK_ADDR 覆盖(r3inc…
GoSimplicity Oct 23, 2026
4dcefc3
docs(env): 修正 env.example 中 webhook 服务 / 端口 / HTTP SD 地址说明(r3inc P3-1…
GoSimplicity Oct 23, 2026
fb7fb53
docs(env): 修正 env.example 中 webhook 服务 / 端口 / HTTP SD 地址说明(r3inc P3-1…
GoSimplicity Oct 23, 2026
03e2c22
fix(env): env.example 的 webhook 端口与告警地址对齐、飞书群消息地址改为群机器人前缀(r3inc P3-7/…
GoSimplicity Oct 23, 2026
70b7eea
fix(env): env.example 的 webhook 端口与告警地址对齐、飞书群消息地址改为群机器人前缀(r3inc P3-7/…
GoSimplicity Oct 23, 2026
2026deb
fix(config): webhook 配置严格校验第二轮(P2-A 1-4、P3 5-13、N1-N5、飞书地址)
GoSimplicity Oct 23, 2026
74013f3
test(env): 群消息 URL 拼接改为解析 Go 表达式,兼容 w1 的 strings.TrimRight 写法及外层包装(r4…
GoSimplicity Oct 23, 2026
506c692
test(env): 同步 rel03a 的 test_env_example(群消息 URL 拼接兼容 strings.TrimRigh…
GoSimplicity Oct 23, 2026
e05b234
test(release): 端口解析只认 ASCII 数字,行内 # 注释前必须有空白(r4 A-2)
GoSimplicity Oct 23, 2026
6baed47
test(env): 同步 rel03a 的 test_env_example(端口只认 ASCII 数字、行内注释前须有空白,r4 A-2)
GoSimplicity Oct 23, 2026
7b47940
test(release): 告警地址 scheme 区分大小写,大写 HTTPS:// 视为错误;文档写明 scheme 必须小写(r4…
GoSimplicity Oct 23, 2026
605930b
test(env): 告警地址 scheme 区分大小写;env.example 写明 scheme 必须小写(同步 rel03a,r4 …
GoSimplicity Oct 23, 2026
15d7ba2
test(env): env.example 告警地址整体比较 scheme/host/path/port,HTTP SD 端口须等于 S…
GoSimplicity Oct 23, 2026
8acf712
test(env): 告警地址整体比较 scheme/host/path/port、HTTP SD 端口须等于 SERVER_PORT(同…
GoSimplicity Oct 23, 2026
2eab1bf
test(release): webhook.yaml 根节点重复、键名带引号时报错,不再静默漏掉(r4 A-5)
GoSimplicity Oct 23, 2026
45d6a87
test(env): webhook.yaml 根节点重复、port 键名带引号时报错(同步 rel03a,r4 A-5)
GoSimplicity Oct 23, 2026
0334145
test(release): CI=true 或 RELEASE_TESTS_REQUIRE_COMPOSE=1 时缺 compose 判…
GoSimplicity Oct 23, 2026
456ada1
docs(release): localhost 告警地址指向 Alertmanager 所在的容器或主机,而不是 backend(r4 …
GoSimplicity Oct 23, 2026
6a6be36
test(env): _env_example 按 godotenv v1.5.1 解析 env.example,并可选与真实 godot…
GoSimplicity Oct 23, 2026
79efa0d
test(env): _env_example 按 godotenv v1.5.1 解析并与真实 godotenv 交叉核对(同步 rel…
GoSimplicity Oct 23, 2026
db97f42
test(release): 补 compose 优先级用例:shell 压过 .env;shell 导出空串时压过 .env 并回落默认…
GoSimplicity Oct 23, 2026
db07c8c
feat(envmode): 新增 pkg/envmode 统一解析 ENV(窝窝头 2026-10-24 授权,r4 Part B 1/3)
GoSimplicity Oct 23, 2026
a12fc0b
fix(config,ssh): ENV 判定统一走 pkg/envmode,未设置/空白/未知取值拒绝启动(窝窝头 2026-10-24…
GoSimplicity Oct 23, 2026
2dae855
docs(env): env.example 与 deploy/release/env.example 的 ENV 说明对齐最终行为(窝窝…
GoSimplicity Oct 23, 2026
9839271
test(security): review3h 遗留项:测试去掉进程替换,兼容 macOS bash 3.2 --posix
GoSimplicity Oct 23, 2026
119c332
fix(webhook): 第三轮审查修复(键 tag、合并链深度、多文档、白名单脱敏、URL 去空白、scheme 大小写)
GoSimplicity Oct 23, 2026
3a1b5a8
fix(security): pre-commit 拒绝 skip-worktree/assume-unchanged 的策略文件,并检查…
GoSimplicity Oct 23, 2026
65c2893
Merge sched/w1-mantou (119c332) into ops-sec27-w1merge-shaomai
GoSimplicity Oct 23, 2026
efe085b
fix(config): 删除 pkg/runenv,生产判定统一用 envmode(失败即关闭)
GoSimplicity Oct 23, 2026
904496c
fix(scripts): check-webhook-env.sh 临时文件改用 mktemp 并检查创建结果,失败退出 2(revie…
GoSimplicity Oct 23, 2026
46c907f
test(envmode): 回显边界按字符计数的 16/17 用例(窝窝头 r4 P2-2,r5 任务 3)
GoSimplicity Oct 23, 2026
337e742
test(config): Load 在 ENV 无效时返回错误(窝窝头 r4 P2-3,r5 任务 3)
GoSimplicity Oct 23, 2026
1d7a24e
fix(config): 生产密钥校验按 JWT_KEY1→JWT_KEY2→TREE 固定顺序报错,补启动失败端到端测试(r5 P3-8)
GoSimplicity Oct 23, 2026
0b3ba34
merge: 合入 sched/ops-sec27-shaomai 的 r5 测试与 P3-8 修复(P2-2/P2-3/P3-8)
GoSimplicity Oct 23, 2026
ca4c676
fix(scripts): check-webhook-env.sh 先去注释再分类,多文档只看第一个、块标量不当键;内联表/锚点/别名/…
GoSimplicity Oct 23, 2026
f763601
fix(k8s/secret): SEC-26 P2 类型化解析 Secret YAML 后再恢复/检查占位符
GoSimplicity Oct 23, 2026
b92e522
test(gitleaks): 夹具仓库带上 gitleaks-config-check.py(修复 P3-a 后 pre-commit …
GoSimplicity Oct 23, 2026
c57c566
docs(release): 告警地址 scheme 改为“建议小写,不区分大小写”,测试按 w1 119c332 hasPrefixFo…
GoSimplicity Oct 23, 2026
2e80733
docs(release): WEBHOOK_PORT 改为“w1 之后由配置生效;compose 没有传这个变量”(w1align-2)
GoSimplicity Oct 23, 2026
d55816e
test(gitleaks): allow-bypass U2 复制 gitleaks-config-check.py 并断言由检查器拒绝…
GoSimplicity Oct 23, 2026
9e87ff4
fix(ci): gitleaks 范围/策略脚本只接受 REF_TYPE=branch|tag,空值与大小写变体一律失败;测试补 REF…
GoSimplicity Oct 23, 2026
1290c76
ci(gitleaks): 用 actions/setup-python v7.1.0(完整 SHA 固定)选择 Python 3.12,…
GoSimplicity Oct 23, 2026
ff861a5
fix(security): gitleaks 版本解析每段只接受不带前导零、最多 6 位的十进制数字(review3h P3-i)
GoSimplicity Oct 23, 2026
8566756
docs: README 写明提交前扫描需要 gitleaks >= 8.25.0 与 Python 3.11+(review3h P3-i)
GoSimplicity Oct 23, 2026
b24595b
test(gitleaks): login-allowlist 合成样本逐个用默认规则确认可检出后再用,消除 generic-api-ke…
GoSimplicity Oct 23, 2026
4e0e9bb
fix(k8s/secret): SEC-26 P2 Review 跟进:报错白名单、零宽字符占位符、字符串化重复键、1 MiB 上限
GoSimplicity Oct 23, 2026
1b75ca9
chore(go.mod): SEC-26 P3-7 go.yaml.in/yaml/v2 改为直接依赖(版本不变)
GoSimplicity Oct 23, 2026
1249468
fix(k8s/secret): SEC-26 P3-6 Secret YAML 入口上限放宽到 2 MiB
GoSimplicity Oct 23, 2026
d688fce
Merge PR #327: bind password changes to token identity
GoSimplicity Oct 24, 2026
b2cee36
Merge PR #328: harden terminal closure and kubeconfig redaction
GoSimplicity Oct 24, 2026
9fd11ed
Merge PR #331: redact secrets and audit reveals
GoSimplicity Oct 24, 2026
8acf813
Merge PR #332: precise authorization and built-in administrator
GoSimplicity Oct 24, 2026
8d0b567
Merge PR #335: service account token and secret update semantics
GoSimplicity Oct 24, 2026
7fe49bf
Merge PR #337: validate typed Secret YAML and request limits
GoSimplicity Oct 24, 2026
1904e0c
Merge PR #338: integrate webhook hardening and environment validation
GoSimplicity Oct 24, 2026
bbaa4d9
Merge PR #329: environment and administrator credential guards
GoSimplicity Oct 24, 2026
6f9d4e0
Merge PR #330: isolate local cron execution and require environment s…
GoSimplicity Oct 24, 2026
4f8476a
Merge PR #334: include alert webhook in release stack
GoSimplicity Oct 24, 2026
baf8dc5
Merge PR #336: enforce staged gitleaks policies and webhook checks
GoSimplicity Oct 24, 2026
dbc68dd
test: align administrator fixtures with strict environment modes
GoSimplicity Oct 24, 2026
dd59ef5
fix: align webhook preflight checks with merged loader limits
GoSimplicity Oct 24, 2026
03f55bd
test: check current webhook documentation contract
GoSimplicity Oct 24, 2026
2ca7574
Merge trusted security baseline and verified release configuration
GoSimplicity Oct 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .air.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ bin = "tmp/ai-cloudops"
cmd = "go build -o ./tmp/ai-cloudops main.go"

# 自定义二进制文件
full_bin = "APP_ENV=development ./tmp/ai-cloudops"
full_bin = "ENV=development ./tmp/ai-cloudops" # SEC-27:后端只读 ENV,APP_ENV 不生效;未设置/未知取值拒绝启动

# 监控的文件扩展名
include_ext = ["go", "yaml", "yml", "json", "toml"]
Expand Down
5 changes: 3 additions & 2 deletions .githooks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
### 执行步骤

1. **`go generate ./...`** - 自动生成代码(如Wire依赖注入、Swagger文档等)
2. **代码格式化** - 自动运行`go fmt`并将格式化后的文件添加到暂存区
2. **代码格式检查** - 对暂存的 `.go` 文件的暂存版本运行 `gofmt -l`,不规范则拒绝提交(钩子不会修改或暂存任何文件)
3. **静态分析** - 运行`go vet`检查潜在问题
4. **编译检查** - 运行`go build`确保代码可以正常编译

Expand Down Expand Up @@ -43,7 +43,8 @@ wire: no provider found for invalid type
4. 临时跳过:`SKIP_GENERATE=1 git commit -m "你的消息"`

#### 格式化问题
钩子会自动格式化代码并添加到暂存区,无需手动处理。
钩子只检查、不自动格式化,也不会执行 `git add`(避免把未经 gitleaks 扫描的工作区改动带进提交)。
按提示执行 `gofmt -w <文件>`,确认改动后重新 `git add` 再提交。

#### 编译错误
解决所有编译错误后重新提交,或使用`SKIP_BUILD=1`临时跳过。
Expand Down
168 changes: 154 additions & 14 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,137 @@ if [ -n "$SKIP_GENERATE" ] || [ -n "$SKIP_VET" ] || [ -n "$SKIP_BUILD" ]; then
[ "$SKIP_BUILD" = "1" ] && echo " - SKIP_BUILD=1 (跳过编译检查)"
fi

# ---------------------------------------------------------------------------
# gitleaks: block commits that stage secrets (SEC-01A)
# ---------------------------------------------------------------------------
# gitleaks 最低版本 8.25.0(review3g N6):.gitleaks.toml 使用多个 [[allowlists]](含 targetRules/condition),
# 该写法自 8.25.0 起才支持;更低版本的策略语义不同,且 8.19 之前没有 `gitleaks git --staged`。
# 只接受 gitleaks version 输出的严格形式 X.Y.Z(可带前缀 v;每段为不带前导零、最多 6 位的十进制数字),无法解析一律视为不满足。
GITLEAKS_MIN_MAJOR=8
GITLEAKS_MIN_MINOR=25
gitleaks_version_check() {
gl_ver_raw="$(gitleaks version 2>/dev/null | head -n 1)"
gl_ver="${gl_ver_raw#v}"
case "$gl_ver" in *.*.*) ;; *) return 2 ;; esac
gl_major="${gl_ver%%.*}"; gl_rest="${gl_ver#*.}"
gl_minor="${gl_rest%%.*}"; gl_patch="${gl_rest#*.}"
# review3h P3-i:三段都只能是十进制数字,不允许前导零(单独的 0 除外),每段最多 6 位;
# 过长的数字直接视为无法解析,不交给 [ ] 做整数比较(溢出时 [ ] 报错,会被误判成“版本过低”)
for gl_c in "$gl_major" "$gl_minor" "$gl_patch"; do
case "$gl_c" in ''|*[!0-9]*|0?*|???????*) return 2 ;; esac
done
if [ "$gl_major" -gt "$GITLEAKS_MIN_MAJOR" ]; then return 0; fi
if [ "$gl_major" -eq "$GITLEAKS_MIN_MAJOR" ] && [ "$gl_minor" -ge "$GITLEAKS_MIN_MINOR" ]; then return 0; fi
return 1
}
run_gitleaks_staged() {
if ! command -v gitleaks >/dev/null 2>&1; then
echo "[PRE-COMMIT ERROR] 未找到 gitleaks,已阻止提交。" >&2
echo " 安装: https://github.com/gitleaks/gitleaks/releases (校验 sha256 后放入 PATH)" >&2
echo " 然后执行: scripts/setup-git-hooks.sh" >&2
exit 1
fi
gl_vrc=0; gitleaks_version_check || gl_vrc=$?
if [ "$gl_vrc" -ne 0 ]; then
if [ "$gl_vrc" -eq 2 ]; then
echo "[PRE-COMMIT ERROR] 无法解析 gitleaks 版本(gitleaks version 输出: ${gl_ver_raw:-<空>}),需要 >= ${GITLEAKS_MIN_MAJOR}.${GITLEAKS_MIN_MINOR}.0,已阻止提交。" >&2
else
echo "[PRE-COMMIT ERROR] gitleaks 版本 ${gl_ver_raw} 低于 ${GITLEAKS_MIN_MAJOR}.${GITLEAKS_MIN_MINOR}.0,已阻止提交。" >&2
fi
echo " 请升级: https://github.com/gitleaks/gitleaks/releases (校验 sha256 后放入 PATH)" >&2
exit 1
fi
local repo_root tmpd f
repo_root="$(git rev-parse --show-toplevel)" || { echo "[PRE-COMMIT ERROR] 无法确定仓库根目录" >&2; exit 1; }
# 策略文件只取暂存区(index)版本,与被扫描的暂存内容一致(review3g P3-1)。
# gitleaks 默认读取工作区的 .gitleaks.toml,且总会自动读取“源目录/.gitleaksignore”(工作区文件):
# 未跟踪或与暂存区不一致的放行配置/指纹会在提交时生效却不进入提交。因此这两个文件只要是未跟踪、
# 或工作区与暂存区不一致(含工作区中删除、换成符号链接),一律拒绝提交,请先暂存(git add)或还原(git restore)。
# review3h P3-a:git diff 不比较被标记为 skip-worktree / assume-unchanged 的文件(会被绕过),这里改为:
# 1) git ls-files -v 的标记必须是 "H"(S=skip-worktree,小写=assume-unchanged,M=未合并,一律拒绝);
# 2) 直接比对暂存区 blob 与工作区文件的字节(git show ":<f>" | cmp),不依赖 git 的索引状态缓存。
# (启用 core.autocrlf / clean 过滤器时字节比对可能误拒,属于 fail-closed,按提示处理即可。)
tmpd="$(mktemp -d "${TMPDIR:-/tmp}/gitleaks-hook.XXXXXX")" || { echo "[PRE-COMMIT ERROR] mktemp 失败" >&2; exit 1; }
for f in .gitleaks.toml .gitleaksignore; do
if git -C "$repo_root" ls-files --error-unmatch -- "$f" >/dev/null 2>&1; then
git -C "$repo_root" ls-files -v -- "$f" >"$tmpd/tag" 2>/dev/null || { rm -rf "$tmpd"; echo "[PRE-COMMIT ERROR] 无法读取 $f 的索引标记" >&2; exit 1; }
gl_tag="$(sed -n '1s/ .*//p' "$tmpd/tag")"
if [ "$gl_tag" != "H" ]; then
rm -rf "$tmpd"
echo "[PRE-COMMIT ERROR] $f 在索引中带有 skip-worktree / assume-unchanged / 未合并标记(git ls-files -v: ${gl_tag:-<空>}),工作区修改会被 git 忽略,已阻止提交。" >&2
echo " 请执行 git update-index --no-skip-worktree --no-assume-unchanged -- $f,确认工作区与暂存区一致后重新提交。" >&2
exit 1
fi
if [ -L "$repo_root/$f" ] || [ ! -f "$repo_root/$f" ]; then
rm -rf "$tmpd"
echo "[PRE-COMMIT ERROR] $f 有未暂存的修改(在工作区中被删除或不是普通文件),gitleaks 策略只认暂存区版本,已阻止提交。" >&2
echo " 请先 git add $f 或 git restore $f 后重新提交。" >&2
exit 1
fi
# 先写文件再 cmp(不用管道:pipefail 下 cmp 提前退出会让 git show 收到 SIGPIPE)
if ! git -C "$repo_root" show ":$f" >"$tmpd/index-copy" 2>/dev/null || ! cmp -s "$tmpd/index-copy" "$repo_root/$f"; then
rm -rf "$tmpd"
echo "[PRE-COMMIT ERROR] $f 有未暂存的修改(工作区与暂存区内容不一致),gitleaks 策略只认暂存区版本,已阻止提交。" >&2
echo " 请先 git add $f 或 git restore $f 后重新提交。" >&2
exit 1
fi
elif [ -e "$repo_root/$f" ] || [ -L "$repo_root/$f" ]; then
rm -rf "$tmpd"
echo "[PRE-COMMIT ERROR] $f 未跟踪(不在暂存区),会被 gitleaks 读取却不进入提交,已阻止提交。" >&2
echo " 请先 git add $f 或删除该文件后重新提交。" >&2
exit 1
fi
done
rm -f "$tmpd/tag" "$tmpd/index-copy"
if git -C "$repo_root" cat-file -e ":.gitleaks.toml" 2>/dev/null; then
git -C "$repo_root" show ":.gitleaks.toml" >"$tmpd/gitleaks.toml" || { rm -rf "$tmpd"; echo "[PRE-COMMIT ERROR] 无法读取暂存区的 .gitleaks.toml" >&2; exit 1; }
# review3h P3-a:与 CI 相同,用 gitleaks-config-check.py 检查暂存区配置([extend] path 会读取工作区文件,拒绝)。
# 检查脚本同样取暂存区版本(工作区里未暂存的改动不能让检查放水);缺脚本、缺 python3 / tomllib(3.11+)均拒绝。
if ! git -C "$repo_root" show ":.github/scripts/gitleaks-config-check.py" >"$tmpd/gitleaks-config-check.py" 2>/dev/null; then
rm -rf "$tmpd"
echo "[PRE-COMMIT ERROR] 暂存区缺少 .github/scripts/gitleaks-config-check.py,无法检查 .gitleaks.toml,已阻止提交。" >&2
exit 1
fi
if ! command -v python3 >/dev/null 2>&1; then
rm -rf "$tmpd"
echo "[PRE-COMMIT ERROR] 缺少 python3(需要 3.11+ 的 tomllib)检查 .gitleaks.toml,已阻止提交。" >&2
exit 1
fi
if ! python3 "$tmpd/gitleaks-config-check.py" "$tmpd/gitleaks.toml"; then
rm -rf "$tmpd"
echo "[PRE-COMMIT ERROR] 暂存区的 .gitleaks.toml 未通过 gitleaks-config-check.py 检查(见上一行),已阻止提交。" >&2
exit 1
fi
else
# 暂存区没有配置:显式使用默认规则(不受 GITLEAKS_CONFIG 等环境变量影响)
printf '[extend]\nuseDefault = true\n' >"$tmpd/gitleaks.toml"
fi
if git -C "$repo_root" cat-file -e ":.gitleaksignore" 2>/dev/null; then
git -C "$repo_root" show ":.gitleaksignore" >"$tmpd/gitleaksignore" || { rm -rf "$tmpd"; echo "[PRE-COMMIT ERROR] 无法读取暂存区的 .gitleaksignore" >&2; exit 1; }
else
: >"$tmpd/gitleaksignore"
fi
# [extend] path 已由上面的 gitleaks-config-check.py 拒绝(review3h P3-a;此前为残余风险)。
# --ignore-gitleaks-allow:源码里的 "gitleaks:allow" 行内注释不再豁免任何发现(任何人都能在密钥行后加这条注释);
# 误报只能在 .gitleaks.toml 中按值精确放行(SEC-01A 第三轮 P3-1)。
# 已保证 >= 8.25.0,直接使用 `gitleaks git --staged`(不再回退到旧的 `gitleaks protect --staged`,review3g N6)。
gitleaks git --pre-commit --staged --redact --no-banner --verbose --ignore-gitleaks-allow \
--config "$tmpd/gitleaks.toml" --gitleaks-ignore-path "$tmpd/gitleaksignore" "$repo_root"
local rc=$?
rm -rf "$tmpd"
if [ $rc -ne 0 ]; then
echo "" >&2
echo "[PRE-COMMIT ERROR] gitleaks 在暂存内容中发现疑似密钥(以上输出已脱敏),提交已被阻止。" >&2
echo " 请移除密钥并改为环境变量/密钥管理;若确属误报,请在 .gitleaks.toml 中添加带注释的窄范围 allowlist。" >&2
exit 1
fi
echo "[PRE-COMMIT] gitleaks: 暂存内容未发现密钥"
}
run_gitleaks_staged

# 记录 gitleaks 扫描时的暂存区快照。后续步骤不得修改暂存区(否则新暂存的内容未经扫描)。
INDEX_TREE_SCANNED="$(git write-tree)" || error_exit "无法读取暂存区(git write-tree 失败)"

# 检查是否有Go文件变更
if git diff --cached --quiet -- '*.go'; then
warning_msg "未检测到 Go 文件变更,跳过Go相关检查"
Expand Down Expand Up @@ -70,20 +201,24 @@ else
success_msg "go generate 执行成功"
fi

# 2. 代码格式化检查和自动修复
info_msg "步骤 2/4: 检查代码格式..."

# 查找所有需要格式化的Go文件
UNFORMATTED_FILES=$(go fmt ./...)
if [ -n "$UNFORMATTED_FILES" ]; then
warning_msg "以下文件已自动格式化:"
echo "$UNFORMATTED_FILES"

# 将格式化后的文件添加到暂存区
for file in $UNFORMATTED_FILES; do
git add "$file"
done
warning_msg "格式化后的文件已自动添加到暂存区"
# 2. 代码格式检查(只检查,不修改、不暂存)
# 只检查“暂存的” .go 文件的“暂存版本”内容(git cat-file blob :path),与 gitleaks 扫描的内容一致。
# 旧实现在 gitleaks 之后执行 `go fmt ./...` 并 `git add`,会把工作区中未暂存的改动(甚至从未暂存过的
# .go 文件)连同其中未经扫描的密钥一起加入提交(SEC-01A 审查 G1/G2),已移除。
info_msg "步骤 2/4: 检查暂存的 Go 文件格式 (gofmt)..."
command -v gofmt >/dev/null 2>&1 || error_exit "未找到 gofmt,无法检查代码格式"
UNFORMATTED_FILES=()
while IFS= read -r -d '' file; do
if [ -n "$(git cat-file blob ":$file" | gofmt -l 2>&1)" ]; then
UNFORMATTED_FILES+=("$file")
fi
done < <(git diff --cached --name-only --diff-filter=ACMR -z -- '*.go')
if [ ${#UNFORMATTED_FILES[@]} -gt 0 ]; then
echo -e "${RED}[PRE-COMMIT ERROR]${NC} 以下暂存的 Go 文件未按 gofmt 格式化(检查的是暂存版本):"
printf ' %s\n' "${UNFORMATTED_FILES[@]}"
echo "请自行格式化并重新暂存后再提交,例如:"
echo " gofmt -w <文件> && git add -p <文件> # 注意只暂存你确认要提交的内容"
exit 1
fi
success_msg "代码格式检查完成"

Expand Down Expand Up @@ -124,5 +259,10 @@ if [ -n "$GENERATED_FILES" ]; then
warning_msg "请检查这些文件是否应该被提交,如需要请手动 git add"
fi

# 防御性检查:gitleaks 扫描之后暂存区不得被任何步骤修改(如 go generate 的副作用),否则拒绝提交。
if [ "$(git write-tree)" != "$INDEX_TREE_SCANNED" ]; then
error_exit "gitleaks 扫描后暂存区发生了变化,新暂存的内容未经密钥扫描,已阻止提交。请检查后重新 git commit。"
fi

success_msg "所有检查通过,准备提交"
exit 0
98 changes: 98 additions & 0 deletions .github/scripts/gitleaks-base-config.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#!/usr/bin/env bash
# 从“基准提交”取出 gitleaks 配置与指纹忽略列表,供 CI 扫描使用(SEC-01A 第三轮 P3-1)。
#
# 用法: bash .github/scripts/gitleaks-base-config.sh <扫描范围> <输出目录>
# <扫描范围> 为 gitleaks-range.sh 的输出("A..B" 或 "B")。
# 输出: <输出目录>/gitleaks.toml、<输出目录>/gitleaksignore(总是生成,供 --config / --gitleaks-ignore-path 使用)
# 环境变量(与 gitleaks-range.sh 相同,来自 GitHub 事件上下文,必填 EVENT_NAME / DEFAULT_BRANCH):
# EVENT_NAME、DEFAULT_BRANCH、REF_NAME、REF_TYPE(push 必填,只接受 branch / tag)、PR_BASE_REF(github.base_ref)、REMOTE(默认 origin)
#
# 策略来源(取哪个提交上的 .gitleaks.toml / .gitleaksignore;review3g N2:扫描起点 ≠ 策略来源):
# push 到默认分支 → 范围起点 A(默认分支上一次的状态);"B"(全量)→ 默认规则、空忽略列表
# push 到其他分支 / tag → <REMOTE>/<默认分支> 的最新提交(不用 before:before 是同一分支上一次推送,
# 攻击者可以先推一个全部放行的 .gitleaks.toml,再推密钥)
# pull_request 目标为默认分支 → 范围起点 A(PR base sha,在默认分支上)
# pull_request 目标为其他分支 / 未知 → <REMOTE>/<默认分支> 的最新提交(同上,非默认分支不受保护)
# 缺少 EVENT_NAME / DEFAULT_BRANCH,或需要 <REMOTE>/<默认分支> 但不存在 → 失败(不回退到范围起点)
#
# 为什么:PR 可以同时提交密钥并修改 .gitleaks.toml / .gitleaksignore 放行它。CI 只信任基准提交上的这两个文件:
# - 策略提交上没有该文件时使用默认配置([extend] useDefault = true)/ 空忽略列表,绝不回退到 HEAD 的文件;
# - gitleaks 总会额外读取“扫描源目录/.gitleaksignore”(即 HEAD 工作区中的文件,8.30.1 实测),
# 因此这里把工作区中的 .gitleaksignore 移走(CI 检出目录是一次性的;该文件的内容仍会被提交扫描覆盖);
# - 基准配置中的 [extend] path 会从当前工作区(HEAD)读取文件,视为不可信,直接失败;
# 检查由 gitleaks-config-check.py(tomllib,Python 3.11+)完成,大小写/点号/内联表等写法都算,缺 tomllib 也失败。
# 局限:本脚本与工作流本身仍来自 PR 的 HEAD,修改 .github/ 的 PR 可以绕过——需要 CODEOWNERS/分支保护(见 README-ops 待办)。
set -euo pipefail

die() { echo "[gitleaks-base-config] ERROR: $*" >&2; exit 1; }
note() { echo "[gitleaks-base-config] $*" >&2; }

[ "$#" -eq 2 ] || die "用法: $0 <扫描范围> <输出目录>"
range="$1"; out="$2"
[ -n "$range" ] || die "扫描范围为空"
REMOTE="${REMOTE:-origin}"
[ -n "${EVENT_NAME:-}" ] || die "缺少 EVENT_NAME,无法确定策略来源(不回退到扫描范围起点)"
[ -n "${DEFAULT_BRANCH:-}" ] || die "缺少 DEFAULT_BRANCH,无法确定策略来源"
mkdir -p "$out"
cfg="$out/gitleaks.toml"; ign="$out/gitleaksignore"

start=""
case "$range" in
*...*) die "不支持的范围格式: $range" ;;
*..*) start="${range%%..*}" ;;
esac
if [ -n "$start" ]; then
git rev-parse --verify --quiet "${start}^{commit}" >/dev/null || die "范围起点提交不存在: $start"
fi

# 策略提交 base:只取默认分支上的提交(见文件头)
use_default_tip=0
case "$EVENT_NAME" in
push)
# review3h P3-i:REF_TYPE 只接受 branch / tag(区分大小写),空值或其他写法失败,不再默认当作 branch
case "${REF_TYPE:-}" in
branch|tag) ;;
*) die "REF_TYPE=${REF_TYPE:-<空>} 无效(只接受 branch / tag),无法确定策略来源" ;;
esac
if [ "$REF_TYPE" = "branch" ] && [ "${REF_NAME:-}" = "$DEFAULT_BRANCH" ]; then
base="$start"
else
use_default_tip=1
fi ;;
pull_request|pull_request_target)
if [ "${PR_BASE_REF:-}" = "$DEFAULT_BRANCH" ]; then base="$start"; else use_default_tip=1; fi ;;
*) die "不支持的事件类型: $EVENT_NAME" ;;
esac
if [ "$use_default_tip" -eq 1 ]; then
default_ref="refs/remotes/${REMOTE}/${DEFAULT_BRANCH}"
base="$(git rev-parse --verify -q "${default_ref}^{commit}")" \
|| die "推送/PR 目标不是默认分支,策略须取自 ${REMOTE}/${DEFAULT_BRANCH},但本地没有该引用(actions/checkout 需 fetch-depth: 0)"
note "目标不是默认分支(${REF_TYPE:-?} ${REF_NAME:-?}${PR_BASE_REF:+,PR 目标 $PR_BASE_REF}):策略取自 ${REMOTE}/${DEFAULT_BRANCH}(${base}),不用扫描起点 ${start:-<无>}"
else
note "策略取自默认分支上的范围起点 ${base:-(无,全量扫描)}"
fi

if [ -n "$base" ] && git cat-file -e "${base}:.gitleaks.toml" 2>/dev/null; then
git show "${base}:.gitleaks.toml" >"$cfg"
note "使用基准 ${base} 上的 .gitleaks.toml"
# [extend] path 会从工作区(HEAD)读取,不可信;用 TOML 解析器按 gitleaks(viper)的规则检查(review3g N1)
command -v python3 >/dev/null 2>&1 || die "缺少 python3(需要 3.11+ 的 tomllib)检查基准 .gitleaks.toml 的 [extend],拒绝继续"
python3 "$(dirname "$0")/gitleaks-config-check.py" "$cfg" \
|| die "基准 .gitleaks.toml 未通过 [extend] 检查(见上一行),拒绝使用"
else
printf '# 基准提交上没有 .gitleaks.toml:使用 gitleaks 默认规则(不使用 HEAD 的配置)\n[extend]\nuseDefault = true\n' >"$cfg"
note "基准 ${base:-(无,全量扫描)} 上没有 .gitleaks.toml,使用 gitleaks 默认规则"
fi

if [ -n "$base" ] && git cat-file -e "${base}:.gitleaksignore" 2>/dev/null; then
git show "${base}:.gitleaksignore" >"$ign"
note "使用基准 ${base} 上的 .gitleaksignore"
else
: >"$ign"
note "基准 ${base:-(无,全量扫描)} 上没有 .gitleaksignore,使用空忽略列表"
fi

if [ -e .gitleaksignore ]; then
mv .gitleaksignore "$out/head.gitleaksignore"
note "已移走工作区中的 .gitleaksignore(HEAD 版本,不作为忽略列表使用)"
fi
Loading
Loading