NvdModels.kt

package com.depanalyzer.repository

import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty
import java.time.Instant

@JsonIgnoreProperties(ignoreUnknown = true)
data class NvdCveResponse(
    @JsonProperty("resultsPerPage")
    val resultsPerPage: Int,
    @JsonProperty("startIndex")
    val startIndex: Int,
    @JsonProperty("totalResults")
    val totalResults: Int,
    @JsonProperty("vulnerabilities")
    val vulnerabilities: List<NvdVulnerability> = emptyList(),
    @JsonProperty("format")
    val format: String? = null,
    @JsonProperty("version")
    val version: String? = null,
    @JsonProperty("timestamp")
    val timestamp: String? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class NvdVulnerability(
    @JsonProperty("cve")
    val cve: NvdCve
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class NvdCve(
    @JsonProperty("id")
    val id: String,
    @JsonProperty("sourceIdentifier")
    val sourceIdentifier: String? = null,
    @JsonProperty("published")
    val published: Instant? = null,
    @JsonProperty("lastModified")
    val lastModified: Instant? = null,
    @JsonProperty("vulnStatus")
    val vulnStatus: String? = null,
    @JsonProperty("descriptions")
    val descriptions: List<CveDescription> = emptyList(),
    @JsonProperty("metrics")
    val metrics: NvdMetrics? = null,
    @JsonProperty("weaknesses")
    val weaknesses: List<CveWeakness>? = null,
    @JsonProperty("configurations")
    val configurations: List<CveConfiguration>? = null,
    @JsonProperty("references")
    val references: List<CveReference> = emptyList(),
    @JsonProperty("vendorComments")
    val vendorComments: List<VendorComment>? = null,
    @JsonProperty("cveTags")
    val cveTags: List<CveTag>? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CveDescription(
    @JsonProperty("lang")
    val lang: String,
    @JsonProperty("value")
    val value: String
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class NvdMetrics(
    @JsonProperty("cvssMetricV3")
    val cvssMetricV3: List<CvssMetricV3>? = null,
    @JsonProperty("cvssMetricV2")
    val cvssMetricV2: List<CvssMetricV2>? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CvssMetricV3(
    @JsonProperty("source")
    val source: String? = null,
    @JsonProperty("type")
    val type: String? = null,
    @JsonProperty("cvssData")
    val cvssData: CvssDataV3,
    @JsonProperty("baseSeverity")
    val baseSeverity: String? = null,
    @JsonProperty("exploitabilityScore")
    val exploitabilityScore: Double? = null,
    @JsonProperty("impactScore")
    val impactScore: Double? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CvssDataV3(
    @JsonProperty("version")
    val version: String,
    @JsonProperty("vectorString")
    val vectorString: String,
    @JsonProperty("baseScore")
    val baseScore: Double,
    @JsonProperty("baseSeverity")
    val baseSeverity: String? = null,
    @JsonProperty("attackVector")
    val attackVector: String? = null,
    @JsonProperty("attackComplexity")
    val attackComplexity: String? = null,
    @JsonProperty("privilegesRequired")
    val privilegesRequired: String? = null,
    @JsonProperty("userInteraction")
    val userInteraction: String? = null,
    @JsonProperty("scope")
    val scope: String? = null,
    @JsonProperty("confidentialityImpact")
    val confidentialityImpact: String? = null,
    @JsonProperty("integrityImpact")
    val integrityImpact: String? = null,
    @JsonProperty("availabilityImpact")
    val availabilityImpact: String? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CvssMetricV2(
    @JsonProperty("source")
    val source: String? = null,
    @JsonProperty("type")
    val type: String? = null,
    @JsonProperty("cvssData")
    val cvssData: CvssDataV2,
    @JsonProperty("baseSeverity")
    val baseSeverity: String? = null,
    @JsonProperty("exploitabilityScore")
    val exploitabilityScore: Double? = null,
    @JsonProperty("impactScore")
    val impactScore: Double? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CvssDataV2(
    @JsonProperty("version")
    val version: String,
    @JsonProperty("vectorString")
    val vectorString: String,
    @JsonProperty("baseScore")
    val baseScore: Double,
    @JsonProperty("baseSeverity")
    val baseSeverity: String? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CveConfiguration(
    @JsonProperty("nodes")
    val nodes: List<CpeNode> = emptyList()
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CpeNode(
    @JsonProperty("operator")
    val operator: String? = null,
    @JsonProperty("negate")
    val negate: Boolean? = null,
    @JsonProperty("cpeMatch")
    val cpeMatch: List<CpeMatch> = emptyList(),
    @JsonProperty("children")
    val children: List<CpeNode>? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CpeMatch(
    @JsonProperty("vulnerable")
    val vulnerable: Boolean,
    @JsonProperty("criteria")
    val criteria: String,
    @JsonProperty("matchCriteriaId")
    val matchCriteriaId: String? = null,
    @JsonProperty("versionStartIncluding")
    val versionStartIncluding: String? = null,
    @JsonProperty("versionEndIncluding")
    val versionEndIncluding: String? = null,
    @JsonProperty("versionStartExcluding")
    val versionStartExcluding: String? = null,
    @JsonProperty("versionEndExcluding")
    val versionEndExcluding: String? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CveReference(
    @JsonProperty("url")
    val url: String,
    @JsonProperty("source")
    val source: String? = null,
    @JsonProperty("tags")
    val tags: List<String>? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CveWeakness(
    @JsonProperty("source")
    val source: String? = null,
    @JsonProperty("type")
    val type: String? = null,
    @JsonProperty("description")
    val description: List<CweDescription> = emptyList()
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CweDescription(
    @JsonProperty("lang")
    val lang: String,
    @JsonProperty("value")
    val value: String
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class VendorComment(
    @JsonProperty("organization")
    val organization: String? = null,
    @JsonProperty("comment")
    val comment: String? = null,
    @JsonProperty("lastModified")
    val lastModified: String? = null
)

@JsonIgnoreProperties(ignoreUnknown = true)
data class CveTag(
    @JsonProperty("sourceIdentifier")
    val sourceIdentifier: String? = null,
    @JsonProperty("tags")
    val tags: List<String> = emptyList()
)