hardening demo handling

This commit is contained in:
orangecoding
2026-01-28 16:29:59 +01:00
parent 0b2b42fc75
commit 797421f0d5

View File

@@ -11,10 +11,13 @@ import logger from '../../services/logger.js';
import { bus } from '../../services/events/event-bus.js'; import { bus } from '../../services/events/event-bus.js';
import { isRunning as isJobRunning } from '../../services/jobs/run-state.js'; import { isRunning as isJobRunning } from '../../services/jobs/run-state.js';
import { addClient as addSseClient, removeClient } from '../../services/sse/sse-broker.js'; import { addClient as addSseClient, removeClient } from '../../services/sse/sse-broker.js';
import { getSettings } from '../../services/storage/settingsStorage.js';
const service = restana(); const service = restana();
const jobRouter = service.newRouter(); const jobRouter = service.newRouter();
const DEMO_JOB_NAME = 'Demo-Job';
function doesJobBelongsToUser(job, req) { function doesJobBelongsToUser(job, req) {
const userId = req.session.currentUser; const userId = req.session.currentUser;
if (userId == null) { if (userId == null) {
@@ -161,6 +164,7 @@ jobRouter.post('/:jobId/run', async (req, res) => {
jobRouter.post('/', async (req, res) => { jobRouter.post('/', async (req, res) => {
const { provider, notificationAdapter, name, blacklist = [], jobId, enabled, shareWithUsers = [] } = req.body; const { provider, notificationAdapter, name, blacklist = [], jobId, enabled, shareWithUsers = [] } = req.body;
const settings = await getSettings();
try { try {
let jobFromDb = jobStorage.getJob(jobId); let jobFromDb = jobStorage.getJob(jobId);
@@ -169,6 +173,11 @@ jobRouter.post('/', async (req, res) => {
return; return;
} }
if (settings.demoMode && jobFromDb.name === DEMO_JOB_NAME) {
res.send(new Error('Sorry, but you cannot change the Status of our Demo Job ;)'));
return;
}
jobStorage.upsertJob({ jobStorage.upsertJob({
userId: req.session.currentUser, userId: req.session.currentUser,
jobId, jobId,
@@ -188,8 +197,14 @@ jobRouter.post('/', async (req, res) => {
jobRouter.delete('', async (req, res) => { jobRouter.delete('', async (req, res) => {
const { jobId } = req.body; const { jobId } = req.body;
const settings = await getSettings();
try { try {
const job = jobStorage.getJob(jobId); const job = jobStorage.getJob(jobId);
if (settings.demoMode && job.name === DEMO_JOB_NAME) {
res.send(new Error('Sorry, but you cannot remove the Demo Job ;)'));
return;
}
if (!doesJobBelongsToUser(job, req)) { if (!doesJobBelongsToUser(job, req)) {
res.send(new Error('You are trying to remove a job that is not associated to your user')); res.send(new Error('You are trying to remove a job that is not associated to your user'));
} else { } else {
@@ -204,8 +219,15 @@ jobRouter.delete('', async (req, res) => {
jobRouter.put('/:jobId/status', async (req, res) => { jobRouter.put('/:jobId/status', async (req, res) => {
const { status } = req.body; const { status } = req.body;
const { jobId } = req.params; const { jobId } = req.params;
const settings = await getSettings();
try { try {
const job = jobStorage.getJob(jobId); const job = jobStorage.getJob(jobId);
if (settings.demoMode && job.name === DEMO_JOB_NAME) {
res.send(new Error('Sorry, but you cannot change the Status of our Demo Job ;)'));
return;
}
if (!doesJobBelongsToUser(job, req)) { if (!doesJobBelongsToUser(job, req)) {
res.send(new Error('You are trying change a job that is not associated to your user')); res.send(new Error('You are trying change a job that is not associated to your user'));
} else { } else {