Skip to content

fix: Brittle response parsing from notarytool - #191

Merged
MarshallOfSound merged 8 commits into
electron:mainfrom
connorgmeehan:fix/print-notarize-error
May 14, 2024
Merged

MarshallOfSound merged 8 commits into
electron:mainfrom
connorgmeehan:fix/print-notarize-error

Conversation

@connorgmeehan

@connorgmeehan connorgmeehan commented Apr 30, 2024 •

Copy link
Copy Markdown
Contributor

Description

Electron builder is not handling responses from notarytool on my device (MacOS Sonoma 14.4.1, XCode 15.2). The issue is it's trying to JSON.parse a string with the value:

Error: HTTP status code: 401. Invalid credentials. Username or password is incorrect. Use the app-specific password generated at appleid.apple.com. Ensure that all authentication arguments are correct.

Solution

  • Fix the ordering of the status code check for the result of spawn
  • For extra safety, catch errors when JSON.parse fails.

Compared log when errors

Previous logs

• electron-builder  version=24.13.3 os=23.4.0
  • loaded configuration  file=/Users/connormeehan/projects/eyejack/eyejack-creator/electron-builder.config.js
  • description is missed in the package.json  appPackageFile=/Users/connormeehan/projects/eyejack/eyejack-creator/dist_electron/bundled/package.json
  • author is missed in the package.json  appPackageFile=/Users/connormeehan/projects/eyejack/eyejack-creator/dist_electron/bundled/package.json
  • writing effective config  file=dist_electron/bundled/dist/builder-effective-config.yaml
  • rebuilding native dependencies  dependencies=sharp@0.32.6 platform=darwin arch=x64
  • install prebuilt binary  name=sharp version=0.32.6 platform=darwin arch=x64 napi=
                                                                                       • packaging       platform=darwin arch=x64 electron=14.2.9 appOutDir=dist_electron/bundled/dist/mac
  • signing         file=dist_electron/bundled/dist/mac/EyeJack Creator 2024.app platform=darwin type=distribution identity=34E41E43ADF5846B288472E3BA659E71DC2369DB provisioningProfile=none
  ⨯ Unexpected token 'E', "Error: HTT"... is not valid JSON  failedTask=build stackTrace=SyntaxError: Unexpected token 'E', "Error: HTT"... is not valid JSON
SyntaxError: Unexpected token 'E', "Error: HTT"... is not valid JSON
    at JSON.parse (<anonymous>)
    at /Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/node_modules/@electron/notarize/src/notarytool.ts:79:25
    at Generator.next (<anonymous>)
    at fulfilled (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/node_modules/@electron/notarize/lib/notarytool.js:28:58)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
From previous event:
    at processImmediate (node:internal/timers:478:21)
From previous event:
    at readDirectoryAndSign (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/macPackager.ts:478:29)
    at MacPackager.signApp (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/macPackager.ts:488:11)
    at MacPackager.doSignAfterPack (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/platformPackager.ts:336:21)
    at MacPackager.doPack (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/platformPackager.ts:321:7)
    at MacPackager.pack (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/macPackager.ts:198:9)
    at Packager.doBuild (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/packager.ts:445:9)
    at executeFinally (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/builder-util/src/promise.ts:12:14)
    at Packager._build (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/packager.ts:379:31)
    at Packager.build (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/app-builder-lib/src/packager.ts:340:12)
    at executeFinally (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/builder-util/src/promise.ts:12:14)

New logs

• electron-builder  version=24.13.3 os=23.4.0
  • loaded configuration  file=/Users/connormeehan/projects/eyejack/eyejack-creator/electron-builder.config.js
  • description is missed in the package.json  appPackageFile=/Users/connormeehan/projects/eyejack/eyejack-creator/dist_electron/bundled/package.json
  • author is missed in the package.json  appPackageFile=/Users/connormeehan/projects/eyejack/eyejack-creator/dist_electron/bundled/package.json
  • writing effective config  file=dist_electron/bundled/dist/builder-effective-config.yaml
  • rebuilding native dependencies  dependencies=sharp@0.32.6 platform=darwin arch=x64
  • install prebuilt binary  name=sharp version=0.32.6 platform=darwin arch=x64 napi=
                                                                                       • packaging       platform=darwin arch=x64 electron=14.2.9 appOutDir=dist_electron/bundled/dist/mac
  • signing         file=dist_electron/bundled/dist/mac/EyeJack Creator 2024.app platform=darwin type=distribution identity=34E41E43ADF5846B288472E3BA659E71DC2369DB provisioningProfile=none
  • skipped macOS notarization  reason=`notarize` options were set explicitly `false`
  ⨯ Failed to notarize via notarytool

