fix(desktop): make locally-built macOS app relaunchable after in-place self-update (#36198)
On macOS the desktop app is built locally and ad-hoc signed (no Developer ID on the user's machine). An ad-hoc bundle has no stable Designated Requirement, so when the self-updater rebuilds it in place with a fresh build (new cdhash) — plus the com.apple.quarantine flag inherited from the downloaded installer process chain — Gatekeeper/LaunchServices treats the changed code as tampering and macOS reports "Hermes is damaged and can't be opened," and the app fails to relaunch. First launch works (fresh registration); the in-place update relaunch is what breaks. Fix: after building the desktop app locally, strip quarantine xattrs and re-apply a clean deep ad-hoc signature (omitting the hardened-runtime flag, which an ad-hoc build can't satisfy). Applied in both build entry points: - hermes_cli/main.py cmd_gui (the `hermes desktop --build-only` path the updater drives) — so the fix ships via `hermes update` (git), no installer re-download needed. - scripts/install.sh install_desktop (first install) for parity. Both are no-ops on non-macOS and when a real signing identity (CSC_LINK / APPLE_SIGNING_IDENTITY) is configured, so signed/notarized builds are untouched.
This commit is contained in:
@ -2390,6 +2390,18 @@ install_desktop() {
|
||||
fi
|
||||
log_success "Desktop app built: $app"
|
||||
|
||||
# macOS: make the locally-built (ad-hoc) app relaunchable after an in-place
|
||||
# self-update. An ad-hoc bundle has no stable Designated Requirement, so a
|
||||
# later in-place rebuild (new cdhash) plus the inherited quarantine flag
|
||||
# trips Gatekeeper's tamper check ("Hermes is damaged and can't be opened").
|
||||
# Strip quarantine + re-apply a clean deep ad-hoc signature (no
|
||||
# hardened-runtime flag, which an ad-hoc build can't satisfy). Skipped when a
|
||||
# real signing identity is configured so a signed build isn't clobbered.
|
||||
if [ "$OS" = "macos" ] && [ -z "${CSC_LINK:-}" ] && [ -z "${APPLE_SIGNING_IDENTITY:-}" ] && command -v codesign >/dev/null 2>&1; then
|
||||
xattr -cr "$app" 2>/dev/null || true
|
||||
codesign --force --deep --sign - "$app" >/dev/null 2>&1 || true
|
||||
fi
|
||||
|
||||
# `npm install` + `npm run pack` rewrite lockfiles; restore them so the
|
||||
# checkout stays clean for the next `hermes update`.
|
||||
restore_dirty_lockfiles "$INSTALL_DIR"
|
||||
|
||||
Reference in New Issue
Block a user