From 77d6a9c0a7624083ee0ceeb9606c6f94df485bbd Mon Sep 17 00:00:00 2001 From: Ant643isback-back-again Date: Tue, 26 Nov 2024 16:52:53 -0500 Subject: [PATCH] Initial commit --- .github/dependabot.yml | 19 + .github/workflows/sign.yml | 27 + .gitignore | 256 ++++++ .semaphore/semaphore.yml | 28 + README.md | 50 ++ insert_dylib | Bin 0 -> 24704 bytes libhooker/libblackjack.dylib | Bin 0 -> 200032 bytes libhooker/libhooker.dylib | Bin 0 -> 302896 bytes libhooker/libsubstitute.dylib | Bin 0 -> 183040 bytes libhooker/libsubstrate.dylib | Bin 0 -> 183792 bytes libsubstitute/libsubstitute.dylib | Bin 0 -> 368064 bytes libsubstitute/libsubstrate.dylib | Bin 0 -> 150336 bytes libsubstrate/libsubstrate.dylib | Bin 0 -> 123900 bytes node-utils/.gitignore | 135 +++ node-utils/download.js | 42 + node-utils/package-lock.json | 192 +++++ node-utils/package.json | 6 + node-utils/upload.js | 55 ++ pyproject.toml | 2 + sign.py | 1282 +++++++++++++++++++++++++++++ 20 files changed, 2094 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/sign.yml create mode 100644 .gitignore create mode 100644 .semaphore/semaphore.yml create mode 100644 README.md create mode 100755 insert_dylib create mode 100644 libhooker/libblackjack.dylib create mode 100644 libhooker/libhooker.dylib create mode 100644 libhooker/libsubstitute.dylib create mode 100644 libhooker/libsubstrate.dylib create mode 100644 libsubstitute/libsubstitute.dylib create mode 100644 libsubstitute/libsubstrate.dylib create mode 100644 libsubstrate/libsubstrate.dylib create mode 100644 node-utils/.gitignore create mode 100644 node-utils/download.js create mode 100644 node-utils/package-lock.json create mode 100644 node-utils/package.json create mode 100644 node-utils/upload.js create mode 100644 pyproject.toml create mode 100755 sign.py diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..361e795 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/node-utils" + schedule: + interval: "daily" + commit-message: + prefix: "fix" + include: "scope" + open-pull-requests-limit: 20 + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + commit-message: + prefix: "fix" + include: "scope" + open-pull-requests-limit: 20 diff --git a/.github/workflows/sign.yml b/.github/workflows/sign.yml new file mode 100644 index 0000000..8bd98f4 --- /dev/null +++ b/.github/workflows/sign.yml @@ -0,0 +1,27 @@ +name: CI + +on: + workflow_dispatch: + +jobs: + sign: + runs-on: macos-14 + timeout-minutes: 30 + env: + SECRET_URL: "${{ secrets.SECRET_URL }}" + SECRET_KEY: "${{ secrets.SECRET_KEY }}" + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Cache + uses: actions/cache@v4 + with: + path: ~/.fastlane + key: session-${{ github.run_id }} + restore-keys: | + session + + - name: Sign + run: | + PYTHONUNBUFFERED=1 ./sign.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b4795e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,256 @@ +/debug2.sh +/samples/ +/.vscode/ + +# Created by https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,intellij+all +# Edit at https://www.toptal.com/developers/gitignore?templates=python,visualstudiocode,intellij+all + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +# End of https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,intellij+all \ No newline at end of file diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml new file mode 100644 index 0000000..d864a9a --- /dev/null +++ b/.semaphore/semaphore.yml @@ -0,0 +1,28 @@ +version: v1.0 +name: CI +agent: + machine: + type: a1-standard-4 + os_image: macos-xcode15 +execution_time_limit: + minutes: 30 + +blocks: + - name: Sign + task: + jobs: + - name: Sign + commands: + - checkout + - nvm install 20 + - cache restore session + # remove once bundled fastlane >= 2.225.0 + - curl https://mise.jdx.dev/mise-latest-macos-x64 > ~/mise + - chmod +x ~/mise + - ~/mise plugins install https://github.com/mollyIV/asdf-fastlane.git + - ~/mise use -g fastlane + - PYTHONUNBUFFERED=1 ~/mise exec fastlane -- ./sign.py + - cache delete session + - cache store session ~/.fastlane + secrets: + - name: ios-signer diff --git a/README.md b/README.md new file mode 100644 index 0000000..3360472 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# SignTools CI + +This is a free and simple builder for [SignTools](https://github.com/SignTools/SignTools). It uses a Continuous Integration (CI) provider to pull, sign, and upload any iOS apps to your `SignTools`. + +The following providers are supported: + +- [GitHub Actions](https://docs.github.com/en/actions) +- [Semaphore CI](https://semaphoreci.com/) + +You only need to configure one provider. + +## Note on free developer accounts + +Starting from SignTools 3.0, free developer accounts are no longer supported. Check out [SignTools](https://github.com/SignTools/SignTools) for more information. + +## Repository setup + +First you need to create your own `SignTools-CI` repository: + +1. Create a GitHub account +2. Click on the `Use this template` button at the top of this page +3. Give the new project a name and set the visibility to `Private` +4. Create the new project + +Alternatively, you can also manually clone this repo into a new private repository. + +## Provider setup + +You now need to configure a CI provider. **You only need one**: + +### GitHub Actions + +1. [Open](https://github.com/settings/tokens/new) the Personal access token generation page +2. Select (grant) the `workflow` scope +3. Generate the token + +This is the token you need for your `SignTools` service's builder configuration. + +### Semaphore CI + +1. Register for [SemaphoreCI](https://semaphoreci.com/) and create an organization +2. At the top of the organization dashboard, click on `Create New` +3. On the page that opens, press `Choose repository` +4. Authorize SemaphoreCI's app to access your GitHub private repositories in order to see the builder you just created +5. Back on SemaphoreCI's new project page, you will see your builder repository - click on it +6. Proceed with `Continue to workflow setup`, then click `I will use the existing configuration` +7. Go to `Manage Settings` of that repository +8. At the bottom of the page that opens, set `What to build` to `Do not build this project (Pause project)` + +[View](https://me.semaphoreci.com/account) your API Token. This is the token you need for your `SignTools` service's builder configuration. diff --git a/insert_dylib b/insert_dylib new file mode 100755 index 0000000000000000000000000000000000000000..128fd5d2f6f7aba7f13de3c158d915110c7c8eb1 GIT binary patch literal 24704 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

