@@ -17,7 +17,8 @@ import Data.Text (Text)
17
17
import qualified Data.Text as T
18
18
import qualified Data.Text.IO as T
19
19
import Distribution.Parsec (eitherParsec )
20
- import Distribution.Types.VersionRange (VersionRange , VersionRangeF (.. ), anyVersion , earlierVersion , intersectVersionRanges , majorUpperBound , orLaterVersion , projectVersionRange )
20
+ import Distribution.Types.VersionInterval (asVersionIntervals )
21
+ import Distribution.Types.VersionRange (VersionRange , anyVersion , earlierVersion , intersectVersionRanges , noVersion , orLaterVersion , unionVersionRanges )
21
22
import Validation (Validation (.. ))
22
23
23
24
import Security.Advisories.Definition
@@ -27,53 +28,24 @@ import Security.Advisories.Filesystem
27
28
isAffectedBy :: Text -> VersionRange -> Advisory -> Bool
28
29
isAffectedBy queryPackageName queryVersionRange =
29
30
any checkAffected . advisoryAffected
30
- where checkAffected :: Affected -> Bool
31
+ where
32
+ checkAffected :: Affected -> Bool
31
33
checkAffected affected =
32
34
queryPackageName == affectedPackage affected
33
- && any
34
- (intersectsWith (projectVersionRange queryVersionRange) . projectVersionRange . mkVersionRange)
35
- (affectedVersions affected)
36
- mkVersionRange :: AffectedVersionRange -> VersionRange
37
- mkVersionRange x =
38
- case affectedVersionRangeFixed x of
39
- Nothing ->
40
- orLaterVersion (affectedVersionRangeIntroduced x)
41
- Just affectedVersionRangeFixed' ->
42
- orLaterVersion (affectedVersionRangeIntroduced x) `intersectVersionRanges` earlierVersion affectedVersionRangeFixed'
43
- intersectsWith :: VersionRangeF VersionRange -> VersionRangeF VersionRange -> Bool
44
- intersectsWith left right =
45
- case (left, right) of
46
- (ThisVersionF x, ThisVersionF y) -> x == y
47
- (ThisVersionF x, LaterVersionF y) -> x < y
48
- (ThisVersionF x, OrLaterVersionF y) -> x >= y
49
- (ThisVersionF x, EarlierVersionF y) -> x < y
50
- (ThisVersionF x, OrEarlierVersionF y) -> x <= y
51
- (LaterVersionF x, ThisVersionF y) -> x < y
52
- (LaterVersionF _, LaterVersionF _) -> True
53
- (LaterVersionF _, OrLaterVersionF _) -> True
54
- (LaterVersionF x, EarlierVersionF y) -> x < y
55
- (LaterVersionF x, OrEarlierVersionF y) -> x < y
56
- (OrLaterVersionF x, ThisVersionF y) -> x <= y
57
- (OrLaterVersionF _, LaterVersionF _) -> True
58
- (OrLaterVersionF _, OrLaterVersionF _) -> True
59
- (OrLaterVersionF x, EarlierVersionF y) -> x < y
60
- (OrLaterVersionF x, OrEarlierVersionF y) -> x <= y
61
- (EarlierVersionF x, ThisVersionF y) -> x > y
62
- (EarlierVersionF x, LaterVersionF y) -> x > y
63
- (EarlierVersionF x, OrLaterVersionF y) -> x > y
64
- (EarlierVersionF _, EarlierVersionF _) -> True
65
- (EarlierVersionF _, OrEarlierVersionF _) -> True
66
- (OrEarlierVersionF x, ThisVersionF y) -> x >= y
67
- (OrEarlierVersionF x, LaterVersionF y) -> x > y
68
- (OrEarlierVersionF x, OrLaterVersionF y) -> x >= y
69
- (OrEarlierVersionF _, EarlierVersionF _) -> True
70
- (OrEarlierVersionF _, OrEarlierVersionF _) -> True
71
- (MajorBoundVersionF x, _) -> intersectsWith (OrLaterVersionF x) right && intersectsWith (EarlierVersionF $ majorUpperBound x) right
72
- (UnionVersionRangesF x y, _) -> intersectsWith (projectVersionRange x) right || intersectsWith (projectVersionRange y) right
73
- (IntersectVersionRangesF x y, _) -> intersectsWith (projectVersionRange x) right && intersectsWith (projectVersionRange y) right
74
- (_, UnionVersionRangesF x y) -> intersectsWith left (projectVersionRange x) || intersectsWith left (projectVersionRange y)
75
- (_, IntersectVersionRangesF x y) -> intersectsWith left (projectVersionRange x) && intersectsWith left (projectVersionRange y)
76
- (_, MajorBoundVersionF x) -> intersectsWith left (OrLaterVersionF x) && intersectsWith left (EarlierVersionF $ majorUpperBound x)
35
+ && isSomeVersion (fromAffected affected `intersectVersionRanges` queryVersionRange)
36
+
37
+ fromAffected :: Affected -> VersionRange
38
+ fromAffected = foldr (unionVersionRanges . fromAffectedVersionRange) noVersion . affectedVersions
39
+
40
+ fromAffectedVersionRange :: AffectedVersionRange -> VersionRange
41
+ fromAffectedVersionRange avr = intersectVersionRanges
42
+ (orLaterVersion (affectedVersionRangeIntroduced avr))
43
+ (maybe anyVersion earlierVersion (affectedVersionRangeFixed avr))
44
+
45
+ isSomeVersion :: VersionRange -> Bool
46
+ isSomeVersion range
47
+ | [] <- asVersionIntervals range = False
48
+ | otherwise = True
77
49
78
50
-- | Parse 'VersionRange' as given to the CLI
79
51
parseVersionRange :: Maybe Text -> Either Text VersionRange
@@ -91,6 +63,4 @@ listAffectedBy root queryPackageName queryVersionRange = do
91
63
exitFailure
92
64
Success advisories ->
93
65
return advisories
94
-
95
-
96
66
return $ filter (isAffectedBy queryPackageName queryVersionRange) advisories
0 commit comments