app-builder-lib 27.0.0-alpha.2 → 27.0.0-alpha.3

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.
Files changed (175) hide show
  1. package/dist/Framework.d.ts +2 -0
  2. package/dist/Framework.d.ts.map +1 -1
  3. package/dist/Framework.js.map +1 -1
  4. package/dist/asar/asarFileChecker.d.ts +4 -2
  5. package/dist/asar/asarFileChecker.d.ts.map +1 -1
  6. package/dist/asar/asarFileChecker.js +2 -3
  7. package/dist/asar/asarFileChecker.js.map +1 -1
  8. package/dist/codeSign/certInfo.d.ts +14 -0
  9. package/dist/codeSign/certInfo.d.ts.map +1 -1
  10. package/dist/codeSign/certInfo.js +49 -0
  11. package/dist/codeSign/certInfo.js.map +1 -1
  12. package/dist/codeSign/mac/macCodeSign.d.ts +3 -3
  13. package/dist/codeSign/mac/macCodeSign.d.ts.map +1 -1
  14. package/dist/codeSign/mac/macCodeSign.js +40 -14
  15. package/dist/codeSign/mac/macCodeSign.js.map +1 -1
  16. package/dist/codeSign/win/hsmSignManager.d.ts +10 -0
  17. package/dist/codeSign/win/hsmSignManager.d.ts.map +1 -0
  18. package/dist/codeSign/win/hsmSignManager.js +50 -0
  19. package/dist/codeSign/win/hsmSignManager.js.map +1 -0
  20. package/dist/codeSign/win/pkcs11SignManager.d.ts +14 -0
  21. package/dist/codeSign/win/pkcs11SignManager.d.ts.map +1 -0
  22. package/dist/codeSign/win/pkcs11SignManager.js +82 -0
  23. package/dist/codeSign/win/pkcs11SignManager.js.map +1 -0
  24. package/dist/codeSign/{signManager.d.ts → win/signManager.d.ts} +8 -6
  25. package/dist/codeSign/win/signManager.d.ts.map +1 -0
  26. package/dist/codeSign/win/signManager.js +19 -0
  27. package/dist/codeSign/win/signManager.js.map +1 -0
  28. package/dist/codeSign/win/signtoolBaseSignManager.d.ts +71 -0
  29. package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -0
  30. package/dist/codeSign/win/signtoolBaseSignManager.js +407 -0
  31. package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -0
  32. package/dist/codeSign/win/windowsCodeSign.d.ts.map +1 -1
  33. package/dist/codeSign/win/windowsCodeSign.js +9 -4
  34. package/dist/codeSign/win/windowsCodeSign.js.map +1 -1
  35. package/dist/codeSign/win/windowsSignAzureManager.d.ts +9 -3
  36. package/dist/codeSign/win/windowsSignAzureManager.d.ts.map +1 -1
  37. package/dist/codeSign/win/windowsSignAzureManager.js +130 -36
  38. package/dist/codeSign/win/windowsSignAzureManager.js.map +1 -1
  39. package/dist/codeSign/win/windowsSignToolManager.d.ts +1 -58
  40. package/dist/codeSign/win/windowsSignToolManager.d.ts.map +1 -1
  41. package/dist/codeSign/win/windowsSignToolManager.js +3 -363
  42. package/dist/codeSign/win/windowsSignToolManager.js.map +1 -1
  43. package/dist/configuration.d.ts +19 -120
  44. package/dist/configuration.d.ts.map +1 -1
  45. package/dist/configuration.js.map +1 -1
  46. package/dist/electron/ElectronFramework.d.ts +0 -2
  47. package/dist/electron/ElectronFramework.d.ts.map +1 -1
  48. package/dist/electron/ElectronFramework.js +15 -27
  49. package/dist/electron/ElectronFramework.js.map +1 -1
  50. package/dist/electron/injectFFMPEG.js +2 -2
  51. package/dist/electron/injectFFMPEG.js.map +1 -1
  52. package/dist/electron/mac/electronMac.js +10 -8
  53. package/dist/electron/mac/electronMac.js.map +1 -1
  54. package/dist/electron/win/electronWin.js +1 -2
  55. package/dist/electron/win/electronWin.js.map +1 -1
  56. package/dist/index.d.ts +8 -4
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +3 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/indexInternal.d.ts +2 -2
  61. package/dist/indexInternal.d.ts.map +1 -1
  62. package/dist/indexInternal.js +1 -1
  63. package/dist/indexInternal.js.map +1 -1
  64. package/dist/macPackager.d.ts +14 -10
  65. package/dist/macPackager.d.ts.map +1 -1
  66. package/dist/macPackager.js +114 -121
  67. package/dist/macPackager.js.map +1 -1
  68. package/dist/node-module-collector/moduleManager.d.ts +7 -1
  69. package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
  70. package/dist/node-module-collector/moduleManager.js +2 -2
  71. package/dist/node-module-collector/moduleManager.js.map +1 -1
  72. package/dist/node-module-collector/nodeModulesCollector.js +1 -1
  73. package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
  74. package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts +48 -1
  75. package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts.map +1 -1
  76. package/dist/node-module-collector/pnpmNodeModulesCollector.js +216 -17
  77. package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  78. package/dist/options/FuseOptionsV1.d.ts +137 -0
  79. package/dist/options/FuseOptionsV1.d.ts.map +1 -0
  80. package/dist/options/FuseOptionsV1.js +2 -0
  81. package/dist/options/FuseOptionsV1.js.map +1 -0
  82. package/dist/options/PlatformSpecificBuildOptions.d.ts +1 -1
  83. package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
  84. package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
  85. package/dist/options/macOptions.d.ts +93 -126
  86. package/dist/options/macOptions.d.ts.map +1 -1
  87. package/dist/options/macOptions.js.map +1 -1
  88. package/dist/options/winOptions.d.ts +137 -63
  89. package/dist/options/winOptions.d.ts.map +1 -1
  90. package/dist/options/winOptions.js +12 -1
  91. package/dist/options/winOptions.js.map +1 -1
  92. package/dist/platformPackager.d.ts +4 -2
  93. package/dist/platformPackager.d.ts.map +1 -1
  94. package/dist/platformPackager.js +11 -7
  95. package/dist/platformPackager.js.map +1 -1
  96. package/dist/targets/ArchiveTarget.js +2 -2
  97. package/dist/targets/ArchiveTarget.js.map +1 -1
  98. package/dist/targets/archive.d.ts +10 -2
  99. package/dist/targets/archive.d.ts.map +1 -1
  100. package/dist/targets/archive.js +25 -6
  101. package/dist/targets/archive.js.map +1 -1
  102. package/dist/targets/linux/snap/core24.d.ts +2 -0
  103. package/dist/targets/linux/snap/core24.d.ts.map +1 -1
  104. package/dist/targets/linux/snap/core24.js +48 -8
  105. package/dist/targets/linux/snap/core24.js.map +1 -1
  106. package/dist/targets/linux/snap/coreLegacy.d.ts +2 -2
  107. package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
  108. package/dist/targets/linux/snap/coreLegacy.js +3 -4
  109. package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
  110. package/dist/targets/linux/snap/snapCommand.d.ts +13 -0
  111. package/dist/targets/linux/snap/snapCommand.d.ts.map +1 -0
  112. package/dist/targets/linux/snap/snapCommand.js +27 -0
  113. package/dist/targets/linux/snap/snapCommand.js.map +1 -0
  114. package/dist/targets/mac/MacTargetHelper.d.ts +12 -12
  115. package/dist/targets/mac/MacTargetHelper.d.ts.map +1 -1
  116. package/dist/targets/mac/MacTargetHelper.js +72 -67
  117. package/dist/targets/mac/MacTargetHelper.js.map +1 -1
  118. package/dist/targets/mac/pkg.d.ts.map +1 -1
  119. package/dist/targets/mac/pkg.js +4 -4
  120. package/dist/targets/mac/pkg.js.map +1 -1
  121. package/dist/targets/win/AppxTarget.d.ts.map +1 -1
  122. package/dist/targets/win/AppxTarget.js +4 -4
  123. package/dist/targets/win/AppxTarget.js.map +1 -1
  124. package/dist/targets/win/nsis/NsisTarget.js +2 -2
  125. package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
  126. package/dist/targets/win/nsis/nsisScriptGenerator.js +1 -1
  127. package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
  128. package/dist/targets/win/nsis/nsisUtil.d.ts.map +1 -1
  129. package/dist/targets/win/nsis/nsisUtil.js +2 -2
  130. package/dist/targets/win/nsis/nsisUtil.js.map +1 -1
  131. package/dist/toolsets/custom.d.ts +1 -0
  132. package/dist/toolsets/custom.d.ts.map +1 -1
  133. package/dist/toolsets/custom.js +19 -8
  134. package/dist/toolsets/custom.js.map +1 -1
  135. package/dist/toolsets/icons.js +1 -1
  136. package/dist/toolsets/icons.js.map +1 -1
  137. package/dist/toolsets/winCodeSign.d.ts +36 -0
  138. package/dist/toolsets/winCodeSign.d.ts.map +1 -1
  139. package/dist/toolsets/winCodeSign.js +84 -30
  140. package/dist/toolsets/winCodeSign.js.map +1 -1
  141. package/dist/toolsets/wine.d.ts.map +1 -1
  142. package/dist/toolsets/wine.js +20 -12
  143. package/dist/toolsets/wine.js.map +1 -1
  144. package/dist/util/config/schemaValidator.d.ts.map +1 -1
  145. package/dist/util/config/schemaValidator.js +1 -1
  146. package/dist/util/config/schemaValidator.js.map +1 -1
  147. package/dist/util/electronGet.d.ts +8 -25
  148. package/dist/util/electronGet.d.ts.map +1 -1
  149. package/dist/util/electronGet.js +107 -87
  150. package/dist/util/electronGet.js.map +1 -1
  151. package/dist/util/flags.d.ts +0 -3
  152. package/dist/util/flags.d.ts.map +1 -1
  153. package/dist/util/flags.js +0 -9
  154. package/dist/util/flags.js.map +1 -1
  155. package/dist/util/license.d.ts.map +1 -1
  156. package/dist/util/license.js +4 -1
  157. package/dist/util/license.js.map +1 -1
  158. package/dist/version.d.ts +1 -1
  159. package/dist/version.js +1 -1
  160. package/dist/version.js.map +1 -1
  161. package/dist/vm/ParallelsVm.d.ts.map +1 -1
  162. package/dist/vm/ParallelsVm.js +13 -2
  163. package/dist/vm/ParallelsVm.js.map +1 -1
  164. package/dist/vm/vm.d.ts.map +1 -1
  165. package/dist/vm/vm.js +4 -1
  166. package/dist/vm/vm.js.map +1 -1
  167. package/dist/winPackager.d.ts +1 -2
  168. package/dist/winPackager.d.ts.map +1 -1
  169. package/dist/winPackager.js +17 -22
  170. package/dist/winPackager.js.map +1 -1
  171. package/package.json +15 -14
  172. package/scheme.json +484 -432
  173. package/dist/codeSign/signManager.d.ts.map +0 -1
  174. package/dist/codeSign/signManager.js +0 -2
  175. package/dist/codeSign/signManager.js.map +0 -1
