UNPKG

juice-shop-ctf-cli

Version:

Capture-the-Flag (CTF) environment setup tools for OWASP Juice Shop

51 lines (46 loc) 2.24 kB
/* * Copyright (c) 2016-2025 Bjoern Kimminich & the OWASP Juice Shop contributors. * SPDX-License-Identifier: MIT */ const yaml = require('js-yaml') const Joi = require('joi') const options = require('./options') const schema = Joi.object().keys({ ctfFramework: Joi.string().optional().valid(options.ctfdFramework, options.fbctfFramework, options.rtbFramework), juiceShopUrl: [Joi.string().uri().required(), Joi.string().ip().required()], countryMapping: Joi.string().when('ctfFramework', { is: options.fbctfFramework, then: Joi.required(), otherwise: Joi.optional() }), ctfKey: Joi.string().required(), insertHints: Joi.any().valid('none', 'free', 'paid').required(), insertHintUrls: Joi.any().valid('none', 'free', 'paid').when('ctfFramework', { is: options.fbctfFramework, then: Joi.optional(), otherwise: Joi.required() }), insertHintSnippets: Joi.any().valid('none', 'free', 'paid').when('ctfFramework', { is: options.fbctfFramework, then: Joi.optional(), otherwise: Joi.required() }) }) const hintsMap = { none: options.noTextHints, free: options.freeTextHints, paid: options.paidTextHints } const hintUrlsMap = { none: options.noHintUrls, free: options.freeHintUrls, paid: options.paidHintUrls } const hintSnippetsMap = { none: options.noHintSnippets, free: options.freeHintSnippets, paid: options.paidHintSnippets } function readConfigStream (stream) { return new Promise((resolve, reject) => { let data = '' stream.on('data', (chunk) => { data = data + chunk }) stream.on('end', () => { try { yaml.loadAll(data, (doc) => { const validation = schema.validate(doc) if (validation.error) { reject(validation.error) } else { const result = validation.value result.insertHints = hintsMap[result.insertHints] result.insertHintUrls = result.insertHintUrls ? hintUrlsMap[result.insertHintUrls] : options.noHintUrls result.insertHintSnippets = result.insertHintSnippets ? hintSnippetsMap[result.insertHintSnippets] : options.noHintSnippets resolve(result) } }) } catch (error) { reject(error) } }) }) } module.exports = readConfigStream