diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/OrtTask.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/OrtTask.kt new file mode 100644 index 0000000000000000000000000000000000000000..23e23d7a62abebd738a81c71bcfdaf188b5f1e20 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/OrtTask.kt @@ -0,0 +1,40 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort + +import de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model.AdvisorResult +import de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model.Ort +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.* +import java.io.IOException +import java.nio.file.Path + +fun getOrtResultsFromFile(resultPath: Path): Array<AdvisorResult> { + val resFile = resultPath.toFile() + + if (resFile.exists()) { + val results = mutableListOf<AdvisorResult>() + val resString = resFile.readText() + val json = Json { ignoreUnknownKeys = true } + val rawJson = json.decodeFromString<Ort>(resString) + rawJson.advisor?.results?.advisorResults?.forEach { (key, value) -> + if (value is JsonArray) { + value.forEach { res -> + if (res is JsonObject) { + + val flat = buildJsonObject { + res.entries.forEach { (eKey, eValue) -> + put(eKey, eValue) + } + put("identifier", key) + } + val advisorResult = json.decodeFromJsonElement<AdvisorResult>(flat) + println(advisorResult) + results.add(advisorResult) + } + } + } + } + return results.toTypedArray() + } + + throw IOException("File not found / Path is no file.") +} \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Advisor.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Advisor.kt new file mode 100644 index 0000000000000000000000000000000000000000..3cf2637ffd3ce0c2fdc8af068fe961c3099a657e --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Advisor.kt @@ -0,0 +1,11 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Advisor( + @SerialName("results") + val results: Results? +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorInResult.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorInResult.kt new file mode 100644 index 0000000000000000000000000000000000000000..6f9339f471635025123fa34b828af4b7dcfd4b08 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorInResult.kt @@ -0,0 +1,13 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class AdvisorInResult( + @SerialName("capabilities") + val capabilities: List<String?>?, + @SerialName("name") + val name: String? +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorResult.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorResult.kt new file mode 100644 index 0000000000000000000000000000000000000000..cf6837118ee5e67cb1fd1b90dc8e3fe591d4cf62 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorResult.kt @@ -0,0 +1,20 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.Contextual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class AdvisorResult( + @SerialName("identifier") + val identifier: String, + @SerialName("advisor") + val advisor: AdvisorInResult?, + @SerialName("defects") + val defects: List<@Contextual Any>?, + @SerialName("summary") + val summary: Summary?, + @SerialName("vulnerabilities") + val vulnerabilities: List<Vulnerability>? +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Issue.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Issue.kt new file mode 100644 index 0000000000000000000000000000000000000000..83a685ceb76441082a8dce8d7f980d1bcc711b1c --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Issue.kt @@ -0,0 +1,17 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Issue( + @SerialName("message") + val message: String?, + @SerialName("severity") + val severity: String?, + @SerialName("source") + val source: String?, + @SerialName("timestamp") + val timestamp: String? +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Ort.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Ort.kt new file mode 100644 index 0000000000000000000000000000000000000000..e6c1b91b61d6d926b3b4babead250d9f55b534c9 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Ort.kt @@ -0,0 +1,11 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Ort( + @SerialName("advisor") + val advisor: Advisor? +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Reference.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Reference.kt new file mode 100644 index 0000000000000000000000000000000000000000..0215e23cc7602f154904036022679a7b4c2324fb --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Reference.kt @@ -0,0 +1,15 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Reference( + @SerialName("scoring_system") + val scoringSystem: String?, + @SerialName("severity") + val severity: String?, + @SerialName("url") + val url: String? +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Results.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Results.kt new file mode 100644 index 0000000000000000000000000000000000000000..041e119f06d076ff6ee2f420fb9ea6f728a11bca --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Results.kt @@ -0,0 +1,12 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonObject + +@Serializable +data class Results( + @SerialName("advisor_results") + val advisorResults: JsonObject +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Summary.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Summary.kt new file mode 100644 index 0000000000000000000000000000000000000000..8e5e6654ba72db45b8dc2f7d8a98dc1c299ac039 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Summary.kt @@ -0,0 +1,15 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Summary( + @SerialName("end_time") + val endTime: String?, + @SerialName("issues") + val issues: List<Issue?>?, + @SerialName("start_time") + val startTime: String? +) \ No newline at end of file diff --git a/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Vulnerability.kt b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Vulnerability.kt new file mode 100644 index 0000000000000000000000000000000000000000..622a27db84c91424ec453d6aaf0d09af46775998 --- /dev/null +++ b/src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Vulnerability.kt @@ -0,0 +1,13 @@ +package de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.model + + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Vulnerability( + @SerialName("id") + val id: String?, + @SerialName("references") + val references: List<Reference?>? +) \ No newline at end of file diff --git a/src/test/kotlin/de/fraunhofer/iem/dataprovider/ParseOrtAdvisorResult.kt b/src/test/kotlin/de/fraunhofer/iem/dataprovider/ParseOrtAdvisorResult.kt new file mode 100644 index 0000000000000000000000000000000000000000..c0d1caebf7ab7cdcb5072883b184c72f3760a788 --- /dev/null +++ b/src/test/kotlin/de/fraunhofer/iem/dataprovider/ParseOrtAdvisorResult.kt @@ -0,0 +1,20 @@ +package de.fraunhofer.iem.dataprovider + +import de.fraunhofer.iem.dataprovider.taskManager.tasks.ort.getOrtResultsFromFile +import org.junit.jupiter.api.Test +import java.nio.file.Paths + +class ParseOrtAdvisorResult { + + @Test + fun parseOrt() { + val res = + getOrtResultsFromFile(Paths.get("src/test/kotlin/de/fraunhofer/iem/dataprovider/ort-advisor-example-results.json")) + + assert(res[0].identifier == "first" && res[1].identifier == "second") + assert(res[0].vulnerabilities?.get(0)?.id == "CVE-2021-45105") + assert(res[0].vulnerabilities?.get(0)?.references?.get(0)?.severity == "6.6") + } + + +} \ No newline at end of file diff --git a/src/test/kotlin/de/fraunhofer/iem/dataprovider/ort-advisor-example-results.json b/src/test/kotlin/de/fraunhofer/iem/dataprovider/ort-advisor-example-results.json new file mode 100644 index 0000000000000000000000000000000000000000..a33f4b334bc82efe1e11fa6351e065a3bb80ec63 --- /dev/null +++ b/src/test/kotlin/de/fraunhofer/iem/dataprovider/ort-advisor-example-results.json @@ -0,0 +1,130 @@ +{ + "advisor": { + "results": { + "advisor_results": { + "first": [ + { + "advisor": { + "name": "VulnerableCode", + "capabilities": [ + "VULNERABILITIES" + ] + }, + "summary": { + "start_time": "2023-06-05T08:54:18.739380591Z", + "end_time": "2023-06-05T08:54:21.192752259Z", + "issues": [ + { + "timestamp": "2023-06-05T08:54:21.196167384Z", + "source": "VulnerableCode", + "message": "Failed to map VulnerabilityReference(url=https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:4.10\\(0.15\\):*:*:*:*:*:*:*, scores=[]) to ORT model due to java.net.URISyntaxException: Illegal character in query at index 122: https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:4.10\\(0.15\\):*:*:*:*:*:*:*.", + "severity": "HINT" + }, + { + "timestamp": "2023-06-05T08:54:21.200655759Z", + "source": "VulnerableCode", + "message": "Failed to map VulnerabilityReference(url=https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:5.3\\(0\\):*:*:*:*:*:*:*, scores=[]) to ORT model due to java.net.URISyntaxException: Illegal character in query at index 121: https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:5.3\\(0\\):*:*:*:*:*:*:*.", + "severity": "HINT" + } + ] + }, + "defects": [], + "vulnerabilities": [ + { + "id": "CVE-2021-45105", + "references": [ + { + "url": "https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2021-44832.json", + "scoring_system": "cvssv3", + "severity": "6.6" + }, + { + "url": "https://cert-portal.siemens.com/productcert/pdf/ssa-784507.pdf", + "scoring_system": null, + "severity": null + } + ] + }, + { + "id": "CVE-2021-44832", + "references": [ + { + "url": "https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2021-44832.json", + "scoring_system": "cvssv3", + "severity": "6.6" + }, + { + "url": "https://cert-portal.siemens.com/productcert/pdf/ssa-784507.pdf", + "scoring_system": null, + "severity": null + } + ] + } + ] + } + ], + "second": [ + { + "advisor": { + "name": "VulnerableCode", + "capabilities": [ + "VULNERABILITIES" + ] + }, + "summary": { + "start_time": "2023-06-05T08:54:18.739380591Z", + "end_time": "2023-06-05T08:54:21.192752259Z", + "issues": [ + { + "timestamp": "2023-06-05T08:54:21.196167384Z", + "source": "VulnerableCode", + "message": "Failed to map VulnerabilityReference(url=https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:4.10\\(0.15\\):*:*:*:*:*:*:*, scores=[]) to ORT model due to java.net.URISyntaxException: Illegal character in query at index 122: https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:4.10\\(0.15\\):*:*:*:*:*:*:*.", + "severity": "HINT" + }, + { + "timestamp": "2023-06-05T08:54:21.200655759Z", + "source": "VulnerableCode", + "message": "Failed to map VulnerabilityReference(url=https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:5.3\\(0\\):*:*:*:*:*:*:*, scores=[]) to ORT model due to java.net.URISyntaxException: Illegal character in query at index 121: https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:cisco:cloudcenter_suite:5.3\\(0\\):*:*:*:*:*:*:*.", + "severity": "HINT" + } + ] + }, + "defects": [], + "vulnerabilities": [ + { + "id": "CVE-2021-45105", + "references": [ + { + "url": "https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2021-44832.json", + "scoring_system": "cvssv3", + "severity": "6.6" + }, + { + "url": "https://cert-portal.siemens.com/productcert/pdf/ssa-784507.pdf", + "scoring_system": null, + "severity": null + } + ] + }, + { + "id": "CVE-2021-44832", + "references": [ + { + "url": "https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2021-44832.json", + "scoring_system": "cvssv3", + "severity": "6.6" + }, + { + "url": "https://cert-portal.siemens.com/productcert/pdf/ssa-784507.pdf", + "scoring_system": null, + "severity": null + } + ] + } + ] + } + ] + } + } + } +} \ No newline at end of file