From 14efe809af149745a15124e28233c4a98611e46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentino=20Me=C4=91imorec?= Date: Wed, 21 Oct 2026 09:40:02 +0200 Subject: [PATCH 1/2] Improve CI - signing timeouts, split from build. Bump to 0.2.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valentino Međimorec --- .github/workflows/release.yml | 120 +++++++++++++----- Cargo.lock | 20 +-- Cargo.toml | 2 +- RELEASING.md | 25 ++-- apps/desktop/package-lock.json | 4 +- apps/desktop/package.json | 2 +- .../desktop/src-tauri/tauri.android.conf.json | 2 +- assets/brand/README.md | 1 + assets/brand/morphgate-social-preview.png | Bin 0 -> 78847 bytes docs/development.md | 2 +- scripts/upload-ios.py | 72 ++++++++--- 11 files changed, 169 insertions(+), 81 deletions(-) create mode 100644 assets/brand/morphgate-social-preview.png diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5ffc82e..fb31beb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -241,6 +241,8 @@ jobs: # The signing itself authenticates from the AZURE_* variables; this # `az` lets the login through. And Tauri shows only the stderr of a sign command that # fails, while the signing library says why on stdout: sign.cmd sends it to stderr. + # Signing needs Microsoft's timestamp server, which doesn't always answer: sign.cmd tries + # four times, 20 seconds apart, rather than fail the build. - name: Windows signing setup if: runner.os == 'Windows' && vars.ARTIFACT_SIGNING_PROFILE != '' shell: pwsh @@ -252,8 +254,16 @@ jobs: $az = "$env:RUNNER_TEMP\az-login.cmd" Set-Content -Path $az -Encoding ascii -Value '@call "C:\Program Files\Microsoft SDKs\Azure\CLI2\wbin\az.cmd" %* --allow-no-subscriptions' "AZURE_CLI_PATH=$az" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 - Set-Content -Path "$env:RUNNER_TEMP\sign.cmd" -Encoding ascii ` - -Value "@artifact-signing-cli -e $env:ENDPOINT -a $env:ACCOUNT -c $env:CERT_PROFILE -d MorphGate %* 1>&2" + $cli = "artifact-signing-cli -e $env:ENDPOINT -a $env:ACCOUNT -c $env:CERT_PROFILE -d MorphGate %* 1>&2" + Set-Content -Path "$env:RUNNER_TEMP\sign.cmd" -Encoding ascii -Value @( + '@echo off', + 'for /L %%i in (1,1,4) do (', + " $cli && exit /b 0", + ' ping -n 21 127.0.0.1 >nul', + ')', + 'exit /b 1' + ) + Get-Content "$env:RUNNER_TEMP\sign.cmd" - uses: actions/setup-dotnet@v6 if: runner.os == 'Windows' && vars.ARTIFACT_SIGNING_PROFILE != '' @@ -369,37 +379,14 @@ jobs: } if ($files.Count -lt 3 -or $bad) { Write-Error "$bad of $($files.Count) files aren't signed and timestamped"; exit 1 } - # Tauri notarizes the app; the DMG it's downloaded in is notarized here too (Apple's advice: - # the outermost container), stapled, and put in the release in place of the one uploaded. - # Updates use the .app.tar.gz, which this leaves alone. - - name: Notarize the DMG - if: runner.os == 'macOS' && env.APPLE_API_KEY != '' - shell: bash - env: - GH_TOKEN: ${{ github.token }} - RELEASE_ID: ${{ needs.plan.outputs.release_id }} - run: | - dmg=$(ls target/universal-apple-darwin/release/bundle/dmg/*.dmg | head -1) - status=$(xcrun notarytool submit "$dmg" --key "$APPLE_API_KEY_PATH" --key-id "$APPLE_API_KEY" \ - --issuer "$APPLE_API_ISSUER" --wait --output-format json | jq -r .status) - [ "$status" = Accepted ] || { echo "::error::notarizing the DMG: $status"; exit 1; } - xcrun stapler staple "$dmg" - asset=$(gh api "repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets" --paginate \ - --jq '.[] | select(.name | endswith(".dmg")) | "\(.id) \(.name)"' | head -1) - [ -n "$asset" ] || { echo "::error::the release has no DMG to replace"; exit 1; } - gh api -X DELETE "repos/$GITHUB_REPOSITORY/releases/assets/${asset%% *}" - gh api -X POST -H "Content-Type: application/x-apple-diskimage" \ - "https://uploads.github.com/repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets?name=${asset#* }" \ - --input "$dmg" --jq .browser_download_url - - # The proof, in the log: signed with the Developer ID (hardened runtime, secure timestamp), - # notarized with the ticket stapled, and accepted by Gatekeeper as a downloaded app would be. + # The proof, in the log: the app signed with the Developer ID (hardened runtime, secure + # timestamp), notarized by Tauri with the ticket stapled, and accepted by Gatekeeper as a + # downloaded app would be. The DMG is the macOS notarize job's. - name: Check the macOS signature if: runner.os == 'macOS' && env.APPLE_SIGNING_IDENTITY != '' shell: bash run: | - bundle=target/universal-apple-darwin/release/bundle - app=$(ls -d "$bundle"/macos/*.app | head -1) + app=$(ls -d target/universal-apple-darwin/release/bundle/macos/*.app | head -1) codesign --verify --deep --strict --verbose=2 "$app" codesign -dv --verbose=4 "$app" 2>&1 | grep -E "^(Identifier|Authority|TeamIdentifier|Timestamp|CodeDirectory)" plutil -p "$app/Contents/Info.plist" | grep -E "CFBundleIdentifier|NSLocalNetworkUsageDescription|LSMinimumSystemVersion" @@ -407,14 +394,77 @@ jobs: xcrun stapler validate "$app" spctl --assess --type execute --verbose=4 "$app" fi - for dmg in "$bundle"/dmg/*.dmg; do - codesign -dv --verbose=2 "$dmg" 2>&1 | grep -E "^Authority" - if [ -n "${APPLE_API_KEY:-}" ]; then - xcrun stapler validate "$dmg" - spctl --assess --type open --context context:primary-signature --verbose=4 "$dmg" - fi + + # The DMG goes on to the macOS notarize job, as the iOS app goes on to TestFlight. + - uses: actions/upload-artifact@v7 + if: runner.os == 'macOS' && env.APPLE_API_KEY != '' + with: + name: macos-dmg + path: target/universal-apple-darwin/release/bundle/dmg/*.dmg + retention-days: 7 + if-no-files-found: error + + # The DMG the app is downloaded in, notarized too (Apple's advice: the outermost container), + # stapled, checked and put in the release in place of the one the build uploaded. Updates use + # the .app.tar.gz, which this leaves alone. Apart from the build because this is the part that + # talks to Apple's services, which drop a connection now and then: re-running it takes a + # minute or two, not a new build. + macos-notarize: + name: macOS notarize + needs: [plan, desktop] + if: >- + needs.plan.outputs.build == 'true' && !cancelled() && vars.APPLE_API_KEY != '' + && contains(needs.plan.outputs.matrix, 'macos') + runs-on: macos-15 + timeout-minutes: 45 + steps: + - uses: actions/download-artifact@v8 + with: + name: macos-dmg + path: ${{ runner.temp }}/dmg + + - name: Notarize and staple + env: + API_KEY: ${{ vars.APPLE_API_KEY }} + API_ISSUER: ${{ vars.APPLE_API_ISSUER }} + API_KEY_P8: ${{ secrets.APPLE_API_KEY_P8 }} + run: | + dmg=$(ls "$RUNNER_TEMP"/dmg/*.dmg | head -1) + key="$RUNNER_TEMP/AuthKey_$API_KEY.p8" + printf '%s\n' "$API_KEY_P8" > "$key" + status=$(xcrun notarytool submit "$dmg" --key "$key" --key-id "$API_KEY" \ + --issuer "$API_ISSUER" --wait --output-format json | jq -r .status) + [ "$status" = Accepted ] || { echo "::error::notarizing the DMG: $status"; exit 1; } + # Stapling fetches the ticket from Apple's servers: tried a few times. + for i in 1 2 3 4 5; do + xcrun stapler staple "$dmg" && break + [ "$i" = 5 ] && { echo "::error::stapling the DMG failed 5 times"; exit 1; } + sleep $((i * 20)) done + # The proof, in the log: signed, notarized with the ticket stapled, and accepted by + # Gatekeeper as a downloaded disk image would be. + - name: Check the DMG + run: | + dmg=$(ls "$RUNNER_TEMP"/dmg/*.dmg | head -1) + codesign -dv --verbose=2 "$dmg" 2>&1 | grep -E "^Authority" + xcrun stapler validate "$dmg" + spctl --assess --type open --context context:primary-signature --verbose=4 "$dmg" + + - name: Put it in the release + env: + GH_TOKEN: ${{ github.token }} + RELEASE_ID: ${{ needs.plan.outputs.release_id }} + run: | + dmg=$(ls "$RUNNER_TEMP"/dmg/*.dmg | head -1) + asset=$(gh api "repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets" --paginate \ + --jq '.[] | select(.name | endswith(".dmg")) | "\(.id) \(.name)"' | head -1) + [ -n "$asset" ] || { echo "::error::the release has no DMG to replace"; exit 1; } + gh api -X DELETE "repos/$GITHUB_REPOSITORY/releases/assets/${asset%% *}" + gh api -X POST -H "Content-Type: application/x-apple-diskimage" \ + "https://uploads.github.com/repos/$GITHUB_REPOSITORY/releases/$RELEASE_ID/assets?name=${asset#* }" \ + --input "$dmg" --jq .browser_download_url + android: name: Android needs: plan diff --git a/Cargo.lock b/Cargo.lock index 66f4688..8e19cec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3346,7 +3346,7 @@ dependencies = [ [[package]] name = "mg-inventory" -version = "0.2.0" +version = "0.2.1" dependencies = [ "reqwest", "serde", @@ -3359,7 +3359,7 @@ dependencies = [ [[package]] name = "mg-presence" -version = "0.2.0" +version = "0.2.1" dependencies = [ "block2", "objc2", @@ -3375,7 +3375,7 @@ dependencies = [ [[package]] name = "mg-ssh" -version = "0.2.0" +version = "0.2.1" dependencies = [ "getrandom 0.4.3", "russh", @@ -3390,7 +3390,7 @@ dependencies = [ [[package]] name = "mg-store" -version = "0.2.0" +version = "0.2.1" dependencies = [ "mg-sync", "mg-vault", @@ -3406,7 +3406,7 @@ dependencies = [ [[package]] name = "mg-sync" -version = "0.2.0" +version = "0.2.1" dependencies = [ "base64 0.23.1", "reqwest", @@ -3419,7 +3419,7 @@ dependencies = [ [[package]] name = "mg-vault" -version = "0.2.0" +version = "0.2.1" dependencies = [ "argon2", "chacha20poly1305 0.11.0", @@ -3434,7 +3434,7 @@ dependencies = [ [[package]] name = "mg-vpn" -version = "0.2.0" +version = "0.2.1" dependencies = [ "aes", "aws-lc-rs", @@ -3543,7 +3543,7 @@ dependencies = [ [[package]] name = "morphgate-desktop" -version = "0.2.0" +version = "0.2.1" dependencies = [ "apple-native-keyring-store", "base64 0.23.1", @@ -6987,7 +6987,7 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vault-conform" -version = "0.2.0" +version = "0.2.1" dependencies = [ "axum", "hmac 0.13.0", @@ -7007,7 +7007,7 @@ dependencies = [ [[package]] name = "vault-sync-server" -version = "0.2.0" +version = "0.2.1" dependencies = [ "argon2", "aws-lc-rs", diff --git a/Cargo.toml b/Cargo.toml index bfa80aa..5a65dde 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "3" members = ["crates/mg-vault", "crates/mg-ssh", "crates/mg-store", "crates/mg-sync", "crates/mg-vpn", "crates/mg-presence", "crates/mg-inventory", "server", "apps/desktop/src-tauri", "tools/vault-conform"] [workspace.package] -version = "0.2.0" +version = "0.2.1" edition = "2024" rust-version = "1.91" diff --git a/RELEASING.md b/RELEASING.md index 0381420..3b939a0 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -113,10 +113,13 @@ Updates are signed regardless (see above). - variables `APPLE_SIGNING_IDENTITY` (`Developer ID Application: Vallic d.o.o. (988D7A4F4L)`), `APPLE_API_KEY` (the key's ID), `APPLE_API_ISSUER` (App Store Connect → Users and Access → Integrations → App Store Connect API: the Issuer ID). - Without the API key, builds are signed but not notarized. Tauri notarizes the app; the - step "Notarize the DMG" then notarizes the DMG it comes in too and replaces the release's - copy with the stapled one. "Check the macOS signature" shows the signing authority, the - stapled tickets and Gatekeeper's verdict on both, and fails the build where they're wrong. + Without the API key, builds are signed but not notarized. Tauri notarizes the app, and "Check + the macOS signature" shows its signing authority, stapled ticket and Gatekeeper's verdict. The + DMG goes on as an artifact to the **macOS notarize** job, which notarizes it too, staples it + (tried five times: Apple's ticket service drops connections), checks it the same way and puts + it in the release in place of the one the build uploaded. That job only talks to Apple, so + when it fails, re-running it takes a minute or two instead of a new build. Either check fails + the run where something is wrong. A dev build with *platforms* `macos` is the cheapest check of a change to any of this. The certificate was made from a CSR on Linux (`openssl req -newkey rsa:2048`); make a new one before it expires @@ -144,8 +147,10 @@ Updates are signed regardless (see above). valid after. The validation expires: its date is on the portal's Identity validation page, it can be renewed there from 60 days before, and Microsoft mails a reminder. Once it lapses, certificates stop renewing and signing stops (a new validation then needs the profile - replaced, same name). "Check the Windows signature" after the build shows each file's signer - and timestamp, and fails the build where one is missing. + replaced, same name). Signing needs Microsoft's timestamp server, which doesn't always + answer: the sign command tries each file four times, 20 seconds apart. "Check the Windows + signature" after the build shows each file's signer and timestamp, and fails the build where + one is missing. ## iOS (TestFlight) @@ -153,9 +158,11 @@ The release workflow builds the iOS app and uploads it to TestFlight: on every p (`main`), and for a dev build when a manual run asks for *platforms* `ios` or `all`. The **iOS** job (macOS runner) builds and signs the .ipa; the **TestFlight** job (Linux) uploads it with `scripts/upload-ios.py`, through the App Store Connect API, and waits until Apple has processed -it. The version is the one in `Cargo.toml` (a dev build's too, without its `-`: App Store -versions are at most three numbers), and the build number is the release workflow's: its run -number plus `RUN_NUMBER_OFFSET` (above). A build uploaded by hand needs a number above +it. Requests Apple drops are tried again, and a build App Store Connect has already (an earlier +attempt that got through though its answer didn't) counts as uploaded, so re-running the job is +always safe. The version is the one in `Cargo.toml` (a dev build's too, without its `-`: +App Store versions are at most three numbers), and the build number is the release workflow's: +its run number plus `RUN_NUMBER_OFFSET` (above). A build uploaded by hand needs a number above the last one. It needs the secrets `IOS_CERTIFICATE` (an Apple Distribution certificate with its key, a .p12 in diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json index 95dafc2..3506ff7 100644 --- a/apps/desktop/package-lock.json +++ b/apps/desktop/package-lock.json @@ -1,12 +1,12 @@ { "name": "morphgate-desktop", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "morphgate-desktop", - "version": "0.2.0", + "version": "0.2.1", "license": "MPL-2.0", "dependencies": { "@tauri-apps/api": "2.12.4", diff --git a/apps/desktop/package.json b/apps/desktop/package.json index f097f73..333e97c 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "morphgate-desktop", "private": true, - "version": "0.2.0", + "version": "0.2.1", "license": "MPL-2.0", "type": "module", "scripts": { diff --git a/apps/desktop/src-tauri/tauri.android.conf.json b/apps/desktop/src-tauri/tauri.android.conf.json index abd5b37..0f4f33a 100644 --- a/apps/desktop/src-tauri/tauri.android.conf.json +++ b/apps/desktop/src-tauri/tauri.android.conf.json @@ -2,7 +2,7 @@ "identifier": "com.morphgate.app", "bundle": { "android": { - "versionCode": 20000 + "versionCode": 20100 } } } diff --git a/assets/brand/README.md b/assets/brand/README.md index f31cd54..b2fa89a 100644 --- a/assets/brand/README.md +++ b/assets/brand/README.md @@ -12,6 +12,7 @@ the wordmark in a live font. | `morphgate-android-foreground.svg`, `-background.svg`, `-monochrome.svg` | Android's adaptive icon layers: the mark alone, scaled to stay inside the circle launchers cut, on the tile's colour; one-colour for themed icons. | | `morphgate-lockup-on-dark.svg` | On dark grounds (Console, terminal backgrounds). | | `morphgate-lockup-on-light.svg` | On light grounds (Greenbar, paper). | +| `morphgate-social-preview.png` | The repository's social preview on GitHub (Settings → General → Social preview), 1280 × 640: the lockup on the dark ground, the tagline, the platforms. | The phone icons come from `icon-manifest.json` (Android) and the iOS tile, and go to both `src-tauri/icons` and the generated projects (`gen/android`, `gen/apple`), which `tauri icon` diff --git a/assets/brand/morphgate-social-preview.png b/assets/brand/morphgate-social-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..25a8ddbbbeae72744b663d5281edaec93dd5040d GIT binary patch literal 78847 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

