Skip to content

Commit 6f8b94b

Browse files
MariaDimadevelar
authored andcommitted
fix(windows): Get-PfxCertificate hangs
Close #1735
1 parent 5e09db4 commit 6f8b94b

File tree

7 files changed

+44
-15
lines changed

7 files changed

+44
-15
lines changed

packages/electron-builder-util/src/util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export interface ExecOptions extends BaseExecOptions {
2929
}
3030

3131
export function removePassword(input: string) {
32-
return input.replace(/(-P |pass:| \/p |-pass )([^ ]+)/g, function (match, p1, p2) {
32+
return input.replace(/(-String |-P |pass:| \/p |-pass )([^ ]+)/g, function (match, p1, p2) {
3333
return `${p1}${createHash("sha256").update(p2).digest("hex")} (sha256 hash)`
3434
})
3535
}

packages/electron-builder/src/targets/appx.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import BluebirdPromise from "bluebird-lst"
2-
import { asArray, exec, spawn, use } from "electron-builder-util"
2+
import _debug from "debug"
3+
import { asArray, spawn, use } from "electron-builder-util"
34
import { deepAssign } from "electron-builder-util/out/deepAssign"
45
import { copyDir, copyFile } from "electron-builder-util/out/fs"
56
import { asyncAll, orIfFileNotExist } from "electron-builder-util/out/promise"
@@ -20,6 +21,7 @@ const vendorAssetsForDefaultAssets: { [key: string]: string; } = {
2021
}
2122

2223
const DEFAULT_RESOURCE_LANG = "en-US"
24+
const debug = _debug("electron-builder:appx")
2325

2426
export default class AppXTarget extends Target {
2527
readonly options: AppXOptions = deepAssign({}, this.packager.platformSpecificBuildOptions, this.packager.config.appx)
@@ -47,9 +49,9 @@ export default class AppXTarget extends Target {
4749
throw new Error("Please specify appx.publisher: cannot get publisher from your code signing certificate if EV cert is used")
4850
}
4951

50-
publisher = (await exec("powershell.exe", [`(Get-PfxCertificate "${cscFile}").Subject`])).trim()
52+
publisher = await packager.computedPublisherSubjectOnWindowsOnly.value
5153
if (!publisher) {
52-
throw new Error("Please specify appx.publisher: Get-PfxCertificate returns empty string")
54+
throw new Error("Please specify appx.publisher, cannot compute from p12 file")
5355
}
5456
}
5557

@@ -80,15 +82,15 @@ export default class AppXTarget extends Target {
8082
if (isScaledAssetsProvided(userAssets)) {
8183
const priConfigPath = path.join(preAppx, "priconfig.xml")
8284
const makePriPath = path.join(vendorPath, "windows-10", Arch[arch], "makepri.exe")
83-
await spawn(makePriPath, ["createconfig", "/cf", priConfigPath, "/dq", "en-US", "/pv", "10.0.0", "/o"])
84-
await spawn(makePriPath, ["new", "/pr", preAppx, "/cf", priConfigPath, "/of", preAppx])
85+
await spawn(makePriPath, ["createconfig", "/cf", priConfigPath, "/dq", "en-US", "/pv", "10.0.0", "/o"], undefined, {isDebugEnabled: debug.enabled})
86+
await spawn(makePriPath, ["new", "/pr", preAppx, "/cf", priConfigPath, "/of", preAppx], undefined, {isDebugEnabled: debug.enabled})
8587

8688
makeAppXArgs.push("/l")
8789
}
8890

8991
use(this.options.makeappxArgs, (it: Array<string>) => makeAppXArgs.push(...it))
9092
// wine supports only ia32 binary in any case makeappx crashed on wine
91-
await spawn(path.join(vendorPath, "windows-10", Arch[arch], "makeappx.exe"), makeAppXArgs)
93+
await spawn(path.join(vendorPath, "windows-10", Arch[arch], "makeappx.exe"), makeAppXArgs, undefined, {isDebugEnabled: debug.enabled})
9294
await packager.sign(destination)
9395

9496
packager.dispatchArtifactCreated(destination, this, arch, packager.computeSafeArtifactName("appx"))

packages/electron-builder/src/util/flags.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ export function isUseSystemSigncode() {
66
return isEnvTrue(process.env.USE_SYSTEM_SIGNCODE)
77
}
88

9+
export function isBuildCacheEnabled() {
10+
return !isEnvTrue(process.env.ELECTRON_BUILDER_DISABLE_BUILD_CACHE)
11+
}
12+
913
function isEnvTrue(value: string | null) {
1014
if (value != null) {
1115
value = value.trim()

packages/electron-builder/src/winPackager.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { AppPackageHelper, NsisTarget } from "./targets/nsis"
1717
import { createCommonTarget } from "./targets/targetFactory"
1818
import { WebInstallerTarget } from "./targets/WebInstallerTarget"
1919
import { BuildCacheManager, digest } from "./util/cacheManager"
20+
import { isBuildCacheEnabled } from "./util/flags"
2021
import { time } from "./util/timer"
2122
import { execWine } from "./util/wine"
2223
import { FileCodeSigningInfo, getSignVendorPath, sign, SignOptions } from "./windowsCodeSign"
@@ -61,6 +62,17 @@ export class WinPackager extends PlatformPackager<WinBuildOptions> {
6162

6263
private _iconPath = new Lazy<string | null>(() => this.getValidIconPath())
6364

65+
readonly computedPublisherSubjectOnWindowsOnly = new Lazy<string | null>(async () => {
66+
const cscInfo = await this.cscInfo.value
67+
if (cscInfo == null) {
68+
return null
69+
}
70+
71+
// https://github.com/electron-userland/electron-builder/issues/1735
72+
const args = cscInfo.password ? [`(Get-PfxData "${cscInfo.file!}" -Password (ConvertTo-SecureString -String "${cscInfo.password}" -Force -AsPlainText)).EndEntityCertificates.Subject`] : [`(Get-PfxCertificate "${cscInfo.file!}").Subject`]
73+
return await exec("powershell.exe", args, {timeout: 30 * 1000}).then(it => it.trim())
74+
})
75+
6476
readonly computedPublisherName = new Lazy<Array<string> | null>(async () => {
6577
let publisherName = (<WinBuildOptions>this.platformSpecificBuildOptions).publisherName
6678
if (publisherName === null) {
@@ -76,9 +88,10 @@ export class WinPackager extends PlatformPackager<WinBuildOptions> {
7688
if (publisherName == null && cscFile != null) {
7789
if (process.platform === "win32") {
7890
try {
79-
const subject = parseDn(await exec("powershell.exe", [`(Get-PfxCertificate "${cscFile}").Subject`], {timeout: 30 * 1000})).get("CN")
80-
if (subject) {
81-
return asArray(subject)
91+
const subject = await this.computedPublisherSubjectOnWindowsOnly.value
92+
const commonName = subject == null ? null : parseDn(subject).get("CN")
93+
if (commonName) {
94+
return asArray(commonName)
8295
}
8396
}
8497
catch (e) {
@@ -265,7 +278,8 @@ export class WinPackager extends PlatformPackager<WinBuildOptions> {
265278
args.push("--set-icon", it)
266279
})
267280

268-
const cscInfoForCacheDigest = isCI ? null : await this.cscInfo.value
281+
const config = this.config
282+
const cscInfoForCacheDigest = !isBuildCacheEnabled() || isCI || config.electronDist != null ? null : await this.cscInfo.value
269283
let buildCacheManager: BuildCacheManager | null = null
270284
// resources editing doesn't change executable for the same input and executed quickly - no need to complicate
271285
if (cscInfoForCacheDigest != null) {
@@ -276,8 +290,8 @@ export class WinPackager extends PlatformPackager<WinBuildOptions> {
276290
const timer = time("executable cache")
277291
// md5 is faster, we don't need secure hash
278292
const hash = createHash("md5")
279-
hash.update(this.config.electronVersion || "no electronVersion")
280-
hash.update(this.config.muonVersion || "no muonVersion")
293+
hash.update(config.electronVersion || "no electronVersion")
294+
hash.update(config.muonVersion || "no muonVersion")
281295
hash.update(JSON.stringify(this.platformSpecificBuildOptions))
282296
hash.update(JSON.stringify(args))
283297
hash.update(cscInfoForCacheDigest.certificateSha1 || "no certificateSha1")

test/out/mac/__snapshots__/CodeSignTest.js.snap

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,7 @@ exports[`remove password from log 2`] = `"pass:2c26b46b68ffc68ff99b453c1d3041341
77
exports[`remove password from log 3`] = `"/usr/bin/productbuild -P 56ef615b2e26c3b9a10dc2824238fb8b8a154ec7db4907ec6ee357ed7bb350b7 (sha256 hash)"`;
88

99
exports[`remove password from log 4`] = `" /p 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae (sha256 hash)"`;
10+
11+
exports[`remove password from log 5`] = `"ConvertTo-SecureString -String 4d967a30111bf29f0eba01c448b375c1629b2fed01cdfcc3aed91f1b57d5dd5e (sha256 hash)"`;
12+
13+
exports[`remove password from log 6`] = `"(Get-PfxData \\"C:\\\\Users\\\\develar\\\\AppData\\\\Local\\\\Temp\\\\electron-builder-yBY8D2\\\\0-1.p12\\" -Password (ConvertTo-SecureString -String 4d967a30111bf29f0eba01c448b375c1629b2fed01cdfcc3aed91f1b57d5dd5e (sha256 hash) -Force -AsPlainText)).EndEntityCertificates.Subject"`;

test/src/mac/CodeSignTest.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ test.ifDevOrLinuxCi("remove password from log", async () => {
2525
expect(removePassword("pass:foo")).toMatchSnapshot()
2626
expect(removePassword("/usr/bin/productbuild -P wefwef")).toMatchSnapshot()
2727
expect(removePassword(" /p foo")).toMatchSnapshot()
28+
expect(removePassword('ConvertTo-SecureString -String "test"')).toMatchSnapshot()
29+
expect(removePassword('(Get-PfxData "C:\\Users\\develar\\AppData\\Local\\Temp\\electron-builder-yBY8D2\\0-1.p12" -Password (ConvertTo-SecureString -String "test" -Force -AsPlainText)).EndEntityCertificates.Subject')).toMatchSnapshot()
2830
})

test/src/windows/appxTest.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import { app } from "../helpers/packTester"
44
// noinspection SpellCheckingInspection
55
const cscLink = "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\n"
66

7+
// test that we can get info from protected pfx
8+
const protectedCscLink = "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"
9+
710
test.ifWindows("AppX", app({
811
targets: Platform.WINDOWS.createTarget(["appx"], Arch.ia32, Arch.x64),
912
cscLink: cscLink,
@@ -13,8 +16,8 @@ test.ifWindows("AppX", app({
1316
// todo - check manifest
1417
test.ifWindows("languages", app({
1518
targets: Platform.WINDOWS.createTarget(["appx"]),
16-
cscLink: cscLink,
17-
cscKeyPassword: "",
19+
cscLink: protectedCscLink,
20+
cscKeyPassword: "test",
1821
config: {
1922
appx: {
2023
languages: ["de-DE", "ru-RU"]

0 commit comments

Comments
 (0)