@@ -12,63 +12,36 @@ type Statistics struct {
12
12
13
13
TestCasesFingerprint string
14
14
15
- TruePositiveTests struct {
16
- SummaryTable []* SummaryTableRow
17
- Blocked []* TestDetails
18
- Bypasses []* TestDetails
19
- Unresolved []* TestDetails
20
- Failed []* FailedDetails
21
-
22
- AllRequestsNumber int
23
- BlockedRequestsNumber int
24
- BypassedRequestsNumber int
25
- UnresolvedRequestsNumber int
26
- FailedRequestsNumber int
27
- ResolvedRequestsNumber int
28
-
29
- UnresolvedRequestsPercentage float64
30
- ResolvedBlockedRequestsPercentage float64
31
- ResolvedBypassedRequestsPercentage float64
32
- FailedRequestsPercentage float64
33
- }
34
-
35
- TrueNegativeTests struct {
36
- SummaryTable []* SummaryTableRow
37
- FalsePositive []* TestDetails
38
- TruePositive []* TestDetails
39
- Unresolved []* TestDetails
40
- Failed []* FailedDetails
41
-
42
- AllRequestsNumber int
43
- BlockedRequestsNumber int
44
- BypassedRequestsNumber int
45
- UnresolvedRequestsNumber int
46
- FailedRequestsNumber int
47
- ResolvedRequestsNumber int
48
-
49
- UnresolvedRequestsPercentage float64
50
- ResolvedFalseRequestsPercentage float64
51
- ResolvedTrueRequestsPercentage float64
52
- FailedRequestsPercentage float64
53
- }
15
+ TruePositiveTests TestsSummary
16
+ TrueNegativeTests TestsSummary
54
17
55
18
Score struct {
56
- ApiSec struct {
57
- TruePositive float64
58
- TrueNegative float64
59
- Average float64
60
- }
61
-
62
- AppSec struct {
63
- TruePositive float64
64
- TrueNegative float64
65
- Average float64
66
- }
67
-
19
+ ApiSec Score
20
+ AppSec Score
68
21
Average float64
69
22
}
70
23
}
71
24
25
+ type TestsSummary struct {
26
+ SummaryTable []* SummaryTableRow
27
+ Blocked []* TestDetails
28
+ Bypasses []* TestDetails
29
+ Unresolved []* TestDetails
30
+ Failed []* FailedDetails
31
+
32
+ AllRequestsNumber int
33
+ BlockedRequestsNumber int
34
+ BypassedRequestsNumber int
35
+ UnresolvedRequestsNumber int
36
+ FailedRequestsNumber int
37
+ ResolvedRequestsNumber int
38
+
39
+ UnresolvedRequestsPercentage float64
40
+ ResolvedBlockedRequestsPercentage float64
41
+ ResolvedBypassedRequestsPercentage float64
42
+ FailedRequestsPercentage float64
43
+ }
44
+
72
45
type SummaryTableRow struct {
73
46
TestSet string `json:"test_set" validate:"required,printascii,max=256"`
74
47
TestCase string `json:"test_case" validate:"required,printascii,max=256"`
@@ -101,6 +74,12 @@ type FailedDetails struct {
101
74
Type string `json:"type" validate:"omitempty"`
102
75
}
103
76
77
+ type Score struct {
78
+ TruePositive float64
79
+ TrueNegative float64
80
+ Average float64
81
+ }
82
+
104
83
type Path struct {
105
84
Method string `json:"method" validate:"required,printascii,max=32"`
106
85
Path string `json:"path" validate:"required,printascii,max=1024"`
@@ -233,35 +212,8 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
233
212
}
234
213
}
235
214
236
- // Number of all negative requests
237
- s .TruePositiveTests .AllRequestsNumber = s .TruePositiveTests .BlockedRequestsNumber +
238
- s .TruePositiveTests .BypassedRequestsNumber +
239
- s .TruePositiveTests .UnresolvedRequestsNumber +
240
- s .TruePositiveTests .FailedRequestsNumber
241
-
242
- // Number of negative resolved requests
243
- s .TruePositiveTests .ResolvedRequestsNumber = s .TruePositiveTests .BlockedRequestsNumber +
244
- s .TruePositiveTests .BypassedRequestsNumber
245
-
246
- // Number of all negative requests
247
- s .TrueNegativeTests .AllRequestsNumber = s .TrueNegativeTests .BlockedRequestsNumber +
248
- s .TrueNegativeTests .BypassedRequestsNumber +
249
- s .TrueNegativeTests .UnresolvedRequestsNumber +
250
- s .TrueNegativeTests .FailedRequestsNumber
251
-
252
- // Number of positive resolved requests
253
- s .TrueNegativeTests .ResolvedRequestsNumber = s .TrueNegativeTests .BlockedRequestsNumber +
254
- s .TrueNegativeTests .BypassedRequestsNumber
255
-
256
- s .TruePositiveTests .UnresolvedRequestsPercentage = CalculatePercentage (s .TruePositiveTests .UnresolvedRequestsNumber , s .TruePositiveTests .AllRequestsNumber )
257
- s .TruePositiveTests .ResolvedBlockedRequestsPercentage = CalculatePercentage (s .TruePositiveTests .BlockedRequestsNumber , s .TruePositiveTests .ResolvedRequestsNumber )
258
- s .TruePositiveTests .ResolvedBypassedRequestsPercentage = CalculatePercentage (s .TruePositiveTests .BypassedRequestsNumber , s .TruePositiveTests .ResolvedRequestsNumber )
259
- s .TruePositiveTests .FailedRequestsPercentage = CalculatePercentage (s .TruePositiveTests .FailedRequestsNumber , s .TruePositiveTests .AllRequestsNumber )
260
-
261
- s .TrueNegativeTests .UnresolvedRequestsPercentage = CalculatePercentage (s .TrueNegativeTests .UnresolvedRequestsNumber , s .TrueNegativeTests .AllRequestsNumber )
262
- s .TrueNegativeTests .ResolvedFalseRequestsPercentage = CalculatePercentage (s .TrueNegativeTests .BlockedRequestsNumber , s .TrueNegativeTests .ResolvedRequestsNumber )
263
- s .TrueNegativeTests .ResolvedTrueRequestsPercentage = CalculatePercentage (s .TrueNegativeTests .BypassedRequestsNumber , s .TrueNegativeTests .ResolvedRequestsNumber )
264
- s .TrueNegativeTests .FailedRequestsPercentage = CalculatePercentage (s .TrueNegativeTests .FailedRequestsNumber , s .TrueNegativeTests .AllRequestsNumber )
215
+ calculateTestsSummaryStat (& s .TruePositiveTests )
216
+ calculateTestsSummaryStat (& s .TrueNegativeTests )
265
217
266
218
for _ , blockedTest := range db .blockedTests {
267
219
sort .Strings (blockedTest .AdditionalInfo )
@@ -278,7 +230,7 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
278
230
}
279
231
280
232
if isFalsePositiveTest (blockedTest .Set ) {
281
- s .TrueNegativeTests .FalsePositive = append (s .TrueNegativeTests .FalsePositive , testDetails )
233
+ s .TrueNegativeTests .Blocked = append (s .TrueNegativeTests .Blocked , testDetails )
282
234
} else {
283
235
s .TruePositiveTests .Blocked = append (s .TruePositiveTests .Blocked , testDetails )
284
236
}
@@ -299,7 +251,7 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
299
251
}
300
252
301
253
if isFalsePositiveTest (passedTest .Set ) {
302
- s .TrueNegativeTests .TruePositive = append (s .TrueNegativeTests .TruePositive , testDetails )
254
+ s .TrueNegativeTests .Bypasses = append (s .TrueNegativeTests .Bypasses , testDetails )
303
255
} else {
304
256
s .TruePositiveTests .Bypasses = append (s .TruePositiveTests .Bypasses , testDetails )
305
257
}
@@ -321,7 +273,7 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
321
273
322
274
if ignoreUnresolved || nonBlockedAsPassed {
323
275
if isFalsePositiveTest (unresolvedTest .Set ) {
324
- s .TrueNegativeTests .FalsePositive = append (s .TrueNegativeTests .FalsePositive , testDetails )
276
+ s .TrueNegativeTests .Blocked = append (s .TrueNegativeTests .Blocked , testDetails )
325
277
} else {
326
278
s .TruePositiveTests .Bypasses = append (s .TruePositiveTests .Bypasses , testDetails )
327
279
}
@@ -395,7 +347,7 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
395
347
var appSecTrueNegBypassNum int
396
348
var appSecTrueNegNum int
397
349
398
- for _ , test := range s .TrueNegativeTests .TruePositive {
350
+ for _ , test := range s .TrueNegativeTests .Bypasses {
399
351
if isApiTest (test .TestSet ) {
400
352
apiSecTrueNegNum ++
401
353
apiSecTrueNegBypassNum ++
@@ -404,83 +356,84 @@ func (db *DB) GetStatistics(ignoreUnresolved, nonBlockedAsPassed bool) *Statisti
404
356
appSecTrueNegBypassNum ++
405
357
}
406
358
}
407
- for _ , test := range s .TrueNegativeTests .FalsePositive {
359
+ for _ , test := range s .TrueNegativeTests .Blocked {
408
360
if isApiTest (test .TestSet ) {
409
361
apiSecTrueNegNum ++
410
362
} else {
411
363
appSecTrueNegNum ++
412
364
}
413
365
}
414
366
367
+ calculateScorePercentage (& s .Score .ApiSec , apiSecTruePosBlockedNum , apiSecTruePosNum , apiSecTrueNegBypassNum , apiSecTrueNegNum )
368
+ calculateScorePercentage (& s .Score .AppSec , appSecTruePosBlockedNum , appSecTruePosNum , appSecTrueNegBypassNum , appSecTrueNegNum )
369
+
415
370
var divider int
416
371
var sum float64
417
372
418
- s .Score .ApiSec .TruePositive = CalculatePercentage (apiSecTruePosBlockedNum , apiSecTruePosNum )
419
- s .Score .ApiSec .TrueNegative = CalculatePercentage (apiSecTrueNegBypassNum , apiSecTrueNegNum )
420
-
421
- if apiSecTruePosNum != 0 {
373
+ if s .Score .ApiSec .Average != - 1.0 {
422
374
divider ++
423
- sum += s .Score .ApiSec .TruePositive
424
- } else {
425
- s .Score .ApiSec .TruePositive = - 1.0
375
+ sum += s .Score .ApiSec .Average
426
376
}
427
-
428
- if apiSecTrueNegNum != 0 {
377
+ if s .Score .AppSec .Average != - 1.0 {
429
378
divider ++
430
- sum += s .Score .ApiSec .TrueNegative
431
- } else {
432
- s .Score .ApiSec .TrueNegative = - 1.0
379
+ sum += s .Score .AppSec .Average
433
380
}
434
381
435
382
if divider != 0 {
436
- s .Score .ApiSec . Average = Round (sum / float64 (divider ))
383
+ s .Score .Average = Round (sum / float64 (divider ))
437
384
} else {
438
- s .Score .ApiSec . Average = - 1.0
385
+ s .Score .Average = - 1.0
439
386
}
440
387
441
- divider = 0
442
- sum = 0.0
388
+ return s
389
+ }
443
390
444
- s .Score .AppSec .TruePositive = CalculatePercentage (appSecTruePosBlockedNum , appSecTruePosNum )
445
- s .Score .AppSec .TrueNegative = CalculatePercentage (appSecTrueNegBypassNum , appSecTrueNegNum )
391
+ func calculateTestsSummaryStat (s * TestsSummary ) {
392
+ s .AllRequestsNumber = s .BlockedRequestsNumber +
393
+ s .BypassedRequestsNumber +
394
+ s .UnresolvedRequestsNumber +
395
+ s .FailedRequestsNumber
446
396
447
- if appSecTruePosNum != 0 {
448
- divider ++
449
- sum += s .Score .AppSec .TruePositive
450
- } else {
451
- s .Score .AppSec .TruePositive = - 1.0
452
- }
397
+ s .ResolvedRequestsNumber = s .BlockedRequestsNumber +
398
+ s .BypassedRequestsNumber
453
399
454
- if appSecTrueNegNum != 0 {
455
- divider ++
456
- sum += s .Score .AppSec .TrueNegative
457
- } else {
458
- s .Score .AppSec .TrueNegative = - 1.0
459
- }
400
+ s .UnresolvedRequestsPercentage = CalculatePercentage (s .UnresolvedRequestsNumber , s .AllRequestsNumber )
401
+ s .ResolvedBlockedRequestsPercentage = CalculatePercentage (s .BlockedRequestsNumber , s .ResolvedRequestsNumber )
402
+ s .ResolvedBypassedRequestsPercentage = CalculatePercentage (s .BypassedRequestsNumber , s .ResolvedRequestsNumber )
403
+ s .FailedRequestsPercentage = CalculatePercentage (s .FailedRequestsNumber , s .AllRequestsNumber )
404
+ }
460
405
461
- if divider != 0 {
462
- s . Score . AppSec . Average = Round ( sum / float64 ( divider ))
463
- } else {
464
- s . Score . AppSec . Average = - 1.0
465
- }
406
+ func calculateScorePercentage ( s * Score , truePosBlockedNum , truePosNum , trueNegBypassNum , trueNegNum int ) {
407
+ var (
408
+ divider int
409
+ sum float64
410
+ )
466
411
467
- divider = 0
468
- sum = 0.0
412
+ s . TruePositive = CalculatePercentage ( truePosBlockedNum , truePosNum )
413
+ s . TrueNegative = CalculatePercentage ( trueNegBypassNum , trueNegNum )
469
414
470
- if s . Score . ApiSec . Average != - 1. 0 {
415
+ if truePosNum != 0 {
471
416
divider ++
472
- sum += s .Score .ApiSec .Average
417
+ sum += s .TruePositive
418
+ } else {
419
+ s .TruePositive = - 1.0
473
420
}
474
- if s .Score .AppSec .Average != - 1.0 {
421
+
422
+ if trueNegNum != 0 {
475
423
divider ++
476
- sum += s .Score .AppSec .Average
424
+ sum += s .TrueNegative
425
+ } else {
426
+ s .TrueNegative = - 1.0
477
427
}
478
428
479
429
if divider != 0 {
480
- s .Score .Average = Round (sum / float64 (divider ))
430
+ // If all malicious request were passed then grade is 0.
431
+ if truePosBlockedNum == 0 {
432
+ s .Average = 0.0
433
+ } else {
434
+ s .Average = Round (sum / float64 (divider ))
435
+ }
481
436
} else {
482
- s .Score . Average = - 1.0
437
+ s .Average = - 1.0
483
438
}
484
-
485
- return s
486
439
}
0 commit comments