Skip to content

Commit 3ab0e57

Browse files
committed
feat: base64-encoded P12 file instead of https link
1 parent 7d5b747 commit 3ab0e57

File tree

5 files changed

+24
-10
lines changed

5 files changed

+24
-10
lines changed

docs/Code Signing.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ On a development machine set environment variable `CSC_NAME` (and `CSC_INSTALLER
44

55
| Env name | Description
66
| -------------- | -----------
7-
| `CSC_LINK` | The HTTPS link to certificate (`*.p12` file).
7+
| `CSC_LINK` | The HTTPS link (or base64-encoded data) to certificate (`*.p12` file).
88
| `CSC_KEY_PASSWORD` | The password to decrypt the certificate given in `CSC_LINK`.
9-
| `CSC_INSTALLER_LINK` | *osx-only* The HTTPS link to certificate to sign Mac App Store build (`*.p12` file).
9+
| `CSC_INSTALLER_LINK` | *osx-only* The HTTPS link (or base64-encoded data) to certificate to sign Mac App Store build (`*.p12` file).
1010
| `CSC_INSTALLER_KEY_PASSWORD` | *osx-only* The password to decrypt the certificate given in `CSC_INSTALLER_LINK`.
1111
| `CSC_NAME` | *osx-only* Name of certificate (to retrieve from login.keychain). Useful on a development machine (not on CI).
1212
| `CSC_INSTALLER_NAME` | *osx-only* Name of installer certificate (to retrieve from login.keychain). Useful on a development machine (not on CI).
@@ -25,4 +25,9 @@ To sign app on build server you need to set `CSC_LINK`, `CSC_KEY_PASSWORD` (and
2525
```
2626
travis encrypt "CSC_LINK='https://drive.google.com/uc?export=download&id=***'" --add
2727
travis encrypt 'CSC_KEY_PASSWORD=beAwareAboutBashEscaping!!!' --add
28-
```
28+
```
29+
30+
# Where to buy certificate
31+
32+
[StartSSL](https://startssl.com/Support?v=34) is recommended.
33+
It can be used to sign OS X app also, so, you don't need to buy Apple Certificate in addition (please note, it works, but we are waiting official confirmation).

docs/Publishing Artifacts.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ But please consider using automatic rules instead of explicitly specifying `publ
1717

1818
* If CI server detected, — `onTagOrDraft`.
1919

20-
> **NOTICE**: _This is the recommended workflow._
20+
**NOTICE**: _This is the recommended workflow._
2121

2222
1. [Draft a new release](https://help.github.com/articles/creating-releases/). Set the "Tag version" to the value of `version` in your application `package.json`, and prefix it with `v`. "Release title" can be anything you want.
2323
- For example, if your application `package.json` version is `1.0`, your draft's "Tag version" would be `v1.0`.

src/codeSign.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { exec } from "./util"
2-
import { deleteFile } from "fs-extra-p"
2+
import { deleteFile, outputFile } from "fs-extra-p"
33
import { download } from "./httpRequest"
44
import { tmpdir } from "os"
55
import * as path from "path"
@@ -25,6 +25,15 @@ export function generateKeychainName(): string {
2525
return "csc-" + randomString() + ".keychain"
2626
}
2727

28+
function downloadUrlOrBase64(urlOrBase64: string, destination: string): BluebirdPromise<any> {
29+
if (urlOrBase64.startsWith("https://")) {
30+
return download(urlOrBase64, destination)
31+
}
32+
else {
33+
return outputFile(destination, Buffer.from(urlOrBase64, "base64"))
34+
}
35+
}
36+
2837
export function createKeychain(keychainName: string, cscLink: string, cscKeyPassword: string, cscILink?: string | null, cscIKeyPassword?: string | null, csaLink?: string | null): Promise<CodeSigningInfo> {
2938
const certLinks = csaLink == null ? [] : [csaLink]
3039
certLinks.push(cscLink)
@@ -35,7 +44,7 @@ export function createKeychain(keychainName: string, cscLink: string, cscKeyPass
3544
const certPaths = certLinks.map(it => path.join(tmpdir(), randomString() + (it.endsWith(".cer") ? ".cer" : ".p12")))
3645
const keychainPassword = randomString()
3746
return executeFinally(BluebirdPromise.all([
38-
BluebirdPromise.map(certPaths, (p, i) => download(certLinks[i], p)),
47+
BluebirdPromise.map(certPaths, (p, i) => downloadUrlOrBase64(certLinks[i], p)),
3948
BluebirdPromise.mapSeries([
4049
["create-keychain", "-p", keychainPassword, keychainName],
4150
["unlock-keychain", "-p", keychainPassword, keychainName],
@@ -121,6 +130,6 @@ export function deleteKeychain(keychainName: string, ignoreNotFound: boolean = t
121130

122131
export function downloadCertificate(cscLink: string): Promise<string> {
123132
const certPath = path.join(tmpdir(), randomString() + ".p12")
124-
return download(cscLink, certPath)
133+
return downloadUrlOrBase64(cscLink, certPath)
125134
.thenReturn(certPath)
126135
}

test/src/ArtifactPublisherTest.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ function versionNumber() {
1414
return getRandomInt(0, 99) + "." + Date.now() + "." + getRandomInt(0, 9)
1515
}
1616

17-
const token = new Buffer("Y2Y5NDdhZDJhYzJlMzg1OGNiNzQzYzcwOWZhNGI0OTk2NWQ4ZDg3Yg==", "base64").toString()
17+
const token = Buffer.from("Y2Y5NDdhZDJhYzJlMzg1OGNiNzQzYzcwOWZhNGI0OTk2NWQ4ZDg3Yg==", "base64").toString()
1818
const iconPath = join(__dirname, "..", "fixtures", "test-app", "build", "icon.icns")
1919

2020
//test("GitHub unauthorized", async (t) => {

test/src/helpers/codeSignData.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
export const CSC_LINK = "https://www.dropbox.com/s/86zaffzbao198xe/test.p12?dl=1"
1+
export const CSC_LINK = "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"
22
export const CSC_KEY_PASSWORD = "password"
33

4-
export const CSC_INSTALLER_LINK = "https://www.dropbox.com/s/2drwf5owgoqxkr3/test-installer.p12?dl=1"
4+
export const CSC_INSTALLER_LINK = "https://drive.google.com/uc?export=download&id=0Bz3JwZ-jqfRONTkzTGlsMkM2TlE"
55
export const CSC_INSTALLER_KEY_PASSWORD = "password"
66

77
export const CSC_NAME = "Test Test"

0 commit comments

Comments
 (0)