juice-shop
41 строка · 1.5 Кб
1/*
2* Copyright (c) 2014-2024 Bjoern Kimminich & the OWASP Juice Shop contributors.
3* SPDX-License-Identifier: MIT
4*/
5
6import os from 'os'7import { promisify } from 'util'8import request from 'request'9import logger from './logger'10import config from 'config'11import colors from 'colors/safe'12import type { CoreOptions, RequestCallback, Request } from 'request'13import * as utils from './utils'14import { totalCheatScore } from './antiCheat'15// force type of post as promisify doesn't know which one it should take
16const post = promisify(request.post as ((uri: string, options?: CoreOptions, callback?: RequestCallback) => Request))17
18export const notify = async (challenge: { key: any, name: any }, cheatScore = -1, webhook = process.env.SOLUTIONS_WEBHOOK) => {19if (!webhook) {20return21}22const res = await post(webhook, {23json: {24solution: {25challenge: challenge.key,26cheatScore,27totalCheatScore: totalCheatScore(),28issuedOn: new Date().toISOString()29},30ctfFlag: utils.ctfFlag(challenge.name),31issuer: {32hostName: os.hostname(),33os: `${os.type()} (${os.release()})`,34appName: config.get<string>('application.name'),35config: process.env.NODE_ENV ?? 'default',36version: utils.version()37}38}39})40logger.info(`Webhook ${colors.bold(webhook)} notified about ${colors.cyan(challenge.key)} being solved: ${res.statusCode < 400 ? colors.green(res.statusCode.toString()) : colors.red(res.statusCode.toString())}`)41}
42