UNPKG

electron-builder-lib

Version:
436 lines (381 loc) 19.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WinPackager = undefined; var _bluebirdLst; function _load_bluebirdLst() { return _bluebirdLst = require("bluebird-lst"); } var _bluebirdLst2; function _load_bluebirdLst2() { return _bluebirdLst2 = _interopRequireDefault(require("bluebird-lst")); } let extractCommonNameUsingOpenssl = (() => { var _ref3 = (0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* (password, certPath) { const result = yield (0, (_builderUtil || _load_builderUtil()).exec)("openssl", ["pkcs12", "-nokeys", "-nodes", "-passin", `pass:${password}`, "-nomacver", "-clcerts", "-in", certPath], { timeout: 30 * 1000 }, debugOpenssl.enabled); const match = result.match(/^subject.*\/CN=([^\/\n]+)/m); if (match == null || match[1] == null) { throw new Error(`Cannot extract common name from p12: ${result}`); } else { return match[1]; } }); return function extractCommonNameUsingOpenssl(_x, _x2) { return _ref3.apply(this, arguments); }; })(); //# sourceMappingURL=winPackager.js.map var _builderUtil; function _load_builderUtil() { return _builderUtil = require("builder-util"); } var _builderUtilRuntime; function _load_builderUtilRuntime() { return _builderUtilRuntime = require("builder-util-runtime"); } var _crypto; function _load_crypto() { return _crypto = require("crypto"); } var _debug2 = _interopRequireDefault(require("debug")); var _fsExtraP; function _load_fsExtraP() { return _fsExtraP = require("fs-extra-p"); } var _isCi; function _load_isCi() { return _isCi = _interopRequireDefault(require("is-ci")); } var _lazyVal; function _load_lazyVal() { return _lazyVal = require("lazy-val"); } var _path = _interopRequireWildcard(require("path")); var _codeSign; function _load_codeSign() { return _codeSign = require("./codeSign"); } var _core; function _load_core() { return _core = require("./core"); } var _platformPackager; function _load_platformPackager() { return _platformPackager = require("./platformPackager"); } var _NsisTarget; function _load_NsisTarget() { return _NsisTarget = require("./targets/nsis/NsisTarget"); } var _nsisUtil; function _load_nsisUtil() { return _nsisUtil = require("./targets/nsis/nsisUtil"); } var _WebInstallerTarget; function _load_WebInstallerTarget() { return _WebInstallerTarget = require("./targets/nsis/WebInstallerTarget"); } var _targetFactory; function _load_targetFactory() { return _targetFactory = require("./targets/targetFactory"); } var _cacheManager; function _load_cacheManager() { return _cacheManager = require("./util/cacheManager"); } var _flags; function _load_flags() { return _flags = require("./util/flags"); } var _timer; function _load_timer() { return _timer = require("./util/timer"); } var _vm; function _load_vm() { return _vm = require("./vm/vm"); } var _windowsCodeSign; function _load_windowsCodeSign() { return _windowsCodeSign = require("./windowsCodeSign"); } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class WinPackager extends (_platformPackager || _load_platformPackager()).PlatformPackager { constructor(info) { var _this; _this = super(info); this.cscInfo = new (_lazyVal || _load_lazyVal()).Lazy(() => { const platformSpecificBuildOptions = this.platformSpecificBuildOptions; if (platformSpecificBuildOptions.certificateSubjectName != null || platformSpecificBuildOptions.certificateSha1 != null) { if (platformSpecificBuildOptions.sign != null) { return (_bluebirdLst2 || _load_bluebirdLst2()).default.resolve(null); } return this.vm.value.then(vm => (0, (_windowsCodeSign || _load_windowsCodeSign()).getCertificateFromStoreInfo)(platformSpecificBuildOptions, vm)); } const certificateFile = platformSpecificBuildOptions.certificateFile; if (certificateFile != null) { const certificatePassword = this.getCscPassword(); return (_bluebirdLst2 || _load_bluebirdLst2()).default.resolve({ file: certificateFile, password: certificatePassword == null ? null : certificatePassword.trim() }); } const cscLink = process.env.WIN_CSC_LINK || this.packagerOptions.cscLink; if (cscLink == null) { return (_bluebirdLst2 || _load_bluebirdLst2()).default.resolve(null); } return (0, (_codeSign || _load_codeSign()).downloadCertificate)(cscLink, this.info.tempDirManager, this.projectDir).then(path => { return { file: path, password: this.getCscPassword() }; }); }); this._iconPath = new (_lazyVal || _load_lazyVal()).Lazy(() => this.getOrConvertIcon("ico")); this.vm = new (_lazyVal || _load_lazyVal()).Lazy(() => process.platform === "win32" ? (_bluebirdLst2 || _load_bluebirdLst2()).default.resolve(new (_vm || _load_vm()).VmManager()) : (0, (_vm || _load_vm()).getWindowsVm)(this.debugLogger)); this.computedPublisherSubjectOnWindowsOnly = new (_lazyVal || _load_lazyVal()).Lazy((0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* () { const cscInfo = yield _this.cscInfo.value; if (cscInfo == null) { return null; } if ("subject" in cscInfo) { return cscInfo.subject; } const vm = yield _this.vm.value; const info = cscInfo; const certFile = vm.toVmFile(info.file); // https://github.com/electron-userland/electron-builder/issues/1735 const args = info.password ? [`(Get-PfxData "${certFile}" -Password (ConvertTo-SecureString -String "${info.password}" -Force -AsPlainText)).EndEntityCertificates.Subject`] : [`(Get-PfxCertificate "${certFile}").Subject`]; return yield vm.exec("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command"].concat(args), { timeout: 30 * 1000 }).then(function (it) { return it.trim(); }); })); this.computedPublisherName = new (_lazyVal || _load_lazyVal()).Lazy((0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* () { let publisherName = _this.platformSpecificBuildOptions.publisherName; if (publisherName === null) { return null; } const cscInfo = yield _this.cscInfo.value; if (cscInfo == null) { return null; } if ("subject" in cscInfo) { return (0, (_builderUtil || _load_builderUtil()).asArray)((0, (_builderUtilRuntime || _load_builderUtilRuntime()).parseDn)(cscInfo.subject).get("CN")); } const cscFile = cscInfo.file; if (publisherName == null && cscFile != null) { if (process.platform === "win32") { try { const subject = yield _this.computedPublisherSubjectOnWindowsOnly.value; const commonName = subject == null ? null : (0, (_builderUtilRuntime || _load_builderUtilRuntime()).parseDn)(subject).get("CN"); if (commonName) { return (0, (_builderUtil || _load_builderUtil()).asArray)(commonName); } } catch (e) { (_builderUtil || _load_builderUtil()).log.warn({ error: e.message }, "cannot get publisher name using powershell"); } } try { publisherName = yield extractCommonNameUsingOpenssl(cscInfo.password || "", cscFile); } catch (e) { throw new Error(`Cannot extract publisher name from code signing certificate, please file issue. As workaround, set win.publisherName: ${e.stack || e}`); } } return publisherName == null ? null : (0, (_builderUtil || _load_builderUtil()).asArray)(publisherName); })); } get isForceCodeSigningVerification() { return this.platformSpecificBuildOptions.verifyUpdateCodeSignature !== false; } get defaultTarget() { return ["nsis"]; } doGetCscPassword() { return this.platformSpecificBuildOptions.certificatePassword || process.env.WIN_CSC_KEY_PASSWORD || super.doGetCscPassword(); } createTargets(targets, mapper) { let copyElevateHelper; const getCopyElevateHelper = () => { if (copyElevateHelper == null) { copyElevateHelper = new (_nsisUtil || _load_nsisUtil()).CopyElevateHelper(); } return copyElevateHelper; }; let helper; const getHelper = () => { if (helper == null) { helper = new (_nsisUtil || _load_nsisUtil()).AppPackageHelper(getCopyElevateHelper()); } return helper; }; for (const name of targets) { if (name === (_core || _load_core()).DIR_TARGET) { continue; } if (name === "nsis" || name === "portable") { mapper(name, outDir => new (_NsisTarget || _load_NsisTarget()).NsisTarget(this, outDir, name, getHelper())); } else if (name === "nsis-web") { // package file format differs from nsis target mapper(name, outDir => new (_WebInstallerTarget || _load_WebInstallerTarget()).WebInstallerTarget(this, _path.join(outDir, name), name, new (_nsisUtil || _load_nsisUtil()).AppPackageHelper(getCopyElevateHelper()))); } else { const targetClass = (() => { switch (name) { case "squirrel": try { return require("electron-builder-squirrel-windows").default; } catch (e) { throw new Error(`Module electron-builder-squirrel-windows must be installed in addition to build Squirrel.Windows: ${e.stack || e}`); } case "appx": return require("./targets/AppxTarget").default; case "msi": return require("./targets/MsiTarget").default; default: return null; } })(); mapper(name, outDir => targetClass === null ? (0, (_targetFactory || _load_targetFactory()).createCommonTarget)(name, outDir, this) : new targetClass(this, outDir, name)); } } } get platform() { return (_core || _load_core()).Platform.WINDOWS; } getIconPath() { return this._iconPath.value; } sign(file, logMessagePrefix) { var _this2 = this; return (0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* () { const signOptions = { path: file, name: _this2.appInfo.productName, site: yield _this2.appInfo.computePackageUrl(), options: _this2.platformSpecificBuildOptions }; const cscInfo = yield _this2.cscInfo.value; if (cscInfo == null) { if (_this2.platformSpecificBuildOptions.sign != null) { yield (0, (_windowsCodeSign || _load_windowsCodeSign()).sign)(signOptions, _this2); } else if (_this2.forceCodeSigning) { throw new Error(`App is not signed and "forceCodeSigning" is set to true, please ensure that code signing configuration is correct, please see https://electron.build/code-signing`); } return; } if (logMessagePrefix == null) { logMessagePrefix = "signing"; } if ("file" in cscInfo) { (_builderUtil || _load_builderUtil()).log.info({ file: (_builderUtil || _load_builderUtil()).log.filePath(file), certificateFile: cscInfo.file }, logMessagePrefix); } else { const info = cscInfo; (_builderUtil || _load_builderUtil()).log.info({ file: (_builderUtil || _load_builderUtil()).log.filePath(file), subject: info.subject, thumbprint: info.thumbprint, store: info.store, user: info.isLocalMachineStore ? "local machine" : "current user" }, logMessagePrefix); } yield _this2.doSign(Object.assign({}, signOptions, { cscInfo, options: Object.assign({}, _this2.platformSpecificBuildOptions) })); })(); } doSign(options) { var _this3 = this; return (0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* () { for (let i = 0; i < 3; i++) { try { yield (0, (_windowsCodeSign || _load_windowsCodeSign()).sign)(options, _this3); break; } catch (e) { // https://github.com/electron-userland/electron-builder/issues/1414 const message = e.message; if (message != null && message.includes("Couldn't resolve host name")) { (_builderUtil || _load_builderUtil()).log.warn({ error: message, attempt: i + 1 }, `cannot sign`); continue; } throw e; } } })(); } signAndEditResources(file, arch, outDir, internalName, requestedExecutionLevel) { var _this4 = this; return (0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* () { const appInfo = _this4.appInfo; const files = []; const args = [file, "--set-version-string", "FileDescription", appInfo.productName, "--set-version-string", "ProductName", appInfo.productName, "--set-version-string", "LegalCopyright", appInfo.copyright, "--set-file-version", appInfo.buildVersion, "--set-product-version", appInfo.versionInWeirdWindowsForm]; if (internalName != null) { args.push("--set-version-string", "InternalName", internalName, "--set-version-string", "OriginalFilename", ""); } if (requestedExecutionLevel != null && requestedExecutionLevel !== "asInvoker") { args.push("--set-requested-execution-level", requestedExecutionLevel); } (0, (_builderUtil || _load_builderUtil()).use)(appInfo.companyName, function (it) { return args.push("--set-version-string", "CompanyName", it); }); (0, (_builderUtil || _load_builderUtil()).use)(_this4.platformSpecificBuildOptions.legalTrademarks, function (it) { return args.push("--set-version-string", "LegalTrademarks", it); }); const iconPath = yield _this4.getIconPath(); (0, (_builderUtil || _load_builderUtil()).use)(iconPath, function (it) { files.push(it); args.push("--set-icon", it); }); const config = _this4.config; const cscInfoForCacheDigest = !(0, (_flags || _load_flags()).isBuildCacheEnabled)() || (_isCi || _load_isCi()).default || config.electronDist != null ? null : yield _this4.cscInfo.value; let buildCacheManager = null; // resources editing doesn't change executable for the same input and executed quickly - no need to complicate if (cscInfoForCacheDigest != null) { const cscFile = cscInfoForCacheDigest.file; if (cscFile != null) { files.push(cscFile); } const timer = (0, (_timer || _load_timer()).time)("executable cache"); const hash = (0, (_crypto || _load_crypto()).createHash)("sha512"); hash.update(config.electronVersion || "no electronVersion"); hash.update(config.muonVersion || "no muonVersion"); hash.update(JSON.stringify(_this4.platformSpecificBuildOptions)); hash.update(JSON.stringify(args)); hash.update(_this4.platformSpecificBuildOptions.certificateSha1 || "no certificateSha1"); hash.update(_this4.platformSpecificBuildOptions.certificateSubjectName || "no subjectName"); buildCacheManager = new (_cacheManager || _load_cacheManager()).BuildCacheManager(outDir, file, arch); if (yield buildCacheManager.copyIfValid((yield (0, (_cacheManager || _load_cacheManager()).digest)(hash, files)))) { timer.end(); return; } timer.end(); } const timer = (0, (_timer || _load_timer()).time)("wine&sign"); yield (0, (_builderUtil || _load_builderUtil()).execWine)(_path.join((yield (0, (_windowsCodeSign || _load_windowsCodeSign()).getSignVendorPath)()), "rcedit.exe"), args); yield _this4.sign(file); timer.end(); if (buildCacheManager != null) { yield buildCacheManager.save(); } })(); } postInitApp(packContext) { var _this5 = this; return (0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* () { const executable = _path.join(packContext.appOutDir, `${_this5.appInfo.productFilename}.exe`); yield (0, (_fsExtraP || _load_fsExtraP()).rename)(_path.join(packContext.appOutDir, `${_this5.electronDistExecutableName}.exe`), executable); })(); } signApp(packContext) { var _this6 = this; return (0, (_bluebirdLst || _load_bluebirdLst()).coroutine)(function* () { const exeFileName = `${_this6.appInfo.productFilename}.exe`; if (_this6.platformSpecificBuildOptions.signAndEditExecutable !== false) { yield _this6.signAndEditResources(_path.join(packContext.appOutDir, exeFileName), packContext.arch, packContext.outDir, _path.basename(exeFileName, ".exe"), _this6.platformSpecificBuildOptions.requestedExecutionLevel); } })(); } } exports.WinPackager = WinPackager; const debugOpenssl = (0, _debug2.default)("electron-builder:openssl");