hydra-0.15.0: src/main/haskell/Hydra/Sources/Other/Osv.hs
module Hydra.Sources.Other.Osv where
-- Standard imports for type-level sources outside of the kernel
import Hydra.Kernel
import Hydra.Dsl.Annotations
import Hydra.Dsl.Bootstrap
import Hydra.Dsl.Types ((>:))
import qualified Hydra.Dsl.Types as T
import qualified Hydra.Sources.Kernel.Types.Core as Core
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Set as S
import qualified Data.Maybe as Y
ns :: Namespace
ns = Namespace "hydra.osv.schema"
define :: String -> Type -> Binding
define = defineType ns
osv :: String -> Type
osv = typeref ns
-- Note: database_specific and ecosystem_specific fields are ignored, though they must be tolerated when reading entry JSON
module_ :: Module
module_ = Module {
moduleNamespace = ns,
moduleDefinitions = (map toTypeDef definitions),
moduleTermDependencies = [],
moduleTypeDependencies = [],
moduleDescription = Just "See https://ossf.github.io/osv-schema"}
where
definitions = [
credited,
ecosystem,
entry,
event,
id_,
markdown,
osvVersion,
package_,
packageVersions,
reference,
referenceType,
severity,
severityScore,
severityType,
timestamp,
url,
version,
versionOrStar,
versionOrZero,
versionRange,
versionType]
credited :: Binding
credited = define "Credited" $
T.record [
"name">: T.string,
"contact">: T.maybe $ T.list $ osv "Url"]
ecosystem :: Binding
ecosystem = define "Ecosystem" $
doc ("One of a limited set of defined ecosystems, currently "
++ "Go, npm, OSS-Fuzz, PyPI, RubyGems, crates.io, Packagist, Maven, NuGet, Linux, Debian, Hex, Android, GitHub Actions, or Pub") $
T.wrap T.string
entry :: Binding
entry = define "Entry" $
T.record [
"schemaVersion">:
doc "The default value is '1.0.0', matching version 1.0 of the OSV Schema" $
T.maybe $ osv "OsvVersion",
"id">: osv "Id",
"modified">: osv "Timestamp",
"published">: T.maybe $ osv "Timestamp",
"withdrawn">: T.maybe $ osv "Timestamp",
"aliases">: T.maybe $ T.list $ osv "Id",
"related">: T.maybe $ T.list $ osv "Id",
"summary">: T.maybe T.string,
"details">: T.maybe $ osv "Markdown",
"severity">: T.maybe $ T.list $ osv "Severity",
"affected">: T.maybe $ T.list $ osv "PackageVersions",
"references">: T.maybe $ T.list $ osv "Reference",
"credits">: T.maybe $ T.list $ osv "Credited"]
event :: Binding
event = define "Event" $
T.union [
"introduced">: osv "VersionOrZero",
"fixed">: osv "Version",
"lastAffected">: osv "Version",
"limit">: osv "VersionOrStar"]
id_ :: Binding
id_ = define "Id" $
doc ("A string of the format <DB>-<ENTRYID>, where DB names the database and ENTRYID is in the format used "
++ "by the database. For example: OSV-2020-111, CVE-2021-3114, or GHSA-vp9c-fpxx-744v") $
T.wrap T.string
markdown :: Binding
markdown = define "Markdown" $
doc "CommonMark markdown text" $
T.wrap T.string
osvVersion :: Binding
osvVersion = define "OsvVersion" $
doc "A string which follows the SemVer 2.0.0 format, with no leading 'v' prefix" $
T.wrap T.string
package_ :: Binding
package_ = define "Package" $
T.record [
"ecosystem">: osv "Ecosystem",
"name">: T.string,
"purl">: T.maybe $ osv "Url"]
packageVersions :: Binding
packageVersions = define "PackageVersions" $
T.record [
"package">: osv "Package",
"ranges">: T.maybe $ T.list $ osv "VersionRange",
"versions">: T.maybe $ T.list $ osv "Version"]
reference :: Binding
reference = define "Reference" $
T.record [
"type">: osv "ReferenceType",
"url">: osv "Url"]
referenceType :: Binding
referenceType = define "ReferenceType" $
doc "One of ADVISORY, ARTICLE, REPORT, FIX, GIT, PACKAGE, EVIDENCE, or WEB" $
T.wrap T.string
severity :: Binding
severity = define "Severity" $
T.record [
"type">: osv "SeverityType",
"score">: osv "SeverityScore"]
severityScore :: Binding
severityScore = define "SeverityScore" $ T.wrap T.string
severityType :: Binding
severityType = define "SeverityType" $
doc "The value CVSS_V3, or future supported types" $
T.wrap T.string
timestamp :: Binding
timestamp = define "Timestamp" $
doc "An RFC3339-formatted timestamp in UTC (ending in 'Z')" $
T.wrap T.string
url :: Binding
url = define "Url" $ T.wrap T.string
version :: Binding
version = define "Version" $
doc "A version number in an ecosystem-specific format" $
T.wrap T.string
versionOrStar :: Binding
versionOrStar = define "VersionOrStar" $
doc "An ecosystem-specific version number, or the string '*' representing infinity" $
T.wrap T.string
versionOrZero :: Binding
versionOrZero = define "VersionOrZero" $
doc "An ecosystem-specific version number, or the string '0' representing a version that sorts before any other version" $
T.wrap T.string
versionRange :: Binding
versionRange = define "VersionRange" $
T.record [
"type">: osv "VersionType",
"repo">: T.maybe $ osv "Url",
"events">: T.list $ osv "Event"]
versionType :: Binding
versionType = define "VersionType" $
doc "One of the values 'SEMVER', 'ECOSYSTEM', or 'GIT" $
T.wrap T.string