{ 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 bz$}qM=y#;g+Zz!=;1SYP(^f4~Mh5&J;p)b3 literal 0 HcmV?d00001 diff --git a/docs/development.md b/docs/development.md index 66d3a86..cee9e29 100644 --- a/docs/development.md +++ b/docs/development.md @@ -170,7 +170,7 @@ The reference server's tests (`server/tests/`) are the older conformance suite: All jobs run on GitHub's runners. -`.github/workflows/release.yml` builds releases on pushes to `develop` and `main` ([Releasing](#releasing)): a `plan` job (channel, version, build number, platforms, the release to upload to), the desktop matrix through `tauri-action`, the Android APK, and on iOS the signed `.ipa` and a `testflight` upload job on Linux. +`.github/workflows/release.yml` builds releases on pushes to `develop` and `main` ([Releasing](#releasing)): a `plan` job (channel, version, build number, platforms, the release to upload to), the desktop matrix through `tauri-action`, a `macos-notarize` job for the DMG, the Android APK, and on iOS the signed `.ipa` and a `testflight` upload job on Linux. The jobs that only talk to Apple are apart from the builds, so re-running a failed one doesn't build again; Windows signing retries the timestamp server inside the build ([RELEASING.md](../RELEASING.md)). ## Versioning diff --git a/scripts/upload-ios.py b/scripts/upload-ios.py index a546dd2..381f1db 100755 --- a/scripts/upload-ios.py +++ b/scripts/upload-ios.py @@ -7,6 +7,10 @@ The App Store Connect API key: ASC_KEY_ID and ASC_ISSUER_ID, and the .p8 at ASC_KEY_PATH (default ~/.apple/AuthKey_.p8). It needs the Admin or App Manager role. Needs PyJWT with cryptography. + +Apple's API and its upload storage drop a request now and then: requests that can be repeated +are, after a pause. A build App Store Connect has already (an earlier run that got through, +though its answer didn't) counts as uploaded. """ import hashlib import json @@ -25,6 +29,8 @@ os.environ.get("ASC_KEY_PATH") or pathlib.Path.home() / ".apple" / f"AuthKey_{KEY_ID}.p8" ).read_text() API = "https://api.appstoreconnect.apple.com" +# Pauses before each further try of a request that can be repeated. +PAUSES = (5, 15, 30, 60) def token(): @@ -37,19 +43,36 @@ def token(): ) -def api(method, path, body=None): - req = urllib.request.Request( - API + path, - data=json.dumps(body).encode() if body is not None else None, - method=method, - headers={"Authorization": f"Bearer {token()}", "Content-Type": "application/json"}, - ) - try: - with urllib.request.urlopen(req, timeout=60) as r: - raw = r.read() - return json.loads(raw) if raw else {} - except urllib.error.HTTPError as e: - sys.exit(f"{method} {path}: {e.code} {e.read().decode()[:1500]}") +def send(make, what, timeout, repeat): + """Sends the request `make()` builds; a repeatable one again after a dropped connection, a + timeout or a 5xx answer. Returns the body.""" + for pause in (*PAUSES, None) if repeat else (None,): + try: + with urllib.request.urlopen(make(), timeout=timeout) as r: + return r.read() + except urllib.error.HTTPError as e: + if e.code < 500 or pause is None: + sys.exit(f"{what}: {e.code} {e.read().decode()[:1500]}") + why = f"HTTP {e.code}" + except (urllib.error.URLError, TimeoutError, ConnectionError) as e: + if pause is None: + sys.exit(f"{what}: {e}") + why = str(e) + print(f"{what}: {why}; again in {pause} s") + time.sleep(pause) + + +def api(method, path, body=None, timeout=60, repeat=True): + def make(): + return urllib.request.Request( + API + path, + data=json.dumps(body).encode() if body is not None else None, + method=method, + headers={"Authorization": f"Bearer {token()}", "Content-Type": "application/json"}, + ) + + raw = send(make, f"{method} {path}", timeout, repeat) + return json.loads(raw) if raw else {} ipa, bundle_id, version, build = sys.argv[1:5] @@ -60,11 +83,19 @@ def api(method, path, body=None): sys.exit(f"no App Store Connect app for {bundle_id}: create it first (Apps → + → New App)") app = apps[0]["id"] +existing = api("GET", f"/v1/builds?filter%5Bapp%5D={app}&filter%5Bversion%5D={build}" + f"&filter%5BpreReleaseVersion.version%5D={version}&limit=1")["data"] +if existing: + state = existing[0]["attributes"].get("processingState") + print(f"{version} ({build}) is in App Store Connect already ({state}): nothing to upload") + sys.exit(0) + +# Not repeated: a retry after a lost answer could start a second upload of the same build. upload = api("POST", "/v1/buildUploads", {"data": { "type": "buildUploads", "attributes": {"cfBundleShortVersionString": version, "cfBundleVersion": build, "platform": "IOS"}, "relationships": {"app": {"data": {"type": "apps", "id": app}}}, -}})["data"] +}}, repeat=False)["data"] print("build upload", upload["id"]) file = api("POST", "/v1/buildUploadFiles", {"data": { @@ -72,22 +103,21 @@ def api(method, path, body=None): "attributes": {"fileName": pathlib.Path(ipa).name, "fileSize": len(data), "uti": "com.apple.ipa", "assetType": "ASSET"}, "relationships": {"buildUpload": {"data": {"type": "buildUploads", "id": upload["id"]}}}, -}})["data"] +}}, repeat=False)["data"] ops = file["attributes"]["uploadOperations"] print(f"uploading {len(data)} bytes in {len(ops)} parts") for op in ops: part = data[op["offset"]:op["offset"] + op["length"]] - req = urllib.request.Request(op["url"], data=part, method=op["method"], - headers={h["name"]: h["value"] for h in op.get("requestHeaders") or []}) - with urllib.request.urlopen(req, timeout=300) as r: - if r.status >= 300: - sys.exit(f"part {op.get('partNumber')}: HTTP {r.status}") + headers = {h["name"]: h["value"] for h in op.get("requestHeaders") or []} + send(lambda: urllib.request.Request(op["url"], data=part, method=op["method"], headers=headers), + f"part {op.get('partNumber')}", 300, True) +# Apple checks the whole file before it answers: give it time. api("PATCH", f"/v1/buildUploadFiles/{file['id']}", {"data": { "type": "buildUploadFiles", "id": file["id"], "attributes": {"uploaded": True, "sourceFileChecksums": { "file": {"hash": hashlib.md5(data).hexdigest(), "algorithm": "MD5"}}}, -}}) +}}, timeout=300) print("uploaded; Apple is processing it") for _ in range(120): From cd8de830f3efb10faf4933ccd7fcd32162270ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentino=20Me=C4=91imorec?= Date: Wed, 21 Oct 2026 12:34:26 +0200 Subject: [PATCH 2/2] Fix for e2e MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Valentino Međimorec --- README.md | 2 +- apps/desktop/e2e/appimage.mjs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 656443a..a3407be 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ encrypted sync you can self-host. - **Sync**: `vault-sync/v1`, open OpenAPI contract — [`spec/openapi.yaml`](spec/openapi.yaml); client `crates/mg-sync`, self-hostable reference server [`server/`](server) -Docs: [developer docs](docs/README.md) · [sync & crypto spec](docs/sync-crypto-spec.md) · [roadmap](ROADMAP.md) · [releasing](RELEASING.md) · +Docs: [developer docs](docs/README.md) · [sync & crypto spec](docs/sync-crypto-spec.md) · [self-host](https://morphgate.com/docs/self-hosting) · [roadmap](ROADMAP.md) · [releasing](RELEASING.md) · [changelog](CHANGELOG.md) ## Install diff --git a/apps/desktop/e2e/appimage.mjs b/apps/desktop/e2e/appimage.mjs index 8355bd7..69ade5a 100644 --- a/apps/desktop/e2e/appimage.mjs +++ b/apps/desktop/e2e/appimage.mjs @@ -440,6 +440,8 @@ try { await s.exec(`[...document.querySelectorAll(".sidebar-nav button")].find((b) => b.innerText.startsWith("Hosts")).click(); return true`); await s.wait(() => s.exec(`return document.querySelector(".panel.page h1")?.innerText === "Hosts" || null`), "the Hosts page"); await s.clickButton("Clouds…"); + // The page shows what to add once it has listed the sources. + await s.waitText("Connect Vallic Cloud", ".cloud-page", 30000); await s.clickButton("Connect Vallic Cloud"); await s.waitText("WXYZ-1234", ".cloud-sign-in", 30000); await s.screenshot(`${shots}/vallic-sign-in.png`); @@ -531,6 +533,7 @@ try { await s.exec(`[...document.querySelectorAll(".sidebar-nav button")].find((b) => b.innerText.startsWith("Hosts")).click(); return true`); await s.wait(() => s.exec(`return document.querySelector(".panel.page h1")?.innerText === "Hosts" || null`), "the Hosts page"); await s.clickButton("Clouds…"); + await s.waitText("123456789012", ".cloud-source", 30000); await s.exec( `const card = [...document.querySelectorAll(".cloud-source")].find((x) => x.innerText.includes("123456789012")); [...card.querySelectorAll("button")].find((b) => b.innerText === "Settings…").click(); return true`,