Selaa lähdekoodia

added endpoint to download certificates

Rahul Somasundaram 4 vuotta sitten
vanhempi
sitoutus
e5a3b5ee2f

+ 45 - 0
backend/internal/certificate.js

@@ -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

+ 1 - 0
backend/package.json

@@ -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",

+ 29 - 0
backend/routes/api/nginx/certificates.js

@@ -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
  *