@expo/devcert 1.1.4 → 1.2.1
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/README.md +12 -12
- package/dist/certificate-authority.d.ts +1 -1
- package/dist/certificate-authority.js +60 -66
- package/dist/certificates.js +22 -23
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +40 -27
- package/dist/index.js +77 -54
- package/dist/platforms/darwin.d.ts +2 -2
- package/dist/platforms/darwin.js +66 -73
- package/dist/platforms/index.d.ts +2 -2
- package/dist/platforms/index.js +1 -1
- package/dist/platforms/linux.d.ts +2 -2
- package/dist/platforms/linux.js +62 -69
- package/dist/platforms/shared.d.ts +2 -2
- package/dist/platforms/shared.js +87 -63
- package/dist/platforms/win32.d.ts +2 -2
- package/dist/platforms/win32.js +60 -66
- package/dist/user-interface.js +37 -29
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +34 -9
- package/openssl-configurations/domain-certificate-signing-requests.conf +3 -3
- package/openssl-configurations/domain-certificates.conf +5 -5
- package/package.json +3 -17
- package/src/certificate-authority.ts +9 -9
- package/src/certificates.ts +4 -5
- package/src/constants.ts +37 -24
- package/src/index.ts +1 -1
- package/src/platforms/darwin.ts +4 -5
- package/src/platforms/index.ts +2 -2
- package/src/platforms/linux.ts +6 -7
- package/src/platforms/shared.ts +63 -37
- package/src/platforms/win32.ts +4 -4
- package/src/user-interface.ts +21 -2
- package/src/utils.ts +29 -6
- package/tsconfig.json +2 -2
- package/src/types.d.ts +0 -7
package/dist/platforms/win32.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const crypto_1 = tslib_1.__importDefault(require("crypto"));
|
|
6
|
+
const debug_1 = __importDefault(require("debug"));
|
|
7
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
6
8
|
const fs_1 = require("fs");
|
|
7
9
|
const shared_1 = require("./shared");
|
|
8
10
|
const utils_1 = require("../utils");
|
|
9
|
-
const user_interface_1 =
|
|
11
|
+
const user_interface_1 = __importDefault(require("../user-interface"));
|
|
10
12
|
const debug = (0, debug_1.default)('devcert:platforms:windows');
|
|
11
13
|
let encryptionKey;
|
|
12
14
|
class WindowsPlatform {
|
|
@@ -21,31 +23,29 @@ class WindowsPlatform {
|
|
|
21
23
|
* machine to try updating the Firefox store is basically a nightmare, so we
|
|
22
24
|
* don't even try it - we just bail out to the GUI.
|
|
23
25
|
*/
|
|
24
|
-
addToTrustStores(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
});
|
|
26
|
+
async addToTrustStores(certificatePath, options = {}) {
|
|
27
|
+
// IE, Chrome, system utils
|
|
28
|
+
debug('adding devcert root to Windows OS trust store');
|
|
29
|
+
try {
|
|
30
|
+
(0, utils_1.run)('certutil', ['-addstore', '-user', 'root', certificatePath]);
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
e.output.map((buffer) => {
|
|
34
|
+
if (buffer) {
|
|
35
|
+
console.log(buffer.toString());
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
debug('adding devcert root to Firefox trust store');
|
|
40
|
+
// Firefox (don't even try NSS certutil, no easy install for Windows)
|
|
41
|
+
try {
|
|
42
|
+
await (0, shared_1.openCertificateInFirefox)('start firefox', certificatePath);
|
|
43
|
+
}
|
|
44
|
+
catch (_a) {
|
|
45
|
+
debug('Error opening Firefox, most likely Firefox is not installed');
|
|
46
|
+
}
|
|
47
47
|
}
|
|
48
|
-
removeFromTrustStores(certificatePath) {
|
|
48
|
+
async removeFromTrustStores(certificatePath) {
|
|
49
49
|
debug('removing devcert root from Windows OS trust store');
|
|
50
50
|
try {
|
|
51
51
|
console.warn('Removing old certificates from trust stores. You may be prompted to grant permission for this. It\'s safe to delete old devcert certificates.');
|
|
@@ -55,56 +55,50 @@ class WindowsPlatform {
|
|
|
55
55
|
debug(`failed to remove ${certificatePath} from Windows OS trust store, continuing. ${e.toString()}`);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
-
addDomainToHostFileIfMissing(domain) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
});
|
|
58
|
+
async addDomainToHostFileIfMissing(domain) {
|
|
59
|
+
let hostsFileContents = (0, fs_1.readFileSync)(this.HOST_FILE_PATH, 'utf8');
|
|
60
|
+
if (!hostsFileContents.includes(domain)) {
|
|
61
|
+
await (0, utils_1.sudo)(`echo 127.0.0.1 ${domain} >> ${this.HOST_FILE_PATH}`);
|
|
62
|
+
}
|
|
65
63
|
}
|
|
66
|
-
deleteProtectedFiles(filepath) {
|
|
64
|
+
async deleteProtectedFiles(filepath) {
|
|
67
65
|
(0, shared_1.assertNotTouchingFiles)(filepath, 'delete');
|
|
68
66
|
(0, fs_1.rmSync)(filepath, { force: true, recursive: true });
|
|
69
67
|
}
|
|
70
|
-
readProtectedFile(filepath) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return yield this.readProtectedFile(filepath);
|
|
85
|
-
}
|
|
86
|
-
throw e;
|
|
68
|
+
async readProtectedFile(filepath) {
|
|
69
|
+
(0, shared_1.assertNotTouchingFiles)(filepath, 'read');
|
|
70
|
+
if (!encryptionKey) {
|
|
71
|
+
encryptionKey = await user_interface_1.default.getWindowsEncryptionPassword();
|
|
72
|
+
}
|
|
73
|
+
// Try to decrypt the file
|
|
74
|
+
try {
|
|
75
|
+
return this.decrypt((0, fs_1.readFileSync)(filepath, 'utf8'), encryptionKey);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
// If it's a bad password, clear the cached copy and retry
|
|
79
|
+
if (e.message.indexOf('bad decrypt') >= -1) {
|
|
80
|
+
encryptionKey = null;
|
|
81
|
+
return await this.readProtectedFile(filepath);
|
|
87
82
|
}
|
|
88
|
-
|
|
83
|
+
throw e;
|
|
84
|
+
}
|
|
89
85
|
}
|
|
90
|
-
writeProtectedFile(filepath, contents) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
(0, fs_1.writeFileSync)(filepath, encryptedContents);
|
|
98
|
-
});
|
|
86
|
+
async writeProtectedFile(filepath, contents) {
|
|
87
|
+
(0, shared_1.assertNotTouchingFiles)(filepath, 'write');
|
|
88
|
+
if (!encryptionKey) {
|
|
89
|
+
encryptionKey = await user_interface_1.default.getWindowsEncryptionPassword();
|
|
90
|
+
}
|
|
91
|
+
let encryptedContents = this.encrypt(contents, encryptionKey);
|
|
92
|
+
(0, fs_1.writeFileSync)(filepath, encryptedContents);
|
|
99
93
|
}
|
|
100
94
|
encrypt(text, key) {
|
|
101
|
-
let cipher = crypto_1.default.createCipher('aes256',
|
|
95
|
+
let cipher = crypto_1.default.createCipher('aes256', Buffer.from(key));
|
|
102
96
|
return cipher.update(text, 'utf8', 'hex') + cipher.final('hex');
|
|
103
97
|
}
|
|
104
98
|
decrypt(encrypted, key) {
|
|
105
|
-
let decipher = crypto_1.default.createDecipher('aes256',
|
|
99
|
+
let decipher = crypto_1.default.createDecipher('aes256', Buffer.from(key));
|
|
106
100
|
return decipher.update(encrypted, 'hex', 'utf8') + decipher.final('utf8');
|
|
107
101
|
}
|
|
108
102
|
}
|
|
109
103
|
exports.default = WindowsPlatform;
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luMzIuanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbInBsYXRmb3Jtcy93aW4zMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtEQUFnQztBQUNoQyxvREFBNEI7QUFDNUIsMkJBQWdGO0FBRWhGLHFDQUE0RTtBQUU1RSxvQ0FBcUM7QUFDckMsdUVBQW1DO0FBRW5DLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBVyxFQUFDLDJCQUEyQixDQUFDLENBQUM7QUFFdkQsSUFBSSxhQUFxQixDQUFDO0FBRTFCLE1BQXFCLGVBQWU7SUFBcEM7UUFFVSxtQkFBYyxHQUFHLDRDQUE0QyxDQUFDO0lBMEZ4RSxDQUFDO0lBeEZDOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsZUFBdUIsRUFBRSxVQUFtQixFQUFFO1FBQ25FLDJCQUEyQjtRQUMzQixLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQTtRQUN0RCxJQUFJLENBQUM7WUFDSCxJQUFBLFdBQUcsRUFBQyxVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtnQkFDOUIsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7UUFDbkQscUVBQXFFO1FBQ3JFLElBQUksQ0FBQztZQUNILE1BQU0sSUFBQSxpQ0FBd0IsRUFBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUFDLFdBQU0sQ0FBQztZQUNQLEtB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QUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTyxPQUFPLENBQUMsU0FBaUIsRUFBRSxHQUFXO1FBQzVDLElBQUksUUFBUSxHQUFHLGdCQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBRUY7QUE1RkQsa0NBNEZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyZWF0ZURlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IHJtU3luYyBhcyBybSwgd3JpdGVGaWxlU3luYyBhcyB3cml0ZSwgcmVhZEZpbGVTeW5jIGFzIHJlYWQgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90VG91Y2hpbmdGaWxlcywgb3BlbkNlcnRpZmljYXRlSW5GaXJlZm94IH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICcuJztcbmltcG9ydCB7IHJ1biwgc3VkbyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCBVSSBmcm9tICcuLi91c2VyLWludGVyZmFjZSc7XG5cbmNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWcoJ2RldmNlcnQ6cGxhdGZvcm1zOndpbmRvd3MnKTtcblxubGV0IGVuY3J5cHRpb25LZXk6IHN0cmluZztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2luZG93c1BsYXRmb3JtIGltcGxlbWVudHMgUGxhdGZvcm0ge1xuXG4gIHByaXZhdGUgSE9TVF9GSUxFX1BBVEggPSAnQzpcXFxcV2luZG93c1xcXFxTeXN0ZW0zMlxcXFxEcml2ZXJzXFxcXGV0Y1xcXFxob3N0cyc7XG5cbiAgLyoqXG4gICAqIFdpbmRvd3MgaXMgYXQgbGVhc3Qgc2ltcGxlLiBMaWtlIG1hY09TLCBtb3N0IGFwcGxpY2F0aW9ucyB3aWxsIGRlbGVnYXRlIHRvXG4gICAqIHRoZSBzeXN0ZW0gdHJ1c3Qgc3RvcmUsIHdoaWNoIGlzIHVwZGF0ZWQgd2l0aCB0aGUgY29uZnVzaW5nbHkgbmFtZWRcbiAgICogYGNlcnR1dGlsYCBleGUgKG5vdCB0aGUgc2FtZSBhcyB0aGUgTlNTL01vemlsbGEgY2VydHV0aWwpLiBGaXJlZm94IGRvZXMgaXQnc1xuICAgKiBvd24gdGhpbmcgYXMgdXN1YWwsIGFuZCBnZXR0aW5nIGEgY29weSBvZiBOU1MgY2VydHV0aWwgb250byB0aGUgV2luZG93c1xuICAgKiBtYWNoaW5lIHRvIHRyeSB1cGRhdGluZyB0aGUgRmlyZWZveCBzdG9yZSBpcyBiYXNpY2FsbHkgYSBuaWdodG1hcmUsIHNvIHdlXG4gICAqIGRvbid0IGV2ZW4gdHJ5IGl0IC0gd2UganVzdCBiYWlsIG91dCB0byB0aGUgR1VJLlxuICAgKi9cbiAgYXN5bmMgYWRkVG9UcnVzdFN0b3JlcyhjZXJ0aWZpY2F0ZVBhdGg6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSUUsIENocm9tZSwgc3lzdGVtIHV0aWxzXG4gICAgZGVidWcoJ2FkZGluZyBkZXZjZXJ0IHJvb3QgdG8gV2luZG93cyBPUyB0cnVzdCBzdG9yZScpXG4gICAgdHJ5IHtcbiAgICAgIHJ1bignY2VydHV0aWwnLCBbJy1hZGRzdG9yZScsICctdXNlcicsICdyb290JywgY2VydGlmaWNhdGVQYXRoXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZS5vdXRwdXQubWFwKChidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYnVmZmVyLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgZGVidWcoJ2FkZGluZyBkZXZjZXJ0IHJvb3QgdG8gRmlyZWZveCB0cnVzdCBzdG9yZScpXG4gICAgLy8gRmlyZWZveCAoZG9uJ3QgZXZlbiB0cnkgTlNTIGNlcnR1dGlsLCBubyBlYXN5IGluc3RhbGwgZm9yIFdpbmRvd3MpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG9wZW5DZXJ0aWZpY2F0ZUluRmlyZWZveCgnc3RhcnQgZmlyZWZveCcsIGNlcnRpZmljYXRlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBkZWJ1ZygnRXJyb3Igb3BlbmluZyBGaXJlZm94LCBtb3N0IGxpa2VseSBGaXJlZm94IGlzIG5vdCBpbnN0YWxsZWQnKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIHJlbW92ZUZyb21UcnVzdFN0b3JlcyhjZXJ0aWZpY2F0ZVBhdGg6IHN0cmluZykge1xuICAgIGRlYnVnKCdyZW1vdmluZyBkZXZjZXJ0IHJvb3QgZnJvbSBXaW5kb3dzIE9TIHRydXN0IHN0b3JlJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUud2FybignUmVtb3Zpbmcgb2xkIGNlcnRpZmljYXRlcyBmcm9tIHRydXN0IHN0b3Jlcy4gWW91IG1heSBiZSBwcm9tcHRlZCB0byBncmFudCBwZXJtaXNzaW9uIGZvciB0aGlzLiBJdFxcJ3Mgc2FmZSB0byBkZWxldGUgb2xkIGRldmNlcnQgY2VydGlmaWNhdGVzLicpO1xuICAgICAgcnVuKCdjZXJ0dXRpbCcsIFsnLWRlbHN0b3JlJywgJy11c2VyJywgJ3Jvb3QnLCAnZGV2Y2VydCddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkZWJ1ZyhgZmFpbGVkIHRvIHJlbW92ZSAkeyBjZXJ0aWZpY2F0ZVBhdGggfSBmcm9tIFdpbmRvd3MgT1MgdHJ1c3Qgc3RvcmUsIGNvbnRpbnVpbmcuICR7IGUudG9TdHJpbmcoKSB9YClcbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGREb21haW5Ub0hvc3RGaWxlSWZNaXNzaW5nKGRvbWFpbjogc3RyaW5nKSB7XG4gICAgbGV0IGhvc3RzRmlsZUNvbnRlbnRzID0gcmVhZCh0aGlzLkhPU1RfRklMRV9QQVRILCAndXRmOCcpO1xuICAgIGlmICghaG9zdHNGaWxlQ29udGVudHMuaW5jbHVkZXMoZG9tYWluKSkge1xuICAgICAgYXdhaXQgc3VkbyhgZWNobyAxMjcuMC4wLjEgICR7IGRvbWFpbiB9ID4+ICR7IHRoaXMuSE9TVF9GSUxFX1BBVEggfWApO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZGVsZXRlUHJvdGVjdGVkRmlsZXMoZmlsZXBhdGg6IHN0cmluZykge1xuICAgIGFzc2VydE5vdFRvdWNoaW5nRmlsZXMoZmlsZXBhdGgsICdkZWxldGUnKTtcbiAgICBybShmaWxlcGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVhZFByb3RlY3RlZEZpbGUoZmlsZXBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXNzZXJ0Tm90VG91Y2hpbmdGaWxlcyhmaWxlcGF0aCwgJ3JlYWQnKTtcbiAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHtcbiAgICAgIGVuY3J5cHRpb25LZXkgPSBhd2FpdCBVSS5nZXRXaW5kb3dzRW5jcnlwdGlvblBhc3N3b3JkKCk7XG4gICAgfVxuICAgIC8vIFRyeSB0byBkZWNyeXB0IHRoZSBmaWxlXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmRlY3J5cHQocmVhZChmaWxlcGF0aCwgJ3V0ZjgnKSwgZW5jcnlwdGlvbktleSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgaXQncyBhIGJhZCBwYXNzd29yZCwgY2xlYXIgdGhlIGNhY2hlZCBjb3B5IGFuZCByZXRyeVxuICAgICAgaWYgKGUubWVzc2FnZS5pbmRleE9mKCdiYWQgZGVjcnlwdCcpID49IC0xKSB7XG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBudWxsO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWFkUHJvdGVjdGVkRmlsZShmaWxlcGF0aCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHdyaXRlUHJvdGVjdGVkRmlsZShmaWxlcGF0aDogc3RyaW5nLCBjb250ZW50czogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90VG91Y2hpbmdGaWxlcyhmaWxlcGF0aCwgJ3dyaXRlJyk7XG4gICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7XG4gICAgICBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgVUkuZ2V0V2luZG93c0VuY3J5cHRpb25QYXNzd29yZCgpO1xuICAgIH1cbiAgICBsZXQgZW5jcnlwdGVkQ29udGVudHMgPSB0aGlzLmVuY3J5cHQoY29udGVudHMsIGVuY3J5cHRpb25LZXkpO1xuICAgIHdyaXRlKGZpbGVwYXRoLCBlbmNyeXB0ZWRDb250ZW50cyk7XG4gIH1cblxuICBwcml2YXRlIGVuY3J5cHQodGV4dDogc3RyaW5nLCBrZXk6IHN0cmluZykge1xuICAgIGxldCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyKCdhZXMyNTYnLCBCdWZmZXIuZnJvbShrZXkpKTtcbiAgICByZXR1cm4gY2lwaGVyLnVwZGF0ZSh0ZXh0LCAndXRmOCcsICdoZXgnKSArIGNpcGhlci5maW5hbCgnaGV4Jyk7XG4gIH1cblxuICBwcml2YXRlIGRlY3J5cHQoZW5jcnlwdGVkOiBzdHJpbmcsIGtleTogc3RyaW5nKSB7XG4gICAgbGV0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyKCdhZXMyNTYnLCBCdWZmZXIuZnJvbShrZXkpKTtcbiAgICByZXR1cm4gZGVjaXBoZXIudXBkYXRlKGVuY3J5cHRlZCwgJ2hleCcsICd1dGY4JykgKyBkZWNpcGhlci5maW5hbCgndXRmOCcpO1xuICB9XG5cbn1cbiJdfQ==
|
package/dist/user-interface.js
CHANGED
|
@@ -1,33 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
const password_prompt_1 = tslib_1.__importDefault(require("password-prompt"));
|
|
6
|
+
const node_readline_1 = __importDefault(require("node:readline"));
|
|
5
7
|
const utils_1 = require("./utils");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
async function passwordPrompt(prompt) {
|
|
9
|
+
const input = node_readline_1.default.createInterface({
|
|
10
|
+
input: process.stdin,
|
|
11
|
+
output: process.stdout,
|
|
12
|
+
});
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
input.on('SIGINT', () => {
|
|
15
|
+
reject(new Error('SIGINT'));
|
|
16
|
+
});
|
|
17
|
+
input.question(prompt, (answer) => {
|
|
18
|
+
node_readline_1.default.moveCursor(process.stdout, 0, -1);
|
|
19
|
+
node_readline_1.default.clearLine(process.stdout, 0);
|
|
20
|
+
input.write(prompt + answer.replace(/./g, '*') + '\n');
|
|
21
|
+
input.close();
|
|
22
|
+
resolve(answer);
|
|
10
23
|
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
const DefaultUI = {
|
|
27
|
+
async getWindowsEncryptionPassword() {
|
|
28
|
+
return await passwordPrompt('devcert password (http://bit.ly/devcert-what-password?):');
|
|
11
29
|
},
|
|
12
|
-
warnChromeOnLinuxWithoutCertutil() {
|
|
13
|
-
|
|
14
|
-
console.warn(`
|
|
30
|
+
async warnChromeOnLinuxWithoutCertutil() {
|
|
31
|
+
console.warn(`
|
|
15
32
|
WARNING: It looks like you have Chrome installed, but you specified
|
|
16
33
|
'skipCertutilInstall: true'. Unfortunately, without installing
|
|
17
34
|
certutil, it's impossible get Chrome to trust devcert's certificates
|
|
18
35
|
The certificates will work, but Chrome will continue to warn you that
|
|
19
36
|
they are untrusted.
|
|
20
37
|
`);
|
|
21
|
-
});
|
|
22
38
|
},
|
|
23
|
-
closeFirefoxBeforeContinuing() {
|
|
24
|
-
|
|
25
|
-
console.log('Please close Firefox before continuing');
|
|
26
|
-
});
|
|
39
|
+
async closeFirefoxBeforeContinuing() {
|
|
40
|
+
console.log('Please close Firefox before continuing');
|
|
27
41
|
},
|
|
28
|
-
startFirefoxWizard(certificateHost) {
|
|
29
|
-
|
|
30
|
-
console.log(`
|
|
42
|
+
async startFirefoxWizard(certificateHost) {
|
|
43
|
+
console.log(`
|
|
31
44
|
devcert was unable to automatically configure Firefox. You'll need to
|
|
32
45
|
complete this process manually. Don't worry though - Firefox will walk
|
|
33
46
|
you through it.
|
|
@@ -44,23 +57,19 @@ const DefaultUI = {
|
|
|
44
57
|
|
|
45
58
|
<Press any key to launch Firefox wizard>
|
|
46
59
|
`);
|
|
47
|
-
|
|
48
|
-
});
|
|
60
|
+
await (0, utils_1.waitForUser)();
|
|
49
61
|
},
|
|
50
|
-
firefoxWizardPromptPage(certificateURL) {
|
|
51
|
-
return
|
|
52
|
-
return `
|
|
62
|
+
async firefoxWizardPromptPage(certificateURL) {
|
|
63
|
+
return `
|
|
53
64
|
<html>
|
|
54
65
|
<head>
|
|
55
66
|
<meta http-equiv="refresh" content="0; url=${certificateURL}" />
|
|
56
67
|
</head>
|
|
57
68
|
</html>
|
|
58
69
|
`;
|
|
59
|
-
});
|
|
60
70
|
},
|
|
61
|
-
waitForFirefoxWizard() {
|
|
62
|
-
|
|
63
|
-
console.log(`
|
|
71
|
+
async waitForFirefoxWizard() {
|
|
72
|
+
console.log(`
|
|
64
73
|
Launching Firefox ...
|
|
65
74
|
|
|
66
75
|
Great! Once you've finished the Firefox wizard for adding the devcert
|
|
@@ -68,9 +77,8 @@ const DefaultUI = {
|
|
|
68
77
|
|
|
69
78
|
<Press any key to continue>
|
|
70
79
|
`);
|
|
71
|
-
|
|
72
|
-
});
|
|
80
|
+
await (0, utils_1.waitForUser)();
|
|
73
81
|
}
|
|
74
82
|
};
|
|
75
83
|
exports.default = DefaultUI;
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbInVzZXItaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0VBQXFDO0FBQ3JDLG1DQUFzQztBQVd0QyxLQUFLLFVBQVUsY0FBYyxDQUFDLE1BQWM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsdUJBQVEsQ0FBQyxlQUFlLENBQUM7UUFDckMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUN0QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDaEMsdUJBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyx1QkFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFrQjtJQUMvQixLQUFLLENBQUMsNEJBQTRCO1FBQ2hDLE9BQU8sTUFBTSxjQUFjLENBQUMsMERBQTBELENBQUMsQ0FBQztJQUMxRixDQUFDO0lBQ0QsS0FBSyxDQUFDLGdDQUFnQztRQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDOzs7Ozs7S0FNWixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsS0FBSyxDQUFDLDRCQUE0QjtRQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlO1FBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUM7Ozs7Ozs7Ozs7UUFVUCxlQUFnQjs7Ozs7O0tBTXBCLENBQUMsQ0FBQztRQUNILE1BQU0sSUFBQSxtQkFBVyxHQUFFLENBQUM7SUFDdEIsQ0FBQztJQUNELEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxjQUFzQjtRQUNsRCxPQUFPOzs7dURBRzRDLGNBQWM7OztLQUdoRSxDQUFDO0lBQ0osQ0FBQztJQUNELEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7Ozs7OztLQU9YLENBQUMsQ0FBQTtRQUNGLE1BQU0sSUFBQSxtQkFBVyxHQUFFLENBQUM7SUFDdEIsQ0FBQztDQUNGLENBQUE7QUFFRCxrQkFBZSxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZSc7XG5pbXBvcnQgeyB3YWl0Rm9yVXNlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJbnRlcmZhY2Uge1xuICBnZXRXaW5kb3dzRW5jcnlwdGlvblBhc3N3b3JkKCk6IFByb21pc2U8c3RyaW5nPjtcbiAgd2FybkNocm9tZU9uTGludXhXaXRob3V0Q2VydHV0aWwoKTogUHJvbWlzZTx2b2lkPjtcbiAgY2xvc2VGaXJlZm94QmVmb3JlQ29udGludWluZygpOiBQcm9taXNlPHZvaWQ+O1xuICBzdGFydEZpcmVmb3hXaXphcmQoY2VydGlmaWNhdGVIb3N0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBmaXJlZm94V2l6YXJkUHJvbXB0UGFnZShjZXJ0aWZpY2F0ZVVSTDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICB3YWl0Rm9yRmlyZWZveFdpemFyZCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwYXNzd29yZFByb21wdChwcm9tcHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGlucHV0ID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpbnB1dC5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcignU0lHSU5UJykpO1xuICAgIH0pO1xuICAgIGlucHV0LnF1ZXN0aW9uKHByb21wdCwgKGFuc3dlcikgPT4ge1xuICAgICAgcmVhZGxpbmUubW92ZUN1cnNvcihwcm9jZXNzLnN0ZG91dCwgMCwgLTEpO1xuICAgICAgcmVhZGxpbmUuY2xlYXJMaW5lKHByb2Nlc3Muc3Rkb3V0LCAwKTtcbiAgICAgIGlucHV0LndyaXRlKHByb21wdCArIGFuc3dlci5yZXBsYWNlKC8uL2csICcqJykgKyAnXFxuJyk7XG4gICAgICBpbnB1dC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3QgRGVmYXVsdFVJOiBVc2VySW50ZXJmYWNlID0ge1xuICBhc3luYyBnZXRXaW5kb3dzRW5jcnlwdGlvblBhc3N3b3JkKCkge1xuICAgIHJldHVybiBhd2FpdCBwYXNzd29yZFByb21wdCgnZGV2Y2VydCBwYXNzd29yZCAoaHR0cDovL2JpdC5seS9kZXZjZXJ0LXdoYXQtcGFzc3dvcmQ/KTonKTtcbiAgfSxcbiAgYXN5bmMgd2FybkNocm9tZU9uTGludXhXaXRob3V0Q2VydHV0aWwoKSB7XG4gICAgY29uc29sZS53YXJuKGBcbiAgICAgIFdBUk5JTkc6IEl0IGxvb2tzIGxpa2UgeW91IGhhdmUgQ2hyb21lIGluc3RhbGxlZCwgYnV0IHlvdSBzcGVjaWZpZWRcbiAgICAgICdza2lwQ2VydHV0aWxJbnN0YWxsOiB0cnVlJy4gVW5mb3J0dW5hdGVseSwgd2l0aG91dCBpbnN0YWxsaW5nXG4gICAgICBjZXJ0dXRpbCwgaXQncyBpbXBvc3NpYmxlIGdldCBDaHJvbWUgdG8gdHJ1c3QgZGV2Y2VydCdzIGNlcnRpZmljYXRlc1xuICAgICAgVGhlIGNlcnRpZmljYXRlcyB3aWxsIHdvcmssIGJ1dCBDaHJvbWUgd2lsbCBjb250aW51ZSB0byB3YXJuIHlvdSB0aGF0XG4gICAgICB0aGV5IGFyZSB1bnRydXN0ZWQuXG4gICAgYCk7XG4gIH0sXG4gIGFzeW5jIGNsb3NlRmlyZWZveEJlZm9yZUNvbnRpbnVpbmcoKSB7XG4gICAgY29uc29sZS5sb2coJ1BsZWFzZSBjbG9zZSBGaXJlZm94IGJlZm9yZSBjb250aW51aW5nJyk7XG4gIH0sXG4gIGFzeW5jIHN0YXJ0RmlyZWZveFdpemFyZChjZXJ0aWZpY2F0ZUhvc3QpIHtcbiAgICBjb25zb2xlLmxvZyhgXG4gICAgICBkZXZjZXJ0IHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSBjb25maWd1cmUgRmlyZWZveC4gWW91J2xsIG5lZWQgdG9cbiAgICAgIGNvbXBsZXRlIHRoaXMgcHJvY2VzcyBtYW51YWxseS4gRG9uJ3Qgd29ycnkgdGhvdWdoIC0gRmlyZWZveCB3aWxsIHdhbGtcbiAgICAgIHlvdSB0aHJvdWdoIGl0LlxuXG4gICAgICBXaGVuIHlvdSdyZSByZWFkeSwgaGl0IGFueSBrZXkgdG8gY29udGludWUuIEZpcmVmb3ggd2lsbCBsYXVuY2ggYW5kXG4gICAgICBkaXNwbGF5IGEgd2l6YXJkIHRvIHdhbGsgeW91IHRocm91Z2ggaG93IHRvIHRydXN0IHRoZSBkZXZjZXJ0XG4gICAgICBjZXJ0aWZpY2F0ZS4gV2hlbiB5b3UgYXJlIGZpbmlzaGVkLCBjb21lIGJhY2sgaGVyZSBhbmQgd2UnbGwgZmluaXNoIHVwLlxuXG4gICAgICAoSWYgRmlyZWZveCBkb2Vzbid0IHN0YXJ0LCBnbyBhaGVhZCBhbmQgc3RhcnQgaXQgYW5kIG5hdmlnYXRlIHRvXG4gICAgICAkeyBjZXJ0aWZpY2F0ZUhvc3QgfSBpbiBhIG5ldyB0YWIuKVxuXG4gICAgICBJZiB5b3UgYXJlIGN1cmlvdXMgYWJvdXQgd2h5IGFsbCB0aGlzIGlzIG5lY2Vzc2FyeSwgY2hlY2sgb3V0XG4gICAgICBodHRwczovL2dpdGh1Yi5jb20vZGF2ZXdhc21lci9kZXZjZXJ0I2hvdy1pdC13b3Jrc1xuXG4gICAgICA8UHJlc3MgYW55IGtleSB0byBsYXVuY2ggRmlyZWZveCB3aXphcmQ+XG4gICAgYCk7XG4gICAgYXdhaXQgd2FpdEZvclVzZXIoKTtcbiAgfSxcbiAgYXN5bmMgZmlyZWZveFdpemFyZFByb21wdFBhZ2UoY2VydGlmaWNhdGVVUkw6IHN0cmluZykge1xuICAgIHJldHVybiBgXG4gICAgICA8aHRtbD5cbiAgICAgICAgPGhlYWQ+XG4gICAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj1cInJlZnJlc2hcIiBjb250ZW50PVwiMDsgdXJsPSR7Y2VydGlmaWNhdGVVUkx9XCIgLz5cbiAgICAgICAgPC9oZWFkPlxuICAgICAgPC9odG1sPlxuICAgIGA7XG4gIH0sXG4gIGFzeW5jIHdhaXRGb3JGaXJlZm94V2l6YXJkKCkge1xuICAgIGNvbnNvbGUubG9nKGBcbiAgICAgIExhdW5jaGluZyBGaXJlZm94IC4uLlxuXG4gICAgICBHcmVhdCEgT25jZSB5b3UndmUgZmluaXNoZWQgdGhlIEZpcmVmb3ggd2l6YXJkIGZvciBhZGRpbmcgdGhlIGRldmNlcnRcbiAgICAgIGNlcnRpZmljYXRlLCBqdXN0IGhpdCBhbnkga2V5IGhlcmUgYWdhaW4gYW5kIHdlJ2xsIHdyYXAgdXAuXG5cbiAgICAgIDxQcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlPlxuICAgIGApXG4gICAgYXdhaXQgd2FpdEZvclVzZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEZWZhdWx0VUk7XG4iXX0=
|
package/dist/utils.d.ts
CHANGED
|
@@ -6,3 +6,4 @@ export declare function waitForUser(): Promise<unknown>;
|
|
|
6
6
|
export declare function reportableError(message: string): Error;
|
|
7
7
|
export declare function mktmp(): string;
|
|
8
8
|
export declare function sudo(cmd: string): Promise<string | null>;
|
|
9
|
+
export declare function commandExists(command: string): string | null;
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.openssl = openssl;
|
|
4
7
|
exports.run = run;
|
|
@@ -7,12 +10,14 @@ exports.waitForUser = waitForUser;
|
|
|
7
10
|
exports.reportableError = reportableError;
|
|
8
11
|
exports.mktmp = mktmp;
|
|
9
12
|
exports.sudo = sudo;
|
|
10
|
-
|
|
13
|
+
exports.commandExists = commandExists;
|
|
11
14
|
const child_process_1 = require("child_process");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
15
|
+
const crypto_1 = require("crypto");
|
|
16
|
+
const fs_1 = __importDefault(require("fs"));
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
18
|
+
const debug_1 = __importDefault(require("debug"));
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const sudo_prompt_1 = __importDefault(require("@expo/sudo-prompt"));
|
|
16
21
|
const constants_1 = require("./constants");
|
|
17
22
|
const debug = (0, debug_1.default)('devcert:util');
|
|
18
23
|
function openssl(args) {
|
|
@@ -42,9 +47,10 @@ function reportableError(message) {
|
|
|
42
47
|
return new Error(`${message} | This is a bug in devcert, please report the issue at https://github.com/davewasmer/devcert/issues`);
|
|
43
48
|
}
|
|
44
49
|
function mktmp() {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
const random = (0, crypto_1.randomBytes)(6).toString('hex');
|
|
51
|
+
const tmppath = path_1.default.join(os_1.default.tmpdir(), `tmp-${process.pid}${random}`);
|
|
52
|
+
fs_1.default.closeSync(fs_1.default.openSync(tmppath, 'w'));
|
|
53
|
+
return tmppath;
|
|
48
54
|
}
|
|
49
55
|
function sudo(cmd) {
|
|
50
56
|
return new Promise((resolve, reject) => {
|
|
@@ -54,4 +60,23 @@ function sudo(cmd) {
|
|
|
54
60
|
});
|
|
55
61
|
});
|
|
56
62
|
}
|
|
57
|
-
|
|
63
|
+
const _commands = {};
|
|
64
|
+
function commandExists(command) {
|
|
65
|
+
if (_commands[command] !== undefined) {
|
|
66
|
+
return _commands[command];
|
|
67
|
+
}
|
|
68
|
+
const paths = process.env[constants_1.isWindows ? 'Path' : 'PATH'].split(path_1.default.delimiter);
|
|
69
|
+
const extensions = [...(process.env.PATHEXT || '').split(path_1.default.delimiter), ''];
|
|
70
|
+
for (const dir of paths) {
|
|
71
|
+
for (const extension of extensions) {
|
|
72
|
+
const filePath = path_1.default.join(dir, command + extension);
|
|
73
|
+
try {
|
|
74
|
+
fs_1.default.accessSync(filePath, fs_1.default.constants.X_OK);
|
|
75
|
+
return (_commands[command] = filePath);
|
|
76
|
+
}
|
|
77
|
+
catch (_a) { }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return (_commands[command] = null);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbInV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBWUEsMEJBT0M7QUFFRCxrQkFHQztBQUVELGdDQUlDO0FBRUQsa0NBS0M7QUFFRCwwQ0FFQztBQUVELHNCQUtDO0FBRUQsb0JBT0M7QUFJRCxzQ0FnQkM7QUE3RUQsaURBQWtFO0FBQ2xFLG1DQUFxQztBQUNyQyw0Q0FBb0I7QUFDcEIsNENBQW9CO0FBQ3BCLGtEQUFnQztBQUNoQyxnREFBd0I7QUFDeEIsb0VBQTJDO0FBRTNDLDJDQUFvRDtBQUVwRCxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVcsRUFBQyxjQUFjLENBQUMsQ0FBQztBQUUxQyxTQUFnQixPQUFPLENBQUMsSUFBYztJQUNwQyxPQUFPLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFO1FBQzFCLEtBQUssRUFBRSxNQUFNO1FBQ2IsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDakIsUUFBUSxFQUFFLGNBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxzQkFBVSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQztLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBZ0IsR0FBRyxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsVUFBK0IsRUFBRTtJQUNoRixLQUFLLENBQUMsbUJBQW9CLEdBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RCxPQUFPLElBQUEsNEJBQVksRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxTQUFnQixVQUFVLENBQUMsSUFBWSxFQUFFLEtBQW1DO0lBQzFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO1FB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LEdBQUcsUUFBUSxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUFDLFdBQU0sQ0FBQyxDQUFBLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNGaWxlU3luYywgRXhlY0ZpbGVTeW5jT3B0aW9ucyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgY3JlYXRlRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc3Vkb1Byb21wdCBmcm9tICdAZXhwby9zdWRvLXByb21wdCc7XG5cbmltcG9ydCB7IGNvbmZpZ1BhdGgsIGlzV2luZG93cyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgZGVidWcgPSBjcmVhdGVEZWJ1ZygnZGV2Y2VydDp1dGlsJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBvcGVuc3NsKGFyZ3M6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBydW4oJ29wZW5zc2wnLCBhcmdzLCB7XG4gICAgc3RkaW86ICdwaXBlJyxcbiAgICBlbnY6IE9iamVjdC5hc3NpZ24oe1xuICAgICAgUkFOREZJTEU6IHBhdGguam9pbihjb25maWdQYXRoKCcucm5kJykpXG4gICAgfSwgcHJvY2Vzcy5lbnYpXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuKGNtZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogRXhlY0ZpbGVTeW5jT3B0aW9ucyA9IHt9KSB7XG4gIGRlYnVnKGBleGVjRmlsZVN5bmM6IFxcYCR7IGNtZCB9ICR7YXJncy5qb2luKCcgJyl9XFxgYCk7XG4gIHJldHVybiBleGVjRmlsZVN5bmMoY21kLCBhcmdzLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1ZG9BcHBlbmQoZmlsZTogc3RyaW5nLCBpbnB1dDogRXhlY0ZpbGVTeW5jT3B0aW9uc1tcImlucHV0XCJdKSB7XG4gIHJ1bignc3VkbycsIFsndGVlJywgJy1hJywgZmlsZV0sIHtcbiAgICBpbnB1dFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhaXRGb3JVc2VyKCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBwcm9jZXNzLnN0ZGluLnJlc3VtZSgpO1xuICAgIHByb2Nlc3Muc3RkaW4ub24oJ2RhdGEnLCByZXNvbHZlKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRhYmxlRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gIHJldHVybiBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gfCBUaGlzIGlzIGEgYnVnIGluIGRldmNlcnQsIHBsZWFzZSByZXBvcnQgdGhlIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZld2FzbWVyL2RldmNlcnQvaXNzdWVzYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBta3RtcCgpIHtcbiAgY29uc3QgcmFuZG9tID0gcmFuZG9tQnl0ZXMoNikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCB0bXBwYXRoID0gcGF0aC5qb2luKG9zLnRtcGRpcigpLCBgdG1wLSR7cHJvY2Vzcy5waWR9JHtyYW5kb219YCk7XG4gIGZzLmNsb3NlU3luYyhmcy5vcGVuU3luYyh0bXBwYXRoLCAndycpKTtcbiAgcmV0dXJuIHRtcHBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWRvKGNtZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc3Vkb1Byb21wdC5leGVjKGNtZCwgeyBuYW1lOiAnZGV2Y2VydCcgfSwgKGVycjogRXJyb3IgfCBudWxsLCBzdGRvdXQ6IHN0cmluZyB8IG51bGwsIHN0ZGVycjogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgbGV0IGVycm9yID0gZXJyIHx8ICh0eXBlb2Ygc3RkZXJyID09PSAnc3RyaW5nJyAmJiBzdGRlcnIudHJpbSgpLmxlbmd0aCA+IDAgJiYgbmV3IEVycm9yKHN0ZGVycikpIDtcbiAgICAgIGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNvbnN0IF9jb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmRFeGlzdHMoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChfY29tbWFuZHNbY29tbWFuZF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBfY29tbWFuZHNbY29tbWFuZF07XG4gIH1cbiAgY29uc3QgcGF0aHMgPSBwcm9jZXNzLmVudltpc1dpbmRvd3MgPyAnUGF0aCcgOiAnUEFUSCddLnNwbGl0KHBhdGguZGVsaW1pdGVyKTtcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsuLi4ocHJvY2Vzcy5lbnYuUEFUSEVYVCB8fCAnJykuc3BsaXQocGF0aC5kZWxpbWl0ZXIpLCAnJ107XG4gIGZvciAoY29uc3QgZGlyIG9mIHBhdGhzKSB7XG4gICAgZm9yIChjb25zdCBleHRlbnNpb24gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBjb21tYW5kICsgZXh0ZW5zaW9uKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzLmFjY2Vzc1N5bmMoZmlsZVBhdGgsIGZzLmNvbnN0YW50cy5YX09LKTtcbiAgICAgICAgcmV0dXJuIChfY29tbWFuZHNbY29tbWFuZF0gPSBmaWxlUGF0aCk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICB9XG4gIHJldHVybiAoX2NvbW1hbmRzW2NvbW1hbmRdID0gbnVsbCk7XG59XG4iXX0=
|
|
@@ -13,7 +13,7 @@ distinguished_name = req_distinguished_name
|
|
|
13
13
|
req_extensions = req_extensions
|
|
14
14
|
|
|
15
15
|
[ req_distinguished_name ]
|
|
16
|
-
CN =
|
|
16
|
+
CN = %DOMAIN%
|
|
17
17
|
|
|
18
18
|
[ req_extensions ]
|
|
19
19
|
basicConstraints = CA:FALSE
|
|
@@ -21,5 +21,5 @@ subjectAltName = @subject_alt_names
|
|
|
21
21
|
subjectKeyIdentifier = hash
|
|
22
22
|
|
|
23
23
|
[ subject_alt_names ]
|
|
24
|
-
DNS.1 =
|
|
25
|
-
DNS.2 =
|
|
24
|
+
DNS.1 = %DOMAIN%
|
|
25
|
+
DNS.2 = *.%DOMAIN%
|
|
@@ -3,11 +3,11 @@ default_ca = devcert_ca
|
|
|
3
3
|
|
|
4
4
|
[ devcert_ca ]
|
|
5
5
|
# Serial file that counts up unique IDs for each cert issued
|
|
6
|
-
serial =
|
|
6
|
+
serial = %SERIALFILE%
|
|
7
7
|
# Database file that tracks all issued certs
|
|
8
|
-
database =
|
|
8
|
+
database = %DATABASEFILE%
|
|
9
9
|
# Where to put the new cert
|
|
10
|
-
new_certs_dir =
|
|
10
|
+
new_certs_dir = %DOMAINDIR%
|
|
11
11
|
# Which algorithm to use
|
|
12
12
|
default_md = sha256
|
|
13
13
|
# Don't prompt the TTY for input, just use the config file values
|
|
@@ -35,5 +35,5 @@ extendedKeyUsage = serverAuth
|
|
|
35
35
|
subjectAltName = @subject_alt_names
|
|
36
36
|
|
|
37
37
|
[ subject_alt_names ]
|
|
38
|
-
DNS.1 =
|
|
39
|
-
DNS.2 =
|
|
38
|
+
DNS.1 = %DOMAIN%
|
|
39
|
+
DNS.2 = *.%DOMAIN%
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/devcert",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Generate trusted local SSL/TLS certificates for local SSL development",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -28,26 +28,12 @@
|
|
|
28
28
|
"homepage": "https://github.com/expo/devcert#readme",
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@types/debug": "^0.0.30",
|
|
31
|
-
"@types/get-port": "^3.2.0",
|
|
32
|
-
"@types/lodash": "^4.14.92",
|
|
33
|
-
"@types/mkdirp": "^0.5.2",
|
|
34
31
|
"@types/node": "^20.12.7",
|
|
35
|
-
"@types/tmp": "^0.0.33",
|
|
36
32
|
"standard-version": "^8.0.1",
|
|
37
33
|
"typescript": "^5.1.3"
|
|
38
34
|
},
|
|
39
35
|
"dependencies": {
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"debug": "^3.1.0",
|
|
43
|
-
"eol": "^0.9.1",
|
|
44
|
-
"get-port": "^3.2.0",
|
|
45
|
-
"glob": "^10.4.2",
|
|
46
|
-
"lodash": "^4.17.21",
|
|
47
|
-
"mkdirp": "^0.5.1",
|
|
48
|
-
"password-prompt": "^1.0.4",
|
|
49
|
-
"sudo-prompt": "^8.2.0",
|
|
50
|
-
"tmp": "^0.0.33",
|
|
51
|
-
"tslib": "^2.4.0"
|
|
36
|
+
"@expo/sudo-prompt": "^9.3.1",
|
|
37
|
+
"debug": "^3.1.0"
|
|
52
38
|
}
|
|
53
39
|
}
|
|
@@ -110,16 +110,16 @@ export async function ensureCACertReadable(options: Options = {}): Promise<void>
|
|
|
110
110
|
*/
|
|
111
111
|
try {
|
|
112
112
|
const caFileContents = await currentPlatform.readProtectedFile(rootCACertPath);
|
|
113
|
-
currentPlatform.deleteProtectedFiles(rootCACertPath);
|
|
113
|
+
await currentPlatform.deleteProtectedFiles(rootCACertPath);
|
|
114
114
|
writeFile(rootCACertPath, caFileContents);
|
|
115
115
|
} catch (e) {
|
|
116
|
-
return installCertificateAuthority(options);
|
|
116
|
+
return await installCertificateAuthority(options);
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
// double check that we have a live one
|
|
120
120
|
const remainingErrors = certErrors();
|
|
121
121
|
if (remainingErrors) {
|
|
122
|
-
return installCertificateAuthority(options);
|
|
122
|
+
return await installCertificateAuthority(options);
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -136,9 +136,9 @@ export async function ensureCACertReadable(options: Options = {}): Promise<void>
|
|
|
136
136
|
* silently fail that as well; with no existing certificates anymore, the
|
|
137
137
|
* security exposure there is minimal.
|
|
138
138
|
*/
|
|
139
|
-
export function uninstall(): void {
|
|
140
|
-
currentPlatform.removeFromTrustStores(rootCACertPath);
|
|
141
|
-
currentPlatform.deleteProtectedFiles(domainsDir);
|
|
142
|
-
currentPlatform.deleteProtectedFiles(rootCADir);
|
|
143
|
-
currentPlatform.deleteProtectedFiles(getLegacyConfigDir());
|
|
144
|
-
}
|
|
139
|
+
export async function uninstall(): Promise<void> {
|
|
140
|
+
await currentPlatform.removeFromTrustStores(rootCACertPath);
|
|
141
|
+
await currentPlatform.deleteProtectedFiles(domainsDir);
|
|
142
|
+
await currentPlatform.deleteProtectedFiles(rootCADir);
|
|
143
|
+
await currentPlatform.deleteProtectedFiles(getLegacyConfigDir());
|
|
144
|
+
}
|
package/src/certificates.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// import path from 'path';
|
|
2
2
|
import createDebug from 'debug';
|
|
3
|
-
import
|
|
4
|
-
import { chmodSync as chmod } from 'fs';
|
|
3
|
+
import fs from 'fs';
|
|
5
4
|
import { pathForDomain, withDomainSigningRequestConfig, withDomainCertificateConfig } from './constants';
|
|
6
5
|
import { openssl } from './utils';
|
|
7
6
|
import { withCertificateAuthorityCredentials } from './certificate-authority';
|
|
@@ -16,7 +15,7 @@ const debug = createDebug('devcert:certificates');
|
|
|
16
15
|
* added to the OS/browser trust stores), they are trusted.
|
|
17
16
|
*/
|
|
18
17
|
export default async function generateDomainCertificate(domain: string): Promise<void> {
|
|
19
|
-
|
|
18
|
+
await fs.promises.mkdir(pathForDomain(domain), { recursive: true });
|
|
20
19
|
|
|
21
20
|
debug(`Generating private key for ${ domain }`);
|
|
22
21
|
let domainKeyPath = pathForDomain(domain, 'private-key.key');
|
|
@@ -42,5 +41,5 @@ export default async function generateDomainCertificate(domain: string): Promise
|
|
|
42
41
|
export function generateKey(filename: string): void {
|
|
43
42
|
debug(`generateKey: ${ filename }`);
|
|
44
43
|
openssl(['genrsa', '-out', filename, '2048']);
|
|
45
|
-
|
|
46
|
-
}
|
|
44
|
+
fs.chmodSync(filename, 400);
|
|
45
|
+
}
|