"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DownloadKeystore = exports.UpdateFcmKey = exports.UpdateKeystore = exports.ExperienceView = void 0; function _xdl() { const data = require("@expo/xdl"); _xdl = function () { return data; }; return data; } function _get() { const data = _interopRequireDefault(require("lodash/get")); _get = function () { return data; }; return data; } function _isEmpty() { const data = _interopRequireDefault(require("lodash/isEmpty")); _isEmpty = function () { return data; }; return data; } function _chalk() { const data = _interopRequireDefault(require("chalk")); _chalk = function () { return data; }; return data; } function _fsExtra() { const data = _interopRequireDefault(require("fs-extra")); _fsExtra = function () { return data; }; return data; } function _prompt() { const data = _interopRequireDefault(require("../../prompt")); _prompt = function () { return data; }; return data; } function _log() { const data = _interopRequireDefault(require("../../log")); _log = function () { return data; }; return data; } function _credentials() { const data = require("../credentials"); _credentials = function () { return data; }; return data; } function _list() { const data = require("../actions/list"); _list = function () { return data; }; return data; } function _promptForCredentials() { const data = require("../actions/promptForCredentials"); _promptForCredentials = function () { return data; }; return data; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } class ExperienceView { constructor(experience, credentials) { _defineProperty(this, "keystore", null); _defineProperty(this, "pushCredentials", null); _defineProperty(this, "shouldRefetch", true); this.experience = experience; if (credentials && credentials.experienceName) { this.shouldRefetch = false; this.experienceName = credentials.experienceName; this.keystore = credentials.keystore; this.pushCredentials = credentials.pushCredentials; } } async open(ctx) { if (this.shouldRefetch) { const appCredentials = await ctx.api.getAsync(`credentials/android/@${ctx.user.username}/${this.experience}`); this.experienceName = (0, _get().default)(appCredentials, 'experienceName'); this.keystore = (0, _get().default)(appCredentials, 'keystore'); this.pushCredentials = (0, _get().default)(appCredentials, 'pushCredentials'); } if (!this.experienceName) { this.experienceName = `@${ctx.user.username}/${this.experience}`; } if ((0, _isEmpty().default)(this.keystore) && (0, _isEmpty().default)(this.pushCredentials)) { (0, _log().default)(`No credentials available for ${this.experience} experience.\n`); } else if (this.experienceName) { (0, _log().default)(); await (0, _list().displayAndroidAppCredentials)({ experienceName: this.experienceName, keystore: this.keystore, pushCredentials: this.pushCredentials }); (0, _log().default)(); } const { action } = await (0, _prompt().default)([{ type: 'list', name: 'action', message: 'What do you want to do?', choices: [{ value: 'update-keystore', name: 'Update Upload Keystore' }, { value: 'update-fcm-key', name: 'Update FCM Api Key' }, { value: 'fetch-keystore', name: 'Download Keystore from the Expo servers' }] }]); return this.handleAction(ctx, action); } handleAction(context, selected) { switch (selected) { case 'update-keystore': this.shouldRefetch = true; return new UpdateKeystore(this.experience); case 'update-fcm-key': this.shouldRefetch = true; return new UpdateFcmKey(this.experience); case 'fetch-keystore': return new DownloadKeystore(this.experience, this.keystore); case 'fetch-public-cert': return null; } return null; } } exports.ExperienceView = ExperienceView; class UpdateKeystore { constructor(experience) { this.experience = experience; } async open(ctx) { const keystore = await this.provideOrGenerate(ctx); await ctx.api.putAsync(`credentials/android/keystore/@${ctx.user.username}/${this.experience}`, { keystore }); (0, _log().default)(_chalk().default.green('Updated Keystore successfully')); return null; } async provideOrGenerate(ctx) { const providedKeystore = await (0, _promptForCredentials().askForUserProvided)(_credentials().keystoreSchema); if (providedKeystore) { return providedKeystore; } const tmpKeystoreName = `${this.experience}_tmp.jks`; try { if (await _fsExtra().default.pathExists(tmpKeystoreName)) { await _fsExtra().default.unlink(tmpKeystoreName); } const keystoreData = await _xdl().AndroidCredentials.generateUploadKeystore(tmpKeystoreName, '---------------', // TODO: add android package (it's not required) `@${ctx.user.username}/${this.experience}`); return { ...keystoreData, keystore: await _fsExtra().default.readFile(tmpKeystoreName, 'base64') }; } catch (error) { _log().default.warn("If you don't provide your own Android Kkeystore, it will be generated on our servers durring next build"); throw error; } finally { if (await _fsExtra().default.pathExists(tmpKeystoreName)) { await _fsExtra().default.unlink(tmpKeystoreName); } } } } exports.UpdateKeystore = UpdateKeystore; class UpdateFcmKey { constructor(experience) { this.experience = experience; } async open(ctx) { const { fcmApiKey } = await (0, _prompt().default)([{ type: 'input', name: 'fcmApiKey', message: 'FCM Api Key', validate: value => value.length > 0 || "FCM Api Key can't be empty" }]); await ctx.api.putAsync(`credentials/android/push/@${ctx.user.username}/${this.experience}`, { fcmApiKey }); (0, _log().default)(_chalk().default.green('Updated successfully')); return null; } } exports.UpdateFcmKey = UpdateFcmKey; class DownloadKeystore { constructor(experience, credentials = null) { this.credentials = credentials; this.experience = experience; } async open(ctx) { const keystoreName = `${this.experience}.bak.jks`; const { confirm } = await (0, _prompt().default)({ type: 'confirm', name: 'confirm', message: 'Do you want to display the Android Keystore credentials?' }); (0, _log().default)(_chalk().default.green(`Saving Keystore to ${keystoreName}`)); await this.save(ctx, keystoreName, confirm); return null; } async fetch(ctx) { const credentials = await _xdl().ApiV2.clientForUser(ctx.user).getAsync(`credentials/android/@${ctx.manifest.owner || ctx.user.username}/${ctx.manifest.slug}`); if (credentials && credentials.keystore) { this.credentials = credentials.keystore; } } async save(ctx, keystorePath, shouldLog = false) { if (await _fsExtra().default.pathExists(keystorePath)) { await _fsExtra().default.unlink(keystorePath); } const { keystore, keystorePassword, keyAlias, keyPassword } = this.credentials || {}; if (!keystore || !keystorePassword || !keyAlias || !keyPassword) { _log().default.warn('There is no valid Keystore defined for this app'); return; } const storeBuf = Buffer.from(keystore, 'base64'); await _fsExtra().default.writeFile(keystorePath, storeBuf); if (shouldLog) { (0, _log().default)(`Keystore credentials Keystore password: ${_chalk().default.bold(keystorePassword)} Key alias: ${_chalk().default.bold(keyAlias)} Key password: ${_chalk().default.bold(keyPassword)} Path to Keystore: ${keystorePath} `); } } } exports.DownloadKeystore = DownloadKeystore; //# sourceMappingURL=../../__sourcemaps__/credentials/views/AndroidCredentials.js.map