From f8674231283d69cda773b6848b71207549d5a286 Mon Sep 17 00:00:00 2001 From: Jan-Niclas Struewer <j.n.struewer@gmail.com> Date: Tue, 6 Jun 2023 18:54:11 +0200 Subject: [PATCH] parsing ort result --- .../taskManager/tasks/ort/OrtTask.kt | 40 ++++++ .../taskManager/tasks/ort/model/Advisor.kt | 11 ++ .../tasks/ort/model/AdvisorInResult.kt | 13 ++ .../tasks/ort/model/AdvisorResult.kt | 20 +++ .../taskManager/tasks/ort/model/Issue.kt | 17 +++ .../taskManager/tasks/ort/model/Ort.kt | 11 ++ .../taskManager/tasks/ort/model/Reference.kt | 15 ++ .../taskManager/tasks/ort/model/Results.kt | 12 ++ .../taskManager/tasks/ort/model/Summary.kt | 15 ++ .../tasks/ort/model/Vulnerability.kt | 13 ++ .../iem/dataprovider/ParseOrtAdvisorResult.kt | 20 +++ .../ort-advisor-example-results.json | 130 ++++++++++++++++++ 12 files changed, 317 insertions(+) create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/OrtTask.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Advisor.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorInResult.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/AdvisorResult.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Issue.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Ort.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Reference.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Results.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Summary.kt create mode 100644 src/main/kotlin/de/fraunhofer/iem/dataprovider/taskManager/tasks/ort/model/Vulnerability.kt create mode 100644 src/test/kotlin/de/fraunhofer/iem/dataprovider/ParseOrtAdvisorResult.kt create mode 100644 src/test/kotlin/de/fraunhofer/iem/dataprovider/ort-advisor-example-results.json 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 00000000..23e23d7a --- /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 00000000..3cf2637f --- /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 00000000..6f9339f4 --- /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 00000000..cf683711 --- /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 00000000..83a685ce --- /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 00000000..e6c1b91b --- /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 00000000..0215e23c --- /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 00000000..041e119f --- /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 00000000..8e5e6654 --- /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 00000000..622a27db --- /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 00000000..c0d1caeb --- /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 00000000..a33f4b33 --- /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 -- GitLab