Small refactors in CertificateProvider

Summary:
- Remove `fs` dependency in favour of `fs-extra`.
- Replaced `Sync` variants with async wherever possible.
- Removed some unnecessary Promise constructions.

Reviewed By: timur-valiev

Differential Revision: D30411434

fbshipit-source-id: 9faebbc1f9fb2283fec895ce3397918bc85a6c51
This commit is contained in:
Pascal Hartig
2021-08-20 03:51:33 -07:00
committed by Facebook GitHub Bot
parent a2644b4a2e
commit f60429cab5

View File

@@ -187,7 +187,7 @@ export default class CertificateProvider {
.then(async (deviceId) => { .then(async (deviceId) => {
if (medium === 'WWW') { if (medium === 'WWW') {
const zipPromise = new Promise((resolve, reject) => { const zipPromise = new Promise((resolve, reject) => {
const output = fs.createWriteStream(certsZipPath); const output = fsExtra.createWriteStream(certsZipPath);
const archive = archiver('zip', { const archive = archiver('zip', {
zlib: {level: 9}, // Sets the compression level. zlib: {level: 9}, // Sets the compression level.
}); });
@@ -292,13 +292,11 @@ export default class CertificateProvider {
if (!certPathExists) { if (!certPathExists) {
await fsExtra.mkdir(certFolder); await fsExtra.mkdir(certFolder);
} }
return promisify(fs.writeFile)(certFolder + filename, contents).catch( return fsExtra.writeFile(certFolder + filename, contents).catch((e) => {
(e) => {
throw new Error( throw new Error(
`Failed to write ${filename} to temporary folder. Error: ${e}`, `Failed to write ${filename} to temporary folder. Error: ${e}`,
); );
}, });
);
} }
if (os === 'Android') { if (os === 'Android') {
@@ -317,8 +315,9 @@ export default class CertificateProvider {
); );
} }
if (os === 'iOS' || os === 'windows' || os == 'MacOS') { if (os === 'iOS' || os === 'windows' || os == 'MacOS') {
return promisify(fs.writeFile)(destination + filename, contents).catch( return fsExtra
async (err) => { .writeFile(destination + filename, contents)
.catch(async (err) => {
if (os === 'iOS') { if (os === 'iOS') {
// Writing directly to FS failed. It's probably a physical device. // Writing directly to FS failed. It's probably a physical device.
const relativePathInsideApp = const relativePathInsideApp =
@@ -341,31 +340,28 @@ export default class CertificateProvider {
`Invalid appDirectory recieved from ${os} device: ${destination}: ` + `Invalid appDirectory recieved from ${os} device: ${destination}: ` +
err.toString(), err.toString(),
); );
}, });
);
} }
return Promise.reject(new Error(`Unsupported device os: ${os}`)); return Promise.reject(new Error(`Unsupported device os: ${os}`));
} }
private pushFileToiOSDevice( private async pushFileToiOSDevice(
udid: string, udid: string,
bundleId: string, bundleId: string,
destination: string, destination: string,
filename: string, filename: string,
contents: string, contents: string,
): Promise<void> { ): Promise<void> {
return tmpDir({unsafeCleanup: true}).then((dir) => { const dir = await tmpDir({unsafeCleanup: true});
const filePath = path.resolve(dir, filename); const filePath = path.resolve(dir, filename);
promisify(fs.writeFile)(filePath, contents).then(() => await fsExtra.writeFile(filePath, contents);
iosUtil.push( return await iosUtil.push(
udid, udid,
filePath, filePath,
bundleId, bundleId,
destination, destination,
this.config.idbPath, this.config.idbPath,
),
); );
});
} }
private getTargetAndroidDeviceId( private getTargetAndroidDeviceId(
@@ -512,7 +508,8 @@ export default class CertificateProvider {
.then(() => dir); .then(() => dir);
}) })
.then((dir) => { .then((dir) => {
return promisify(fs.readdir)(dir) return fsExtra
.readdir(dir)
.then((items) => { .then((items) => {
if (items.length > 1) { if (items.length > 1) {
throw new Error('Conflict in temp dir'); throw new Error('Conflict in temp dir');
@@ -524,9 +521,9 @@ export default class CertificateProvider {
}) })
.then((fileName) => { .then((fileName) => {
const copiedFile = path.resolve(dir, fileName); const copiedFile = path.resolve(dir, fileName);
return promisify(fs.readFile)(copiedFile).then((data) => return fsExtra
this.santitizeString(data.toString()), .readFile(copiedFile)
); .then((data) => this.santitizeString(data.toString()));
}); });
}) })
.then((csrFromDevice) => csrFromDevice === this.santitizeString(csr)); .then((csrFromDevice) => csrFromDevice === this.santitizeString(csr));
@@ -577,20 +574,19 @@ export default class CertificateProvider {
}); });
} }
loadSecureServerConfig(): Promise<SecureServerConfig> { async loadSecureServerConfig(): Promise<SecureServerConfig> {
return this.certificateSetup.then(() => { await this.certificateSetup;
return { return {
key: fs.readFileSync(serverKey), key: await fsExtra.readFile(serverKey),
cert: fs.readFileSync(serverCert), cert: await fsExtra.readFile(serverCert),
ca: fs.readFileSync(caCert), ca: await fsExtra.readFile(caCert),
requestCert: true, requestCert: true,
rejectUnauthorized: true, // can be false if necessary as we don't strictly need to verify the client rejectUnauthorized: true, // can be false if necessary as we don't strictly need to verify the client
}; };
});
} }
async ensureCertificateAuthorityExists(): Promise<void> { async ensureCertificateAuthorityExists(): Promise<void> {
if (!fs.existsSync(caKey)) { if (!(await fsExtra.pathExists(caKey))) {
return this.generateCertificateAuthority(); return this.generateCertificateAuthority();
} }
return this.checkCertIsValid(caCert).catch(() => return this.checkCertIsValid(caCert).catch(() =>
@@ -598,8 +594,8 @@ export default class CertificateProvider {
); );
} }
private checkCertIsValid(filename: string): Promise<void> { private async checkCertIsValid(filename: string): Promise<void> {
if (!fs.existsSync(filename)) { if (!(await fsExtra.pathExists(filename))) {
return Promise.reject(new Error(`${filename} does not exist`)); return Promise.reject(new Error(`${filename} does not exist`));
} }
// openssl checkend is a nice feature but it only checks for certificates // openssl checkend is a nice feature but it only checks for certificates
@@ -655,9 +651,9 @@ export default class CertificateProvider {
}); });
} }
private generateCertificateAuthority(): Promise<void> { private async generateCertificateAuthority(): Promise<void> {
if (!fs.existsSync(getFilePath(''))) { if (!(await fsExtra.pathExists(getFilePath('')))) {
fs.mkdirSync(getFilePath('')); await fsExtra.mkdir(getFilePath(''));
} }
console.log('Generating new CA', logTag); console.log('Generating new CA', logTag);
return openssl('genrsa', {out: caKey, '2048': false}) return openssl('genrsa', {out: caKey, '2048': false})
@@ -674,13 +670,12 @@ export default class CertificateProvider {
} }
private async ensureServerCertExists(): Promise<void> { private async ensureServerCertExists(): Promise<void> {
if ( const allExist = Promise.all([
!( fsExtra.existsSync(serverKey),
fs.existsSync(serverKey) && fsExtra.existsSync(serverCert),
fs.existsSync(serverCert) && fsExtra.existsSync(caCert),
fs.existsSync(caCert) ]).then((exist) => exist.every(Boolean));
) if (!allExist) {
) {
return this.generateServerCertificate(); return this.generateServerCertificate();
} }
@@ -719,7 +714,7 @@ export default class CertificateProvider {
private writeToTempFile(content: string): Promise<string> { private writeToTempFile(content: string): Promise<string> {
return tmpFile().then((path) => return tmpFile().then((path) =>
promisify(fs.writeFile)(path, content).then((_) => path), fsExtra.writeFile(path, content).then((_) => path),
); );
} }
} }