Skip to content

fix: generate stubExecutableExe and sign it #8959

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 28 commits into
base: master
Choose a base branch
from

Conversation

beyondkmp
Copy link
Collaborator

@beyondkmp beyondkmp commented Mar 14, 2025

fix #8952

Root Cause

when createExecutableStubForExe is executed, WriteZipToSetup writes information to the file, essentially creating a new file, which invalidates the original signature.
Image

https://github.com/Squirrel/Squirrel.Windows/blob/51f5e2cb01add79280a53d51e8d0cfa20f8c9f9f/src/Update/Program.cs#L633-L647

Image

How to fix
Apply a patch to the Squirrel Windows source code(Squirrel/Squirrel.Windows#1903). For the existing stub exe files, don't generate them anymore. Then, a new stub exe can be generated in Electron Builder and signed.

Copy link

changeset-bot bot commented Mar 14, 2025

⚠️ No Changeset found

Latest commit: 439c4ce

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@beyondkmp beyondkmp marked this pull request as draft March 14, 2025 08:06
@beyondkmp beyondkmp marked this pull request as ready for review March 16, 2025 01:12
@beyondkmp beyondkmp requested a review from mmaietta March 16, 2025 01:47
@t3chguy
Copy link
Contributor

t3chguy commented Mar 17, 2025

Seems to fail to build at least for ARM64 package: https://github.com/element-hq/element-desktop/actions/runs/13895690921/job/38875908510?pr=2211 looks like my testing is insufficient, doesn't bring in the vendor dir - looks like patch-package doesn't support binary files ds300/patch-package#193

@t3chguy
Copy link
Contributor

t3chguy commented Mar 17, 2025

Looks like package.json files needs updating to include vendor dir

@t3chguy
Copy link
Contributor

t3chguy commented Mar 17, 2025

image

Looks like it works sans the package.json not including vendor in the package - good job @beyondkmp

I also checked that the number of signings remained the same

Copy link
Collaborator

@mmaietta mmaietta left a comment

Choose a reason for hiding this comment

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

Adding the vendor directory adds a few megabytes (quick maffs) to the repo, which is the antipattern from what electron-builder-binaries is supposed to be used for. IIRC though, the squirrel windows target/package must be installed separately and isn't part of the electron-builder dependency tree, right? In this case, I think it's safe to add the vendor files (albeit I'll still need to verify file origin). In general though, we should avoid adding vendor files directly to electron-builder unless absolutely necessary (which is the case with this fix)

@t3chguy
Copy link
Contributor

t3chguy commented Mar 17, 2025

the squirrel windows target/package must be installed separately and isn't part of the electron-builder dependency tree, right?

Yup, electron-builder-squirrel-windows https://www.npmjs.com/package/electron-builder-squirrel-windows is not a transitive dependency of electron-builder

@beyondkmp
Copy link
Collaborator Author

Looks like package.json files needs updating to include vendor dir

my bad. Added.

@beyondkmp
Copy link
Collaborator Author

These vendor files are copied from the GitHub Actions workflow at https://github.com/beyondkmp/Squirrel.Windows/actions/runs/13871759240/job/38819263248 and the other files(like 7zip,nuget) are copiled from https://github.com/electron/windows-installer/tree/main/vendor.

https://github.com/Squirrel/Squirrel.Windows/pull/1903/files
The code changes for Squirrel Windows are located here.

@beyondkmp
Copy link
Collaborator Author

beyondkmp commented Apr 3, 2025

@t3chguy
We hope that the upstream will merge this MR (https://github.com/Squirrel/Squirrel.Windows/pull/1903/files ) so that an official upstream version of the Squirrel Windows vendor can be released. However, it seems that there has been no activity from the upstream.

@beyondkmp
Copy link
Collaborator Author

@mmaietta Do you have any thoughts on this MR?

@mmaietta
Copy link
Collaborator

So a couple notes:

  • I'm very adverse to committing binaries to this repo for tools that are meant to be downloaded on-demand (product requirement 1). They unnecessarily bloat the repo size - especially the size of the binaries this PR proposes to add.
  • I'm against not using official sources for binaries (product requirement 2)

In the current state, I'm not in favor of merging this PR.

@beyondkmp, what if I wrote a script that git clone Squirrel.Windows, applied your PR via a patch file (similar to how electron does when building from chromium), then published within the electron-builder-binaries repo? I'm thinking I need to revisit that repo to get binaries updated, but through an official always-reproducible GH action/build environment.

@beyondkmp
Copy link
Collaborator Author

beyondkmp commented Apr 11, 2025

@mmaietta I think it’s fine. I’ve already cloned it, and it can run successfully on GitHub Actions, and the build completes without issues. You can refer to this directly.

https://github.com/beyondkmp/Squirrel.Windows

@mmaietta
Copy link
Collaborator

@beyondkmp if we were to use Squirrel.Windows distributed via electron-builder-binaries (once I get a CI/CD set up there), do you think we'd need to revert the electron-winstaller changes back to the previous implementation then?

@beyondkmp
Copy link
Collaborator Author

It probably won't work well, as the newer version of Squirrel Windows has changed some things. My suggestion is still to use the Windows Installer. When there’s a new version, it can be synced directly. If we use our own implementation, some issues may not be synced in time.

@mmaietta
Copy link
Collaborator

You can refer to this directly.
https://github.com/beyondkmp/Squirrel.Windows

I'm against using a fork for the project.

I'd rather git clone the source repo in a build container, apply your changes as a patch file, then build the artifact fresh for Squirrel.Windows within the build container/runner, which then would be published directly from electron-builder-binaries. (I actually have this approach ready in my current work on the electron-builder-binaries CI pipeline)
Is it possible to provide our own vendor dir for electron-winstaller? And/or leverage our own signing flow or something like that?

If changes are needed in a dedicated electron/* repo, I can definitely sync up with the electronHQ folks to discuss the topic live during one of our biweekly syncs

@beyondkmp
Copy link
Collaborator Author

What I mean is that you can refer to how this fork uses actions to automatically generate builds, rather than saying that you should use this fork directly.

@mmaietta
Copy link
Collaborator

mmaietta commented Apr 18, 2025

The purpose of electron-builder-binaries is to provide vendor files on-demand based on the use-case/packaging targets required for a build. I'm against committing any vendor files to this project directly. Willing to make exceptions though, just not for files that are measured in megabytes

@beyondkmp
Copy link
Collaborator Author

beyondkmp commented Apr 21, 2025

The purpose of electron-builder-binaries is to provide vendor files on-demand based on the use-case/packaging targets required for a build. I'm against committing any vendor files to this project directly. Willing to make exceptions though, just not for files that are measured in megabytes

ok, got it. I'll set it to draft status first, and once the Squirrel.Windows update in electron-builder-binaries is complete, we can come back to update this PR.

@beyondkmp beyondkmp marked this pull request as draft April 21, 2025 02:26
@mmaietta
Copy link
Collaborator

@beyondkmp new squirrel.windows in electron-builder-binaries with your patch applied can be found in this "compile" PR. (The CI/CD takes care of generating and committing the artifacts post-merge of the PR through Changesets GHA)
electron-userland/electron-builder-binaries#67

@mmaietta
Copy link
Collaborator

squirrel.windows@1.0.0 using Squirrel 2.0.1 artifact has been released

beyondkmp added 2 commits May 29, 2025 08:20
… binaries

- Added logic to download and copy custom Squirrel binaries if the specified vendor directory is not accessible.
- Removed outdated vendor binaries and configuration files to streamline the package.
@beyondkmp beyondkmp marked this pull request as ready for review May 29, 2025 00:21
@beyondkmp beyondkmp requested a review from mmaietta May 29, 2025 00:21
@github-actions github-actions bot added the linux label May 29, 2025
@github-actions github-actions bot removed the linux label Jun 5, 2025
const filePath = path.join(tmpVendorDirectory, file)
log.debug({ file: filePath }, "signing vendor executable")
await this.packager.sign(filePath)
break
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Minor: Can avoid the for-if-break approach with a find

const file = files.find(f => f === "Squirrel.exe")

That being said, it looks like we're just trying to sign that one file, right?

const filePath = path.join(tmpVendorDirectory, "Squirrel.exe")
if (filePath) { // do we need this check or should Squirrel.exe always be present?
   log.debug({ file: filePath }, "signing vendor executable")
   await this.packager.sign(filePath)
}

await fs.promises.cp(vendorDirectory, tmpVendorDirectory, { recursive: true })
if (customSquirrelBin && customSquirrelBin.length > 0) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

I'm not sure what this is checking for. Are you intending?
!isEmptyOrSpaces(customSquirrelBin) && await exists(customSquirrelBin)

await this.packager.sign(stubExePath)
}
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Wait, why do we need to copy a ${fileNameWithoutExt}_ExecutionStub.exe for every .exe file in the appOutDir? Is that to be expected or are there only specific files that we need the stub for?

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

Successfully merging this pull request may close these issues.

Missing signature on Squirrel ExecutionStub
3 participants