v$4hm4cbSV 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 DuII?s literal 0 HcmV?d00001 diff --git a/libhooker/libsubstitute.dylib b/libhooker/libsubstitute.dylib new file mode 100644 index 0000000000000000000000000000000000000000..80c78a61c71e70d7b59ee373fc98f9d469a8a986 GIT binary patch literal 183040 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 literal 0 HcmV?d00001 diff --git a/libhooker/libsubstrate.dylib b/libhooker/libsubstrate.dylib new file mode 100644 index 0000000000000000000000000000000000000000..79f6073be23de0be8b3b8e90271598f559c46e8c GIT binary patch literal 183792 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ξ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 literal 0 HcmV?d00001 diff --git a/libsubstitute/libsubstrate.dylib b/libsubstitute/libsubstrate.dylib new file mode 100644 index 0000000000000000000000000000000000000000..44b9a230e023232f24800dbc22a9920c548e8f48 GIT binary patch literal 150336 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 TJNGwZ+TZEg(Xk`c`{DgB`?DPd literal 0 HcmV?d00001 diff --git a/libsubstrate/libsubstrate.dylib b/libsubstrate/libsubstrate.dylib new file mode 100644 index 0000000000000000000000000000000000000000..458ce5119b9d6535a2c3c4ec882e7d8f1c64d385 GIT binary patch literal 123900 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 literal 0 HcmV?d00001 diff --git a/node-utils/.gitignore b/node-utils/.gitignore new file mode 100644 index 0000000..e3ec220 --- /dev/null +++ b/node-utils/.gitignore @@ -0,0 +1,135 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test +.env.production + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache +.stylelintcache + +# SvelteKit build / generate output +.svelte-kit + +# End of https://www.toptal.com/developers/gitignore/api/node \ No newline at end of file diff --git a/node-utils/download.js b/node-utils/download.js new file mode 100644 index 0000000..80c7e61 --- /dev/null +++ b/node-utils/download.js @@ -0,0 +1,42 @@ +const { exit } = require("process"); +const EasyDl = require("easydl"); + +var args = process.argv.slice(2); +if (args.length != 3) { + console.log("Usage: download.js DOWNLOAD_URL KEY OUTPUT_FILE"); + exit(1); +} + +var downloadUrl = args[0]; +var key = args[1]; +var outputFile = args[2]; + +var totalBytes = 0; + +new EasyDl(downloadUrl, outputFile, { + connections: 6, + maxRetry: 5, + httpOptions: { + headers: { + Authorization: "Bearer " + key, + }, + }, +}) + .on("metadata", function (metadata) { + totalBytes = metadata.size; + }) + .on("progress", function (data) { + console.log( + data.total.bytes, + totalBytes, + `${data.total.percentage.toFixed(2)}%` + ); + }) + .on("error", function (err) { + console.log(err); + exit(3); + }) + .on("end", function () { + console.log("Download finished!"); + }) + .wait(); diff --git a/node-utils/package-lock.json b/node-utils/package-lock.json new file mode 100644 index 0000000..02dfe33 --- /dev/null +++ b/node-utils/package-lock.json @@ -0,0 +1,192 @@ +{ + "name": "node-utils", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "easydl": "^1.2.0", + "tus-js-client": "^4.2.3" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/combine-errors": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz", + "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==", + "dependencies": { + "custom-error-instance": "2.1.1", + "lodash.uniqby": "4.5.0" + } + }, + "node_modules/custom-error-instance": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz", + "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==", + "license": "ISC" + }, + "node_modules/easydl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/easydl/-/easydl-1.2.0.tgz", + "integrity": "sha512-v0PnU1HGqWd6VAiJY6wwzjsznNVTeFV0YgJcv52qLexR9f5ndsPgwu9Dmf9bGC5j2ZKrO9wqORpulDM7WUBNKA==", + "license": "MIT" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-base64": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", + "license": "BSD-3-Clause" + }, + "node_modules/lodash._baseiteratee": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", + "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==", + "license": "MIT", + "dependencies": { + "lodash._stringtopath": "~4.8.0" + } + }, + "node_modules/lodash._basetostring": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", + "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==", + "license": "MIT" + }, + "node_modules/lodash._baseuniq": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", + "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==", + "license": "MIT", + "dependencies": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "node_modules/lodash._createset": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", + "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==", + "license": "MIT" + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "license": "MIT" + }, + "node_modules/lodash._stringtopath": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", + "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==", + "license": "MIT", + "dependencies": { + "lodash._basetostring": "~4.12.0" + } + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", + "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==", + "license": "MIT", + "dependencies": { + "lodash._baseiteratee": "~4.7.0", + "lodash._baseuniq": "~4.6.0" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/tus-js-client": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-4.2.3.tgz", + "integrity": "sha512-UkQUCeDWKh5AwArcasIJWcL5EP66XPypKQtsdPu82wNnTea8eAUHdpDx3DcfZgDERAiCII895zMYkXri4M1wzw==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.1.2", + "combine-errors": "^3.0.3", + "is-stream": "^2.0.0", + "js-base64": "^3.7.2", + "lodash.throttle": "^4.1.1", + "proper-lockfile": "^4.1.2", + "url-parse": "^1.5.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + } + } +} diff --git a/node-utils/package.json b/node-utils/package.json new file mode 100644 index 0000000..4bc12e6 --- /dev/null +++ b/node-utils/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "easydl": "^1.2.0", + "tus-js-client": "^4.2.3" + } +} diff --git a/node-utils/upload.js b/node-utils/upload.js new file mode 100644 index 0000000..ef866f6 --- /dev/null +++ b/node-utils/upload.js @@ -0,0 +1,55 @@ +const fs = require("fs"); +const tus = require("tus-js-client"); +const { exit } = require("process"); +const path = require("path"); + +var args = process.argv.slice(2); +if (args.length != 3) { + console.log("Usage: upload.js FILE_TO_UPLOAD ENDPOINT KEY"); + exit(1); +} + +var inputFile = args[0]; +var endpoint = args[1]; +var key = args[2]; + +var file = fs.createReadStream(inputFile); +var uploadedBytes = 0; +var totalBytes = 0; + +var progressHandle = setInterval(() => { + var percentage = ((uploadedBytes / totalBytes) * 100).toFixed(2); + console.log(uploadedBytes, totalBytes, `${percentage}%`); +}, 5000); + +var options = { + endpoint: endpoint, + metadata: { + filename: path.basename(inputFile), + }, + headers: { + Authorization: "Bearer " + key, + }, + parallelUploads: 6, + onError(err) { + console.log(err); + exit(2); + }, + onProgress(bytesUploaded, bytesTotal) { + totalBytes = bytesTotal; + uploadedBytes = bytesUploaded; + }, + onSuccess() { + console.log("Upload finished!"); + clearInterval(progressHandle); + fs.writeFile("file_id.txt", upload.url.split("/").pop(), (err) => { + if (err) { + console.log(err); + exit(3); + } + }); + }, +}; + +var upload = new tus.Upload(file, options); +upload.start(); diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c228223 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,2 @@ +[tool.black] +line-length = 119 diff --git a/sign.py b/sign.py new file mode 100755 index 0000000..fb22da8 --- /dev/null +++ b/sign.py @@ -0,0 +1,1282 @@ +#!/usr/bin/env python3 + +import copy +import os +import re +import sys +import time +import traceback +from subprocess import PIPE, Popen +import subprocess +from typing import Dict, List, NamedTuple, Set, Tuple, IO, Any, Optional, Mapping, Union +from pathlib import Path +import plistlib +import shutil +import random +import string +import tempfile +import json +from multiprocessing.pool import ThreadPool + +secret_url = os.path.expandvars("$SECRET_URL").strip().rstrip("/") +secret_key = os.path.expandvars("$SECRET_KEY") +StrPath = Union[str, Path] + + +def safe_glob(input: Path, pattern: str): + for f in sorted(input.glob(pattern)): + if not f.name.startswith("._") and f.name not in [".DS_Store", ".AppleDouble", "__MACOSX"]: + yield f + + +def decode_clean(b: bytes): + return "" if not b else b.decode("utf-8").strip() + + +def run_process( + *cmd: str, + capture: bool = True, + check: bool = True, + env: Optional[Mapping[str, str]] = None, + cwd: Optional[str] = None, + timeout: Optional[float] = None, +): + try: + result = subprocess.run(cmd, capture_output=capture, check=check, env=env, cwd=cwd, timeout=timeout) + except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as e: + raise ( + Exception( + { + "stdout": decode_clean(e.stdout), + "stderr": decode_clean(e.stderr), + } + ) + ) from e + return result + + +def run_process_async( + *cmd: str, + env: Optional[Mapping[str, str]] = None, + cwd: Optional[str] = None, +): + return subprocess.Popen(cmd, env=env, cwd=cwd, stdout=PIPE, stderr=PIPE) + + +def rand_str(len: int, seed: Any = None): + old_state: object = None + if seed is not None: + old_state = random.getstate() + random.seed(seed) + result = "".join(random.choices(string.ascii_lowercase + string.digits, k=len)) + if old_state is not None: + random.setstate(old_state) + return result + + +def read_file(file_path: StrPath): + with open(file_path) as f: + return f.read() + + +def extract_zip(archive: Path, dest_dir: Path): + return run_process("unzip", "-o", str(archive), "-d", str(dest_dir)) + + +def archive_zip(content_dir: Path, dest_file: Path): + return run_process("zip", "-r", str(dest_file.resolve()), ".", cwd=str(content_dir)) + + +def print_object(obj: Any): + print(json.dumps(obj, indent=4, sort_keys=True, default=str)) + + +def plutil_convert(plist: Path): + return run_process("plutil", "-convert", "xml1", "-o", "-", str(plist), capture=True).stdout + + +def plist_load(plist: Path): + return plistlib.loads(plutil_convert(plist)) + + +def plist_loads(plist: str) -> Any: + with tempfile.NamedTemporaryFile(suffix=".plist", mode="w") as f: + f.write(plist) + f.flush() + return plist_load(Path(f.name)) + + +def plist_dump(data: Any, f: IO[bytes]): + return plistlib.dump(data, f) + + +def network_init(): + return run_process("npm", "install", cwd="node-utils") + + +def node_upload(file: Path, endpoint: str, capture: bool = True): + return run_process("node", "node-utils/upload.js", str(file), endpoint, secret_key, capture=capture) + + +def node_download(download_url: str, output_file: Path, capture: bool = True): + return run_process( + "node", + "node-utils/download.js", + download_url, + secret_key, + str(output_file), + capture=capture, + ) + + +def curl_with_auth( + url: str, + form_data: List[Tuple[str, str]] = [], + output: Optional[Path] = None, + check: bool = True, + capture: bool = True, +): + args = map(lambda x: ["-F", f"{x[0]}={x[1]}"], form_data) + args = [item for sublist in args for item in sublist] + if output: + args.extend(["-o", str(output)]) + return run_process( + "curl", + *["-S", "-f", "-L", "-H"], + f"Authorization: Bearer {secret_key}", + *args, + url, + check=check, + capture=capture, + ) + + +def security_get_keychain_list(): + return map( + lambda x: x.strip('"'), + decode_clean(run_process("security", "list-keychains", "-d", "user").stdout).split(), + ) + + +def security_remove_keychain(keychain: str): + keychains = security_get_keychain_list() + keychains = filter(lambda x: keychain not in x, keychains) + run_process("security", "list-keychains", "-d", "user", "-s", *keychains) + run_process("security", "delete-keychain", keychain) + + +def security_import(cert: Path, cert_pass: str, keychain: str) -> List[str]: + password = "1234" + keychains = [*security_get_keychain_list(), keychain] + run_process("security", "create-keychain", "-p", password, keychain), + run_process("security", "unlock-keychain", "-p", password, keychain), + run_process("security", "set-keychain-settings", keychain), + run_process("security", "list-keychains", "-d", "user", "-s", *keychains), + run_process("security", "import", str(cert), "-P", cert_pass, "-A", "-k", keychain), + run_process( + "security", + *["set-key-partition-list", "-S", "apple-tool:,apple:,codesign:", "-s", "-k"], + password, + keychain, + ), + identity: str = decode_clean(run_process("security", "find-identity", "-p", "appleID", "-v", keychain).stdout) + return [line.strip('"') for line in re.findall('".*"', identity)] + + +def extract_tar(archive: Path, dest_dir: Path): + return run_process("tar", "-x", "-f", str(archive), "-C" + str(dest_dir)) + + +def extract_deb(app_bin_name: str, app_bundle_id: str, archive: Path, dest_dir: Path): + with tempfile.TemporaryDirectory() as temp_dir_str: + temp_dir = Path(temp_dir_str) + run_process("ar", "x", str(archive.resolve()), cwd=str(temp_dir)) + with tempfile.TemporaryDirectory() as temp_dir2_str: + temp_dir2 = Path(temp_dir2_str) + extract_tar(next(safe_glob(temp_dir, "data.tar*")), temp_dir2) + + for file in safe_glob(temp_dir2, "**/*"): + if file.is_symlink(): + target = file.resolve() + if target.is_absolute(): + target = temp_dir2.joinpath(str(target)[1:]) + os.unlink(file) + if target.is_dir(): + shutil.copytree(target, file) + else: + shutil.copy2(target, file) + + rootless_dir = temp_dir2 / "var" / "jb" + if rootless_dir.is_dir(): + temp_dir2 = rootless_dir + + for glob in [ + "Library/Application Support/*/*.bundle", + "Library/Application Support/*", # *.bundle, background@2x.png + "Library/Frameworks/*.framework", + "usr/lib/*.framework", + ]: + for file in safe_glob(temp_dir2, glob): + # skip empty directories + if file.is_dir() and next(safe_glob(file, "*"), None) is None: + continue + move_merge_replace(file, dest_dir) + for glob in [ + "Library/MobileSubstrate/DynamicLibraries/*.dylib", + "usr/lib/*.dylib", + ]: + for file in safe_glob(temp_dir2, glob): + if not file.is_file(): + continue + file_plist = file.parent.joinpath(file.stem + ".plist") + if file_plist.exists(): + info = plist_load(file_plist) + if "Filter" in info: + ok = False + if "Bundles" in info["Filter"] and app_bundle_id in info["Filter"]["Bundles"]: + ok = True + elif "Executables" in info["Filter"] and app_bin_name in info["Filter"]["Executables"]: + ok = True + if not ok: + continue + move_merge_replace(file, dest_dir) + + +def move_merge_replace(src: Path, dest_dir: Path): + dest = dest_dir.joinpath(src.name) + if src == dest: + return + dest_dir.mkdir(exist_ok=True, parents=True) + if src.is_dir(): + shutil.copytree(src, dest, dirs_exist_ok=True) + shutil.rmtree(src) + else: + shutil.copy2(src, dest) + os.remove(src) + + +def file_is_type(file: Path, type: str): + return type in decode_clean(run_process("file", str(file)).stdout) + + +def get_otool_imports(binary: Path): + output = decode_clean(run_process("otool", "-L", str(binary)).stdout).splitlines()[1:] + matches = [re.search(r"(.+)\s\(.+\)", line.strip()) for line in output] + results = [match.group(1) for match in matches if match] + if len(output) != len(results): + raise Exception("Failed to parse imports", {"output": output, "parsed": results}) + return results + + +def install_name_change(binary: Path, old: Path, new: Path): + print("Re-linking", binary, old, new) + return run_process("install_name_tool", "-change", str(old), str(new), str(binary)) + + +def insert_dylib(binary: Path, path: Path): + return run_process("./insert_dylib", "--inplace", "--no-strip-codesig", str(path), str(binary)) + + +def get_binary_map(dir: Path): + return {file.name: file for file in safe_glob(dir, "**/*") if file_is_type(file, "Mach-O")} + + +def codesign_async(identity: str, component: Path, entitlements: Optional[Path] = None): + cmd = ["codesign", "--continue", "-f", "--no-strict", "-s", identity] + if entitlements: + cmd.extend(["--entitlements", str(entitlements)]) + return run_process_async(*cmd, str(component)) + + +def clean_dev_portal_name(name: str): + return re.sub("[^0-9a-zA-Z]+", " ", name).strip() + + +def fastlane_auth(account_name: str, account_pass: str, team_id: str): + my_env = os.environ.copy() + my_env["FASTLANE_USER"] = account_name + my_env["FASTLANE_PASSWORD"] = account_pass + my_env["FASTLANE_TEAM_ID"] = team_id + + auth_pipe = subprocess.Popen( + # enable copy to clipboard so we're not interactively prompted + ["fastlane", "spaceauth", "--copy_to_clipboard"], + stdin=PIPE, + stdout=PIPE, + stderr=PIPE, + env=my_env, + ) + + start_time = time.time() + while True: + if time.time() - start_time > 60: + raise Exception("Operation timed out") + else: + result = auth_pipe.poll() + if result == 0: + print("Logged in!") + break + elif result is not None: + stdout, stderr = auth_pipe.communicate() + result = {"error_code": result, "stdout": stdout, "stderr": stderr} + raise Exception(f"Error logging in: {result}") + + account_2fa_file = Path("account_2fa.txt") + result = curl_with_auth( + f"{secret_url}/jobs/{job_id}/2fa", + output=account_2fa_file, + check=False, + ) + if result.returncode == 0: + account_2fa = read_file(account_2fa_file) + auth_pipe.communicate((account_2fa + "\n").encode()) + time.sleep(1) + + +def fastlane_register_app_extras( + my_env: Dict[Any, Any], + bundle_id: str, + extra_type: str, + extra_prefix: str, + matchable_entitlements: List[str], + entitlements: Dict[Any, Any], +): + matched_ids: Set[str] = set() + for k, v in entitlements.items(): + if k in matchable_entitlements: + if type(v) is list: + matched_ids.update(v) + elif type(v) is str: + matched_ids.add(v) + else: + raise Exception(f"Unknown value type for {v}: {type(v)}") + + # ensure all ids are prefixed correctly or registration will fail + # some matchable entitlements are incorrectly prefixed with team id + matched_ids = set( + id if id.startswith(extra_prefix) else extra_prefix + id[id.index(".") + 1 :] for id in matched_ids + ) + + jobs: List[Popen[bytes]] = [] + + for id in matched_ids: + jobs.append( + run_process_async( + "fastlane", + "produce", + extra_type, + "--skip_itc", + "-g", + id, + "-n", + clean_dev_portal_name(f"ST {id}"), + env=my_env, + ) + ) + + for pipe in jobs: + if pipe.poll() is None: + pipe.wait() + popen_check(pipe) + + run_process( + "fastlane", + "produce", + f"associate_{extra_type}", + "--skip_itc", + "--app_identifier", + bundle_id, + *matched_ids, + env=my_env, + ) + + +def fastlane_register_app( + account_name: str, account_pass: str, team_id: str, bundle_id: str, entitlements: Dict[Any, Any] +): + my_env = os.environ.copy() + my_env["FASTLANE_USER"] = account_name + my_env["FASTLANE_PASSWORD"] = account_pass + my_env["FASTLANE_TEAM_ID"] = team_id + + # no-op if already exists + run_process( + "fastlane", + "produce", + "create", + "--skip_itc", + "--app_identifier", + bundle_id, + "--app-name", + clean_dev_portal_name(f"ST {bundle_id}"), + env=my_env, + ) + + supported_services = [ + "--push-notification", + "--health-kit", + "--home-kit", + "--wireless-accessory", + "--inter-app-audio", + "--extended-virtual-address-space", + "--multipath", + "--network-extension", + "--personal-vpn", + "--access-wifi", + "--nfc-tag-reading", + "--siri-kit", + "--associated-domains", + "--icloud", + "--app-group", + ] + + # clear any previous services + run_process( + "fastlane", + "produce", + "disable_services", + "--skip_itc", + "--app_identifier", + bundle_id, + *supported_services, + env=my_env, + ) + + icloud_entitlements = [ + "com.apple.developer.icloud-container-development-container-identifiers", + "com.apple.developer.icloud-container-identifiers", + "com.apple.developer.ubiquity-container-identifiers", + "com.apple.developer.ubiquity-kvstore-identifier", + ] + + group_entitlements = ["com.apple.security.application-groups"] + + entitlement_map: Dict[str, Tuple[str, ...]] = { + "aps-environment": tuple(["--push-notification"]), # iOS + "com.apple.developer.aps-environment": tuple(["--push-notification"]), # macOS + "com.apple.developer.healthkit": tuple(["--health-kit"]), + "com.apple.developer.homekit": tuple(["--home-kit"]), + "com.apple.external-accessory.wireless-configuration": tuple(["--wireless-accessory"]), + "inter-app-audio": tuple(["--inter-app-audio"]), + "com.apple.developer.kernel.extended-virtual-addressing": tuple(["--extended-virtual-address-space"]), + "com.apple.developer.networking.multipath": tuple(["--multipath"]), + "com.apple.developer.networking.networkextension": tuple(["--network-extension"]), + "com.apple.developer.networking.vpn.api": tuple(["--personal-vpn"]), + "com.apple.developer.networking.wifi-info": tuple(["--access-wifi"]), + "com.apple.developer.nfc.readersession.formats": tuple(["--nfc-tag-reading"]), + "com.apple.developer.siri": tuple(["--siri-kit"]), + "com.apple.developer.associated-domains": tuple(["--associated-domains"]), + } + for k in icloud_entitlements: + entitlement_map[k] = tuple(["--icloud", "xcode6_compatible"]) + for k in group_entitlements: + entitlement_map[k] = tuple(["--app-group"]) + + service_flags = set(entitlement_map[f] for f in entitlements.keys() if f in entitlement_map) + service_flags = [item for sublist in service_flags for item in sublist] + + print("Enabling services:", service_flags) + + run_process( + "fastlane", + "produce", + "enable_services", + "--skip_itc", + "--app_identifier", + bundle_id, + *service_flags, + env=my_env, + ) + + app_extras = [("cloud_container", "iCloud.", icloud_entitlements), ("group", "group.", group_entitlements)] + with ThreadPool(len(app_extras)) as p: + p.starmap( + lambda extra_type, extra_prefix, matchable_entitlements: fastlane_register_app_extras( + my_env, bundle_id, extra_type, extra_prefix, matchable_entitlements, entitlements + ), + app_extras, + ) + + +def fastlane_get_prov_profile( + account_name: str, account_pass: str, team_id: str, bundle_id: str, prov_type: str, platform: str, out_file: Path +): + my_env = os.environ.copy() + my_env["FASTLANE_USER"] = account_name + my_env["FASTLANE_PASSWORD"] = account_pass + my_env["FASTLANE_TEAM_ID"] = team_id + + with tempfile.TemporaryDirectory() as tmpdir_str: + run_process( + "fastlane", + "sigh", + "renew", + "--app_identifier", + bundle_id, + "--provisioning_name", + clean_dev_portal_name(f"ST {bundle_id} {prov_type}"), + "--force", + "--skip_install", + "--include_mac_in_profiles", + "--platform", + platform, + "--" + prov_type, + "--output_path", + tmpdir_str, + "--filename", + "prov.mobileprovision", + env=my_env, + ) + shutil.copy2(Path(tmpdir_str).joinpath("prov.mobileprovision"), out_file) + + +def codesign_dump_entitlements(component: Path) -> Dict[Any, Any]: + entitlements_str = decode_clean( + run_process("codesign", "--no-strict", "-d", "--entitlements", ":-", str(component)).stdout + ) + return plist_loads(entitlements_str) + + +def binary_replace(pattern: str, f: Path): + if not f.exists() or not f.is_file(): + raise Exception(f, "does not exist or is a directory") + return run_process("perl", "-p", "-i", "-e", pattern, str(f)) + + +def security_dump_prov(f: Path): + return decode_clean(run_process("security", "cms", "-D", "-i", str(f)).stdout) + + +def dump_prov(prov_file: Path) -> Dict[Any, Any]: + s = security_dump_prov(prov_file) + return plist_loads(s) + + +def dump_prov_entitlements(prov_file: Path) -> Dict[Any, Any]: + return dump_prov(prov_file)["Entitlements"] + + +def popen_check(pipe: Popen[bytes]): + if pipe.returncode != 0: + data = {"message": f"{pipe.args} failed with status code {pipe.returncode}"} + if pipe.stdout: + data["stdout"] = decode_clean(pipe.stdout.read()) + if pipe.stderr: + data["stderr"] = decode_clean(pipe.stderr.read()) + raise Exception(data) + + +def inject_tweaks(ipa_dir: Path, tweaks_dir: Path): + main_app = get_main_app_path(ipa_dir) + main_info_plist = get_info_plist_path(main_app) + info = plist_load(main_info_plist) + app_bundle_id = info["CFBundleIdentifier"] + app_bundle_exe = info["CFBundleExecutable"] + is_mac_app = main_info_plist.parent.name == "Contents" + + if is_mac_app: + base_dir = main_info_plist.parent + app_bin = base_dir.joinpath("MacOS", app_bundle_exe) + base_load_path = Path("@executable_path").joinpath("..") + else: + base_dir = main_app + app_bin = base_dir.joinpath(app_bundle_exe) + base_load_path = Path("@executable_path") + + with tempfile.TemporaryDirectory() as temp_dir_str: + temp_dir = Path(temp_dir_str) + for tweak in safe_glob(tweaks_dir, "*"): + print("Processing", tweak.name) + if tweak.suffix == ".zip": + extract_zip(tweak, temp_dir) + elif tweak.suffix == ".tar": + extract_tar(tweak, temp_dir) + elif tweak.suffix == ".deb": + extract_deb(app_bin.name, app_bundle_id, tweak, temp_dir) + else: + move_merge_replace(tweak, temp_dir) + + # move files if we know where they need to go + move_map = {"Frameworks": ["*.framework", "*.dylib"], "PlugIns": ["*.appex"]} + for dest_dir, globs in move_map.items(): + for glob in globs: + for file in safe_glob(temp_dir, glob): + move_merge_replace(file, temp_dir.joinpath(dest_dir)) + + # NOTE: https://iphonedev.wiki/index.php/Cydia_Substrate + # hooking with "MSHookFunction" does not work in a jailed environment using any of the libs + # libsubstrate will silently fail and continue, while the rest will crash the app + # if you're a tweak developer, use fishhook instead, though it only works on public symbols + support_libs = { + # Path("./libhooker"): ["libhooker.dylib", "libblackjack.dylib"], + # Path("./libsubstitute"): ["libsubstitute.dylib", "libsubstitute.0.dylib"], + Path("./libsubstrate"): ["libsubstrate.dylib", "CydiaSubstrate"], + } + aliases = { + "libsubstitute.0.dylib": "libsubstitute.dylib", + "CydiaSubstrate": "libsubstrate.dylib", + } + + binary_map = get_binary_map(temp_dir) + + # inject any user libs + for binary_path in binary_map.values(): + binary_rel = binary_path.relative_to(temp_dir) + if (len(binary_rel.parts) == 2 and binary_rel.parent.name == "Frameworks") or ( + len(binary_rel.parts) == 3 + and binary_rel.parent.suffix == ".framework" + and binary_rel.parent.parent.name == "Frameworks" + ): + binary_fixed = base_load_path.joinpath(binary_rel) + print("Injecting", binary_path, binary_fixed) + insert_dylib(app_bin, binary_fixed) + + # detect any references to support libs and install missing files + for binary_path in binary_map.values(): + for link in get_otool_imports(binary_path): + link_path = Path(link) + for lib_dir, lib_names in support_libs.items(): + if link_path.name not in lib_names: + continue + print("Detected", lib_dir.name) + for lib_src in safe_glob(lib_dir, "*"): + lib_dest = temp_dir.joinpath("Frameworks").joinpath(lib_src.name) + if not lib_dest.exists(): + print(f"Installing {lib_src.name} to {lib_dest}") + lib_dest.parent.mkdir(exist_ok=True, parents=True) + shutil.copy2(lib_src, lib_dest) + + # refresh the binary map with any new libs from previous step + binary_map = get_binary_map(temp_dir) + + # re-link any dependencies + for binary_path in binary_map.values(): + for link in get_otool_imports(binary_path): + link_path = Path(link) + link_name = aliases[link_path.name] if link_path.name in aliases else link_path.name + if link_name in binary_map: + link_fixed = base_load_path.joinpath(binary_map[link_name].relative_to(temp_dir)) + print("Re-linking", binary_path, link_path, link_fixed) + install_name_change(binary_path, link_path, link_fixed) + + for file in safe_glob(temp_dir, "*"): + move_merge_replace(file, base_dir) + + +class SignOpts(NamedTuple): + app_dir: Path + common_name: str + team_id: str + account_name: str + account_pass: str + prov_file: Optional[Path] + bundle_id: Optional[str] + bundle_name: Optional[str] + patch_debug: bool + patch_all_devices: bool + patch_mac: bool + patch_file_sharing: bool + encode_ids: bool + patch_ids: bool + force_original_id: bool + + +class RemapDef(NamedTuple): + entitlements: List[str] + prefix: str + prefix_only: bool + is_list: bool + + +class ComponentData(NamedTuple): + old_bundle_id: str + bundle_id: str + entitlements: Dict[Any, Any] + info_plist: Path + + +def get_info_plist_path(app_dir: Path): + return min(list(safe_glob(app_dir, "**/Info.plist")), key=lambda p: len(str(p))) + + +def get_main_app_path(app_dir: Path): + return min(list(safe_glob(app_dir, "**/*.app")), key=lambda p: len(str(p))) + + +class Signer: + opts: SignOpts + main_bundle_id: str + old_main_bundle_id: str + mappings: Dict[str, str] + removed_entitlements: Set[str] + is_distribution: bool + components: List[Path] + is_mac_app: bool + + def gen_id(self, input_id: str): + """ + Encodes the provided id into a different but constant id that + has the same length and is unique based on the team id. + """ + if not input_id.strip(): + return input_id + if not self.opts.encode_ids: + return input_id + new_parts = map(lambda x: rand_str(len(x), x + self.opts.team_id), input_id.split(".")) + result = ".".join(new_parts) + return result + + def __get_application_identifier_key(self): + return "com.apple.application-identifier" if self.is_mac_app else "application-identifier" + + def __get_aps_environment_key(self): + return "com.apple.developer.aps-environment" if self.is_mac_app else "aps-environment" + + def __init__(self, opts: SignOpts): + self.opts = opts + main_app = get_main_app_path(opts.app_dir) + main_info_plist = get_info_plist_path(main_app) + main_info: Dict[Any, Any] = plist_load(main_info_plist) + self.old_main_bundle_id = main_info["CFBundleIdentifier"] + self.is_distribution = "Distribution" in opts.common_name + self.is_mac_app = main_info_plist.parent.name == "Contents" + + if self.is_distribution and self.is_mac_app: + raise Exception( + "Cannot use distribution certificate for macOS as the platform does not support adhoc provisioning profiles." + ) + + self.mappings: Dict[str, str] = {} + self.removed_entitlements = set() + + if opts.prov_file: + if opts.bundle_id is None: + print("Using original bundle id") + self.main_bundle_id = self.old_main_bundle_id + elif opts.bundle_id == "": + print("Using provisioning profile's application id") + prov_app_id = dump_prov_entitlements(opts.prov_file)[self.__get_application_identifier_key()] + self.main_bundle_id = prov_app_id[prov_app_id.find(".") + 1 :] + if self.main_bundle_id == "*": + print("Provisioning profile is wildcard, using original bundle id") + self.main_bundle_id = self.old_main_bundle_id + else: + print("Using custom bundle id") + self.main_bundle_id = opts.bundle_id + else: + if opts.bundle_id: + print("Using custom bundle id") + self.main_bundle_id = opts.bundle_id + elif opts.encode_ids: + print("Using encoded original bundle id") + self.main_bundle_id = self.gen_id(self.old_main_bundle_id) + if not self.opts.force_original_id and self.old_main_bundle_id != self.main_bundle_id: + self.mappings[self.old_main_bundle_id] = self.main_bundle_id + else: + print("Using original bundle id") + self.main_bundle_id = self.old_main_bundle_id + + if opts.bundle_name: + print(f"Setting CFBundleDisplayName to {opts.bundle_name}") + main_info["CFBundleDisplayName"] = opts.bundle_name + + if self.opts.patch_all_devices: + if self.is_mac_app: + # https://developer.apple.com/documentation/bundleresources/information_property_list/lsminimumsystemversion + main_info["LSMinimumSystemVersion"] = "10.0" + else: + # https://developer.apple.com/documentation/bundleresources/information_property_list/minimumosversion + main_info["MinimumOSVersion"] = "3.0" + + with open("bundle_id.txt", "w") as f: + if opts.force_original_id: + f.write(self.old_main_bundle_id) + else: + f.write(self.main_bundle_id) + + with main_info_plist.open("wb") as f: + plist_dump(main_info, f) + + for watch_name in ["com.apple.WatchPlaceholder", "Watch"]: + watch_dir = main_app.joinpath(watch_name) + if watch_dir.exists(): + print(f"Removing {watch_name} directory") + shutil.rmtree(watch_dir) + + component_exts = ["*.app", "*.appex", "*.framework", "*.dylib", "PlugIns/*.bundle"] + # make sure components are ordered depth-first, otherwise signing will overlap and become invalid + self.components = [item for e in component_exts for item in safe_glob(main_app, "**/" + e)][::-1] + self.components.append(main_app) + + def __sign_secondary(self, component: Path, tmpdir: Path): + # entitlements of frameworks, etc. don't matter, so leave them (potentially) invalid + print("Signing with original entitlements") + return codesign_async(self.opts.common_name, component) + + def __sign_primary(self, component: Path, tmpdir: Path, data: ComponentData): + info = plist_load(data.info_plist) + + if self.opts.force_original_id: + print("Keeping original CFBundleIdentifier") + info["CFBundleIdentifier"] = data.old_bundle_id + else: + print(f"Setting CFBundleIdentifier to {data.bundle_id}") + info["CFBundleIdentifier"] = data.bundle_id + + if self.opts.patch_debug: + data.entitlements["get-task-allow"] = True + print("Enabled app debugging") + else: + data.entitlements.pop("get-task-allow", False) + print("Disabled app debugging") + + if not self.is_mac_app: + if self.opts.patch_all_devices: + print("Force enabling support for all devices") + info.pop("UISupportedDevices", False) + # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html + info["UIDeviceFamily"] = [1, 2, 3, 4] # iOS, iPadOS, tvOS, watchOS + + if self.opts.patch_mac: + info.pop("UIRequiresFullScreen", False) + for device in ["ipad", "iphone", "ipod"]: + info.pop("UISupportedInterfaceOrientations~" + device, False) + info["UISupportedInterfaceOrientations"] = [ + "UIInterfaceOrientationPortrait", + "UIInterfaceOrientationPortraitUpsideDown", + "UIInterfaceOrientationLandscapeLeft", + "UIInterfaceOrientationLandscapeRight", + ] + + if self.opts.patch_file_sharing: + print("Force enabling file sharing") + info["UIFileSharingEnabled"] = True + info["UISupportsDocumentBrowser"] = True + + with data.info_plist.open("wb") as f: + plist_dump(info, f) + + print("Signing with entitlements:") + print_object(data.entitlements) + + # iOS : MyApp.app/embedded.mobileprovision + # macOS : MyApp.app/Contents/embedded.provisionprofile + embedded_prov = data.info_plist.parent.joinpath( + "embedded.provisionprofile" if self.is_mac_app else "embedded.mobileprovision" + ) + if self.opts.prov_file is not None: + shutil.copy2(self.opts.prov_file, embedded_prov) + else: + print("Registering component with Apple...") + fastlane_register_app( + self.opts.account_name, self.opts.account_pass, self.opts.team_id, data.bundle_id, data.entitlements + ) + + print("Generating provisioning profile...") + prov_type = "adhoc" if self.is_distribution else "development" + platform = "macos" if self.is_mac_app else "ios" + fastlane_get_prov_profile( + self.opts.account_name, + self.opts.account_pass, + self.opts.team_id, + data.bundle_id, + prov_type, + platform, + embedded_prov, + ) + + entitlements_plist = Path(tmpdir).joinpath("entitlements.plist") + with open(entitlements_plist, "wb") as f: + plist_dump(data.entitlements, f) + + print("Signing component...") + return codesign_async(self.opts.common_name, component, entitlements_plist) + + def __prepare_primary( + self, + component: Path, + workdir: Path, + ): + info_plist = get_info_plist_path(component) + info: Dict[Any, Any] = plist_load(info_plist) + old_bundle_id = info["CFBundleIdentifier"] + # create bundle id by suffixing the existing main bundle id with the original suffix + bundle_id = f"{self.main_bundle_id}{old_bundle_id[len(self.old_main_bundle_id):]}" + if not self.opts.force_original_id and old_bundle_id != bundle_id: + if len(old_bundle_id) != len(bundle_id): + print( + f"WARNING: Component's bundle id '{bundle_id}' is different length from the original bundle id '{old_bundle_id}'.", + "The signed app may crash!", + ) + else: + self.mappings[old_bundle_id] = bundle_id + + old_entitlements: Dict[Any, Any] + try: + old_entitlements = codesign_dump_entitlements(component) + except: + print("Failed to dump entitlements, using empty") + old_entitlements = {} + + print("Original entitlements:") + print_object(old_entitlements) + + old_team_id: Optional[str] = old_entitlements.get("com.apple.developer.team-identifier", None) + if not old_team_id: + print("Failed to read old team id") + elif old_team_id != self.opts.team_id: + if len(old_team_id) != len(self.opts.team_id): + print("WARNING: Team ID length mismatch:", old_team_id, self.opts.team_id) + else: + self.mappings[old_team_id] = self.opts.team_id + + # before 2011 this was known as 'bundle seed id' and could be set freely + # now it is always equal to team id, but some old apps haven't updated + old_app_id_prefix: Optional[str] = old_entitlements.get(self.__get_application_identifier_key(), "").split( + "." + )[0] + if not old_app_id_prefix: + old_app_id_prefix = None + print("Failed to read old app id prefix") + elif old_app_id_prefix != self.opts.team_id: + if len(old_app_id_prefix) != len(self.opts.team_id): + print("WARNING: App ID Prefix length mismatch:", old_app_id_prefix, self.opts.team_id) + else: + self.mappings[old_app_id_prefix] = self.opts.team_id + + if self.opts.prov_file is not None: + # This may cause issues with wildcard entitlements, since they are valid in the provisioning + # profile, but not when applied to a binary. For example: + # com.apple.developer.icloud-services = * + # Ideally, all such cases should be manually replaced. + entitlements = dump_prov_entitlements(self.opts.prov_file) + + prov_app_id = entitlements[self.__get_application_identifier_key()] + component_app_id = f"{self.opts.team_id}.{bundle_id}" + wildcard_app_id = f"{self.opts.team_id}.*" + + # if the prov file has wildcard app id, expand it, or it would be invalid + if prov_app_id == wildcard_app_id: + entitlements[self.__get_application_identifier_key()] = component_app_id + elif prov_app_id != component_app_id: + print( + f"WARNING: Provisioning profile's app id '{prov_app_id}' does not match component's app id '{component_app_id}'.", + "Using provisioning profile's app id - the component will run, but some functions such as file importing will not work!", + sep="\n", + ) + + keychain: Optional[List[str]] = entitlements.get("keychain-access-groups", None) + old_keychain: Optional[List[str]] = old_entitlements.get("keychain-access-groups", None) + if old_keychain is None: + entitlements.pop("keychain-access-groups", None) + # if the prov file has wildcard keychain group, expand it, or all signed apps will use the same keychain + elif keychain and any(item == wildcard_app_id for item in keychain): + keychain.clear() + for item in old_keychain: + keychain.append(f"{self.opts.team_id}.{item[item.index('.')+1:]}") + else: + supported_entitlements = [ + self.__get_application_identifier_key(), + "com.apple.developer.team-identifier", + "com.apple.developer.healthkit", + "com.apple.developer.healthkit.access", + "com.apple.developer.homekit", + "com.apple.external-accessory.wireless-configuration", + "com.apple.security.application-groups", + "inter-app-audio", + "get-task-allow", + "keychain-access-groups", + self.__get_aps_environment_key(), + "com.apple.developer.icloud-container-development-container-identifiers", + "com.apple.developer.icloud-container-environment", + "com.apple.developer.icloud-container-identifiers", + "com.apple.developer.icloud-services", + "com.apple.developer.kernel.extended-virtual-addressing", + "com.apple.developer.networking.multipath", + "com.apple.developer.networking.networkextension", + "com.apple.developer.networking.vpn.api", + "com.apple.developer.networking.wifi-info", + "com.apple.developer.nfc.readersession.formats", + "com.apple.developer.siri", + "com.apple.developer.ubiquity-container-identifiers", + "com.apple.developer.ubiquity-kvstore-identifier", + "com.apple.developer.associated-domains", + # macOS only + "com.apple.security.app-sandbox", + "com.apple.security.assets.pictures.read-write", + "com.apple.security.cs.allow-jit", + "com.apple.security.cs.allow-unsigned-executable-memory", + "com.apple.security.cs.disable-library-validation", + "com.apple.security.device.audio-input", + "com.apple.security.device.bluetooth", + "com.apple.security.device.usb", + "com.apple.security.files.user-selected.read-only", + "com.apple.security.files.user-selected.read-write", + "com.apple.security.network.client", + "com.apple.security.network.server", + ] + entitlements = copy.deepcopy(old_entitlements) + for entitlement in list(entitlements): + if entitlement not in supported_entitlements: + self.removed_entitlements.add(entitlement) + entitlements.pop(entitlement) + + # make sure environment-sensitive entitlements are set correctly + for entitlement, value in { + "com.apple.developer.icloud-container-environment": ( + "Production" if self.is_distribution else "Development" + ), + self.__get_aps_environment_key(): "production" if self.is_distribution else "development", + "get-task-allow": False if self.is_distribution else True, + }.items(): + if entitlement in entitlements: + entitlements[entitlement] = value + + # change identifiers that don't need to be remapped + entitlements["com.apple.developer.team-identifier"] = self.opts.team_id + entitlements[self.__get_application_identifier_key()] = f"{self.opts.team_id}.{bundle_id}" + + # remap any ids in entitlements, will later byte patch them into various files + if self.opts.encode_ids: + for remap_def in ( + RemapDef(["com.apple.security.application-groups"], "group.", False, True), # group.com.test.app + RemapDef( + [ + "com.apple.developer.icloud-container-identifiers", + "com.apple.developer.ubiquity-container-identifiers", + "com.apple.developer.icloud-container-development-container-identifiers", + ], + "iCloud.", + False, + True, + ), # iCloud.com.test.app + # + # the "prefix_only" definitions need to be at the end to make sure that the correct + # action is taken if the same id is already remapped for non-"prefix_only" ids + # + RemapDef( + ["keychain-access-groups"], self.opts.team_id + ".", True, True + ), # JF8WQ0B38Z.com.test.app + RemapDef( + ["com.apple.developer.ubiquity-kvstore-identifier"], self.opts.team_id + ".", False, False + ), # JF8WQ0B38Z.com.test.app + ): + for entitlement in remap_def.entitlements: + remap_ids: List[str] | str = entitlements.get(entitlement, []) + if isinstance(remap_ids, str): + remap_ids = [remap_ids] + + if len(remap_ids) < 1: + continue + + entitlements[entitlement] = [] + + for remap_id in [id[len(remap_def.prefix) :] for id in remap_ids]: + if remap_def.prefix_only: + # don't change the id as only its prefix needs to be remapped + new_id = remap_def.prefix + remap_id + else: + new_id = remap_def.prefix + self.gen_id(remap_id) + self.mappings[remap_def.prefix + remap_id] = new_id + + entitlements[entitlement].append(new_id) + if not remap_def.is_list: + entitlements[entitlement] = entitlements[entitlement][0] + + return ComponentData(old_bundle_id, bundle_id, entitlements, info_plist) + + def sign(self): + with tempfile.TemporaryDirectory() as tmpdir_str: + tmpdir = Path(tmpdir_str) + + job_defs: List[Tuple[Path, Optional[ComponentData]]] = [] + for component in self.components: + print(f"Preparing component {component}") + + if component.suffix in [".appex", ".app"]: + job_defs.append((component, self.__prepare_primary(component, tmpdir))) + else: + job_defs.append((component, None)) + + print("ID mappings:") + print_object(self.mappings) + # ensure all mappings are same length and actually byte patchable + assert all(len(k) == len(v) for k, v in self.mappings.items()) + + print("Removed entitlements:") + print_object(list(self.removed_entitlements)) + + if self.opts.prov_file is None: + print( + "Logging in...", + "If you receive a two-factor authentication (2FA) code, please submit it to the web service.", + sep="\n", + ) + fastlane_auth(self.opts.account_name, self.opts.account_pass, self.opts.team_id) + + jobs: Dict[Path, subprocess.Popen[bytes]] = {} + for component, data in job_defs: + print(f"Processing component {component}") + + for path in list(jobs.keys()): + pipe = jobs[path] + try: + path.relative_to(component) + except: + continue + if pipe.poll() is None: + print("Waiting for sub-component to finish signing:", path) + pipe.wait() + popen_check(pipe) + jobs.pop(path) + + sc_info = component.joinpath("SC_Info") + if sc_info.exists(): + print( + f"WARNING: Found leftover AppStore metadata - removing it.", + "If the app is encrypted, it will fail to launch!", + sep="\n", + ) + shutil.rmtree(sc_info) + + if self.opts.patch_ids: + # make sure patches are the same length + patches = {k: v for k, v in self.mappings.items() if len(k) == len(v)} + # sort by decreasing length to make sure that there are no overlaps + patches = dict(sorted(self.mappings.items(), key=lambda x: len(x[0]), reverse=True)) + + if len(patches) < 1: + print("Nothing to patch") + else: + targets = [ + x for x in [component, component.joinpath(component.stem)] if x.exists() and x.is_file() + ] + if data is not None: + targets.append(data.info_plist) + for target in targets: + print(f"Patching {len(patches)} patterns in {target}") + for old, new in patches.items(): + binary_replace(f"s/{re.escape(old)}/{re.escape(new)}/g", target) + + if data is not None: + jobs[component] = self.__sign_primary(component, tmpdir, data) + else: + jobs[component] = self.__sign_secondary(component, tmpdir) + + print("Waiting for any remaining components to finish signing") + for pipe in jobs.values(): + pipe.wait() + popen_check(pipe) + + +def run(): + print("Creating keychain...") + common_names = security_import(Path("cert.p12"), cert_pass, keychain_name) + if len(common_names) < 1: + raise Exception("No valid code signing certificate found, aborting.") + common_names = { + # "Apple Development" for paid dev account + # "iPhone Developer" for free dev account, etc + "Development": next((n for n in common_names if "Develop" in n), None), + "Distribution": next((n for n in common_names if "Distribution" in n), None), + } + + if common_names["Distribution"] is not None: + print("Using distribution certificate") + common_name = common_names["Distribution"] + if "-d" in sign_args: + raise Exception("Debugging cannot be enabled on distribution certificate, use development.") + elif common_names["Development"] is not None: + print("Using development certificate") + common_name = common_names["Development"] + else: + raise Exception("Unrecognized code signing certificate, aborting.") + + prov_profile = Path("prov.mobileprovision") + account_name_file = Path("account_name.txt") + account_pass_file = Path("account_pass.txt") + bundle_name = Path("bundle_name.txt") + if account_name_file.is_file() and account_pass_file.is_file(): + print("Using developer account") + elif prov_profile.is_file(): + print("Using provisioning profile") + else: + raise Exception("Developer account or provisioning profile required, found none.") + + with tempfile.TemporaryDirectory() as temp_dir_str: + temp_dir = Path(temp_dir_str) + print("Extracting app...") + extract_zip(Path("unsigned.ipa"), temp_dir) + + tweaks_dir = Path("tweaks") + if tweaks_dir.exists(): + print("Found tweaks, injecting...") + inject_tweaks(temp_dir, tweaks_dir) + + print("Signing...") + Signer( + SignOpts( + temp_dir, + common_name, + team_id, + read_file(account_name_file) if account_name_file.is_file() else "", + read_file(account_pass_file) if account_pass_file.is_file() else "", + prov_profile if prov_profile.is_file() else None, + "" if "-n" in sign_args else user_bundle_id, + read_file(bundle_name) if bundle_name.exists() else None, + "-d" in sign_args, + "-a" in sign_args, + "-m" in sign_args, + "-s" in sign_args, + "-e" in sign_args, + "-p" in sign_args, + "-o" in sign_args, + ) + ).sign() + + print("Packaging signed app...") + signed_ipa = Path("signed.ipa") + archive_zip(temp_dir, signed_ipa) + + print("Uploading...") + node_upload(signed_ipa, f"{secret_url}/jobs/{job_id}/tus/", capture=False) + file_id = read_file(Path("file_id.txt")) + bundle_id = read_file(Path("bundle_id.txt")) + curl_with_auth(f"{secret_url}/jobs/{job_id}/signed", [("file_id", file_id), ("bundle_id", bundle_id)]) + + +if __name__ == "__main__": + print("Initializing dependencies...") + network_init() + + print("Downloading job files...") + job_archive = Path("job.tar") + node_download(secret_url + "/jobs", job_archive, capture=False) + extract_tar(job_archive, Path(".")) + os.remove(job_archive) + + cert_pass = read_file("cert_pass.txt") + sign_args = read_file("args.txt") + job_id = read_file("id.txt") + user_bundle_id = read_file("user_bundle_id.txt") + if user_bundle_id.strip() == "": + user_bundle_id = None + team_id = read_file("team_id.txt") + keychain_name = "ios-signer-" + rand_str(8) + + print("Downloading app...") + unsigned_ipa = Path("unsigned.ipa") + node_download(secret_url + f"/jobs/{job_id}/unsigned", unsigned_ipa, capture=False) + + failed = False + try: + run() + except: + failed = True + traceback.print_exc() + finally: + print("Cleaning up...") + security_remove_keychain(keychain_name) + if failed: + curl_with_auth(f"{secret_url}/jobs/{job_id}/fail") + sys.exit(1)