Fix App Store CloudVPN extension signing

Merged
AZ
17d ago
+113-1

Summary

The App Store official TestFlight lane exported CloudVPN.appex with its packet-tunnel provisioning profile but without the com.apple.developer.networking.networkextension entitlement. The local CI gate correctly rejected the IPA before upload.

This change re-signs CloudVPN.appex from its embedded profile and the checked-in CloudVPN entitlement contract before the host app is sealed. It validates the exact bundle identifier, packet-tunnel capability, and host keychain group.

Validation

  • Red regression: python3 -m unittest ios/tests/test_appstore_entitlements.py fails on the test-only commit because resign_cloud_vpn_extension is absent.
  • Green regression: python3 -m unittest ios/tests/test_appstore_entitlements.py passes after the fix (3 tests).
  • bash -n ios/scripts/upload-testflight.sh
  • git diff --check

Changelog

Fixed: preserve the CloudVPN packet-tunnel entitlement in App Store/TestFlight exports.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


Summary by cubic

Fixes App Store exports dropping the CloudVPN packet-tunnel entitlement during manual re-signing, which previously made the IPA fail the local CI gate.

Bug Fixes

  • Re-signs CloudVPN.appex from its embedded provisioning profile plus the checked-in entitlement contract, before the host app is sealed. Applies to App Store exports only; beta exports keep their existing signing path.
  • Validates the exact bundle ID, packet-tunnel-provider capability, and host keychain group.
  • Adds a regression test for the new resigning step.

Summary by CodeRabbit

  • Bug Fixes
    • Improved reliability of manual TestFlight exports by validating the VPN extension’s provisioning profile and signing it with authorized permissions.
    • Exports now stop with an error when the VPN extension’s profile or permissions are invalid, rather than continuing with an incorrectly signed app.
    • Preserved valid provisioning-profile list permissions when requested values are not authorized, preventing those permissions from being unintentionally cleared.