Error: HTTP status code: 401. Invalid credentials. Username or password is incorrect. Use the app-specific password generated at appleid.apple.com. Ensure that all authentication arguments are correct.
  failedTask=build stackTrace=Error: Failed to notarize via notarytool

                     Error: HTTP status code: 401. Invalid credentials. Username or password is incorrect. Use the app-specific password generated at appleid.apple.com. Ensure that all authentication arguments are correct.

                         at /Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/@electron/notarize/src/notarytool.ts:87:13
    at Generator.next (<anonymous>)
    at fulfilled (/Users/connormeehan/projects/eyejack/eyejack-creator/node_modules/@electron/notarize/lib/notarytool.js:28:58)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)

@connorgmeehan
connorgmeehan requested a review from a team as a code owner April 30, 2024 03:07
@connorgmeehan
connorgmeehan marked this pull request as draft April 30, 2024 03:31
@connorgmeehan
connorgmeehan marked this pull request as ready for review May 6, 2024 00:32
@rotu

rotu commented May 7, 2024

Copy link
Copy Markdown
Contributor

Thanks for taking this on! It's a huge improvement by not truncating or swallowing the non-JSON text.

Comment thread src/notarytool.ts Outdated
@connorgmeehan
connorgmeehan requested a review from rotu May 8, 2024 08:22
Comment thread src/notarytool.ts Outdated
Comment thread src/notarytool.ts Outdated
@rotu

rotu commented May 8, 2024

Copy link
Copy Markdown
Contributor

I'm not sure what the return code actually tells us. Does a return code of 0 mean notarization succeeded? Does it mean that the request was submitted correctly (and may have failed)?

Here are the four cases to consider:

  1. exit code non-zero, non-JSON output (the problem case): Failure. Report text output as-is.
  2. exit code non-zero, JSON output: (I originally thought this wouldn't happen. Now I think it could)
  3. exit code zero, non-JSON output: I still think this is impossible.
  4. exit code zero, JSON output. I think the output of notarytool log may contain non-error warnings so it should be printed regardless.

@connorgmeehan

connorgmeehan commented May 8, 2024 •

Copy link
Copy Markdown
Contributor Author

From a little testing here's what I found

  • Happy path: Uploads and notarizes successfully. Returns JSON with exit-code 0
  • ERR: Uploads but invalid. Return JSON with exit-code !== 0.
  • ERR: Wrong arguments to notarytool (not uploaded). Returns text with exit-code !== 0 (The issue this PR addresses)
❯ xcrun notarytool submit ./EyeJack\ Creator\ 2024-3.4.2.dmg  ....AUTH_ARGS... -f json --wait
{"status":"Accepted","id":"fa15ba57-3b66-4934-b7d1-937996f94f05","message":"Processing complete"}

❯ echo $?
0

❯ xcrun notarytool submit ./EyeJack\ Creator\ 2024-3.4.2-mac.zip ...AUTH_ARGS...  -f json --wait --force
{"id":"beb99749-fd68-4d25-ba38-1a6a343ae96e","status":"Invalid","message":"Processing complete"}

❯ echo $?
130

Does a return code of 0 mean notarization succeeded?

Yep, seems to be

@connorgmeehan
connorgmeehan force-pushed the fix/print-notarize-error branch from 5dc95c6 to 195de70 Compare May 8, 2024 23:29
@connorgmeehan
connorgmeehan requested a review from rotu May 8, 2024 23:30

@rotu rotu left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks awesome to me :-)

…n#195)

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
@QuentinMacheda

Copy link
Copy Markdown

I hope this fix will be released soon, I'm stuck not knowing the cause of the error I get...

@rotu

rotu commented May 14, 2024

Copy link
Copy Markdown
Contributor

@jonluca could you get this out the door or get another active maintainer's eyes on it please?

@MarshallOfSound MarshallOfSound removed their assignment May 14, 2024
@MarshallOfSound
MarshallOfSound merged commit 8440fa1 into electron:main May 14, 2024
@continuous-auth

Copy link
Copy Markdown

🎉 This PR is included in version 2.3.2 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants