electron-updater 4.3.0 → 4.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -94,7 +94,8 @@ export declare abstract class AppUpdater extends EventEmitter {
94
94
  */
95
95
  checkForUpdates(): Promise<UpdateCheckResult>;
96
96
  isUpdaterActive(): boolean;
97
- checkForUpdatesAndNotify(): Promise<UpdateCheckResult | null>;
97
+ checkForUpdatesAndNotify(downloadNotification?: DownloadNotification): Promise<UpdateCheckResult | null>;
98
+ private formatDownloadNotification;
98
99
  private isStagingMatch;
99
100
  private computeFinalHeaders;
100
101
  private isUpdateAvailable;
@@ -149,6 +150,10 @@ export interface DownloadExecutorTask {
149
150
  readonly task: (destinationFile: string, downloadOptions: DownloadOptions, packageFile: string | null, removeTempDirIfAny: () => Promise<any>) => Promise<any>;
150
151
  readonly done?: (event: UpdateDownloadedEvent) => Promise<any>;
151
152
  }
153
+ export interface DownloadNotification {
154
+ body: string;
155
+ title: string;
156
+ }
152
157
  /** @private */
153
158
  export interface TestOnlyUpdaterOptions {
154
159
  platform: ProviderPlatform;
package/out/AppUpdater.js CHANGED
@@ -375,7 +375,7 @@ class AppUpdater extends _events().EventEmitter {
375
375
  } // noinspection JSUnusedGlobalSymbols
376
376
 
377
377
 
378
- checkForUpdatesAndNotify() {
378
+ checkForUpdatesAndNotify(downloadNotification) {
379
379
  if (!this.isUpdaterActive()) {
380
380
  return Promise.resolve(null);
381
381
  }
@@ -394,15 +394,28 @@ class AppUpdater extends _events().EventEmitter {
394
394
  }
395
395
 
396
396
  downloadPromise.then(() => {
397
- new (_electron().Notification)({
398
- title: "A new update is ready to install",
399
- body: `${this.app.name} version ${it.updateInfo.version} has been downloaded and will be automatically installed on exit`
400
- }).show();
397
+ const notificationContent = this.formatDownloadNotification(it.updateInfo.version, this.app.name, downloadNotification);
398
+ new (_electron().Notification)(notificationContent).show();
401
399
  });
402
400
  return it;
403
401
  });
404
402
  }
405
403
 
404
+ formatDownloadNotification(version, appName, downloadNotification) {
405
+ if (downloadNotification == null) {
406
+ downloadNotification = {
407
+ title: "A new update is ready to install",
408
+ body: `{appName} version {version} has been downloaded and will be automatically installed on exit`
409
+ };
410
+ }
411
+
412
+ downloadNotification = {
413
+ title: downloadNotification.title.replace("{appName}", appName).replace("{version}", version),
414
+ body: downloadNotification.body.replace("{appName}", appName).replace("{version}", version)
415
+ };
416
+ return downloadNotification;
417
+ }
418
+
406
419
  async isStagingMatch(updateInfo) {
407
420
  const rawStagingPercentage = updateInfo.stagingPercentage;
408
421
  let stagingPercentage = rawStagingPercentage;
@@ -444,7 +457,7 @@ class AppUpdater extends _events().EventEmitter {
444
457
  const latestVersion = (0, _semver().parse)(updateInfo.version);
445
458
 
446
459
  if (latestVersion == null) {
447
- throw (0, _builderUtilRuntime().newError)(`This file could not be downloaded, or the latest version (from update server) does not have a valid semver version: "${latestVersion}"`, "ERR_UPDATER_INVALID_VERSION");
460
+ throw (0, _builderUtilRuntime().newError)(`This file could not be downloaded, or the latest version (from update server) does not have a valid semver version: "${updateInfo.version}"`, "ERR_UPDATER_INVALID_VERSION");
448
461
  }
449
462
 
450
463
  const currentVersion = this.currentVersion;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AppUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllPublishOptions, asArray, CancellationToken, newError, PublishConfiguration, UpdateInfo, UUID, DownloadOptions, CancellationError } from \"builder-util-runtime\"\nimport { randomBytes } from \"crypto\"\nimport { Notification } from \"electron\"\nimport { EventEmitter } from \"events\"\nimport { ensureDir, outputFile, readFile, rename, unlink } from \"fs-extra\"\nimport { OutgoingHttpHeaders } from \"http\"\nimport { safeLoad } from \"js-yaml\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { eq as isVersionsEqual, gt as isVersionGreaterThan, lt as isVersionLessThan, parse as parseVersion, prerelease as getVersionPreleaseComponents, SemVer } from \"semver\"\nimport { AppAdapter } from \"./AppAdapter\"\nimport { createTempUpdateFile, DownloadedUpdateHelper } from \"./DownloadedUpdateHelper\"\nimport { ElectronAppAdapter } from \"./ElectronAppAdapter\"\nimport { ElectronHttpExecutor, getNetSession } from \"./electronHttpExecutor\"\nimport { GenericProvider } from \"./providers/GenericProvider\"\nimport { DOWNLOAD_PROGRESS, Logger, Provider, ResolvedUpdateFileInfo, UPDATE_DOWNLOADED, UpdateCheckResult, UpdateDownloadedEvent, UpdaterSignal } from \"./main\"\nimport { createClient, isUrlProbablySupportMultiRangeRequests } from \"./providerFactory\"\nimport { ProviderPlatform } from \"./providers/Provider\"\nimport Session = Electron.Session\n\nexport abstract class AppUpdater extends EventEmitter {\n /**\n * Whether to automatically download an update when it is found.\n */\n autoDownload: boolean = true\n\n /**\n * Whether to automatically install a downloaded update on app quit (if `quitAndInstall` was not called before).\n *\n * Applicable only on Windows and Linux.\n */\n autoInstallOnAppQuit: boolean = true\n\n /**\n * *GitHub provider only.* Whether to allow update to pre-release versions. Defaults to `true` if application version contains prerelease components (e.g. `0.12.1-alpha.1`, here `alpha` is a prerelease component), otherwise `false`.\n *\n * If `true`, downgrade will be allowed (`allowDowngrade` will be set to `true`).\n */\n allowPrerelease: boolean = false\n\n /**\n * *GitHub provider only.* Get all release notes (from current version to latest), not just the latest.\n * @default false\n */\n fullChangelog: boolean = false\n\n /**\n * Whether to allow version downgrade (when a user from the beta channel wants to go back to the stable channel).\n *\n * Taken in account only if channel differs (pre-release version component in terms of semantic versioning).\n *\n * @default false\n */\n allowDowngrade: boolean = false\n\n /**\n * The current application version.\n */\n readonly currentVersion: SemVer\n\n private _channel: string | null = null\n\n protected downloadedUpdateHelper: DownloadedUpdateHelper | null = null\n\n /**\n * Get the update channel. Not applicable for GitHub. Doesn't return `channel` from the update configuration, only if was previously set.\n */\n get channel(): string | null {\n return this._channel\n }\n\n /**\n * Set the update channel. Not applicable for GitHub. Overrides `channel` in the update configuration.\n *\n * `allowDowngrade` will be automatically set to `true`. If this behavior is not suitable for you, simple set `allowDowngrade` explicitly after.\n */\n set channel(value: string | null) {\n if (this._channel != null) {\n // noinspection SuspiciousTypeOfGuard\n if (typeof value !== \"string\") {\n throw newError(`Channel must be a string, but got: ${value}`, \"ERR_UPDATER_INVALID_CHANNEL\")\n }\n else if (value.length === 0) {\n throw newError(`Channel must be not an empty string`, \"ERR_UPDATER_INVALID_CHANNEL\")\n }\n }\n\n this._channel = value\n this.allowDowngrade = true\n }\n\n /**\n * The request headers.\n */\n requestHeaders: OutgoingHttpHeaders | null = null\n\n protected _logger: Logger = console\n\n // noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols\n get netSession(): Session {\n return getNetSession()\n }\n\n /**\n * The logger. You can pass [electron-log](https://github.com/megahertz/electron-log), [winston](https://github.com/winstonjs/winston) or another logger with the following interface: `{ info(), warn(), error() }`.\n * Set it to `null` if you would like to disable a logging feature.\n */\n get logger(): Logger | null {\n return this._logger\n }\n\n set logger(value: Logger | null) {\n this._logger = value == null ? new NoOpLogger() : value\n }\n\n // noinspection JSUnusedGlobalSymbols\n /**\n * For type safety you can use signals, e.g. `autoUpdater.signals.updateDownloaded(() => {})` instead of `autoUpdater.on('update-available', () => {})`\n */\n readonly signals = new UpdaterSignal(this)\n\n private _appUpdateConfigPath: string | null = null\n\n // noinspection JSUnusedGlobalSymbols\n /**\n * test only\n * @private\n */\n set updateConfigPath(value: string | null) {\n this.clientPromise = null\n this._appUpdateConfigPath = value\n this.configOnDisk = new Lazy<any>(() => this.loadUpdateConfig())\n }\n\n private clientPromise: Promise<Provider<any>> | null = null\n\n protected readonly stagingUserIdPromise = new Lazy<string>(() => this.getOrCreateStagingUserId())\n\n // public, allow to read old config for anyone\n /** @internal */\n configOnDisk = new Lazy<any>(() => this.loadUpdateConfig())\n\n private checkForUpdatesPromise: Promise<UpdateCheckResult> | null = null\n\n protected readonly app: AppAdapter\n\n protected updateInfoAndProvider: UpdateInfoAndProvider | null = null\n\n /** @internal */\n readonly httpExecutor: ElectronHttpExecutor\n\n protected constructor(options: AllPublishOptions | null | undefined, app?: AppAdapter) {\n super()\n\n this.on(\"error\", (error: Error) => {\n this._logger.error(`Error: ${error.stack || error.message}`)\n })\n\n if (app == null) {\n this.app = new ElectronAppAdapter()\n this.httpExecutor = new ElectronHttpExecutor((authInfo, callback) => this.emit(\"login\", authInfo, callback))\n }\n else {\n this.app = app\n this.httpExecutor = null as any\n }\n\n const currentVersionString = this.app.version\n const currentVersion = parseVersion(currentVersionString)\n if (currentVersion == null) {\n throw newError(`App version is not a valid semver version: \"${currentVersionString}\"`, \"ERR_UPDATER_INVALID_VERSION\")\n }\n this.currentVersion = currentVersion\n this.allowPrerelease = hasPrereleaseComponents(currentVersion)\n\n if (options != null) {\n this.setFeedURL(options)\n\n if (typeof options !== \"string\" && options.requestHeaders) {\n this.requestHeaders = options.requestHeaders\n }\n }\n }\n\n //noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols\n getFeedURL(): string | null | undefined {\n return \"Deprecated. Do not use it.\"\n }\n\n /**\n * Configure update provider. If value is `string`, [GenericServerOptions](/configuration/publish#genericserveroptions) will be set with value as `url`.\n * @param options If you want to override configuration in the `app-update.yml`.\n */\n setFeedURL(options: PublishConfiguration | AllPublishOptions | string) {\n const runtimeOptions = this.createProviderRuntimeOptions()\n // https://github.com/electron-userland/electron-builder/issues/1105\n let provider: Provider<any>\n if (typeof options === \"string\") {\n provider = new GenericProvider({provider: \"generic\", url: options}, this, {\n ...runtimeOptions,\n isUseMultipleRangeRequest: isUrlProbablySupportMultiRangeRequests(options),\n })\n }\n else {\n provider = createClient(options, this, runtimeOptions)\n }\n this.clientPromise = Promise.resolve(provider)\n }\n\n /**\n * Asks the server whether there is an update.\n */\n checkForUpdates(): Promise<UpdateCheckResult> {\n let checkForUpdatesPromise = this.checkForUpdatesPromise\n if (checkForUpdatesPromise != null) {\n this._logger.info(\"Checking for update (already in progress)\")\n return checkForUpdatesPromise\n }\n\n const nullizePromise = () => this.checkForUpdatesPromise = null\n\n this._logger.info(\"Checking for update\")\n checkForUpdatesPromise = this.doCheckForUpdates()\n .then(it => {\n nullizePromise()\n return it\n })\n .catch(e => {\n nullizePromise()\n this.emit(\"error\", e, `Cannot check for updates: ${(e.stack || e).toString()}`)\n throw e\n })\n\n this.checkForUpdatesPromise = checkForUpdatesPromise\n return checkForUpdatesPromise\n }\n\n public isUpdaterActive(): boolean {\n if (!this.app.isPackaged) {\n this._logger.info(\"Skip checkForUpdatesAndNotify because application is not packed\")\n return false\n }\n return true\n }\n\n // noinspection JSUnusedGlobalSymbols\n checkForUpdatesAndNotify(): Promise<UpdateCheckResult | null> {\n if (!this.isUpdaterActive()) {\n return Promise.resolve(null)\n }\n\n return this.checkForUpdates()\n .then(it => {\n const downloadPromise = it.downloadPromise\n if (downloadPromise == null) {\n const debug = this._logger.debug\n if (debug != null) {\n debug(\"checkForUpdatesAndNotify called, downloadPromise is null\")\n }\n return it\n }\n\n downloadPromise\n .then(() => {\n new Notification({\n title: \"A new update is ready to install\",\n body: `${this.app.name} version ${it.updateInfo.version} has been downloaded and will be automatically installed on exit`\n }).show()\n })\n\n return it\n })\n }\n\n private async isStagingMatch(updateInfo: UpdateInfo): Promise<boolean> {\n const rawStagingPercentage = updateInfo.stagingPercentage\n let stagingPercentage = rawStagingPercentage\n if (stagingPercentage == null) {\n return true\n }\n\n stagingPercentage = parseInt(stagingPercentage as any, 10)\n if (isNaN(stagingPercentage)) {\n this._logger.warn(`Staging percentage is NaN: ${rawStagingPercentage}`)\n return true\n }\n\n // convert from user 0-100 to internal 0-1\n stagingPercentage = stagingPercentage / 100\n\n const stagingUserId = await this.stagingUserIdPromise.value\n const val = UUID.parse(stagingUserId).readUInt32BE(12)\n const percentage = (val / 0xFFFFFFFF)\n this._logger.info(`Staging percentage: ${stagingPercentage}, percentage: ${percentage}, user id: ${stagingUserId}`)\n return percentage < stagingPercentage\n }\n\n private computeFinalHeaders(headers: OutgoingHttpHeaders) {\n if (this.requestHeaders != null) {\n Object.assign(headers, this.requestHeaders)\n }\n return headers\n }\n\n private async isUpdateAvailable(updateInfo: UpdateInfo): Promise<boolean> {\n const latestVersion = parseVersion(updateInfo.version)\n if (latestVersion == null) {\n throw newError(`This file could not be downloaded, or the latest version (from update server) does not have a valid semver version: \"${latestVersion}\"`, \"ERR_UPDATER_INVALID_VERSION\")\n }\n\n const currentVersion = this.currentVersion\n if (isVersionsEqual(latestVersion, currentVersion)) {\n return false\n }\n\n const isStagingMatch = await this.isStagingMatch(updateInfo)\n if (!isStagingMatch) {\n return false\n }\n\n // https://github.com/electron-userland/electron-builder/pull/3111#issuecomment-405033227\n // https://github.com/electron-userland/electron-builder/pull/3111#issuecomment-405030797\n const isLatestVersionNewer = isVersionGreaterThan(latestVersion, currentVersion)\n const isLatestVersionOlder = isVersionLessThan(latestVersion, currentVersion)\n\n if (isLatestVersionNewer) {\n return true\n }\n return this.allowDowngrade && isLatestVersionOlder;\n }\n\n protected async getUpdateInfoAndProvider(): Promise<UpdateInfoAndProvider> {\n await this.app.whenReady()\n\n if (this.clientPromise == null) {\n this.clientPromise = this.configOnDisk.value.then(it => createClient(it, this, this.createProviderRuntimeOptions()))\n }\n\n const client = await this.clientPromise\n const stagingUserId = await this.stagingUserIdPromise.value\n client.setRequestHeaders(this.computeFinalHeaders({\"x-user-staging-id\": stagingUserId}))\n return {\n info: await client.getLatestVersion(),\n provider: client,\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private createProviderRuntimeOptions() {\n return {\n isUseMultipleRangeRequest: true,\n platform: this._testOnlyOptions == null ? process.platform as ProviderPlatform : this._testOnlyOptions.platform,\n executor: this.httpExecutor,\n }\n }\n\n private async doCheckForUpdates(): Promise<UpdateCheckResult> {\n this.emit(\"checking-for-update\")\n\n const result = await this.getUpdateInfoAndProvider()\n const updateInfo = result.info\n if (!await this.isUpdateAvailable(updateInfo)) {\n this._logger.info(`Update for version ${this.currentVersion} is not available (latest version: ${updateInfo.version}, downgrade is ${this.allowDowngrade ? \"allowed\" : \"disallowed\"}).`)\n this.emit(\"update-not-available\", updateInfo)\n return {\n versionInfo: updateInfo,\n updateInfo,\n }\n }\n\n this.updateInfoAndProvider = result\n this.onUpdateAvailable(updateInfo)\n\n const cancellationToken = new CancellationToken()\n //noinspection ES6MissingAwait\n return {\n versionInfo: updateInfo,\n updateInfo,\n cancellationToken,\n downloadPromise: this.autoDownload ? this.downloadUpdate(cancellationToken) : null\n }\n }\n\n protected onUpdateAvailable(updateInfo: UpdateInfo): void {\n this._logger.info(`Found version ${updateInfo.version} (url: ${asArray(updateInfo.files).map(it => it.url).join(\", \")})`)\n this.emit(\"update-available\", updateInfo)\n }\n\n /**\n * Start downloading update manually. You can use this method if `autoDownload` option is set to `false`.\n * @returns {Promise<string>} Path to downloaded file.\n */\n downloadUpdate(cancellationToken: CancellationToken = new CancellationToken()): Promise<any> {\n const updateInfoAndProvider = this.updateInfoAndProvider\n if (updateInfoAndProvider == null) {\n const error = new Error(\"Please check update first\")\n this.dispatchError(error)\n return Promise.reject(error)\n }\n\n this._logger.info(`Downloading update from ${asArray(updateInfoAndProvider.info.files).map(it => it.url).join(\", \")}`)\n const errorHandler = (e: Error): Error => {\n // https://github.com/electron-userland/electron-builder/issues/1150#issuecomment-436891159\n if (!(e instanceof CancellationError)) {\n try {\n this.dispatchError(e)\n }\n catch (nestedError) {\n this._logger.warn(`Cannot dispatch error event: ${nestedError.stack || nestedError}`)\n }\n }\n\n return e\n }\n\n try {\n return this.doDownloadUpdate({\n updateInfoAndProvider,\n requestHeaders: this.computeRequestHeaders(updateInfoAndProvider.provider),\n cancellationToken,\n })\n .catch(e => {\n throw errorHandler(e)\n })\n }\n catch (e) {\n return Promise.reject(errorHandler(e))\n }\n }\n\n protected dispatchError(e: Error): void {\n this.emit(\"error\", e, (e.stack || e).toString())\n }\n\n protected dispatchUpdateDownloaded(event: UpdateDownloadedEvent): void {\n this.emit(UPDATE_DOWNLOADED, event)\n }\n\n protected async abstract doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>>\n\n /**\n * Restarts the app and installs the update after it has been downloaded.\n * It should only be called after `update-downloaded` has been emitted.\n *\n * **Note:** `autoUpdater.quitAndInstall()` will close all application windows first and only emit `before-quit` event on `app` after that.\n * This is different from the normal quit event sequence.\n *\n * @param isSilent *windows-only* Runs the installer in silent mode. Defaults to `false`.\n * @param isForceRunAfter Run the app after finish even on silent install. Not applicable for macOS. Ignored if `isSilent` is set to `false`.\n */\n abstract quitAndInstall(isSilent?: boolean, isForceRunAfter?: boolean): void\n\n private async loadUpdateConfig(): Promise<any> {\n if (this._appUpdateConfigPath == null) {\n this._appUpdateConfigPath = this.app.appUpdateConfigPath\n }\n return safeLoad(await readFile(this._appUpdateConfigPath, \"utf-8\"))\n }\n\n private computeRequestHeaders(provider: Provider<any>): OutgoingHttpHeaders {\n const fileExtraDownloadHeaders = provider.fileExtraDownloadHeaders\n if (fileExtraDownloadHeaders != null) {\n const requestHeaders = this.requestHeaders\n return requestHeaders == null ? fileExtraDownloadHeaders : {\n ...fileExtraDownloadHeaders,\n ...requestHeaders,\n }\n }\n return this.computeFinalHeaders({accept: \"*/*\"})\n }\n\n private async getOrCreateStagingUserId(): Promise<string> {\n const file = path.join(this.app.userDataPath, \".updaterId\")\n try {\n const id = await readFile(file, \"utf-8\")\n if (UUID.check(id)) {\n return id\n }\n else {\n this._logger.warn(`Staging user id file exists, but content was invalid: ${id}`)\n }\n }\n catch (e) {\n if (e.code !== \"ENOENT\") {\n this._logger.warn(`Couldn't read staging user ID, creating a blank one: ${e}`)\n }\n }\n\n const id = UUID.v5(randomBytes(4096), UUID.OID)\n this._logger.info(`Generated new staging user ID: ${id}`)\n try {\n await outputFile(file, id)\n }\n catch (e) {\n this._logger.warn(`Couldn't write out staging user ID: ${e}`)\n }\n return id\n }\n\n /** @internal */\n get isAddNoCacheQuery(): boolean {\n const headers = this.requestHeaders\n // https://github.com/electron-userland/electron-builder/issues/3021\n if (headers == null) {\n return true\n }\n\n for (const headerName of Object.keys(headers)) {\n const s = headerName.toLowerCase()\n if (s === \"authorization\" || s === \"private-token\") {\n return false\n }\n }\n return true\n }\n\n /**\n * @private\n * @internal\n */\n _testOnlyOptions: TestOnlyUpdaterOptions | null = null\n\n private async getOrCreateDownloadHelper(): Promise<DownloadedUpdateHelper> {\n let result = this.downloadedUpdateHelper\n if (result == null) {\n const dirName = (await this.configOnDisk.value).updaterCacheDirName\n const logger = this._logger\n if (dirName == null) {\n logger.error(\"updaterCacheDirName is not specified in app-update.yml Was app build using at least electron-builder 20.34.0?\")\n }\n const cacheDir = path.join(this.app.baseCachePath, dirName || this.app.name)\n if (logger.debug != null) {\n logger.debug(`updater cache dir: ${cacheDir}`)\n }\n\n result = new DownloadedUpdateHelper(cacheDir)\n this.downloadedUpdateHelper = result\n }\n return result\n }\n\n protected async executeDownload(taskOptions: DownloadExecutorTask): Promise<Array<string>> {\n const fileInfo = taskOptions.fileInfo\n const downloadOptions: DownloadOptions = {\n headers: taskOptions.downloadUpdateOptions.requestHeaders,\n cancellationToken: taskOptions.downloadUpdateOptions.cancellationToken,\n sha2: (fileInfo.info as any).sha2,\n sha512: fileInfo.info.sha512,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n const updateInfo = taskOptions.downloadUpdateOptions.updateInfoAndProvider.info\n const version = updateInfo.version\n const packageInfo = fileInfo.packageInfo\n\n function getCacheUpdateFileName(): string {\n // NodeJS URL doesn't decode automatically\n const urlPath = decodeURIComponent(taskOptions.fileInfo.url.pathname)\n if (urlPath.endsWith(`.${taskOptions.fileExtension}`)) {\n return path.posix.basename(urlPath)\n }\n else {\n // url like /latest, generate name\n return `update.${taskOptions.fileExtension}`\n }\n }\n\n const downloadedUpdateHelper = await this.getOrCreateDownloadHelper()\n const cacheDir = downloadedUpdateHelper.cacheDirForPendingUpdate\n await ensureDir(cacheDir)\n const updateFileName = getCacheUpdateFileName()\n let updateFile = path.join(cacheDir, updateFileName)\n const packageFile = packageInfo == null ? null : path.join(cacheDir, `package-${version}${path.extname(packageInfo.path) || \".7z\"}`)\n\n const done = async (isSaveCache: boolean) => {\n await downloadedUpdateHelper.setDownloadedFile(updateFile, packageFile, updateInfo, fileInfo, updateFileName, isSaveCache)\n await taskOptions.done!!({\n ...updateInfo,\n downloadedFile: updateFile,\n })\n return packageFile == null ? [updateFile] : [updateFile, packageFile]\n }\n\n const log = this._logger\n const cachedUpdateFile = await downloadedUpdateHelper.validateDownloadedPath(updateFile, updateInfo, fileInfo, log)\n if (cachedUpdateFile != null) {\n updateFile = cachedUpdateFile\n return await done(false)\n }\n\n const removeFileIfAny = async () => {\n await downloadedUpdateHelper.clear()\n .catch(() => {\n // ignore\n })\n return await unlink(updateFile)\n .catch(() => {\n // ignore\n })\n }\n\n const tempUpdateFile = await createTempUpdateFile(`temp-${updateFileName}`, cacheDir, log)\n try {\n await taskOptions.task(tempUpdateFile, downloadOptions, packageFile, removeFileIfAny)\n await rename(tempUpdateFile, updateFile)\n }\n catch (e) {\n await removeFileIfAny()\n\n if (e instanceof CancellationError) {\n log.info(\"cancelled\")\n this.emit(\"update-cancelled\", updateInfo)\n }\n throw e\n }\n\n log.info(`New version ${version} has been downloaded to ${updateFile}`)\n return await done(true)\n }\n}\n\nexport interface DownloadUpdateOptions {\n readonly updateInfoAndProvider: UpdateInfoAndProvider\n readonly requestHeaders: OutgoingHttpHeaders\n readonly cancellationToken: CancellationToken\n}\n\nfunction hasPrereleaseComponents(version: SemVer) {\n const versionPrereleaseComponent = getVersionPreleaseComponents(version)\n return versionPrereleaseComponent != null && versionPrereleaseComponent.length > 0\n}\n\n/** @private */\nexport class NoOpLogger implements Logger {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n info(message?: any) {\n // ignore\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n warn(message?: any) {\n // ignore\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n error(message?: any) {\n // ignore\n }\n}\n\nexport interface UpdateInfoAndProvider {\n info: UpdateInfo\n provider: Provider<any>\n}\n\nexport interface DownloadExecutorTask {\n readonly fileExtension: string\n readonly fileInfo: ResolvedUpdateFileInfo\n readonly downloadUpdateOptions: DownloadUpdateOptions\n readonly task: (destinationFile: string, downloadOptions: DownloadOptions, packageFile: string | null, removeTempDirIfAny: () => Promise<any>) => Promise<any>\n\n readonly done?: (event: UpdateDownloadedEvent) => Promise<any>\n}\n\n/** @private */\nexport interface TestOnlyUpdaterOptions {\n platform: ProviderPlatform\n\n isUseDifferentialDownload?: boolean\n}"],"sourceRoot":""}
1
+ {"version":3,"sources":["../src/AppUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllPublishOptions, asArray, CancellationToken, newError, PublishConfiguration, UpdateInfo, UUID, DownloadOptions, CancellationError } from \"builder-util-runtime\"\nimport { randomBytes } from \"crypto\"\nimport { Notification } from \"electron\"\nimport { EventEmitter } from \"events\"\nimport { ensureDir, outputFile, readFile, rename, unlink } from \"fs-extra\"\nimport { OutgoingHttpHeaders } from \"http\"\nimport { safeLoad } from \"js-yaml\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { eq as isVersionsEqual, gt as isVersionGreaterThan, lt as isVersionLessThan, parse as parseVersion, prerelease as getVersionPreleaseComponents, SemVer } from \"semver\"\nimport { AppAdapter } from \"./AppAdapter\"\nimport { createTempUpdateFile, DownloadedUpdateHelper } from \"./DownloadedUpdateHelper\"\nimport { ElectronAppAdapter } from \"./ElectronAppAdapter\"\nimport { ElectronHttpExecutor, getNetSession } from \"./electronHttpExecutor\"\nimport { GenericProvider } from \"./providers/GenericProvider\"\nimport { DOWNLOAD_PROGRESS, Logger, Provider, ResolvedUpdateFileInfo, UPDATE_DOWNLOADED, UpdateCheckResult, UpdateDownloadedEvent, UpdaterSignal } from \"./main\"\nimport { createClient, isUrlProbablySupportMultiRangeRequests } from \"./providerFactory\"\nimport { ProviderPlatform } from \"./providers/Provider\"\nimport Session = Electron.Session\n\nexport abstract class AppUpdater extends EventEmitter {\n /**\n * Whether to automatically download an update when it is found.\n */\n autoDownload: boolean = true\n\n /**\n * Whether to automatically install a downloaded update on app quit (if `quitAndInstall` was not called before).\n *\n * Applicable only on Windows and Linux.\n */\n autoInstallOnAppQuit: boolean = true\n\n /**\n * *GitHub provider only.* Whether to allow update to pre-release versions. Defaults to `true` if application version contains prerelease components (e.g. `0.12.1-alpha.1`, here `alpha` is a prerelease component), otherwise `false`.\n *\n * If `true`, downgrade will be allowed (`allowDowngrade` will be set to `true`).\n */\n allowPrerelease: boolean = false\n\n /**\n * *GitHub provider only.* Get all release notes (from current version to latest), not just the latest.\n * @default false\n */\n fullChangelog: boolean = false\n\n /**\n * Whether to allow version downgrade (when a user from the beta channel wants to go back to the stable channel).\n *\n * Taken in account only if channel differs (pre-release version component in terms of semantic versioning).\n *\n * @default false\n */\n allowDowngrade: boolean = false\n\n /**\n * The current application version.\n */\n readonly currentVersion: SemVer\n\n private _channel: string | null = null\n\n protected downloadedUpdateHelper: DownloadedUpdateHelper | null = null\n\n /**\n * Get the update channel. Not applicable for GitHub. Doesn't return `channel` from the update configuration, only if was previously set.\n */\n get channel(): string | null {\n return this._channel\n }\n\n /**\n * Set the update channel. Not applicable for GitHub. Overrides `channel` in the update configuration.\n *\n * `allowDowngrade` will be automatically set to `true`. If this behavior is not suitable for you, simple set `allowDowngrade` explicitly after.\n */\n set channel(value: string | null) {\n if (this._channel != null) {\n // noinspection SuspiciousTypeOfGuard\n if (typeof value !== \"string\") {\n throw newError(`Channel must be a string, but got: ${value}`, \"ERR_UPDATER_INVALID_CHANNEL\")\n }\n else if (value.length === 0) {\n throw newError(`Channel must be not an empty string`, \"ERR_UPDATER_INVALID_CHANNEL\")\n }\n }\n\n this._channel = value\n this.allowDowngrade = true\n }\n\n /**\n * The request headers.\n */\n requestHeaders: OutgoingHttpHeaders | null = null\n\n protected _logger: Logger = console\n\n // noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols\n get netSession(): Session {\n return getNetSession()\n }\n\n /**\n * The logger. You can pass [electron-log](https://github.com/megahertz/electron-log), [winston](https://github.com/winstonjs/winston) or another logger with the following interface: `{ info(), warn(), error() }`.\n * Set it to `null` if you would like to disable a logging feature.\n */\n get logger(): Logger | null {\n return this._logger\n }\n\n set logger(value: Logger | null) {\n this._logger = value == null ? new NoOpLogger() : value\n }\n\n // noinspection JSUnusedGlobalSymbols\n /**\n * For type safety you can use signals, e.g. `autoUpdater.signals.updateDownloaded(() => {})` instead of `autoUpdater.on('update-available', () => {})`\n */\n readonly signals = new UpdaterSignal(this)\n\n private _appUpdateConfigPath: string | null = null\n\n // noinspection JSUnusedGlobalSymbols\n /**\n * test only\n * @private\n */\n set updateConfigPath(value: string | null) {\n this.clientPromise = null\n this._appUpdateConfigPath = value\n this.configOnDisk = new Lazy<any>(() => this.loadUpdateConfig())\n }\n\n private clientPromise: Promise<Provider<any>> | null = null\n\n protected readonly stagingUserIdPromise = new Lazy<string>(() => this.getOrCreateStagingUserId())\n\n // public, allow to read old config for anyone\n /** @internal */\n configOnDisk = new Lazy<any>(() => this.loadUpdateConfig())\n\n private checkForUpdatesPromise: Promise<UpdateCheckResult> | null = null\n\n protected readonly app: AppAdapter\n\n protected updateInfoAndProvider: UpdateInfoAndProvider | null = null\n\n /** @internal */\n readonly httpExecutor: ElectronHttpExecutor\n\n protected constructor(options: AllPublishOptions | null | undefined, app?: AppAdapter) {\n super()\n\n this.on(\"error\", (error: Error) => {\n this._logger.error(`Error: ${error.stack || error.message}`)\n })\n\n if (app == null) {\n this.app = new ElectronAppAdapter()\n this.httpExecutor = new ElectronHttpExecutor((authInfo, callback) => this.emit(\"login\", authInfo, callback))\n }\n else {\n this.app = app\n this.httpExecutor = null as any\n }\n\n const currentVersionString = this.app.version\n const currentVersion = parseVersion(currentVersionString)\n if (currentVersion == null) {\n throw newError(`App version is not a valid semver version: \"${currentVersionString}\"`, \"ERR_UPDATER_INVALID_VERSION\")\n }\n this.currentVersion = currentVersion\n this.allowPrerelease = hasPrereleaseComponents(currentVersion)\n\n if (options != null) {\n this.setFeedURL(options)\n\n if (typeof options !== \"string\" && options.requestHeaders) {\n this.requestHeaders = options.requestHeaders\n }\n }\n }\n\n //noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols\n getFeedURL(): string | null | undefined {\n return \"Deprecated. Do not use it.\"\n }\n\n /**\n * Configure update provider. If value is `string`, [GenericServerOptions](/configuration/publish#genericserveroptions) will be set with value as `url`.\n * @param options If you want to override configuration in the `app-update.yml`.\n */\n setFeedURL(options: PublishConfiguration | AllPublishOptions | string) {\n const runtimeOptions = this.createProviderRuntimeOptions()\n // https://github.com/electron-userland/electron-builder/issues/1105\n let provider: Provider<any>\n if (typeof options === \"string\") {\n provider = new GenericProvider({provider: \"generic\", url: options}, this, {\n ...runtimeOptions,\n isUseMultipleRangeRequest: isUrlProbablySupportMultiRangeRequests(options),\n })\n }\n else {\n provider = createClient(options, this, runtimeOptions)\n }\n this.clientPromise = Promise.resolve(provider)\n }\n\n /**\n * Asks the server whether there is an update.\n */\n checkForUpdates(): Promise<UpdateCheckResult> {\n let checkForUpdatesPromise = this.checkForUpdatesPromise\n if (checkForUpdatesPromise != null) {\n this._logger.info(\"Checking for update (already in progress)\")\n return checkForUpdatesPromise\n }\n\n const nullizePromise = () => this.checkForUpdatesPromise = null\n\n this._logger.info(\"Checking for update\")\n checkForUpdatesPromise = this.doCheckForUpdates()\n .then(it => {\n nullizePromise()\n return it\n })\n .catch(e => {\n nullizePromise()\n this.emit(\"error\", e, `Cannot check for updates: ${(e.stack || e).toString()}`)\n throw e\n })\n\n this.checkForUpdatesPromise = checkForUpdatesPromise\n return checkForUpdatesPromise\n }\n\n public isUpdaterActive(): boolean {\n if (!this.app.isPackaged) {\n this._logger.info(\"Skip checkForUpdatesAndNotify because application is not packed\")\n return false\n }\n return true\n }\n\n // noinspection JSUnusedGlobalSymbols\n checkForUpdatesAndNotify(downloadNotification?: DownloadNotification): Promise<UpdateCheckResult | null> {\n if (!this.isUpdaterActive()) {\n return Promise.resolve(null)\n }\n\n return this.checkForUpdates()\n .then(it => {\n const downloadPromise = it.downloadPromise\n if (downloadPromise == null) {\n const debug = this._logger.debug\n if (debug != null) {\n debug(\"checkForUpdatesAndNotify called, downloadPromise is null\")\n }\n return it\n }\n\n downloadPromise\n .then(() => {\n const notificationContent = this.formatDownloadNotification(it.updateInfo.version, this.app.name, downloadNotification);\n new Notification(notificationContent).show()\n })\n\n return it\n })\n }\n\n private formatDownloadNotification(version: string, appName: string, downloadNotification?: DownloadNotification): DownloadNotification {\n if (downloadNotification == null) {\n downloadNotification = {\n title: \"A new update is ready to install\",\n body: `{appName} version {version} has been downloaded and will be automatically installed on exit`\n }\n }\n downloadNotification = {\n title: downloadNotification.title.replace(\"{appName}\", appName).replace(\"{version}\", version),\n body: downloadNotification.body.replace(\"{appName}\", appName).replace(\"{version}\", version)\n }\n return downloadNotification;\n }\n\n private async isStagingMatch(updateInfo: UpdateInfo): Promise<boolean> {\n const rawStagingPercentage = updateInfo.stagingPercentage\n let stagingPercentage = rawStagingPercentage\n if (stagingPercentage == null) {\n return true\n }\n\n stagingPercentage = parseInt(stagingPercentage as any, 10)\n if (isNaN(stagingPercentage)) {\n this._logger.warn(`Staging percentage is NaN: ${rawStagingPercentage}`)\n return true\n }\n\n // convert from user 0-100 to internal 0-1\n stagingPercentage = stagingPercentage / 100\n\n const stagingUserId = await this.stagingUserIdPromise.value\n const val = UUID.parse(stagingUserId).readUInt32BE(12)\n const percentage = (val / 0xFFFFFFFF)\n this._logger.info(`Staging percentage: ${stagingPercentage}, percentage: ${percentage}, user id: ${stagingUserId}`)\n return percentage < stagingPercentage\n }\n\n private computeFinalHeaders(headers: OutgoingHttpHeaders) {\n if (this.requestHeaders != null) {\n Object.assign(headers, this.requestHeaders)\n }\n return headers\n }\n\n private async isUpdateAvailable(updateInfo: UpdateInfo): Promise<boolean> {\n const latestVersion = parseVersion(updateInfo.version)\n if (latestVersion == null) {\n throw newError(`This file could not be downloaded, or the latest version (from update server) does not have a valid semver version: \"${updateInfo.version}\"`, \"ERR_UPDATER_INVALID_VERSION\")\n }\n\n const currentVersion = this.currentVersion\n if (isVersionsEqual(latestVersion, currentVersion)) {\n return false\n }\n\n const isStagingMatch = await this.isStagingMatch(updateInfo)\n if (!isStagingMatch) {\n return false\n }\n\n // https://github.com/electron-userland/electron-builder/pull/3111#issuecomment-405033227\n // https://github.com/electron-userland/electron-builder/pull/3111#issuecomment-405030797\n const isLatestVersionNewer = isVersionGreaterThan(latestVersion, currentVersion)\n const isLatestVersionOlder = isVersionLessThan(latestVersion, currentVersion)\n\n if (isLatestVersionNewer) {\n return true\n }\n return this.allowDowngrade && isLatestVersionOlder;\n }\n\n protected async getUpdateInfoAndProvider(): Promise<UpdateInfoAndProvider> {\n await this.app.whenReady()\n\n if (this.clientPromise == null) {\n this.clientPromise = this.configOnDisk.value.then(it => createClient(it, this, this.createProviderRuntimeOptions()))\n }\n\n const client = await this.clientPromise\n const stagingUserId = await this.stagingUserIdPromise.value\n client.setRequestHeaders(this.computeFinalHeaders({\"x-user-staging-id\": stagingUserId}))\n return {\n info: await client.getLatestVersion(),\n provider: client,\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/explicit-function-return-type\n private createProviderRuntimeOptions() {\n return {\n isUseMultipleRangeRequest: true,\n platform: this._testOnlyOptions == null ? process.platform as ProviderPlatform : this._testOnlyOptions.platform,\n executor: this.httpExecutor,\n }\n }\n\n private async doCheckForUpdates(): Promise<UpdateCheckResult> {\n this.emit(\"checking-for-update\")\n\n const result = await this.getUpdateInfoAndProvider()\n const updateInfo = result.info\n if (!await this.isUpdateAvailable(updateInfo)) {\n this._logger.info(`Update for version ${this.currentVersion} is not available (latest version: ${updateInfo.version}, downgrade is ${this.allowDowngrade ? \"allowed\" : \"disallowed\"}).`)\n this.emit(\"update-not-available\", updateInfo)\n return {\n versionInfo: updateInfo,\n updateInfo,\n }\n }\n\n this.updateInfoAndProvider = result\n this.onUpdateAvailable(updateInfo)\n\n const cancellationToken = new CancellationToken()\n //noinspection ES6MissingAwait\n return {\n versionInfo: updateInfo,\n updateInfo,\n cancellationToken,\n downloadPromise: this.autoDownload ? this.downloadUpdate(cancellationToken) : null\n }\n }\n\n protected onUpdateAvailable(updateInfo: UpdateInfo): void {\n this._logger.info(`Found version ${updateInfo.version} (url: ${asArray(updateInfo.files).map(it => it.url).join(\", \")})`)\n this.emit(\"update-available\", updateInfo)\n }\n\n /**\n * Start downloading update manually. You can use this method if `autoDownload` option is set to `false`.\n * @returns {Promise<string>} Path to downloaded file.\n */\n downloadUpdate(cancellationToken: CancellationToken = new CancellationToken()): Promise<any> {\n const updateInfoAndProvider = this.updateInfoAndProvider\n if (updateInfoAndProvider == null) {\n const error = new Error(\"Please check update first\")\n this.dispatchError(error)\n return Promise.reject(error)\n }\n\n this._logger.info(`Downloading update from ${asArray(updateInfoAndProvider.info.files).map(it => it.url).join(\", \")}`)\n const errorHandler = (e: Error): Error => {\n // https://github.com/electron-userland/electron-builder/issues/1150#issuecomment-436891159\n if (!(e instanceof CancellationError)) {\n try {\n this.dispatchError(e)\n }\n catch (nestedError) {\n this._logger.warn(`Cannot dispatch error event: ${nestedError.stack || nestedError}`)\n }\n }\n\n return e\n }\n\n try {\n return this.doDownloadUpdate({\n updateInfoAndProvider,\n requestHeaders: this.computeRequestHeaders(updateInfoAndProvider.provider),\n cancellationToken,\n })\n .catch(e => {\n throw errorHandler(e)\n })\n }\n catch (e) {\n return Promise.reject(errorHandler(e))\n }\n }\n\n protected dispatchError(e: Error): void {\n this.emit(\"error\", e, (e.stack || e).toString())\n }\n\n protected dispatchUpdateDownloaded(event: UpdateDownloadedEvent): void {\n this.emit(UPDATE_DOWNLOADED, event)\n }\n\n protected async abstract doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>>\n\n /**\n * Restarts the app and installs the update after it has been downloaded.\n * It should only be called after `update-downloaded` has been emitted.\n *\n * **Note:** `autoUpdater.quitAndInstall()` will close all application windows first and only emit `before-quit` event on `app` after that.\n * This is different from the normal quit event sequence.\n *\n * @param isSilent *windows-only* Runs the installer in silent mode. Defaults to `false`.\n * @param isForceRunAfter Run the app after finish even on silent install. Not applicable for macOS. Ignored if `isSilent` is set to `false`.\n */\n abstract quitAndInstall(isSilent?: boolean, isForceRunAfter?: boolean): void\n\n private async loadUpdateConfig(): Promise<any> {\n if (this._appUpdateConfigPath == null) {\n this._appUpdateConfigPath = this.app.appUpdateConfigPath\n }\n return safeLoad(await readFile(this._appUpdateConfigPath, \"utf-8\"))\n }\n\n private computeRequestHeaders(provider: Provider<any>): OutgoingHttpHeaders {\n const fileExtraDownloadHeaders = provider.fileExtraDownloadHeaders\n if (fileExtraDownloadHeaders != null) {\n const requestHeaders = this.requestHeaders\n return requestHeaders == null ? fileExtraDownloadHeaders : {\n ...fileExtraDownloadHeaders,\n ...requestHeaders,\n }\n }\n return this.computeFinalHeaders({accept: \"*/*\"})\n }\n\n private async getOrCreateStagingUserId(): Promise<string> {\n const file = path.join(this.app.userDataPath, \".updaterId\")\n try {\n const id = await readFile(file, \"utf-8\")\n if (UUID.check(id)) {\n return id\n }\n else {\n this._logger.warn(`Staging user id file exists, but content was invalid: ${id}`)\n }\n }\n catch (e) {\n if (e.code !== \"ENOENT\") {\n this._logger.warn(`Couldn't read staging user ID, creating a blank one: ${e}`)\n }\n }\n\n const id = UUID.v5(randomBytes(4096), UUID.OID)\n this._logger.info(`Generated new staging user ID: ${id}`)\n try {\n await outputFile(file, id)\n }\n catch (e) {\n this._logger.warn(`Couldn't write out staging user ID: ${e}`)\n }\n return id\n }\n\n /** @internal */\n get isAddNoCacheQuery(): boolean {\n const headers = this.requestHeaders\n // https://github.com/electron-userland/electron-builder/issues/3021\n if (headers == null) {\n return true\n }\n\n for (const headerName of Object.keys(headers)) {\n const s = headerName.toLowerCase()\n if (s === \"authorization\" || s === \"private-token\") {\n return false\n }\n }\n return true\n }\n\n /**\n * @private\n * @internal\n */\n _testOnlyOptions: TestOnlyUpdaterOptions | null = null\n\n private async getOrCreateDownloadHelper(): Promise<DownloadedUpdateHelper> {\n let result = this.downloadedUpdateHelper\n if (result == null) {\n const dirName = (await this.configOnDisk.value).updaterCacheDirName\n const logger = this._logger\n if (dirName == null) {\n logger.error(\"updaterCacheDirName is not specified in app-update.yml Was app build using at least electron-builder 20.34.0?\")\n }\n const cacheDir = path.join(this.app.baseCachePath, dirName || this.app.name)\n if (logger.debug != null) {\n logger.debug(`updater cache dir: ${cacheDir}`)\n }\n\n result = new DownloadedUpdateHelper(cacheDir)\n this.downloadedUpdateHelper = result\n }\n return result\n }\n\n protected async executeDownload(taskOptions: DownloadExecutorTask): Promise<Array<string>> {\n const fileInfo = taskOptions.fileInfo\n const downloadOptions: DownloadOptions = {\n headers: taskOptions.downloadUpdateOptions.requestHeaders,\n cancellationToken: taskOptions.downloadUpdateOptions.cancellationToken,\n sha2: (fileInfo.info as any).sha2,\n sha512: fileInfo.info.sha512,\n }\n\n if (this.listenerCount(DOWNLOAD_PROGRESS) > 0) {\n downloadOptions.onProgress = it => this.emit(DOWNLOAD_PROGRESS, it)\n }\n\n const updateInfo = taskOptions.downloadUpdateOptions.updateInfoAndProvider.info\n const version = updateInfo.version\n const packageInfo = fileInfo.packageInfo\n\n function getCacheUpdateFileName(): string {\n // NodeJS URL doesn't decode automatically\n const urlPath = decodeURIComponent(taskOptions.fileInfo.url.pathname)\n if (urlPath.endsWith(`.${taskOptions.fileExtension}`)) {\n return path.posix.basename(urlPath)\n }\n else {\n // url like /latest, generate name\n return `update.${taskOptions.fileExtension}`\n }\n }\n\n const downloadedUpdateHelper = await this.getOrCreateDownloadHelper()\n const cacheDir = downloadedUpdateHelper.cacheDirForPendingUpdate\n await ensureDir(cacheDir)\n const updateFileName = getCacheUpdateFileName()\n let updateFile = path.join(cacheDir, updateFileName)\n const packageFile = packageInfo == null ? null : path.join(cacheDir, `package-${version}${path.extname(packageInfo.path) || \".7z\"}`)\n\n const done = async (isSaveCache: boolean) => {\n await downloadedUpdateHelper.setDownloadedFile(updateFile, packageFile, updateInfo, fileInfo, updateFileName, isSaveCache)\n await taskOptions.done!!({\n ...updateInfo,\n downloadedFile: updateFile,\n })\n return packageFile == null ? [updateFile] : [updateFile, packageFile]\n }\n\n const log = this._logger\n const cachedUpdateFile = await downloadedUpdateHelper.validateDownloadedPath(updateFile, updateInfo, fileInfo, log)\n if (cachedUpdateFile != null) {\n updateFile = cachedUpdateFile\n return await done(false)\n }\n\n const removeFileIfAny = async () => {\n await downloadedUpdateHelper.clear()\n .catch(() => {\n // ignore\n })\n return await unlink(updateFile)\n .catch(() => {\n // ignore\n })\n }\n\n const tempUpdateFile = await createTempUpdateFile(`temp-${updateFileName}`, cacheDir, log)\n try {\n await taskOptions.task(tempUpdateFile, downloadOptions, packageFile, removeFileIfAny)\n await rename(tempUpdateFile, updateFile)\n }\n catch (e) {\n await removeFileIfAny()\n\n if (e instanceof CancellationError) {\n log.info(\"cancelled\")\n this.emit(\"update-cancelled\", updateInfo)\n }\n throw e\n }\n\n log.info(`New version ${version} has been downloaded to ${updateFile}`)\n return await done(true)\n }\n}\n\nexport interface DownloadUpdateOptions {\n readonly updateInfoAndProvider: UpdateInfoAndProvider\n readonly requestHeaders: OutgoingHttpHeaders\n readonly cancellationToken: CancellationToken\n}\n\nfunction hasPrereleaseComponents(version: SemVer) {\n const versionPrereleaseComponent = getVersionPreleaseComponents(version)\n return versionPrereleaseComponent != null && versionPrereleaseComponent.length > 0\n}\n\n/** @private */\nexport class NoOpLogger implements Logger {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n info(message?: any) {\n // ignore\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n warn(message?: any) {\n // ignore\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n error(message?: any) {\n // ignore\n }\n}\n\nexport interface UpdateInfoAndProvider {\n info: UpdateInfo\n provider: Provider<any>\n}\n\nexport interface DownloadExecutorTask {\n readonly fileExtension: string\n readonly fileInfo: ResolvedUpdateFileInfo\n readonly downloadUpdateOptions: DownloadUpdateOptions\n readonly task: (destinationFile: string, downloadOptions: DownloadOptions, packageFile: string | null, removeTempDirIfAny: () => Promise<any>) => Promise<any>\n\n readonly done?: (event: UpdateDownloadedEvent) => Promise<any>\n}\n\nexport interface DownloadNotification {\n body: string\n title: string\n}\n\n/** @private */\nexport interface TestOnlyUpdaterOptions {\n platform: ProviderPlatform\n\n isUseDifferentialDownload?: boolean\n}\n"],"sourceRoot":""}
@@ -17,6 +17,11 @@ export declare class DownloadedUpdateHelper {
17
17
  setDownloadedFile(downloadedFile: string, packageFile: string | null, versionInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, updateFileName: string, isSaveCache: boolean): Promise<void>;
18
18
  clear(): Promise<void>;
19
19
  private cleanCacheDirForPendingUpdate;
20
+ /**
21
+ * Returns "update-info.json" which is created in the update cache directory's "pending" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.
22
+ * @param fileInfo
23
+ * @param logger
24
+ */
20
25
  private getValidCachedUpdateFile;
21
26
  private getUpdateInfoFile;
22
27
  }
