| 1 |
|
| 2 |
|
| 3 |
|
| 4 |
|
| 5 |
|
| 6 |
|
| 7 |
|
| 8 |
|
| 9 |
|
| 10 |
|
| 11 |
|
| 12 |
|
| 13 |
|
| 14 |
|
| 15 |
|
| 16 |
|
| 17 |
|
| 18 |
|
| 19 |
|
| 20 |
|
| 21 |
|
| 22 |
|
| 23 |
|
| 24 |
|
| 25 |
|
| 26 |
|
| 27 |
|
| 28 |
|
| 29 |
|
| 30 |
|
| 31 |
|
| 32 |
|
| 33 |
|
| 34 |
|
| 35 |
|
| 36 |
|
| 37 |
|
| 38 |
|
| 39 |
|
| 40 |
|
| 41 |
|
| 42 |
|
| 43 |
|
| 44 |
|
| 45 |
|
| 46 |
|
| 47 |
|
| 48 |
|
| 49 |
|
| 50 |
|
| 51 |
|
| 52 |
|
| 53 |
set -euo pipefail |
| 54 |
|
| 55 |
|
| 56 |
|
| 57 |
|
| 58 |
|
| 59 |
|
| 60 |
|
| 61 |
|
| 62 |
|
| 63 |
|
| 64 |
|
| 65 |
|
| 66 |
|
| 67 |
: "${BUILD_KEYCHAIN:=$(mktemp -u "${TMPDIR:-/tmp}/bento-build.XXXXXX").keychain-db}" |
| 68 |
|
| 69 |
|
| 70 |
|
| 71 |
|
| 72 |
_BK_STATE_FILE="${BUILD_KEYCHAIN%.keychain-db}.searchlist" |
| 73 |
|
| 74 |
_bk_require_env() { |
| 75 |
local missing=0 |
| 76 |
for v in BUILD_P12_PATH BUILD_P12_PASSWORD BUILD_KEYCHAIN_PASSWORD; do |
| 77 |
if [ -z "${!v:-}" ]; then |
| 78 |
echo "build-keychain: required env $v is unset (source ~/.tauri/passwords.env)" >&2 |
| 79 |
missing=1 |
| 80 |
fi |
| 81 |
done |
| 82 |
if [ -n "${BUILD_P12_PATH:-}" ] && [ ! -f "$BUILD_P12_PATH" ]; then |
| 83 |
echo "build-keychain: BUILD_P12_PATH not found: $BUILD_P12_PATH" >&2 |
| 84 |
echo " Run the one-time GUI .p12 export first (see header of this script)." >&2 |
| 85 |
missing=1 |
| 86 |
fi |
| 87 |
[ "$missing" -eq 0 ] || return 1 |
| 88 |
} |
| 89 |
|
| 90 |
bk_setup() { |
| 91 |
_bk_require_env || return 1 |
| 92 |
|
| 93 |
|
| 94 |
security delete-keychain "$BUILD_KEYCHAIN" 2>/dev/null || true |
| 95 |
|
| 96 |
echo "build-keychain: creating $BUILD_KEYCHAIN" >&2 |
| 97 |
if ! security create-keychain -p "$BUILD_KEYCHAIN_PASSWORD" "$BUILD_KEYCHAIN"; then |
| 98 |
echo "build-keychain: create-keychain FAILED. Over SSH this needs a full" >&2 |
| 99 |
echo " keychain PATH (BUILD_KEYCHAIN=$BUILD_KEYCHAIN) and an active console" >&2 |
| 100 |
echo " login session on the Mac." >&2 |
| 101 |
return 1 |
| 102 |
fi |
| 103 |
|
| 104 |
security set-keychain-settings -lut 21600 "$BUILD_KEYCHAIN" |
| 105 |
security unlock-keychain -p "$BUILD_KEYCHAIN_PASSWORD" "$BUILD_KEYCHAIN" |
| 106 |
|
| 107 |
echo "build-keychain: importing $BUILD_P12_PATH" >&2 |
| 108 |
security import "$BUILD_P12_PATH" -k "$BUILD_KEYCHAIN" -P "$BUILD_P12_PASSWORD" \ |
| 109 |
-T /usr/bin/codesign -T /usr/bin/security -T /usr/bin/productsign |
| 110 |
|
| 111 |
|
| 112 |
|
| 113 |
|
| 114 |
|
| 115 |
|
| 116 |
|
| 117 |
|
| 118 |
|
| 119 |
_bk_import_apple_intermediates |
| 120 |
|
| 121 |
|
| 122 |
|
| 123 |
security set-key-partition-list -S apple-tool:,apple: \ |
| 124 |
-s -k "$BUILD_KEYCHAIN_PASSWORD" "$BUILD_KEYCHAIN" >/dev/null |
| 125 |
|
| 126 |
|
| 127 |
|
| 128 |
local orig |
| 129 |
orig="$(security list-keychains -d user | sed -e 's/^[[:space:]]*//' -e 's/"//g')" |
| 130 |
printf '%s\n' "$orig" > "$_BK_STATE_FILE" |
| 131 |
|
| 132 |
security list-keychains -d user -s "$BUILD_KEYCHAIN" $orig |
| 133 |
|
| 134 |
echo "build-keychain: ready; identity: $(bk_identity_name || echo '??')" >&2 |
| 135 |
|
| 136 |
|
| 137 |
|
| 138 |
|
| 139 |
|
| 140 |
} |
| 141 |
|
| 142 |
|
| 143 |
|
| 144 |
_bk_import_apple_intermediates() { |
| 145 |
local dir cer url |
| 146 |
dir="$(dirname "$BUILD_KEYCHAIN")" |
| 147 |
for cer in DeveloperIDCA.cer DeveloperIDG2CA.cer; do |
| 148 |
url="https://www.apple.com/certificateauthority/$cer" |
| 149 |
if [ ! -f "$dir/$cer" ]; then |
| 150 |
curl -fsS "$url" -o "$dir/$cer" 2>/dev/null \ |
| 151 |
|| { echo "build-keychain: warn: could not fetch $cer" >&2; continue; } |
| 152 |
fi |
| 153 |
security import "$dir/$cer" -k "$BUILD_KEYCHAIN" >/dev/null 2>&1 || true |
| 154 |
done |
| 155 |
} |
| 156 |
|
| 157 |
bk_identity_name() { |
| 158 |
security find-identity -v -p codesigning "$BUILD_KEYCHAIN" \ |
| 159 |
| sed -n 's/.*"\(Developer ID Application:[^"]*\)".*/\1/p' | head -1 |
| 160 |
} |
| 161 |
|
| 162 |
bk_identity_hash() { |
| 163 |
security find-identity -v -p codesigning "$BUILD_KEYCHAIN" \ |
| 164 |
| awk '/Developer ID Application/ {print $2; exit}' |
| 165 |
} |
| 166 |
|
| 167 |
bk_teardown() { |
| 168 |
|
| 169 |
if [ -f "$_BK_STATE_FILE" ]; then |
| 170 |
local orig |
| 171 |
orig="$(cat "$_BK_STATE_FILE")" |
| 172 |
if [ -n "$orig" ]; then |
| 173 |
|
| 174 |
security list-keychains -d user -s $orig 2>/dev/null || true |
| 175 |
fi |
| 176 |
rm -f "$_BK_STATE_FILE" |
| 177 |
fi |
| 178 |
security delete-keychain "$BUILD_KEYCHAIN" 2>/dev/null || true |
| 179 |
echo "build-keychain: torn down $BUILD_KEYCHAIN" >&2 |
| 180 |
} |
| 181 |
|
| 182 |
|
| 183 |
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then |
| 184 |
case "${1:-}" in |
| 185 |
setup) bk_setup ;; |
| 186 |
identity) bk_identity_name ;; |
| 187 |
hash) bk_identity_hash ;; |
| 188 |
teardown) bk_teardown ;; |
| 189 |
*) echo "usage: $0 {setup|identity|hash|teardown}" >&2; exit 2 ;; |
| 190 |
esac |
| 191 |
fi |
| 192 |
|