mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-29 23:03:34 +00:00 
			
		
		
		
	
							
								
								
									
										20
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| <p align="center"> | <p align="center"> | ||||||
| 	<img src="https://nginxproxymanager.com/github.png"> | 	<img src="https://nginxproxymanager.com/github.png"> | ||||||
| 	<br><br> | 	<br><br> | ||||||
| 	<img src="https://img.shields.io/badge/version-2.9.8-green.svg?style=for-the-badge"> | 	<img src="https://img.shields.io/badge/version-2.9.9-green.svg?style=for-the-badge"> | ||||||
| 	<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager"> | 	<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager"> | ||||||
| 		<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge"> | 		<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge"> | ||||||
| 	</a> | 	</a> | ||||||
| @@ -483,6 +483,24 @@ Special thanks to the following contributors: | |||||||
| 				<br /><sub><b>Florian Meinicke</b></sub> | 				<br /><sub><b>Florian Meinicke</b></sub> | ||||||
| 			</a> | 			</a> | ||||||
| 		</td> | 		</td> | ||||||
|  | 		<td align="center"> | ||||||
|  | 			<a href="https://github.com/ssrahul96"> | ||||||
|  | 				<img src="https://avatars.githubusercontent.com/u/15570570?v=4" width="80" alt=""/> | ||||||
|  | 				<br /><sub><b>Rahul Somasundaram</b></sub> | ||||||
|  | 			</a> | ||||||
|  | 		</td> | ||||||
|  | 		<td align="center"> | ||||||
|  | 			<a href="https://github.com/BjoernAkAManf"> | ||||||
|  | 				<img src="https://avatars.githubusercontent.com/u/833043?v=4" width="80" alt=""/> | ||||||
|  | 				<br /><sub><b>Björn Heinrichs</b></sub> | ||||||
|  | 			</a> | ||||||
|  | 		</td> | ||||||
|  | 		<td align="center"> | ||||||
|  | 			<a href="https://github.com/realJoshByrnes"> | ||||||
|  | 				<img src="https://avatars.githubusercontent.com/u/204185?v=4" width="80" alt=""/> | ||||||
|  | 				<br /><sub><b>Josh Byrnes</b></sub> | ||||||
|  | 			</a> | ||||||
|  | 		</td> | ||||||
| 	</tr> | 	</tr> | ||||||
| </table> | </table> | ||||||
| <!-- markdownlint-enable --> | <!-- markdownlint-enable --> | ||||||
|   | |||||||
| @@ -75,7 +75,7 @@ app.use(function (err, req, res, next) { | |||||||
|  |  | ||||||
| 	// Not every error is worth logging - but this is good for now until it gets annoying. | 	// Not every error is worth logging - but this is good for now until it gets annoying. | ||||||
| 	if (typeof err.stack !== 'undefined' && err.stack) { | 	if (typeof err.stack !== 'undefined' && err.stack) { | ||||||
| 		if (process.env.NODE_ENV === 'development') { | 		if (process.env.NODE_ENV === 'development' || process.env.DEBUG) { | ||||||
| 			log.debug(err.stack); | 			log.debug(err.stack); | ||||||
| 		} else if (typeof err.public == 'undefined' || !err.public) { | 		} else if (typeof err.public == 'undefined' || !err.public) { | ||||||
| 			log.warn(err.message); | 			log.warn(err.message); | ||||||
|   | |||||||
| @@ -13,6 +13,8 @@ const internalHost       = require('./host'); | |||||||
| const letsencryptStaging = process.env.NODE_ENV !== 'production'; | const letsencryptStaging = process.env.NODE_ENV !== 'production'; | ||||||
| const letsencryptConfig  = '/etc/letsencrypt.ini'; | const letsencryptConfig  = '/etc/letsencrypt.ini'; | ||||||
| const certbotCommand     = 'certbot'; | const certbotCommand     = 'certbot'; | ||||||
|  | const archiver           = require('archiver'); | ||||||
|  | const path               = require('path'); | ||||||
|  |  | ||||||
| function omissions() { | function omissions() { | ||||||
| 	return ['is_deleted']; | 	return ['is_deleted']; | ||||||
| @@ -335,6 +337,71 @@ const internalCertificate = { | |||||||
| 			}); | 			}); | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * @param   {Access}  access | ||||||
|  | 	 * @param   {Object}  data | ||||||
|  | 	 * @param   {Number}  data.id | ||||||
|  | 	 * @returns {Promise} | ||||||
|  | 	 */ | ||||||
|  | 	download: (access, data) => { | ||||||
|  | 		return new Promise((resolve, reject) => { | ||||||
|  | 			access.can('certificates:get', data) | ||||||
|  | 				.then(() => { | ||||||
|  | 					return internalCertificate.get(access, data); | ||||||
|  | 				}) | ||||||
|  | 				.then((certificate) => { | ||||||
|  | 					if (certificate.provider === 'letsencrypt') { | ||||||
|  | 						const zipDirectory = '/etc/letsencrypt/live/npm-' + data.id; | ||||||
|  |  | ||||||
|  | 						if (!fs.existsSync(zipDirectory)) { | ||||||
|  | 							throw new error.ItemNotFoundError('Certificate ' + certificate.nice_name + ' does not exists'); | ||||||
|  | 						} | ||||||
|  |  | ||||||
|  | 						let certFiles      = fs.readdirSync(zipDirectory) | ||||||
|  | 							.filter((fn) => fn.endsWith('.pem')) | ||||||
|  | 							.map((fn) => fs.realpathSync(path.join(zipDirectory, fn))); | ||||||
|  | 						const downloadName = 'npm-' + data.id + '-' + `${Date.now()}.zip`; | ||||||
|  | 						const opName       = '/tmp/' + downloadName; | ||||||
|  | 						internalCertificate.zipFiles(certFiles, opName) | ||||||
|  | 							.then(() => { | ||||||
|  | 								logger.debug('zip completed : ', opName); | ||||||
|  | 								const resp = { | ||||||
|  | 									fileName: opName | ||||||
|  | 								}; | ||||||
|  | 								resolve(resp); | ||||||
|  | 							}).catch((err) => reject(err)); | ||||||
|  | 					} else { | ||||||
|  | 						throw new error.ValidationError('Only Let\'sEncrypt certificates can be downloaded'); | ||||||
|  | 					} | ||||||
|  | 				}).catch((err) => reject(err)); | ||||||
|  | 		}); | ||||||
|  | 	}, | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	* @param   {String}  source | ||||||
|  | 	* @param   {String}  out | ||||||
|  | 	* @returns {Promise} | ||||||
|  | 	*/ | ||||||
|  | 	zipFiles(source, out) { | ||||||
|  | 		const archive = archiver('zip', { zlib: { level: 9 } }); | ||||||
|  | 		const stream  = fs.createWriteStream(out); | ||||||
|  | 	 | ||||||
|  | 		return new Promise((resolve, reject) => { | ||||||
|  | 			source | ||||||
|  | 				.map((fl) => { | ||||||
|  | 					let fileName = path.basename(fl); | ||||||
|  | 					logger.debug(fl, 'added to certificate zip'); | ||||||
|  | 					archive.file(fl, { name: fileName }); | ||||||
|  | 				}); | ||||||
|  | 			archive | ||||||
|  | 				.on('error', (err) => reject(err)) | ||||||
|  | 				.pipe(stream); | ||||||
|  | 	 | ||||||
|  | 			stream.on('close', () => resolve()); | ||||||
|  | 			archive.finalize(); | ||||||
|  | 		}); | ||||||
|  | 	}, | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @param {Access}  access | 	 * @param {Access}  access | ||||||
| 	 * @param {Object}  data | 	 * @param {Object}  data | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ | |||||||
| 	"main": "js/index.js", | 	"main": "js/index.js", | ||||||
| 	"dependencies": { | 	"dependencies": { | ||||||
| 		"ajv": "^6.12.0", | 		"ajv": "^6.12.0", | ||||||
|  | 		"archiver": "^5.3.0", | ||||||
| 		"batchflow": "^0.4.0", | 		"batchflow": "^0.4.0", | ||||||
| 		"bcrypt": "^5.0.0", | 		"bcrypt": "^5.0.0", | ||||||
| 		"body-parser": "^1.19.0", | 		"body-parser": "^1.19.0", | ||||||
|   | |||||||
| @@ -209,6 +209,35 @@ router | |||||||
| 			.catch(next); | 			.catch(next); | ||||||
| 	}); | 	}); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Download LE Certs | ||||||
|  |  * | ||||||
|  |  * /api/nginx/certificates/123/download | ||||||
|  |  */ | ||||||
|  | router | ||||||
|  | 	.route('/:certificate_id/download') | ||||||
|  | 	.options((req, res) => { | ||||||
|  | 		res.sendStatus(204); | ||||||
|  | 	}) | ||||||
|  | 	.all(jwtdecode()) | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * GET /api/nginx/certificates/123/download | ||||||
|  | 	 * | ||||||
|  | 	 * Renew certificate | ||||||
|  | 	 */ | ||||||
|  | 	.get((req, res, next) => { | ||||||
|  | 		internalCertificate.download(res.locals.access, { | ||||||
|  | 			id: parseInt(req.params.certificate_id, 10) | ||||||
|  | 		}) | ||||||
|  | 			.then((result) => { | ||||||
|  | 				res.status(200) | ||||||
|  | 					.download(result.fileName); | ||||||
|  | 			}) | ||||||
|  | 			.catch(next); | ||||||
|  | 	}); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Validate Certs before saving |  * Validate Certs before saving | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ | |||||||
|       "maximum": 65535 |       "maximum": 65535 | ||||||
|     }, |     }, | ||||||
|     "forwarding_host": { |     "forwarding_host": { | ||||||
|       "oneOf": [ |       "anyOf": [ | ||||||
|         { |         { | ||||||
|           "$ref": "../definitions.json#/definitions/domain_name" |           "$ref": "../definitions.json#/definitions/domain_name" | ||||||
|         }, |         }, | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
| {% if certificate -%} | {% if certificate -%} | ||||||
|   listen 443 ssl{% if http2_support %} http2{% endif %}; |   listen 443 ssl{% if http2_support %} http2{% endif %}; | ||||||
| {% if ipv6 -%} | {% if ipv6 -%} | ||||||
|   listen [::]:443; |   listen [::]:443 ssl{% if http2_support %} http2{% endif %}; | ||||||
| {% else -%} | {% else -%} | ||||||
|   #listen [::]:443; |   #listen [::]:443; | ||||||
| {% endif %} | {% endif %} | ||||||
|   | |||||||
| @@ -154,6 +154,35 @@ aproba@^1.0.3: | |||||||
|   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" |   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" | ||||||
|   integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== |   integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== | ||||||
|  |  | ||||||
|  | archiver-utils@^2.1.0: | ||||||
|  |   version "2.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" | ||||||
|  |   integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== | ||||||
|  |   dependencies: | ||||||
|  |     glob "^7.1.4" | ||||||
|  |     graceful-fs "^4.2.0" | ||||||
|  |     lazystream "^1.0.0" | ||||||
|  |     lodash.defaults "^4.2.0" | ||||||
|  |     lodash.difference "^4.5.0" | ||||||
|  |     lodash.flatten "^4.4.0" | ||||||
|  |     lodash.isplainobject "^4.0.6" | ||||||
|  |     lodash.union "^4.6.0" | ||||||
|  |     normalize-path "^3.0.0" | ||||||
|  |     readable-stream "^2.0.0" | ||||||
|  |  | ||||||
|  | archiver@^5.3.0: | ||||||
|  |   version "5.3.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.0.tgz#dd3e097624481741df626267564f7dd8640a45ba" | ||||||
|  |   integrity sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg== | ||||||
|  |   dependencies: | ||||||
|  |     archiver-utils "^2.1.0" | ||||||
|  |     async "^3.2.0" | ||||||
|  |     buffer-crc32 "^0.2.1" | ||||||
|  |     readable-stream "^3.6.0" | ||||||
|  |     readdir-glob "^1.0.0" | ||||||
|  |     tar-stream "^2.2.0" | ||||||
|  |     zip-stream "^4.1.0" | ||||||
|  |  | ||||||
| are-we-there-yet@~1.1.2: | are-we-there-yet@~1.1.2: | ||||||
|   version "1.1.5" |   version "1.1.5" | ||||||
|   resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" |   resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" | ||||||
| @@ -221,6 +250,11 @@ astral-regex@^1.0.0: | |||||||
|   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" |   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" | ||||||
|   integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== |   integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== | ||||||
|  |  | ||||||
|  | async@^3.2.0: | ||||||
|  |   version "3.2.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8" | ||||||
|  |   integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg== | ||||||
|  |  | ||||||
| atob@^2.1.2: | atob@^2.1.2: | ||||||
|   version "2.1.2" |   version "2.1.2" | ||||||
|   resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" |   resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" | ||||||
| @@ -231,6 +265,11 @@ balanced-match@^1.0.0: | |||||||
|   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" |   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" | ||||||
|   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= |   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= | ||||||
|  |  | ||||||
|  | base64-js@^1.3.1: | ||||||
|  |   version "1.5.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" | ||||||
|  |   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== | ||||||
|  |  | ||||||
| base@^0.11.1: | base@^0.11.1: | ||||||
|   version "0.11.2" |   version "0.11.2" | ||||||
|   resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" |   resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" | ||||||
| @@ -267,6 +306,15 @@ binary-extensions@^2.0.0: | |||||||
|   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" |   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" | ||||||
|   integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== |   integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== | ||||||
|  |  | ||||||
|  | bl@^4.0.3: | ||||||
|  |   version "4.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" | ||||||
|  |   integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== | ||||||
|  |   dependencies: | ||||||
|  |     buffer "^5.5.0" | ||||||
|  |     inherits "^2.0.4" | ||||||
|  |     readable-stream "^3.4.0" | ||||||
|  |  | ||||||
| blueimp-md5@^2.16.0: | blueimp-md5@^2.16.0: | ||||||
|   version "2.17.0" |   version "2.17.0" | ||||||
|   resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.17.0.tgz#f4fcac088b115f7b4045f19f5da59e9d01b1bb96" |   resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.17.0.tgz#f4fcac088b115f7b4045f19f5da59e9d01b1bb96" | ||||||
| @@ -333,6 +381,11 @@ braces@~3.0.2: | |||||||
|   dependencies: |   dependencies: | ||||||
|     fill-range "^7.0.1" |     fill-range "^7.0.1" | ||||||
|  |  | ||||||
|  | buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: | ||||||
|  |   version "0.2.13" | ||||||
|  |   resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" | ||||||
|  |   integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= | ||||||
|  |  | ||||||
| buffer-equal-constant-time@1.0.1: | buffer-equal-constant-time@1.0.1: | ||||||
|   version "1.0.1" |   version "1.0.1" | ||||||
|   resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" |   resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" | ||||||
| @@ -343,6 +396,14 @@ buffer-writer@2.0.0: | |||||||
|   resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" |   resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" | ||||||
|   integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== |   integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== | ||||||
|  |  | ||||||
|  | buffer@^5.5.0: | ||||||
|  |   version "5.7.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" | ||||||
|  |   integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== | ||||||
|  |   dependencies: | ||||||
|  |     base64-js "^1.3.1" | ||||||
|  |     ieee754 "^1.1.13" | ||||||
|  |  | ||||||
| busboy@^0.3.1: | busboy@^0.3.1: | ||||||
|   version "0.3.1" |   version "0.3.1" | ||||||
|   resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" |   resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" | ||||||
| @@ -457,7 +518,7 @@ chokidar@^3.2.2: | |||||||
|   optionalDependencies: |   optionalDependencies: | ||||||
|     fsevents "~2.1.2" |     fsevents "~2.1.2" | ||||||
|  |  | ||||||
| chownr@^1.1.1: | chownr@^1.1.4: | ||||||
|   version "1.1.4" |   version "1.1.4" | ||||||
|   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" |   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" | ||||||
|   integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== |   integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== | ||||||
| @@ -562,6 +623,16 @@ component-emitter@^1.2.1: | |||||||
|   resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" |   resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" | ||||||
|   integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== |   integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== | ||||||
|  |  | ||||||
|  | compress-commons@^4.1.0: | ||||||
|  |   version "4.1.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" | ||||||
|  |   integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== | ||||||
|  |   dependencies: | ||||||
|  |     buffer-crc32 "^0.2.13" | ||||||
|  |     crc32-stream "^4.0.2" | ||||||
|  |     normalize-path "^3.0.0" | ||||||
|  |     readable-stream "^3.6.0" | ||||||
|  |  | ||||||
| compressible@~2.0.16: | compressible@~2.0.16: | ||||||
|   version "2.0.18" |   version "2.0.18" | ||||||
|   resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" |   resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" | ||||||
| @@ -643,6 +714,22 @@ core-util-is@~1.0.0: | |||||||
|   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" |   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" | ||||||
|   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= |   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= | ||||||
|  |  | ||||||
|  | crc-32@^1.2.0: | ||||||
|  |   version "1.2.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" | ||||||
|  |   integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== | ||||||
|  |   dependencies: | ||||||
|  |     exit-on-epipe "~1.0.1" | ||||||
|  |     printj "~1.1.0" | ||||||
|  |  | ||||||
|  | crc32-stream@^4.0.2: | ||||||
|  |   version "4.0.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" | ||||||
|  |   integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== | ||||||
|  |   dependencies: | ||||||
|  |     crc-32 "^1.2.0" | ||||||
|  |     readable-stream "^3.4.0" | ||||||
|  |  | ||||||
| cross-spawn@^6.0.5: | cross-spawn@^6.0.5: | ||||||
|   version "6.0.5" |   version "6.0.5" | ||||||
|   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" |   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" | ||||||
| @@ -831,7 +918,7 @@ encodeurl@~1.0.2: | |||||||
|   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" |   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" | ||||||
|   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= |   integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= | ||||||
|  |  | ||||||
| end-of-stream@^1.1.0: | end-of-stream@^1.1.0, end-of-stream@^1.4.1: | ||||||
|   version "1.4.4" |   version "1.4.4" | ||||||
|   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" |   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" | ||||||
|   integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== |   integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== | ||||||
| @@ -981,6 +1068,11 @@ etag@~1.8.1: | |||||||
|   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" |   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" | ||||||
|   integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= |   integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= | ||||||
|  |  | ||||||
|  | exit-on-epipe@~1.0.1: | ||||||
|  |   version "1.0.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" | ||||||
|  |   integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== | ||||||
|  |  | ||||||
| expand-brackets@^2.1.4: | expand-brackets@^2.1.4: | ||||||
|   version "2.1.4" |   version "2.1.4" | ||||||
|   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" |   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" | ||||||
| @@ -1237,7 +1329,12 @@ fresh@0.5.2: | |||||||
|   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" |   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" | ||||||
|   integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= |   integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= | ||||||
|  |  | ||||||
| fs-minipass@^1.2.5: | fs-constants@^1.0.0: | ||||||
|  |   version "1.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" | ||||||
|  |   integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== | ||||||
|  |  | ||||||
|  | fs-minipass@^1.2.7: | ||||||
|   version "1.2.7" |   version "1.2.7" | ||||||
|   resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" |   resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" | ||||||
|   integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== |   integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== | ||||||
| @@ -1321,6 +1418,18 @@ glob@^7.1.3: | |||||||
|     once "^1.3.0" |     once "^1.3.0" | ||||||
|     path-is-absolute "^1.0.0" |     path-is-absolute "^1.0.0" | ||||||
|  |  | ||||||
|  | glob@^7.1.4: | ||||||
|  |   version "7.1.7" | ||||||
|  |   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" | ||||||
|  |   integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== | ||||||
|  |   dependencies: | ||||||
|  |     fs.realpath "^1.0.0" | ||||||
|  |     inflight "^1.0.4" | ||||||
|  |     inherits "2" | ||||||
|  |     minimatch "^3.0.4" | ||||||
|  |     once "^1.3.0" | ||||||
|  |     path-is-absolute "^1.0.0" | ||||||
|  |  | ||||||
| global-dirs@^2.0.1: | global-dirs@^2.0.1: | ||||||
|   version "2.0.1" |   version "2.0.1" | ||||||
|   resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" |   resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" | ||||||
| @@ -1377,6 +1486,11 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.2: | |||||||
|   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" |   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" | ||||||
|   integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== |   integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== | ||||||
|  |  | ||||||
|  | graceful-fs@^4.2.0: | ||||||
|  |   version "4.2.8" | ||||||
|  |   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" | ||||||
|  |   integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== | ||||||
|  |  | ||||||
| gravatar@^1.8.0: | gravatar@^1.8.0: | ||||||
|   version "1.8.1" |   version "1.8.1" | ||||||
|   resolved "https://registry.yarnpkg.com/gravatar/-/gravatar-1.8.1.tgz#743bbdf3185c3433172e00e0e6ff5f6b30c58997" |   resolved "https://registry.yarnpkg.com/gravatar/-/gravatar-1.8.1.tgz#743bbdf3185c3433172e00e0e6ff5f6b30c58997" | ||||||
| @@ -1494,6 +1608,11 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: | |||||||
|   dependencies: |   dependencies: | ||||||
|     safer-buffer ">= 2.1.2 < 3" |     safer-buffer ">= 2.1.2 < 3" | ||||||
|  |  | ||||||
|  | ieee754@^1.1.13: | ||||||
|  |   version "1.2.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" | ||||||
|  |   integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== | ||||||
|  |  | ||||||
| ignore-by-default@^1.0.1: | ignore-by-default@^1.0.1: | ||||||
|   version "1.0.1" |   version "1.0.1" | ||||||
|   resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" |   resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" | ||||||
| @@ -1537,7 +1656,7 @@ inflight@^1.0.4: | |||||||
|     once "^1.3.0" |     once "^1.3.0" | ||||||
|     wrappy "1" |     wrappy "1" | ||||||
|  |  | ||||||
| inherits@2, inherits@2.0.4, inherits@~2.0.3, inherits@~2.0.4: | inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: | ||||||
|   version "2.0.4" |   version "2.0.4" | ||||||
|   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" |   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" | ||||||
|   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== |   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== | ||||||
| @@ -1937,6 +2056,13 @@ latest-version@^5.0.0: | |||||||
|   dependencies: |   dependencies: | ||||||
|     package-json "^6.3.0" |     package-json "^6.3.0" | ||||||
|  |  | ||||||
|  | lazystream@^1.0.0: | ||||||
|  |   version "1.0.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" | ||||||
|  |   integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= | ||||||
|  |   dependencies: | ||||||
|  |     readable-stream "^2.0.5" | ||||||
|  |  | ||||||
| levn@^0.3.0, levn@~0.3.0: | levn@^0.3.0, levn@~0.3.0: | ||||||
|   version "0.3.0" |   version "0.3.0" | ||||||
|   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" |   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" | ||||||
| @@ -1989,6 +2115,21 @@ locate-path@^5.0.0: | |||||||
|   dependencies: |   dependencies: | ||||||
|     p-locate "^4.1.0" |     p-locate "^4.1.0" | ||||||
|  |  | ||||||
|  | lodash.defaults@^4.2.0: | ||||||
|  |   version "4.2.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" | ||||||
|  |   integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= | ||||||
|  |  | ||||||
|  | lodash.difference@^4.5.0: | ||||||
|  |   version "4.5.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" | ||||||
|  |   integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= | ||||||
|  |  | ||||||
|  | lodash.flatten@^4.4.0: | ||||||
|  |   version "4.4.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" | ||||||
|  |   integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= | ||||||
|  |  | ||||||
| lodash.includes@^4.3.0: | lodash.includes@^4.3.0: | ||||||
|   version "4.3.0" |   version "4.3.0" | ||||||
|   resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" |   resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" | ||||||
| @@ -2024,6 +2165,11 @@ lodash.once@^4.0.0: | |||||||
|   resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" |   resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" | ||||||
|   integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= |   integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= | ||||||
|  |  | ||||||
|  | lodash.union@^4.6.0: | ||||||
|  |   version "4.6.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" | ||||||
|  |   integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= | ||||||
|  |  | ||||||
| lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: | lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: | ||||||
|   version "4.17.21" |   version "4.17.21" | ||||||
|   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" |   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" | ||||||
| @@ -2143,7 +2289,7 @@ minimist@^1.2.0, minimist@^1.2.5: | |||||||
|   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" |   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" | ||||||
|   integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== |   integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== | ||||||
|  |  | ||||||
| minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: | minipass@^2.6.0, minipass@^2.9.0: | ||||||
|   version "2.9.0" |   version "2.9.0" | ||||||
|   resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" |   resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" | ||||||
|   integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== |   integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== | ||||||
| @@ -2151,7 +2297,7 @@ minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: | |||||||
|     safe-buffer "^5.1.2" |     safe-buffer "^5.1.2" | ||||||
|     yallist "^3.0.0" |     yallist "^3.0.0" | ||||||
|  |  | ||||||
| minizlib@^1.2.1: | minizlib@^1.3.3: | ||||||
|   version "1.3.3" |   version "1.3.3" | ||||||
|   resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" |   resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" | ||||||
|   integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== |   integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== | ||||||
| @@ -2166,7 +2312,7 @@ mixin-deep@^1.2.0: | |||||||
|     for-in "^1.0.2" |     for-in "^1.0.2" | ||||||
|     is-extendable "^1.0.1" |     is-extendable "^1.0.1" | ||||||
|  |  | ||||||
| mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3: | mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: | ||||||
|   version "0.5.5" |   version "0.5.5" | ||||||
|   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" |   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" | ||||||
|   integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== |   integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== | ||||||
| @@ -2754,6 +2900,11 @@ prettier@^2.0.4: | |||||||
|   resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" |   resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" | ||||||
|   integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== |   integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== | ||||||
|  |  | ||||||
|  | printj@~1.1.0: | ||||||
|  |   version "1.1.2" | ||||||
|  |   resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" | ||||||
|  |   integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== | ||||||
|  |  | ||||||
| process-nextick-args@~2.0.0: | process-nextick-args@~2.0.0: | ||||||
|   version "2.0.1" |   version "2.0.1" | ||||||
|   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" |   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" | ||||||
| @@ -2842,7 +2993,7 @@ rc@^1.2.7, rc@^1.2.8: | |||||||
|     minimist "^1.2.0" |     minimist "^1.2.0" | ||||||
|     strip-json-comments "~2.0.1" |     strip-json-comments "~2.0.1" | ||||||
|  |  | ||||||
| readable-stream@2.3.7, readable-stream@^2.0.6: | readable-stream@2.3.7, readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.0.6: | ||||||
|   version "2.3.7" |   version "2.3.7" | ||||||
|   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" |   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" | ||||||
|   integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== |   integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== | ||||||
| @@ -2855,6 +3006,22 @@ readable-stream@2.3.7, readable-stream@^2.0.6: | |||||||
|     string_decoder "~1.1.1" |     string_decoder "~1.1.1" | ||||||
|     util-deprecate "~1.0.1" |     util-deprecate "~1.0.1" | ||||||
|  |  | ||||||
|  | readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: | ||||||
|  |   version "3.6.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" | ||||||
|  |   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== | ||||||
|  |   dependencies: | ||||||
|  |     inherits "^2.0.3" | ||||||
|  |     string_decoder "^1.1.1" | ||||||
|  |     util-deprecate "^1.0.1" | ||||||
|  |  | ||||||
|  | readdir-glob@^1.0.0: | ||||||
|  |   version "1.1.1" | ||||||
|  |   resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" | ||||||
|  |   integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== | ||||||
|  |   dependencies: | ||||||
|  |     minimatch "^3.0.4" | ||||||
|  |  | ||||||
| readdirp@~3.4.0: | readdirp@~3.4.0: | ||||||
|   version "3.4.0" |   version "3.4.0" | ||||||
|   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" |   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" | ||||||
| @@ -3002,7 +3169,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: | |||||||
|   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" |   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" | ||||||
|   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== |   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== | ||||||
|  |  | ||||||
| safe-buffer@^5.0.1, safe-buffer@^5.1.2: | safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: | ||||||
|   version "5.2.1" |   version "5.2.1" | ||||||
|   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" |   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" | ||||||
|   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== |   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== | ||||||
| @@ -3271,6 +3438,13 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: | |||||||
|     is-fullwidth-code-point "^3.0.0" |     is-fullwidth-code-point "^3.0.0" | ||||||
|     strip-ansi "^6.0.0" |     strip-ansi "^6.0.0" | ||||||
|  |  | ||||||
|  | string_decoder@^1.1.1: | ||||||
|  |   version "1.3.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" | ||||||
|  |   integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== | ||||||
|  |   dependencies: | ||||||
|  |     safe-buffer "~5.2.0" | ||||||
|  |  | ||||||
| string_decoder@~1.1.1: | string_decoder@~1.1.1: | ||||||
|   version "1.1.1" |   version "1.1.1" | ||||||
|   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" |   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" | ||||||
| @@ -3350,18 +3524,29 @@ table@^5.2.3: | |||||||
|     slice-ansi "^2.1.0" |     slice-ansi "^2.1.0" | ||||||
|     string-width "^3.0.0" |     string-width "^3.0.0" | ||||||
|  |  | ||||||
| tar@^4, tar@^4.4.2: | tar-stream@^2.2.0: | ||||||
|   version "4.4.15" |   version "2.2.0" | ||||||
|   resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.15.tgz#3caced4f39ebd46ddda4d6203d48493a919697f8" |   resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" | ||||||
|   integrity sha512-ItbufpujXkry7bHH9NpQyTXPbJ72iTlXgkBAYsAjDXk3Ds8t/3NfO5P4xZGy7u+sYuQUbimgzswX4uQIEeNVOA== |   integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== | ||||||
|   dependencies: |   dependencies: | ||||||
|     chownr "^1.1.1" |     bl "^4.0.3" | ||||||
|     fs-minipass "^1.2.5" |     end-of-stream "^1.4.1" | ||||||
|     minipass "^2.8.6" |     fs-constants "^1.0.0" | ||||||
|     minizlib "^1.2.1" |     inherits "^2.0.3" | ||||||
|     mkdirp "^0.5.0" |     readable-stream "^3.1.1" | ||||||
|     safe-buffer "^5.1.2" |  | ||||||
|     yallist "^3.0.3" | tar@^4, tar@^4.4.2: | ||||||
|  |   version "4.4.19" | ||||||
|  |   resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" | ||||||
|  |   integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== | ||||||
|  |   dependencies: | ||||||
|  |     chownr "^1.1.4" | ||||||
|  |     fs-minipass "^1.2.7" | ||||||
|  |     minipass "^2.9.0" | ||||||
|  |     minizlib "^1.3.3" | ||||||
|  |     mkdirp "^0.5.5" | ||||||
|  |     safe-buffer "^5.2.1" | ||||||
|  |     yallist "^3.1.1" | ||||||
|  |  | ||||||
| tarn@^2.0.0: | tarn@^2.0.0: | ||||||
|   version "2.0.0" |   version "2.0.0" | ||||||
| @@ -3587,7 +3772,7 @@ use@^3.1.0: | |||||||
|   resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" |   resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" | ||||||
|   integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== |   integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== | ||||||
|  |  | ||||||
| util-deprecate@~1.0.1: | util-deprecate@^1.0.1, util-deprecate@~1.0.1: | ||||||
|   version "1.0.2" |   version "1.0.2" | ||||||
|   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" |   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" | ||||||
|   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= |   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= | ||||||
| @@ -3721,7 +3906,7 @@ y18n@^4.0.0: | |||||||
|   resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" |   resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" | ||||||
|   integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== |   integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== | ||||||
|  |  | ||||||
| yallist@^3.0.0, yallist@^3.0.3: | yallist@^3.0.0, yallist@^3.1.1: | ||||||
|   version "3.1.1" |   version "3.1.1" | ||||||
|   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" |   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" | ||||||
|   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== |   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== | ||||||
| @@ -3755,3 +3940,12 @@ yargs@^15.4.1: | |||||||
|     which-module "^2.0.0" |     which-module "^2.0.0" | ||||||
|     y18n "^4.0.0" |     y18n "^4.0.0" | ||||||
|     yargs-parser "^18.1.2" |     yargs-parser "^18.1.2" | ||||||
|  |  | ||||||
|  | zip-stream@^4.1.0: | ||||||
|  |   version "4.1.0" | ||||||
|  |   resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" | ||||||
|  |   integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== | ||||||
|  |   dependencies: | ||||||
|  |     archiver-utils "^2.1.0" | ||||||
|  |     compress-commons "^4.1.0" | ||||||
|  |     readable-stream "^3.6.0" | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| # Advanced Configuration | # Advanced Configuration | ||||||
|  |  | ||||||
| ## Best Practice: Use a docker network | ## Best Practice: Use a Docker network | ||||||
|  |  | ||||||
| For those who have a few of their upstream services running in docker on the same docker | For those who have a few of their upstream services running in Docker on the same Docker | ||||||
| host as NPM, here's a trick to secure things a bit better. By creating a custom docker network, | host as NPM, here's a trick to secure things a bit better. By creating a custom Docker network, | ||||||
| you don't need to publish ports for your upstream services to all of the docker host's interfaces. | you don't need to publish ports for your upstream services to all of the Docker host's interfaces. | ||||||
|  |  | ||||||
| Create a network, ie "scoobydoo": | Create a network, ie "scoobydoo": | ||||||
|  |  | ||||||
| @@ -13,7 +13,7 @@ docker network create scoobydoo | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| Then add the following to the `docker-compose.yml` file for both NPM and any other | Then add the following to the `docker-compose.yml` file for both NPM and any other | ||||||
| services running on this docker host: | services running on this Docker host: | ||||||
|  |  | ||||||
| ```yml | ```yml | ||||||
| networks: | networks: | ||||||
| @@ -44,13 +44,13 @@ networks: | |||||||
|  |  | ||||||
| Now in the NPM UI you can create a proxy host with `portainer` as the hostname, | Now in the NPM UI you can create a proxy host with `portainer` as the hostname, | ||||||
| and port `9000` as the port. Even though this port isn't listed in the docker-compose | and port `9000` as the port. Even though this port isn't listed in the docker-compose | ||||||
| file, it's "exposed" by the portainer docker image for you and not available on | file, it's "exposed" by the Portainer Docker image for you and not available on | ||||||
| the docker host outside of this docker network. The service name is used as the | the Docker host outside of this Docker network. The service name is used as the | ||||||
| hostname, so make sure your service names are unique when using the same network. | hostname, so make sure your service names are unique when using the same network. | ||||||
|  |  | ||||||
| ## Docker Healthcheck | ## Docker Healthcheck | ||||||
|  |  | ||||||
| The `Dockerfile` that builds this project does not include a `HEALTCHECK` but you can opt in to this | The `Dockerfile` that builds this project does not include a `HEALTHCHECK` but you can opt in to this | ||||||
| feature by adding the following to the service in your `docker-compose.yml` file: | feature by adding the following to the service in your `docker-compose.yml` file: | ||||||
|  |  | ||||||
| ```yml | ```yml | ||||||
| @@ -128,7 +128,7 @@ services: | |||||||
|  |  | ||||||
| ## Disabling IPv6 | ## Disabling IPv6 | ||||||
|  |  | ||||||
| On some docker hosts IPv6 may not be enabled. In these cases, the following message may be seen in the log: | On some Docker hosts IPv6 may not be enabled. In these cases, the following message may be seen in the log: | ||||||
|  |  | ||||||
| > Address family not supported by protocol | > Address family not supported by protocol | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9154,9 +9154,9 @@ tapable@^1.0.0, tapable@^1.1.3: | |||||||
|   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== |   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== | ||||||
|  |  | ||||||
| tar@^6.0.2: | tar@^6.0.2: | ||||||
|   version "6.1.6" |   version "6.1.11" | ||||||
|   resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.6.tgz#c23d797b0a1efe5d479b1490805c5443f3560c5d" |   resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" | ||||||
|   integrity sha512-oaWyu5dQbHaYcyZCTfyPpC+VmI62/OM2RTUYavTk1MDr1cwW5Boi3baeYQKiZbY2uSQJGr+iMOzb/JFxLrft+g== |   integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== | ||||||
|   dependencies: |   dependencies: | ||||||
|     chownr "^2.0.0" |     chownr "^2.0.0" | ||||||
|     fs-minipass "^2.0.0" |     fs-minipass "^2.0.0" | ||||||
|   | |||||||
| @@ -152,6 +152,51 @@ function FileUpload(path, fd) { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | //ref : https://codepen.io/chrisdpratt/pen/RKxJNo | ||||||
|  | function DownloadFile(verb, path, filename) { | ||||||
|  |     return new Promise(function (resolve, reject) { | ||||||
|  |         let api_url = '/api/'; | ||||||
|  |         let url = api_url + path; | ||||||
|  |         let token = Tokens.getTopToken(); | ||||||
|  |  | ||||||
|  |         $.ajax({ | ||||||
|  |             url: url, | ||||||
|  |             type: verb, | ||||||
|  |             crossDomain: true, | ||||||
|  |             xhrFields: { | ||||||
|  |                 withCredentials: true, | ||||||
|  |                 responseType: 'blob' | ||||||
|  |             }, | ||||||
|  |  | ||||||
|  |             beforeSend: function (xhr) { | ||||||
|  |                 xhr.setRequestHeader('Authorization', 'Bearer ' + (token ? token.t : null)); | ||||||
|  |             }, | ||||||
|  |  | ||||||
|  |             success: function (data) { | ||||||
|  |                 var a = document.createElement('a'); | ||||||
|  |                 var url = window.URL.createObjectURL(data); | ||||||
|  |                 a.href = url; | ||||||
|  |                 a.download = filename; | ||||||
|  |                 document.body.append(a); | ||||||
|  |                 a.click(); | ||||||
|  |                 a.remove(); | ||||||
|  |                 window.URL.revokeObjectURL(url); | ||||||
|  |             }, | ||||||
|  |  | ||||||
|  |             error: function (xhr, status, error_thrown) { | ||||||
|  |                 let code = 400; | ||||||
|  |  | ||||||
|  |                 if (typeof xhr.responseJSON !== 'undefined' && typeof xhr.responseJSON.error !== 'undefined' && typeof xhr.responseJSON.error.message !== 'undefined') { | ||||||
|  |                     error_thrown = xhr.responseJSON.error.message; | ||||||
|  |                     code = xhr.responseJSON.error.code || 500; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 reject(new ApiError(error_thrown, xhr.responseText, code)); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|     status: function () { |     status: function () { | ||||||
|         return fetch('get', ''); |         return fetch('get', ''); | ||||||
| @@ -638,6 +683,14 @@ module.exports = { | |||||||
|              */ |              */ | ||||||
|             renew: function (id, timeout = 180000) { |             renew: function (id, timeout = 180000) { | ||||||
|                 return fetch('post', 'nginx/certificates/' + id + '/renew', undefined, {timeout}); |                 return fetch('post', 'nginx/certificates/' + id + '/renew', undefined, {timeout}); | ||||||
|  |             }, | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * @param   {Number}  id | ||||||
|  |              * @returns {Promise} | ||||||
|  |              */ | ||||||
|  |             download: function (id) { | ||||||
|  |                 return DownloadFile('get', "nginx/certificates/" + id + "/download", "certificate.zip") | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ | |||||||
|             <span class="dropdown-header"><%- i18n('audit-log', 'certificate') %> #<%- id %></span> |             <span class="dropdown-header"><%- i18n('audit-log', 'certificate') %> #<%- id %></span> | ||||||
|             <% if (provider === 'letsencrypt') { %> |             <% if (provider === 'letsencrypt') { %> | ||||||
|                 <a href="#" class="renew dropdown-item"><i class="dropdown-icon fe fe-refresh-cw"></i> <%- i18n('certificates', 'force-renew') %></a> |                 <a href="#" class="renew dropdown-item"><i class="dropdown-icon fe fe-refresh-cw"></i> <%- i18n('certificates', 'force-renew') %></a> | ||||||
|  |                 <a href="#" class="download dropdown-item"><i class="dropdown-icon fe fe-download"></i> <%- i18n('certificates', 'download') %></a> | ||||||
|                 <div class="dropdown-divider"></div> |                 <div class="dropdown-divider"></div> | ||||||
|             <% } %> |             <% } %> | ||||||
|             <a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a> |             <a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a> | ||||||
|   | |||||||
| @@ -11,7 +11,8 @@ module.exports = Mn.View.extend({ | |||||||
|     ui: { |     ui: { | ||||||
|         host_link: '.host-link', |         host_link: '.host-link', | ||||||
|         renew:     'a.renew', |         renew:     'a.renew', | ||||||
|         delete:    'a.delete' |         delete:    'a.delete', | ||||||
|  |         download:  'a.download' | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|     events: { |     events: { | ||||||
| @@ -29,6 +30,11 @@ module.exports = Mn.View.extend({ | |||||||
|             e.preventDefault(); |             e.preventDefault(); | ||||||
|             let win = window.open($(e.currentTarget).attr('rel'), '_blank'); |             let win = window.open($(e.currentTarget).attr('rel'), '_blank'); | ||||||
|             win.focus(); |             win.focus(); | ||||||
|  |         }, | ||||||
|  |          | ||||||
|  |         'click @ui.download': function (e) { | ||||||
|  |             e.preventDefault(); | ||||||
|  |             App.Api.Nginx.Certificates.download(this.model.get('id')) | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |  | ||||||
|   | |||||||
| @@ -188,6 +188,7 @@ | |||||||
|       "other-certificate-key": "Certificate Key", |       "other-certificate-key": "Certificate Key", | ||||||
|       "other-intermediate-certificate": "Intermediate Certificate", |       "other-intermediate-certificate": "Intermediate Certificate", | ||||||
|       "force-renew": "Renew Now", |       "force-renew": "Renew Now", | ||||||
|  |       "download": "Download", | ||||||
|       "renew-title": "Renew Let'sEncrypt Certificate" |       "renew-title": "Renew Let'sEncrypt Certificate" | ||||||
|     }, |     }, | ||||||
|     "access-lists": { |     "access-lists": { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user