@@ -87,7 +87,7 @@ class DownloadedUpdateHelper {
87
87
 
88
88
  const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger);
89
89
 
90
- if (cachedUpdateFile == null) {
90
+ if (cachedUpdateFile === null) {
91
91
  return null;
92
92
  }
93
93
 
@@ -127,26 +127,42 @@ class DownloadedUpdateHelper {
127
127
  } catch (ignore) {// ignore
128
128
  }
129
129
  }
130
+ /**
131
+ * Returns "update-info.json" which is created in the update cache directory's "pending" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.
132
+ * @param fileInfo
133
+ * @param logger
134
+ */
135
+
130
136
 
131
137
  async getValidCachedUpdateFile(fileInfo, logger) {
138
+ var _a;
139
+
140
+ const updateInfoFilePath = this.getUpdateInfoFile();
141
+ const doesUpdateInfoFileExist = await (0, _fsExtra().pathExistsSync)(updateInfoFilePath);
142
+
143
+ if (!doesUpdateInfoFileExist) {
144
+ return null;
145
+ }
146
+
132
147
  let cachedInfo;
133
- const updateInfoFile = this.getUpdateInfoFile();
134
148
 
135
149
  try {
136
- cachedInfo = await (0, _fsExtra().readJson)(updateInfoFile);
137
- } catch (e) {
150
+ cachedInfo = await (0, _fsExtra().readJson)(updateInfoFilePath);
151
+ } catch (error) {
138
152
  let message = `No cached update info available`;
139
153
 
140
- if (e.code !== "ENOENT") {
154
+ if (error.code !== "ENOENT") {
141
155
  await this.cleanCacheDirForPendingUpdate();
142
- message += ` (error on read: ${e.message})`;
156
+ message += ` (error on read: ${error.message})`;
143
157
  }
144
158
 
145
159
  logger.info(message);
146
160
  return null;
147
161
  }
148
162
 
149
- if (cachedInfo.fileName == null) {
163
+ const isCachedInfoFileNameValid = (_a = (cachedInfo === null || cachedInfo === void 0 ? void 0 : cachedInfo.fileName) !== null) !== null && _a !== void 0 ? _a : false;
164
+
165
+ if (!isCachedInfoFileNameValid) {
150
166
  logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`);
151
167
  await this.cleanCacheDirForPendingUpdate();
152
168
  return null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/DownloadedUpdateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { UpdateInfo } from \"builder-util-runtime\"\nimport { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\nimport isEqual from \"lodash.isequal\"\nimport { Logger, ResolvedUpdateFileInfo } from \"./main\"\nimport { pathExists, readJson, emptyDir, outputJson, unlink } from \"fs-extra\"\nimport * as path from \"path\"\n\n/** @private **/\nexport class DownloadedUpdateHelper {\n private _file: string | null = null\n private _packageFile: string | null = null\n\n private versionInfo: UpdateInfo | null = null\n private fileInfo: ResolvedUpdateFileInfo | null = null\n\n constructor(readonly cacheDir: string) {\n }\n\n private _downloadedFileInfo: CachedUpdateInfo | null = null\n get downloadedFileInfo(): CachedUpdateInfo | null {\n return this._downloadedFileInfo\n }\n\n get file(): string | null {\n return this._file\n }\n\n get packageFile(): string | null {\n return this._packageFile\n }\n\n get cacheDirForPendingUpdate(): string {\n return path.join(this.cacheDir, \"pending\")\n }\n\n async validateDownloadedPath(updateFile: string, updateInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {\n // update has already been downloaded from this running instance\n // check here only existence, not checksum\n if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await pathExists(updateFile))) {\n return updateFile\n }\n else {\n return null\n }\n }\n\n // update has already been downloaded from some previous app launch\n const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger)\n if (cachedUpdateFile == null) {\n return null\n }\n logger.info(`Update has already been downloaded to ${updateFile}).`)\n this._file = cachedUpdateFile\n return cachedUpdateFile\n }\n\n async setDownloadedFile(downloadedFile: string, packageFile: string | null, versionInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, updateFileName: string, isSaveCache: boolean): Promise<void> {\n this._file = downloadedFile\n this._packageFile = packageFile\n this.versionInfo = versionInfo\n this.fileInfo = fileInfo\n this._downloadedFileInfo = {\n fileName: updateFileName,\n sha512: fileInfo.info.sha512,\n isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true,\n }\n\n if (isSaveCache) {\n await outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo)\n }\n }\n\n async clear(): Promise<void> {\n this._file = null\n this._packageFile = null\n this.versionInfo = null\n this.fileInfo = null\n await this.cleanCacheDirForPendingUpdate()\n }\n\n private async cleanCacheDirForPendingUpdate(): Promise<void> {\n try {\n // remove stale data\n await emptyDir(this.cacheDirForPendingUpdate)\n }\n catch (ignore) {\n // ignore\n }\n }\n\n private async getValidCachedUpdateFile(fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n let cachedInfo: CachedUpdateInfo\n const updateInfoFile = this.getUpdateInfoFile()\n try {\n cachedInfo = await readJson(updateInfoFile)\n }\n catch (e) {\n let message = `No cached update info available`\n if (e.code !== \"ENOENT\") {\n await this.cleanCacheDirForPendingUpdate()\n message += ` (error on read: ${e.message})`\n }\n logger.info(message)\n return null\n }\n\n if (cachedInfo.fileName == null) {\n logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n if (fileInfo.info.sha512 !== cachedInfo.sha512) {\n logger.info(`Cached update sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${cachedInfo.sha512}, expected: ${fileInfo.info.sha512}. Directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName)\n if (!(await pathExists(updateFile))) {\n logger.info(\"Cached update file doesn't exist, directory for cached update will be cleaned\")\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n const sha512 = await hashFile(updateFile)\n if (fileInfo.info.sha512 !== sha512) {\n logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n this._downloadedFileInfo = cachedInfo\n return updateFile\n }\n\n private getUpdateInfoFile(): string {\n return path.join(this.cacheDirForPendingUpdate, \"update-info.json\")\n }\n}\n\ninterface CachedUpdateInfo {\n fileName: string\n sha512: string\n readonly isAdminRightsRequired: boolean\n}\n\nfunction hashFile(file: string, algorithm = \"sha512\", encoding: \"base64\" | \"hex\" = \"base64\", options?: any): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const hash = createHash(algorithm)\n hash\n .on(\"error\", reject)\n .setEncoding(encoding)\n\n createReadStream(file, {...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */})\n .on(\"error\", reject)\n .on(\"end\", () => {\n hash.end()\n resolve(hash.read() as string)\n })\n .pipe(hash, {end: false})\n })\n}\n\nexport async function createTempUpdateFile(name: string, cacheDir: string, log: Logger): Promise<string> {\n // https://github.com/electron-userland/electron-builder/pull/2474#issuecomment-366481912\n let nameCounter = 0\n let result = path.join(cacheDir, name)\n for (let i = 0; i < 3; i++) {\n try {\n await unlink(result)\n return result\n }\n catch (e) {\n if (e.code === \"ENOENT\") {\n return result\n }\n\n log.warn(`Error on remove temp update file: ${e}`)\n result = path.join(cacheDir, `${nameCounter++}-${name}`)\n }\n }\n return result\n}"],"sourceRoot":""}
1
+ {"version":3,"sources":["../src/DownloadedUpdateHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { UpdateInfo } from \"builder-util-runtime\"\nimport { createHash } from \"crypto\"\nimport { createReadStream } from \"fs\"\nimport isEqual from \"lodash.isequal\"\nimport { Logger, ResolvedUpdateFileInfo } from \"./main\"\nimport { pathExists, readJson, emptyDir, outputJson, unlink, pathExistsSync } from \"fs-extra\"\nimport * as path from \"path\"\n\n/** @private **/\nexport class DownloadedUpdateHelper {\n private _file: string | null = null\n private _packageFile: string | null = null\n\n private versionInfo: UpdateInfo | null = null\n private fileInfo: ResolvedUpdateFileInfo | null = null\n\n constructor(readonly cacheDir: string) {\n }\n\n private _downloadedFileInfo: CachedUpdateInfo | null = null\n get downloadedFileInfo(): CachedUpdateInfo | null {\n return this._downloadedFileInfo\n }\n\n get file(): string | null {\n return this._file\n }\n\n get packageFile(): string | null {\n return this._packageFile\n }\n\n get cacheDirForPendingUpdate(): string {\n return path.join(this.cacheDir, \"pending\")\n }\n\n async validateDownloadedPath(updateFile: string, updateInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n if (this.versionInfo != null && this.file === updateFile && this.fileInfo != null) {\n // update has already been downloaded from this running instance\n // check here only existence, not checksum\n if (isEqual(this.versionInfo, updateInfo) && isEqual(this.fileInfo.info, fileInfo.info) && (await pathExists(updateFile))) {\n return updateFile\n }\n else {\n return null\n }\n }\n\n // update has already been downloaded from some previous app launch\n const cachedUpdateFile = await this.getValidCachedUpdateFile(fileInfo, logger)\n if (cachedUpdateFile === null) {\n return null\n }\n logger.info(`Update has already been downloaded to ${updateFile}).`)\n this._file = cachedUpdateFile\n return cachedUpdateFile\n }\n\n async setDownloadedFile(downloadedFile: string, packageFile: string | null, versionInfo: UpdateInfo, fileInfo: ResolvedUpdateFileInfo, updateFileName: string, isSaveCache: boolean): Promise<void> {\n this._file = downloadedFile\n this._packageFile = packageFile\n this.versionInfo = versionInfo\n this.fileInfo = fileInfo\n this._downloadedFileInfo = {\n fileName: updateFileName,\n sha512: fileInfo.info.sha512,\n isAdminRightsRequired: fileInfo.info.isAdminRightsRequired === true,\n }\n\n if (isSaveCache) {\n await outputJson(this.getUpdateInfoFile(), this._downloadedFileInfo)\n }\n }\n\n async clear(): Promise<void> {\n this._file = null\n this._packageFile = null\n this.versionInfo = null\n this.fileInfo = null\n await this.cleanCacheDirForPendingUpdate()\n }\n\n private async cleanCacheDirForPendingUpdate(): Promise<void> {\n try {\n // remove stale data\n await emptyDir(this.cacheDirForPendingUpdate)\n }\n catch (ignore) {\n // ignore\n }\n }\n\n /**\n * Returns \"update-info.json\" which is created in the update cache directory's \"pending\" subfolder after the first update is downloaded. If the update file does not exist then the cache is cleared and recreated. If the update file exists then its properties are validated.\n * @param fileInfo\n * @param logger\n */\n private async getValidCachedUpdateFile(fileInfo: ResolvedUpdateFileInfo, logger: Logger): Promise<string | null> {\n const updateInfoFilePath: string = this.getUpdateInfoFile()\n\n const doesUpdateInfoFileExist = await pathExistsSync(updateInfoFilePath);\n if(!doesUpdateInfoFileExist) {\n return null;\n }\n\n\n let cachedInfo: CachedUpdateInfo\n try {\n cachedInfo = await readJson(updateInfoFilePath)\n }\n catch (error) {\n let message = `No cached update info available`\n if (error.code !== \"ENOENT\") {\n await this.cleanCacheDirForPendingUpdate()\n message += ` (error on read: ${error.message})`\n }\n logger.info(message)\n return null\n }\n\n const isCachedInfoFileNameValid = cachedInfo?.fileName !== null ?? false\n if (!isCachedInfoFileNameValid) {\n logger.warn(`Cached update info is corrupted: no fileName, directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n if (fileInfo.info.sha512 !== cachedInfo.sha512) {\n logger.info(`Cached update sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${cachedInfo.sha512}, expected: ${fileInfo.info.sha512}. Directory for cached update will be cleaned`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n const updateFile = path.join(this.cacheDirForPendingUpdate, cachedInfo.fileName)\n if (!(await pathExists(updateFile))) {\n logger.info(\"Cached update file doesn't exist, directory for cached update will be cleaned\")\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n\n const sha512 = await hashFile(updateFile)\n if (fileInfo.info.sha512 !== sha512) {\n logger.warn(`Sha512 checksum doesn't match the latest available update. New update must be downloaded. Cached: ${sha512}, expected: ${fileInfo.info.sha512}`)\n await this.cleanCacheDirForPendingUpdate()\n return null\n }\n this._downloadedFileInfo = cachedInfo\n return updateFile\n }\n\n private getUpdateInfoFile(): string {\n return path.join(this.cacheDirForPendingUpdate, \"update-info.json\")\n }\n}\n\ninterface CachedUpdateInfo {\n fileName: string\n sha512: string\n readonly isAdminRightsRequired: boolean\n}\n\nfunction hashFile(file: string, algorithm = \"sha512\", encoding: \"base64\" | \"hex\" = \"base64\", options?: any): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const hash = createHash(algorithm)\n hash\n .on(\"error\", reject)\n .setEncoding(encoding)\n\n createReadStream(file, {...options, highWaterMark: 1024 * 1024 /* better to use more memory but hash faster */})\n .on(\"error\", reject)\n .on(\"end\", () => {\n hash.end()\n resolve(hash.read() as string)\n })\n .pipe(hash, {end: false})\n })\n}\n\nexport async function createTempUpdateFile(name: string, cacheDir: string, log: Logger): Promise<string> {\n // https://github.com/electron-userland/electron-builder/pull/2474#issuecomment-366481912\n let nameCounter = 0\n let result = path.join(cacheDir, name)\n for (let i = 0; i < 3; i++) {\n try {\n await unlink(result)\n return result\n }\n catch (e) {\n if (e.code === \"ENOENT\") {\n return result\n }\n\n log.warn(`Error on remove temp update file: ${e}`)\n result = path.join(cacheDir, `${nameCounter++}-${name}`)\n }\n }\n return result\n}\n"],"sourceRoot":""}
@@ -269,7 +269,7 @@ class NsisUpdater extends _BaseUpdater().BaseUpdater {
269
269
  }
270
270
 
271
271
  try {
272
- return JSON.parse((0, _zlib().inflateSync)(data).toString());
272
+ return JSON.parse((0, _zlib().gunzipSync)(data).toString());
273
273
  } catch (e) {
274
274
  throw new Error(`Cannot parse blockmap "${url.href}", error: ${e}, raw data: ${data}`);
275
275
  }
@@ -353,7 +353,7 @@ async function _spawn(exe, args) {
353
353
  }
354
354
 
355
355
  function hasQuotes(name) {
356
- return name.includes("'") || name.includes('"');
356
+ return name.includes("'") || name.includes('"') || name.includes('`');
357
357
  }
358
358
  // __ts-babel@6.0.4
359
359
  //# sourceMappingURL=NsisUpdater.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllPublishOptions, newError, PackageFileInfo, BlockMap, CURRENT_APP_PACKAGE_FILE_NAME, CURRENT_APP_INSTALLER_FILE_NAME } from \"builder-util-runtime\"\nimport { spawn } from \"child_process\"\nimport * as path from \"path\"\nimport { AppAdapter } from \"./AppAdapter\"\nimport { DownloadUpdateOptions } from \"./AppUpdater\"\nimport { BaseUpdater, InstallOptions } from \"./BaseUpdater\"\nimport { FileWithEmbeddedBlockMapDifferentialDownloader } from \"./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader\"\nimport { GenericDifferentialDownloader } from \"./differentialDownloader/GenericDifferentialDownloader\"\nimport { newUrlFromBase, ResolvedUpdateFileInfo } from \"./main\"\nimport { findFile, Provider } from \"./providers/Provider\"\nimport { unlink } from \"fs-extra\"\nimport { verifySignature } from \"./windowsExecutableCodeSignatureVerifier\"\nimport { URL } from \"url\"\nimport { inflateSync } from \"zlib\"\n\nexport class NsisUpdater extends BaseUpdater {\n constructor(options?: AllPublishOptions | null, app?: AppAdapter) {\n super(options, app)\n }\n\n /*** @private */\n protected doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>> {\n const provider = downloadUpdateOptions.updateInfoAndProvider.provider\n const fileInfo = findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), \"exe\")!!\n return this.executeDownload({\n fileExtension: \"exe\",\n downloadUpdateOptions,\n fileInfo,\n task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {\n if (hasQuotes(destinationFile) || (packageFile != null && hasQuotes(packageFile))) {\n throw newError(`destinationFile or packageFile contains illegal chars`, \"ERR_UPDATER_ILLEGAL_FILE_NAME\")\n }\n\n const packageInfo = fileInfo.packageInfo\n const isWebInstaller = packageInfo != null && packageFile != null\n if (isWebInstaller || await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider)) {\n await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions)\n }\n\n const signatureVerificationStatus = await this.verifySignature(destinationFile)\n if (signatureVerificationStatus != null) {\n await removeTempDirIfAny()\n // noinspection ThrowInsideFinallyBlockJS\n throw newError(`New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`, \"ERR_UPDATER_INVALID_SIGNATURE\")\n }\n\n if (isWebInstaller) {\n if (await this.differentialDownloadWebPackage(packageInfo!!, packageFile!!, provider)) {\n try {\n await this.httpExecutor.download(new URL(packageInfo!!.path), packageFile!!, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n sha512: packageInfo!!.sha512,\n })\n }\n catch (e) {\n try {\n await unlink(packageFile!!)\n }\n catch (ignored) {\n // ignore\n }\n\n throw e\n }\n }\n }\n },\n })\n }\n\n // $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\n private async verifySignature(tempUpdateFile: string): Promise<string | null> {\n let publisherName: Array<string> | string | null\n try {\n publisherName = (await this.configOnDisk.value).publisherName\n if (publisherName == null) {\n return null\n }\n }\n catch (e) {\n if (e.code === \"ENOENT\") {\n // no app-update.yml\n return null\n }\n throw e\n }\n return await verifySignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile, this._logger)\n }\n\n protected doInstall(options: InstallOptions): boolean {\n const args = [\"--updated\"]\n if (options.isSilent) {\n args.push(\"/S\")\n }\n\n if (options.isForceRunAfter) {\n args.push(\"--force-run\")\n }\n\n const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile\n if (packagePath != null) {\n // only = form is supported\n args.push(`--package-file=${packagePath}`)\n }\n\n const callUsingElevation = (): void => {\n _spawn(path.join(process.resourcesPath!!, \"elevate.exe\"), [options.installerPath].concat(args))\n .catch(e => this.dispatchError(e))\n }\n\n if (options.isAdminRightsRequired) {\n this._logger.info(\"isAdminRightsRequired is set to true, run installer using elevate.exe\")\n callUsingElevation()\n return true\n }\n\n _spawn(options.installerPath, args)\n .catch((e: Error) => {\n // https://github.com/electron-userland/electron-builder/issues/1129\n // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors\n const errorCode = (e as NodeJS.ErrnoException).code\n this._logger.info(`Cannot run installer: error code: ${errorCode}, error message: \"${e.message}\", will be executed again using elevate if EACCES\"`)\n if (errorCode === \"UNKNOWN\" || errorCode === \"EACCES\") {\n callUsingElevation()\n }\n else {\n this.dispatchError(e)\n }\n })\n return true\n }\n\n private async differentialDownloadInstaller(fileInfo: ResolvedUpdateFileInfo, downloadUpdateOptions: DownloadUpdateOptions, installerPath: string, provider: Provider<any>): Promise<boolean> {\n try {\n if (this._testOnlyOptions != null && !this._testOnlyOptions.isUseDifferentialDownload) {\n return true\n }\n\n const newBlockMapUrl = newUrlFromBase(`${fileInfo.url.pathname}.blockmap`, fileInfo.url)\n const oldBlockMapUrl = newUrlFromBase(`${fileInfo.url.pathname.replace(new RegExp(downloadUpdateOptions.updateInfoAndProvider.info.version, \"g\"), this.app.version)}.blockmap`, fileInfo.url)\n this._logger.info(`Download block maps (old: \"${oldBlockMapUrl.href}\", new: ${newBlockMapUrl.href})`)\n\n const downloadBlockMap = async (url: URL): Promise<BlockMap> => {\n const data = await this.httpExecutor.downloadToBuffer(url, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n })\n\n if (data == null || data.length === 0) {\n throw new Error(`Blockmap \"${url.href}\" is empty`)\n }\n\n try {\n return JSON.parse(inflateSync(data).toString())\n }\n catch (e) {\n throw new Error(`Cannot parse blockmap \"${url.href}\", error: ${e}, raw data: ${data}`)\n }\n }\n\n const blockMapDataList = await Promise.all([downloadBlockMap(oldBlockMapUrl), downloadBlockMap(newBlockMapUrl)])\n await new GenericDifferentialDownloader(fileInfo.info, this.httpExecutor, {\n newUrl: fileInfo.url,\n oldFile: path.join(this.downloadedUpdateHelper!!.cacheDir, CURRENT_APP_INSTALLER_FILE_NAME),\n logger: this._logger,\n newFile: installerPath,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n requestHeaders: downloadUpdateOptions.requestHeaders,\n })\n .download(blockMapDataList[0], blockMapDataList[1])\n return false\n }\n catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n if (this._testOnlyOptions != null) {\n // test mode\n throw e\n }\n return true\n }\n }\n\n private async differentialDownloadWebPackage(packageInfo: PackageFileInfo, packagePath: string, provider: Provider<any>): Promise<boolean> {\n if (packageInfo.blockMapSize == null) {\n return true\n }\n\n try {\n await new FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, {\n newUrl: new URL(packageInfo.path),\n oldFile: path.join(this.downloadedUpdateHelper!!.cacheDir, CURRENT_APP_PACKAGE_FILE_NAME),\n logger: this._logger,\n newFile: packagePath,\n requestHeaders: this.requestHeaders,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n })\n .download()\n }\n catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n // during test (developer machine mac or linux) we must throw error\n return process.platform === \"win32\"\n }\n return false\n }\n}\n\n/**\n * This handles both node 8 and node 10 way of emitting error when spawning a process\n * - node 8: Throws the error\n * - node 10: Emit the error(Need to listen with on)\n */\nasync function _spawn(exe: string, args: Array<string>): Promise<any> {\n return new Promise((resolve, reject) => {\n try {\n const process = spawn(exe, args, {\n detached: true,\n stdio: \"ignore\",\n })\n process.on(\"error\", error => {\n reject(error)\n })\n process.unref()\n\n if (process.pid !== undefined) {\n resolve(true)\n }\n }\n catch (error) {\n reject(error)\n }\n })\n}\n\nfunction hasQuotes(name: string): boolean {\n return name.includes(\"'\") || name.includes('\"')\n}"],"sourceRoot":""}
1
+ {"version":3,"sources":["../src/NsisUpdater.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllPublishOptions, newError, PackageFileInfo, BlockMap, CURRENT_APP_PACKAGE_FILE_NAME, CURRENT_APP_INSTALLER_FILE_NAME } from \"builder-util-runtime\"\nimport { spawn } from \"child_process\"\nimport * as path from \"path\"\nimport { AppAdapter } from \"./AppAdapter\"\nimport { DownloadUpdateOptions } from \"./AppUpdater\"\nimport { BaseUpdater, InstallOptions } from \"./BaseUpdater\"\nimport { FileWithEmbeddedBlockMapDifferentialDownloader } from \"./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader\"\nimport { GenericDifferentialDownloader } from \"./differentialDownloader/GenericDifferentialDownloader\"\nimport { newUrlFromBase, ResolvedUpdateFileInfo } from \"./main\"\nimport { findFile, Provider } from \"./providers/Provider\"\nimport { unlink } from \"fs-extra\"\nimport { verifySignature } from \"./windowsExecutableCodeSignatureVerifier\"\nimport { URL } from \"url\"\nimport { gunzipSync } from \"zlib\"\n\nexport class NsisUpdater extends BaseUpdater {\n constructor(options?: AllPublishOptions | null, app?: AppAdapter) {\n super(options, app)\n }\n\n /*** @private */\n protected doDownloadUpdate(downloadUpdateOptions: DownloadUpdateOptions): Promise<Array<string>> {\n const provider = downloadUpdateOptions.updateInfoAndProvider.provider\n const fileInfo = findFile(provider.resolveFiles(downloadUpdateOptions.updateInfoAndProvider.info), \"exe\")!!\n return this.executeDownload({\n fileExtension: \"exe\",\n downloadUpdateOptions,\n fileInfo,\n task: async (destinationFile, downloadOptions, packageFile, removeTempDirIfAny) => {\n if (hasQuotes(destinationFile) || (packageFile != null && hasQuotes(packageFile))) {\n throw newError(`destinationFile or packageFile contains illegal chars`, \"ERR_UPDATER_ILLEGAL_FILE_NAME\")\n }\n\n const packageInfo = fileInfo.packageInfo\n const isWebInstaller = packageInfo != null && packageFile != null\n if (isWebInstaller || await this.differentialDownloadInstaller(fileInfo, downloadUpdateOptions, destinationFile, provider)) {\n await this.httpExecutor.download(fileInfo.url, destinationFile, downloadOptions)\n }\n\n const signatureVerificationStatus = await this.verifySignature(destinationFile)\n if (signatureVerificationStatus != null) {\n await removeTempDirIfAny()\n // noinspection ThrowInsideFinallyBlockJS\n throw newError(`New version ${downloadUpdateOptions.updateInfoAndProvider.info.version} is not signed by the application owner: ${signatureVerificationStatus}`, \"ERR_UPDATER_INVALID_SIGNATURE\")\n }\n\n if (isWebInstaller) {\n if (await this.differentialDownloadWebPackage(packageInfo!!, packageFile!!, provider)) {\n try {\n await this.httpExecutor.download(new URL(packageInfo!!.path), packageFile!!, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n sha512: packageInfo!!.sha512,\n })\n }\n catch (e) {\n try {\n await unlink(packageFile!!)\n }\n catch (ignored) {\n // ignore\n }\n\n throw e\n }\n }\n }\n },\n })\n }\n\n // $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n // | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n // | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\n private async verifySignature(tempUpdateFile: string): Promise<string | null> {\n let publisherName: Array<string> | string | null\n try {\n publisherName = (await this.configOnDisk.value).publisherName\n if (publisherName == null) {\n return null\n }\n }\n catch (e) {\n if (e.code === \"ENOENT\") {\n // no app-update.yml\n return null\n }\n throw e\n }\n return await verifySignature(Array.isArray(publisherName) ? publisherName : [publisherName], tempUpdateFile, this._logger)\n }\n\n protected doInstall(options: InstallOptions): boolean {\n const args = [\"--updated\"]\n if (options.isSilent) {\n args.push(\"/S\")\n }\n\n if (options.isForceRunAfter) {\n args.push(\"--force-run\")\n }\n\n const packagePath = this.downloadedUpdateHelper == null ? null : this.downloadedUpdateHelper.packageFile\n if (packagePath != null) {\n // only = form is supported\n args.push(`--package-file=${packagePath}`)\n }\n\n const callUsingElevation = (): void => {\n _spawn(path.join(process.resourcesPath!!, \"elevate.exe\"), [options.installerPath].concat(args))\n .catch(e => this.dispatchError(e))\n }\n\n if (options.isAdminRightsRequired) {\n this._logger.info(\"isAdminRightsRequired is set to true, run installer using elevate.exe\")\n callUsingElevation()\n return true\n }\n\n _spawn(options.installerPath, args)\n .catch((e: Error) => {\n // https://github.com/electron-userland/electron-builder/issues/1129\n // Node 8 sends errors: https://nodejs.org/dist/latest-v8.x/docs/api/errors.html#errors_common_system_errors\n const errorCode = (e as NodeJS.ErrnoException).code\n this._logger.info(`Cannot run installer: error code: ${errorCode}, error message: \"${e.message}\", will be executed again using elevate if EACCES\"`)\n if (errorCode === \"UNKNOWN\" || errorCode === \"EACCES\") {\n callUsingElevation()\n }\n else {\n this.dispatchError(e)\n }\n })\n return true\n }\n\n private async differentialDownloadInstaller(fileInfo: ResolvedUpdateFileInfo, downloadUpdateOptions: DownloadUpdateOptions, installerPath: string, provider: Provider<any>): Promise<boolean> {\n try {\n if (this._testOnlyOptions != null && !this._testOnlyOptions.isUseDifferentialDownload) {\n return true\n }\n\n const newBlockMapUrl = newUrlFromBase(`${fileInfo.url.pathname}.blockmap`, fileInfo.url)\n const oldBlockMapUrl = newUrlFromBase(`${fileInfo.url.pathname.replace(new RegExp(downloadUpdateOptions.updateInfoAndProvider.info.version, \"g\"), this.app.version)}.blockmap`, fileInfo.url)\n this._logger.info(`Download block maps (old: \"${oldBlockMapUrl.href}\", new: ${newBlockMapUrl.href})`)\n\n const downloadBlockMap = async (url: URL): Promise<BlockMap> => {\n const data = await this.httpExecutor.downloadToBuffer(url, {\n headers: downloadUpdateOptions.requestHeaders,\n cancellationToken: downloadUpdateOptions.cancellationToken,\n })\n\n if (data == null || data.length === 0) {\n throw new Error(`Blockmap \"${url.href}\" is empty`)\n }\n\n try {\n return JSON.parse(gunzipSync(data).toString())\n }\n catch (e) {\n throw new Error(`Cannot parse blockmap \"${url.href}\", error: ${e}, raw data: ${data}`)\n }\n }\n\n const blockMapDataList = await Promise.all([downloadBlockMap(oldBlockMapUrl), downloadBlockMap(newBlockMapUrl)])\n await new GenericDifferentialDownloader(fileInfo.info, this.httpExecutor, {\n newUrl: fileInfo.url,\n oldFile: path.join(this.downloadedUpdateHelper!!.cacheDir, CURRENT_APP_INSTALLER_FILE_NAME),\n logger: this._logger,\n newFile: installerPath,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n requestHeaders: downloadUpdateOptions.requestHeaders,\n })\n .download(blockMapDataList[0], blockMapDataList[1])\n return false\n }\n catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n if (this._testOnlyOptions != null) {\n // test mode\n throw e\n }\n return true\n }\n }\n\n private async differentialDownloadWebPackage(packageInfo: PackageFileInfo, packagePath: string, provider: Provider<any>): Promise<boolean> {\n if (packageInfo.blockMapSize == null) {\n return true\n }\n\n try {\n await new FileWithEmbeddedBlockMapDifferentialDownloader(packageInfo, this.httpExecutor, {\n newUrl: new URL(packageInfo.path),\n oldFile: path.join(this.downloadedUpdateHelper!!.cacheDir, CURRENT_APP_PACKAGE_FILE_NAME),\n logger: this._logger,\n newFile: packagePath,\n requestHeaders: this.requestHeaders,\n isUseMultipleRangeRequest: provider.isUseMultipleRangeRequest,\n })\n .download()\n }\n catch (e) {\n this._logger.error(`Cannot download differentially, fallback to full download: ${e.stack || e}`)\n // during test (developer machine mac or linux) we must throw error\n return process.platform === \"win32\"\n }\n return false\n }\n}\n\n/**\n * This handles both node 8 and node 10 way of emitting error when spawning a process\n * - node 8: Throws the error\n * - node 10: Emit the error(Need to listen with on)\n */\nasync function _spawn(exe: string, args: Array<string>): Promise<any> {\n return new Promise((resolve, reject) => {\n try {\n const process = spawn(exe, args, {\n detached: true,\n stdio: \"ignore\",\n })\n process.on(\"error\", error => {\n reject(error)\n })\n process.unref()\n\n if (process.pid !== undefined) {\n resolve(true)\n }\n }\n catch (error) {\n reject(error)\n }\n })\n}\n\nfunction hasQuotes(name: string): boolean {\n return name.includes(\"'\") || name.includes('\"') || name.includes('`')\n}"],"sourceRoot":""}
@@ -67,7 +67,15 @@ class ElectronHttpExecutor extends _builderUtilRuntime().HttpExecutor {
67
67
  }
68
68
 
69
69
  createRequest(options, callback) {
70
- // differential downloader can call this method very often, so, better to cache session
70
+ // fix (node 7+) for making electron updater work when using AWS private buckets, check if headers contain Host property
71
+ if (options.headers && options.headers.Host) {
72
+ // set host value from headers.Host
73
+ options.host = options.headers.Host; // remove header property 'Host', if not removed causes net::ERR_INVALID_ARGUMENT exception
74
+
75
+ delete options.headers.Host;
76
+ } // differential downloader can call this method very often, so, better to cache session
77
+
78
+
71
79
  if (this.cachedSession == null) {
72
80
  this.cachedSession = getNetSession();
73
81
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/electronHttpExecutor.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAMO,MAAM,gBAAgB,GAAG,kBAAzB;;;AAED,SAAU,aAAV,GAAuB;AAC3B,SAAO,oBAAQ,aAAR,CAAsB,gBAAtB,EAAwC;AAC7C,IAAA,KAAK,EAAE;AADsC,GAAxC,CAAP;AAGD;;AAEK,MAAO,oBAAP,SAAoC,kCAApC,CAAwE;AAG5E,EAAA,WAAA,CAA6B,kBAA7B,EAAkG;AAChG;AAD2B,SAAA,kBAAA,GAAA,kBAAA;AAFrB,SAAA,aAAA,GAAgC,IAAhC;AAIP;;AAED,QAAM,QAAN,CAAe,GAAf,EAAyB,WAAzB,EAA8C,OAA9C,EAAsE;AACpE,WAAO,MAAM,OAAO,CAAC,iBAAR,CAA0B,aAA1B,CAAgD,CAAC,OAAD,EAAU,MAAV,EAAkB,QAAlB,KAA8B;AACzF,YAAM,cAAc,GAAG;AACrB,QAAA,OAAO,EAAE,OAAO,CAAC,OAAR,IAAmB,SADP;AAErB,QAAA,QAAQ,EAAE;AAFW,OAAvB;AAIA,qDAAoB,GAApB,EAAyB,cAAzB;AACA,yDAAwB,cAAxB;AACA,WAAK,UAAL,CAAgB,cAAhB,EAAgC;AAC9B,QAAA,WAD8B;AAE9B,QAAA,OAF8B;AAG9B,QAAA,QAH8B;AAI9B,QAAA,QAAQ,EAAE,KAAK,IAAG;AAChB,cAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,YAAA,OAAO,CAAC,WAAD,CAAP;AACD,WAFD,MAGK;AACH,YAAA,MAAM,CAAC,KAAD,CAAN;AACD;AACF,SAX6B;AAY9B,QAAA,eAAe,EAAE;AAZa,OAAhC,EAaG,CAbH;AAcD,KArBY,CAAb;AAsBD;;AAED,EAAA,aAAa,CAAC,OAAD,EAAe,QAAf,EAAgD;AAC3D;AACA,QAAI,KAAK,aAAL,IAAsB,IAA1B,EAAgC;AAC9B,WAAK,aAAL,GAAqB,aAAa,EAAlC;AACD;;AAED,UAAM,OAAO,GAAG,gBAAI,OAAJ,CAAY,EAC1B,GAAG,OADuB;AAE1B,MAAA,OAAO,EAAE,KAAK;AAFY,KAAZ,CAAhB;;AAIA,IAAA,OAAO,CAAC,EAAR,CAAW,UAAX,EAAuB,QAAvB;;AACA,QAAI,KAAK,kBAAL,IAA2B,IAA/B,EAAqC;AACnC,MAAA,OAAO,CAAC,EAAR,CAAW,OAAX,EAAoB,KAAK,kBAAzB;AACD;;AACD,WAAO,OAAP;AACD;;AAES,EAAA,mBAAmB,CAAC,OAAD,EAAyB,OAAzB,EAAkD,MAAlD,EAAkF,aAAlF,EAAyG,OAAzG,EAAmJ;AAC9K,IAAA,OAAO,CAAC,EAAR,CAAW,UAAX,EAAuB,CAAC,UAAD,EAAqB,MAArB,EAAqC,WAArC,KAA4D;AACjF;AACA;AACA,MAAA,OAAO,CAAC,KAAR;;AAEA,UAAI,aAAa,GAAG,KAAK,YAAzB,EAAuC;AACrC,QAAA,MAAM,CAAC,KAAK,sBAAL,EAAD,CAAN;AACD,OAFD,MAGK;AACH,QAAA,OAAO,CAAC,mCAAa,yBAAb,CAAuC,WAAvC,EAAoD,OAApD,CAAD,CAAP;AACD;AACF,KAXD;AAYD;;AA9D2E,C","sourcesContent":["import { DownloadOptions, HttpExecutor, configureRequestOptions, configureRequestUrl } from \"builder-util-runtime\"\nimport { net, session } from \"electron\"\nimport { RequestOptions } from \"http\"\nimport Session = Electron.Session\nimport ClientRequest = Electron.ClientRequest\n\nexport type LoginCallback = (username: string, password: string) => void\nexport const NET_SESSION_NAME = \"electron-updater\"\n\nexport function getNetSession(): Session {\n return session.fromPartition(NET_SESSION_NAME, {\n cache: false\n })\n}\n\nexport class ElectronHttpExecutor extends HttpExecutor<Electron.ClientRequest> {\n private cachedSession: Session | null = null\n\n constructor(private readonly proxyLoginCallback?: (authInfo: any, callback: LoginCallback) => void) {\n super()\n }\n\n async download(url: URL, destination: string, options: DownloadOptions): Promise<string> {\n return await options.cancellationToken.createPromise<string>((resolve, reject, onCancel) => {\n const requestOptions = {\n headers: options.headers || undefined,\n redirect: \"manual\",\n }\n configureRequestUrl(url, requestOptions)\n configureRequestOptions(requestOptions)\n this.doDownload(requestOptions, {\n destination,\n options,\n onCancel,\n callback: error => {\n if (error == null) {\n resolve(destination)\n }\n else {\n reject(error)\n }\n },\n responseHandler: null,\n }, 0)\n })\n }\n\n createRequest(options: any, callback: (response: any) => void): any {\n // differential downloader can call this method very often, so, better to cache session\n if (this.cachedSession == null) {\n this.cachedSession = getNetSession()\n }\n\n const request = net.request({\n ...options,\n session: this.cachedSession,\n })\n request.on(\"response\", callback)\n if (this.proxyLoginCallback != null) {\n request.on(\"login\", this.proxyLoginCallback)\n }\n return request\n }\n\n protected addRedirectHandlers(request: ClientRequest, options: RequestOptions, reject: (error: Error) => void, redirectCount: number, handler: (options: RequestOptions) => void): void {\n request.on(\"redirect\", (statusCode: number, method: string, redirectUrl: string) => {\n // no way to modify request options, abort old and make a new one\n // https://github.com/electron/electron/issues/11505\n request.abort()\n\n if (redirectCount > this.maxRedirects) {\n reject(this.createMaxRedirectError())\n }\n else {\n handler(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options))\n }\n })\n }\n}"],"sourceRoot":""}
1
+ {"version":3,"sources":["../src/electronHttpExecutor.ts"],"names":[],"mappings":";;;;;;;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AACA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAMO,MAAM,gBAAgB,GAAG,kBAAzB;;;AAED,SAAU,aAAV,GAAuB;AAC3B,SAAO,oBAAQ,aAAR,CAAsB,gBAAtB,EAAwC;AAC7C,IAAA,KAAK,EAAE;AADsC,GAAxC,CAAP;AAGD;;AAEK,MAAO,oBAAP,SAAoC,kCAApC,CAAwE;AAG5E,EAAA,WAAA,CAA6B,kBAA7B,EAAkG;AAChG;AAD2B,SAAA,kBAAA,GAAA,kBAAA;AAFrB,SAAA,aAAA,GAAgC,IAAhC;AAIP;;AAED,QAAM,QAAN,CAAe,GAAf,EAAyB,WAAzB,EAA8C,OAA9C,EAAsE;AACpE,WAAO,MAAM,OAAO,CAAC,iBAAR,CAA0B,aAA1B,CAAgD,CAAC,OAAD,EAAU,MAAV,EAAkB,QAAlB,KAA8B;AACzF,YAAM,cAAc,GAAG;AACrB,QAAA,OAAO,EAAE,OAAO,CAAC,OAAR,IAAmB,SADP;AAErB,QAAA,QAAQ,EAAE;AAFW,OAAvB;AAIA,qDAAoB,GAApB,EAAyB,cAAzB;AACA,yDAAwB,cAAxB;AACA,WAAK,UAAL,CAAgB,cAAhB,EAAgC;AAC9B,QAAA,WAD8B;AAE9B,QAAA,OAF8B;AAG9B,QAAA,QAH8B;AAI9B,QAAA,QAAQ,EAAE,KAAK,IAAG;AAChB,cAAI,KAAK,IAAI,IAAb,EAAmB;AACjB,YAAA,OAAO,CAAC,WAAD,CAAP;AACD,WAFD,MAGK;AACH,YAAA,MAAM,CAAC,KAAD,CAAN;AACD;AACF,SAX6B;AAY9B,QAAA,eAAe,EAAE;AAZa,OAAhC,EAaG,CAbH;AAcD,KArBY,CAAb;AAsBD;;AAED,EAAA,aAAa,CAAC,OAAD,EAAe,QAAf,EAAgD;AAE3D;AACA,QAAI,OAAO,CAAC,OAAR,IAAmB,OAAO,CAAC,OAAR,CAAgB,IAAvC,EAA4C;AAC1C;AACA,MAAA,OAAO,CAAC,IAAR,GAAe,OAAO,CAAC,OAAR,CAAgB,IAA/B,CAF0C,CAG1C;;AACA,aAAO,OAAO,CAAC,OAAR,CAAgB,IAAvB;AACD,KAR0D,CAU3D;;;AACA,QAAI,KAAK,aAAL,IAAsB,IAA1B,EAAgC;AAC9B,WAAK,aAAL,GAAqB,aAAa,EAAlC;AACD;;AAED,UAAM,OAAO,GAAG,gBAAI,OAAJ,CAAY,EAC1B,GAAG,OADuB;AAE1B,MAAA,OAAO,EAAE,KAAK;AAFY,KAAZ,CAAhB;;AAIA,IAAA,OAAO,CAAC,EAAR,CAAW,UAAX,EAAuB,QAAvB;;AACA,QAAI,KAAK,kBAAL,IAA2B,IAA/B,EAAqC;AACnC,MAAA,OAAO,CAAC,EAAR,CAAW,OAAX,EAAoB,KAAK,kBAAzB;AACD;;AACD,WAAO,OAAP;AACD;;AAES,EAAA,mBAAmB,CAAC,OAAD,EAAyB,OAAzB,EAAkD,MAAlD,EAAkF,aAAlF,EAAyG,OAAzG,EAAmJ;AAC9K,IAAA,OAAO,CAAC,EAAR,CAAW,UAAX,EAAuB,CAAC,UAAD,EAAqB,MAArB,EAAqC,WAArC,KAA4D;AACjF;AACA;AACA,MAAA,OAAO,CAAC,KAAR;;AAEA,UAAI,aAAa,GAAG,KAAK,YAAzB,EAAuC;AACrC,QAAA,MAAM,CAAC,KAAK,sBAAL,EAAD,CAAN;AACD,OAFD,MAGK;AACH,QAAA,OAAO,CAAC,mCAAa,yBAAb,CAAuC,WAAvC,EAAoD,OAApD,CAAD,CAAP;AACD;AACF,KAXD;AAYD;;AAvE2E,C","sourcesContent":["import { DownloadOptions, HttpExecutor, configureRequestOptions, configureRequestUrl } from \"builder-util-runtime\"\nimport { net, session } from \"electron\"\nimport { RequestOptions } from \"http\"\nimport Session = Electron.Session\nimport ClientRequest = Electron.ClientRequest\n\nexport type LoginCallback = (username: string, password: string) => void\nexport const NET_SESSION_NAME = \"electron-updater\"\n\nexport function getNetSession(): Session {\n return session.fromPartition(NET_SESSION_NAME, {\n cache: false\n })\n}\n\nexport class ElectronHttpExecutor extends HttpExecutor<Electron.ClientRequest> {\n private cachedSession: Session | null = null\n\n constructor(private readonly proxyLoginCallback?: (authInfo: any, callback: LoginCallback) => void) {\n super()\n }\n\n async download(url: URL, destination: string, options: DownloadOptions): Promise<string> {\n return await options.cancellationToken.createPromise<string>((resolve, reject, onCancel) => {\n const requestOptions = {\n headers: options.headers || undefined,\n redirect: \"manual\",\n }\n configureRequestUrl(url, requestOptions)\n configureRequestOptions(requestOptions)\n this.doDownload(requestOptions, {\n destination,\n options,\n onCancel,\n callback: error => {\n if (error == null) {\n resolve(destination)\n }\n else {\n reject(error)\n }\n },\n responseHandler: null,\n }, 0)\n })\n }\n\n createRequest(options: any, callback: (response: any) => void): any {\n\n // fix (node 7+) for making electron updater work when using AWS private buckets, check if headers contain Host property\n if (options.headers && options.headers.Host){\n // set host value from headers.Host\n options.host = options.headers.Host\n // remove header property 'Host', if not removed causes net::ERR_INVALID_ARGUMENT exception\n delete options.headers.Host;\n }\n\n // differential downloader can call this method very often, so, better to cache session\n if (this.cachedSession == null) {\n this.cachedSession = getNetSession()\n }\n\n const request = net.request({\n ...options,\n session: this.cachedSession,\n })\n request.on(\"response\", callback)\n if (this.proxyLoginCallback != null) {\n request.on(\"login\", this.proxyLoginCallback)\n }\n return request\n }\n\n protected addRedirectHandlers(request: ClientRequest, options: RequestOptions, reject: (error: Error) => void, redirectCount: number, handler: (options: RequestOptions) => void): void {\n request.on(\"redirect\", (statusCode: number, method: string, redirectUrl: string) => {\n // no way to modify request options, abort old and make a new one\n // https://github.com/electron/electron/issues/11505\n request.abort()\n\n if (redirectCount > this.maxRedirects) {\n reject(this.createMaxRedirectError())\n }\n else {\n handler(HttpExecutor.prepareRedirectUrlOptions(redirectUrl, options))\n }\n })\n }\n}"],"sourceRoot":""}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { CancellationToken, HttpExecutor, newError, safeStringifyJson, UpdateFileInfo, UpdateInfo, WindowsUpdateInfo, configureRequestUrl } from \"builder-util-runtime\"\nimport { OutgoingHttpHeaders, RequestOptions } from \"http\"\nimport { safeLoad } from \"js-yaml\"\nimport { URL } from \"url\"\nimport { newUrlFromBase, ResolvedUpdateFileInfo } from \"../main\"\n\nexport type ProviderPlatform = \"darwin\" | \"linux\" | \"win32\"\n\nexport interface ProviderRuntimeOptions {\n isUseMultipleRangeRequest: boolean\n platform: ProviderPlatform\n\n executor: HttpExecutor<any>\n}\n\nexport abstract class Provider<T extends UpdateInfo> {\n private requestHeaders: OutgoingHttpHeaders | null = null\n protected readonly executor: HttpExecutor<any>\n\n protected constructor(private readonly runtimeOptions: ProviderRuntimeOptions) {\n this.executor = runtimeOptions.executor\n }\n\n get isUseMultipleRangeRequest(): boolean {\n return this.runtimeOptions.isUseMultipleRangeRequest !== false\n }\n\n private getChannelFilePrefix(): string {\n if (this.runtimeOptions.platform === \"linux\") {\n const arch = process.env.TEST_UPDATER_ARCH || process.arch\n const archSuffix = arch === \"x64\" ? \"\" : `-${arch}`\n return \"-linux\" + archSuffix\n }\n else {\n return this.runtimeOptions.platform === \"darwin\" ? \"-mac\" : \"\"\n }\n }\n\n // due to historical reasons for windows we use channel name without platform specifier\n protected getDefaultChannelName(): string {\n return this.getCustomChannelName(\"latest\")\n }\n\n protected getCustomChannelName(channel: string): string {\n return `${channel}${this.getChannelFilePrefix()}`\n }\n\n get fileExtraDownloadHeaders(): OutgoingHttpHeaders | null {\n return null\n }\n\n setRequestHeaders(value: OutgoingHttpHeaders | null): void {\n this.requestHeaders = value\n }\n\n abstract getLatestVersion(): Promise<T>\n\n abstract resolveFiles(updateInfo: UpdateInfo): Array<ResolvedUpdateFileInfo>\n\n /**\n * Method to perform API request only to resolve update info, but not to download update.\n */\n protected httpRequest(url: URL, headers?: OutgoingHttpHeaders | null, cancellationToken?: CancellationToken): Promise<string | null> {\n return this.executor.request(this.createRequestOptions(url, headers), cancellationToken)\n }\n\n protected createRequestOptions(url: URL, headers?: OutgoingHttpHeaders | null): RequestOptions {\n const result: RequestOptions = {}\n if (this.requestHeaders == null) {\n if (headers != null) {\n result.headers = headers\n }\n }\n else {\n result.headers = headers == null ? this.requestHeaders : {...this.requestHeaders, ...headers}\n }\n\n configureRequestUrl(url, result)\n return result\n }\n}\n\nexport function findFile(files: Array<ResolvedUpdateFileInfo>, extension: string, not?: Array<string>): ResolvedUpdateFileInfo | null | undefined {\n if (files.length === 0) {\n throw newError(\"No files provided\", \"ERR_UPDATER_NO_FILES_PROVIDED\")\n }\n\n const result = files.find(it => it.url.pathname.toLowerCase().endsWith(`.${extension}`))\n if (result != null) {\n return result\n }\n else if (not == null) {\n return files[0]\n }\n else {\n return files.find(fileInfo => !not.some(ext => fileInfo.url.pathname.toLowerCase().endsWith(`.${ext}`)))\n }\n}\n\nexport function parseUpdateInfo(rawData: string | null, channelFile: string, channelFileUrl: URL): UpdateInfo {\n if (rawData == null) {\n throw newError(`Cannot parse update info from ${channelFile} in the latest release artifacts (${channelFileUrl}): rawData: null`, \"ERR_UPDATER_INVALID_UPDATE_INFO\")\n }\n\n let result: UpdateInfo\n try {\n result = safeLoad(rawData) as UpdateInfo\n }\n catch (e) {\n throw newError(`Cannot parse update info from ${channelFile} in the latest release artifacts (${channelFileUrl}): ${e.stack || e.message}, rawData: ${rawData}`, \"ERR_UPDATER_INVALID_UPDATE_INFO\")\n }\n return result\n}\n\nexport function getFileList(updateInfo: UpdateInfo): Array<UpdateFileInfo> {\n const files = updateInfo.files\n if (files != null && files.length > 0) {\n return files\n }\n\n // noinspection JSDeprecatedSymbols\n if (updateInfo.path != null) {\n // noinspection JSDeprecatedSymbols\n return [\n {\n url: updateInfo.path,\n sha2: (updateInfo as any).sha2,\n sha512: updateInfo.sha512,\n } as any,\n ]\n }\n else {\n throw newError(`No files provided: ${safeStringifyJson(updateInfo)}`, \"ERR_UPDATER_NO_FILES_PROVIDED\")\n }\n}\n\nexport function resolveFiles(updateInfo: UpdateInfo, baseUrl: URL, pathTransformer: (p: string) => string = (p): string => p): Array<ResolvedUpdateFileInfo> {\n const files = getFileList(updateInfo)\n const result: Array<ResolvedUpdateFileInfo> = files.map(fileInfo => {\n if ((fileInfo as any).sha2 == null && fileInfo.sha512 == null) {\n throw newError(`Update info doesn't contain nor sha256 neither sha512 checksum: ${safeStringifyJson(fileInfo)}`, \"ERR_UPDATER_NO_CHECKSUM\")\n }\n return {\n url: newUrlFromBase(pathTransformer(fileInfo.url), baseUrl),\n info: fileInfo,\n }\n })\n\n const packages = (updateInfo as WindowsUpdateInfo).packages\n const packageInfo = packages == null ? null : (packages[process.arch] || packages.ia32)\n if (packageInfo != null) {\n (result[0] as any).packageInfo = {\n ...packageInfo,\n path: newUrlFromBase(pathTransformer(packageInfo.path), baseUrl).href,\n }\n }\n return result\n}"],"sourceRoot":""}
1
+ {"version":3,"sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { CancellationToken, HttpExecutor, newError, safeStringifyJson, UpdateFileInfo, UpdateInfo, WindowsUpdateInfo, configureRequestUrl } from \"builder-util-runtime\"\nimport { OutgoingHttpHeaders, RequestOptions } from \"http\"\nimport { safeLoad } from \"js-yaml\"\nimport { URL } from \"url\"\nimport { newUrlFromBase, ResolvedUpdateFileInfo } from \"../main\"\n\nexport type ProviderPlatform = \"darwin\" | \"linux\" | \"win32\"\n\nexport interface ProviderRuntimeOptions {\n isUseMultipleRangeRequest: boolean\n platform: ProviderPlatform\n\n executor: HttpExecutor<any>\n}\n\nexport abstract class Provider<T extends UpdateInfo> {\n private requestHeaders: OutgoingHttpHeaders | null = null\n protected readonly executor: HttpExecutor<any>\n\n protected constructor(private readonly runtimeOptions: ProviderRuntimeOptions) {\n this.executor = runtimeOptions.executor\n }\n\n get isUseMultipleRangeRequest(): boolean {\n return this.runtimeOptions.isUseMultipleRangeRequest !== false\n }\n\n private getChannelFilePrefix(): string {\n if (this.runtimeOptions.platform === \"linux\") {\n const arch = process.env.TEST_UPDATER_ARCH || process.arch\n const archSuffix = arch === \"x64\" ? \"\" : `-${arch}`\n return \"-linux\" + archSuffix\n }\n else {\n return this.runtimeOptions.platform === \"darwin\" ? \"-mac\" : \"\"\n }\n }\n\n // due to historical reasons for windows we use channel name without platform specifier\n protected getDefaultChannelName(): string {\n return this.getCustomChannelName(\"latest\")\n }\n\n protected getCustomChannelName(channel: string): string {\n return `${channel}${this.getChannelFilePrefix()}`\n }\n\n get fileExtraDownloadHeaders(): OutgoingHttpHeaders | null {\n return null\n }\n\n setRequestHeaders(value: OutgoingHttpHeaders | null): void {\n this.requestHeaders = value\n }\n\n abstract getLatestVersion(): Promise<T>\n\n abstract resolveFiles(updateInfo: UpdateInfo): Array<ResolvedUpdateFileInfo>\n\n /**\n * Method to perform API request only to resolve update info, but not to download update.\n */\n protected httpRequest(url: URL, headers?: OutgoingHttpHeaders | null, cancellationToken?: CancellationToken): Promise<string | null> {\n return this.executor.request(this.createRequestOptions(url, headers), cancellationToken)\n }\n\n protected createRequestOptions(url: URL, headers?: OutgoingHttpHeaders | null): RequestOptions {\n const result: RequestOptions = {}\n if (this.requestHeaders == null) {\n if (headers != null) {\n result.headers = headers\n }\n }\n else {\n result.headers = headers == null ? this.requestHeaders : {...this.requestHeaders, ...headers}\n }\n\n configureRequestUrl(url, result)\n return result\n }\n}\n\nexport function findFile(files: Array<ResolvedUpdateFileInfo>, extension: string, not?: Array<string>): ResolvedUpdateFileInfo | null | undefined {\n if (files.length === 0) {\n throw newError(\"No files provided\", \"ERR_UPDATER_NO_FILES_PROVIDED\")\n }\n\n const result = files.find(it => it.url.pathname.toLowerCase().endsWith(`.${extension}`))\n if (result != null) {\n return result\n }\n else if (not == null) {\n return files[0]\n }\n else {\n return files.find(fileInfo => !not.some(ext => fileInfo.url.pathname.toLowerCase().endsWith(`.${ext}`)))\n }\n}\n\nexport function parseUpdateInfo(rawData: string | null, channelFile: string, channelFileUrl: URL): UpdateInfo {\n if (rawData == null) {\n throw newError(`Cannot parse update info from ${channelFile} in the latest release artifacts (${channelFileUrl}): rawData: null`, \"ERR_UPDATER_INVALID_UPDATE_INFO\")\n }\n\n let result: UpdateInfo\n try {\n result = safeLoad(rawData) as UpdateInfo\n }\n catch (e) {\n throw newError(`Cannot parse update info from ${channelFile} in the latest release artifacts (${channelFileUrl}): ${e.stack || e.message}, rawData: ${rawData}`, \"ERR_UPDATER_INVALID_UPDATE_INFO\")\n }\n return result\n}\n\nexport function getFileList(updateInfo: UpdateInfo): Array<UpdateFileInfo> {\n const files = updateInfo.files\n if (files != null && files.length > 0) {\n return files\n }\n\n // noinspection JSDeprecatedSymbols\n if (updateInfo.path != null) {\n // noinspection JSDeprecatedSymbols\n return [\n {\n url: updateInfo.path,\n sha2: (updateInfo as any).sha2,\n sha512: updateInfo.sha512,\n } as any,\n ]\n }\n else {\n throw newError(`No files provided: ${safeStringifyJson(updateInfo)}`, \"ERR_UPDATER_NO_FILES_PROVIDED\")\n }\n}\n\nexport function resolveFiles(updateInfo: UpdateInfo, baseUrl: URL, pathTransformer: (p: string) => string = (p: string): string => p): Array<ResolvedUpdateFileInfo> {\n const files = getFileList(updateInfo)\n const result: Array<ResolvedUpdateFileInfo> = files.map(fileInfo => {\n if ((fileInfo as any).sha2 == null && fileInfo.sha512 == null) {\n throw newError(`Update info doesn't contain nor sha256 neither sha512 checksum: ${safeStringifyJson(fileInfo)}`, \"ERR_UPDATER_NO_CHECKSUM\")\n }\n return {\n url: newUrlFromBase(pathTransformer(fileInfo.url), baseUrl),\n info: fileInfo,\n }\n })\n\n const packages = (updateInfo as WindowsUpdateInfo).packages\n const packageInfo = packages == null ? null : (packages[process.arch] || packages.ia32)\n if (packageInfo != null) {\n (result[0] as any).packageInfo = {\n ...packageInfo,\n path: newUrlFromBase(pathTransformer(packageInfo.path), baseUrl).href,\n }\n }\n return result\n}"],"sourceRoot":""}
@@ -46,7 +46,7 @@ function verifySignature(publisherNames, tempUpdateFile, logger) {
46
46
  return new Promise(resolve => {
47
47
  // https://github.com/electron-userland/electron-builder/issues/2421
48
48
  // https://github.com/electron-userland/electron-builder/issues/2535
49
- (0, _child_process().execFile)("powershell.exe", ["-NoProfile", "-NonInteractive", "-InputFormat", "None", "-Command", `Get-AuthenticodeSignature '${tempUpdateFile}' | ConvertTo-Json -Compress`], {
49
+ (0, _child_process().execFile)("powershell.exe", ["-NoProfile", "-NonInteractive", "-InputFormat", "None", "-Command", `Get-AuthenticodeSignature '${tempUpdateFile}' | ConvertTo-Json -Compress | ForEach-Object { [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($_)) }`], {
50
50
  timeout: 20 * 1000
51
51
  }, (error, stdout, stderr) => {
52
52
  try {
@@ -56,7 +56,7 @@ function verifySignature(publisherNames, tempUpdateFile, logger) {
56
56
  return;
57
57
  }
58
58
 
59
- const data = parseOut(stdout);
59
+ const data = parseOut(Buffer.from(stdout, "base64").toString("utf-8"));
60
60
 
61
61
  if (data.Status === 0) {
62
62
  const name = (0, _builderUtilRuntime().parseDn)(data.SignerCertificate.Subject).get("CN");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/windowsExecutableCodeSignatureVerifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseDn } from \"builder-util-runtime\"\nimport { execFile, execFileSync } from \"child_process\"\nimport * as os from \"os\"\nimport { Logger } from \"./main\"\n\n// $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n// | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n// | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\nexport function verifySignature(publisherNames: Array<string>, tempUpdateFile: string, logger: Logger): Promise<string | null> {\n return new Promise<string | null>(resolve => {\n // https://github.com/electron-userland/electron-builder/issues/2421\n // https://github.com/electron-userland/electron-builder/issues/2535\n execFile(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-InputFormat\", \"None\", \"-Command\", `Get-AuthenticodeSignature '${tempUpdateFile}' | ConvertTo-Json -Compress`], {\n timeout: 20 * 1000\n }, (error, stdout, stderr) => {\n try {\n if (error != null || stderr) {\n handleError(logger, error, stderr)\n resolve(null)\n return\n }\n\n const data = parseOut(stdout)\n if (data.Status === 0) {\n const name = parseDn(data.SignerCertificate.Subject).get(\"CN\")!\n if (publisherNames.includes(name)) {\n resolve(null)\n return\n }\n }\n\n const result = `publisherNames: ${publisherNames.join(\" | \")}, raw info: ` + JSON.stringify(data, (name, value) => name === \"RawData\" ? undefined : value, 2)\n logger.warn(`Sign verification failed, installer signed with incorrect certificate: ${result}`)\n resolve(result)\n }\n catch (e) {\n logger.warn(`Cannot execute Get-AuthenticodeSignature: ${error}. Ignoring signature validation due to unknown error.`)\n resolve(null)\n return\n }\n })\n })\n}\n\nfunction parseOut(out: string): any {\n const data = JSON.parse(out)\n delete data.PrivateKey\n delete data.IsOSBinary\n delete data.SignatureType\n const signerCertificate = data.SignerCertificate\n if (signerCertificate != null) {\n delete signerCertificate.Archived\n delete signerCertificate.Extensions\n delete signerCertificate.Handle\n delete signerCertificate.HasPrivateKey\n // duplicates data.SignerCertificate (contains RawData)\n delete signerCertificate.SubjectName\n }\n delete data.Path\n return data\n}\n\nfunction handleError(logger: Logger, error: Error | null, stderr: string | null): void {\n if (isOldWin6()) {\n logger.warn(`Cannot execute Get-AuthenticodeSignature: ${error || stderr}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`)\n return\n }\n\n try {\n execFileSync(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-Command\", \"ConvertTo-Json test\"], {timeout: 10 * 1000})\n }\n catch (testError) {\n logger.warn(`Cannot execute ConvertTo-Json: ${testError.message}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`)\n return\n }\n\n if (error != null) {\n throw error\n }\n\n if (stderr) {\n logger.warn(`Cannot execute Get-AuthenticodeSignature, stderr: ${stderr}. Ignoring signature validation due to unknown stderr.`)\n return\n }\n}\n\nfunction isOldWin6(): boolean {\n const winVersion = os.release()\n return winVersion.startsWith(\"6.\") && !winVersion.startsWith(\"6.3\")\n}"],"sourceRoot":""}
1
+ {"version":3,"sources":["../src/windowsExecutableCodeSignatureVerifier.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseDn } from \"builder-util-runtime\"\nimport { execFile, execFileSync } from \"child_process\"\nimport * as os from \"os\"\nimport { Logger } from \"./main\"\n\n// $certificateInfo = (Get-AuthenticodeSignature 'xxx\\yyy.exe'\n// | where {$_.Status.Equals([System.Management.Automation.SignatureStatus]::Valid) -and $_.SignerCertificate.Subject.Contains(\"CN=siemens.com\")})\n// | Out-String ; if ($certificateInfo) { exit 0 } else { exit 1 }\nexport function verifySignature(publisherNames: Array<string>, tempUpdateFile: string, logger: Logger): Promise<string | null> {\n return new Promise<string | null>(resolve => {\n // https://github.com/electron-userland/electron-builder/issues/2421\n // https://github.com/electron-userland/electron-builder/issues/2535\n execFile(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-InputFormat\", \"None\", \"-Command\", `Get-AuthenticodeSignature '${tempUpdateFile}' | ConvertTo-Json -Compress | ForEach-Object { [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($_)) }`], {\n timeout: 20 * 1000\n }, (error, stdout, stderr) => {\n try {\n if (error != null || stderr) {\n handleError(logger, error, stderr)\n resolve(null)\n return\n }\n\n const data = parseOut(Buffer.from(stdout, \"base64\").toString(\"utf-8\"))\n if (data.Status === 0) {\n const name = parseDn(data.SignerCertificate.Subject).get(\"CN\")!\n if (publisherNames.includes(name)) {\n resolve(null)\n return\n }\n }\n\n const result = `publisherNames: ${publisherNames.join(\" | \")}, raw info: ` + JSON.stringify(data, (name, value) => name === \"RawData\" ? undefined : value, 2)\n logger.warn(`Sign verification failed, installer signed with incorrect certificate: ${result}`)\n resolve(result)\n }\n catch (e) {\n logger.warn(`Cannot execute Get-AuthenticodeSignature: ${error}. Ignoring signature validation due to unknown error.`)\n resolve(null)\n return\n }\n })\n })\n}\n\nfunction parseOut(out: string): any {\n const data = JSON.parse(out)\n delete data.PrivateKey\n delete data.IsOSBinary\n delete data.SignatureType\n const signerCertificate = data.SignerCertificate\n if (signerCertificate != null) {\n delete signerCertificate.Archived\n delete signerCertificate.Extensions\n delete signerCertificate.Handle\n delete signerCertificate.HasPrivateKey\n // duplicates data.SignerCertificate (contains RawData)\n delete signerCertificate.SubjectName\n }\n delete data.Path\n return data\n}\n\nfunction handleError(logger: Logger, error: Error | null, stderr: string | null): void {\n if (isOldWin6()) {\n logger.warn(`Cannot execute Get-AuthenticodeSignature: ${error || stderr}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`)\n return\n }\n\n try {\n execFileSync(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-Command\", \"ConvertTo-Json test\"], {timeout: 10 * 1000})\n }\n catch (testError) {\n logger.warn(`Cannot execute ConvertTo-Json: ${testError.message}. Ignoring signature validation due to unsupported powershell version. Please upgrade to powershell 3 or higher.`)\n return\n }\n\n if (error != null) {\n throw error\n }\n\n if (stderr) {\n logger.warn(`Cannot execute Get-AuthenticodeSignature, stderr: ${stderr}. Ignoring signature validation due to unknown stderr.`)\n return\n }\n}\n\nfunction isOldWin6(): boolean {\n const winVersion = os.release()\n return winVersion.startsWith(\"6.\") && !winVersion.startsWith(\"6.3\")\n}\n"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-updater",
3
- "version": "4.3.0",
3
+ "version": "4.3.4",
4
4
  "description": "Cross platform updater for electron applications",
5
5
  "main": "out/main.js",
6
6
  "author": "Vladimir Krivosheev",
@@ -12,16 +12,16 @@
12
12
  "out"
13
13
  ],
14
14
  "dependencies": {
15
- "@types/semver": "^7.1.0",
16
- "builder-util-runtime": "8.6.1",
17
- "fs-extra": "^9.0.0",
18
- "js-yaml": "^3.13.1",
15
+ "@types/semver": "^7.3.1",
16
+ "builder-util-runtime": "8.7.2",
17
+ "fs-extra": "^9.0.1",
18
+ "js-yaml": "^3.14.0",
19
19
  "lazy-val": "^1.0.4",
20
20
  "lodash.isequal": "^4.5.0",
21
- "semver": "^7.1.3"
21
+ "semver": "^7.3.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@types/fs-extra": "^8.1.0",
24
+ "@types/fs-extra": "^9.0.1",
25
25
  "@types/js-yaml": "^3.12.3",
26
26
  "@types/lodash.isequal": "^4.5.5"
27
27
  },