app-builder-lib 27.0.0-alpha.2 → 27.0.0-alpha.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.
- package/dist/Framework.d.ts +2 -0
- package/dist/Framework.d.ts.map +1 -1
- package/dist/Framework.js.map +1 -1
- package/dist/asar/asarFileChecker.d.ts +4 -2
- package/dist/asar/asarFileChecker.d.ts.map +1 -1
- package/dist/asar/asarFileChecker.js +2 -3
- package/dist/asar/asarFileChecker.js.map +1 -1
- package/dist/codeSign/certInfo.d.ts +14 -0
- package/dist/codeSign/certInfo.d.ts.map +1 -1
- package/dist/codeSign/certInfo.js +49 -0
- package/dist/codeSign/certInfo.js.map +1 -1
- package/dist/codeSign/mac/macCodeSign.d.ts +3 -3
- package/dist/codeSign/mac/macCodeSign.d.ts.map +1 -1
- package/dist/codeSign/mac/macCodeSign.js +40 -14
- package/dist/codeSign/mac/macCodeSign.js.map +1 -1
- package/dist/codeSign/win/hsmSignManager.d.ts +10 -0
- package/dist/codeSign/win/hsmSignManager.d.ts.map +1 -0
- package/dist/codeSign/win/hsmSignManager.js +50 -0
- package/dist/codeSign/win/hsmSignManager.js.map +1 -0
- package/dist/codeSign/win/pkcs11SignManager.d.ts +14 -0
- package/dist/codeSign/win/pkcs11SignManager.d.ts.map +1 -0
- package/dist/codeSign/win/pkcs11SignManager.js +82 -0
- package/dist/codeSign/win/pkcs11SignManager.js.map +1 -0
- package/dist/codeSign/{signManager.d.ts → win/signManager.d.ts} +8 -6
- package/dist/codeSign/win/signManager.d.ts.map +1 -0
- package/dist/codeSign/win/signManager.js +19 -0
- package/dist/codeSign/win/signManager.js.map +1 -0
- package/dist/codeSign/win/signtoolBaseSignManager.d.ts +71 -0
- package/dist/codeSign/win/signtoolBaseSignManager.d.ts.map +1 -0
- package/dist/codeSign/win/signtoolBaseSignManager.js +414 -0
- package/dist/codeSign/win/signtoolBaseSignManager.js.map +1 -0
- package/dist/codeSign/win/windowsCodeSign.d.ts.map +1 -1
- package/dist/codeSign/win/windowsCodeSign.js +9 -4
- package/dist/codeSign/win/windowsCodeSign.js.map +1 -1
- package/dist/codeSign/win/windowsSignAzureManager.d.ts +9 -3
- package/dist/codeSign/win/windowsSignAzureManager.d.ts.map +1 -1
- package/dist/codeSign/win/windowsSignAzureManager.js +130 -36
- package/dist/codeSign/win/windowsSignAzureManager.js.map +1 -1
- package/dist/codeSign/win/windowsSignToolManager.d.ts +1 -58
- package/dist/codeSign/win/windowsSignToolManager.d.ts.map +1 -1
- package/dist/codeSign/win/windowsSignToolManager.js +3 -363
- package/dist/codeSign/win/windowsSignToolManager.js.map +1 -1
- package/dist/configuration.d.ts +22 -123
- package/dist/configuration.d.ts.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/electron/ElectronFramework.d.ts +0 -2
- package/dist/electron/ElectronFramework.d.ts.map +1 -1
- package/dist/electron/ElectronFramework.js +15 -27
- package/dist/electron/ElectronFramework.js.map +1 -1
- package/dist/electron/injectFFMPEG.js +2 -2
- package/dist/electron/injectFFMPEG.js.map +1 -1
- package/dist/electron/mac/electronMac.js +10 -8
- package/dist/electron/mac/electronMac.js.map +1 -1
- package/dist/electron/win/electronWin.js +1 -2
- package/dist/electron/win/electronWin.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/indexInternal.d.ts +3 -3
- package/dist/indexInternal.d.ts.map +1 -1
- package/dist/indexInternal.js +2 -2
- package/dist/indexInternal.js.map +1 -1
- package/dist/macPackager.d.ts +19 -10
- package/dist/macPackager.d.ts.map +1 -1
- package/dist/macPackager.js +149 -121
- package/dist/macPackager.js.map +1 -1
- package/dist/node-module-collector/moduleManager.d.ts +9 -2
- package/dist/node-module-collector/moduleManager.d.ts.map +1 -1
- package/dist/node-module-collector/moduleManager.js +4 -2
- package/dist/node-module-collector/moduleManager.js.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.d.ts +13 -23
- package/dist/node-module-collector/nodeModulesCollector.d.ts.map +1 -1
- package/dist/node-module-collector/nodeModulesCollector.js +52 -122
- package/dist/node-module-collector/nodeModulesCollector.js.map +1 -1
- package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts +48 -1
- package/dist/node-module-collector/pnpmNodeModulesCollector.d.ts.map +1 -1
- package/dist/node-module-collector/pnpmNodeModulesCollector.js +216 -17
- package/dist/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
- package/dist/node-module-collector/types.d.ts +2 -0
- package/dist/node-module-collector/types.d.ts.map +1 -1
- package/dist/node-module-collector/types.js.map +1 -1
- package/dist/options/FuseOptionsV1.d.ts +137 -0
- package/dist/options/FuseOptionsV1.d.ts.map +1 -0
- package/dist/options/FuseOptionsV1.js +2 -0
- package/dist/options/FuseOptionsV1.js.map +1 -0
- package/dist/options/PlatformSpecificBuildOptions.d.ts +1 -1
- package/dist/options/PlatformSpecificBuildOptions.d.ts.map +1 -1
- package/dist/options/PlatformSpecificBuildOptions.js.map +1 -1
- package/dist/options/linuxOptions.d.ts +0 -10
- package/dist/options/linuxOptions.d.ts.map +1 -1
- package/dist/options/linuxOptions.js.map +1 -1
- package/dist/options/macOptions.d.ts +93 -126
- package/dist/options/macOptions.d.ts.map +1 -1
- package/dist/options/macOptions.js.map +1 -1
- package/dist/options/winOptions.d.ts +137 -63
- package/dist/options/winOptions.d.ts.map +1 -1
- package/dist/options/winOptions.js +12 -1
- package/dist/options/winOptions.js.map +1 -1
- package/dist/packager.js +1 -1
- package/dist/packager.js.map +1 -1
- package/dist/platformPackager.d.ts +5 -2
- package/dist/platformPackager.d.ts.map +1 -1
- package/dist/platformPackager.js +16 -13
- package/dist/platformPackager.js.map +1 -1
- package/dist/targets/ArchiveTarget.js +2 -2
- package/dist/targets/ArchiveTarget.js.map +1 -1
- package/dist/targets/archive.d.ts +10 -2
- package/dist/targets/archive.d.ts.map +1 -1
- package/dist/targets/archive.js +25 -6
- package/dist/targets/archive.js.map +1 -1
- package/dist/targets/linux/FlatpakTarget.d.ts.map +1 -1
- package/dist/targets/linux/FlatpakTarget.js +4 -1
- package/dist/targets/linux/FlatpakTarget.js.map +1 -1
- package/dist/targets/linux/FpmTarget.d.ts +6 -0
- package/dist/targets/linux/FpmTarget.d.ts.map +1 -1
- package/dist/targets/linux/FpmTarget.js +25 -3
- package/dist/targets/linux/FpmTarget.js.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.d.ts +14 -0
- package/dist/targets/linux/LinuxTargetHelper.d.ts.map +1 -1
- package/dist/targets/linux/LinuxTargetHelper.js +38 -59
- package/dist/targets/linux/LinuxTargetHelper.js.map +1 -1
- package/dist/targets/linux/appimage/AppImageTarget.d.ts +1 -0
- package/dist/targets/linux/appimage/AppImageTarget.d.ts.map +1 -1
- package/dist/targets/linux/appimage/AppImageTarget.js +8 -9
- package/dist/targets/linux/appimage/AppImageTarget.js.map +1 -1
- package/dist/targets/linux/appimage/appImageUtil.d.ts +4 -0
- package/dist/targets/linux/appimage/appImageUtil.d.ts.map +1 -1
- package/dist/targets/linux/appimage/appImageUtil.js +11 -4
- package/dist/targets/linux/appimage/appImageUtil.js.map +1 -1
- package/dist/targets/linux/appimage/appLauncher.d.ts.map +1 -1
- package/dist/targets/linux/appimage/appLauncher.js +5 -11
- package/dist/targets/linux/appimage/appLauncher.js.map +1 -1
- package/dist/targets/linux/launcherScript.d.ts +32 -0
- package/dist/targets/linux/launcherScript.d.ts.map +1 -0
- package/dist/targets/linux/launcherScript.js +24 -0
- package/dist/targets/linux/launcherScript.js.map +1 -0
- package/dist/targets/linux/snap/core24.d.ts +2 -0
- package/dist/targets/linux/snap/core24.d.ts.map +1 -1
- package/dist/targets/linux/snap/core24.js +48 -8
- package/dist/targets/linux/snap/core24.js.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.d.ts +2 -2
- package/dist/targets/linux/snap/coreLegacy.d.ts.map +1 -1
- package/dist/targets/linux/snap/coreLegacy.js +9 -10
- package/dist/targets/linux/snap/coreLegacy.js.map +1 -1
- package/dist/targets/linux/snap/snapCommand.d.ts +13 -0
- package/dist/targets/linux/snap/snapCommand.d.ts.map +1 -0
- package/dist/targets/linux/snap/snapCommand.js +21 -0
- package/dist/targets/linux/snap/snapCommand.js.map +1 -0
- package/dist/targets/mac/MacTargetHelper.d.ts +12 -12
- package/dist/targets/mac/MacTargetHelper.d.ts.map +1 -1
- package/dist/targets/mac/MacTargetHelper.js +72 -67
- package/dist/targets/mac/MacTargetHelper.js.map +1 -1
- package/dist/targets/mac/pkg.d.ts.map +1 -1
- package/dist/targets/mac/pkg.js +4 -4
- package/dist/targets/mac/pkg.js.map +1 -1
- package/dist/targets/win/AppxTarget.d.ts.map +1 -1
- package/dist/targets/win/AppxTarget.js +9 -9
- package/dist/targets/win/AppxTarget.js.map +1 -1
- package/dist/targets/win/MsiTarget.d.ts.map +1 -1
- package/dist/targets/win/MsiTarget.js +8 -11
- package/dist/targets/win/MsiTarget.js.map +1 -1
- package/dist/targets/win/nsis/NsisTarget.js +5 -5
- package/dist/targets/win/nsis/NsisTarget.js.map +1 -1
- package/dist/targets/win/nsis/nsisScriptGenerator.js +2 -2
- package/dist/targets/win/nsis/nsisScriptGenerator.js.map +1 -1
- package/dist/targets/win/nsis/nsisUtil.d.ts.map +1 -1
- package/dist/targets/win/nsis/nsisUtil.js +2 -2
- package/dist/targets/win/nsis/nsisUtil.js.map +1 -1
- package/dist/toolsets/custom.d.ts +1 -0
- package/dist/toolsets/custom.d.ts.map +1 -1
- package/dist/toolsets/custom.js +19 -8
- package/dist/toolsets/custom.js.map +1 -1
- package/dist/toolsets/icons.d.ts.map +1 -1
- package/dist/toolsets/icons.js +11 -3
- package/dist/toolsets/icons.js.map +1 -1
- package/dist/toolsets/winCodeSign.d.ts +36 -0
- package/dist/toolsets/winCodeSign.d.ts.map +1 -1
- package/dist/toolsets/winCodeSign.js +84 -30
- package/dist/toolsets/winCodeSign.js.map +1 -1
- package/dist/toolsets/wine.d.ts.map +1 -1
- package/dist/toolsets/wine.js +20 -12
- package/dist/toolsets/wine.js.map +1 -1
- package/dist/util/appFileCopier.d.ts.map +1 -1
- package/dist/util/appFileCopier.js +9 -4
- package/dist/util/appFileCopier.js.map +1 -1
- package/dist/util/archCompatibility.d.ts +42 -0
- package/dist/util/archCompatibility.d.ts.map +1 -0
- package/dist/util/archCompatibility.js +202 -0
- package/dist/util/archCompatibility.js.map +1 -0
- package/dist/util/config/schemaValidator.d.ts.map +1 -1
- package/dist/util/config/schemaValidator.js +1 -1
- package/dist/util/config/schemaValidator.js.map +1 -1
- package/dist/util/electronGet.d.ts +8 -25
- package/dist/util/electronGet.d.ts.map +1 -1
- package/dist/util/electronGet.js +107 -87
- package/dist/util/electronGet.js.map +1 -1
- package/dist/util/flags.d.ts +0 -3
- package/dist/util/flags.d.ts.map +1 -1
- package/dist/util/flags.js +0 -9
- package/dist/util/flags.js.map +1 -1
- package/dist/util/installOrRebuild.d.ts +38 -0
- package/dist/util/installOrRebuild.d.ts.map +1 -0
- package/dist/util/{yarn.js → installOrRebuild.js} +65 -14
- package/dist/util/installOrRebuild.js.map +1 -0
- package/dist/util/langs.d.ts.map +1 -1
- package/dist/util/langs.js +1 -0
- package/dist/util/langs.js.map +1 -1
- package/dist/util/license.d.ts.map +1 -1
- package/dist/util/license.js +4 -1
- package/dist/util/license.js.map +1 -1
- package/dist/util/mac/macosIconComposer.d.ts +2 -1
- package/dist/util/mac/macosIconComposer.d.ts.map +1 -1
- package/dist/util/mac/macosIconComposer.js +40 -58
- package/dist/util/mac/macosIconComposer.js.map +1 -1
- package/dist/util/streamSpawnToFile.d.ts +47 -0
- package/dist/util/streamSpawnToFile.d.ts.map +1 -0
- package/dist/util/streamSpawnToFile.js +110 -0
- package/dist/util/streamSpawnToFile.js.map +1 -0
- package/dist/util/toolsetLock.d.ts +2 -0
- package/dist/util/toolsetLock.d.ts.map +1 -1
- package/dist/util/toolsetLock.js +31 -5
- package/dist/util/toolsetLock.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/vm/ParallelsVm.d.ts.map +1 -1
- package/dist/vm/ParallelsVm.js +13 -2
- package/dist/vm/ParallelsVm.js.map +1 -1
- package/dist/vm/vm.d.ts.map +1 -1
- package/dist/vm/vm.js +4 -1
- package/dist/vm/vm.js.map +1 -1
- package/dist/winPackager.d.ts +1 -2
- package/dist/winPackager.d.ts.map +1 -1
- package/dist/winPackager.js +17 -22
- package/dist/winPackager.js.map +1 -1
- package/package.json +15 -14
- package/scheme.json +486 -439
- package/templates/appx/appxmanifest.xml +1 -2
- package/templates/nsis/assistedMessages.yml +17 -0
- package/templates/nsis/messages.yml +5 -0
- package/dist/codeSign/signManager.d.ts.map +0 -1
- package/dist/codeSign/signManager.js +0 -2
- package/dist/codeSign/signManager.js.map +0 -1
- package/dist/util/yarn.d.ts +0 -23
- package/dist/util/yarn.d.ts.map +0 -1
- package/dist/util/yarn.js.map +0 -1
|
@@ -1,25 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { MemoLazy } from "builder-util-runtime";
|
|
1
|
+
import { Arch, isEmptyOrSpaces, log, sanitizeDirPath } from "builder-util";
|
|
2
|
+
import { asArray, MemoLazy } from "builder-util-runtime";
|
|
3
|
+
import _fsExtra from "fs-extra";
|
|
3
4
|
import { Lazy } from "lazy-val";
|
|
5
|
+
import * as path from "path";
|
|
6
|
+
import { resolveWindowsSigningConfiguration } from "../../options/winOptions.js";
|
|
7
|
+
import { getAtsBundleDir, getDotnetRuntimeDir, getWindowsKitsBundle } from "../../toolsets/winCodeSign.js";
|
|
8
|
+
import { VmManager } from "../../vm/vm.js";
|
|
9
|
+
import { WineVmManager } from "../../vm/WineVm.js";
|
|
10
|
+
import semver from "semver";
|
|
11
|
+
const minimumWinCodeSignVersionForDlib = "1.3.0";
|
|
4
12
|
export class WindowsSignAzureManager {
|
|
13
|
+
get publisherName() {
|
|
14
|
+
const result = this.signing.publisherName;
|
|
15
|
+
if (isEmptyOrSpaces(result)) {
|
|
16
|
+
throw new Error("Azure Trusted Signing requires 'publisherName' in win.sign config (no local certificate to derive it from)");
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
5
20
|
constructor(packager) {
|
|
6
21
|
this.packager = packager;
|
|
22
|
+
// signtool.exe is a Windows PE binary; use Wine on non-Windows (same pattern as MsiTarget).
|
|
23
|
+
this.vm = process.platform === "win32" ? new VmManager() : new WineVmManager(this.packager.config.toolsets?.wine, this.packager.buildResourcesDir);
|
|
7
24
|
this.computedPublisherName = new Lazy(() => {
|
|
8
|
-
|
|
9
|
-
if (publisherName === null) {
|
|
10
|
-
return Promise.resolve(null);
|
|
11
|
-
}
|
|
12
|
-
else if (publisherName != null) {
|
|
13
|
-
return Promise.resolve(asArray(publisherName));
|
|
14
|
-
}
|
|
15
|
-
// TODO: Is there another way to automatically pull Publisher Name from AzureTrusted service?
|
|
16
|
-
// For now return null.
|
|
17
|
-
return Promise.resolve(null);
|
|
25
|
+
return Promise.resolve(asArray(this.publisherName));
|
|
18
26
|
});
|
|
19
27
|
this.cscInfo = new MemoLazy(() => this.packager.platformOptions, _selected => Promise.resolve(null));
|
|
20
|
-
|
|
28
|
+
const signing = resolveWindowsSigningConfiguration(packager.platformOptions);
|
|
29
|
+
if (signing?.type !== "azure") {
|
|
30
|
+
throw new Error(`WindowsSignAzureManager requires signing.type = "azure", got: ${signing?.type}`);
|
|
31
|
+
}
|
|
32
|
+
this.signing = signing;
|
|
33
|
+
}
|
|
34
|
+
isLegacyMode() {
|
|
35
|
+
const { winCodeSign: wcs = null } = this.packager.config.toolsets ?? {};
|
|
36
|
+
if (typeof wcs === "string") {
|
|
37
|
+
return semver.lt(wcs, minimumWinCodeSignVersionForDlib);
|
|
38
|
+
}
|
|
39
|
+
// null = built-in toolset not configured → legacy; ToolsetCustom object = user-managed → not legacy
|
|
40
|
+
return wcs == null;
|
|
21
41
|
}
|
|
22
42
|
async initialize() {
|
|
43
|
+
if (!this.isLegacyMode()) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const { winCodeSign: wcs = null } = this.packager.config.toolsets ?? {};
|
|
47
|
+
const reason = typeof wcs === "string" ? `toolsets.winCodeSign "${wcs}" is below the minimum "${minimumWinCodeSignVersionForDlib}"` : `toolsets.winCodeSign is not set`;
|
|
48
|
+
log.info({ reason, guidance: `set toolsets.winCodeSign to "${minimumWinCodeSignVersionForDlib}" to use the faster signtool /dlib integration` }, `Azure Trusted Signing: falling back to legacy PowerShell (Invoke-TrustedSigning)`);
|
|
23
49
|
const vm = await this.packager.vm.value;
|
|
24
50
|
const ps = await vm.powershellCommand.value;
|
|
25
51
|
log.info(null, "installing required module (TrustedSigning) with scope CurrentUser");
|
|
@@ -27,41 +53,109 @@ export class WindowsSignAzureManager {
|
|
|
27
53
|
await vm.exec(ps, ["-NoProfile", "-NonInteractive", "-Command", "Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Scope CurrentUser"]);
|
|
28
54
|
}
|
|
29
55
|
catch (error) {
|
|
30
|
-
|
|
31
|
-
// Logging to debug just in case users run into this. If NuGet isn't present, Install-Module -Name TrustedSigning will fail, so we'll get the logs at that point
|
|
32
|
-
log.debug({ message: error.message || error.stack }, "unable to install PackageProvider Nuget. Might be a false alarm though as some systems already have it installed");
|
|
56
|
+
log.debug({ message: error.message || error.stack }, "unable to install PackageProvider NuGet — may already be present");
|
|
33
57
|
}
|
|
34
58
|
await vm.exec(ps, ["-NoProfile", "-NonInteractive", "-Command", "Install-Module -Name TrustedSigning -MinimumVersion 0.5.0 -Force -Repository PSGallery -Scope CurrentUser"]);
|
|
35
|
-
// If signing has been misconfigured it, the error from the TrustedSigning module should be descriptive enough to help them fix their configuration.
|
|
36
|
-
// Options: https://learn.microsoft.com/en-us/dotnet/api/azure.identity.environmentcredential?view=azure-dotnet#definition
|
|
37
59
|
}
|
|
38
|
-
computePublisherName() {
|
|
39
|
-
return Promise.resolve(this.
|
|
60
|
+
computePublisherName(_target, publisherName) {
|
|
61
|
+
return Promise.resolve(this.publisherName ?? publisherName);
|
|
40
62
|
}
|
|
41
|
-
// prerequisite: requires `initializeProviderModules` to already have been executed
|
|
42
63
|
async signFile(options) {
|
|
64
|
+
return this.isLegacyMode() ? this.signFileLegacy(options) : this.signFileWithDlib(options);
|
|
65
|
+
}
|
|
66
|
+
async signFileLegacy(options) {
|
|
67
|
+
const { signing } = this;
|
|
43
68
|
const vm = await this.packager.vm.value;
|
|
44
69
|
const ps = await vm.powershellCommand.value;
|
|
45
|
-
|
|
46
|
-
|
|
70
|
+
// Validate additionalMetadata keys before embedding as PS parameter names.
|
|
71
|
+
// Keys flow directly into `-${field} '...'` in the command string; a key
|
|
72
|
+
// containing semicolons or quotes would be PowerShell injection.
|
|
73
|
+
const PS_PARAM_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
74
|
+
for (const key of Object.keys(signing.additionalMetadata ?? {})) {
|
|
75
|
+
if (!PS_PARAM_NAME.test(key)) {
|
|
76
|
+
throw new Error(`additionalMetadata key "${key}" is not a valid PowerShell parameter name. Keys must match /^[A-Za-z_][A-Za-z0-9_]*$/ (e.g. "ExcludeCredentials", "CorrelationId").`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
47
79
|
const params = {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
80
|
+
Endpoint: signing.endpoint,
|
|
81
|
+
CertificateProfileName: signing.certificateProfileName,
|
|
82
|
+
CodeSigningAccountName: signing.codeSigningAccountName,
|
|
83
|
+
TimestampRfc3161: signing.timestampRfc3161 ?? "http://timestamp.acs.microsoft.com",
|
|
84
|
+
TimestampDigest: signing.timestampDigest ?? "SHA256",
|
|
85
|
+
FileDigest: signing.fileDigest ?? "SHA256",
|
|
86
|
+
...signing.additionalMetadata,
|
|
55
87
|
Files: vm.toVmFile(options.path),
|
|
56
88
|
};
|
|
57
89
|
const paramsString = Object.entries(params)
|
|
58
|
-
.filter(([
|
|
59
|
-
.
|
|
60
|
-
const escapedValue = String(value).replace(/'/g, "''");
|
|
61
|
-
return [...res, `-${field}`, `'${escapedValue}'`];
|
|
62
|
-
}, [])
|
|
90
|
+
.filter(([, value]) => value != null)
|
|
91
|
+
.map(([field, value]) => `-${field} '${String(value).replace(/'/g, "''")}'`)
|
|
63
92
|
.join(" ");
|
|
64
|
-
|
|
93
|
+
// Use -EncodedCommand (Base64 UTF-16LE) so the command string is opaque to any
|
|
94
|
+
// intermediate shell or argument parser — no cmd.exe / ConHost escaping needed.
|
|
95
|
+
// PowerShell still parses the decoded string, so PS-level single-quote escaping above is retained.
|
|
96
|
+
const psCommand = `Invoke-TrustedSigning ${paramsString}`;
|
|
97
|
+
const encodedCommand = Buffer.from(psCommand, "utf16le").toString("base64");
|
|
98
|
+
await vm.exec(ps, ["-NoProfile", "-NonInteractive", "-EncodedCommand", encodedCommand]);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
async signFileWithDlib(options) {
|
|
102
|
+
const { signing } = this;
|
|
103
|
+
const winCodeSign = this.packager.config.toolsets.winCodeSign;
|
|
104
|
+
// The ATS payload (dlib + its dependency closure) ships x64/x86 only; the bundle's arm64
|
|
105
|
+
// dir has no dlib. On arm64 hosts use the x64 signtool + dlib — x64 signtool runs under
|
|
106
|
+
// Windows-on-ARM emulation natively, and under x64 Wine on macOS/Linux.
|
|
107
|
+
const arch = process.arch === "ia32" ? Arch.ia32 : Arch.x64;
|
|
108
|
+
const { kit: kitDir } = await getWindowsKitsBundle({ winCodeSign, arch, resourcesDir: this.packager.buildResourcesDir });
|
|
109
|
+
// For custom toolsets the kit lives within buildResourcesDir; enforce that constraint.
|
|
110
|
+
// For versioned/cached bundles no base constraint is needed (paths are in the tool cache).
|
|
111
|
+
const safeKitDir = sanitizeDirPath(kitDir, typeof winCodeSign === "object" ? this.packager.buildResourcesDir : undefined);
|
|
112
|
+
const signtoolPath = path.join(safeKitDir, "signtool.exe");
|
|
113
|
+
let dlibPath;
|
|
114
|
+
let dotnetRootPath = null;
|
|
115
|
+
if (typeof winCodeSign === "string") {
|
|
116
|
+
// 1.3.0+: dlib ships in a separate ats-bundle with its full native dependency closure
|
|
117
|
+
// (Ijwhost.dll, VC++ runtime, etc.). The .NET 8 framework is in a separate dotnet-runtime
|
|
118
|
+
// bundle; DOTNET_ROOT tells Ijwhost where to find hostfxr.dll → shared framework.
|
|
119
|
+
const safeAtsDir = sanitizeDirPath(await getAtsBundleDir(winCodeSign));
|
|
120
|
+
dlibPath = path.join(safeAtsDir, arch === Arch.ia32 ? "x86" : "x64", "Azure.CodeSigning.Dlib.dll");
|
|
121
|
+
dotnetRootPath = sanitizeDirPath(await getDotnetRuntimeDir(winCodeSign));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Custom toolset: user provides the dlib alongside signtool in the kit dir.
|
|
125
|
+
dlibPath = path.join(safeKitDir, "Azure.CodeSigning.Dlib.dll");
|
|
126
|
+
}
|
|
127
|
+
const metadataPath = await this.packager.getTempFile(".json");
|
|
128
|
+
await _fsExtra.writeJson(metadataPath, {
|
|
129
|
+
Endpoint: signing.endpoint,
|
|
130
|
+
CodeSigningAccountName: signing.codeSigningAccountName,
|
|
131
|
+
CertificateProfileName: signing.certificateProfileName,
|
|
132
|
+
...signing.additionalMetadata,
|
|
133
|
+
});
|
|
134
|
+
const args = [
|
|
135
|
+
"sign",
|
|
136
|
+
"/fd",
|
|
137
|
+
(signing.fileDigest ?? "SHA256").toUpperCase(),
|
|
138
|
+
"/tr",
|
|
139
|
+
signing.timestampRfc3161 ?? "http://timestamp.acs.microsoft.com",
|
|
140
|
+
"/td",
|
|
141
|
+
(signing.timestampDigest ?? "SHA256").toUpperCase(),
|
|
142
|
+
"/dlib",
|
|
143
|
+
this.vm.toVmFile(dlibPath),
|
|
144
|
+
"/dmdf",
|
|
145
|
+
this.vm.toVmFile(metadataPath),
|
|
146
|
+
this.vm.toVmFile(options.path),
|
|
147
|
+
];
|
|
148
|
+
log.info({
|
|
149
|
+
file: log.filePath(options.path),
|
|
150
|
+
endpoint: signing.endpoint,
|
|
151
|
+
account: signing.codeSigningAccountName,
|
|
152
|
+
profile: signing.certificateProfileName,
|
|
153
|
+
}, "signing with Azure Trusted Signing (signtool /dlib)");
|
|
154
|
+
// DOTNET_ROOT: Ijwhost.dll (shipped in the ats-bundle) reads this env var to locate
|
|
155
|
+
// hostfxr.dll. On Wine, toVmFile converts the host path to a Z:\ path that Wine resolves
|
|
156
|
+
// back to the same location on the host filesystem.
|
|
157
|
+
const execOptions = dotnetRootPath != null ? { env: { DOTNET_ROOT: this.vm.toVmFile(dotnetRootPath) } } : undefined;
|
|
158
|
+
await this.vm.exec(signtoolPath, args, execOptions);
|
|
65
159
|
return true;
|
|
66
160
|
}
|
|
67
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windowsSignAzureManager.js","sourceRoot":"","sources":["../../../src/codeSign/win/windowsSignAzureManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { asArray, log } from \"builder-util\"\nimport { MemoLazy } from \"builder-util-runtime\"\nimport { Lazy } from \"lazy-val\"\nimport { WindowsAzureSigningConfiguration, WindowsConfiguration } from \"../../options/winOptions.js\"\nimport { WinPackager } from \"../../winPackager.js\"\nimport { SignManager } from \"../signManager.js\"\nimport { WindowsSignOptions } from \"./windowsCodeSign.js\"\nimport { CertificateFromStoreInfo, FileCodeSigningInfo } from \"./windowsSignToolManager.js\"\n\nexport class WindowsSignAzureManager implements SignManager {\n private readonly platformOptions: WindowsConfiguration\n\n readonly computedPublisherName = new Lazy<Array<string> | null>(() => {\n const publisherName = this.platformOptions.azureSignOptions?.publisherName\n if (publisherName === null) {\n return Promise.resolve(null)\n } else if (publisherName != null) {\n return Promise.resolve(asArray(publisherName))\n }\n\n // TODO: Is there another way to automatically pull Publisher Name from AzureTrusted service?\n // For now return null.\n return Promise.resolve(null)\n })\n\n constructor(private readonly packager: WinPackager) {\n this.platformOptions = packager.platformOptions\n }\n\n async initialize() {\n const vm = await this.packager.vm.value\n const ps = await vm.powershellCommand.value\n\n log.info(null, \"installing required module (TrustedSigning) with scope CurrentUser\")\n try {\n await vm.exec(ps, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", \"Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Scope CurrentUser\"])\n } catch (error: any) {\n // Might not be needed, seems GH runners already have NuGet set up.\n // Logging to debug just in case users run into this. If NuGet isn't present, Install-Module -Name TrustedSigning will fail, so we'll get the logs at that point\n log.debug({ message: error.message || error.stack }, \"unable to install PackageProvider Nuget. Might be a false alarm though as some systems already have it installed\")\n }\n await vm.exec(ps, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", \"Install-Module -Name TrustedSigning -MinimumVersion 0.5.0 -Force -Repository PSGallery -Scope CurrentUser\"])\n\n // If signing has been misconfigured it, the error from the TrustedSigning module should be descriptive enough to help them fix their configuration.\n // Options: https://learn.microsoft.com/en-us/dotnet/api/azure.identity.environmentcredential?view=azure-dotnet#definition\n }\n\n computePublisherName(): Promise<string> {\n return Promise.resolve(this.packager.platformOptions.azureSignOptions!.publisherName)\n }\n readonly cscInfo = new MemoLazy<WindowsConfiguration, FileCodeSigningInfo | CertificateFromStoreInfo | null>(\n () => this.packager.platformOptions,\n _selected => Promise.resolve(null)\n )\n // prerequisite: requires `initializeProviderModules` to already have been executed\n async signFile(options: WindowsSignOptions): Promise<boolean> {\n const vm = await this.packager.vm.value\n const ps = await vm.powershellCommand.value\n\n const {\n publisherName: _publisher, // extract from `extraSigningArgs`\n endpoint,\n certificateProfileName,\n codeSigningAccountName,\n fileDigest,\n timestampRfc3161,\n timestampDigest,\n ...extraSigningArgs\n }: WindowsAzureSigningConfiguration = options.options.azureSignOptions!\n const params = {\n ...extraSigningArgs,\n Endpoint: endpoint,\n CertificateProfileName: certificateProfileName,\n CodeSigningAccountName: codeSigningAccountName,\n TimestampRfc3161: timestampRfc3161 || \"http://timestamp.acs.microsoft.com\",\n TimestampDigest: timestampDigest || \"SHA256\",\n FileDigest: fileDigest || \"SHA256\",\n Files: vm.toVmFile(options.path),\n }\n const paramsString = Object.entries(params)\n .filter(([_, value]) => value != null)\n .reduce((res, [field, value]) => {\n const escapedValue = String(value).replace(/'/g, \"''\")\n return [...res, `-${field}`, `'${escapedValue}'`]\n }, [] as string[])\n .join(\" \")\n await vm.exec(ps, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", `Invoke-TrustedSigning ${paramsString}`])\n\n return true\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"windowsSignAzureManager.js","sourceRoot":"","sources":["../../../src/codeSign/win/windowsSignAzureManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arch, isEmptyOrSpaces, log, sanitizeDirPath } from \"builder-util\"\nimport { asArray, MemoLazy } 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 { resolveWindowsSigningConfiguration, WindowsAzureSigningConfig, WindowsConfiguration } from \"../../options/winOptions.js\"\nimport { getAtsBundleDir, getDotnetRuntimeDir, getWindowsKitsBundle } from \"../../toolsets/winCodeSign.js\"\nimport { VmManager } from \"../../vm/vm.js\"\nimport { WineVmManager } from \"../../vm/WineVm.js\"\nimport { WinPackager } from \"../../winPackager.js\"\nimport { SignManager } from \"./signManager.js\"\nimport { WindowsSignOptions } from \"./windowsCodeSign.js\"\nimport { CertificateFromStoreInfo, FileCodeSigningInfo } from \"./windowsSignToolManager.js\"\nimport semver from \"semver\"\n\nconst minimumWinCodeSignVersionForDlib = \"1.3.0\"\nexport class WindowsSignAzureManager implements SignManager {\n private readonly signing: WindowsAzureSigningConfig\n\n // signtool.exe is a Windows PE binary; use Wine on non-Windows (same pattern as MsiTarget).\n private readonly vm: VmManager = process.platform === \"win32\" ? new VmManager() : new WineVmManager(this.packager.config.toolsets?.wine, this.packager.buildResourcesDir)\n\n readonly computedPublisherName = new Lazy<Array<string> | null>(() => {\n return Promise.resolve(asArray(this.publisherName))\n })\n\n private get publisherName(): string {\n const result = this.signing.publisherName\n if (isEmptyOrSpaces(result)) {\n throw new Error(\"Azure Trusted Signing requires 'publisherName' in win.sign config (no local certificate to derive it from)\")\n }\n return result\n }\n\n constructor(private readonly packager: WinPackager) {\n const signing = resolveWindowsSigningConfiguration(packager.platformOptions)\n if (signing?.type !== \"azure\") {\n throw new Error(`WindowsSignAzureManager requires signing.type = \"azure\", got: ${signing?.type}`)\n }\n this.signing = signing\n }\n\n private isLegacyMode(): boolean {\n const { winCodeSign: wcs = null } = this.packager.config.toolsets ?? {}\n if (typeof wcs === \"string\") {\n return semver.lt(wcs, minimumWinCodeSignVersionForDlib)\n }\n // null = built-in toolset not configured → legacy; ToolsetCustom object = user-managed → not legacy\n return wcs == null\n }\n\n async initialize(): Promise<void> {\n if (!this.isLegacyMode()) {\n return\n }\n\n const { winCodeSign: wcs = null } = this.packager.config.toolsets ?? {}\n const reason = typeof wcs === \"string\" ? `toolsets.winCodeSign \"${wcs}\" is below the minimum \"${minimumWinCodeSignVersionForDlib}\"` : `toolsets.winCodeSign is not set`\n log.info(\n { reason, guidance: `set toolsets.winCodeSign to \"${minimumWinCodeSignVersionForDlib}\" to use the faster signtool /dlib integration` },\n `Azure Trusted Signing: falling back to legacy PowerShell (Invoke-TrustedSigning)`\n )\n\n const vm = await this.packager.vm.value\n const ps = await vm.powershellCommand.value\n log.info(null, \"installing required module (TrustedSigning) with scope CurrentUser\")\n try {\n await vm.exec(ps, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", \"Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Scope CurrentUser\"])\n } catch (error: any) {\n log.debug({ message: error.message || error.stack }, \"unable to install PackageProvider NuGet — may already be present\")\n }\n await vm.exec(ps, [\"-NoProfile\", \"-NonInteractive\", \"-Command\", \"Install-Module -Name TrustedSigning -MinimumVersion 0.5.0 -Force -Repository PSGallery -Scope CurrentUser\"])\n }\n\n computePublisherName(_target: Target, publisherName: string | null): Promise<string> {\n return Promise.resolve(this.publisherName ?? publisherName)\n }\n\n readonly cscInfo = new MemoLazy<WindowsConfiguration, FileCodeSigningInfo | CertificateFromStoreInfo | null>(\n () => this.packager.platformOptions,\n _selected => Promise.resolve(null)\n )\n\n async signFile(options: WindowsSignOptions): Promise<boolean> {\n return this.isLegacyMode() ? this.signFileLegacy(options) : this.signFileWithDlib(options)\n }\n\n private async signFileLegacy(options: WindowsSignOptions): Promise<boolean> {\n const { signing } = this\n const vm = await this.packager.vm.value\n const ps = await vm.powershellCommand.value\n\n // Validate additionalMetadata keys before embedding as PS parameter names.\n // Keys flow directly into `-${field} '...'` in the command string; a key\n // containing semicolons or quotes would be PowerShell injection.\n const PS_PARAM_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/\n for (const key of Object.keys(signing.additionalMetadata ?? {})) {\n if (!PS_PARAM_NAME.test(key)) {\n throw new Error(\n `additionalMetadata key \"${key}\" is not a valid PowerShell parameter name. Keys must match /^[A-Za-z_][A-Za-z0-9_]*$/ (e.g. \"ExcludeCredentials\", \"CorrelationId\").`\n )\n }\n }\n\n const params: Record<string, string | undefined> = {\n Endpoint: signing.endpoint,\n CertificateProfileName: signing.certificateProfileName,\n CodeSigningAccountName: signing.codeSigningAccountName,\n TimestampRfc3161: signing.timestampRfc3161 ?? \"http://timestamp.acs.microsoft.com\",\n TimestampDigest: signing.timestampDigest ?? \"SHA256\",\n FileDigest: signing.fileDigest ?? \"SHA256\",\n ...signing.additionalMetadata,\n Files: vm.toVmFile(options.path),\n }\n\n const paramsString = Object.entries(params)\n .filter(([, value]) => value != null)\n .map(([field, value]) => `-${field} '${String(value).replace(/'/g, \"''\")}'`)\n .join(\" \")\n\n // Use -EncodedCommand (Base64 UTF-16LE) so the command string is opaque to any\n // intermediate shell or argument parser — no cmd.exe / ConHost escaping needed.\n // PowerShell still parses the decoded string, so PS-level single-quote escaping above is retained.\n const psCommand = `Invoke-TrustedSigning ${paramsString}`\n const encodedCommand = Buffer.from(psCommand, \"utf16le\").toString(\"base64\")\n await vm.exec(ps, [\"-NoProfile\", \"-NonInteractive\", \"-EncodedCommand\", encodedCommand])\n return true\n }\n\n private async signFileWithDlib(options: WindowsSignOptions): Promise<boolean> {\n const { signing } = this\n const winCodeSign = this.packager.config.toolsets!.winCodeSign!\n\n // The ATS payload (dlib + its dependency closure) ships x64/x86 only; the bundle's arm64\n // dir has no dlib. On arm64 hosts use the x64 signtool + dlib — x64 signtool runs under\n // Windows-on-ARM emulation natively, and under x64 Wine on macOS/Linux.\n const arch = process.arch === \"ia32\" ? Arch.ia32 : Arch.x64\n const { kit: kitDir } = await getWindowsKitsBundle({ winCodeSign, arch, resourcesDir: this.packager.buildResourcesDir })\n // For custom toolsets the kit lives within buildResourcesDir; enforce that constraint.\n // For versioned/cached bundles no base constraint is needed (paths are in the tool cache).\n const safeKitDir = sanitizeDirPath(kitDir, typeof winCodeSign === \"object\" ? this.packager.buildResourcesDir : undefined)\n const signtoolPath = path.join(safeKitDir, \"signtool.exe\")\n\n let dlibPath: string\n let dotnetRootPath: string | null = null\n\n if (typeof winCodeSign === \"string\") {\n // 1.3.0+: dlib ships in a separate ats-bundle with its full native dependency closure\n // (Ijwhost.dll, VC++ runtime, etc.). The .NET 8 framework is in a separate dotnet-runtime\n // bundle; DOTNET_ROOT tells Ijwhost where to find hostfxr.dll → shared framework.\n const safeAtsDir = sanitizeDirPath(await getAtsBundleDir(winCodeSign))\n dlibPath = path.join(safeAtsDir, arch === Arch.ia32 ? \"x86\" : \"x64\", \"Azure.CodeSigning.Dlib.dll\")\n dotnetRootPath = sanitizeDirPath(await getDotnetRuntimeDir(winCodeSign))\n } else {\n // Custom toolset: user provides the dlib alongside signtool in the kit dir.\n dlibPath = path.join(safeKitDir, \"Azure.CodeSigning.Dlib.dll\")\n }\n\n const metadataPath = await this.packager.getTempFile(\".json\")\n await _fsExtra.writeJson(metadataPath, {\n Endpoint: signing.endpoint,\n CodeSigningAccountName: signing.codeSigningAccountName,\n CertificateProfileName: signing.certificateProfileName,\n ...signing.additionalMetadata,\n })\n\n const args = [\n \"sign\",\n \"/fd\",\n (signing.fileDigest ?? \"SHA256\").toUpperCase(),\n \"/tr\",\n signing.timestampRfc3161 ?? \"http://timestamp.acs.microsoft.com\",\n \"/td\",\n (signing.timestampDigest ?? \"SHA256\").toUpperCase(),\n \"/dlib\",\n this.vm.toVmFile(dlibPath),\n \"/dmdf\",\n this.vm.toVmFile(metadataPath),\n this.vm.toVmFile(options.path),\n ]\n\n log.info(\n {\n file: log.filePath(options.path),\n endpoint: signing.endpoint,\n account: signing.codeSigningAccountName,\n profile: signing.certificateProfileName,\n },\n \"signing with Azure Trusted Signing (signtool /dlib)\"\n )\n\n // DOTNET_ROOT: Ijwhost.dll (shipped in the ats-bundle) reads this env var to locate\n // hostfxr.dll. On Wine, toVmFile converts the host path to a Z:\\ path that Wine resolves\n // back to the same location on the host filesystem.\n const execOptions = dotnetRootPath != null ? { env: { DOTNET_ROOT: this.vm.toVmFile(dotnetRootPath) } } : undefined\n await this.vm.exec(signtoolPath, args, execOptions)\n return true\n }\n}\n"]}
|
|
@@ -1,59 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { Lazy } from "lazy-val";
|
|
3
|
-
import { Target } from "../../core.js";
|
|
4
|
-
import { WindowsConfiguration } from "../../options/winOptions.js";
|
|
5
|
-
import { ToolInfo } from "../../util/bundledTool.js";
|
|
6
|
-
import { VmManager } from "../../vm/vm.js";
|
|
7
|
-
import { WinPackager } from "../../winPackager.js";
|
|
8
|
-
import { SignManager } from "../signManager.js";
|
|
9
|
-
import { WindowsSignOptions } from "./windowsCodeSign.js";
|
|
10
|
-
export type CustomWindowsSign = (configuration: CustomWindowsSignTaskConfiguration, packager?: WinPackager) => Promise<any>;
|
|
11
|
-
export interface WindowsSignToolOptions extends WindowsSignOptions {
|
|
12
|
-
readonly name: string;
|
|
13
|
-
readonly site: string | null;
|
|
14
|
-
}
|
|
15
|
-
export interface FileCodeSigningInfo {
|
|
16
|
-
readonly file: string;
|
|
17
|
-
readonly password: string | null;
|
|
18
|
-
}
|
|
19
|
-
export interface WindowsSignTaskConfiguration extends WindowsSignToolOptions {
|
|
20
|
-
readonly cscInfo: FileCodeSigningInfo | CertificateFromStoreInfo | null;
|
|
21
|
-
resultOutputPath?: string;
|
|
22
|
-
hash: string;
|
|
23
|
-
isNest: boolean;
|
|
24
|
-
}
|
|
25
|
-
export interface CustomWindowsSignTaskConfiguration extends WindowsSignTaskConfiguration {
|
|
26
|
-
computeSignToolArgs(isWin: boolean): Array<string>;
|
|
27
|
-
}
|
|
28
|
-
export interface CertificateInfo {
|
|
29
|
-
readonly commonName: string;
|
|
30
|
-
readonly bloodyMicrosoftSubjectDn: string;
|
|
31
|
-
}
|
|
32
|
-
export interface CertificateFromStoreInfo {
|
|
33
|
-
thumbprint: string;
|
|
34
|
-
subject: string;
|
|
35
|
-
store: string;
|
|
36
|
-
isLocalMachineStore: boolean;
|
|
37
|
-
}
|
|
38
|
-
export declare class WindowsSignToolManager implements SignManager {
|
|
39
|
-
private readonly packager;
|
|
40
|
-
private readonly platformOptions;
|
|
41
|
-
constructor(packager: WinPackager);
|
|
42
|
-
readonly computedPublisherName: Lazy<string[] | null>;
|
|
43
|
-
readonly lazyCertInfo: MemoLazy<MemoLazy<WindowsConfiguration, FileCodeSigningInfo | CertificateFromStoreInfo | null>, CertificateInfo | null>;
|
|
44
|
-
readonly cscInfo: MemoLazy<WindowsConfiguration, FileCodeSigningInfo | CertificateFromStoreInfo | null>;
|
|
45
|
-
initialize(): Promise<void>;
|
|
46
|
-
computePublisherName(target: Target, publisherName: string): Promise<string>;
|
|
47
|
-
signFile(options: WindowsSignOptions): Promise<boolean>;
|
|
48
|
-
getCertInfo(file: string, password: string): Promise<CertificateInfo>;
|
|
49
|
-
computeSignToolArgs(options: WindowsSignTaskConfiguration, isWin: boolean, vm?: VmManager): Array<string>;
|
|
50
|
-
private computeWindowsSignArgs;
|
|
51
|
-
private computeOsslsigncodeArgs;
|
|
52
|
-
private addCertificateArgs;
|
|
53
|
-
private addCommonSigningArgs;
|
|
54
|
-
getOutputPath(inputPath: string, hash: string): string;
|
|
55
|
-
getCertificateFromStoreInfo(options: WindowsConfiguration, vm: VmManager): Promise<CertificateFromStoreInfo>;
|
|
56
|
-
getToolPath(isWin?: boolean): Promise<ToolInfo>;
|
|
57
|
-
doSign(configuration: CustomWindowsSignTaskConfiguration, packager: WinPackager): Promise<void>;
|
|
58
|
-
}
|
|
1
|
+
export { CertificateFromStoreInfo, CertificateInfo, CustomWindowsSign, CustomWindowsSignTaskConfiguration, FileCodeSigningInfo, getSigntoolFamilyConfig, SigntoolSignManager as WindowsSignToolManager, WindowsSignTaskConfiguration, WindowsSignToolOptions, } from "./signtoolBaseSignManager.js";
|
|
59
2
|
//# sourceMappingURL=windowsSignToolManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windowsSignToolManager.d.ts","sourceRoot":"","sources":["../../../src/codeSign/win/windowsSignToolManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"windowsSignToolManager.d.ts","sourceRoot":"","sources":["../../../src/codeSign/win/windowsSignToolManager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,iBAAiB,EACjB,kCAAkC,EAClC,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,IAAI,sBAAsB,EAC7C,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,8BAA8B,CAAA"}
|