UNPKG

openhim-core

Version:

The OpenHIM core application that provides logging and routing of http requests

110 lines (93 loc) 3.3 kB
var Certificate, Keystore, Q, authorisation, createCertificate, extractCertMetadata, generateClientCert, generateServerCert, getFingerprint, getRandomInt, logger, pem, readCertificateInfo, utils; Keystore = require('../model/keystore').Keystore; Certificate = require('../model/keystore').Certificate; Q = require('q'); logger = require('winston'); utils = require("../utils"); pem = require("pem"); authorisation = require('./authorisation'); readCertificateInfo = Q.denodeify(pem.readCertificateInfo); getFingerprint = Q.denodeify(pem.getFingerprint); exports.generateCert = function*() { var options, result; if (authorisation.inGroup('admin', this.authenticated) === false) { utils.logAndSetResponse(this, 403, "User " + this.authenticated.email + " is not an admin, API access to getServerKey by id denied.", 'info'); return; } options = this.request.body; if (options.type === 'server') { logger.info('Generating server cert'); result = (yield generateServerCert(options)); } else { logger.info('Generating client cert'); result = (yield generateClientCert(options)); } this.status = 201; return this.body = result; }; generateClientCert = function*(options) { var certInfo, err, error, keystoreDoc; keystoreDoc = (yield Keystore.findOne().exec()); options.selfSigned = true; try { this.body = (yield createCertificate(options)); certInfo = (yield extractCertMetadata(this.body.certificate)); keystoreDoc.ca.push(certInfo); (yield Q.ninvoke(keystoreDoc, 'save')); this.status = 201; logger.info('Client certificate created'); } catch (error) { err = error; utils.logAndSetResponse(this, 'internal server error', "Could not create a client cert via the API: " + err, 'error'); } return this.body; }; generateServerCert = function*(options) { var err, error, keystoreDoc; keystoreDoc = (yield Keystore.findOne().exec()); options.selfSigned = true; try { this.body = (yield createCertificate(options)); keystoreDoc.cert = (yield extractCertMetadata(this.body.certificate)); keystoreDoc.key = this.body.key; (yield Q.ninvoke(keystoreDoc, 'save')); this.status = 201; logger.info('Server certificate created'); } catch (error) { err = error; utils.logAndSetResponse(this, 'internal server error', "Could not create a client cert via the API: " + err, 'error'); } return this.body; }; createCertificate = function(options) { var deferred; deferred = Q.defer(); pem.createCertificate(options, function(err, cert) { var response; if (err) { response = { err: err }; return deferred.resolve(response); } else { response = { certificate: cert.certificate, key: cert.clientKey }; return deferred.resolve(response); } }); return deferred.promise; }; extractCertMetadata = function*(cert) { var certInfo, fingerprint; certInfo = (yield readCertificateInfo(cert)); fingerprint = (yield getFingerprint(cert)); certInfo.data = this.body.certificate; certInfo.fingerprint = fingerprint.fingerprint; return certInfo; }; getRandomInt = function(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; }; //# sourceMappingURL=certificateAuthority.js.map