@@ -0,0 +1,407 @@
1
+ import { asArray, InvalidConfigurationError, log, retry } from "builder-util";
2
+ import { MemoLazy, parseDn } from "builder-util-runtime";
3
+ import _fsExtra from "fs-extra";
4
+ import { Lazy } from "lazy-val";
5
+ import * as path from "path";
6
+ import { resolveWindowsSigningConfiguration, } from "../../options/winOptions.js";
7
+ import AppXTarget from "../../targets/win/AppxTarget.js";
8
+ import { getSignToolPath } from "../../toolsets/winCodeSign.js";
9
+ import { resolveFunction } from "../../util/resolve.js";
10
+ import { readCertInfo, readCertInfoFromX509 } from "../certInfo.js";
11
+ import { VmManager } from "../../vm/vm.js";
12
+ import { importCertificate } from "../codesign.js";
13
+ const { rename } = _fsExtra;
14
+ /** Extracts the non-Azure signing config from WindowsConfiguration, or null for Azure/unset/disabled. */
15
+ export function getSigntoolFamilyConfig(config) {
16
+ const s = resolveWindowsSigningConfiguration(config);
17
+ if (s == null || s.type === "azure") {
18
+ return null;
19
+ }
20
+ return s;
21
+ }
22
+ export class SigntoolBaseSignManager {
23
+ constructor(packager) {
24
+ this.packager = packager;
25
+ this.computedPublisherName = new Lazy(async () => {
26
+ const signing = getSigntoolFamilyConfig(this.platformSpecificBuildOptions);
27
+ const publisherName = signing?.publisherName;
28
+ if (publisherName === null) {
29
+ return null;
30
+ }
31
+ else if (publisherName != null) {
32
+ return asArray(publisherName);
33
+ }
34
+ const certInfo = await this.lazyCertInfo.value;
35
+ return certInfo == null ? null : [certInfo.commonName];
36
+ });
37
+ this.lazyCertInfo = new MemoLazy(() => this.cscInfo, async (csc) => {
38
+ const cscInfo = await csc.value;
39
+ if (cscInfo == null) {
40
+ return null;
41
+ }
42
+ if ("subject" in cscInfo) {
43
+ const bloodyMicrosoftSubjectDn = cscInfo.subject;
44
+ return {
45
+ commonName: parseDn(bloodyMicrosoftSubjectDn).get("CN"),
46
+ bloodyMicrosoftSubjectDn,
47
+ };
48
+ }
49
+ const cscFile = cscInfo.file;
50
+ if (cscFile == null) {
51
+ return null;
52
+ }
53
+ const certExt = path.extname(cscFile).toLowerCase();
54
+ if (certExt === ".p12" || certExt === ".pfx") {
55
+ return await this.getCertInfo(cscFile, cscInfo.password || "");
56
+ }
57
+ // Non-PKCS12 files (.crt, .cer): parse as plain X.509.
58
+ // Returns null when the CN is absent — caller must set publisherName explicitly.
59
+ return await readCertInfoFromX509(cscFile);
60
+ });
61
+ this.cscInfo = new MemoLazy(() => this.platformSpecificBuildOptions, platformSpecificBuildOptions => {
62
+ const signing = getSigntoolFamilyConfig(platformSpecificBuildOptions);
63
+ // signtool is the implicit default when win.sign is unset, so an absent config still
64
+ // honours the WIN_CSC_LINK/cscLink fallback below (hsm/pkcs11 set signing.type explicitly).
65
+ const isSigntool = signing == null || signing.type === "signtool";
66
+ // signtool + hsm: store-based cert takes priority
67
+ const subjectName = signing?.certificateSubjectName;
68
+ const shaType = signing?.certificateSha1;
69
+ if (subjectName != null || shaType != null) {
70
+ return this.packager.vm.value
71
+ .then(vm => this.getCertificateFromStoreInfo(platformSpecificBuildOptions, vm))
72
+ .catch((e) => {
73
+ // https://github.com/electron-userland/electron-builder/pull/2397
74
+ if (signing?.sign == null) {
75
+ throw e;
76
+ }
77
+ else {
78
+ log.debug({ error: e }, "getCertificateFromStoreInfo error");
79
+ return null;
80
+ }
81
+ });
82
+ }
83
+ const certificateFile = signing?.certificateFile;
84
+ if (certificateFile != null) {
85
+ // Only signtool mode uses a password (HSM private key lives in the HSM, not the cert file)
86
+ const certificatePassword = isSigntool ? this.packager.getCscPassword() : null;
87
+ return Promise.resolve({
88
+ file: certificateFile,
89
+ password: certificatePassword == null ? null : certificatePassword.trim(),
90
+ });
91
+ }
92
+ // WIN_CSC_LINK env var fallback: only for signtool mode (including the implicit default)
93
+ if (isSigntool) {
94
+ const cscLink = this.packager.getCscLink("WIN_CSC_LINK");
95
+ if (cscLink == null || cscLink === "") {
96
+ return Promise.resolve(null);
97
+ }
98
+ return importCertificate(cscLink, this.packager.tempDirManager, this.packager.projectDir)
99
+ .catch((e) => {
100
+ if (e instanceof InvalidConfigurationError) {
101
+ throw new InvalidConfigurationError(`Env WIN_CSC_LINK is not correct, cannot resolve: ${e.message}`);
102
+ }
103
+ else {
104
+ throw e;
105
+ }
106
+ })
107
+ .then(p => ({
108
+ file: p,
109
+ password: this.packager.getCscPassword(),
110
+ }));
111
+ }
112
+ return Promise.resolve(null);
113
+ });
114
+ this.platformSpecificBuildOptions = packager.platformOptions;
115
+ }
116
+ initialize() {
117
+ return Promise.resolve();
118
+ }
119
+ // https://github.com/electron-userland/electron-builder/issues/2108#issuecomment-333200711
120
+ async computePublisherName(target, publisherName) {
121
+ if (target instanceof AppXTarget && (await this.cscInfo.value) == null) {
122
+ log.info({ reason: "Windows Store only build" }, "AppX is not signed");
123
+ return publisherName ?? "CN=ms";
124
+ }
125
+ // When a signing cert is available, the cert's subject MUST be used so the APPX package
126
+ // Publisher attribute matches the certificate — any mismatch causes SignerSign to fail with
127
+ // ERROR_BAD_FORMAT. Only honour a user-supplied publisherName if it was explicitly configured
128
+ // (non-null); otherwise derive from the certificate.
129
+ const certInfo = await this.lazyCertInfo.value;
130
+ const publisher = publisherName ?? certInfo?.bloodyMicrosoftSubjectDn ?? null;
131
+ if (publisher == null) {
132
+ throw new Error("Internal error: cannot compute subject using certificate info");
133
+ }
134
+ return publisher;
135
+ }
136
+ /**
137
+ * Called when cscInfo is null. Returns true to skip signing, false to proceed, or throws.
138
+ * Override in subclasses with different null-cert behaviour (HSM throws, PKCS#11 proceeds).
139
+ */
140
+ handleNullCscInfo(customSign) {
141
+ return !customSign; // default: skip when no cert and no custom sign hook
142
+ }
143
+ async signFile(options) {
144
+ const signing = getSigntoolFamilyConfig(options.options);
145
+ let hashes = signing?.signingHashAlgorithms;
146
+ // msi does not support dual-signing
147
+ if (options.path.endsWith(".msi")) {
148
+ hashes = [hashes != null && !hashes.includes("sha1") ? "sha256" : "sha1"];
149
+ }
150
+ else if (options.path.endsWith(".appx")) {
151
+ hashes = ["sha256"];
152
+ }
153
+ else if (hashes == null) {
154
+ hashes = ["sha1", "sha256"];
155
+ }
156
+ else {
157
+ hashes = Array.isArray(hashes) ? hashes : [hashes];
158
+ }
159
+ const name = this.packager.appInfo.productName;
160
+ const site = await this.packager.appInfo.computePackageUrl();
161
+ const customSign = await resolveFunction(this.packager.appInfo.type, signing?.sign, "sign", await this.packager.getWorkspaceRoot());
162
+ const cscInfo = await this.cscInfo.value;
163
+ if (cscInfo) {
164
+ let logInfo = {
165
+ file: log.filePath(options.path),
166
+ };
167
+ if ("file" in cscInfo) {
168
+ logInfo = { ...logInfo, certificateFile: cscInfo.file };
169
+ }
170
+ else {
171
+ logInfo = {
172
+ ...logInfo,
173
+ subject: cscInfo.subject,
174
+ thumbprint: cscInfo.thumbprint,
175
+ store: cscInfo.store,
176
+ user: cscInfo.isLocalMachineStore ? "local machine" : "current user",
177
+ };
178
+ }
179
+ log.info(logInfo, "signing");
180
+ }
181
+ else if (this.handleNullCscInfo(customSign)) {
182
+ log.debug({ signHook: !!customSign, cscInfo }, "no signing info identified, signing is skipped");
183
+ return false;
184
+ }
185
+ const executor = customSign || ((config, packager) => this.doSign(config, packager));
186
+ let isNest = false;
187
+ for (const hash of hashes) {
188
+ const taskConfiguration = { ...options, name, site, cscInfo, hash, isNest };
189
+ await Promise.resolve(executor({
190
+ ...taskConfiguration,
191
+ computeSignToolArgs: isWin => this.computeSignToolArgs(taskConfiguration, isWin),
192
+ }, this.packager));
193
+ isNest = true;
194
+ if (taskConfiguration.resultOutputPath != null) {
195
+ await rename(taskConfiguration.resultOutputPath, options.path);
196
+ }
197
+ }
198
+ return true;
199
+ }
200
+ async getCertInfo(file, password) {
201
+ const errorMessagePrefix = "Cannot extract publisher name from code signing certificate. As workaround, set win.publisherName. Error: ";
202
+ try {
203
+ return await readCertInfo(file, password);
204
+ }
205
+ catch (e) {
206
+ throw new InvalidConfigurationError(`${errorMessagePrefix}${e.message || e}`);
207
+ }
208
+ }
209
+ // on windows be aware of http://stackoverflow.com/a/32640183/1910191
210
+ computeSignToolArgs(options, isWin, vm = new VmManager()) {
211
+ return isWin ? this.computeWindowsSignArgs(options, vm) : this.computeOsslsigncodeArgs(options, vm);
212
+ }
213
+ isLegacyToolset() {
214
+ const v = this.packager.config.toolsets?.winCodeSign;
215
+ return v == null || v === "0.0.0";
216
+ }
217
+ // allowX509: set to true by HsmSignManager to permit .crt/.cer (public chain only, key is in HSM).
218
+ addCertificateArgs(args, options, vm, isWin, allowX509 = false) {
219
+ if (options.cscInfo == null) {
220
+ throw new Error("No code signing certificate configured. Provide certificateFile, certificateSha1, or certificateSubjectName.");
221
+ }
222
+ const certificateFile = options.cscInfo.file;
223
+ if (certificateFile == null) {
224
+ // Certificate from store (Windows only)
225
+ if (!isWin) {
226
+ throw new Error("certificateSha1/certificateSubjectName supported only on Windows");
227
+ }
228
+ const cscInfo = options.cscInfo;
229
+ args.push("/sha1", cscInfo.thumbprint);
230
+ args.push("/s", cscInfo.store);
231
+ if (cscInfo.isLocalMachineStore) {
232
+ args.push("/sm");
233
+ }
234
+ }
235
+ else {
236
+ const certExtension = path.extname(certificateFile).toLowerCase();
237
+ if (certExtension === ".p12" || certExtension === ".pfx") {
238
+ args.push(isWin ? "/f" : "-pkcs12", vm.toVmFile(certificateFile));
239
+ }
240
+ else if (isWin && allowX509 && (certExtension === ".crt" || certExtension === ".cer")) {
241
+ args.push("/f", vm.toVmFile(certificateFile));
242
+ }
243
+ else {
244
+ throw new InvalidConfigurationError(`Please specify pkcs12 (.p12/.pfx) file, ${certificateFile} is not correct`);
245
+ }
246
+ }
247
+ }
248
+ addCommonSigningArgs(args, options, vm, isWin) {
249
+ if (options.name) {
250
+ args.push(isWin ? "/d" : "-n", options.name);
251
+ }
252
+ if (options.site) {
253
+ args.push(isWin ? "/du" : "-i", options.site);
254
+ }
255
+ if (options.isNest) {
256
+ args.push(isWin ? "/as" : "-nest");
257
+ }
258
+ const password = options.cscInfo?.password;
259
+ if (password) {
260
+ args.push(isWin ? "/p" : "-pass", password);
261
+ }
262
+ const signing = getSigntoolFamilyConfig(options.options);
263
+ const additionalCert = signing?.additionalCertificateFile;
264
+ if (additionalCert) {
265
+ args.push(isWin ? "/ac" : "-ac", vm.toVmFile(additionalCert));
266
+ }
267
+ }
268
+ getOutputPath(inputPath, hash) {
269
+ const extension = path.extname(inputPath);
270
+ return path.join(path.dirname(inputPath), `${path.basename(inputPath, extension)}-signed-${hash}${extension}`);
271
+ }
272
+ async getCertificateFromStoreInfo(options, vm) {
273
+ const signing = getSigntoolFamilyConfig(options);
274
+ const certificateSubjectName = signing?.certificateSubjectName;
275
+ const certificateSha1 = signing?.certificateSha1?.toUpperCase();
276
+ const ps = await vm.powershellCommand.value;
277
+ const rawResult = await vm.exec(ps, [
278
+ "-NoProfile",
279
+ "-NonInteractive",
280
+ "-Command",
281
+ "Get-ChildItem -Recurse Cert: -CodeSigningCert | Select-Object -Property Subject,PSParentPath,Thumbprint | ConvertTo-Json -Compress",
282
+ ]);
283
+ const certList = rawResult.length === 0 ? [] : asArray(JSON.parse(rawResult));
284
+ for (const certInfo of certList) {
285
+ if ((certificateSubjectName != null && !certInfo.Subject.includes(certificateSubjectName)) ||
286
+ (certificateSha1 != null && certInfo.Thumbprint.toUpperCase() !== certificateSha1)) {
287
+ continue;
288
+ }
289
+ const parentPath = certInfo.PSParentPath;
290
+ const store = parentPath.substring(parentPath.lastIndexOf("\\") + 1);
291
+ log.debug({ store, PSParentPath: parentPath }, "auto-detect certificate store");
292
+ // https://github.com/electron-userland/electron-builder/issues/1717
293
+ const isLocalMachineStore = parentPath.includes("Certificate::LocalMachine");
294
+ log.debug(null, "auto-detect using of LocalMachine store");
295
+ return {
296
+ thumbprint: certInfo.Thumbprint,
297
+ subject: certInfo.Subject,
298
+ store,
299
+ isLocalMachineStore,
300
+ };
301
+ }
302
+ throw new Error(`Cannot find certificate ${certificateSubjectName || certificateSha1}, all certs: ${rawResult}`);
303
+ }
304
+ async getToolPath(isWin = process.platform === "win32") {
305
+ return getSignToolPath(this.packager.config.toolsets?.winCodeSign, isWin, this.packager.buildResourcesDir);
306
+ }
307
+ async doSign(configuration, packager) {
308
+ // https://github.com/electron-userland/electron-builder/pull/1944
309
+ const timeout = parseInt(process.env.SIGNTOOL_TIMEOUT, 10) || 10 * 60 * 1000;
310
+ let args;
311
+ let vm;
312
+ // cscInfo can be null (e.g. PKCS#11 with no cert file); guard before using `in`.
313
+ // CertificateFromStoreInfo (no `file` property) requires a Windows VM for cert-store lookup.
314
+ const cscInfo = configuration.cscInfo;
315
+ const useVmIfNotOnWin = configuration.path.endsWith(".appx") || (cscInfo != null && !("file" in cscInfo));
316
+ const isWin = process.platform === "win32" || useVmIfNotOnWin;
317
+ const toolInfo = await getSignToolPath(this.packager.config.toolsets?.winCodeSign, isWin, this.packager.buildResourcesDir);
318
+ const tool = toolInfo.path;
319
+ if (useVmIfNotOnWin) {
320
+ vm = await packager.vm.value;
321
+ args = this.computeSignToolArgs(configuration, isWin, vm);
322
+ }
323
+ else {
324
+ vm = new VmManager();
325
+ args = configuration.computeSignToolArgs(isWin);
326
+ }
327
+ await retry(() => vm.exec(tool, args, { timeout, env: { ...process.env, ...(toolInfo.env || {}) } }), {
328
+ retries: 2,
329
+ interval: 15000,
330
+ backoff: 10000,
331
+ shouldRetry: (e) => {
332
+ if (e.message.includes("The file is being used by another process") ||
333
+ e.message.includes("The specified timestamp server either could not be reached") ||
334
+ e.message.includes("No certificates were found that met all the given criteria.")) {
335
+ log.warn(`Attempt to code sign failed, another attempt will be made in 15 seconds: ${e.message}`);
336
+ return true;
337
+ }
338
+ return false;
339
+ },
340
+ });
341
+ }
342
+ }
343
+ export class SigntoolSignManager extends SigntoolBaseSignManager {
344
+ computeWindowsSignArgs(options, vm) {
345
+ const signing = getSigntoolFamilyConfig(options.options);
346
+ const inputFile = vm.toVmFile(options.path);
347
+ const args = ["sign"];
348
+ // Timestamping
349
+ if (process.env.ELECTRON_BUILDER_OFFLINE !== "true") {
350
+ const isRfc3161 = options.isNest || options.hash === "sha256";
351
+ args.push(isRfc3161 ? "/tr" : "/t");
352
+ const timestampUrl = isRfc3161 ? signing?.rfc3161TimeStampServer || "http://timestamp.digicert.com" : signing?.timeStampServer || "http://timestamp.digicert.com";
353
+ args.push(timestampUrl);
354
+ }
355
+ // Certificate
356
+ this.addCertificateArgs(args, options, vm, true);
357
+ // Hash algorithm
358
+ if (this.isLegacyToolset()) {
359
+ // Legacy v0.0.0: Only add /fd for non-SHA1 (original behavior)
360
+ if (options.hash !== "sha1") {
361
+ args.push("/fd", options.hash);
362
+ if (process.env.ELECTRON_BUILDER_OFFLINE !== "true") {
363
+ args.push("/td", "sha256");
364
+ }
365
+ }
366
+ }
367
+ else {
368
+ // Modern: Always add /fd (required by new Windows Kits)
369
+ args.push("/fd", options.hash.toLowerCase());
370
+ // Only add /td for RFC3161 timestamps (incompatible with /t)
371
+ if (process.env.ELECTRON_BUILDER_OFFLINE !== "true" && (options.isNest || options.hash === "sha256")) {
372
+ args.push("/td", "sha256");
373
+ }
374
+ }
375
+ // Optional parameters
376
+ this.addCommonSigningArgs(args, options, vm, true);
377
+ // Windows-specific
378
+ args.push("/debug");
379
+ args.push(inputFile); // Must be last
380
+ return args;
381
+ }
382
+ computeOsslsigncodeArgs(options, vm) {
383
+ const signing = getSigntoolFamilyConfig(options.options);
384
+ const inputFile = vm.toVmFile(options.path);
385
+ const outputPath = this.getOutputPath(inputFile, options.hash);
386
+ options.resultOutputPath = outputPath;
387
+ const args = ["sign", "-in", inputFile, "-out", outputPath];
388
+ // Timestamping
389
+ if (process.env.ELECTRON_BUILDER_OFFLINE !== "true") {
390
+ const timestampUrl = signing?.timeStampServer || "http://timestamp.digicert.com";
391
+ args.push("-t", timestampUrl);
392
+ }
393
+ // Certificate file
394
+ this.addCertificateArgs(args, options, vm, false);
395
+ // Hash algorithm
396
+ args.push("-h", options.hash.toLowerCase());
397
+ // Optional parameters (name, site, nest, password, additionalCert)
398
+ this.addCommonSigningArgs(args, options, vm, false);
399
+ // Proxy support
400
+ const httpsProxy = process.env.HTTPS_PROXY;
401
+ if (httpsProxy?.length) {
402
+ args.push("-p", httpsProxy);
403
+ }
404
+ return args;
405
+ }
406
+ }
407
+ //# sourceMappingURL=signtoolBaseSignManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signtoolBaseSignManager.js","sourceRoot":"","sources":["../../../src/codeSign/win/signtoolBaseSignManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray, InvalidConfigurationError, log, retry } from \"builder-util\"\nimport { MemoLazy, parseDn } from \"builder-util-runtime\"\nimport _fsExtra from \"fs-extra\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Target } from \"../../core.js\"\nimport {\n resolveWindowsSigningConfiguration,\n WindowsConfiguration,\n WindowsHsmSigningConfig,\n WindowsSigntoolFamilyConfig,\n WindowsSigntoolSigningConfig,\n} from \"../../options/winOptions.js\"\nimport AppXTarget from \"../../targets/win/AppxTarget.js\"\nimport { getSignToolPath } from \"../../toolsets/winCodeSign.js\"\nimport { ToolInfo } from \"../../util/bundledTool.js\"\nimport { resolveFunction } from \"../../util/resolve.js\"\nimport { readCertInfo, readCertInfoFromX509 } from \"../certInfo.js\"\nimport { VmManager } from \"../../vm/vm.js\"\nimport type { WinPackager } from \"../../winPackager.js\"\nimport { importCertificate } from \"../codesign.js\"\nimport type { SignManager } from \"./signManager.js\"\nimport { WindowsSignOptions } from \"./windowsCodeSign.js\"\nconst { rename } = _fsExtra\n\nexport type CustomWindowsSign = (configuration: CustomWindowsSignTaskConfiguration, packager?: WinPackager) => Promise<any>\n\nexport interface WindowsSignToolOptions extends WindowsSignOptions {\n readonly name: string\n readonly site: string | null\n}\n\nexport interface FileCodeSigningInfo {\n readonly file: string\n readonly password: string | null\n}\n\nexport interface WindowsSignTaskConfiguration extends WindowsSignToolOptions {\n readonly cscInfo: FileCodeSigningInfo | CertificateFromStoreInfo | null\n\n // set if output path differs from input (e.g. osslsigncode cannot sign file in-place)\n resultOutputPath?: string\n\n hash: string\n isNest: boolean\n}\n\nexport interface CustomWindowsSignTaskConfiguration extends WindowsSignTaskConfiguration {\n computeSignToolArgs(isWin: boolean): Array<string>\n}\n\nexport interface CertificateInfo {\n readonly commonName: string\n readonly bloodyMicrosoftSubjectDn: string\n}\n\nexport interface CertificateFromStoreInfo {\n thumbprint: string\n subject: string\n store: string\n isLocalMachineStore: boolean\n}\n\ninterface CertInfo {\n Subject: string\n Thumbprint: string\n PSParentPath: string\n}\n\n/** Extracts the non-Azure signing config from WindowsConfiguration, or null for Azure/unset/disabled. */\nexport function getSigntoolFamilyConfig(config: WindowsConfiguration): WindowsSigntoolFamilyConfig | null {\n const s = resolveWindowsSigningConfiguration(config)\n if (s == null || s.type === \"azure\") {\n return null\n }\n return s\n}\n\nexport abstract class SigntoolBaseSignManager implements SignManager {\n protected readonly platformSpecificBuildOptions: WindowsConfiguration\n\n constructor(protected readonly packager: WinPackager) {\n this.platformSpecificBuildOptions = packager.platformOptions\n }\n\n readonly computedPublisherName = new Lazy<Array<string> | null>(async () => {\n const signing = getSigntoolFamilyConfig(this.platformSpecificBuildOptions)\n const publisherName = signing?.publisherName\n if (publisherName === null) {\n return null\n } else if (publisherName != null) {\n return asArray(publisherName)\n }\n\n const certInfo = await this.lazyCertInfo.value\n return certInfo == null ? null : [certInfo.commonName]\n })\n\n readonly lazyCertInfo = new MemoLazy<MemoLazy<WindowsConfiguration, FileCodeSigningInfo | CertificateFromStoreInfo | null>, CertificateInfo | null>(\n () => this.cscInfo,\n async csc => {\n const cscInfo = await csc.value\n if (cscInfo == null) {\n return null\n }\n\n if (\"subject\" in cscInfo) {\n const bloodyMicrosoftSubjectDn = cscInfo.subject\n return {\n commonName: parseDn(bloodyMicrosoftSubjectDn).get(\"CN\")!,\n bloodyMicrosoftSubjectDn,\n }\n }\n\n const cscFile = cscInfo.file\n if (cscFile == null) {\n return null\n }\n\n const certExt = path.extname(cscFile).toLowerCase()\n if (certExt === \".p12\" || certExt === \".pfx\") {\n return await this.getCertInfo(cscFile, cscInfo.password || \"\")\n }\n // Non-PKCS12 files (.crt, .cer): parse as plain X.509.\n // Returns null when the CN is absent — caller must set publisherName explicitly.\n return await readCertInfoFromX509(cscFile)\n }\n )\n\n readonly cscInfo = new MemoLazy<WindowsConfiguration, FileCodeSigningInfo | CertificateFromStoreInfo | null>(\n () => this.platformSpecificBuildOptions,\n platformSpecificBuildOptions => {\n const signing = getSigntoolFamilyConfig(platformSpecificBuildOptions)\n // signtool is the implicit default when win.sign is unset, so an absent config still\n // honours the WIN_CSC_LINK/cscLink fallback below (hsm/pkcs11 set signing.type explicitly).\n const isSigntool = signing == null || signing.type === \"signtool\"\n\n // signtool + hsm: store-based cert takes priority\n const subjectName = (signing as WindowsSigntoolSigningConfig | WindowsHsmSigningConfig | null)?.certificateSubjectName\n const shaType = (signing as WindowsSigntoolSigningConfig | WindowsHsmSigningConfig | null)?.certificateSha1\n if (subjectName != null || shaType != null) {\n return this.packager.vm.value\n .then(vm => this.getCertificateFromStoreInfo(platformSpecificBuildOptions, vm))\n .catch((e: any) => {\n // https://github.com/electron-userland/electron-builder/pull/2397\n if (signing?.sign == null) {\n throw e\n } else {\n log.debug({ error: e }, \"getCertificateFromStoreInfo error\")\n return null\n }\n })\n }\n\n const certificateFile = signing?.certificateFile\n if (certificateFile != null) {\n // Only signtool mode uses a password (HSM private key lives in the HSM, not the cert file)\n const certificatePassword = isSigntool ? this.packager.getCscPassword() : null\n return Promise.resolve({\n file: certificateFile,\n password: certificatePassword == null ? null : certificatePassword.trim(),\n })\n }\n\n // WIN_CSC_LINK env var fallback: only for signtool mode (including the implicit default)\n if (isSigntool) {\n const cscLink = this.packager.getCscLink(\"WIN_CSC_LINK\")\n if (cscLink == null || cscLink === \"\") {\n return Promise.resolve(null)\n }\n\n return importCertificate(cscLink, this.packager.tempDirManager, this.packager.projectDir)\n .catch((e: any) => {\n if (e instanceof InvalidConfigurationError) {\n throw new InvalidConfigurationError(`Env WIN_CSC_LINK is not correct, cannot resolve: ${e.message}`)\n } else {\n throw e\n }\n })\n .then(p => ({\n file: p,\n password: this.packager.getCscPassword(),\n }))\n }\n\n return Promise.resolve(null)\n }\n )\n\n initialize(): Promise<void> {\n return Promise.resolve()\n }\n\n // https://github.com/electron-userland/electron-builder/issues/2108#issuecomment-333200711\n async computePublisherName(target: Target, publisherName: string | null) {\n if (target instanceof AppXTarget && (await this.cscInfo.value) == null) {\n log.info({ reason: \"Windows Store only build\" }, \"AppX is not signed\")\n return publisherName ?? \"CN=ms\"\n }\n\n // When a signing cert is available, the cert's subject MUST be used so the APPX package\n // Publisher attribute matches the certificate — any mismatch causes SignerSign to fail with\n // ERROR_BAD_FORMAT. Only honour a user-supplied publisherName if it was explicitly configured\n // (non-null); otherwise derive from the certificate.\n const certInfo = await this.lazyCertInfo.value\n const publisher = publisherName ?? certInfo?.bloodyMicrosoftSubjectDn ?? null\n if (publisher == null) {\n throw new Error(\"Internal error: cannot compute subject using certificate info\")\n }\n return publisher\n }\n\n /**\n * Called when cscInfo is null. Returns true to skip signing, false to proceed, or throws.\n * Override in subclasses with different null-cert behaviour (HSM throws, PKCS#11 proceeds).\n */\n protected handleNullCscInfo(customSign: CustomWindowsSign | string | null | undefined): boolean {\n return !customSign // default: skip when no cert and no custom sign hook\n }\n\n async signFile(options: WindowsSignOptions): Promise<boolean> {\n const signing = getSigntoolFamilyConfig(options.options)\n let hashes = signing?.signingHashAlgorithms\n // msi does not support dual-signing\n if (options.path.endsWith(\".msi\")) {\n hashes = [hashes != null && !hashes.includes(\"sha1\") ? \"sha256\" : \"sha1\"]\n } else if (options.path.endsWith(\".appx\")) {\n hashes = [\"sha256\"]\n } else if (hashes == null) {\n hashes = [\"sha1\", \"sha256\"]\n } else {\n hashes = Array.isArray(hashes) ? hashes : [hashes]\n }\n\n const name = this.packager.appInfo.productName\n const site = await this.packager.appInfo.computePackageUrl()\n\n const customSign = await resolveFunction(this.packager.appInfo.type, signing?.sign, \"sign\", await this.packager.getWorkspaceRoot())\n\n const cscInfo = await this.cscInfo.value\n\n if (cscInfo) {\n let logInfo: any = {\n file: log.filePath(options.path),\n }\n if (\"file\" in cscInfo) {\n logInfo = { ...logInfo, certificateFile: cscInfo.file }\n } else {\n logInfo = {\n ...logInfo,\n subject: cscInfo.subject,\n thumbprint: cscInfo.thumbprint,\n store: cscInfo.store,\n user: cscInfo.isLocalMachineStore ? \"local machine\" : \"current user\",\n }\n }\n log.info(logInfo, \"signing\")\n } else if (this.handleNullCscInfo(customSign)) {\n log.debug({ signHook: !!customSign, cscInfo }, \"no signing info identified, signing is skipped\")\n return false\n }\n\n const executor = customSign || ((config: CustomWindowsSignTaskConfiguration, packager: WinPackager) => this.doSign(config, packager))\n let isNest = false\n for (const hash of hashes) {\n const taskConfiguration: WindowsSignTaskConfiguration = { ...options, name, site, cscInfo, hash, isNest }\n await Promise.resolve(\n executor(\n {\n ...taskConfiguration,\n computeSignToolArgs: isWin => this.computeSignToolArgs(taskConfiguration, isWin),\n },\n this.packager\n )\n )\n isNest = true\n if (taskConfiguration.resultOutputPath != null) {\n await rename(taskConfiguration.resultOutputPath, options.path)\n }\n }\n\n return true\n }\n\n async getCertInfo(file: string, password: string): Promise<CertificateInfo> {\n const errorMessagePrefix = \"Cannot extract publisher name from code signing certificate. As workaround, set win.publisherName. Error: \"\n try {\n return await readCertInfo(file, password)\n } catch (e: any) {\n throw new InvalidConfigurationError(`${errorMessagePrefix}${e.message || e}`)\n }\n }\n\n // on windows be aware of http://stackoverflow.com/a/32640183/1910191\n computeSignToolArgs(options: WindowsSignTaskConfiguration, isWin: boolean, vm: VmManager = new VmManager()): Array<string> {\n return isWin ? this.computeWindowsSignArgs(options, vm) : this.computeOsslsigncodeArgs(options, vm)\n }\n\n protected isLegacyToolset(): boolean {\n const v = this.packager.config.toolsets?.winCodeSign\n return v == null || v === \"0.0.0\"\n }\n\n protected abstract computeWindowsSignArgs(options: WindowsSignTaskConfiguration, vm: VmManager): Array<string>\n protected abstract computeOsslsigncodeArgs(options: WindowsSignTaskConfiguration, vm: VmManager): Array<string>\n\n // allowX509: set to true by HsmSignManager to permit .crt/.cer (public chain only, key is in HSM).\n protected addCertificateArgs(args: Array<string>, options: WindowsSignTaskConfiguration, vm: VmManager, isWin: boolean, allowX509 = false): void {\n if (options.cscInfo == null) {\n throw new Error(\"No code signing certificate configured. Provide certificateFile, certificateSha1, or certificateSubjectName.\")\n }\n const certificateFile = (options.cscInfo as FileCodeSigningInfo).file\n\n if (certificateFile == null) {\n // Certificate from store (Windows only)\n if (!isWin) {\n throw new Error(\"certificateSha1/certificateSubjectName supported only on Windows\")\n }\n\n const cscInfo = options.cscInfo as CertificateFromStoreInfo\n args.push(\"/sha1\", cscInfo.thumbprint)\n args.push(\"/s\", cscInfo.store)\n if (cscInfo.isLocalMachineStore) {\n args.push(\"/sm\")\n }\n } else {\n const certExtension = path.extname(certificateFile).toLowerCase()\n\n if (certExtension === \".p12\" || certExtension === \".pfx\") {\n args.push(isWin ? \"/f\" : \"-pkcs12\", vm.toVmFile(certificateFile))\n } else if (isWin && allowX509 && (certExtension === \".crt\" || certExtension === \".cer\")) {\n args.push(\"/f\", vm.toVmFile(certificateFile))\n } else {\n throw new InvalidConfigurationError(`Please specify pkcs12 (.p12/.pfx) file, ${certificateFile} is not correct`)\n }\n }\n }\n\n protected addCommonSigningArgs(args: Array<string>, options: WindowsSignTaskConfiguration, vm: VmManager, isWin: boolean): void {\n if (options.name) {\n args.push(isWin ? \"/d\" : \"-n\", options.name)\n }\n\n if (options.site) {\n args.push(isWin ? \"/du\" : \"-i\", options.site)\n }\n\n if (options.isNest) {\n args.push(isWin ? \"/as\" : \"-nest\")\n }\n\n const password = (options.cscInfo as FileCodeSigningInfo)?.password\n if (password) {\n args.push(isWin ? \"/p\" : \"-pass\", password)\n }\n\n const signing = getSigntoolFamilyConfig(options.options)\n const additionalCert = signing?.additionalCertificateFile\n if (additionalCert) {\n args.push(isWin ? \"/ac\" : \"-ac\", vm.toVmFile(additionalCert))\n }\n }\n\n getOutputPath(inputPath: string, hash: string) {\n const extension = path.extname(inputPath)\n return path.join(path.dirname(inputPath), `${path.basename(inputPath, extension)}-signed-${hash}${extension}`)\n }\n\n async getCertificateFromStoreInfo(options: WindowsConfiguration, vm: VmManager): Promise<CertificateFromStoreInfo> {\n const signing = getSigntoolFamilyConfig(options) as WindowsSigntoolSigningConfig | WindowsHsmSigningConfig | null\n const certificateSubjectName = signing?.certificateSubjectName\n const certificateSha1 = signing?.certificateSha1?.toUpperCase()\n\n const ps = await vm.powershellCommand.value\n const rawResult = await vm.exec(ps, [\n \"-NoProfile\",\n \"-NonInteractive\",\n \"-Command\",\n \"Get-ChildItem -Recurse Cert: -CodeSigningCert | Select-Object -Property Subject,PSParentPath,Thumbprint | ConvertTo-Json -Compress\",\n ])\n const certList = rawResult.length === 0 ? [] : asArray<CertInfo>(JSON.parse(rawResult))\n for (const certInfo of certList) {\n if (\n (certificateSubjectName != null && !certInfo.Subject.includes(certificateSubjectName)) ||\n (certificateSha1 != null && certInfo.Thumbprint.toUpperCase() !== certificateSha1)\n ) {\n continue\n }\n\n const parentPath = certInfo.PSParentPath\n const store = parentPath.substring(parentPath.lastIndexOf(\"\\\\\") + 1)\n log.debug({ store, PSParentPath: parentPath }, \"auto-detect certificate store\")\n // https://github.com/electron-userland/electron-builder/issues/1717\n const isLocalMachineStore = parentPath.includes(\"Certificate::LocalMachine\")\n log.debug(null, \"auto-detect using of LocalMachine store\")\n return {\n thumbprint: certInfo.Thumbprint,\n subject: certInfo.Subject,\n store,\n isLocalMachineStore,\n }\n }\n\n throw new Error(`Cannot find certificate ${certificateSubjectName || certificateSha1}, all certs: ${rawResult}`)\n }\n\n async getToolPath(isWin = process.platform === \"win32\"): Promise<ToolInfo> {\n return getSignToolPath(this.packager.config.toolsets?.winCodeSign, isWin, this.packager.buildResourcesDir)\n }\n\n async doSign(configuration: CustomWindowsSignTaskConfiguration, packager: WinPackager) {\n // https://github.com/electron-userland/electron-builder/pull/1944\n const timeout = parseInt(process.env.SIGNTOOL_TIMEOUT as any, 10) || 10 * 60 * 1000\n let args: Array<string>\n let vm: VmManager\n // cscInfo can be null (e.g. PKCS#11 with no cert file); guard before using `in`.\n // CertificateFromStoreInfo (no `file` property) requires a Windows VM for cert-store lookup.\n const cscInfo = configuration.cscInfo\n const useVmIfNotOnWin = configuration.path.endsWith(\".appx\") || (cscInfo != null && !(\"file\" in cscInfo))\n const isWin = process.platform === \"win32\" || useVmIfNotOnWin\n const toolInfo = await getSignToolPath(this.packager.config.toolsets?.winCodeSign, isWin, this.packager.buildResourcesDir)\n const tool = toolInfo.path\n if (useVmIfNotOnWin) {\n vm = await packager.vm.value\n args = this.computeSignToolArgs(configuration, isWin, vm)\n } else {\n vm = new VmManager()\n args = configuration.computeSignToolArgs(isWin)\n }\n\n await retry(() => vm.exec(tool, args, { timeout, env: { ...process.env, ...(toolInfo.env || {}) } }), {\n retries: 2,\n interval: 15000,\n backoff: 10000,\n shouldRetry: (e: any) => {\n if (\n e.message.includes(\"The file is being used by another process\") ||\n e.message.includes(\"The specified timestamp server either could not be reached\") ||\n e.message.includes(\"No certificates were found that met all the given criteria.\")\n ) {\n log.warn(`Attempt to code sign failed, another attempt will be made in 15 seconds: ${e.message}`)\n return true\n }\n return false\n },\n })\n }\n}\n\nexport class SigntoolSignManager extends SigntoolBaseSignManager {\n protected computeWindowsSignArgs(options: WindowsSignTaskConfiguration, vm: VmManager): Array<string> {\n const signing = getSigntoolFamilyConfig(options.options)\n\n const inputFile = vm.toVmFile(options.path)\n const args = [\"sign\"]\n\n // Timestamping\n if (process.env.ELECTRON_BUILDER_OFFLINE !== \"true\") {\n const isRfc3161 = options.isNest || options.hash === \"sha256\"\n args.push(isRfc3161 ? \"/tr\" : \"/t\")\n const timestampUrl = isRfc3161 ? signing?.rfc3161TimeStampServer || \"http://timestamp.digicert.com\" : signing?.timeStampServer || \"http://timestamp.digicert.com\"\n args.push(timestampUrl)\n }\n\n // Certificate\n this.addCertificateArgs(args, options, vm, true)\n\n // Hash algorithm\n if (this.isLegacyToolset()) {\n // Legacy v0.0.0: Only add /fd for non-SHA1 (original behavior)\n if (options.hash !== \"sha1\") {\n args.push(\"/fd\", options.hash)\n if (process.env.ELECTRON_BUILDER_OFFLINE !== \"true\") {\n args.push(\"/td\", \"sha256\")\n }\n }\n } else {\n // Modern: Always add /fd (required by new Windows Kits)\n args.push(\"/fd\", options.hash.toLowerCase())\n // Only add /td for RFC3161 timestamps (incompatible with /t)\n if (process.env.ELECTRON_BUILDER_OFFLINE !== \"true\" && (options.isNest || options.hash === \"sha256\")) {\n args.push(\"/td\", \"sha256\")\n }\n }\n\n // Optional parameters\n this.addCommonSigningArgs(args, options, vm, true)\n\n // Windows-specific\n args.push(\"/debug\")\n args.push(inputFile) // Must be last\n\n return args\n }\n\n protected computeOsslsigncodeArgs(options: WindowsSignTaskConfiguration, vm: VmManager): Array<string> {\n const signing = getSigntoolFamilyConfig(options.options)\n\n const inputFile = vm.toVmFile(options.path)\n const outputPath = this.getOutputPath(inputFile, options.hash)\n options.resultOutputPath = outputPath\n\n const args = [\"sign\", \"-in\", inputFile, \"-out\", outputPath]\n\n // Timestamping\n if (process.env.ELECTRON_BUILDER_OFFLINE !== \"true\") {\n const timestampUrl = signing?.timeStampServer || \"http://timestamp.digicert.com\"\n args.push(\"-t\", timestampUrl)\n }\n\n // Certificate file\n this.addCertificateArgs(args, options, vm, false)\n\n // Hash algorithm\n args.push(\"-h\", options.hash.toLowerCase())\n\n // Optional parameters (name, site, nest, password, additionalCert)\n this.addCommonSigningArgs(args, options, vm, false)\n\n // Proxy support\n const httpsProxy = process.env.HTTPS_PROXY\n if (httpsProxy?.length) {\n args.push(\"-p\", httpsProxy)\n }\n\n return args\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"windowsCodeSign.d.ts","sourceRoot":"","sources":["../../../src/codeSign/win/windowsCodeSign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CACvC;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAWtG"}
1
+ {"version":3,"file":"windowsCodeSign.d.ts","sourceRoot":"","sources":["../../../src/codeSign/win/windowsCodeSign.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACtG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;CACvC;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAatG"}
@@ -1,11 +1,16 @@
1
1
  import { log, retry } from "builder-util";
2
+ import { resolveWindowsSigningConfiguration } from "../../options/winOptions.js";
2
3
  export async function signWindows(options, packager) {
3
- if (options.options.azureSignOptions) {
4
- if (options.options.signtoolOptions) {
5
- log.warn(null, "ignoring signtool options, using Azure Trusted Signing; please only configure one");
6
- }
4
+ const signing = resolveWindowsSigningConfiguration(options.options);
5
+ if (signing?.type === "azure") {
7
6
  log.info({ path: log.filePath(options.path) }, "signing with Azure Trusted Signing");
8
7
  }
8
+ else if (signing?.type === "hsm") {
9
+ log.info({ path: log.filePath(options.path) }, "signing with signtool.exe (HSM)");
10
+ }
11
+ else if (signing?.type === "pkcs11") {
12
+ log.info({ path: log.filePath(options.path) }, "signing with osslsigncode (PKCS#11)");
13
+ }
9
14
  else {
10
15
  log.info({ path: log.filePath(options.path) }, "signing with signtool.exe");
11
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"windowsCodeSign.js","sourceRoot":"","sources":["../../../src/codeSign/win/windowsCodeSign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AASzC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B,EAAE,QAAqB;IAClF,IAAI,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACrC,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,mFAAmF,CAAC,CAAA;QACrG,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,oCAAoC,CAAC,CAAA;IACtF,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAA;IAC1D,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,SAAS,aAAa,CAAC,MAA8B;IACnD,OAAO,KAAK,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,CAAC,CAAM,EAAE,EAAE;YACtB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;YACzB;YACE,oEAAoE;YACpE,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC;gBAC/C,oEAAoE;gBACpE,OAAO,EAAE,QAAQ,CAAC,gCAAgC,CAAC,EACnD,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,sDAAsD,CAAC,CAAA;gBACpF,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { log, retry } from \"builder-util\"\nimport { WindowsConfiguration } from \"../../options/winOptions.js\"\nimport { WinPackager } from \"../../winPackager.js\"\n\nexport interface WindowsSignOptions {\n readonly path: string\n readonly options: WindowsConfiguration\n}\n\nexport async function signWindows(options: WindowsSignOptions, packager: WinPackager): Promise<boolean> {\n if (options.options.azureSignOptions) {\n if (options.options.signtoolOptions) {\n log.warn(null, \"ignoring signtool options, using Azure Trusted Signing; please only configure one\")\n }\n log.info({ path: log.filePath(options.path) }, \"signing with Azure Trusted Signing\")\n } else {\n log.info({ path: log.filePath(options.path) }, \"signing with signtool.exe\")\n }\n const packageManager = await packager.signingManager.value\n return signWithRetry(async () => packageManager.signFile(options))\n}\n\nfunction signWithRetry(signer: () => Promise<boolean>): Promise<boolean> {\n return retry(signer, {\n retries: 3,\n interval: 1000,\n backoff: 1000,\n shouldRetry: (e: any) => {\n const message = e.message\n if (\n // https://github.com/electron-userland/electron-builder/issues/1414\n message?.includes(\"Couldn't resolve host name\") ||\n // https://github.com/electron-userland/electron-builder/issues/8615\n message?.includes(\"being used by another process.\")\n ) {\n log.warn({ error: message }, \"attempt to sign failed, another attempt will be made\")\n return true\n }\n return false\n },\n })\n}\n"]}
1
+ {"version":3,"file":"windowsCodeSign.js","sourceRoot":"","sources":["../../../src/codeSign/win/windowsCodeSign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,kCAAkC,EAAwB,MAAM,6BAA6B,CAAA;AAQtG,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B,EAAE,QAAqB;IAClF,MAAM,OAAO,GAAG,kCAAkC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACnE,IAAI,OAAO,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,oCAAoC,CAAC,CAAA;IACtF,CAAC;SAAM,IAAI,OAAO,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAA;IACnF,CAAC;SAAM,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,qCAAqC,CAAC,CAAA;IACvF,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,2BAA2B,CAAC,CAAA;IAC7E,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAA;IAC1D,OAAO,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;AACpE,CAAC;AAED,SAAS,aAAa,CAAC,MAA8B;IACnD,OAAO,KAAK,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,CAAC,CAAM,EAAE,EAAE;YACtB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAA;YACzB;YACE,oEAAoE;YACpE,OAAO,EAAE,QAAQ,CAAC,4BAA4B,CAAC;gBAC/C,oEAAoE;gBACpE,OAAO,EAAE,QAAQ,CAAC,gCAAgC,CAAC,EACnD,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,sDAAsD,CAAC,CAAA;gBACpF,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC;KACF,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import { log, retry } from \"builder-util\"\nimport { resolveWindowsSigningConfiguration, WindowsConfiguration } from \"../../options/winOptions.js\"\nimport { WinPackager } from \"../../winPackager.js\"\n\nexport interface WindowsSignOptions {\n readonly path: string\n readonly options: WindowsConfiguration\n}\n\nexport async function signWindows(options: WindowsSignOptions, packager: WinPackager): Promise<boolean> {\n const signing = resolveWindowsSigningConfiguration(options.options)\n if (signing?.type === \"azure\") {\n log.info({ path: log.filePath(options.path) }, \"signing with Azure Trusted Signing\")\n } else if (signing?.type === \"hsm\") {\n log.info({ path: log.filePath(options.path) }, \"signing with signtool.exe (HSM)\")\n } else if (signing?.type === \"pkcs11\") {\n log.info({ path: log.filePath(options.path) }, \"signing with osslsigncode (PKCS#11)\")\n } else {\n log.info({ path: log.filePath(options.path) }, \"signing with signtool.exe\")\n }\n const packageManager = await packager.signingManager.value\n return signWithRetry(async () => packageManager.signFile(options))\n}\n\nfunction signWithRetry(signer: () => Promise<boolean>): Promise<boolean> {\n return retry(signer, {\n retries: 3,\n interval: 1000,\n backoff: 1000,\n shouldRetry: (e: any) => {\n const message = e.message\n if (\n // https://github.com/electron-userland/electron-builder/issues/1414\n message?.includes(\"Couldn't resolve host name\") ||\n // https://github.com/electron-userland/electron-builder/issues/8615\n message?.includes(\"being used by another process.\")\n ) {\n log.warn({ error: message }, \"attempt to sign failed, another attempt will be made\")\n return true\n }\n return false\n },\n })\n}\n"]}
@@ -1,18 +1,24 @@
1
1
  import { MemoLazy } from "builder-util-runtime";
2
2
  import { Lazy } from "lazy-val";
3
+ import { Target } from "../../core.js";
3
4
  import { WindowsConfiguration } from "../../options/winOptions.js";
4
5
  import { WinPackager } from "../../winPackager.js";
5
- import { SignManager } from "../signManager.js";
6
+ import { SignManager } from "./signManager.js";
6
7
  import { WindowsSignOptions } from "./windowsCodeSign.js";
7
8
  import { CertificateFromStoreInfo, FileCodeSigningInfo } from "./windowsSignToolManager.js";
8
9
  export declare class WindowsSignAzureManager implements SignManager {
9
10
  private readonly packager;
10
- private readonly platformOptions;
11
+ private readonly signing;
12
+ private readonly vm;
11
13
  readonly computedPublisherName: Lazy<string[] | null>;
14
+ private get publisherName();
12
15
  constructor(packager: WinPackager);
16
+ private isLegacyMode;
13
17
  initialize(): Promise<void>;
14
- computePublisherName(): Promise<string>;
18
+ computePublisherName(_target: Target, publisherName: string | null): Promise<string>;
15
19
  readonly cscInfo: MemoLazy<WindowsConfiguration, FileCodeSigningInfo | CertificateFromStoreInfo | null>;
16
20
  signFile(options: WindowsSignOptions): Promise<boolean>;
21
+ private signFileLegacy;
22
+ private signFileWithDlib;
17
23
  }
18
24
  //# sourceMappingURL=windowsSignAzureManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"windowsSignAzureManager.d.ts","sourceRoot":"","sources":["../../../src/codeSign/win/windowsSignAzureManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAoC,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACpG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAE3F,qBAAa,uBAAwB,YAAW,WAAW;IAgB7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAfrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IAEtD,QAAQ,CAAC,qBAAqB,wBAW5B;gBAE2B,QAAQ,EAAE,WAAW;IAI5C,UAAU;IAkBhB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAGvC,QAAQ,CAAC,OAAO,wFAGf;IAEK,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;CAmC9D"}
1
+ {"version":3,"file":"windowsSignAzureManager.d.ts","sourceRoot":"","sources":["../../../src/codeSign/win/windowsSignAzureManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAiE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAIjI,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAI3F,qBAAa,uBAAwB,YAAW,WAAW;IAkB7C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAjBrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAGnD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAsJ;IAEzK,QAAQ,CAAC,qBAAqB,wBAE5B;IAEF,OAAO,KAAK,aAAa,GAMxB;gBAE4B,QAAQ,EAAE,WAAW;IAQlD,OAAO,CAAC,YAAY;IASd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBjC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAIpF,QAAQ,CAAC,OAAO,wFAGf;IAEK,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;YAI/C,cAAc;YA0Cd,gBAAgB;CAqE/B"}