diff --git a/.version b/.version index e70b452..6a6a3d8 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -2.6.0 +2.6.1 diff --git a/README.md b/README.md index b94dbcd..c798a6f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ <p align="center"> <img src="https://nginxproxymanager.com/github.png"> <br><br> - <img src="https://img.shields.io/badge/version-2.6.0-green.svg?style=for-the-badge"> + <img src="https://img.shields.io/badge/version-2.6.1-green.svg?style=for-the-badge"> <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"> </a> diff --git a/backend/templates/proxy_host.conf b/backend/templates/proxy_host.conf index 1c2c0e7..17a5210 100644 --- a/backend/templates/proxy_host.conf +++ b/backend/templates/proxy_host.conf @@ -37,7 +37,9 @@ server { {% endfor %}deny all; # Access checks must... + {% if access_list.satisfy %} {{ access_list.satisfy }}; + {% endif %} {% endif %} diff --git a/frontend/js/app/api.js b/frontend/js/app/api.js index baa5cb1..9d11d26 100644 --- a/frontend/js/app/api.js +++ b/frontend/js/app/api.js @@ -139,7 +139,11 @@ function FileUpload(path, fd) { xhr.onreadystatechange = function () { if (this.readyState === XMLHttpRequest.DONE) { if (xhr.status !== 200 && xhr.status !== 201) { - reject(new Error('Upload failed: ' + xhr.status)); + try { + reject(new Error('Upload failed: ' + JSON.parse(xhr.responseText).error.message)); + } catch (err) { + reject(new Error('Upload failed: ' + xhr.status)); + } } else { resolve(xhr.responseText); } @@ -587,7 +591,8 @@ module.exports = { * @param {Object} data */ create: function (data) { - const timeout = 180000 + (data.meta.propagation_seconds ? Number(data.meta.propagation_seconds) * 1000 : 0); + + const timeout = 180000 + (data && data.meta && data.meta.propagation_seconds ? Number(data.meta.propagation_seconds) * 1000 : 0); return fetch('post', 'nginx/certificates', data, {timeout}); }, diff --git a/frontend/js/app/nginx/certificates/form.ejs b/frontend/js/app/nginx/certificates/form.ejs index 270ab71..4e40e0b 100644 --- a/frontend/js/app/nginx/certificates/form.ejs +++ b/frontend/js/app/nginx/certificates/form.ejs @@ -4,17 +4,14 @@ <button type="button" class="close cancel non-loader-content" aria-label="Close" data-dismiss="modal"> </button> </div> <div class="modal-body"> + <div class="alert alert-danger mb-0 rounded-0" id="le-error-info" role="alert"></div> <div class="text-center loader-content"> <div class="loader mx-auto my-6"></div> - <p><%- i18n('ssl', 'obtaining-certificate-info') %></p> + <p><%- i18n('ssl', 'processing-info') %></p> </div> <form class="non-loader-content"> <div class="row"> <% if (provider === 'letsencrypt') { %> - <div class="col-sm-12 col-md-12"> - <div class="alert alert-danger" id="le-error-info" role="alert"></div> - </div> - <div class="col-sm-12 col-md-12"> <div class="form-group"> <label class="form-label"><%- i18n('all-hosts', 'domain-names') %> <span class="form-required">*</span></label> diff --git a/frontend/js/app/nginx/certificates/form.js b/frontend/js/app/nginx/certificates/form.js index 677ba9a..ff488cb 100644 --- a/frontend/js/app/nginx/certificates/form.js +++ b/frontend/js/app/nginx/certificates/form.js @@ -76,47 +76,44 @@ module.exports = Mn.View.extend({ return; } - let view = this; let data = this.ui.form.serializeJSON(); data.provider = this.model.get('provider'); - - - - let domain_err = false; - if (!data.meta.dns_challenge) { - data.domain_names.split(',').map(function (name) { - if (name.match(/\*/im)) { - domain_err = true; - } - }); - } - - if (domain_err) { - alert(i18n('ssl', 'no-wildcard-without-dns')); - return; - } - - // Manipulate - if (typeof data.meta === 'undefined') data.meta = {}; - data.meta.letsencrypt_agree = data.meta.letsencrypt_agree == 1; - data.meta.dns_challenge = data.meta.dns_challenge == 1; - - if(!data.meta.dns_challenge){ - data.meta.dns_provider = undefined; - data.meta.dns_provider_credentials = undefined; - data.meta.propagation_seconds = undefined; - } else { - if(data.meta.propagation_seconds === '') data.meta.propagation_seconds = undefined; - } - - if (typeof data.domain_names === 'string' && data.domain_names) { - data.domain_names = data.domain_names.split(','); - } - let ssl_files = []; - // check files are attached - if (this.model.get('provider') === 'other' && !this.model.hasSslFiles()) { + if (data.provider === 'letsencrypt') { + if (typeof data.meta === 'undefined') data.meta = {}; + + let domain_err = false; + if (!data.meta.dns_challenge) { + data.domain_names.split(',').map(function (name) { + if (name.match(/\*/im)) { + domain_err = true; + } + }); + } + + if (domain_err) { + alert(i18n('ssl', 'no-wildcard-without-dns')); + return; + } + + // Manipulate + data.meta.letsencrypt_agree = data.meta.letsencrypt_agree == 1; + data.meta.dns_challenge = data.meta.dns_challenge == 1; + + if(!data.meta.dns_challenge){ + data.meta.dns_provider = undefined; + data.meta.dns_provider_credentials = undefined; + data.meta.propagation_seconds = undefined; + } else { + if(data.meta.propagation_seconds === '') data.meta.propagation_seconds = undefined; + } + + if (typeof data.domain_names === 'string' && data.domain_names) { + data.domain_names = data.domain_names.split(','); + } + } else if (data.provider === 'other' && !this.model.hasSslFiles()) { + // check files are attached if (!this.ui.other_certificate[0].files.length || !this.ui.other_certificate[0].files[0].size) { alert('Certificate file is not attached'); return; @@ -153,14 +150,14 @@ module.exports = Mn.View.extend({ // compile file data let form_data = new FormData(); - if (view.model.get('provider') && ssl_files.length) { + if (data.provider === 'other' && ssl_files.length) { ssl_files.map(function (file) { form_data.append(file.name, file.file); }); } new Promise(resolve => { - if (view.model.get('provider') === 'other') { + if (data.provider === 'other') { resolve(App.Api.Nginx.Certificates.validate(form_data)); } else { resolve(); @@ -170,13 +167,13 @@ module.exports = Mn.View.extend({ return App.Api.Nginx.Certificates.create(data); }) .then(result => { - view.model.set(result); + this.model.set(result); // Now upload the certs if we need to - if (view.model.get('provider') === 'other') { - return App.Api.Nginx.Certificates.upload(view.model.get('id'), form_data) + if (data.provider === 'other') { + return App.Api.Nginx.Certificates.upload(this.model.get('id'), form_data) .then(result => { - view.model.set('meta', _.assign({}, view.model.get('meta'), result)); + this.model.set('meta', _.assign({}, this.model.get('meta'), result)); }); } }) @@ -187,7 +184,7 @@ module.exports = Mn.View.extend({ }) .catch(err => { let more_info = ''; - if(err.code === 500 && err.debug){ + if (err.code === 500 && err.debug) { try{ more_info = JSON.parse(err.debug).debug.stack.join("\n"); } catch(e) {} diff --git a/frontend/js/i18n/messages.json b/frontend/js/i18n/messages.json index 4bfb190..8ce201a 100644 --- a/frontend/js/i18n/messages.json +++ b/frontend/js/i18n/messages.json @@ -112,7 +112,7 @@ "stored-as-plaintext-info": "This data will be stored as plaintext in the database!", "propagation-seconds": "Propagation Seconds", "propagation-seconds-info": "Leave empty to use the plugins default value. Number of seconds to wait for DNS propagation.", - "obtaining-certificate-info": "Obtaining certificate... This might take a few minutes." + "processing-info": "Processing... This might take a few minutes." }, "proxy-hosts": { "title": "Proxy Hosts",