added endpoint to download certificates

This commit is contained in:
Rahul Somasundaram 2021-08-23 09:03:24 +05:30
parent 5e9ff4d2bf
commit e5a3b5ee2f
No known key found for this signature in database
GPG Key ID: D6DAC16BA31FD0C5
3 changed files with 75 additions and 0 deletions

View File

@ -13,6 +13,7 @@ const internalHost = require('./host');
const letsencryptStaging = process.env.NODE_ENV !== 'production';
const letsencryptConfig = '/etc/letsencrypt.ini';
const certbotCommand = 'certbot';
const archiver = require('archiver');
function omissions() {
return ['is_deleted'];
@ -335,6 +336,50 @@ const internalCertificate = {
});
},
/**
* @param {Object} data
* @param {Number} data.id
* @returns {Promise}
*/
download: (data) => {
const downloadName = "npm-" + data.id + "-" + `${Date.now()}.zip`;
const opName = '/tmp/' + downloadName;
const zipDirectory = "/etc/letsencrypt/live/npm-" + data.id
return new Promise((resolve, reject) => {
internalCertificate.zipDirectory(zipDirectory, opName)
.then(() => {
logger.debug("zip completed : ", opName)
const resp = {
fileName: opName
}
resolve(resp)
}).catch(err => {
reject(err)
})
});
},
/**
* @param {String} source
* @param {String} out
* @returns {Promise}
*/
zipDirectory(source, out) {
const archive = archiver('zip', { zlib: { level: 9 } });
const stream = fs.createWriteStream(out);
return new Promise((resolve, reject) => {
archive
.directory(source, false)
.on('error', err => reject(err))
.pipe(stream);
stream.on('close', () => resolve());
archive.finalize();
});
},
/**
* @param {Access} access
* @param {Object} data

View File

@ -5,6 +5,7 @@
"main": "js/index.js",
"dependencies": {
"ajv": "^6.12.0",
"archiver": "^5.3.0",
"batchflow": "^0.4.0",
"bcrypt": "^5.0.0",
"body-parser": "^1.19.0",

View File

@ -209,6 +209,35 @@ router
.catch(next);
});
/**
* Download LE Certs
*
* /api/nginx/certificates/123/download
*/
router
.route('/:certificate_id/download')
.options((req, res) => {
res.sendStatus(204);
})
.all(jwtdecode())
/**
* POST /api/nginx/certificates/123/download
*
* Renew certificate
*/
.get((req, res, next) => {
internalCertificate.download({
id: parseInt(req.params.certificate_id, 10)
})
.then((result) => {
res.status(200)
.download(result.fileName);
})
.catch(next);
});
/**
* Validate Certs before saving
*