diff --git a/client/electron/assets/installer.nsh b/client/electron/assets/installer.nsh index 6182b2cb26e..efc69008092 100644 --- a/client/electron/assets/installer.nsh +++ b/client/electron/assets/installer.nsh @@ -1,5 +1,6 @@ !define WINFSP_VERSION "2.1.25156" !define WINFSP_FILE "winfsp-${WINFSP_VERSION}.msi" +!define VC_REDIST_FILE "vc_redist.x64.exe" !macro installWinFSP File /oname=$PLUGINSDIR\${WINFSP_FILE} ${PROJECT_DIR}\build\${WINFSP_FILE} @@ -25,6 +26,12 @@ ${EndIf} !macroend +!macro installVCRedist + File /oname=$PLUGINSDIR\${VC_REDIST_FILE} ${PROJECT_DIR}\build\${VC_REDIST_FILE} + ExecWait '"$PLUGINSDIR\${VC_REDIST_FILE}" /install /passive /norestart' +!macroend + !macro customInstall !insertmacro mayInstallWinFSP + !insertmacro installVCRedist !macroend diff --git a/client/electron/package.cjs b/client/electron/package.cjs index 92b842c2146..7d5e5f513ec 100644 --- a/client/electron/package.cjs +++ b/client/electron/package.cjs @@ -152,7 +152,15 @@ const options = { buildResources: 'assets', }, - files: ['assets/**/*', '!assets/installer.nsh', 'build/**/*', '!build/**/*.js.map', '!build/**/*.msi', 'app/**/*'], + files: [ + 'assets/**/*', + '!assets/installer.nsh', + 'build/**/*', + '!build/**/*.js.map', + '!build/**/*.msi', + '!build/vc_redist.x64.exe', + 'app/**/*', + ], publish: publishConfig, diff --git a/client/electron/scripts/before-pack.cjs b/client/electron/scripts/before-pack.cjs index bb504d7507d..844717a3080 100644 --- a/client/electron/scripts/before-pack.cjs +++ b/client/electron/scripts/before-pack.cjs @@ -9,10 +9,15 @@ const WINFSP_URL = `https://github.com/winfsp/winfsp/releases/download/${WINFSP_ const WINFSP_SHA256SUM = 'Bzpw4A93Qj40vtmLhuYA3vkzk7pYIiBPrFeikyTbn3o='; const WINFSP_DEST_FILE = `build/winfsp-${WINFSP_VERSION}.msi`; +// Stable permalink to the latest VC++ 2015-2022 redistributable (covers vc14–vc17). +// No version pinning is possible with this URL, so no sha256 verification. +const VC_REDIST_URL = 'https://aka.ms/vc14/vc_redist.x64.exe'; +const VC_REDIST_DEST_FILE = 'build/vc_redist.x64.exe'; + /** * * @param {string} url - * @param {string} sha256sum The expected sha256sum in base64 + * @param {string | null} sha256sum The expected sha256sum in base64, or null to skip verification * @param {path} dest */ async function downloadFile(url, sha256sum, dest) { @@ -41,9 +46,11 @@ async function downloadFile(url, sha256sum, dest) { }); await pipeline(httpStream, hashStream, destStream); - const fileDigest = hash.digest('base64'); - if (fileDigest !== sha256sum) { - throw new Error(`Failed to download ${url}: sha256sum mismatch: got ${fileDigest} expected ${sha256sum}`); + if (sha256sum !== null) { + const fileDigest = hash.digest('base64'); + if (fileDigest !== sha256sum) { + throw new Error(`Failed to download ${url}: sha256sum mismatch: got ${fileDigest} expected ${sha256sum}`); + } } } @@ -57,6 +64,10 @@ exports.default = async function beforePack(context) { await downloadFile(WINFSP_URL, WINFSP_SHA256SUM, WINFSP_DEST_FILE).then(() => console.log(`WinFSP downloaded to ${WINFSP_DEST_FILE}`), ); + console.log('Downloading VC++ Redistributable'); + await downloadFile(VC_REDIST_URL, null, VC_REDIST_DEST_FILE).then(() => + console.log(`VC++ Redistributable downloaded to ${VC_REDIST_DEST_FILE}`), + ); break; default: console.log(`No hook for platform ${context.electronPlatformName}`);