diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..9860702e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,36 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +**Checklist** +- Have you pulled and found the error with `jc21/nginx-proxy-manager:latest` docker image? +- Are you sure you're not using someone else's docker image? +- If having problems with Lets Encrypt, have you made absolutely sure your site is accessible from outside of your network? + +**Describe the bug** +- A clear and concise description of what the bug is. +- What version of Nginx Proxy Manager is reported on the login page? + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Operating System** +- Please specify if using a Rpi, Mac, orchestration tool or any other setups that might affect the reproduction of this error. + +**Additional context** +Add any other context about the problem here, docker version, browser version if applicable to the problem. Too much info is better than too little. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..11fc491e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/README.md b/README.md index 18324d8b..589b0c83 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Nginx Proxy Manager - +   diff --git a/doc/DOCKERHUB.md b/doc/DOCKERHUB.md index 5f0cde15..0e1edcea 100644 --- a/doc/DOCKERHUB.md +++ b/doc/DOCKERHUB.md @@ -1,8 +1,8 @@  -# Nginx Proxy Manager +# [Nginx Proxy Manager](https://nginxproxymanager.jc21.com) - +   @@ -14,17 +14,19 @@ running at home or otherwise, including free SSL, without having to know too muc ## Tags -* latest 2, 2.x.x ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile)) -* latest-armhf, 2-armhf, 2.x.x-armhf ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile.armhf)) +* latest 2, 2.x.x ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile)) * latest-arm64, 2-arm64, 2.x.x-arm64 ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile.arm64)) -* 1, 1.x.x ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/1.1.2/Dockerfile)) -* 1-armhf, 1.x.x-armhf ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/1.1.2/Dockerfile.armhf)) +* latest-arm7l, 2-arm7l, 2.x.x-arm7l ([Dockerfile](https://github.com/jc21/nginx-proxy-manager/blob/master/Dockerfile.arm7l)) ## Getting started Please consult the [installation instructions](https://github.com/jc21/nginx-proxy-manager/blob/master/doc/INSTALL.md) for a complete guide or -if you just want to get up and running in the quickest time possible, grab all the files in the [doc/example/](https://github.com/jc21/nginx-proxy-manager/tree/master/doc/example) folder and run `docker-compose up -d` +if you just want to get up and running in the quickest time possible, grab all the files in the [doc/example/](https://github.com/jc21/nginx-proxy-manager/tree/master/doc/example) folder and run: + +```bash +docker-compose up -d +``` ## Screenshots diff --git a/doc/INSTALL.md b/doc/INSTALL.md index 3b06e410..ad74c08d 100644 --- a/doc/INSTALL.md +++ b/doc/INSTALL.md @@ -1,9 +1,13 @@ ## Installation and Configuration -There's a few ways to configure this app depending on: +If you just want to get up and running in the quickest time possible, grab all the files in +the [doc/example/](https://github.com/jc21/nginx-proxy-manager/tree/master/doc/example) +folder and run: + +```bash +docker-compose up -d +``` -- Whether you use `docker-compose` or vanilla docker -- Which architecture you're running it on (raspberry pi also supported - Testers wanted!) ### Configuration File @@ -13,22 +17,22 @@ Don't worry, this is easy to do. The app requires a configuration file to let it know what database you're using. -Here's an example configuration for `mysql` (or mariadb): +Here's an example configuration for `mysql` (or mariadb) that is compatible with the docker-compose example below: ```json { "database": { "engine": "mysql", - "host": "127.0.0.1", - "name": "nginxproxymanager", - "user": "nginxproxymanager", - "password": "password123", + "host": "db", + "name": "npm", + "user": "npm", + "password": "npm", "port": 3306 } } ``` -Once you've created your configuration file it's easy to mount it in the docker container, examples below. +Once you've created your configuration file it's easy to mount it in the docker container. **Note:** After the first run of the application, the config file will be altered to include generated encryption keys unique to your installation. These keys affect the login and session management of the application. If these keys change for any reason, all users will be logged out. @@ -36,37 +40,13 @@ affect the login and session management of the application. If these keys change ### Database -This app doesn't come with a database, you have to provide one yourself. Currently only `mysql/mariadb` is supported. +This app doesn't come with a database, you have to provide one yourself. Currently only `mysql/mariadb` is supported for the minimum versions: -It's easy to use another docker container for your database also and link it as part of the docker stack. Here's an example: +- MySQL v5.7.8+ +- MariaDB v10.2.7+ -```yml -version: "3" -services: - app: - image: jc21/nginx-proxy-manager:latest - restart: always - ports: - - 80:80 - - 81:81 - - 443:443 - volumes: - - ./config.json:/app/config/production.json - - ./data:/data - - ./letsencrypt:/etc/letsencrypt - depends_on: - - db - db: - image: jc21/mariadb-aria - restart: always - environment: - MYSQL_ROOT_PASSWORD: "password123" - MYSQL_DATABASE: "nginxproxymanager" - MYSQL_USER: "nginxproxymanager" - MYSQL_PASSWORD: "password123" - volumes: - - ./data/mysql:/var/lib/mysql -``` +It's easy to use another docker container for your database also and link it as part of the docker stack, so that's what the following examples +are going to use. ### Running the App @@ -80,48 +60,51 @@ services: image: jc21/nginx-proxy-manager:latest restart: always ports: + # Public HTTP Port: - 80:80 - - 81:81 + # Public HTTPS Port: - 443:443 + # Admin Web Port: + - 81:81 volumes: + # Make sure this config.json file exists as per instructions above: - ./config.json:/app/config/production.json - ./data:/data - ./letsencrypt:/etc/letsencrypt + depends_on: + - db + db: + image: mariadb + restart: always + environment: + MYSQL_ROOT_PASSWORD: "npm" + MYSQL_DATABASE: "npm" + MYSQL_USER: "npm" + MYSQL_PASSWORD: "npm" + volumes: + - ./data/mysql:/var/lib/mysql ``` -Vanilla Docker: +Then: ```bash -docker run -d \ - --name nginx-proxy-manager \ - -p 80:80 \ - -p 81:81 \ - -p 443:443 \ - -v /path/to/config.json:/app/config/production.json \ - -v /path/to/data:/data \ - -v /path/to/letsencrypt:/etc/letsencrypt \ - jc21/nginx-proxy-manager:latest +docker-compose up -d ``` -### Running on Raspberry PI / `armhf` +### Running on Raspberry PI / ARM devices -I have created `armhf` and `arm64` docker containers just for you. There may be issues with it, -if you have issues please report them here. +There are docker images for all versions of the Rasberry Pi with the exception of the really old `armv6l` versions. -Note: Rpi v2 and below won't work with these images. +The `latest` docker image is a manifest of all the different architecture docker builds supported, so this means +you don't have to worry about doing anything special and you can follow the common instructions above. -```bash -docker run -d \ - --name nginx-proxy-manager-app \ - -p 80:80 \ - -p 81:81 \ - -p 443:443 \ - -v /path/to/config.json:/app/config/production.json \ - -v /path/to/data:/data \ - -v /path/to/letsencrypt:/etc/letsencrypt \ - jc21/nginx-proxy-manager:latest-armhf -``` +Check out the [dockerhub tags](https://cloud.docker.com/repository/registry-1.docker.io/jc21/nginx-proxy-manager/tags) +for a list of supported architectures and if you want one that doesn't exist, +[create a feature request](https://github.com/jc21/nginx-proxy-manager/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=). + +Also, if you don't know how to already, follow [this guide to install docker and docker-compose](https://manre-universe.net/how-to-run-docker-and-docker-compose-on-raspbian/) +on Raspbian. ### Initial Run @@ -162,4 +145,3 @@ value by specifying it as a Docker environment variable. The default if not spec ``` ... -e "X_FRAME_OPTIONS=sameorigin" ... ``` - diff --git a/doc/example/config.json b/doc/example/config.json index dfc9f049..64ab577c 100644 --- a/doc/example/config.json +++ b/doc/example/config.json @@ -2,9 +2,9 @@ "database": { "engine": "mysql", "host": "db", - "name": "nginxproxymanager", - "user": "nginxproxymanager", - "password": "password123", + "name": "npm", + "user": "npm", + "password": "npm", "port": 3306 } } diff --git a/doc/example/docker-compose.yml b/doc/example/docker-compose.yml index 4547bbc1..e6707b95 100644 --- a/doc/example/docker-compose.yml +++ b/doc/example/docker-compose.yml @@ -1,7 +1,7 @@ version: "3" services: app: - image: jc21/nginx-proxy-manager:2 + image: jc21/nginx-proxy-manager:latest restart: always ports: - 80:80 @@ -17,12 +17,12 @@ services: # if you want pretty colors in your docker logs: - FORCE_COLOR=1 db: - image: jc21/mariadb-aria + image: mariadb:latest restart: always environment: - MYSQL_ROOT_PASSWORD: "password123" - MYSQL_DATABASE: "nginxproxymanager" - MYSQL_USER: "nginxproxymanager" - MYSQL_PASSWORD: "password123" + MYSQL_ROOT_PASSWORD: "npm" + MYSQL_DATABASE: "npm" + MYSQL_USER: "npm" + MYSQL_PASSWORD: "npm" volumes: - ./data/mysql:/var/lib/mysql diff --git a/docker-compose.yml b/docker-compose.yml index 2ff821b2..ab50c910 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,9 +4,9 @@ services: app: image: jc21/nginx-proxy-manager-base:latest ports: - - 8080:80 - - 8081:81 - - 8443:443 + - 80:80 + - 81:81 + - 43:443 environment: - NODE_ENV=development - FORCE_COLOR=1 @@ -22,7 +22,7 @@ services: - db command: node --max_old_space_size=250 --abort_on_uncaught_exception node_modules/nodemon/bin/nodemon.js db: - image: mariadb:10.3.7 + image: jc21/mariadb-aria environment: MYSQL_ROOT_PASSWORD: "npm" MYSQL_DATABASE: "npm" diff --git a/package.json b/package.json index 3ca74ef9..e4d3e2a3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nginx-proxy-manager", - "version": "2.0.12", + "version": "2.0.13", "description": "A beautiful interface for creating Nginx endpoints", "main": "src/backend/index.js", "devDependencies": { @@ -28,7 +28,7 @@ "numeral": "^2.0.6", "sass-loader": "^7.0.3", "style-loader": "^0.22.1", - "tabler-ui": "git+https://github.com/tabler/tabler.git", + "tabler-ui": "git+https://github.com/tabler/tabler.git#00f78ad823311bc3ad974ac3e5b0126198f0a813", "underscore": "^1.8.3", "webpack": "^4.25.1", "webpack-cli": "^3.1.2", diff --git a/rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf b/rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf index 16657c4e..bd905d31 100644 --- a/rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf +++ b/rootfs/etc/nginx/conf.d/include/ssl-ciphers.conf @@ -2,8 +2,8 @@ ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; # intermediate configuration. tweak to your needs. -ssl_protocols TLSv1 TLSv1.1 TLSv1.2; -ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE- +ssl_protocols TLSv1.2 TLSv1.3; +ssl_ciphers 'EECDH+AESGCM:AES256+EECDH:AES256+EDH:EDH+AESGCM:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE- ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AE -S128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; +S128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES'; ssl_prefer_server_ciphers on; diff --git a/src/backend/app.js b/src/backend/app.js index 59802755..03a7b8c7 100644 --- a/src/backend/app.js +++ b/src/backend/app.js @@ -1,5 +1,3 @@ -'use strict'; - const path = require('path'); const express = require('express'); const bodyParser = require('body-parser'); @@ -48,7 +46,7 @@ app.use(function (req, res, next) { res.set({ 'Strict-Transport-Security': 'includeSubDomains; max-age=631138519; preload', - 'X-XSS-Protection': '0', + 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': x_frame_options, 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate', diff --git a/src/backend/db.js b/src/backend/db.js index 6fcf831e..6ad3f34c 100644 --- a/src/backend/db.js +++ b/src/backend/db.js @@ -1,5 +1,3 @@ -'use strict'; - const config = require('config'); if (!config.has('database')) { diff --git a/src/backend/importer.js b/src/backend/importer.js index 8e47ea4e..79b756c0 100644 --- a/src/backend/importer.js +++ b/src/backend/importer.js @@ -1,10 +1,8 @@ -'use strict'; - const fs = require('fs'); const logger = require('./logger').import; const utils = require('./lib/utils'); const batchflow = require('batchflow'); -const debug_mode = process.env.NODE_ENV !== 'production'; +const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; const internalProxyHost = require('./internal/proxy-host'); const internalRedirectionHost = require('./internal/redirection-host'); diff --git a/src/backend/internal/access-list.js b/src/backend/internal/access-list.js index 83dd2e58..0b9f927f 100644 --- a/src/backend/internal/access-list.js +++ b/src/backend/internal/access-list.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const fs = require('fs'); const batchflow = require('batchflow'); diff --git a/src/backend/internal/audit-log.js b/src/backend/internal/audit-log.js index 543b1662..52090ebd 100644 --- a/src/backend/internal/audit-log.js +++ b/src/backend/internal/audit-log.js @@ -1,5 +1,3 @@ -'use strict'; - const error = require('../lib/error'); const auditLogModel = require('../models/audit-log'); @@ -46,9 +44,9 @@ const internalAuditLog = { * @param {Access} access * @param {Object} data * @param {String} data.action - * @param {Integer} [data.user_id] - * @param {Integer} [data.object_id] - * @param {Integer} [data.object_type] + * @param {Number} [data.user_id] + * @param {Number} [data.object_id] + * @param {Number} [data.object_type] * @param {Object} [data.meta] * @returns {Promise} */ diff --git a/src/backend/internal/certificate.js b/src/backend/internal/certificate.js index f081e5a6..89d49767 100644 --- a/src/backend/internal/certificate.js +++ b/src/backend/internal/certificate.js @@ -1,5 +1,3 @@ -'use strict'; - const fs = require('fs'); const _ = require('lodash'); const logger = require('../logger').ssl; @@ -9,19 +7,20 @@ const internalAuditLog = require('./audit-log'); const tempWrite = require('temp-write'); const utils = require('../lib/utils'); const moment = require('moment'); -const debug_mode = process.env.NODE_ENV !== 'production'; +const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; +const le_staging = process.env.NODE_ENV !== 'production'; const internalNginx = require('./nginx'); const internalHost = require('./host'); const certbot_command = '/usr/bin/certbot'; -function omissions () { +function omissions() { return ['is_deleted']; } const internalCertificate = { allowed_ssl_files: ['certificate', 'certificate_key', 'intermediate_certificate'], - interval_timeout: 1000 * 60 * 60 * 12, // 12 hours + interval_timeout: 1000 * 60 * 60, // 1 hour interval: null, interval_processing: false, @@ -38,7 +37,7 @@ const internalCertificate = { internalCertificate.interval_processing = true; logger.info('Renewing SSL certs close to expiry...'); - return utils.exec(certbot_command + ' renew -q ' + (debug_mode ? '--staging' : '')) + return utils.exec(certbot_command + ' renew -q ' + (le_staging ? '--staging' : '')) .then(result => { logger.info(result); @@ -205,7 +204,7 @@ const internalCertificate = { /** * @param {Access} access * @param {Object} data - * @param {Integer} data.id + * @param {Number} data.id * @param {String} [data.email] * @param {String} [data.name] * @return {Promise} @@ -251,7 +250,7 @@ const internalCertificate = { /** * @param {Access} access * @param {Object} data - * @param {Integer} data.id + * @param {Number} data.id * @param {Array} [data.expand] * @param {Array} [data.omit] * @return {Promise} @@ -297,7 +296,7 @@ const internalCertificate = { /** * @param {Access} access * @param {Object} data - * @param {Integer} data.id + * @param {Number} data.id * @param {String} [data.reason] * @returns {Promise} */ @@ -381,7 +380,7 @@ const internalCertificate = { /** * Report use * - * @param {Integer} user_id + * @param {Number} user_id * @param {String} visibility * @returns {Promise} */ @@ -522,7 +521,7 @@ const internalCertificate = { /** * @param {Access} access * @param {Object} data - * @param {Integer} data.id + * @param {Number} data.id * @param {Object} data.files * @returns {Promise} */ @@ -719,9 +718,9 @@ const internalCertificate = { let cmd = certbot_command + ' certonly --cert-name "npm-' + certificate.id + '" --agree-tos ' + '--email "' + certificate.meta.letsencrypt_email + '" ' + - '--preferred-challenges "http" ' + + '--preferred-challenges "dns,http" ' + '-n -a webroot -d "' + certificate.domain_names.join(',') + '" ' + - (debug_mode ? '--staging' : ''); + (le_staging ? '--staging' : ''); if (debug_mode) { logger.info('Command:', cmd); @@ -734,6 +733,48 @@ const internalCertificate = { }); }, + /** + * @param {Access} access + * @param {Object} data + * @param {Number} data.id + * @returns {Promise} + */ + renew: (access, data) => { + return access.can('certificates:update', data) + .then(() => { + return internalCertificate.get(access, data); + }) + .then((certificate) => { + if (certificate.provider === 'letsencrypt') { + return internalCertificate.renewLetsEncryptSsl(certificate) + .then(() => { + return internalCertificate.getCertificateInfoFromFile('/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem') + }) + .then(cert_info => { + return certificateModel + .query() + .patchAndFetchById(certificate.id, { + expires_on: certificateModel.raw('FROM_UNIXTIME(' + cert_info.dates.to + ')') + }); + }) + .then((updated_certificate) => { + // Add to audit log + return internalAuditLog.add(access, { + action: 'renewed', + object_type: 'certificate', + object_id: updated_certificate.id, + meta: updated_certificate + }) + .then(() => { + return updated_certificate; + }); + }) + } else { + throw new error.ValidationError('Only Let\'sEncrypt certificates can be renewed'); + } + }) + }, + /** * @param {Object} certificate the certificate row * @returns {Promise} @@ -741,7 +782,7 @@ const internalCertificate = { renewLetsEncryptSsl: certificate => { logger.info('Renewing Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); - let cmd = certbot_command + ' renew -n --force-renewal --disable-hook-validation --cert-name "npm-' + certificate.id + '" ' + (debug_mode ? '--staging' : ''); + let cmd = certbot_command + ' renew -n --force-renewal --disable-hook-validation --cert-name "npm-' + certificate.id + '" ' + (le_staging ? '--staging' : ''); if (debug_mode) { logger.info('Command:', cmd); @@ -762,17 +803,29 @@ const internalCertificate = { revokeLetsEncryptSsl: (certificate, throw_errors) => { logger.info('Revoking Let\'sEncrypt certificates for Cert #' + certificate.id + ': ' + certificate.domain_names.join(', ')); - let cmd = certbot_command + ' revoke --cert-path "/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem" ' + (debug_mode ? '--staging' : ''); + let revoke_cmd = certbot_command + ' revoke --cert-path "/etc/letsencrypt/live/npm-' + certificate.id + '/fullchain.pem" ' + (le_staging ? '--staging' : ''); + let delete_cmd = certbot_command + ' delete --cert-name "npm-' + certificate.id + '" ' + (le_staging ? '--staging' : ''); if (debug_mode) { - logger.info('Command:', cmd); + logger.info('Command:', revoke_cmd); } - return utils.exec(cmd) - .then(result => { + return utils.exec(revoke_cmd) + .then((result) => { logger.info(result); return result; }) + .then(() => { + if (debug_mode) { + logger.info('Command:', delete_cmd); + } + + return utils.exec(delete_cmd) + .then((result) => { + logger.info(result); + return result; + }) + }) .catch(err => { if (debug_mode) { logger.error(err.message); @@ -796,7 +849,7 @@ const internalCertificate = { /** * @param {Object} in_use_result - * @param {Integer} in_use_result.total_count + * @param {Number} in_use_result.total_count * @param {Array} in_use_result.proxy_hosts * @param {Array} in_use_result.redirection_hosts * @param {Array} in_use_result.dead_hosts @@ -826,7 +879,7 @@ const internalCertificate = { /** * @param {Object} in_use_result - * @param {Integer} in_use_result.total_count + * @param {Number} in_use_result.total_count * @param {Array} in_use_result.proxy_hosts * @param {Array} in_use_result.redirection_hosts * @param {Array} in_use_result.dead_hosts diff --git a/src/backend/internal/dead-host.js b/src/backend/internal/dead-host.js index d4c36a75..9042db1d 100644 --- a/src/backend/internal/dead-host.js +++ b/src/backend/internal/dead-host.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const error = require('../lib/error'); const deadHostModel = require('../models/dead_host'); diff --git a/src/backend/internal/ip_ranges.js b/src/backend/internal/ip_ranges.js index c6ed6200..8e7322a5 100644 --- a/src/backend/internal/ip_ranges.js +++ b/src/backend/internal/ip_ranges.js @@ -1,8 +1,5 @@ -'use strict'; - const https = require('https'); const fs = require('fs'); -const _ = require('lodash'); const logger = require('../logger').ip_ranges; const error = require('../lib/error'); const internalNginx = require('./nginx'); diff --git a/src/backend/internal/nginx.js b/src/backend/internal/nginx.js index faaf77fb..21fdbc0a 100644 --- a/src/backend/internal/nginx.js +++ b/src/backend/internal/nginx.js @@ -4,7 +4,7 @@ const Liquid = require('liquidjs'); const logger = require('../logger').nginx; const utils = require('../lib/utils'); const error = require('../lib/error'); -const debug_mode = process.env.NODE_ENV !== 'production'; +const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; const internalNginx = { @@ -132,7 +132,7 @@ const internalNginx = { /** * Generates custom locations - * @param {Object} host + * @param {Object} host * @returns {Promise} */ renderLocations: (host) => { @@ -146,7 +146,7 @@ const internalNginx = { return; } - let renderer = new Liquid(); + let renderer = new Liquid(); let renderedLocations = ''; const locationRendering = async () => { @@ -162,7 +162,7 @@ const internalNginx = { renderedLocations += await renderer.parseAndRender(template, locationCopy); } - } + }; locationRendering().then(() => resolve(renderedLocations)); }); @@ -207,10 +207,18 @@ const internalNginx = { } if (host.locations) { - origLocations = [].concat(host.locations); + origLocations = [].concat(host.locations); locationsPromise = internalNginx.renderLocations(host).then((renderedLocations) => { host.locations = renderedLocations; }); + + // Allow someone who is using / custom location path to use it, and skip the default / location + _.map(host.locations, (location) => { + if (location.path === '/') { + host.use_default_location = false; + } + }); + } else { locationsPromise = Promise.resolve(); } diff --git a/src/backend/internal/proxy-host.js b/src/backend/internal/proxy-host.js index 9f1d9be8..c8a75ffd 100644 --- a/src/backend/internal/proxy-host.js +++ b/src/backend/internal/proxy-host.js @@ -25,7 +25,7 @@ const internalProxyHost = { } return access.can('proxy_hosts:create', data) - .then(access_data => { + .then(() => { // Get a list of the domain names and check each of them against existing records let domain_name_check_promises = []; @@ -52,7 +52,7 @@ const internalProxyHost = { .omit(omissions()) .insertAndFetch(data); }) - .then(row => { + .then((row) => { if (create_certificate) { return internalCertificate.createQuickCertificate(access, data) .then(cert => { @@ -69,21 +69,21 @@ const internalProxyHost = { return row; } }) - .then(row => { + .then((row) => { // re-fetch with cert return internalProxyHost.get(access, { id: row.id, expand: ['certificate', 'owner', 'access_list'] }); }) - .then(row => { + .then((row) => { // Configure nginx return internalNginx.configure(proxyHostModel, 'proxy_host', row) .then(() => { return row; }); }) - .then(row => { + .then((row) => { // Audit log data.meta = _.assign({}, data.meta || {}, row.meta); diff --git a/src/backend/internal/redirection-host.js b/src/backend/internal/redirection-host.js index 7f2dea56..7817ef29 100644 --- a/src/backend/internal/redirection-host.js +++ b/src/backend/internal/redirection-host.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const error = require('../lib/error'); const redirectionHostModel = require('../models/redirection_host'); diff --git a/src/backend/internal/report.js b/src/backend/internal/report.js index bd4facae..6594f940 100644 --- a/src/backend/internal/report.js +++ b/src/backend/internal/report.js @@ -1,5 +1,3 @@ -'use strict'; - const internalProxyHost = require('./proxy-host'); const internalRedirectionHost = require('./redirection-host'); const internalDeadHost = require('./dead-host'); diff --git a/src/backend/internal/stream.js b/src/backend/internal/stream.js index bb90bd87..3abed218 100644 --- a/src/backend/internal/stream.js +++ b/src/backend/internal/stream.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const error = require('../lib/error'); const streamModel = require('../models/stream'); diff --git a/src/backend/internal/token.js b/src/backend/internal/token.js index 5b074d32..c216ce15 100644 --- a/src/backend/internal/token.js +++ b/src/backend/internal/token.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const error = require('../lib/error'); const userModel = require('../models/user'); diff --git a/src/backend/internal/user.js b/src/backend/internal/user.js index ff9853f7..2253c956 100644 --- a/src/backend/internal/user.js +++ b/src/backend/internal/user.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const error = require('../lib/error'); const userModel = require('../models/user'); diff --git a/src/backend/lib/access.js b/src/backend/lib/access.js index 6b9ab8b6..6f2da739 100644 --- a/src/backend/lib/access.js +++ b/src/backend/lib/access.js @@ -1,5 +1,3 @@ -'use strict'; - /** * Some Notes: This is a friggin complicated piece of code. * diff --git a/src/backend/lib/error.js b/src/backend/lib/error.js index 070952f1..7c0f8cca 100644 --- a/src/backend/lib/error.js +++ b/src/backend/lib/error.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const util = require('util'); diff --git a/src/backend/lib/express/cors.js b/src/backend/lib/express/cors.js index 1a5778e3..8e241acb 100644 --- a/src/backend/lib/express/cors.js +++ b/src/backend/lib/express/cors.js @@ -1,5 +1,3 @@ -'use strict'; - const validator = require('../validator'); module.exports = function (req, res, next) { diff --git a/src/backend/lib/express/jwt-decode.js b/src/backend/lib/express/jwt-decode.js index ce386e4b..d6c2b934 100644 --- a/src/backend/lib/express/jwt-decode.js +++ b/src/backend/lib/express/jwt-decode.js @@ -1,5 +1,3 @@ -'use strict'; - const Access = require('../access'); module.exports = () => { diff --git a/src/backend/lib/express/jwt.js b/src/backend/lib/express/jwt.js index b4e7dfe3..66dba859 100644 --- a/src/backend/lib/express/jwt.js +++ b/src/backend/lib/express/jwt.js @@ -1,5 +1,3 @@ -'use strict'; - module.exports = function () { return function (req, res, next) { if (req.headers.authorization) { diff --git a/src/backend/lib/express/pagination.js b/src/backend/lib/express/pagination.js index c948edf2..70404f64 100644 --- a/src/backend/lib/express/pagination.js +++ b/src/backend/lib/express/pagination.js @@ -1,5 +1,3 @@ -'use strict'; - let _ = require('lodash'); module.exports = function (default_sort, default_offset, default_limit, max_limit) { diff --git a/src/backend/lib/express/user-id-from-me.js b/src/backend/lib/express/user-id-from-me.js index 259b186f..ca18952e 100644 --- a/src/backend/lib/express/user-id-from-me.js +++ b/src/backend/lib/express/user-id-from-me.js @@ -1,5 +1,3 @@ -'use strict'; - module.exports = (req, res, next) => { if (req.params.user_id === 'me' && res.locals.access) { req.params.user_id = res.locals.access.token.get('attrs').id; diff --git a/src/backend/lib/helpers.js b/src/backend/lib/helpers.js index 389cfc5c..7f1aaac3 100644 --- a/src/backend/lib/helpers.js +++ b/src/backend/lib/helpers.js @@ -1,7 +1,4 @@ -'use strict'; - const moment = require('moment'); -const _ = require('lodash'); module.exports = { diff --git a/src/backend/lib/migrate_template.js b/src/backend/lib/migrate_template.js index 68ba6d69..03c3d132 100644 --- a/src/backend/lib/migrate_template.js +++ b/src/backend/lib/migrate_template.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'identifier_for_migrate'; const logger = require('../logger').migrate; diff --git a/src/backend/lib/utils.js b/src/backend/lib/utils.js index 28919b18..910779ea 100644 --- a/src/backend/lib/utils.js +++ b/src/backend/lib/utils.js @@ -1,5 +1,3 @@ -'use strict'; - const exec = require('child_process').exec; module.exports = { diff --git a/src/backend/lib/validator/api.js b/src/backend/lib/validator/api.js index 4f259efe..fbf8c97d 100644 --- a/src/backend/lib/validator/api.js +++ b/src/backend/lib/validator/api.js @@ -1,5 +1,3 @@ -'use strict'; - const error = require('../error'); const path = require('path'); const parser = require('json-schema-ref-parser'); diff --git a/src/backend/lib/validator/index.js b/src/backend/lib/validator/index.js index 46d32f20..44cac50c 100644 --- a/src/backend/lib/validator/index.js +++ b/src/backend/lib/validator/index.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('lodash'); const error = require('../error'); const definitions = require('../../schema/definitions.json'); diff --git a/src/backend/migrate.js b/src/backend/migrate.js index 68267e36..2240cf49 100644 --- a/src/backend/migrate.js +++ b/src/backend/migrate.js @@ -1,5 +1,3 @@ -'use strict'; - const db = require('./db'); const logger = require('./logger').migrate; diff --git a/src/backend/migrations/20180618015850_initial.js b/src/backend/migrations/20180618015850_initial.js index cf288e37..999a29e1 100644 --- a/src/backend/migrations/20180618015850_initial.js +++ b/src/backend/migrations/20180618015850_initial.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'initial-schema'; const logger = require('../logger').migrate; diff --git a/src/backend/migrations/20180929054513_websockets.js b/src/backend/migrations/20180929054513_websockets.js index 63698fa1..22bafce1 100644 --- a/src/backend/migrations/20180929054513_websockets.js +++ b/src/backend/migrations/20180929054513_websockets.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'websockets'; const logger = require('../logger').migrate; diff --git a/src/backend/migrations/20181019052346_forward_host.js b/src/backend/migrations/20181019052346_forward_host.js index 1ca4d0fc..0a8a4311 100644 --- a/src/backend/migrations/20181019052346_forward_host.js +++ b/src/backend/migrations/20181019052346_forward_host.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'forward_host'; const logger = require('../logger').migrate; diff --git a/src/backend/migrations/20181113041458_http2_support.js b/src/backend/migrations/20181113041458_http2_support.js index f416e0a8..16d91625 100644 --- a/src/backend/migrations/20181113041458_http2_support.js +++ b/src/backend/migrations/20181113041458_http2_support.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'http2_support'; const logger = require('../logger').migrate; diff --git a/src/backend/migrations/20181213013211_forward_scheme.js b/src/backend/migrations/20181213013211_forward_scheme.js index e68cecd1..4c02273d 100644 --- a/src/backend/migrations/20181213013211_forward_scheme.js +++ b/src/backend/migrations/20181213013211_forward_scheme.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'forward_scheme'; const logger = require('../logger').migrate; diff --git a/src/backend/migrations/20190104035154_disabled.js b/src/backend/migrations/20190104035154_disabled.js index 308e219d..767112b2 100644 --- a/src/backend/migrations/20190104035154_disabled.js +++ b/src/backend/migrations/20190104035154_disabled.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'disabled'; const logger = require('../logger').migrate; diff --git a/src/backend/migrations/20190215115310_customlocations.js b/src/backend/migrations/20190215115310_customlocations.js index 5b55dd5e..b1766ac1 100644 --- a/src/backend/migrations/20190215115310_customlocations.js +++ b/src/backend/migrations/20190215115310_customlocations.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'custom_locations'; const logger = require('../logger').migrate; diff --git a/src/backend/migrations/20190218060101_hsts.js b/src/backend/migrations/20190218060101_hsts.js index 752d3320..50812a30 100644 --- a/src/backend/migrations/20190218060101_hsts.js +++ b/src/backend/migrations/20190218060101_hsts.js @@ -1,5 +1,3 @@ -'use strict'; - const migrate_name = 'hsts'; const logger = require('../logger').migrate; diff --git a/src/backend/models/access_list.js b/src/backend/models/access_list.js index 9d620afb..1c7cb51e 100644 --- a/src/backend/models/access_list.js +++ b/src/backend/models/access_list.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const User = require('./user'); diff --git a/src/backend/models/access_list_auth.js b/src/backend/models/access_list_auth.js index 7c251b65..e4ebd204 100644 --- a/src/backend/models/access_list_auth.js +++ b/src/backend/models/access_list_auth.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; diff --git a/src/backend/models/audit-log.js b/src/backend/models/audit-log.js index 6220ade3..31da1748 100644 --- a/src/backend/models/audit-log.js +++ b/src/backend/models/audit-log.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const User = require('./user'); diff --git a/src/backend/models/auth.js b/src/backend/models/auth.js index 38d2dd54..b793a6fd 100644 --- a/src/backend/models/auth.js +++ b/src/backend/models/auth.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const bcrypt = require('bcrypt'); const db = require('../db'); const Model = require('objection').Model; diff --git a/src/backend/models/certificate.js b/src/backend/models/certificate.js index b211ee7c..8d016755 100644 --- a/src/backend/models/certificate.js +++ b/src/backend/models/certificate.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const User = require('./user'); diff --git a/src/backend/models/dead_host.js b/src/backend/models/dead_host.js index c900ebc8..d8357157 100644 --- a/src/backend/models/dead_host.js +++ b/src/backend/models/dead_host.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const User = require('./user'); diff --git a/src/backend/models/proxy_host.js b/src/backend/models/proxy_host.js index faa5d068..801796a1 100644 --- a/src/backend/models/proxy_host.js +++ b/src/backend/models/proxy_host.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const User = require('./user'); diff --git a/src/backend/models/redirection_host.js b/src/backend/models/redirection_host.js index 49f12710..c7157f65 100644 --- a/src/backend/models/redirection_host.js +++ b/src/backend/models/redirection_host.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const User = require('./user'); diff --git a/src/backend/models/stream.js b/src/backend/models/stream.js index a22bf323..5394f725 100644 --- a/src/backend/models/stream.js +++ b/src/backend/models/stream.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const User = require('./user'); diff --git a/src/backend/models/token.js b/src/backend/models/token.js index e3853108..8db5d72a 100644 --- a/src/backend/models/token.js +++ b/src/backend/models/token.js @@ -3,8 +3,6 @@ and then has abilities after that. */ -'use strict'; - const _ = require('lodash'); const config = require('config'); const jwt = require('jsonwebtoken'); diff --git a/src/backend/models/user.js b/src/backend/models/user.js index 0873b65a..09df952b 100644 --- a/src/backend/models/user.js +++ b/src/backend/models/user.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; const UserPermission = require('./user_permission'); diff --git a/src/backend/models/user_permission.js b/src/backend/models/user_permission.js index 5848a9ea..5ffcfa04 100644 --- a/src/backend/models/user_permission.js +++ b/src/backend/models/user_permission.js @@ -1,8 +1,6 @@ // Objection Docs: // http://vincit.github.io/objection.js/ -'use strict'; - const db = require('../db'); const Model = require('objection').Model; diff --git a/src/backend/routes/api/audit-log.js b/src/backend/routes/api/audit-log.js index 36a0357f..ac60537d 100644 --- a/src/backend/routes/api/audit-log.js +++ b/src/backend/routes/api/audit-log.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../lib/validator'); const jwtdecode = require('../../lib/express/jwt-decode'); diff --git a/src/backend/routes/api/main.js b/src/backend/routes/api/main.js index a9c885c4..bdbe08fa 100644 --- a/src/backend/routes/api/main.js +++ b/src/backend/routes/api/main.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const pjson = require('../../../../package.json'); const error = require('../../lib/error'); diff --git a/src/backend/routes/api/nginx/access_lists.js b/src/backend/routes/api/nginx/access_lists.js index 46883887..8c9cd16a 100644 --- a/src/backend/routes/api/nginx/access_lists.js +++ b/src/backend/routes/api/nginx/access_lists.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../../lib/validator'); const jwtdecode = require('../../../lib/express/jwt-decode'); diff --git a/src/backend/routes/api/nginx/certificates.js b/src/backend/routes/api/nginx/certificates.js index 04fafdf7..4c873bc0 100644 --- a/src/backend/routes/api/nginx/certificates.js +++ b/src/backend/routes/api/nginx/certificates.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../../lib/validator'); const jwtdecode = require('../../../lib/express/jwt-decode'); @@ -94,13 +92,13 @@ router certificate_id: { $ref: 'definitions#/definitions/id' }, - expand: { + expand: { $ref: 'definitions#/definitions/expand' } } }, { certificate_id: req.params.certificate_id, - expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) + expand: (typeof req.query.expand === 'string' ? req.query.expand.split(',') : null) }) .then(data => { return internalCertificate.get(res.locals.access, { @@ -181,6 +179,34 @@ router } }); +/** + * Renew LE Certs + * + * /api/nginx/certificates/123/renew + */ +router + .route('/:certificate_id/renew') + .options((req, res) => { + res.sendStatus(204); + }) + .all(jwtdecode()) + + /** + * POST /api/nginx/certificates/123/renew + * + * Renew certificate + */ + .post((req, res, next) => { + internalCertificate.renew(res.locals.access, { + id: parseInt(req.params.certificate_id, 10) + }) + .then(result => { + res.status(200) + .send(result); + }) + .catch(next); + }); + /** * Validate Certs before saving * diff --git a/src/backend/routes/api/nginx/dead_hosts.js b/src/backend/routes/api/nginx/dead_hosts.js index 5e7a367e..b0270a68 100644 --- a/src/backend/routes/api/nginx/dead_hosts.js +++ b/src/backend/routes/api/nginx/dead_hosts.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../../lib/validator'); const jwtdecode = require('../../../lib/express/jwt-decode'); diff --git a/src/backend/routes/api/nginx/proxy_hosts.js b/src/backend/routes/api/nginx/proxy_hosts.js index 718f135e..97d04eda 100644 --- a/src/backend/routes/api/nginx/proxy_hosts.js +++ b/src/backend/routes/api/nginx/proxy_hosts.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../../lib/validator'); const jwtdecode = require('../../../lib/express/jwt-decode'); diff --git a/src/backend/routes/api/nginx/redirection_hosts.js b/src/backend/routes/api/nginx/redirection_hosts.js index 501d5601..48eef30e 100644 --- a/src/backend/routes/api/nginx/redirection_hosts.js +++ b/src/backend/routes/api/nginx/redirection_hosts.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../../lib/validator'); const jwtdecode = require('../../../lib/express/jwt-decode'); diff --git a/src/backend/routes/api/nginx/streams.js b/src/backend/routes/api/nginx/streams.js index 857f325c..fd062ee0 100644 --- a/src/backend/routes/api/nginx/streams.js +++ b/src/backend/routes/api/nginx/streams.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../../lib/validator'); const jwtdecode = require('../../../lib/express/jwt-decode'); diff --git a/src/backend/routes/api/reports.js b/src/backend/routes/api/reports.js index d14d8bd3..a02e6da0 100644 --- a/src/backend/routes/api/reports.js +++ b/src/backend/routes/api/reports.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const jwtdecode = require('../../lib/express/jwt-decode'); const internalReport = require('../../internal/report'); diff --git a/src/backend/routes/api/tokens.js b/src/backend/routes/api/tokens.js index 54207907..1fdf2512 100644 --- a/src/backend/routes/api/tokens.js +++ b/src/backend/routes/api/tokens.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const jwtdecode = require('../../lib/express/jwt-decode'); const internalToken = require('../../internal/token'); diff --git a/src/backend/routes/api/users.js b/src/backend/routes/api/users.js index f4495512..1d559370 100644 --- a/src/backend/routes/api/users.js +++ b/src/backend/routes/api/users.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const validator = require('../../lib/validator'); const jwtdecode = require('../../lib/express/jwt-decode'); diff --git a/src/backend/routes/main.js b/src/backend/routes/main.js index 8b4f9a53..27731ab3 100644 --- a/src/backend/routes/main.js +++ b/src/backend/routes/main.js @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const fs = require('fs'); const PACKAGE = require('../../../package.json'); diff --git a/src/backend/setup.js b/src/backend/setup.js index 3a660806..ef870cbe 100644 --- a/src/backend/setup.js +++ b/src/backend/setup.js @@ -1,5 +1,3 @@ -'use strict'; - const fs = require('fs'); const NodeRSA = require('node-rsa'); const config = require('config'); @@ -7,7 +5,7 @@ const logger = require('./logger').setup; const userModel = require('./models/user'); const userPermissionModel = require('./models/user_permission'); const authModel = require('./models/auth'); -const debug_mode = process.env.NODE_ENV !== 'production'; +const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG; module.exports = function () { return new Promise((resolve, reject) => { diff --git a/src/frontend/js/app/api.js b/src/frontend/js/app/api.js index c8d57193..74356f06 100644 --- a/src/frontend/js/app/api.js +++ b/src/frontend/js/app/api.js @@ -1,5 +1,3 @@ -'use strict'; - const $ = require('jquery'); const _ = require('underscore'); const Tokens = require('./tokens'); @@ -11,8 +9,8 @@ const Tokens = require('./tokens'); * @constructor */ const ApiError = function (message, debug, code) { - let temp = Error.call(this, message); - temp.name = this.name = 'ApiError'; + let temp = Error.call(this, message); + temp.name = this.name = 'ApiError'; this.stack = temp.stack; this.message = temp.message; this.debug = debug; @@ -35,7 +33,7 @@ ApiError.prototype = Object.create(Error.prototype, { * @param {Object} [options] * @returns {Promise} */ -function fetch (verb, path, data, options) { +function fetch(verb, path, data, options) { options = options || {}; return new Promise(function (resolve, reject) { @@ -55,7 +53,7 @@ function fetch (verb, path, data, options) { contentType: options.contentType || 'application/json; charset=UTF-8', processData: options.processData || true, crossDomain: true, - timeout: options.timeout ? options.timeout : 15000, + timeout: options.timeout ? options.timeout : 30000, xhrFields: { withCredentials: true }, @@ -99,7 +97,7 @@ function fetch (verb, path, data, options) { * @param {Array} expand * @returns {String} */ -function makeExpansionString (expand) { +function makeExpansionString(expand) { let items = []; _.forEach(expand, function (exp) { items.push(encodeURIComponent(exp)); @@ -114,7 +112,7 @@ function makeExpansionString (expand) { * @param {String} [query] * @returns {Promise} */ -function getAllObjects (path, expand, query) { +function getAllObjects(path, expand, query) { let params = []; if (typeof expand === 'object' && expand !== null && expand.length) { @@ -128,20 +126,7 @@ function getAllObjects (path, expand, query) { return fetch('get', path + (params.length ? '?' + params.join('&') : '')); } -/** - * @param {String} path - * @param {FormData} form_data - * @returns {Promise} - */ -function upload (path, form_data) { - console.log('UPLOAD:', path, form_data); - return fetch('post', path, form_data, { - contentType: 'multipart/form-data', - processData: false - }); -} - -function FileUpload (path, fd) { +function FileUpload(path, fd) { return new Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); let token = Tokens.getTopToken(); @@ -214,7 +199,7 @@ module.exports = { Users: { /** - * @param {Integer|String} user_id + * @param {Number|String} user_id * @param {Array} [expand] * @returns {Promise} */ @@ -639,6 +624,14 @@ module.exports = { */ validate: function (form_data) { return FileUpload('nginx/certificates/validate', form_data); + }, + + /** + * @param {Number} id + * @returns {Promise} + */ + renew: function (id) { + return fetch('post', 'nginx/certificates/' + id + '/renew'); } } }, diff --git a/src/frontend/js/app/audit-log/list/item.js b/src/frontend/js/app/audit-log/list/item.js index f154931f..862ffc22 100644 --- a/src/frontend/js/app/audit-log/list/item.js +++ b/src/frontend/js/app/audit-log/list/item.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const Controller = require('../../controller'); const template = require('./item.ejs'); diff --git a/src/frontend/js/app/audit-log/list/main.js b/src/frontend/js/app/audit-log/list/main.js index bbe75beb..88e639e8 100644 --- a/src/frontend/js/app/audit-log/list/main.js +++ b/src/frontend/js/app/audit-log/list/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const ItemView = require('./item'); const template = require('./main.ejs'); diff --git a/src/frontend/js/app/audit-log/main.js b/src/frontend/js/app/audit-log/main.js index b9c2f15d..ec9b5368 100644 --- a/src/frontend/js/app/audit-log/main.js +++ b/src/frontend/js/app/audit-log/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const App = require('../main'); const AuditLogModel = require('../../models/audit-log'); diff --git a/src/frontend/js/app/audit-log/meta.js b/src/frontend/js/app/audit-log/meta.js index 9ec962bd..815cdfac 100644 --- a/src/frontend/js/app/audit-log/meta.js +++ b/src/frontend/js/app/audit-log/meta.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const template = require('./meta.ejs'); diff --git a/src/frontend/js/app/cache.js b/src/frontend/js/app/cache.js index 9e6534f1..6d1fbc4f 100644 --- a/src/frontend/js/app/cache.js +++ b/src/frontend/js/app/cache.js @@ -1,5 +1,3 @@ -'use strict'; - const UserModel = require('../models/user'); let cache = { diff --git a/src/frontend/js/app/controller.js b/src/frontend/js/app/controller.js index 7e516434..902659be 100644 --- a/src/frontend/js/app/controller.js +++ b/src/frontend/js/app/controller.js @@ -1,5 +1,3 @@ -'use strict'; - const Backbone = require('backbone'); const Cache = require('./cache'); const Tokens = require('./tokens'); @@ -342,6 +340,19 @@ module.exports = { } }, + /** + * Certificate Renew + * + * @param model + */ + showNginxCertificateRenew: function (model) { + if (Cache.User.isAdmin() || Cache.User.canManage('certificates')) { + require(['./main', './nginx/certificates/renew'], function (App, View) { + App.UI.showModalDialog(new View({model: model})); + }); + } + }, + /** * Certificate Delete Confirm * diff --git a/src/frontend/js/app/dashboard/main.js b/src/frontend/js/app/dashboard/main.js index 9d768183..c2e82f85 100644 --- a/src/frontend/js/app/dashboard/main.js +++ b/src/frontend/js/app/dashboard/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const Cache = require('../cache'); const Controller = require('../controller'); diff --git a/src/frontend/js/app/empty/main.js b/src/frontend/js/app/empty/main.js index e6f54e45..74998d65 100644 --- a/src/frontend/js/app/empty/main.js +++ b/src/frontend/js/app/empty/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const template = require('./main.ejs'); diff --git a/src/frontend/js/app/error/main.js b/src/frontend/js/app/error/main.js index 431fb17f..6fa85fc8 100644 --- a/src/frontend/js/app/error/main.js +++ b/src/frontend/js/app/error/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const template = require('./main.ejs'); diff --git a/src/frontend/js/app/help/main.js b/src/frontend/js/app/help/main.js index c5787775..b0f54374 100644 --- a/src/frontend/js/app/help/main.js +++ b/src/frontend/js/app/help/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const template = require('./main.ejs'); diff --git a/src/frontend/js/app/i18n.js b/src/frontend/js/app/i18n.js index 451f1968..c63cdc07 100644 --- a/src/frontend/js/app/i18n.js +++ b/src/frontend/js/app/i18n.js @@ -1,5 +1,3 @@ -'use strict'; - const Cache = ('./cache'); const messages = require('../i18n/messages.json'); diff --git a/src/frontend/js/app/main.js b/src/frontend/js/app/main.js index 09236420..e85b4f62 100644 --- a/src/frontend/js/app/main.js +++ b/src/frontend/js/app/main.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('underscore'); const Backbone = require('backbone'); const Mn = require('../lib/marionette'); diff --git a/src/frontend/js/app/nginx/access/delete.js b/src/frontend/js/app/nginx/access/delete.js index e4660cb1..4af91ab1 100644 --- a/src/frontend/js/app/nginx/access/delete.js +++ b/src/frontend/js/app/nginx/access/delete.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const App = require('../../main'); const template = require('./delete.ejs'); diff --git a/src/frontend/js/app/nginx/access/form.js b/src/frontend/js/app/nginx/access/form.js index 89c1020b..d4e77c90 100644 --- a/src/frontend/js/app/nginx/access/form.js +++ b/src/frontend/js/app/nginx/access/form.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const App = require('../../main'); const AccessListModel = require('../../../models/access-list'); diff --git a/src/frontend/js/app/nginx/access/form/item.js b/src/frontend/js/app/nginx/access/form/item.js index 07c86b96..f15238dc 100644 --- a/src/frontend/js/app/nginx/access/form/item.js +++ b/src/frontend/js/app/nginx/access/form/item.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const template = require('./item.ejs'); diff --git a/src/frontend/js/app/nginx/access/list/item.js b/src/frontend/js/app/nginx/access/list/item.js index d6498d52..4f68aead 100644 --- a/src/frontend/js/app/nginx/access/list/item.js +++ b/src/frontend/js/app/nginx/access/list/item.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const App = require('../../../main'); const template = require('./item.ejs'); diff --git a/src/frontend/js/app/nginx/access/list/main.js b/src/frontend/js/app/nginx/access/list/main.js index d5b7aa75..a1fb6521 100644 --- a/src/frontend/js/app/nginx/access/list/main.js +++ b/src/frontend/js/app/nginx/access/list/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const App = require('../../../main'); const ItemView = require('./item'); diff --git a/src/frontend/js/app/nginx/access/main.js b/src/frontend/js/app/nginx/access/main.js index 21e54f0f..6b86f55c 100644 --- a/src/frontend/js/app/nginx/access/main.js +++ b/src/frontend/js/app/nginx/access/main.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const App = require('../../main'); const AccessListModel = require('../../../models/access-list'); diff --git a/src/frontend/js/app/nginx/certificates/delete.js b/src/frontend/js/app/nginx/certificates/delete.js index 2499bad1..426e2506 100644 --- a/src/frontend/js/app/nginx/certificates/delete.js +++ b/src/frontend/js/app/nginx/certificates/delete.js @@ -1,5 +1,3 @@ -'use strict'; - const Mn = require('backbone.marionette'); const App = require('../../main'); const template = require('./delete.ejs'); @@ -16,7 +14,6 @@ module.exports = Mn.View.extend({ }, events: { - 'click @ui.save': function (e) { e.preventDefault(); diff --git a/src/frontend/js/app/nginx/certificates/form.js b/src/frontend/js/app/nginx/certificates/form.js index bde6599e..4c315c15 100644 --- a/src/frontend/js/app/nginx/certificates/form.js +++ b/src/frontend/js/app/nginx/certificates/form.js @@ -1,5 +1,3 @@ -'use strict'; - const _ = require('underscore'); const Mn = require('backbone.marionette'); const App = require('../../main'); diff --git a/src/frontend/js/app/nginx/certificates/list/item.ejs b/src/frontend/js/app/nginx/certificates/list/item.ejs index ad22fb51..dd794052 100644 --- a/src/frontend/js/app/nginx/certificates/list/item.ejs +++ b/src/frontend/js/app/nginx/certificates/list/item.ejs @@ -5,16 +5,23 @@