mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-31 15:53:33 +00:00 
			
		
		
		
	Removed v1 cruft
This commit is contained in:
		| @@ -1,12 +0,0 @@ | ||||
| { | ||||
|   "presets": [ | ||||
|     ["env", { | ||||
|       "targets": { | ||||
|         "browsers": ["Chrome >= 65"] | ||||
|       }, | ||||
|       "debug": false, | ||||
|       "modules": false, | ||||
|       "useBuiltIns": "usage" | ||||
|     }] | ||||
|   ] | ||||
| } | ||||
| @@ -1,172 +0,0 @@ | ||||
| /*jshint node:true */ | ||||
|  | ||||
| 'use strict'; | ||||
|  | ||||
| const path          = require('path'); | ||||
| const gulp          = require('gulp'); | ||||
| const gutil         = require('gulp-util'); | ||||
| const concat        = require('gulp-concat-util'); | ||||
| const runSequence   = require('run-sequence'); | ||||
| const webpack       = require('webpack'); | ||||
| const webpackStream = require('webpack-stream'); | ||||
| const imagemin      = require('gulp-imagemin'); | ||||
| const del           = require('del'); | ||||
| const bump          = require('gulp-bump'); | ||||
| const sass          = require('gulp-sass'); | ||||
| const ejs           = require('gulp-ejs'); | ||||
| const PACKAGE       = require('./package.json'); | ||||
|  | ||||
| const assets = { | ||||
|     views:  { | ||||
|         watch: 'src/frontend/views/**/*.ejs', | ||||
|         src:   'src/frontend/views/*.ejs', | ||||
|         dest:  'dist/' | ||||
|     }, | ||||
|     fonts:  { | ||||
|         watch: 'src/frontend/fonts/**/*.{ttf,woff,woff2,eof,eot,svg,otf}', | ||||
|         dest:  'dist/fonts' | ||||
|     }, | ||||
|     images: { | ||||
|         watch: 'src/frontend/images/**/*.{png,jpg,gif}', | ||||
|         dest:  'dist/images' | ||||
|     }, | ||||
|     scss:   { | ||||
|         watch:    'src/frontend/scss/**/*.scss', | ||||
|         loadPath: 'src/frontend/scss', | ||||
|         src:      'src/frontend/scss/styles.scss', | ||||
|         dest:     'dist/css' | ||||
|     }, | ||||
|     js:     { | ||||
|         watch: 'src/frontend/js/**/*', | ||||
|         src:   'src/frontend/js/main.js', | ||||
|         dest:  'dist/js/' | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * @param color | ||||
|  * @param label | ||||
|  * @returns {Function} | ||||
|  */ | ||||
| function logger (color, label) { | ||||
|     return function () { | ||||
|         let args = Array.prototype.slice.call(arguments); | ||||
|         args.unshift(gutil.colors[color].bold(label.toUpperCase() + ':')); | ||||
|         gutil.log.apply(null, args); | ||||
|     }; | ||||
| } | ||||
|  | ||||
| gutil.error  = logger('red', 'error'); | ||||
| gutil.warn   = logger('yellow', 'warn'); | ||||
| gutil.notice = logger('white', 'notice'); | ||||
|  | ||||
| /** | ||||
|  * @param err | ||||
|  */ | ||||
| function handleError (err) { | ||||
|     gutil.error(err.stack); | ||||
| } | ||||
|  | ||||
| /***************************** | ||||
|  TASKS | ||||
|  ******************************/ | ||||
|  | ||||
| /** | ||||
|  * clean | ||||
|  */ | ||||
| gulp.task('clean', function (cb) { | ||||
|     del(['./dist/*']) | ||||
|         .then(function () { | ||||
|             cb(); | ||||
|         }) | ||||
|         .catch(handleError); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * images | ||||
|  */ | ||||
| gulp.task('images', function () { | ||||
|     if (process.arch !== 'arm') { | ||||
|         return gulp.src(assets.images.watch) | ||||
|             .pipe(imagemin({ | ||||
|                 optimizationLevel: 7 | ||||
|             })) | ||||
|             .pipe(gulp.dest(assets.images.dest)) | ||||
|             .on('error', handleError); | ||||
|     } else { | ||||
|         return gulp.src(assets.images.watch) | ||||
|             .pipe(gulp.dest(assets.images.dest)) | ||||
|             .on('error', handleError); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * fonts | ||||
|  */ | ||||
| gulp.task('fonts', function () { | ||||
|     return gulp.src(assets.fonts.watch) | ||||
|         .pipe(gulp.dest(assets.fonts.dest)) | ||||
|         .on('error', handleError); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * scss | ||||
|  */ | ||||
| gulp.task('scss', function () { | ||||
|     return gulp.src(assets.scss.src) | ||||
|         .pipe(sass().on('error', sass.logError)) | ||||
|         .pipe(concat.header('@import url(\'https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,700\');@import url(\'https://fonts.googleapis.com/css?family=Roboto:100,200,300,400,500,600,700|Roboto+Condensed:300,400,700\');')) | ||||
|         .pipe(gulp.dest(path.resolve(assets.scss.dest))); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * js | ||||
|  */ | ||||
| gulp.task('js', function () { | ||||
|     return gulp.src(assets.js.src) | ||||
|         .pipe(webpackStream(require('./webpack.config.js'), webpack)) | ||||
|         .pipe(gulp.dest(assets.js.dest)) | ||||
|         .on('error', handleError); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * views | ||||
|  */ | ||||
| gulp.task('views', function () { | ||||
|     return gulp.src(assets.views.src) | ||||
|         .pipe(ejs({ | ||||
|             version: PACKAGE.version | ||||
|         }, {}, { | ||||
|             ext: '.html' | ||||
|         })) | ||||
|         .on('error', handleError) | ||||
|         .pipe(gulp.dest(assets.views.dest)); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * bump | ||||
|  */ | ||||
| gulp.task('bump', function () { | ||||
|     gulp.src('./package.json') | ||||
|         .pipe(bump({type: 'version'})) | ||||
|         .pipe(gulp.dest('./')); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * build | ||||
|  */ | ||||
| gulp.task('build', function (cb) { | ||||
|     runSequence('clean', ['images', 'fonts', 'scss', 'js', 'views'], cb); | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * default | ||||
|  */ | ||||
| gulp.task('default', ['build'], function () { | ||||
|     gulp.watch(assets.scss.watch, ['scss']); | ||||
|     gulp.watch(assets.images.watch, ['images']); | ||||
|     gulp.watch(assets.fonts.watch, ['fonts']); | ||||
|     gulp.watch(assets.js.watch, ['js']); | ||||
|     gulp.watch(assets.views.watch, ['views']); | ||||
|     gulp.watch('./webpack.config.js', ['js']); | ||||
| }); | ||||
| @@ -1,60 +0,0 @@ | ||||
| { | ||||
|   "name": "nginx-proxy-manager", | ||||
|   "version": "1.1.2", | ||||
|   "description": "Nginx proxt with built in Web based management", | ||||
|   "main": "src/backend/index.js", | ||||
|   "dependencies": { | ||||
|     "ajv": "^5.5.1", | ||||
|     "batchflow": "^0.4.0", | ||||
|     "body-parser": "^1.18.2", | ||||
|     "compression": "^1.7.1", | ||||
|     "diskdb": "^0.1.17", | ||||
|     "ejs": "^2.5.7", | ||||
|     "express": "^4.16.2", | ||||
|     "express-winston": "^2.4.0", | ||||
|     "json-schema-ref-parser": "^4.0.4", | ||||
|     "lodash": "^4.17.4", | ||||
|     "path": "^0.12.7", | ||||
|     "unix-timestamp": "^0.2.0", | ||||
|     "winston": "^2.4.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "babel-core": "^6.26.3", | ||||
|     "babel-loader": "^7.1.4", | ||||
|     "babel-minify-webpack-plugin": "^0.3.1", | ||||
|     "babel-preset-env": "^1.7.0", | ||||
|     "backbone": "1.3.3", | ||||
|     "backbone-virtual-collection": "^0.6.15", | ||||
|     "backbone.marionette": "3.4.1", | ||||
|     "backbone.radio": "2.0.0", | ||||
|     "bootstrap": "^3.3.7", | ||||
|     "del": "^3.0.0", | ||||
|     "ejs-loader": "^0.3.0", | ||||
|     "es6-promise": "^4.1.1", | ||||
|     "font-awesome": "^4.7.0", | ||||
|     "form-serializer": "^2.5.0", | ||||
|     "gulp": "^3.9.1", | ||||
|     "gulp-bump": "^2.7.0", | ||||
|     "gulp-concat-util": "^0.5.5", | ||||
|     "gulp-ejs": "^3.0.1", | ||||
|     "gulp-imagemin": "^3.3.0", | ||||
|     "gulp-sass": "^4.0.1", | ||||
|     "gulp-util": "^3.0.8", | ||||
|     "image-size": "^0.6.1", | ||||
|     "jquery": "^3.2.1", | ||||
|     "jquery-serializejson": "^2.8.1", | ||||
|     "normalize-css": "^2.3.1", | ||||
|     "prepack-webpack-plugin": "^1.1.0", | ||||
|     "run-sequence": "^2.2.0", | ||||
|     "underscore": "^1.8.3", | ||||
|     "webpack": "^4.12.0", | ||||
|     "webpack-cli": "^3.0.8", | ||||
|     "webpack-stream": "^4.0.0", | ||||
|     "webpack-visualizer-plugin": "^0.1.11" | ||||
|   }, | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "Jamie Curnow <jc@jc21.com>", | ||||
|   "license": "MIT" | ||||
| } | ||||
| @@ -1,22 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn          = require('backbone.marionette'); | ||||
| const template    = require('./empty.ejs'); | ||||
| const AccessModel = require('../../models/access'); | ||||
| const Controller  = require('../controller'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|     tagName:  'tr', | ||||
|  | ||||
|     ui: { | ||||
|         create: 'button' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.create': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showAccessListForm(new AccessModel.Model); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,61 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn              = require('backbone.marionette'); | ||||
| const Api             = require('../api'); | ||||
| const template        = require('./main.ejs'); | ||||
| const Controller      = require('../controller'); | ||||
| const RowView         = require('./row'); | ||||
| const AccessListModel = require('../../models/access'); | ||||
| const EmptyView       = require('./empty'); | ||||
|  | ||||
| const TableBody = Mn.CollectionView.extend({ | ||||
|     tagName:   'tbody', | ||||
|     childView: RowView | ||||
| }); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|     id:       'access', | ||||
|  | ||||
|     regions: { | ||||
|         list_region: { | ||||
|             el:             'tbody', | ||||
|             replaceElement: true | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     ui: { | ||||
|         'create': 'th button' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.create': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showAccessListForm(new AccessListModel.Model); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     onRender: function () { | ||||
|         let view = this; | ||||
|  | ||||
|         Api.Access.getAll() | ||||
|             .then(response => { | ||||
|                 if (!view.isDestroyed()) { | ||||
|                     if (response && response.length) { | ||||
|                         view.showChildView('list_region', new TableBody({ | ||||
|                             collection: new AccessListModel.Collection(response) | ||||
|                         })); | ||||
|                     } else { | ||||
|                         view.showChildView('list_region', new EmptyView()); | ||||
|                     } | ||||
|  | ||||
|                     view.trigger('loaded'); | ||||
|                 } | ||||
|             }) | ||||
|             .catch(err => { | ||||
|                 Controller.showError(err, 'Could not fetch Access Lists'); | ||||
|                 view.trigger('loaded'); | ||||
|             }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| @@ -1,31 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./row.ejs'); | ||||
| const Controller = require('../controller'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|     tagName:  'tr', | ||||
|  | ||||
|     ui: { | ||||
|         edit:   'button.edit', | ||||
|         delete: 'button.delete' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.edit': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showAccessListForm(this.model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.delete': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showDeleteAccessList(this.model); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     initialize: function () { | ||||
|         this.listenTo(this.model, 'change', this.render); | ||||
|     } | ||||
| }); | ||||
| @@ -1,34 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./delete.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const Api        = require('../api'); | ||||
| const App        = require('../main'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         buttons: 'form button', | ||||
|         delete:  'button.delete' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.delete': function (e) { | ||||
|             e.preventDefault(); | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|  | ||||
|             Api.Access.delete(this.model.get('_id')) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                     Controller.showAccess(); | ||||
|                 }) | ||||
|                 .catch(err => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,8 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./item.ejs'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template | ||||
| }); | ||||
| @@ -1,160 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const $ = require('jquery'); | ||||
|  | ||||
| /** | ||||
|  * @param {String} message | ||||
|  * @param {*}      debug | ||||
|  * @param {Number} code | ||||
|  * @constructor | ||||
|  */ | ||||
| const ApiError = function (message, debug, code) { | ||||
|     let temp  = Error.call(this, message); | ||||
|     temp.name = this.name = 'ApiError'; | ||||
|  | ||||
|     this.stack   = temp.stack; | ||||
|     this.message = temp.message; | ||||
|     this.debug   = debug; | ||||
|     this.code    = code; | ||||
| }; | ||||
|  | ||||
| ApiError.prototype = Object.create(Error.prototype, { | ||||
|     constructor: { | ||||
|         value:        ApiError, | ||||
|         writable:     true, | ||||
|         configurable: true | ||||
|     } | ||||
| }); | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @param {String} verb | ||||
|  * @param {String} path | ||||
|  * @param {Object} [data] | ||||
|  * @param {Object} [options] | ||||
|  * @returns {Promise} | ||||
|  */ | ||||
| function fetch (verb, path, data, options) { | ||||
|     options = options || {}; | ||||
|  | ||||
|     return new Promise(function (resolve, reject) { | ||||
|         let api_url = '/api/'; | ||||
|         let url     = api_url + path; | ||||
|  | ||||
|         $.ajax({ | ||||
|             url:         url, | ||||
|             data:        typeof data === 'object' && data !== null ? JSON.stringify(data) : data, | ||||
|             type:        verb, | ||||
|             dataType:    'json', | ||||
|             contentType: 'application/json; charset=UTF-8', | ||||
|             crossDomain: true, | ||||
|             timeout:     (options.timeout ? options.timeout : 30000), | ||||
|             xhrFields:   { | ||||
|                 withCredentials: true | ||||
|             }, | ||||
|  | ||||
|             success: function (data, textStatus, response) { | ||||
|                 resolve(response); | ||||
|             }, | ||||
|  | ||||
|             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 = { | ||||
|     status: function () { | ||||
|         return fetch('get', ''); | ||||
|     }, | ||||
|  | ||||
|     Hosts: { | ||||
|  | ||||
|         /** | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         getAll: function () { | ||||
|             return fetch('get', 'hosts'); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * @param   {Object}  data | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         create: function (data) { | ||||
|             return fetch('post', 'hosts', data); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * @param   {Object}   data | ||||
|          * @param   {String}   data._id | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         update: function (data) { | ||||
|             let _id = data._id; | ||||
|             delete data._id; | ||||
|             return fetch('put', 'hosts/' + _id, data); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * @param   {String}  _id | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         delete: function (_id) { | ||||
|             return fetch('delete', 'hosts/' + _id); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * @param   {String}  _id | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         reconfigure: function (_id) { | ||||
|             return fetch('post', 'hosts/' + _id + '/reconfigure'); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     Access: { | ||||
|  | ||||
|         /** | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         getAll: function () { | ||||
|             return fetch('get', 'access'); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * @param   {Object}  data | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         create: function (data) { | ||||
|             return fetch('post', 'access', data); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * @param   {Object}   data | ||||
|          * @param   {String}   data._id | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         update: function (data) { | ||||
|             let _id = data._id; | ||||
|             delete data._id; | ||||
|             return fetch('put', 'access/' + _id, data); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * @param   {String}  _id | ||||
|          * @returns {Promise} | ||||
|          */ | ||||
|         delete: function (_id) { | ||||
|             return fetch('delete', 'access/' + _id); | ||||
|         } | ||||
|     } | ||||
| }; | ||||
| @@ -1,171 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Backbone = require('backbone'); | ||||
| const Cache    = require('./cache'); | ||||
|  | ||||
| module.exports = { | ||||
|  | ||||
|     /** | ||||
|      * @param {String} route | ||||
|      * @param {Object} [options] | ||||
|      * @returns {Boolean} | ||||
|      */ | ||||
|     navigate: function (route, options) { | ||||
|         options = options || {}; | ||||
|         Backbone.history.navigate(route.toString(), options); | ||||
|         return true; | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Dashboard | ||||
|      */ | ||||
|     showDashboard: function () { | ||||
|         let controller = this; | ||||
|         require(['./main', './dashboard/main'], (App, View) => { | ||||
|             controller.navigate('/'); | ||||
|             App.UI.showMainLoading(); | ||||
|  | ||||
|             let view = new View(); | ||||
|  | ||||
|             view.on('loaded', function () { | ||||
|                 App.UI.hideMainLoading(); | ||||
|             }); | ||||
|  | ||||
|             App.UI.showChildView('main_region', view); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Access | ||||
|      */ | ||||
|     showAccess: function () { | ||||
|         let controller = this; | ||||
|         require(['./main', './access/main'], (App, View) => { | ||||
|             controller.navigate('/access'); | ||||
|             App.UI.showMainLoading(); | ||||
|  | ||||
|             let view = new View(); | ||||
|  | ||||
|             view.on('loaded', function () { | ||||
|                 App.UI.hideMainLoading(); | ||||
|             }); | ||||
|  | ||||
|             App.UI.showChildView('main_region', view); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show Proxy Host Form | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showProxyHostForm: function (model) { | ||||
|         require(['./main', './host/proxy_form'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show Redirection Host Form | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showRedirectionHostForm: function (model) { | ||||
|         require(['./main', './host/redirection_form'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show 404 Host Form | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     show404HostForm: function (model) { | ||||
|         require(['./main', './host/404_form'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show Stream Host Form | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showStreamHostForm: function (model) { | ||||
|         require(['./main', './host/stream_form'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show Delete Host Confirmation | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showDeleteHost: function (model) { | ||||
|         require(['./main', './host/delete'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show Reconfigure Host | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showReconfigureHost: function (model) { | ||||
|         require(['./main', './host/reconfigure'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show Advanced Host | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showAdvancedHost: function (model) { | ||||
|         require(['./main', './host/advanced'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Show Access List Form | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showAccessListForm: function (model) { | ||||
|         require(['./main', './access_list/form'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Show Delete Access List Confirmation | ||||
|      * | ||||
|      * @param model | ||||
|      */ | ||||
|     showDeleteAccessList: function (model) { | ||||
|         require(['./main', './access_list/delete'], function (App, View) { | ||||
|             App.UI.showModalDialog(new View({model: model})); | ||||
|         }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Error | ||||
|      * | ||||
|      * @param {Error}   err | ||||
|      * @param {String}  nice_msg | ||||
|      */ | ||||
|     showError: function (err, nice_msg) { | ||||
|         require(['./main', './error/main'], (App, View) => { | ||||
|             App.UI.showChildView('main_region', new View({ | ||||
|                 err:      err, | ||||
|                 nice_msg: nice_msg | ||||
|             })); | ||||
|         }); | ||||
|     } | ||||
| }; | ||||
| @@ -1,34 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./empty.ejs'); | ||||
| const HostModel  = require('../../models/host'); | ||||
| const Controller = require('../controller'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|     tagName:  'tr', | ||||
|  | ||||
|     ui: { | ||||
|         proxy:       'button.proxy', | ||||
|         redirection: 'button.redirection', | ||||
|         '404':       'button.404' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.proxy': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showProxyHostForm(new HostModel.Model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.redirection': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showRedirectionHostForm(new HostModel.Model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.404': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.show404HostForm(new HostModel.Model); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,80 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const Api        = require('../api'); | ||||
| const template   = require('./main.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const RowView    = require('./row'); | ||||
| const HostModel  = require('../../models/host'); | ||||
| const EmptyView  = require('./empty'); | ||||
|  | ||||
| const TableBody = Mn.CollectionView.extend({ | ||||
|     tagName:   'tbody', | ||||
|     childView: RowView | ||||
| }); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|     id:       'dashboard', | ||||
|  | ||||
|     regions: { | ||||
|         list_region: { | ||||
|             el:             'tbody', | ||||
|             replaceElement: true | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     ui: { | ||||
|         new_proxy:       'th .new-proxy', | ||||
|         new_redirection: 'th .new-redirection', | ||||
|         new_404:         'th .new-404', | ||||
|         new_stream:      'th .new-stream' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.new_proxy': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showProxyHostForm(new HostModel.Model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.new_redirection': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showRedirectionHostForm(new HostModel.Model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.new_404': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.show404HostForm(new HostModel.Model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.new_stream': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showStreamHostForm(new HostModel.Model); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     onRender: function () { | ||||
|         let view = this; | ||||
|  | ||||
|         Api.Hosts.getAll() | ||||
|             .then(response => { | ||||
|                 if (!view.isDestroyed()) { | ||||
|                     if (response && response.length) { | ||||
|  | ||||
|                         view.showChildView('list_region', new TableBody({ | ||||
|                             collection: new HostModel.Collection(response) | ||||
|                         })); | ||||
|                     } else { | ||||
|                         view.showChildView('list_region', new EmptyView()); | ||||
|                     } | ||||
|  | ||||
|                     view.trigger('loaded'); | ||||
|                 } | ||||
|             }) | ||||
|             .catch(err => { | ||||
|                 Controller.showError(err, 'Could not fetch Hosts'); | ||||
|                 view.trigger('loaded'); | ||||
|             }); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| @@ -1,63 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn              = require('backbone.marionette'); | ||||
| const template        = require('./row.ejs'); | ||||
| const Controller      = require('../controller'); | ||||
| const AccessListModel = require('../../models/access'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|     tagName:  'tr', | ||||
|  | ||||
|     ui: { | ||||
|         edit:        'button.edit', | ||||
|         delete:      'button.delete', | ||||
|         access_list: 'a.access_list', | ||||
|         reconfigure: 'button.reconfigure', | ||||
|         advanced:    'button.advanced' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.edit': function (e) { | ||||
|             e.preventDefault(); | ||||
|             switch (this.model.get('type')) { | ||||
|                 case 'proxy': | ||||
|                     Controller.showProxyHostForm(this.model); | ||||
|                     break; | ||||
|                 case 'redirection': | ||||
|                     Controller.showRedirectionHostForm(this.model); | ||||
|                     break; | ||||
|                 case '404': | ||||
|                     Controller.show404HostForm(this.model); | ||||
|                     break; | ||||
|                 case 'stream': | ||||
|                     Controller.showStreamHostForm(this.model); | ||||
|                     break; | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         'click @ui.delete': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showDeleteHost(this.model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.access_list': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showAccessListForm(new AccessListModel.Model(this.model.get('access_list'))); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.reconfigure': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showReconfigureHost(this.model); | ||||
|         }, | ||||
|  | ||||
|         'click @ui.advanced': function (e) { | ||||
|             e.preventDefault(); | ||||
|             Controller.showAdvancedHost(this.model); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     initialize: function () { | ||||
|         this.listenTo(this.model, 'change', this.render); | ||||
|     } | ||||
| }); | ||||
| @@ -1,32 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn       = require('backbone.marionette'); | ||||
| const template = require('./main.ejs'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     id: 'error', | ||||
|     template: template, | ||||
|  | ||||
|     options: { | ||||
|         err: null, | ||||
|         nice_msg: 'Unknown error' | ||||
|     }, | ||||
|  | ||||
|     templateContext: function () { | ||||
|         let view = this; | ||||
|         return { | ||||
|             getNiceMessage: function () { | ||||
|                 return view.options.nice_msg; | ||||
|             }, | ||||
|  | ||||
|             getErrorMessage: function () { | ||||
|                 return view.options.err ? view.options.err.message : ''; | ||||
|             } | ||||
|         }; | ||||
|     }, | ||||
|  | ||||
|     initialize: function () { | ||||
|         console.error(this.options.err); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| @@ -1,77 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const _          = require('lodash'); | ||||
| const template   = require('./404_form.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const Api        = require('../api'); | ||||
| const App        = require('../main'); | ||||
|  | ||||
| require('jquery-serializejson'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         form:              'form', | ||||
|         buttons:           'form button', | ||||
|         ssl_options:       '.ssl_options', | ||||
|         ssl:               'input[name="ssl"]', | ||||
|         letsencrypt_email: 'input[name="letsencrypt_email"]', | ||||
|         accept_tos:        'input[name="accept_tos"]' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'change @ui.ssl': function (e) { | ||||
|             let inputs = this.ui.letsencrypt_email.add(this.ui.accept_tos); | ||||
|             if (this.ui.ssl.prop('checked')) { | ||||
|                 this.ui.ssl_options.show(); | ||||
|                 inputs.prop('required', true); | ||||
|             } else { | ||||
|                 this.ui.ssl_options.hide(); | ||||
|                 inputs.prop('required', false); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         'submit @ui.form': function (e) { | ||||
|             e.preventDefault(); | ||||
|             let data = _.extend({}, this.ui.form.serializeJSON()); | ||||
|  | ||||
|             // Change text true's to bools | ||||
|             _.map(data, function (val, key) { | ||||
|                 if (val === 'true') { | ||||
|                     data[key] = true; | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             // This is a 404 host | ||||
|             data.type = '404'; | ||||
|  | ||||
|             // accept_tos is not required for backend | ||||
|             delete data.accept_tos; | ||||
|  | ||||
|             if (!data.ssl) { | ||||
|                 delete data.letsencrypt_email; | ||||
|             } | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|             let method = Api.Hosts.create; | ||||
|  | ||||
|             if (this.model.get('_id')) { | ||||
|                 // edit | ||||
|                 method  = Api.Hosts.update; | ||||
|                 data._id = this.model.get('_id'); | ||||
|             } | ||||
|  | ||||
|             method(data) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                     Controller.showDashboard(); | ||||
|                 }) | ||||
|                 .catch(err => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,38 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./advanced.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const Api        = require('../api'); | ||||
| const App        = require('../main'); | ||||
|  | ||||
| require('jquery-serializejson'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         form:    'form', | ||||
|         buttons: 'form button' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'submit @ui.form': function (e) { | ||||
|             e.preventDefault(); | ||||
|             let data = this.ui.form.serializeJSON(); | ||||
|             data._id = this.model.get('_id'); | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|  | ||||
|             Api.Hosts.update(data) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                     Controller.showDashboard(); | ||||
|                 }) | ||||
|                 .catch((err) => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,34 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./delete.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const Api        = require('../api'); | ||||
| const App        = require('../main'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         buttons: 'form button', | ||||
|         delete:  'button.delete' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.delete': function (e) { | ||||
|             e.preventDefault(); | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|  | ||||
|             Api.Hosts.delete(this.model.get('_id')) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                     Controller.showDashboard(); | ||||
|                 }) | ||||
|                 .catch(err => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,107 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const _          = require('lodash'); | ||||
| const template   = require('./proxy_form.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const Api        = require('../api'); | ||||
| const App        = require('../main'); | ||||
|  | ||||
| require('jquery-serializejson'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         form:              'form', | ||||
|         buttons:           'form button', | ||||
|         ssl_options:       '.ssl_options', | ||||
|         ssl:               'input[name="ssl"]', | ||||
|         letsencrypt_email: 'input[name="letsencrypt_email"]', | ||||
|         accept_tos:        'input[name="accept_tos"]', | ||||
|         access_list_id:    'select[name="access_list_id"]' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'change @ui.ssl': function (e) { | ||||
|             let inputs = this.ui.letsencrypt_email.add(this.ui.accept_tos); | ||||
|             if (this.ui.ssl.prop('checked')) { | ||||
|                 this.ui.ssl_options.show(); | ||||
|                 inputs.prop('required', true); | ||||
|             } else { | ||||
|                 this.ui.ssl_options.hide(); | ||||
|                 inputs.prop('required', false); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         'submit @ui.form': function (e) { | ||||
|             e.preventDefault(); | ||||
|             let data = _.extend({}, this.ui.form.serializeJSON()); | ||||
|  | ||||
|             // Change text true's to bools | ||||
|             _.map(data, function (val, key) { | ||||
|                 if (val === 'true') { | ||||
|                     data[key] = true; | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             data.type = 'proxy'; | ||||
|  | ||||
|             // Port is integer | ||||
|             data.forward_port = parseInt(data.forward_port, 10); | ||||
|  | ||||
|             // accept_tos is not required for backend | ||||
|             delete data.accept_tos; | ||||
|             delete data.access_list; | ||||
|  | ||||
|             if (!data.ssl) { | ||||
|                 delete data.letsencrypt_email; | ||||
|                 delete data.force_ssl; | ||||
|             } | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|             let method = Api.Hosts.create; | ||||
|  | ||||
|             if (this.model.get('_id')) { | ||||
|                 // edit | ||||
|                 method  = Api.Hosts.update; | ||||
|                 data._id = this.model.get('_id'); | ||||
|             } | ||||
|  | ||||
|             method(data) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                     Controller.showDashboard(); | ||||
|                 }) | ||||
|                 .catch((err) => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     onRender: function () { | ||||
|         let view = this; | ||||
|  | ||||
|         Api.Access.getAll() | ||||
|             .then(response => { | ||||
|                 if (!view.isDestroyed()) { | ||||
|                     view.ui.access_list_id.empty().append($('<option>').val('').text('None (Publicly Accessible)')); | ||||
|  | ||||
|                     if (response && response.length) { | ||||
|                         _.map(response, access => { | ||||
|                             view.ui.access_list_id.append($('<option>').val(access._id).text(access.name)); | ||||
|                         }); | ||||
|                     } | ||||
|  | ||||
|                     if (this.model.get('access_list_id')) { | ||||
|                         view.ui.access_list_id.val(this.model.get('access_list_id')); | ||||
|                     } | ||||
|                 } | ||||
|             }) | ||||
|             .catch(err => { | ||||
|                 alert("Error loading Access Lists!\n\n" + err.message); | ||||
|                 App.UI.closeModal(); | ||||
|             }); | ||||
|     } | ||||
| }); | ||||
| @@ -1,32 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn       = require('backbone.marionette'); | ||||
| const template = require('./reconfigure.ejs'); | ||||
| const Api      = require('../api'); | ||||
| const App      = require('../main'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         buttons:     'form button', | ||||
|         reconfigure: 'button.reconfigure' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.reconfigure': function (e) { | ||||
|             e.preventDefault(); | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|  | ||||
|             Api.Hosts.reconfigure(this.model.get('_id')) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                 }) | ||||
|                 .catch(err => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,77 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const _          = require('lodash'); | ||||
| const template   = require('./redirection_form.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const Api        = require('../api'); | ||||
| const App        = require('../main'); | ||||
|  | ||||
| require('jquery-serializejson'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         form:              'form', | ||||
|         buttons:           'form button', | ||||
|         ssl_options:       '.ssl_options', | ||||
|         ssl:               'input[name="ssl"]', | ||||
|         letsencrypt_email: 'input[name="letsencrypt_email"]', | ||||
|         accept_tos:        'input[name="accept_tos"]' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'change @ui.ssl': function (e) { | ||||
|             let inputs = this.ui.letsencrypt_email.add(this.ui.accept_tos); | ||||
|             if (this.ui.ssl.prop('checked')) { | ||||
|                 this.ui.ssl_options.show(); | ||||
|                 inputs.prop('required', true); | ||||
|             } else { | ||||
|                 this.ui.ssl_options.hide(); | ||||
|                 inputs.prop('required', false); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         'submit @ui.form': function (e) { | ||||
|             e.preventDefault(); | ||||
|             let data = _.extend({}, this.ui.form.serializeJSON()); | ||||
|  | ||||
|             // Change text true's to bools | ||||
|             _.map(data, function (val, key) { | ||||
|                 if (val === 'true') { | ||||
|                     data[key] = true; | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|             data.type = 'redirection'; | ||||
|  | ||||
|             // accept_tos is not required for backend | ||||
|             delete data.accept_tos; | ||||
|  | ||||
|             if (!data.ssl) { | ||||
|                 delete data.letsencrypt_email; | ||||
|                 delete data.force_ssl; | ||||
|             } | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|             let method = Api.Hosts.create; | ||||
|  | ||||
|             if (this.model.get('_id')) { | ||||
|                 // edit | ||||
|                 method  = Api.Hosts.update; | ||||
|                 data._id = this.model.get('_id'); | ||||
|             } | ||||
|  | ||||
|             method(data) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                     Controller.showDashboard(); | ||||
|                 }) | ||||
|                 .catch((err) => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,62 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const _          = require('lodash'); | ||||
| const template   = require('./stream_form.ejs'); | ||||
| const Controller = require('../controller'); | ||||
| const Api        = require('../api'); | ||||
| const App        = require('../main'); | ||||
|  | ||||
| require('jquery-serializejson'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         form:    'form', | ||||
|         buttons: 'form button' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'submit @ui.form': function (e) { | ||||
|             e.preventDefault(); | ||||
|             let data = _.extend({}, this.ui.form.serializeJSON()); | ||||
|  | ||||
|             data.type = 'stream'; | ||||
|  | ||||
|             // Ports are integers | ||||
|             data.incoming_port = parseInt(data.incoming_port, 10); | ||||
|             data.forward_port  = parseInt(data.forward_port, 10); | ||||
|  | ||||
|             if (typeof data.protocols === 'undefined' || !data.protocols.length) { | ||||
|                 alert('You must select one or more Protocols'); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             this.ui.buttons.prop('disabled', true).addClass('btn-disabled'); | ||||
|             let method = Api.Hosts.create; | ||||
|  | ||||
|             if (this.model.get('_id')) { | ||||
|                 // edit | ||||
|                 method   = Api.Hosts.update; | ||||
|                 data._id = this.model.get('_id'); | ||||
|             } | ||||
|  | ||||
|             method(data) | ||||
|                 .then((/*result*/) => { | ||||
|                     App.UI.closeModal(); | ||||
|                     Controller.showDashboard(); | ||||
|                 }) | ||||
|                 .catch((err) => { | ||||
|                     alert(err.message); | ||||
|                     this.ui.buttons.prop('disabled', false).removeClass('btn-disabled'); | ||||
|                 }); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     templateContext: { | ||||
|         hasStreamProtocol: function (protocol) { | ||||
|             return this.protocols.indexOf(protocol) !== -1; | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,119 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const $          = require('jquery'); | ||||
| const _          = require('underscore'); | ||||
| const Backbone   = require('backbone'); | ||||
| const Mn         = require('../lib/marionette'); | ||||
| const Cache      = require('./cache'); | ||||
| const Controller = require('./controller'); | ||||
| const Router     = require('./router'); | ||||
| const UI         = require('./ui/main'); | ||||
| const Api        = require('./api'); | ||||
|  | ||||
| const App = Mn.Application.extend({ | ||||
|  | ||||
|     region:     '#app', | ||||
|     Cache:      Cache, | ||||
|     Api:        Api, | ||||
|     UI:         null, | ||||
|     Controller: Controller, | ||||
|     version:    null, | ||||
|  | ||||
|     onStart: function (app, options) { | ||||
|         console.log('Welcome to Nginx Proxy Manager'); | ||||
|  | ||||
|         let myapp = this; | ||||
|  | ||||
|         Api.status() | ||||
|             .then(result => { | ||||
|                 this.version = [result.version.major, result.version.minor, result.version.revision].join('.'); | ||||
|             }) | ||||
|             .then(Api.Bootstrap) | ||||
|             .then(() => { | ||||
|                 this.bootstrapTimer(); | ||||
|  | ||||
|                 this.UI = new UI(); | ||||
|                 this.UI.on('render', () => { | ||||
|                     // If successful, start the history and routing | ||||
|                     new Router(options); | ||||
|                     Backbone.history.start({}); | ||||
|  | ||||
|                     // Remove loading class | ||||
|                     $('#app').removeClass('loading'); | ||||
|                 }); | ||||
|  | ||||
|                 this.getRegion().show(this.UI); | ||||
|             }) | ||||
|             .catch(function (err) { | ||||
|                 console.info('Not logged in: ', err.message); | ||||
|                 myapp.trigger('after:start'); | ||||
|                 myapp.UI = new UI(); | ||||
|                 myapp.UI.on('render', () => { | ||||
|                     // Remove loading class | ||||
|                     myapp.UI.reset(); | ||||
|                     Controller.showLogin(); | ||||
|                 }); | ||||
|                 myapp.getRegion().show(myapp.UI); | ||||
|             }); | ||||
|     }, | ||||
|  | ||||
|     History: { | ||||
|         replace: function (data) { | ||||
|             window.history.replaceState(_.extend(window.history.state || {}, data), document.title); | ||||
|         }, | ||||
|  | ||||
|         get: function (attr) { | ||||
|             return window.history.state ? window.history.state[attr] : undefined; | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     Error: function (code, message, debug) { | ||||
|         let temp     = Error.call(this, message); | ||||
|         temp.name    = this.name = 'AppError'; | ||||
|         this.stack   = temp.stack; | ||||
|         this.message = temp.message; | ||||
|         this.code    = code; | ||||
|         this.debug   = debug; | ||||
|     }, | ||||
|  | ||||
|     showError: function () { | ||||
|         let ErrorView = Mn.View.extend({ | ||||
|             tagName:  'section', | ||||
|             id:       'error', | ||||
|             template: _.template('Error loading stuff. Please reload the app.') | ||||
|         }); | ||||
|  | ||||
|         this.getRegion().show(new ErrorView()); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Bootstraps the user from time to time | ||||
|      */ | ||||
|     bootstrapTimer: function () { | ||||
|         setTimeout(() => { | ||||
|             Api.status() | ||||
|                 .then(result => { | ||||
|                     let version = [result.version.major, result.version.minor, result.version.revision].join('.'); | ||||
|                     if (version !== this.version) { | ||||
|                         document.location.reload(); | ||||
|                     } | ||||
|                 }) | ||||
|                 .then(Api.Bootstrap) | ||||
|                 .then(() => { | ||||
|                     this.bootstrapTimer(); | ||||
|                 }) | ||||
|                 .catch(err => { | ||||
|                     if (err.message !== 'timeout' && err.code && err.code !== 400) { | ||||
|                         console.log(err); | ||||
|                         console.error(err.message); | ||||
|                         document.location.reload(); | ||||
|                     } else { | ||||
|                         this.bootstrapTimer(); | ||||
|                     } | ||||
|                 }); | ||||
|         }, 30 * 1000); | ||||
|     } | ||||
| }); | ||||
|  | ||||
| const app = new App(); | ||||
| module.exports = app; | ||||
| @@ -1,36 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./main.ejs'); | ||||
| const Controller = require('../../controller'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     ui: { | ||||
|         logo:   '.navbar-brand', | ||||
|         links:  'a[href^="#"]' | ||||
|     }, | ||||
|  | ||||
|     events: { | ||||
|         'click @ui.links': function (e) { | ||||
|             e.preventDefault(); | ||||
|  | ||||
|             let href = e.target.href.replace(/[^#]*#/g, ''); | ||||
|  | ||||
|             switch (href) { | ||||
|                 case 'dashboard': | ||||
|                     Controller.showDashboard(); | ||||
|                     break; | ||||
|  | ||||
|                 case 'access': | ||||
|                     Controller.showAccess(); | ||||
|                     break; | ||||
|  | ||||
|                 default: | ||||
|                     Controller.showDashboard(); | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| }); | ||||
| @@ -1,100 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Mn         = require('backbone.marionette'); | ||||
| const template   = require('./main.ejs'); | ||||
| const HeaderView = require('./header/main'); | ||||
| const Cache      = require('../cache'); | ||||
|  | ||||
| require('bootstrap'); | ||||
|  | ||||
| module.exports = Mn.View.extend({ | ||||
|     template: template, | ||||
|  | ||||
|     modal: null, | ||||
|  | ||||
|     ui: { | ||||
|         header_region:      '#header', | ||||
|         main_region:        '#main', | ||||
|         modal_region:       '#modal-dialog', | ||||
|         main_loader_region: '#main-loader' | ||||
|     }, | ||||
|  | ||||
|     regions: { | ||||
|         header_region:      '@ui.header_region', | ||||
|         main_region:        '@ui.main_region', | ||||
|         modal_region:       '@ui.modal_region', | ||||
|         main_loader_region: '@ui.main_loader_region' | ||||
|     }, | ||||
|  | ||||
|     showMainLoading: function () { | ||||
|         this.ui.main_loader_region.show(); | ||||
|     }, | ||||
|  | ||||
|     hideMainLoading: function () { | ||||
|         this.ui.main_loader_region.hide(); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param view | ||||
|      * @param [show_callback] | ||||
|      * @param [shown_callback] | ||||
|      */ | ||||
|     showModalDialog: function (view, show_callback, shown_callback) { | ||||
|         this.showChildView('modal_region', view); | ||||
|         this.modal.modal('show'); | ||||
|  | ||||
|         let ui = this; | ||||
|  | ||||
|         this.modal.on('hidden.bs.modal', function (/*e*/) { | ||||
|             if (show_callback) { | ||||
|                 ui.modal.off('show.bs.modal', show_callback); | ||||
|             } | ||||
|  | ||||
|             if (shown_callback) { | ||||
|                 ui.modal.off('shown.bs.modal', shown_callback); | ||||
|             } | ||||
|  | ||||
|             ui.modal.off('hidden.bs.modal'); | ||||
|             view.destroy(); | ||||
|         }); | ||||
|  | ||||
|         if (show_callback) { | ||||
|             this.modal.on('show.bs.modal', show_callback); | ||||
|         } | ||||
|  | ||||
|         if (shown_callback) { | ||||
|             this.modal.on('shown.bs.modal', shown_callback); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param [hidden_callback] | ||||
|      */ | ||||
|     closeModal: function (hidden_callback) { | ||||
|         this.modal.modal('hide'); | ||||
|  | ||||
|         if (hidden_callback) { | ||||
|             this.modal.on('hidden.bs.modal', hidden_callback); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     onRender: function () { | ||||
|         this.showChildView('header_region', new HeaderView({ | ||||
|             model: Cache.User | ||||
|         })); | ||||
|  | ||||
|         if (this.modal === null) { | ||||
|             this.modal = $('#modal-dialog'); | ||||
|             this.modal.modal({ | ||||
|                 show: false | ||||
|             }); | ||||
|         } | ||||
|     }, | ||||
|  | ||||
|     reset: function () { | ||||
|         this.getRegion('header_region').reset(); | ||||
|         this.getRegion('modal_region').reset(); | ||||
|     } | ||||
| }); | ||||
| @@ -1,32 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const numeral = require('numeral'); | ||||
| const moment  = require('moment'); | ||||
|  | ||||
| module.exports = { | ||||
|  | ||||
|     /** | ||||
|      * @param {Integer} number | ||||
|      * @returns {String} | ||||
|      */ | ||||
|     niceNumber: function (number) { | ||||
|         return numeral(number).format('0,0'); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * @param   {String} date | ||||
|      * @returns {String} | ||||
|      */ | ||||
|     shortTime: function (date) { | ||||
|         let shorttime = ''; | ||||
|  | ||||
|         if (typeof date === 'number') { | ||||
|             shorttime = moment.unix(date).format('H:mm A'); | ||||
|         } else { | ||||
|             shorttime = moment(date).format('H:mm A'); | ||||
|         } | ||||
|  | ||||
|         return shorttime; | ||||
|     } | ||||
|  | ||||
| }; | ||||
| @@ -1,46 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const _  = require('underscore'); | ||||
| const Mn = require('backbone.marionette'); | ||||
|  | ||||
| let render         = Mn.Renderer.render; | ||||
| Mn.Renderer.render = function (template, data, view) { | ||||
|     data = _.clone(data); | ||||
|  | ||||
|     /** | ||||
|      * @param   {String} string | ||||
|      * @returns {String} | ||||
|      */ | ||||
|     data.escape = function (string) { | ||||
|         let entityMap = { | ||||
|             '&':  '&', | ||||
|             '<':  '<', | ||||
|             '>':  '>', | ||||
|             '"':  '"', | ||||
|             '\'': ''', | ||||
|             '/':  '/' | ||||
|         }; | ||||
|  | ||||
|         return String(string).replace(/[&<>"'\/]/g, function (s) { | ||||
|             return entityMap[s]; | ||||
|         }); | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * @param   {String} string | ||||
|      * @param   {Integer} length | ||||
|      * @returns {String} | ||||
|      */ | ||||
|     data.trim = function (string, length) { | ||||
|         if (string.length > length) { | ||||
|             let trimmedString = string.substr(0, length); | ||||
|             return trimmedString.substr(0, Math.min(trimmedString.length, trimmedString.lastIndexOf(' '))) + '...'; | ||||
|         } | ||||
|  | ||||
|         return string; | ||||
|     }; | ||||
|  | ||||
|     return render.call(this, template, data, view); | ||||
| }; | ||||
|  | ||||
| module.exports = Mn; | ||||
| @@ -1,22 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const promise = require('es6-promise'); | ||||
| const $       = require('jquery'); | ||||
|  | ||||
| global.jQuery = $; | ||||
| global.$ = $; | ||||
|  | ||||
| const App = require('./app/main'); | ||||
|  | ||||
| // es6-promise nukes the Native Promise impl - restore it if this happens. | ||||
| // See also https://github.com/jakearchibald/es6-promise/issues/140 | ||||
| const NativePromise = window.Promise; | ||||
| if (NativePromise) { | ||||
|     window.Promise = NativePromise; | ||||
| } else { | ||||
|     promise.polyfill(); | ||||
| } | ||||
|  | ||||
| $(document).ready(() => { | ||||
|     App.start(); | ||||
| }); | ||||
| @@ -1,22 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Backbone = require('backbone'); | ||||
|  | ||||
| const model = Backbone.Model.extend({ | ||||
|     idAttribute: 'username', | ||||
|  | ||||
|     defaults: function () { | ||||
|         return { | ||||
|             username:   '', | ||||
|             password:   '', | ||||
|             hint:       '' | ||||
|         }; | ||||
|     } | ||||
| }); | ||||
|  | ||||
| module.exports = { | ||||
|     Model:      model, | ||||
|     Collection: Backbone.Collection.extend({ | ||||
|         model: model | ||||
|     }) | ||||
| }; | ||||
| @@ -1,35 +0,0 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const Backbone = require('backbone'); | ||||
|  | ||||
| const model = Backbone.Model.extend({ | ||||
|     idAttribute: '_id', | ||||
|  | ||||
|     defaults: function () { | ||||
|         return { | ||||
|             type:              'proxy', | ||||
|             hostname:          '', | ||||
|             forward_server:    '', | ||||
|             forward_host:      '', | ||||
|             forward_port:      80, | ||||
|             asset_caching:     false, | ||||
|             block_exploits:    true, | ||||
|             ssl:               false, | ||||
|             ssl_expires:       0, | ||||
|             force_ssl:         false, | ||||
|             letsencrypt_email: '', | ||||
|             accept_tos:        false, | ||||
|             access_list_id:    '', | ||||
|             advanced:          '', | ||||
|             incoming_port:     0, | ||||
|             protocols:         [] | ||||
|         }; | ||||
|     } | ||||
| }); | ||||
|  | ||||
| module.exports = { | ||||
|     Model:      model, | ||||
|     Collection: Backbone.Collection.extend({ | ||||
|         model: model | ||||
|     }) | ||||
| }; | ||||
| @@ -1,95 +0,0 @@ | ||||
| const path       = require('path'); | ||||
| const webpack    = require('webpack'); | ||||
| const Visualizer = require('webpack-visualizer-plugin'); | ||||
|  | ||||
| module.exports = { | ||||
|     entry:     { | ||||
|         main:  './src/frontend/js/main.js', | ||||
|     }, | ||||
|     output:    { | ||||
|         path:       path.resolve(__dirname, 'dist'), | ||||
|         filename:   '[name].js', | ||||
|         publicPath: '/' | ||||
|     }, | ||||
|  | ||||
|     module:    { | ||||
|         rules: [ | ||||
|             { | ||||
|                 test:    /\.js$/, | ||||
|                 exclude: /node_modules/, | ||||
|                 use:     { | ||||
|                     loader: 'babel-loader' | ||||
|                 } | ||||
|             }, | ||||
|             { | ||||
|                 test:   /\.ejs$/, | ||||
|                 loader: 'ejs-loader' | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| /* | ||||
|     context: __dirname + '/src/frontend/js', | ||||
|     entry:   './main.js', | ||||
|     output:  { | ||||
|         filename:          'main.js', | ||||
|         path:              __dirname + '/dist/js', | ||||
|         publicPath:        '/js/', | ||||
|         sourceMapFilename: 'dnBOUAwY76qx3MmZxtHn.map' | ||||
|     }, | ||||
|     module:  { | ||||
|         loaders: [ | ||||
|             { | ||||
|                 test:    /\.js$/, | ||||
|                 exclude: /(node_modules|bower_components)/, | ||||
|                 loader:  'babel-loader'//, | ||||
|                 query:   { | ||||
|                     presets: ['@babel/es2015'] | ||||
|                 } | ||||
|             }, | ||||
|             { | ||||
|                 test:   /\.ejs$/, | ||||
|                 loader: 'ejs-loader' | ||||
|             } | ||||
|         ] | ||||
|     }, | ||||
| */ | ||||
|     plugins:   [ | ||||
|         new webpack.ProvidePlugin({ | ||||
|             $:      'jquery', | ||||
|             jQuery: 'jquery', | ||||
|             _:      'underscore' | ||||
|         }), | ||||
|         new Visualizer({ | ||||
|             filename: '../webpack_stats.html' | ||||
|         }), | ||||
|         new webpack.optimize.LimitChunkCountPlugin({ | ||||
|             maxChunks:    1, // Must be greater than or equal to one | ||||
|             minChunkSize: 999999999 | ||||
|         }) | ||||
|     ] | ||||
| /* | ||||
|     plugins: [ | ||||
|         new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), | ||||
|         new webpack.optimize.LimitChunkCountPlugin({ | ||||
|             maxChunks: 1 | ||||
|         }), | ||||
|         new webpack.ProvidePlugin({ | ||||
|             $:      'jquery', | ||||
|             jQuery: 'jquery', | ||||
|             _:      'underscore' | ||||
|         }), | ||||
|         new Visualizer({ | ||||
|             filename: '../../webpack_stats.html' | ||||
|         }), | ||||
|         new webpack.optimize.UglifyJsPlugin({ | ||||
|             compress: { | ||||
|                 unsafe:        true, | ||||
|                 drop_console:  false, | ||||
|                 drop_debugger: true, | ||||
|                 screw_ie8:     true, | ||||
|                 warnings:      false | ||||
|             } | ||||
|         }) | ||||
|     ] | ||||
| */ | ||||
| }; | ||||
		Reference in New Issue
	
	Block a user