@expo/xdl
Version:
The Expo Development Library
226 lines (181 loc) • 6.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.exportCertBinary = exportCertBinary;
exports.exportCertBase64 = exportCertBase64;
exports.logKeystoreHashes = logKeystoreHashes;
exports.logKeystoreCredentials = logKeystoreCredentials;
exports.createKeystore = createKeystore;
exports.generateUploadKeystore = generateUploadKeystore;
function _spawnAsync() {
const data = _interopRequireDefault(require("@expo/spawn-async"));
_spawnAsync = function () {
return data;
};
return data;
}
function _chalk() {
const data = _interopRequireDefault(require("chalk"));
_chalk = function () {
return data;
};
return data;
}
function _crypto() {
const data = _interopRequireDefault(require("crypto"));
_crypto = function () {
return data;
};
return data;
}
function _fsExtra() {
const data = _interopRequireDefault(require("fs-extra"));
_fsExtra = function () {
return data;
};
return data;
}
function _v() {
const data = _interopRequireDefault(require("uuid/v4"));
_v = function () {
return data;
};
return data;
}
function _Logger() {
const data = _interopRequireDefault(require("../Logger"));
_Logger = function () {
return data;
};
return data;
}
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const log = _Logger().default.global;
async function exportCertBinary({
keystorePath,
keystorePassword,
keyAlias
}, certFile) {
try {
return (0, _spawnAsync().default)('keytool', ['-exportcert', '-keystore', keystorePath, '-storepass', keystorePassword, '-alias', keyAlias, '-file', certFile, '-noprompt', '-storetype', 'JKS']);
} catch (err) {
if (err.code === 'ENOENT') {
log.warn('Are you sure you have keytool installed?');
log.info('keytool is a part of OpenJDK: https://openjdk.java.net/');
log.info('Also make sure that keytool is in your PATH after installation.');
}
if (err.stdout) {
log.info(err.stdout);
}
if (err.stderr) {
log.error(err.stderr);
}
throw err;
}
}
async function exportCertBase64({
keystorePath,
keystorePassword,
keyAlias
}, certFile) {
try {
return (0, _spawnAsync().default)('keytool', ['-export', '-rfc', '-keystore', keystorePath, '-storepass', keystorePassword, '-alias', keyAlias, '-file', certFile, '-noprompt', '-storetype', 'JKS']);
} catch (err) {
if (err.code === 'ENOENT') {
log.warn('Are you sure you have keytool installed?');
log.info('keytool is a part of OpenJDK: https://openjdk.java.net/');
log.info('Also make sure that keytool is in your PATH after installation.');
}
if (err.stdout) {
log.info(err.stdout);
}
if (err.stderr) {
log.error(err.stderr);
}
throw err;
}
}
async function logKeystoreHashes(keystoreInfo, linePrefix = '') {
const {
keystorePath
} = keystoreInfo;
const certFile = `${keystorePath}.cer`;
try {
await exportCertBinary(keystoreInfo, certFile);
const data = await _fsExtra().default.readFile(certFile);
const googleHash = _crypto().default.createHash('sha1').update(data).digest('hex').toUpperCase();
const googleHash256 = _crypto().default.createHash('sha256').update(data).digest('hex').toUpperCase();
const fbHash = _crypto().default.createHash('sha1').update(data).digest('base64');
log.info(`${linePrefix}Google Certificate Fingerprint: ${googleHash.replace(/(.{2}(?!$))/g, '$1:')}`);
log.info(`${linePrefix}Google Certificate Hash (SHA-1): ${googleHash}`);
log.info(`${linePrefix}Google Certificate Hash (SHA-256): ${googleHash256}`);
log.info(`${linePrefix}Facebook Key Hash: ${fbHash}`);
} catch (err) {
if (err.code === 'ENOENT') {
log.warn('Are you sure you have keytool installed?');
log.info('keytool is a part of OpenJDK: https://openjdk.java.net/');
log.info('Also make sure that keytool is in your PATH after installation.');
}
if (err.stdout) {
log.info(err.stdout);
}
if (err.stderr) {
log.error(err.stderr);
}
throw err;
} finally {
try {
await _fsExtra().default.unlink(certFile);
} catch (err) {
if (err.code !== 'ENOENT') {
log.error(err);
}
}
}
}
function logKeystoreCredentials({
keystorePassword,
keyAlias,
keyPassword
}, title = 'Keystore credentials', linePrefix = '') {
log.info(`${linePrefix}${title}
${linePrefix} Keystore password: ${_chalk().default.bold(keystorePassword)}
${linePrefix} Key alias: ${_chalk().default.bold(keyAlias)}
${linePrefix} Key password: ${_chalk().default.bold(keyPassword)}
`);
}
async function createKeystore({
keystorePath,
keystorePassword,
keyAlias,
keyPassword
}, androidPackage) {
try {
return await (0, _spawnAsync().default)('keytool', ['-genkey', '-v', '-storetype', 'JKS', '-storepass', keystorePassword, '-keypass', keyPassword, '-keystore', keystorePath, '-alias', keyAlias, '-keyalg', 'RSA', '-keysize', '2048', '-validity', '10000', '-dname', `CN=${androidPackage},OU=,O=,L=,S=,C=US`]);
} catch (err) {
if (err.code === 'ENOENT') {
log.warn('Are you sure you have keytool installed?');
log.info('keytool is a part of OpenJDK: https://openjdk.java.net/');
log.info('Also make sure that keytool is in your PATH after installation.');
}
if (err.stdout) {
log.info(err.stdout);
}
if (err.stderr) {
log.error(err.stderr);
}
throw err;
}
}
async function generateUploadKeystore(uploadKeystorePath, androidPackage, experienceName) {
const keystoreData = {
keystorePassword: (0, _v().default)().replace(/-/g, ''),
keyPassword: (0, _v().default)().replace(/-/g, ''),
keyAlias: Buffer.from(experienceName).toString('base64'),
keystorePath: uploadKeystorePath
};
await createKeystore(keystoreData, androidPackage);
return keystoreData;
}
//# sourceMappingURL=../__sourcemaps__/credentials/AndroidCredentials.js.map