lumber-forestadmin
Version:
Forest Admin for Lumber.
169 lines (149 loc) • 5.38 kB
JavaScript
const os = require('os');
const fs = require('fs');
const chalk = require('chalk');
const KeyGenerator = require('./services/key-generator');
const api = require('./services/api');
const Authenticator = require('./services/authenticator');
const { parseJwt } = require('./utils/authenticator-helper');
const FORMAT_PASSWORD = /^(?=\S*?[A-Z])(?=\S*?[a-z])((?=\S*?[0-9]))\S{8,}$/;
module.exports = async (logger, inquirer, argv) => {
const auth = new Authenticator(logger, inquirer);
let sessionToken;
// TODO: Remove FOREST_EMAIL, FOREST_TOKEN and FOREST_PASSWORD
// environment variables usage in the future major version.
async function loginWithEmailOrTokenArgv() {
try {
let config = {};
const email = argv.email || argv.e || process.env.FOREST_EMAIL;
const token = argv.token || argv.t || process.env.FOREST_TOKEN;
const password = argv.password || argv.P || process.env.FOREST_PASSWORD;
const isGoogleAccount = await api.isGoogleAccount(email);
if (token) {
sessionToken = token;
} else if (isGoogleAccount) {
sessionToken = await auth.loginWithGoogle(email);
} else {
if (password) {
config.password = password;
} else {
config = await inquirer.prompt([{
type: 'password',
name: 'password',
message: 'What\'s your Forest Admin password:',
validate: (input) => {
if (input) { return true; }
return 'Please enter your password.';
},
}]);
}
sessionToken = await auth.login(email, config.password);
}
} catch (error) {
if (error.message === 'Unauthorized') {
logger.error('Incorrect email or password.');
} else {
logger.error(`An unexpected error occured. Please create a Github issue with following error: ${chalk.red(error)}`);
}
process.exit(1);
}
}
async function createAccount() {
logger.info('Create an account:');
const authConfig = await inquirer.prompt([{
type: 'input',
name: 'firstName',
message: 'What\'s your first name?',
validate: (input) => {
if (input) { return true; }
return 'Please enter your first name.';
},
}, {
type: 'input',
name: 'lastName',
message: 'What\'s your last name?',
validate: (input) => {
if (input) { return true; }
return 'Please enter your last name.';
},
}, {
type: 'input',
name: 'email',
message: 'What\'s your email address?',
validate: (input) => {
if (input) { return true; }
return 'Please enter your email address.';
},
}, {
type: 'password',
name: 'password',
message: 'Choose a password:',
validate: (password) => {
if (password) {
if (FORMAT_PASSWORD.test(password)) { return true; }
return `🔓 Your password security is too weak 🔓\n
\tPlease make sure it contains at least:\n
\t> 8 characters\n
\t> Upper and lower case letters\n
\t> Numbers`;
}
return 'Please, choose a password.';
},
}]);
try {
await api.createUser(authConfig);
} catch (error) {
if (error.message === 'Conflict') {
logger.error(`Your account already exists. Please, use the command ${chalk.cyan('lumber run lumber-forestadmin:login')}.`);
} else {
logger.error(`An unexpected error occured. Please create a Github issue with following error: ${chalk.red(error)}`);
}
process.exit(1);
}
sessionToken = await auth.login(authConfig.email, authConfig.password);
logger.success('\nAccount successfully created.\n');
}
const email = argv.email || argv.e || process.env.FOREST_EMAIL;
try {
sessionToken = fs.readFileSync(`${os.homedir()}/.lumberrc`, { encoding: 'utf8' });
if (email) {
const sessionInfo = parseJwt(sessionToken);
if (sessionInfo && sessionInfo.data.data.attributes.email !== email) {
throw new Error();
}
}
} catch (err) {
if (email) {
await loginWithEmailOrTokenArgv();
} else {
await createAccount();
}
}
let projectConfig = {};
const projectName = argv.projectName || argv.p;
if (projectName) {
projectConfig.name = projectName;
} else {
projectConfig = await inquirer.prompt([{
type: 'input',
name: 'name',
message: 'Choose a name for your admin panel:',
}]);
}
try {
const newProject = await api.createProject(sessionToken, projectConfig);
logger.success(`Hooray, ${chalk.green('installation success')}!`);
return {
envSecret: newProject.defaultEnvironment.secretKey,
authSecret: await new KeyGenerator().generate(),
};
} catch (error) {
if (error.message === 'Unauthorized') {
logger.error(`Your session has expired. Please, relogin with the command ${chalk.cyan('lumber run lumber-forestadmin:login')}.`);
} else if (error.message === 'Conflict') {
logger.error('A project with this name already exists. Please choose another name.');
} else {
logger.error(`An unexpected error occured. Please create a Github issue with following error: ${chalk.red(error)}`);
}
return process.exit(1);
}
};