linagora-rse
Version:
67 lines (56 loc) • 1.7 kB
JavaScript
'use strict';
const path = require('path');
const ursa = require('ursa');
const Q = require('q');
const { promisify } = require('util');
const fsCreateFileFromString = promisify(require('fs-extra').outputFile);
const fsChmod = promisify(require('fs').chmod);
const CONSTANTS = require('../constants').params;
const commons = require('../commons');
const db = require('../../fixtures/db');
const { 'esn-config': esnConfig } = require('../../backend/core/');
const JWT_PUBLIC_KEY_FILE_NAME = 'jwt_publickey';
const JWT_ALGORITHM = 'RS256';
const exec = keyPath => {
return _generateJWT()
.then(_storeJwtKeys)
.then(keys => _saveFile(keys, keyPath));
};
const command = {
command: 'generateJWT',
desc: 'Generate a keys pairs for JWT',
builder: {
path: CONSTANTS.jwt.path
},
handler: argv => {
const { path } = argv;
db.connect(commons.getDBOptions())
.then(() => exec(path))
.then(() => commons.logInfo('Generated'))
.catch(commons.logError)
.finally(db.disconnect)
.finally(commons.exit);
}
};
function _generateJWT() {
const key = ursa.generatePrivateKey();
const privateKey = key.toPrivatePem().toString('ascii');
const publicKey = key.toPublicPem().toString('ascii');
return Q.when({
algorithm: JWT_ALGORITHM,
publicKey: publicKey,
privateKey: privateKey
});
}
function _storeJwtKeys(config) {
return esnConfig('jwt').set(config)
.then(() => config.publicKey);
}
function _saveFile(publicJwtKey, keyPath) {
const file = path.resolve(keyPath, JWT_PUBLIC_KEY_FILE_NAME);
return fsCreateFileFromString(file, publicJwtKey).then(() => fsChmod(file, 600));
}
module.exports = {
exec,
command
};