diff --git a/src/app.ts b/src/app.ts index cccf9ac..8bb3e06 100644 --- a/src/app.ts +++ b/src/app.ts @@ -16,6 +16,7 @@ import CaptainConstants = require('./utils/CaptainConstants') import LoginRouter = require('./routes/LoginRouter') import UserRouter = require('./routes/UserRouter') import InjectionExtractor = require('./injection/InjectionExtractor') +import Utils from './utils/Utils' // import { NextFunction, Request, Response } from 'express' const httpProxy = httpProxyImport.createProxyServer({}) @@ -146,6 +147,14 @@ httpProxy.on('error', function(err, req, resOriginal) { }) app.use(CaptainConstants.netDataRelativePath, function(req, res, next) { + if (Utils.isNotGetRequest(req)) { + res.writeHead(401, { + 'Content-Type': 'text/plain', + }) + res.send('Demo mode is for viewing only') + return + } + httpProxy.web(req, res, { target: 'http://' + CaptainConstants.netDataContainerName + ':19999', }) diff --git a/src/routes/UserRouter.ts b/src/routes/UserRouter.ts index 4f05290..8dc2b3f 100644 --- a/src/routes/UserRouter.ts +++ b/src/routes/UserRouter.ts @@ -9,6 +9,8 @@ import RegistriesRouter = require('./RegistriesRouter') import onFinished = require('on-finished') import InjectionExtractor = require('../injection/InjectionExtractor') import CaptainManager = require('../user/system/CaptainManager') +import Utils from '../utils/Utils' +import EnvVars = require('../utils/EnvVars') const router = express.Router() @@ -18,10 +20,6 @@ router.use('/apps/webhooks/', Injector.injectUserForWebhook()) router.use(Injector.injectUser()) -function isNotGetRequest(req: express.Request) { - return req.method !== 'GET' -} - router.use(function(req, res, next) { const user = InjectionExtractor.extractUserFromInjected(res).user @@ -58,7 +56,16 @@ router.use(function(req, res, next) { // All requests except GET might be making changes to some stuff that are not designed for an asynchronous process // I'm being extra cautious. But removal of this lock mechanism requires testing and consideration of edge cases. - if (isNotGetRequest(req)) { + if (Utils.isNotGetRequest(req)) { + if (EnvVars.IS_DEMO_MODE) { + let response = new BaseApi( + ApiStatusCodes.STATUS_ERROR_GENERIC, + 'Demo mode is only for viewing purposes.' + ) + res.send(response) + return + } + if (threadLockNamespace[namespace]) { let response = new BaseApi( ApiStatusCodes.STATUS_ERROR_GENERIC, diff --git a/src/utils/EnvVars.ts b/src/utils/EnvVars.ts index 5cfcc46..771ac8d 100644 --- a/src/utils/EnvVars.ts +++ b/src/utils/EnvVars.ts @@ -4,6 +4,7 @@ export = { CAPTAIN_IS_DEBUG: 'CAPTAIN_IS_DEBUG', DEFAULT_PASSWORD: 'DEFAULT_PASSWORD', IS_CAPTAIN_INSTANCE: 'IS_CAPTAIN_INSTANCE', + IS_DEMO_MODE: 'IS_DEMO_MODE', }, BY_PASS_PROXY_CHECK: process.env.BY_PASS_PROXY_CHECK, @@ -16,5 +17,7 @@ export = { IS_CAPTAIN_INSTANCE: process.env.IS_CAPTAIN_INSTANCE, + IS_DEMO_MODE: !!process.env.IS_DEMO_MODE, + DEFAULT_PASSWORD: process.env.DEFAULT_PASSWORD, } diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 2d7e4fd..a50d802 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -5,4 +5,7 @@ export default class Utils { input = input.replace(/^(?:https?:\/\/)?/i, '') return input } + static isNotGetRequest(req: { method: string }) { + return req.method !== 'GET' + } }