juice-shop

Форк
0
/
vulnCodeFixes.ts 
98 строк · 2.6 Кб
1
import { type NextFunction, type Request, type Response } from 'express'
2
import * as accuracy from '../lib/accuracy'
3

4
const challengeUtils = require('../lib/challengeUtils')
5
const fs = require('fs')
6
const yaml = require('js-yaml')
7

8
const FixesDir = 'data/static/codefixes'
9

10
interface codeFix {
11
  fixes: string[]
12
  correct: number
13
}
14

15
type cache = Record<string, codeFix>
16

17
const CodeFixes: cache = {}
18

19
export const readFixes = (key: string) => {
20
  if (CodeFixes[key]) {
21
    return CodeFixes[key]
22
  }
23
  const files = fs.readdirSync(FixesDir)
24
  const fixes: string[] = []
25
  let correct: number = -1
26
  for (const file of files) {
27
    if (file.startsWith(`${key}_`)) {
28
      const fix = fs.readFileSync(`${FixesDir}/${file}`).toString()
29
      const metadata = file.split('_')
30
      const number = metadata[1]
31
      fixes.push(fix)
32
      if (metadata.length === 3) {
33
        correct = parseInt(number, 10)
34
        correct--
35
      }
36
    }
37
  }
38

39
  CodeFixes[key] = {
40
    fixes,
41
    correct
42
  }
43
  return CodeFixes[key]
44
}
45

46
interface FixesRequestParams {
47
  key: string
48
}
49

50
interface VerdictRequestBody {
51
  key: string
52
  selectedFix: number
53
}
54

55
export const serveCodeFixes = () => (req: Request<FixesRequestParams, Record<string, unknown>, Record<string, unknown>>, res: Response, next: NextFunction) => {
56
  const key = req.params.key
57
  const fixData = readFixes(key)
58
  if (fixData.fixes.length === 0) {
59
    res.status(404).json({
60
      error: 'No fixes found for the snippet!'
61
    })
62
    return
63
  }
64
  res.status(200).json({
65
    fixes: fixData.fixes
66
  })
67
}
68

69
export const checkCorrectFix = () => async (req: Request<Record<string, unknown>, Record<string, unknown>, VerdictRequestBody>, res: Response, next: NextFunction) => {
70
  const key = req.body.key
71
  const selectedFix = req.body.selectedFix
72
  const fixData = readFixes(key)
73
  if (fixData.fixes.length === 0) {
74
    res.status(404).json({
75
      error: 'No fixes found for the snippet!'
76
    })
77
  } else {
78
    let explanation
79
    if (fs.existsSync('./data/static/codefixes/' + key + '.info.yml')) {
80
      const codingChallengeInfos = yaml.load(fs.readFileSync('./data/static/codefixes/' + key + '.info.yml', 'utf8'))
81
      const selectedFixInfo = codingChallengeInfos?.fixes.find(({ id }: { id: number }) => id === selectedFix + 1)
82
      if (selectedFixInfo?.explanation) explanation = res.__(selectedFixInfo.explanation)
83
    }
84
    if (selectedFix === fixData.correct) {
85
      await challengeUtils.solveFixIt(key)
86
      res.status(200).json({
87
        verdict: true,
88
        explanation
89
      })
90
    } else {
91
      accuracy.storeFixItVerdict(key, false)
92
      res.status(200).json({
93
        verdict: false,
94
        explanation
95
      })
96
    }
97
  }
98
}
99

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.