Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0ddcc5e935 | |||
| 0c6957fcb5 |
@@ -225,6 +225,10 @@ cat > "${WORK}/sysext.entitlements" <<PLIST
|
||||
<key>com.apple.developer.networking.networkextension</key>
|
||||
<array><string>packet-tunnel-provider-systemextension</string></array>
|
||||
<key>com.apple.security.app-sandbox</key><true/>
|
||||
<!-- 沙箱 sysext 必须显式网络权限才能对外建连/收发(同仓库 PacketTunnel.entitlements)。
|
||||
曾漏掉这两键 → 隧道扩展被沙箱拒绝出站,连不上节点(v1.1.2 事故,连上隧道但不通)。 -->
|
||||
<key>com.apple.security.network.client</key><true/>
|
||||
<key>com.apple.security.network.server</key><true/>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array><string>${APP_GROUP}</string></array>
|
||||
</dict></plist>
|
||||
@@ -275,6 +279,12 @@ case "$MACH" in
|
||||
"${APP_GROUP}"*) ;;
|
||||
*) echo "ERROR: NEMachServiceName(${MACH:-<missing>}) 必须以 App Group(${APP_GROUP}) 为前缀,否则 sysextd 校验失败 Code=6" >&2; exit 1 ;;
|
||||
esac
|
||||
# 沙箱 sysext 无 network.client/server = 无权对外建连 → 隧道起了也连不上节点(v1.1.2 事故)。
|
||||
SE_NC="$(/usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.client' "${WORK}/se.signed.plist" 2>/dev/null || true)"
|
||||
SE_NS="$(/usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.server' "${WORK}/se.signed.plist" 2>/dev/null || true)"
|
||||
echo " sysext network.client=${SE_NC:-<missing>} network.server=${SE_NS:-<missing>}"
|
||||
[ "$SE_NC" = "true" ] || { echo "ERROR: sysext 缺 com.apple.security.network.client —— 沙箱扩展无权出站,隧道连不上节点" >&2; exit 1; }
|
||||
[ "$SE_NS" = "true" ] || { echo "ERROR: sysext 缺 com.apple.security.network.server" >&2; exit 1; }
|
||||
echo " OK: ${APP_GROUP}"
|
||||
|
||||
# ── [7/7] 公证(notarytool,API key 三件套) + staple + 打包 ──────────────────
|
||||
|
||||
@@ -112,6 +112,10 @@ PLIST
|
||||
<key>com.apple.developer.networking.networkextension</key>
|
||||
<array><string>packet-tunnel-provider-systemextension</string></array>
|
||||
<key>com.apple.security.app-sandbox</key><true/>
|
||||
<!-- 沙箱 sysext 必须显式网络权限才能对外建连(同仓库 PacketTunnel.entitlements;
|
||||
v1.1.2 CI 重签漏掉这两键 → 隧道连不上节点)。 -->
|
||||
<key>com.apple.security.network.client</key><true/>
|
||||
<key>com.apple.security.network.server</key><true/>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array><string>${APP_GROUP}</string></array>
|
||||
</dict></plist>
|
||||
@@ -142,6 +146,13 @@ verify_app_group(){
|
||||
"$APP_GROUP"*) ;;
|
||||
*) die "NEMachServiceName($mach)必须以 App Group($APP_GROUP)为前缀,否则 sysextd 校验失败 Code=6" ;;
|
||||
esac
|
||||
# 沙箱 sysext 无 network.client/server = 无权对外建连 → 隧道起了也连不上节点(v1.1.2 事故)。
|
||||
local se_nc se_ns
|
||||
se_nc="$(/usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.client' "$WORK/se.ents.plist" 2>/dev/null || true)"
|
||||
se_ns="$(/usr/libexec/PlistBuddy -c 'Print :com.apple.security.network.server' "$WORK/se.ents.plist" 2>/dev/null || true)"
|
||||
echo " sysext network.client=${se_nc:-<缺失>} network.server=${se_ns:-<缺失>}"
|
||||
[ "$se_nc" = "true" ] || die "sysext 缺 com.apple.security.network.client —— 沙箱扩展无权出站,隧道连不上节点"
|
||||
[ "$se_ns" = "true" ] || die "sysext 缺 com.apple.security.network.server"
|
||||
echo " ✅ 一致($APP_GROUP)"
|
||||
}
|
||||
|
||||
|
||||
+36
-36
@@ -327,12 +327,12 @@ header .header-meta{color:var(--fg-soft)}
|
||||
<header>
|
||||
<div class="wrap">
|
||||
<h1>feature+windows — 项目 TODO</h1>
|
||||
<div class="header-meta">生成于 2026-08-08 · 真相源 todo/todo.json</div>
|
||||
<div class="header-meta">生成于 2026-08-09 · 真相源 todo/todo.json</div>
|
||||
<div class="stats">
|
||||
<div class="stat-pill"><strong>29</strong>全部</div>
|
||||
<div class="stat-pill"><strong>16</strong>待开始</div>
|
||||
<div class="stat-pill"><strong>15</strong>待开始</div>
|
||||
<div class="stat-pill"><strong>0</strong>开发中</div>
|
||||
<div class="stat-pill"><strong>5</strong>待验收</div>
|
||||
<div class="stat-pill"><strong>6</strong>待验收</div>
|
||||
<div class="stat-pill"><strong>8</strong>已验收</div>
|
||||
|
||||
</div>
|
||||
@@ -376,43 +376,12 @@ header .header-meta{color:var(--fg-soft)}
|
||||
|
||||
<div class="section-block" id="section-open">
|
||||
<div class="section-title st-open" data-toggle="open">
|
||||
📋 待开始 <span class="s-count">16</span>
|
||||
📋 待开始 <span class="s-count">15</span>
|
||||
<span class="s-arrow">▴ 收起</span>
|
||||
</div>
|
||||
<div class="section-list-wrap " id="list-wrap-open">
|
||||
<ul class="todo-list" id="list-open">
|
||||
|
||||
<li class="todo-card s-open"
|
||||
data-id="28"
|
||||
data-level="high"
|
||||
data-status="open"
|
||||
data-tier="2"
|
||||
data-tags="mac,CI/CD">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#28</span>
|
||||
<span class="item-title">修复 macOS PacketTunnel 系统扩展 App Group 不一致导致装不上</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-open">待开始</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-2">二级</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">根因:scripts/ci/compile-macos.sh 第 221 行把 sysext 的 application-groups 硬编码成 iOS 风格的 group.com.pangolin.pangolin,且第 195-210 行生成的 app.entitlements 完全没有 application-groups 键。二者与扩展 Info.plist 里的 NEMachServiceName(BYL4KQHMTN.com.pangolin.pangolin.PacketTunnel)对不上前缀 —— nesessionmanager 报 NetworkExtensionErrorDomain Code=6,sysextd 校验失败当场卸载刚 staging 的新扩展;VpnChannel.start() 的 step1 activateSystemExtensionIfNeeded 抛 code=9,永远走不到 step2 的 loadOrCreateManager,NETunnelProviderManager 配置建不出来,scutil --nc list 里没有 Pangolin,客户端一个包都发不到服务器(服务端侧该 Mac 出口 IP 的握手尝试数为 0)。这违反了 CLAUDE.md 第 152 行已写明的铁律。注意这两个 entitlements 是 codesign --force 最终覆盖签名用的,仓库里的 .entitlements 源文件只在 Xcode 编译阶段生效,所以线上包坏而本地 all 流程正常。修复:compile-macos.sh 两处改用脚本第 99 行已定义的 APP_GROUP 变量,app.entitlements 补 application-groups。scripts/local_test.sh 的同款硬编码本次已修,并新增 verify_app_group 一致性闸(读最终产物签名,比对两端 App Group 与 NEMachServiceName 前缀)和 macos 一条龙子命令。建议把同样的闸加进 .gitea/workflows/ci.yml。改完需重新构建+公证+替换 api.yanmeiai.com/downloads/pangolin-macos-x64.zip。附带:受影响机器会堆积多个 terminated waiting to uninstall on reboot 的旧扩展(本机 13 个,已 38 天未重启),建议重启清理。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="CI/CD">CI/CD</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-08-08</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-open"
|
||||
data-id="29"
|
||||
data-level="high"
|
||||
@@ -893,12 +862,43 @@ header .header-meta{color:var(--fg-soft)}
|
||||
</div>
|
||||
<div class="section-block" id="section-done">
|
||||
<div class="section-title st-done" data-toggle="done">
|
||||
🔍 待验收 <span class="s-count">5</span>
|
||||
🔍 待验收 <span class="s-count">6</span>
|
||||
<span class="s-arrow">▴ 收起</span>
|
||||
</div>
|
||||
<div class="section-list-wrap " id="list-wrap-done">
|
||||
<ul class="todo-list" id="list-done">
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="28"
|
||||
data-level="high"
|
||||
data-status="done"
|
||||
data-tier="2"
|
||||
data-tags="mac,CI/CD">
|
||||
<div class="card-header">
|
||||
<span class="item-id">#28</span>
|
||||
<span class="item-title">修复 macOS PacketTunnel 系统扩展 App Group 不一致导致装不上</span>
|
||||
<div class="card-badges">
|
||||
<span class="tag status-badge s-done">待验收</span>
|
||||
<span class="tag t-block">高优 · 紧急</span>
|
||||
<span class="tag tier-2">二级</span>
|
||||
|
||||
<button class="reject-btn" data-id="28" data-title="修复 macOS PacketTunnel 系统扩展 App Group 不一致导致装不上">拒绝验收</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="item-desc">根因:scripts/ci/compile-macos.sh 第 221 行把 sysext 的 application-groups 硬编码成 iOS 风格的 group.com.pangolin.pangolin,且第 195-210 行生成的 app.entitlements 完全没有 application-groups 键。二者与扩展 Info.plist 里的 NEMachServiceName(BYL4KQHMTN.com.pangolin.pangolin.PacketTunnel)对不上前缀 —— nesessionmanager 报 NetworkExtensionErrorDomain Code=6,sysextd 校验失败当场卸载刚 staging 的新扩展;VpnChannel.start() 的 step1 activateSystemExtensionIfNeeded 抛 code=9,永远走不到 step2 的 loadOrCreateManager,NETunnelProviderManager 配置建不出来,scutil --nc list 里没有 Pangolin,客户端一个包都发不到服务器(服务端侧该 Mac 出口 IP 的握手尝试数为 0)。这违反了 CLAUDE.md 第 152 行已写明的铁律。注意这两个 entitlements 是 codesign --force 最终覆盖签名用的,仓库里的 .entitlements 源文件只在 Xcode 编译阶段生效,所以线上包坏而本地 all 流程正常。修复:compile-macos.sh 两处改用脚本第 99 行已定义的 APP_GROUP 变量,app.entitlements 补 application-groups。scripts/local_test.sh 的同款硬编码本次已修,并新增 verify_app_group 一致性闸(读最终产物签名,比对两端 App Group 与 NEMachServiceName 前缀)和 macos 一条龙子命令。建议把同样的闸加进 .gitea/workflows/ci.yml。改完需重新构建+公证+替换 api.yanmeiai.com/downloads/pangolin-macos-x64.zip。附带:受影响机器会堆积多个 terminated waiting to uninstall on reboot 的旧扩展(本机 13 个,已 38 天未重启),建议重启清理。</div>
|
||||
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="tag-row"><span class="tag t-tag" data-tag="mac">mac</span> <span class="tag t-tag" data-tag="CI/CD">CI/CD</span></div>
|
||||
<div class="item-meta">
|
||||
<span class="tag owner-agent">🤖 agent</span>
|
||||
<span class="meta-date">🕐 2026-08-08</span>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="todo-card s-done"
|
||||
data-id="18"
|
||||
data-level="mid"
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "feature+windows — 项目 TODO",
|
||||
"updated_at": "2026-08-08T01:41:54.388Z"
|
||||
"updated_at": "2026-08-08T16:07:14.004Z"
|
||||
},
|
||||
"seq": 30,
|
||||
"items": [
|
||||
@@ -441,7 +441,7 @@
|
||||
"CI/CD"
|
||||
],
|
||||
"owner": "agent",
|
||||
"status": "open",
|
||||
"status": "done",
|
||||
"created_at": "2026-08-08T01:20:23.304Z",
|
||||
"done": false,
|
||||
"completed_at": null,
|
||||
|
||||
Reference in New Issue
Block a user