From 9403fafe359c7884796acf1df47351305cd6abce Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Fri, 29 Nov 2024 16:22:39 +0000 Subject: [PATCH 01/82] fix: release to be sca scanned (#2286) --- .github/workflows/scan_sca_current.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scan_sca_current.yml b/.github/workflows/scan_sca_current.yml index a25b3070c..1c13a9cd3 100644 --- a/.github/workflows/scan_sca_current.yml +++ b/.github/workflows/scan_sca_current.yml @@ -15,7 +15,7 @@ jobs: name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: 'v1.22.2' + ref: 'v1.22.5' - name: Run SCA vulnerability scanners uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main From b5513c9fcc0e43c66d33dc18eca31bafd67dc422 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 07:03:33 +0000 Subject: [PATCH 02/82] chore(deps): update eslint monorepo to v9.16.0 (#2287) --- frontend/package-lock.json | 18 +++++++++--------- frontend/package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 650f905cb..e7740f660 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -36,7 +36,7 @@ "devDependencies": { "@eslint/compat": "1.2.3", "@eslint/eslintrc": "3.2.0", - "@eslint/js": "9.15.0", + "@eslint/js": "9.16.0", "@microsoft/eslint-formatter-sarif": "3.1.0", "@trivago/prettier-plugin-sort-imports": "4.3.0", "@types/inflection": "1.13.2", @@ -48,7 +48,7 @@ "@typescript-eslint/eslint-plugin": "8.16.0", "@typescript-eslint/parser": "8.16.0", "@vitejs/plugin-react": "4.3.4", - "eslint": "9.15.0", + "eslint": "9.16.0", "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", @@ -1161,9 +1161,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", - "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", + "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", "dev": true, "license": "MIT", "engines": { @@ -5050,9 +5050,9 @@ } }, "node_modules/eslint": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", - "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", + "version": "9.16.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", + "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", "dev": true, "license": "MIT", "dependencies": { @@ -5061,7 +5061,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.9.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.15.0", + "@eslint/js": "9.16.0", "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", diff --git a/frontend/package.json b/frontend/package.json index da72da9d2..04dfae967 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@eslint/compat": "1.2.3", "@eslint/eslintrc": "3.2.0", - "@eslint/js": "9.15.0", + "@eslint/js": "9.16.0", "@microsoft/eslint-formatter-sarif": "3.1.0", "@trivago/prettier-plugin-sort-imports": "4.3.0", "@types/inflection": "1.13.2", @@ -57,7 +57,7 @@ "@typescript-eslint/eslint-plugin": "8.16.0", "@typescript-eslint/parser": "8.16.0", "@vitejs/plugin-react": "4.3.4", - "eslint": "9.15.0", + "eslint": "9.16.0", "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", From 21a51c65f739966fb66e506512ccb83eabddd13d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Nov 2024 14:14:54 +0000 Subject: [PATCH 03/82] fix(deps): update dependency drf-spectacular to v0.28.0 (#2288) --- backend/poetry.lock | 8 ++++---- backend/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 70fc5cce9..dea3f81cd 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -856,13 +856,13 @@ wmi = ["wmi (>=1.5.1)"] [[package]] name = "drf-spectacular" -version = "0.27.2" +version = "0.28.0" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" optional = false python-versions = ">=3.7" files = [ - {file = "drf-spectacular-0.27.2.tar.gz", hash = "sha256:a199492f2163c4101055075ebdbb037d59c6e0030692fc83a1a8c0fc65929981"}, - {file = "drf_spectacular-0.27.2-py3-none-any.whl", hash = "sha256:b1c04bf8b2fbbeaf6f59414b4ea448c8787aba4d32f76055c3b13335cf7ec37b"}, + {file = "drf_spectacular-0.28.0-py3-none-any.whl", hash = "sha256:856e7edf1056e49a4245e87a61e8da4baff46c83dbc25be1da2df77f354c7cb4"}, + {file = "drf_spectacular-0.28.0.tar.gz", hash = "sha256:2c778a47a40ab2f5078a7c42e82baba07397bb35b074ae4680721b2805943061"}, ] [package.dependencies] @@ -2543,4 +2543,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "005ffaf714df6c69715a84a3d8f050f1febd1044c65d640119b9e5aff28cf605" +content-hash = "4761c0927ebdd853b7c5d9b6d0ead9a8bb7d9d345fb7771e2f4ada7f1326c093" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 17e879279..1eb553573 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -26,7 +26,7 @@ djangorestframework = "3.15.2" # https://github.com/encode/django-rest-framewor django-cors-headers = "4.6.0" # https://github.com/adamchainz/django-cors-headers # OpenAPI 3 # ------------------------------------------------------------------------------ -drf-spectacular = "0.27.2" # https://github.com/tfranzel/drf-spectacular +drf-spectacular = "0.28.0" # https://github.com/tfranzel/drf-spectacular drf-spectacular-sidecar = "2024.11.1" # https://github.com/tfranzel/drf-spectacular-sidecar # Token authentication # ------------------------------------------------------------------------------ From cb965ca9a8e012e46a4d4a7ba56a7275c9574363 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Sat, 30 Nov 2024 20:50:24 +0000 Subject: [PATCH 04/82] fix: prev/next button for license component show coming from overview list (#2289) --- .../LicenseComponentEmbeddedList.tsx | 14 +++++++-- .../LicenseComponentShow.tsx | 31 ++++++++++++++++--- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/frontend/src/licenses/license_components/LicenseComponentEmbeddedList.tsx b/frontend/src/licenses/license_components/LicenseComponentEmbeddedList.tsx index a4a683a7b..50d8d58d4 100644 --- a/frontend/src/licenses/license_components/LicenseComponentEmbeddedList.tsx +++ b/frontend/src/licenses/license_components/LicenseComponentEmbeddedList.tsx @@ -86,7 +86,6 @@ const LicenseComponentEmbeddedList = ({ product, expand, purl_type }: LicenseCom } let filter: any = { product: Number(product.id) }; - let storeKey: any = "license_components.embedded"; let filterDefaultValues: any = {}; const record = useRecordContext(); @@ -103,9 +102,18 @@ const LicenseComponentEmbeddedList = ({ product, expand, purl_type }: LicenseCom if (purl_type) { filter = { ...filter, purl_type: purl_type }; } - storeKey = false; + if (record) { + const storedFilters = { + branch_name: record.branch_name, + license_name: record.license_name, + evaluation_result: record.evaluation_result, + purl_type: purl_type, + }; + localStorage.setItem("license_component_expand_filters", JSON.stringify({ storedFilters })); + } } else { filterDefaultValues = { branch: product.repository_default_branch }; + localStorage.removeItem("license_component_expand_filters"); } const listContext = useListController({ @@ -115,7 +123,7 @@ const LicenseComponentEmbeddedList = ({ product, expand, purl_type }: LicenseCom sort: { field: "evaluation_result", order: "ASC" }, filterDefaultValues: filterDefaultValues, disableSyncWithLocation: true, - storeKey: storeKey, + storeKey: "license_components.embedded", }); if (listContext.isLoading) { diff --git a/frontend/src/licenses/license_components/LicenseComponentShow.tsx b/frontend/src/licenses/license_components/LicenseComponentShow.tsx index 10d9ea227..c55c8d804 100644 --- a/frontend/src/licenses/license_components/LicenseComponentShow.tsx +++ b/frontend/src/licenses/license_components/LicenseComponentShow.tsx @@ -19,15 +19,36 @@ import MermaidDependencies from "../../core/observations/Mermaid_Dependencies"; import LicenseComponentShowAside from "./LicenseComponentShowAside"; const ShowActions = () => { - const component = useRecordContext(); + const license_component = useRecordContext(); + + const filter = () => { + // eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style + const filter: { [key: string]: any } = {}; + if (license_component) { + filter["product"] = Number(license_component.product); + } + const license_component_expand_filters = localStorage.getItem("license_component_expand_filters"); + const storedFilters = license_component_expand_filters ? JSON.parse(license_component_expand_filters) : {}; + if (storedFilters.storedFilters) { + if (storedFilters.storedFilters.branch_name) { + filter["branch_name"] = storedFilters.storedFilters.branch_name; + } + if (storedFilters.storedFilters.license_name) { + filter["license_name_exact"] = storedFilters.storedFilters.license_name; + } + if (storedFilters.storedFilters.evaluation_result) { + filter["evaluation_result"] = storedFilters.storedFilters.evaluation_result; + } + } + return filter; + }; + return ( - {component && ( + {license_component && ( Date: Sun, 1 Dec 2024 11:25:48 +0000 Subject: [PATCH 05/82] feat: show observation on side of observation log (#2291) --- .../observation_logs/ObservationLogShow.tsx | 24 +-- .../ObservationLogShowAside.tsx | 24 +++ .../core/observations/ObservationExpand.tsx | 2 +- .../src/core/observations/ObservationShow.tsx | 81 +--------- .../observations/ObservationShowAside.tsx | 11 +- .../observations/ObservationShowHeader.tsx | 146 ++++++++++++++++++ .../observations/ObservationShowOrigins.tsx | 17 +- 7 files changed, 188 insertions(+), 117 deletions(-) create mode 100644 frontend/src/core/observation_logs/ObservationLogShowAside.tsx create mode 100644 frontend/src/core/observations/ObservationShowHeader.tsx diff --git a/frontend/src/core/observation_logs/ObservationLogShow.tsx b/frontend/src/core/observation_logs/ObservationLogShow.tsx index ca3ea956d..c96c89149 100644 --- a/frontend/src/core/observation_logs/ObservationLogShow.tsx +++ b/frontend/src/core/observation_logs/ObservationLogShow.tsx @@ -20,6 +20,7 @@ import { SeverityField } from "../../commons/custom_fields/SeverityField"; import { is_superuser } from "../../commons/functions"; import { ASSESSMENT_STATUS_NEEDS_APPROVAL } from "../types"; import AssessmentApproval from "./AssessmentApproval"; +import ObservationLogShowAside from "./ObservationLogShowAside"; const ShowActions = () => { const observation_log = useRecordContext(); @@ -66,27 +67,6 @@ const ObservationLogComponent = () => { Observation Log - - - - - - - - - - @@ -197,7 +177,7 @@ const ObservationLogComponent = () => { }; const ObservationLogShow = () => { return ( - } component={ObservationLogComponent}> + } component={ObservationLogComponent} aside={}> ); diff --git a/frontend/src/core/observation_logs/ObservationLogShowAside.tsx b/frontend/src/core/observation_logs/ObservationLogShowAside.tsx new file mode 100644 index 000000000..645679175 --- /dev/null +++ b/frontend/src/core/observation_logs/ObservationLogShowAside.tsx @@ -0,0 +1,24 @@ +import { Box } from "@mui/material"; +import { WithRecord } from "react-admin"; + +import ObservationShowHeader from "../observations/ObservationShowHeader"; +import ObservationShowOrigins from "../observations/ObservationShowOrigins"; + +const ObservationLogShowAside = () => { + return ( + ( + + + + + )} + /> + ); +}; + +export default ObservationLogShowAside; diff --git a/frontend/src/core/observations/ObservationExpand.tsx b/frontend/src/core/observations/ObservationExpand.tsx index 8d3c0b2ec..99a997b93 100644 --- a/frontend/src/core/observations/ObservationExpand.tsx +++ b/frontend/src/core/observations/ObservationExpand.tsx @@ -15,7 +15,7 @@ const ObservationExpand = () => { )} - + ); }; diff --git a/frontend/src/core/observations/ObservationShow.tsx b/frontend/src/core/observations/ObservationShow.tsx index ef96baff3..bc91d5a1e 100644 --- a/frontend/src/core/observations/ObservationShow.tsx +++ b/frontend/src/core/observations/ObservationShow.tsx @@ -1,8 +1,6 @@ import { Box, Paper, Stack, Typography } from "@mui/material"; import { Fragment } from "react"; import { - ChipField, - DateField, EditButton, Labeled, NumberField, @@ -19,17 +17,15 @@ import { PERMISSION_OBSERVATION_EDIT, PERMISSION_OBSERVATION_LOG_APPROVAL, } from "../../access_control/types"; -import { SeverityField } from "../../commons/custom_fields/SeverityField"; import TextUrlField from "../../commons/custom_fields/TextUrlField"; import { get_cwe_url, get_vulnerability_url } from "../../commons/functions"; -import { useStyles } from "../../commons/layout/themes"; import AssessmentApproval from "../observation_logs/AssessmentApproval"; import ObservationLogEmbeddedList from "../observation_logs/ObservationLogEmbeddedList"; import { OBSERVATION_STATUS_IN_REVIEW, OBSERVATION_STATUS_OPEN } from "../types"; import ObservationAssessment from "./ObservationAssessment"; import ObservationRemoveAssessment from "./ObservationRemoveAssessment"; import ObservationsShowAside from "./ObservationShowAside"; -import ObservationShowDescriptionRecommendation from "./ObservationShowDescriptionRecommendation"; +import ObservationShowHeader from "./ObservationShowHeader"; import ObservationShowOrigins from "./ObservationShowOrigins"; import PotentialDuplicatesList from "./PotentialDuplicatesList"; import { @@ -102,82 +98,11 @@ const ShowActions = () => { }; const ObservationShowComponent = () => { - const { classes } = useStyles(); - return ( ( - - - Observation - - - - - - - {observation.parser_severity != "" && - (observation.rule_severity != "" || observation.assessment_severity != "") && ( - - - - )} - {observation.rule_severity != "" && ( - - - - )} - {observation.assessment_severity != "" && ( - - - - )} - - - - - - {observation.parser_status != "" && - (observation.rule_status != "" || - observation.assessment_status != "" || - observation.vex_status != "") && ( - - - - )} - {observation.vex_status != "" && ( - - - - )} - {observation.rule_status != "" && ( - - - - )} - {observation.assessment_status != "" && ( - - - - )} - - {observation.found != null && ( - - - - )} - {observation.risk_acceptance_expiry_date != null && ( - - - - )} - - - - - - + {(observation.vulnerability_id != "" || observation.cvss3_score != null || @@ -240,7 +165,7 @@ const ObservationShowComponent = () => { )} - + diff --git a/frontend/src/core/observations/ObservationShowAside.tsx b/frontend/src/core/observations/ObservationShowAside.tsx index f8c8b4d6d..1a575e11d 100644 --- a/frontend/src/core/observations/ObservationShowAside.tsx +++ b/frontend/src/core/observations/ObservationShowAside.tsx @@ -42,16 +42,7 @@ const MetaData = () => { link="show" sx={{ "& a": { textDecoration: "none" } }} /> - {observation.branch && ( - - )} + {observation.branch && } {observation.scanner != "" && } {observation.scanner_observation_id != "" && ( diff --git a/frontend/src/core/observations/ObservationShowHeader.tsx b/frontend/src/core/observations/ObservationShowHeader.tsx new file mode 100644 index 000000000..d5f1a1858 --- /dev/null +++ b/frontend/src/core/observations/ObservationShowHeader.tsx @@ -0,0 +1,146 @@ +import { Paper, Stack, Typography } from "@mui/material"; +import { + ChipField, + DateField, + Labeled, + RecordContextProvider, + ReferenceField, + TextField, + useRecordContext, +} from "react-admin"; + +import { SeverityField } from "../../commons/custom_fields/SeverityField"; +import { useStyles } from "../../commons/layout/themes"; +import ObservationShowDescriptionRecommendation from "./ObservationShowDescriptionRecommendation"; + +type ObservationShowHeaderProps = { + observation?: any; +}; + +const ObservationShowHeader = ({ observation }: ObservationShowHeaderProps) => { + const { classes } = useStyles(); + + let in_observation_log = false; + const observation_record = useRecordContext(); + if (observation) { + in_observation_log = true; + } else { + observation = observation_record; + } + + return ( + + {observation && ( + + + Observation + + {in_observation_log && ( + + + + + + + {observation.branch && ( + + + + )} + + )} + + + + + + {!in_observation_log && + observation.parser_severity != "" && + (observation.rule_severity != "" || observation.assessment_severity != "") && ( + + + + )} + {!in_observation_log && observation.rule_severity != "" && ( + + + + )} + {!in_observation_log && observation.assessment_severity != "" && ( + + + + )} + + + + + + {!in_observation_log && + observation.parser_status != "" && + (observation.rule_status != "" || + observation.assessment_status != "" || + observation.vex_status != "") && ( + + + + )} + {!in_observation_log && observation.vex_status != "" && ( + + + + )} + {!in_observation_log && observation.rule_status != "" && ( + + + + )} + {!in_observation_log && observation.assessment_status != "" && ( + + + + )} + + {observation.found != null && ( + + + + )} + {observation.risk_acceptance_expiry_date != null && ( + + + + )} + {!in_observation_log && ( + + + + )} + {in_observation_log && ( + + + + + + )} + + + + )} + + ); +}; + +export default ObservationShowHeader; diff --git a/frontend/src/core/observations/ObservationShowOrigins.tsx b/frontend/src/core/observations/ObservationShowOrigins.tsx index e4d98ac2a..0cc488532 100644 --- a/frontend/src/core/observations/ObservationShowOrigins.tsx +++ b/frontend/src/core/observations/ObservationShowOrigins.tsx @@ -1,6 +1,6 @@ import { Paper, Stack, Typography } from "@mui/material"; import { Fragment } from "react"; -import { Labeled, TextField, useRecordContext } from "react-admin"; +import { Labeled, RecordContextProvider, TextField, useRecordContext } from "react-admin"; import TextUrlField from "../../commons/custom_fields/TextUrlField"; import { get_component_purl_url } from "../../commons/functions"; @@ -8,14 +8,19 @@ import { getElevation } from "../../metrics/functions"; import MermaidDependencies from "./Mermaid_Dependencies"; type ObservationShowOriginsProps = { + observation?: any; + showDependencies: boolean; elevated: boolean; }; -const ObservationShowOrigins = ({ elevated }: ObservationShowOriginsProps) => { - const observation = useRecordContext(); +const ObservationShowOrigins = ({ observation, showDependencies, elevated }: ObservationShowOriginsProps) => { + const observation_record = useRecordContext(); + if (!observation) { + observation = observation_record; + } return ( - + {observation && (observation.origin_service_name != "" || observation.origin_component_name != "" || @@ -94,7 +99,7 @@ const ObservationShowOrigins = ({ elevated }: ObservationShowOriginsProps) => { {observation.origin_component_dependencies && observation.origin_component_dependencies != "" && - elevated && ( + showDependencies && ( )} @@ -247,7 +252,7 @@ const ObservationShowOrigins = ({ elevated }: ObservationShowOriginsProps) => { )} )} - + ); }; From 6e5a6c869950bf891c71166c670ecfe42d7800fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2024 12:31:13 +0100 Subject: [PATCH 06/82] chore(deps): update dependency mkdocs-material to v9.5.47 (#2290) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- mkdocs_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs_requirements.txt b/mkdocs_requirements.txt index b2aa69a32..030c5c4bc 100644 --- a/mkdocs_requirements.txt +++ b/mkdocs_requirements.txt @@ -1 +1 @@ -mkdocs-material==9.5.46 # https://github.com/squidfunk/mkdocs-material +mkdocs-material==9.5.47 # https://github.com/squidfunk/mkdocs-material From dc7a146762ace4f4e168c4274c0bc0b7e8f7a6db Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 1 Dec 2024 14:09:59 +0100 Subject: [PATCH 07/82] fix(deps): update dependency drf-spectacular-sidecar to v2024.12.1 (#2292) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/poetry.lock | 8 ++++---- backend/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index dea3f81cd..0bf90f437 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -879,13 +879,13 @@ sidecar = ["drf-spectacular-sidecar"] [[package]] name = "drf-spectacular-sidecar" -version = "2024.11.1" +version = "2024.12.1" description = "Serve self-contained distribution builds of Swagger UI and Redoc with Django" optional = false python-versions = ">=3.6" files = [ - {file = "drf_spectacular_sidecar-2024.11.1-py3-none-any.whl", hash = "sha256:e2efd49c5bd1a607fd5d120d9da58d78e587852db8220b8880282a849296ff83"}, - {file = "drf_spectacular_sidecar-2024.11.1.tar.gz", hash = "sha256:fcfccc72cbdbe41e93f8416fa0c712d14126b8d1629e65c09c07c8edea24aad0"}, + {file = "drf_spectacular_sidecar-2024.12.1-py3-none-any.whl", hash = "sha256:e30821d150d29294f3be2018aab31b55cd724158e9e690b51a215264751aa8c7"}, + {file = "drf_spectacular_sidecar-2024.12.1.tar.gz", hash = "sha256:6be31df38bcf95681224b6550faa9344ee6dd5360dcf2b44afcc3f7460385613"}, ] [package.dependencies] @@ -2543,4 +2543,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "4761c0927ebdd853b7c5d9b6d0ead9a8bb7d9d345fb7771e2f4ada7f1326c093" +content-hash = "71bc8944a26f46ecb1befc16edd55faeb69dc8f511a35d43513521f58b2c7ac1" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 1eb553573..ab51a3c28 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -27,7 +27,7 @@ django-cors-headers = "4.6.0" # https://github.com/adamchainz/django-cors-header # OpenAPI 3 # ------------------------------------------------------------------------------ drf-spectacular = "0.28.0" # https://github.com/tfranzel/drf-spectacular -drf-spectacular-sidecar = "2024.11.1" # https://github.com/tfranzel/drf-spectacular-sidecar +drf-spectacular-sidecar = "2024.12.1" # https://github.com/tfranzel/drf-spectacular-sidecar # Token authentication # ------------------------------------------------------------------------------ PyJWT = "2.10.1" # https://github.com/jpadilla/pyjwt From 5f1385eeb4dd0da656aeaf66ecdbfce978f355b5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 07:39:53 +0100 Subject: [PATCH 08/82] fix(deps): update dependency chart.js to v4.4.7 (#2293) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e7740f660..1fe499ba9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -17,7 +17,7 @@ "@fortawesome/react-fontawesome": "0.2.2", "@textea/json-viewer": "3.5.0", "axios": "1.7.8", - "chart.js": "4.4.6", + "chart.js": "4.4.7", "markdown-to-jsx": "7.7.0", "mermaid": "11.4.1", "oidc-client-ts": "3.1.0", @@ -3920,9 +3920,9 @@ } }, "node_modules/chart.js": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.6.tgz", - "integrity": "sha512-8Y406zevUPbbIBA/HRk33khEmQPk5+cxeflWE/2rx1NJsjVWMPw/9mSP9rxHP5eqi6LNoPBVMfZHxbwLSgldYA==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz", + "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==", "license": "MIT", "dependencies": { "@kurkle/color": "^0.3.0" diff --git a/frontend/package.json b/frontend/package.json index 04dfae967..249958502 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,7 +13,7 @@ "@fortawesome/react-fontawesome": "0.2.2", "@textea/json-viewer": "3.5.0", "axios": "1.7.8", - "chart.js": "4.4.6", + "chart.js": "4.4.7", "markdown-to-jsx": "7.7.0", "mermaid": "11.4.1", "oidc-client-ts": "3.1.0", From f95336c45e7aed2ebe0ed67893147759ffa789d7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 07:53:33 +0100 Subject: [PATCH 09/82] fix(deps): update dependency pylint to v3.3.2 (#2294) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/poetry.lock | 10 +++++----- backend/pyproject.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 0bf90f437..fd343e358 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1959,17 +1959,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "3.3.1" +version = "3.3.2" description = "python code static checker" optional = true python-versions = ">=3.9.0" files = [ - {file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"}, - {file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"}, + {file = "pylint-3.3.2-py3-none-any.whl", hash = "sha256:77f068c287d49b8683cd7c6e624243c74f92890f767f106ffa1ddf3c0a54cb7a"}, + {file = "pylint-3.3.2.tar.gz", hash = "sha256:9ec054ec992cd05ad30a6df1676229739a73f8feeabf3912c995d17601052b01"}, ] [package.dependencies] -astroid = ">=3.3.4,<=3.4.0-dev0" +astroid = ">=3.3.5,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -2543,4 +2543,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "71bc8944a26f46ecb1befc16edd55faeb69dc8f511a35d43513521f58b2c7ac1" +content-hash = "b1ba30a302b71f2ba68aee82460dc15d2d772769fc6529a04309fb553c56e984" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index ab51a3c28..3019f55e4 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -79,7 +79,7 @@ django-coverage-plugin = { version = "3.1.0", optional = true } # https://githu flake8 = { version = "7.1.1", optional = true } # https://github.com/PyCQA/flake8 flake8-isort = { version = "6.1.1", optional = true } # https://github.com/gforcada/flake8-isort black = { version = "24.10.0", optional = true } # https://github.com/psf/black -pylint = { version = "3.3.1", optional = true } # https://github.com/pylint-dev/pylint +pylint = { version = "3.3.2", optional = true } # https://github.com/pylint-dev/pylint pylint-django = { version = "2.6.1", optional = true } # https://github.com/PyCQA/pylint-django pre-commit = { version = "4.0.1", optional = true } # https://github.com/pre-commit/pre-commit mypy = { version = "1.13.0", optional = true } # https://github.com/python/mypy From 19944afb27b64e6cf9d915e3fe932861a9b2e35b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2024 07:59:06 +0100 Subject: [PATCH 10/82] chore(deps): update dependency globals to v15.13.0 (#2295) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1fe499ba9..4dc9ceef3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -52,7 +52,7 @@ "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", - "globals": "15.12.0", + "globals": "15.13.0", "prettier": "3.4.1", "rewire": "7.0.0", "typescript": "5.7.2", @@ -5675,9 +5675,9 @@ } }, "node_modules/globals": { - "version": "15.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", - "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", + "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", "dev": true, "license": "MIT", "engines": { diff --git a/frontend/package.json b/frontend/package.json index 249958502..1dccc1f4d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -61,7 +61,7 @@ "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", - "globals": "15.12.0", + "globals": "15.13.0", "prettier": "3.4.1", "rewire": "7.0.0", "typescript": "5.7.2", From a85da024bc3135fc6d823b7414df10ee46cb0734 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 05:47:17 +0000 Subject: [PATCH 11/82] fix(deps): update react-admin monorepo to v5.4.1 (#2297) --- frontend/package-lock.json | 52 +++++++++++++++++++------------------- frontend/package.json | 4 +-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4dc9ceef3..e596b55e4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,9 +23,9 @@ "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", "query-string": "9.1.1", - "ra-input-rich-text": "5.4.0", + "ra-input-rich-text": "5.4.1", "react": "18.3.1", - "react-admin": "5.4.0", + "react-admin": "5.4.1", "react-chartjs-2": "5.2.0", "react-dom": "18.3.1", "react-is": "18.3.1", @@ -7512,9 +7512,9 @@ "license": "MIT" }, "node_modules/ra-core": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ra-core/-/ra-core-5.4.0.tgz", - "integrity": "sha512-Gvp7FiItL0fYq0r9C5jU0Gm56096c2FfOY/UaCDnOvshs3UGTLd5cknRZ30lo9Qr+SoZPP8PH8Ef6LblEXkFBA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ra-core/-/ra-core-5.4.1.tgz", + "integrity": "sha512-jn1kU3Yn6OMLZFi0Ym3hsNnOo6+qJRp9En61t7MccfY+ultVx2FBWi+EZRoV1+hlVZmO7OcpKJ2dM7Sb5csx1w==", "license": "MIT", "dependencies": { "@tanstack/react-query": "^5.21.7", @@ -7582,19 +7582,19 @@ } }, "node_modules/ra-i18n-polyglot": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ra-i18n-polyglot/-/ra-i18n-polyglot-5.4.0.tgz", - "integrity": "sha512-2bRIa/y1PgZFjMir3bLEo1DcLEkWr7L7jrZuTXc0gXL5E8O6tGMaWkURxJyp1iIeZ0pUiPEahr6rePWwHVeZhA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ra-i18n-polyglot/-/ra-i18n-polyglot-5.4.1.tgz", + "integrity": "sha512-2UIFk7yUbicCU1dpo8bdWSeAMKffjg82JaDRuoUU/eo0LkXGz0VrmFqhC4OQQ1CSMrFx+NuhD/7vFbRFOPzcww==", "license": "MIT", "dependencies": { "node-polyglot": "^2.2.2", - "ra-core": "^5.4.0" + "ra-core": "^5.4.1" } }, "node_modules/ra-input-rich-text": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ra-input-rich-text/-/ra-input-rich-text-5.4.0.tgz", - "integrity": "sha512-kfVPPQcNGC56Qv6cdJoLH+sQjenHUoFud0YWSML6oGB30yr2YsNJwHr2fGkTlijO26C3UqWJ5sBZh0j+HY0rcw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ra-input-rich-text/-/ra-input-rich-text-5.4.1.tgz", + "integrity": "sha512-RCWGFd5C4V8Vtx6UBdTW1Cr5kQk8gqisNdJc7bqqmc8vxaR5igF1Etw7+qbSvsHBbiseclbt+0OOfKNaKv6wZQ==", "license": "MIT", "dependencies": { "@tiptap/core": "^2.0.3", @@ -7621,18 +7621,18 @@ } }, "node_modules/ra-language-english": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ra-language-english/-/ra-language-english-5.4.0.tgz", - "integrity": "sha512-RUV6wo8EIFOjC4UA6d+FbfVslnvnX8f+UhElzuxRvDhXZqmEyRKxsFCLTbeI9DF/IN8Gb6pvKxCoe3jzfUcm5Q==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ra-language-english/-/ra-language-english-5.4.1.tgz", + "integrity": "sha512-coeh3CgGNYfAVngXBaa+euIAqIr1xSGC5ZnaOjehMfeA763BdoNUE7PJ25ExrBmuXhIBOuXuUW5y+q0/DNp/yw==", "license": "MIT", "dependencies": { - "ra-core": "^5.4.0" + "ra-core": "^5.4.1" } }, "node_modules/ra-ui-materialui": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/ra-ui-materialui/-/ra-ui-materialui-5.4.0.tgz", - "integrity": "sha512-FwBIboQrUXyB2ztZH150zcq5v6qMiGn2aNc9OoTcft0hoWuVBS1yIE8B67JfyZyH0azgNW20ImPbC5lYDs1l1w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ra-ui-materialui/-/ra-ui-materialui-5.4.1.tgz", + "integrity": "sha512-d1v9k/6+1HAQiKe0BN3kusD4SbpY9GLMwDbilmidcHCiqzpzvJiVdWgBtxTwd7oz2rBIQFHW34Pehzw7NlEoCQ==", "license": "MIT", "dependencies": { "@tanstack/react-query": "^5.21.7", @@ -7725,19 +7725,19 @@ } }, "node_modules/react-admin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-admin/-/react-admin-5.4.0.tgz", - "integrity": "sha512-tvGyMUSXKzfqkQKf/uRowTpVhNM03Lo9iZq7e3BgO1nTOTFXqK/QcPbECpRH6IsLgH47uSDQoeqViYkB3ut9cA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/react-admin/-/react-admin-5.4.1.tgz", + "integrity": "sha512-ksQrCJHpIeTgE5NaABTVQh6hDqcZ1rPBRN+9gjG3oJqJGLisoYnUhKQc7stREnai2rxuT+vWufZg291kOOFUmQ==", "license": "MIT", "dependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "@mui/icons-material": "^5.15.20", "@mui/material": "^5.15.20", - "ra-core": "^5.4.0", - "ra-i18n-polyglot": "^5.4.0", - "ra-language-english": "^5.4.0", - "ra-ui-materialui": "^5.4.0", + "ra-core": "^5.4.1", + "ra-i18n-polyglot": "^5.4.1", + "ra-language-english": "^5.4.1", + "ra-ui-materialui": "^5.4.1", "react-hook-form": "^7.53.0", "react-router": "^6.22.0", "react-router-dom": "^6.22.0" diff --git a/frontend/package.json b/frontend/package.json index 1dccc1f4d..91e10504f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,9 +19,9 @@ "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", "query-string": "9.1.1", - "ra-input-rich-text": "5.4.0", + "ra-input-rich-text": "5.4.1", "react": "18.3.1", - "react-admin": "5.4.0", + "react-admin": "5.4.1", "react-chartjs-2": "5.2.0", "react-dom": "18.3.1", "react-is": "18.3.1", From f368347d23166df1adecdaec4a9f9f68bc4307e2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 09:38:01 +0100 Subject: [PATCH 12/82] chore(deps): update typescript-eslint monorepo to v8.17.0 (#2298) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 88 +++++++++++++++++++------------------- frontend/package.json | 4 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e596b55e4..520e86927 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -45,8 +45,8 @@ "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.16.0", - "@typescript-eslint/parser": "8.16.0", + "@typescript-eslint/eslint-plugin": "8.17.0", + "@typescript-eslint/parser": "8.17.0", "@vitejs/plugin-react": "4.3.4", "eslint": "9.16.0", "eslint-plugin-react": "7.37.2", @@ -3254,17 +3254,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", - "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", + "integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/type-utils": "8.16.0", - "@typescript-eslint/utils": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/type-utils": "8.17.0", + "@typescript-eslint/utils": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3288,16 +3288,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", - "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz", + "integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/typescript-estree": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", "debug": "^4.3.4" }, "engines": { @@ -3317,14 +3317,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", - "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", + "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0" + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3335,14 +3335,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", - "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", + "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/typescript-estree": "8.17.0", + "@typescript-eslint/utils": "8.17.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3363,9 +3363,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", - "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", + "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", "dev": true, "license": "MIT", "engines": { @@ -3377,14 +3377,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", - "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", + "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/visitor-keys": "8.17.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3432,16 +3432,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", - "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", + "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0" + "@typescript-eslint/scope-manager": "8.17.0", + "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/typescript-estree": "8.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3460,13 +3460,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", - "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", + "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/types": "8.17.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { diff --git a/frontend/package.json b/frontend/package.json index 91e10504f..5bd28483e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,8 +54,8 @@ "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.16.0", - "@typescript-eslint/parser": "8.16.0", + "@typescript-eslint/eslint-plugin": "8.17.0", + "@typescript-eslint/parser": "8.17.0", "@vitejs/plugin-react": "4.3.4", "eslint": "9.16.0", "eslint-plugin-react": "7.37.2", From cbc5a65b9f0c2843af95a1ed309e24d6f232b22d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 14:31:07 +0100 Subject: [PATCH 13/82] chore(deps): update nginx:stable-alpine-slim docker digest to c13d84b (#2299) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker/frontend/prod/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/frontend/prod/Dockerfile b/docker/frontend/prod/Dockerfile index fcf653bdc..183cf80c8 100644 --- a/docker/frontend/prod/Dockerfile +++ b/docker/frontend/prod/Dockerfile @@ -24,7 +24,7 @@ WORKDIR /app/lib/runtime-env-cra RUN npm ci # production environment -FROM nginx:stable-alpine-slim@sha256:68ae1423d83099cf16e9c0d706633c31e235dabe0d14a4ea2d5506e9dd396a31 +FROM nginx:stable-alpine-slim@sha256:c13d84b525bee78b8761523bf5ab1985b86a4aa6682a226c09c55eb875373cb0 USER root From 79c40595671f08c95add3d42e5109b0b6df6a1ce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 14:36:17 +0100 Subject: [PATCH 14/82] chore(deps): update keycloak/keycloak docker tag to v26.0.7 (#2300) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker-compose-dev-keycloak.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-dev-keycloak.yml b/docker-compose-dev-keycloak.yml index 674bc5984..dbbdb6653 100644 --- a/docker-compose-dev-keycloak.yml +++ b/docker-compose-dev-keycloak.yml @@ -84,7 +84,7 @@ services: - "8025:8025" keycloak: - image: keycloak/keycloak:26.0.6 + image: keycloak/keycloak:26.0.7 environment: - KEYCLOAK_ADMIN=admin - KEYCLOAK_ADMIN_PASSWORD=admin From 2266dbbc35ae844c882d6b9eed4b204798248ef7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Dec 2024 15:27:24 +0100 Subject: [PATCH 15/82] chore(deps): update github/codeql-action action to v3.27.6 (#2301) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 3c43ef4df..215ad7574 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5 + uses: github/codeql-action/upload-sarif@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 with: sarif_file: results.sarif From 9d1658aa2227c9bd55f71680d5b2a1601bbbb29e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 11:29:51 +0100 Subject: [PATCH 16/82] chore(deps): update node.js to v22.12.0 (#2303) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker/frontend/dev/Dockerfile | 2 +- docker/frontend/prod/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/frontend/dev/Dockerfile b/docker/frontend/dev/Dockerfile index 6e85301ac..2cf9f0e34 100644 --- a/docker/frontend/dev/Dockerfile +++ b/docker/frontend/dev/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.11.0-alpine3.20@sha256:b64ced2e7cd0a4816699fe308ce6e8a08ccba463c757c00c14cd372e3d2c763e AS build +FROM node:22.12.0-alpine3.20@sha256:60ed91cb8b3d78a7832700f89162667f65bd8ad715b446bd6b243f3397bc8292 AS build WORKDIR /app COPY ./frontend/package*.json /app/. diff --git a/docker/frontend/prod/Dockerfile b/docker/frontend/prod/Dockerfile index 183cf80c8..87dab8277 100644 --- a/docker/frontend/prod/Dockerfile +++ b/docker/frontend/prod/Dockerfile @@ -1,5 +1,5 @@ # build environment -FROM node:22.11.0-alpine3.20@sha256:b64ced2e7cd0a4816699fe308ce6e8a08ccba463c757c00c14cd372e3d2c763e AS build +FROM node:22.12.0-alpine3.20@sha256:60ed91cb8b3d78a7832700f89162667f65bd8ad715b446bd6b243f3397bc8292 AS build ARG VERSION=unknown From 7d4e16f1c9c2d5e188ca439146f210b18b3b576c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:19:16 +0100 Subject: [PATCH 17/82] chore(deps): update dependency prettier to v3.4.2 (#2304) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 520e86927..71561f8a5 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -53,7 +53,7 @@ "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", "globals": "15.13.0", - "prettier": "3.4.1", + "prettier": "3.4.2", "rewire": "7.0.0", "typescript": "5.7.2", "vite": "5.4.11" @@ -7221,9 +7221,9 @@ } }, "node_modules/prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz", - "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "license": "MIT", "bin": { diff --git a/frontend/package.json b/frontend/package.json index 5bd28483e..d69ce0f00 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -62,7 +62,7 @@ "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", "globals": "15.13.0", - "prettier": "3.4.1", + "prettier": "3.4.2", "rewire": "7.0.0", "typescript": "5.7.2", "vite": "5.4.11" From 7e1d3ec1b9342b45be81edfd504f06f39af1d839 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:24:17 +0100 Subject: [PATCH 18/82] fix(deps): update dependency axios to v1.7.9 (#2305) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 71561f8a5..170ed7646 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -16,7 +16,7 @@ "@fortawesome/free-solid-svg-icons": "6.7.1", "@fortawesome/react-fontawesome": "0.2.2", "@textea/json-viewer": "3.5.0", - "axios": "1.7.8", + "axios": "1.7.9", "chart.js": "4.4.7", "markdown-to-jsx": "7.7.0", "mermaid": "11.4.1", @@ -3764,9 +3764,9 @@ } }, "node_modules/axios": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", - "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", diff --git a/frontend/package.json b/frontend/package.json index d69ce0f00..583c890e9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,7 +12,7 @@ "@fortawesome/free-solid-svg-icons": "6.7.1", "@fortawesome/react-fontawesome": "0.2.2", "@textea/json-viewer": "3.5.0", - "axios": "1.7.8", + "axios": "1.7.9", "chart.js": "4.4.7", "markdown-to-jsx": "7.7.0", "mermaid": "11.4.1", From dee08166c1a2226e7b941e66dd21e53c8383061e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:28:46 +0100 Subject: [PATCH 19/82] fix(deps): update dependency markdown-to-jsx to v7.7.1 (#2306) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 170ed7646..35d638dc6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -18,7 +18,7 @@ "@textea/json-viewer": "3.5.0", "axios": "1.7.9", "chart.js": "4.4.7", - "markdown-to-jsx": "7.7.0", + "markdown-to-jsx": "7.7.1", "mermaid": "11.4.1", "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", @@ -6667,9 +6667,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.0.tgz", - "integrity": "sha512-130nIMbJY+woOQJ11xTqEtYko60t6EpNkZuqjKMferL3udtob3nRfzXOdsiA26NPemiR7w/hR8M3/B9yiYPGZg==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.1.tgz", + "integrity": "sha512-BjLkHb+fWCAH9gp7ndbgPrY+zeZlGFtCiQNTWk+PD+GKfLg9YsUPNonSsYXGw6nQ7eZqeR+i71X59PpWXlxc/w==", "license": "MIT", "engines": { "node": ">= 10" diff --git a/frontend/package.json b/frontend/package.json index 583c890e9..4a37d5059 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,7 +14,7 @@ "@textea/json-viewer": "3.5.0", "axios": "1.7.9", "chart.js": "4.4.7", - "markdown-to-jsx": "7.7.0", + "markdown-to-jsx": "7.7.1", "mermaid": "11.4.1", "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", From 3e70330008d1e90bd6a29c4ec3d80333bfd1a49c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:36:01 +0100 Subject: [PATCH 20/82] chore(deps): update node.js to 96cc832 (#2308) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker/frontend/dev/Dockerfile | 2 +- docker/frontend/prod/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/frontend/dev/Dockerfile b/docker/frontend/dev/Dockerfile index 2cf9f0e34..ccf5694b0 100644 --- a/docker/frontend/dev/Dockerfile +++ b/docker/frontend/dev/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22.12.0-alpine3.20@sha256:60ed91cb8b3d78a7832700f89162667f65bd8ad715b446bd6b243f3397bc8292 AS build +FROM node:22.12.0-alpine3.20@sha256:96cc8323e25c8cc6ddcb8b965e135cfd57846e8003ec0d7bcec16c5fd5f6d39f AS build WORKDIR /app COPY ./frontend/package*.json /app/. diff --git a/docker/frontend/prod/Dockerfile b/docker/frontend/prod/Dockerfile index 87dab8277..d2ab76a99 100644 --- a/docker/frontend/prod/Dockerfile +++ b/docker/frontend/prod/Dockerfile @@ -1,5 +1,5 @@ # build environment -FROM node:22.12.0-alpine3.20@sha256:60ed91cb8b3d78a7832700f89162667f65bd8ad715b446bd6b243f3397bc8292 AS build +FROM node:22.12.0-alpine3.20@sha256:96cc8323e25c8cc6ddcb8b965e135cfd57846e8003ec0d7bcec16c5fd5f6d39f AS build ARG VERSION=unknown From eb2dbd1080de6f9613fec05e828695098105c19f Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Wed, 4 Dec 2024 15:51:01 +0000 Subject: [PATCH 21/82] fix: do not change risk acceptance date inadvertently (#2302) * fix: do not change risk acceptance date inadvertently * chore: pylint * feat: correct wrongly set dates * chore: codereview --- .../core/api/serializers_observation.py | 50 +++++--- ...056_correct_risk_acceptance_expiry_date.py | 85 ++++++++++++++ .../application/core/services/assessment.py | 23 ++-- .../core/services/observation_log.py | 2 + .../services/risk_acceptance_expiry_task.py | 1 - .../services/import_observations.py | 33 +++--- .../application/rules/services/rule_engine.py | 107 +++++++++++------- 7 files changed, 219 insertions(+), 82 deletions(-) create mode 100644 backend/application/core/migrations/0056_correct_risk_acceptance_expiry_date.py diff --git a/backend/application/core/api/serializers_observation.py b/backend/application/core/api/serializers_observation.py index 40eaf9b75..5929e6913 100644 --- a/backend/application/core/api/serializers_observation.py +++ b/backend/application/core/api/serializers_observation.py @@ -266,6 +266,7 @@ def update(self, instance: Observation, validated_data: dict): actual_severity = instance.current_severity actual_status = instance.current_status actual_vex_justification = instance.current_vex_justification + actual_risk_acceptance_expiry_date = instance.risk_acceptance_expiry_date instance.origin_component_name = "" instance.origin_component_version = "" @@ -282,30 +283,45 @@ def update(self, instance: Observation, validated_data: dict): observation: Observation = super().update(instance, validated_data) - if actual_severity != observation.current_severity: - actual_severity = observation.current_severity - else: - actual_severity = "" + log_severity = ( + observation.current_severity + if actual_severity != observation.current_severity + else "" + ) - if actual_status != observation.current_status: - actual_status = observation.current_status - else: - actual_status = "" + log_status = ( + observation.current_status + if actual_status != observation.current_status + else "" + ) - if actual_vex_justification != observation.current_vex_justification: - actual_vex_justification = observation.current_vex_justification - else: - actual_vex_justification = "" + log_vex_justification = ( + observation.current_vex_justification + if actual_vex_justification != observation.current_vex_justification + else "" + ) + + log_risk_acceptance_expiry_date = ( + observation.risk_acceptance_expiry_date + if actual_risk_acceptance_expiry_date + != observation.risk_acceptance_expiry_date + else None + ) - if actual_severity or actual_status: + if ( + log_severity + or log_status + or log_vex_justification + or log_risk_acceptance_expiry_date + ): create_observation_log( observation=observation, - severity=actual_severity, - status=actual_status, + severity=log_severity, + status=log_status, comment="Observation changed manually", - vex_justification=actual_vex_justification, + vex_justification=log_vex_justification, assessment_status=Assessment_Status.ASSESSMENT_STATUS_AUTO_APPROVED, - risk_acceptance_expiry_date=observation.risk_acceptance_expiry_date, + risk_acceptance_expiry_date=log_risk_acceptance_expiry_date, ) check_security_gate(observation.product) diff --git a/backend/application/core/migrations/0056_correct_risk_acceptance_expiry_date.py b/backend/application/core/migrations/0056_correct_risk_acceptance_expiry_date.py new file mode 100644 index 000000000..ed199c637 --- /dev/null +++ b/backend/application/core/migrations/0056_correct_risk_acceptance_expiry_date.py @@ -0,0 +1,85 @@ +import logging +from datetime import date, timedelta +from typing import Optional + +from django.core.paginator import Paginator +from django.db import migrations + +from application.core.services.risk_acceptance_expiry import ( + calculate_risk_acceptance_expiry_date, +) +from application.core.types import Status + +logger = logging.getLogger("secobserve.migration") + + +def correct_risk_acceptance_expiry_date(apps, schema_editor): + Observation = apps.get_model("core", "Observation") + + Observation_Log = apps.get_model("core", "Observation_Log") + observations = Observation.objects.filter( + current_status=Status.STATUS_RISK_ACCEPTED + ).order_by("id") + + paginator = Paginator(observations, 1000) + for page_number in paginator.page_range: + page = paginator.page(page_number) + updates = [] + + for observation in page.object_list: + risk_acceptance_expiry_date_found = False + most_recent_risk_acceptance: Optional[date] = None + + observation_logs = Observation_Log.objects.filter( + observation=observation + ).order_by("-created") + for observation_log in observation_logs: + if ( + observation_log.status == Status.STATUS_RISK_ACCEPTED + and not most_recent_risk_acceptance + ): + most_recent_risk_acceptance = observation_log.created.date() + + if observation_log.risk_acceptance_expiry_date: + observation.risk_acceptance_expiry_date = ( + observation_log.risk_acceptance_expiry_date + ) + risk_acceptance_expiry_date_found = True + break + + if ( + not risk_acceptance_expiry_date_found + and observation.risk_acceptance_expiry_date + ): + new_risk_acceptance_expiry_date = calculate_risk_acceptance_expiry_date( + observation.product + ) + if most_recent_risk_acceptance: + days_between = (date.today() - most_recent_risk_acceptance).days + observation.risk_acceptance_expiry_date = ( + new_risk_acceptance_expiry_date - timedelta(days=days_between) + ) + else: + observation.risk_acceptance_expiry_date = ( + new_risk_acceptance_expiry_date + ) + + updates.append(observation) + + Observation.objects.bulk_update(updates, ["risk_acceptance_expiry_date"]) + + +class Migration(migrations.Migration): + dependencies = [ + ( + "core", + "0055_product_authorization_group_members", + ), + ] + + operations = [ + migrations.RunPython( + correct_risk_acceptance_expiry_date, + reverse_code=migrations.RunPython.noop, + ), + ] diff --git a/backend/application/core/services/assessment.py b/backend/application/core/services/assessment.py index f19424277..a46e47723 100644 --- a/backend/application/core/services/assessment.py +++ b/backend/application/core/services/assessment.py @@ -135,7 +135,11 @@ def _update_observation( ) previous_risk_acceptance_expiry_date = observation.risk_acceptance_expiry_date - observation.risk_acceptance_expiry_date = new_risk_acceptance_expiry_date + observation.risk_acceptance_expiry_date = ( + new_risk_acceptance_expiry_date + if observation.current_status == Status.STATUS_RISK_ACCEPTED + else None + ) if ( previous_current_severity # pylint: disable=too-many-boolean-expressions @@ -164,16 +168,19 @@ def remove_assessment(observation: Observation, comment: str) -> bool: observation.assessment_status = "" observation.assessment_vex_justification = "" observation.current_severity = get_current_severity(observation) + previous_status = observation.current_status observation.current_status = get_current_status(observation) observation.current_vex_justification = get_current_vex_justification( observation ) - risk_acceptance_expiry_date = ( - calculate_risk_acceptance_expiry_date(observation.product) - if observation.current_status == Status.STATUS_RISK_ACCEPTED - else None - ) - observation.risk_acceptance_expiry_date = risk_acceptance_expiry_date + + if observation.current_status == Status.STATUS_RISK_ACCEPTED: + if previous_status != Status.STATUS_RISK_ACCEPTED: + observation.risk_acceptance_expiry_date = ( + calculate_risk_acceptance_expiry_date(observation.product) + ) + else: + observation.risk_acceptance_expiry_date = None create_observation_log( observation=observation, @@ -182,7 +189,7 @@ def remove_assessment(observation: Observation, comment: str) -> bool: comment=comment, vex_justification="", assessment_status=Assessment_Status.ASSESSMENT_STATUS_REMOVED, - risk_acceptance_expiry_date=risk_acceptance_expiry_date, + risk_acceptance_expiry_date=observation.risk_acceptance_expiry_date, ) check_security_gate(observation.product) diff --git a/backend/application/core/services/observation_log.py b/backend/application/core/services/observation_log.py index 0552814d1..9a758e2a1 100644 --- a/backend/application/core/services/observation_log.py +++ b/backend/application/core/services/observation_log.py @@ -30,8 +30,10 @@ def create_observation_log( risk_acceptance_expiry_date=risk_acceptance_expiry_date, ) observation_log.save() + observation.last_observation_log = observation_log.created observation.save() + observation.product.last_observation_change = observation_log.created observation.product.save() diff --git a/backend/application/core/services/risk_acceptance_expiry_task.py b/backend/application/core/services/risk_acceptance_expiry_task.py index 043ce779b..b4a8daed1 100644 --- a/backend/application/core/services/risk_acceptance_expiry_task.py +++ b/backend/application/core/services/risk_acceptance_expiry_task.py @@ -16,7 +16,6 @@ def expire_risk_acceptances() -> None: ) if not assessment_removed: observation.parser_status = Status.STATUS_OPEN - observation.risk_acceptance_expiry_date = None observation.save() save_assessment( observation=observation, diff --git a/backend/application/import_observations/services/import_observations.py b/backend/application/import_observations/services/import_observations.py index 6ff4faec7..b28916336 100644 --- a/backend/application/import_observations/services/import_observations.py +++ b/backend/application/import_observations/services/import_observations.py @@ -414,11 +414,14 @@ def _process_current_observation( observation_before.product ) observation_before.current_status = get_current_status(observation_before) - observation_before.risk_acceptance_expiry_date = ( - calculate_risk_acceptance_expiry_date(observation_before.product) - if observation_before.current_status == Status.STATUS_RISK_ACCEPTED - else None - ) + + if observation_before.current_status == Status.STATUS_RISK_ACCEPTED: + if previous_status != Status.STATUS_RISK_ACCEPTED: + observation_before.risk_acceptance_expiry_date = ( + calculate_risk_acceptance_expiry_date(observation_before.product) + ) + else: + observation_before.risk_acceptance_expiry_date = None epss_apply_observation(observation_before) observation_before.import_last_seen = timezone.now() @@ -450,14 +453,17 @@ def _process_current_observation( previous_status != observation_before.current_status or previous_severity != observation_before.current_severity ): - if previous_status != observation_before.current_status: - status = observation_before.current_status - else: - status = "" - if previous_severity != observation_before.current_severity: - severity = imported_observation.current_severity - else: - severity = "" + status = ( + observation_before.current_status + if previous_status != observation_before.current_status + else "" + ) + + severity = ( + imported_observation.current_severity + if previous_severity != observation_before.current_severity + else "" + ) create_observation_log( observation=observation_before, @@ -479,6 +485,7 @@ def _process_new_observation(imported_observation: Observation) -> None: ) imported_observation.current_status = get_current_status(imported_observation) + imported_observation.risk_acceptance_expiry_date = ( calculate_risk_acceptance_expiry_date(imported_observation.product) if imported_observation.current_status == Status.STATUS_RISK_ACCEPTED diff --git a/backend/application/rules/services/rule_engine.py b/backend/application/rules/services/rule_engine.py index 0eaf54c77..70ef45596 100644 --- a/backend/application/rules/services/rule_engine.py +++ b/backend/application/rules/services/rule_engine.py @@ -1,4 +1,5 @@ import re +from datetime import date from typing import Optional from application.commons.services.global_request import get_current_user @@ -53,12 +54,13 @@ def __init__(self, product: Product): self.product = product def apply_rules_for_observation(self, observation: Observation) -> None: - previous_product_rule = None - if observation.product_rule: - previous_product_rule = observation.product_rule - previous_general_rule = None - if observation.general_rule: - previous_general_rule = observation.general_rule + previous_product_rule = ( + observation.product_rule if observation.product_rule else None + ) + previous_general_rule = ( + observation.general_rule if observation.general_rule else None + ) + observation.product_rule = None observation.general_rule = None @@ -113,11 +115,6 @@ def apply_rules_for_observation(self, observation: Observation) -> None: if rule.new_status: observation.rule_status = rule.new_status observation.current_status = get_current_status(observation) - observation.risk_acceptance_expiry_date = ( - calculate_risk_acceptance_expiry_date(observation.product) - if observation.current_status == Status.STATUS_RISK_ACCEPTED - else None - ) previous_vex_justification = observation.current_vex_justification previous_rule_vex_justification = observation.rule_vex_justification @@ -127,6 +124,17 @@ def apply_rules_for_observation(self, observation: Observation) -> None: get_current_vex_justification(observation) ) + previous_risk_acceptance_expiry_date = ( + observation.risk_acceptance_expiry_date + ) + if observation.current_status == Status.STATUS_RISK_ACCEPTED: + if previous_status != Status.STATUS_RISK_ACCEPTED: + observation.risk_acceptance_expiry_date = ( + calculate_risk_acceptance_expiry_date(observation.product) + ) + else: + observation.risk_acceptance_expiry_date = None + if rule.product: observation.product_rule = rule else: @@ -151,6 +159,7 @@ def apply_rules_for_observation(self, observation: Observation) -> None: previous_severity=previous_severity, previous_status=previous_status, previous_vex_justification=previous_vex_justification, + previous_risk_acceptance_expiry_date=previous_risk_acceptance_expiry_date, ) push_observation_to_issue_tracker(observation, get_current_user()) rule_found = True @@ -193,6 +202,7 @@ def _write_observation_log( previous_severity: str, previous_status: str, previous_vex_justification: str, + previous_risk_acceptance_expiry_date: Optional[date], ) -> None: if previous_status != observation.current_status: status = observation.current_status @@ -206,6 +216,13 @@ def _write_observation_log( vex_justification = observation.current_vex_justification else: vex_justification = "" + if ( + previous_risk_acceptance_expiry_date + != observation.risk_acceptance_expiry_date + ): + risk_acceptance_expiry_date = observation.risk_acceptance_expiry_date + else: + risk_acceptance_expiry_date = None if rule.description: comment = rule.description @@ -215,12 +232,6 @@ def _write_observation_log( else: comment = f"Updated by general rule {rule.name}" - risk_acceptance_expiry_date = ( - calculate_risk_acceptance_expiry_date(observation.product) - if status == Status.STATUS_RISK_ACCEPTED - else None - ) - create_observation_log( observation=observation, severity=severity, @@ -244,11 +255,6 @@ def _write_observation_log_no_rule( observation.rule_status = "" previous_status = observation.current_status observation.current_status = get_current_status(observation) - observation.risk_acceptance_expiry_date = ( - calculate_risk_acceptance_expiry_date(observation.product) - if observation.current_status == Status.STATUS_RISK_ACCEPTED - else None - ) observation.rule_vex_justification = "" previous_vex_justification = observation.current_vex_justification @@ -256,18 +262,39 @@ def _write_observation_log_no_rule( observation ) - if previous_status != observation.current_status: - status = observation.current_status - else: - status = "" - if previous_severity != observation.current_severity: - severity = observation.current_severity - else: - severity = "" - if previous_vex_justification != observation.current_vex_justification: - vex_justification = observation.current_vex_justification + previous_risk_acceptance_expiry_date = observation.risk_acceptance_expiry_date + if observation.current_status == Status.STATUS_RISK_ACCEPTED: + if previous_status != Status.STATUS_RISK_ACCEPTED: + observation.risk_acceptance_expiry_date = ( + calculate_risk_acceptance_expiry_date(observation.product) + ) else: - vex_justification = "" + observation.risk_acceptance_expiry_date = None + + log_status = ( + observation.current_status + if previous_status != observation.current_status + else "" + ) + + log_severity = ( + observation.current_severity + if previous_severity != observation.current_severity + else "" + ) + + log_vex_justification = ( + observation.current_vex_justification + if previous_vex_justification != observation.current_vex_justification + else "" + ) + + log_risk_acceptance_expiry_date = ( + observation.risk_acceptance_expiry_date + if previous_risk_acceptance_expiry_date + != observation.risk_acceptance_expiry_date + else None + ) if previous_product_rule: comment = f"Removed product rule {previous_product_rule.name}" @@ -276,18 +303,12 @@ def _write_observation_log_no_rule( else: comment = "Removed unknown rule" - risk_acceptance_expiry_date = ( - calculate_risk_acceptance_expiry_date(observation.product) - if status == Status.STATUS_RISK_ACCEPTED - else None - ) - create_observation_log( observation=observation, - severity=severity, - status=status, + severity=log_severity, + status=log_status, comment=comment, - vex_justification=vex_justification, + vex_justification=log_vex_justification, assessment_status=Assessment_Status.ASSESSMENT_STATUS_AUTO_APPROVED, - risk_acceptance_expiry_date=risk_acceptance_expiry_date, + risk_acceptance_expiry_date=log_risk_acceptance_expiry_date, ) From 7d76908ac8c955158757f35a41dde20761047bae Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Wed, 4 Dec 2024 16:31:46 +0000 Subject: [PATCH 22/82] chore: suppress false positive of Bandit (#2310) --- backend/application/licenses/services/license_policy.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/application/licenses/services/license_policy.py b/backend/application/licenses/services/license_policy.py index 53df6a3da..15253e9bd 100644 --- a/backend/application/licenses/services/license_policy.py +++ b/backend/application/licenses/services/license_policy.py @@ -217,7 +217,8 @@ def _evaluate_license_expression( if operator == "OR": evaluation_result = _evaluate_or_expression(evaluation_result_set) - except Exception: + except Exception: # nosec B110 + # a meaningful return value is set as a default in case on an exception pass return evaluation_result From c074f10a3ef54810a68e4a4f84b90fe2067e26ae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 18:44:14 +0000 Subject: [PATCH 23/82] fix(deps): update dependency django to v5.1.4 (#2309) --- backend/poetry.lock | 8 ++++---- backend/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index fd343e358..6591c3403 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -617,13 +617,13 @@ files = [ [[package]] name = "django" -version = "5.1.3" +version = "5.1.4" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" files = [ - {file = "Django-5.1.3-py3-none-any.whl", hash = "sha256:8b38a9a12da3ae00cb0ba72da985ec4b14de6345046b1e174b1fd7254398f818"}, - {file = "Django-5.1.3.tar.gz", hash = "sha256:c0fa0e619c39325a169208caef234f90baa925227032ad3f44842ba14d75234a"}, + {file = "Django-5.1.4-py3-none-any.whl", hash = "sha256:236e023f021f5ce7dee5779de7b286565fdea5f4ab86bae5338e3f7b69896cf0"}, + {file = "Django-5.1.4.tar.gz", hash = "sha256:de450c09e91879fa5a307f696e57c851955c910a438a35e6b4c895e86bedc82a"}, ] [package.dependencies] @@ -2543,4 +2543,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "b1ba30a302b71f2ba68aee82460dc15d2d772769fc6529a04309fb553c56e984" +content-hash = "d17cba08b553689506f7270a36b2ad1109134fad9b35f000d4d95d236d7d9c6b" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 3019f55e4..05c129afb 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -12,7 +12,7 @@ python = ">= 3.10, < 3.13" # Django # ------------------------------------------------------------------------------ gunicorn = "23.0.0" # https://github.com/benoitc/gunicorn -django = "5.1.3" # https://www.djangoproject.com/ +django = "5.1.4" # https://www.djangoproject.com/ django-environ = "0.11.2" # https://github.com/joke2k/django-environ django-filter = "24.3" # https://github.com/carltongibson/django-filter django-csp = "3.8" # https://github.com/mozilla/django-csp From fd050842a463849c9443da9b1eda6adab0f8bbdd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:21:29 +0000 Subject: [PATCH 24/82] chore(deps): update dependency @types/react to v18.3.13 (#2311) --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 35d638dc6..b4c31e349 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,7 +42,7 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.13", - "@types/react": "18.3.12", + "@types/react": "18.3.13", "@types/react-dom": "18.3.1", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.17.0", @@ -3201,9 +3201,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", - "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "version": "18.3.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.13.tgz", + "integrity": "sha512-ii/gswMmOievxAJed4PAHT949bpYjPKXvXo1v6cRB/kqc2ZR4n+SgyCyvyc5Fec5ez8VnUumI1Vk7j6fRyRogg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", diff --git a/frontend/package.json b/frontend/package.json index 4a37d5059..51a30f1d5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -51,7 +51,7 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.13", - "@types/react": "18.3.12", + "@types/react": "18.3.13", "@types/react-dom": "18.3.1", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.17.0", From 14799d025e61871c523fb60bca8081267a9c5158 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Thu, 5 Dec 2024 08:00:30 +0000 Subject: [PATCH 25/82] feat: allow lists for CORS_ALLOWED_ORIGINS and ALLOWED_HOSTS (#2313) --- backend/config/settings/base.py | 5 ++++- backend/config/settings/dev.py | 5 ----- backend/config/settings/prod.py | 5 ----- docs/getting_started/configuration.md | 6 +++--- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/backend/config/settings/base.py b/backend/config/settings/base.py index 2b1189884..b6f0472af 100644 --- a/backend/config/settings/base.py +++ b/backend/config/settings/base.py @@ -25,7 +25,9 @@ # https://docs.djangoproject.com/en/dev/ref/settings/#secret-key SECRET_KEY = env("DJANGO_SECRET_KEY") # https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts -ALLOWED_HOSTS = ["localhost", "127.0.0.1", env("ALLOWED_HOSTS")] +ALLOWED_HOSTS = ["localhost", "127.0.0.1"] + [ + x.strip() for x in env("ALLOWED_HOSTS").split(",") +] # Local time zone. Choices are # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name @@ -397,6 +399,7 @@ def whitenoise_security_headers(headers, path, url): } # django-cors-headers - https://github.com/adamchainz/django-cors-headers#setup +CORS_ALLOWED_ORIGINS = [x.strip() for x in env("CORS_ALLOWED_ORIGINS").split(",")] CORS_EXPOSE_HEADERS = ("content-disposition",) # Your stuff... diff --git a/backend/config/settings/dev.py b/backend/config/settings/dev.py index 73f82bc3e..ea2aabf97 100644 --- a/backend/config/settings/dev.py +++ b/backend/config/settings/dev.py @@ -42,8 +42,3 @@ # ------------------------------------------------------------------------------ # https://django-extensions.readthedocs.io/en/latest/installation_instructions.html#configuration INSTALLED_APPS += ["django_extensions"] # noqa F405 - -# Your stuff... -# ------------------------------------------------------------------------------ - -CORS_ALLOWED_ORIGINS = env("CORS_ALLOWED_ORIGINS", default=["http://localhost:3000"]) diff --git a/backend/config/settings/prod.py b/backend/config/settings/prod.py index 23a701cd3..bd802f814 100644 --- a/backend/config/settings/prod.py +++ b/backend/config/settings/prod.py @@ -16,8 +16,3 @@ # STATIC # ------------------------ STATICFILES_STORAGE = "whitenoise.storage.CompressedStaticFilesStorage" - -# Your stuff... -# ------------------------------------------------------------------------------ - -CORS_ALLOWED_ORIGINS = [env("CORS_ALLOWED_ORIGINS")] diff --git a/docs/getting_started/configuration.md b/docs/getting_started/configuration.md index 112f21756..6d4e77130 100644 --- a/docs/getting_started/configuration.md +++ b/docs/getting_started/configuration.md @@ -11,8 +11,8 @@ A part of the configuration is done with environment variables, which need to be | `ADMIN_USER` | mandatory | Username of the administration user. The user will be created at the fist start of the backend. | | `ADMIN_EMAIL` | optional | E-Mail of the administration user. | | `ADMIN_PASSWORD` | optional | Initial password of the admin user. If it is not set, a random password will be created during startup and shown in the log. | -| `ALLOWED_HOSTS` | mandatory | Hostname of the backend, see [Django settings ALLOWED_HOSTS](https://docs.djangoproject.com/en/3.2/ref/settings/#allowed-hosts) | -| `CORS_ALLOWED_ORIGINS` | mandatory | URL of the frontend that is authorized to make cross-site HTTP requests. | +| `ALLOWED_HOSTS` | mandatory | Hostnames of the backend, see [Django settings ALLOWED_HOSTS](https://docs.djangoproject.com/en/5.1/ref/settings/#allowed-hosts). This can be a comma-separated list of hostnames. | +| `CORS_ALLOWED_ORIGINS` | mandatory | URL of the frontend that is authorized to make cross-site HTTP requests. This can be a comma-separated list of URLs. | | `DATABASE_HOST` | mandatory | Which host to use when connecting to the database. | | `DATABASE_DB` | mandatory | The name of the database to use. | | `DATABASE_PORT` | mandatory | The port to use when connecting to the database. | @@ -20,7 +20,7 @@ A part of the configuration is done with environment variables, which need to be | `DATABASE_PASSWORD` | mandatory | The password to use when connecting to the database. | | `DATABASE_ENGINE` | mandatory | The database backend to use. Supported database backends are `django.db.backends.mysql` and `django.db.backends.postgresql` | | `MYSQL_AZURE` | optional | Must be set if Azure Database for MySQL is used, to use the necessary SSL certificate. For **MySQL Flexible Server** it needs to have the value `flexible`, for **MySQL Single Server** the the value needs to be `single`. See [Connect using mysql command-line client with TLS/SSL](https://learn.microsoft.com/en-us/azure/mysql/flexible-server/how-to-connect-tls-ssl#connect-using-mysql-command-line-client-with-tlsssl) and [Configure SSL connectivity in your application to securely connect to Azure Database for MySQL](https://learn.microsoft.com/en-us/azure/mysql/single-server/how-to-configure-ssl#step-1-obtain-ssl-certificate). -| `DJANGO_SECRET_KEY` | mandatory | A secret key for a particular Django installation. This is used to provide cryptographic signing, and should be set to a unique, unpredictable value with at least 50 characters, see [Django settings SECRET_KEY](https://docs.djangoproject.com/en/3.2/ref/settings/#secret-key). +| `DJANGO_SECRET_KEY` | mandatory | A secret key for a particular Django installation. This is used to provide cryptographic signing, and should be set to a unique, unpredictable value with at least 50 characters, see [Django settings SECRET_KEY](https://docs.djangoproject.com/en/5.1/ref/settings/#secret-key). | `FIELD_ENCRYPTION_KEY` | mandatory | Key to encrypt fields like the JWT secret. See [Generating an Encryption Key](https://gitlab.com/lansharkconsulting/django/django-encrypted-model-fields#generating-an-encryption-key) how to generate the key. | | `GUNICORN_WORKERS` | optional | Number of worker processes for the Gunicorn web server, see [Gunicorn documentation](https://docs.gunicorn.org/en/stable/design.html#how-many-workers). Default is 3. | | `GUNICORN_THREADS` | optional | Number of worker threads for the Gunicorn web server, default is 10. | From 79fddbbe8256de6ae50b24300a55e471500f69f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 09:13:56 +0100 Subject: [PATCH 26/82] chore(deps): update dependency @eslint/compat to v1.2.4 (#2312) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b4c31e349..1d6e99e3c 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -34,7 +34,7 @@ "tss-react": "4.9.13" }, "devDependencies": { - "@eslint/compat": "1.2.3", + "@eslint/compat": "1.2.4", "@eslint/eslintrc": "3.2.0", "@eslint/js": "9.16.0", "@microsoft/eslint-formatter-sarif": "3.1.0", @@ -1081,9 +1081,9 @@ } }, "node_modules/@eslint/compat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.3.tgz", - "integrity": "sha512-wlZhwlDFxkxIZ571aH0FoK4h4Vwx7P3HJx62Gp8hTc10bfpwT2x0nULuAHmQSJBOWPgPeVf+9YtnD4j50zVHmA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.4.tgz", + "integrity": "sha512-S8ZdQj/N69YAtuqFt7653jwcvuUj131+6qGLUyDqfDg1OIoBQ66OCuXC473YQfO2AaxITTutiRQiDwoo7ZLYyg==", "dev": true, "license": "Apache-2.0", "engines": { diff --git a/frontend/package.json b/frontend/package.json index 51a30f1d5..ac792dc22 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -43,7 +43,7 @@ "not op_mini all" ], "devDependencies": { - "@eslint/compat": "1.2.3", + "@eslint/compat": "1.2.4", "@eslint/eslintrc": "3.2.0", "@eslint/js": "9.16.0", "@microsoft/eslint-formatter-sarif": "3.1.0", From c5288ed40424e747bedf66a72ea58ffa8cd74719 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 05:14:59 +0000 Subject: [PATCH 27/82] chore(deps): update actions/cache action to v4.2.0 (#2316) --- .github/workflows/publish_docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish_docs.yml b/.github/workflows/publish_docs.yml index f6ffa92db..005ffe9b6 100644 --- a/.github/workflows/publish_docs.yml +++ b/.github/workflows/publish_docs.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 with: python-version: 3.x - - uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2 + - uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 with: key: ${{ github.ref }} path: .cache From 34f928c83281cdce014ae9e2ddeb897d85ad714d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 07:30:18 +0100 Subject: [PATCH 28/82] chore(deps): update dependency @types/prop-types to v15.7.14 (#2318) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1d6e99e3c..dadb1f4cb 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -41,7 +41,7 @@ "@trivago/prettier-plugin-sort-imports": "4.3.0", "@types/inflection": "1.13.2", "@types/node": "22.10.1", - "@types/prop-types": "15.7.13", + "@types/prop-types": "15.7.14", "@types/react": "18.3.13", "@types/react-dom": "18.3.1", "@types/recharts": "1.8.29", @@ -3195,9 +3195,9 @@ "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", "license": "MIT" }, "node_modules/@types/react": { diff --git a/frontend/package.json b/frontend/package.json index ac792dc22..34b4614f1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -50,7 +50,7 @@ "@trivago/prettier-plugin-sort-imports": "4.3.0", "@types/inflection": "1.13.2", "@types/node": "22.10.1", - "@types/prop-types": "15.7.13", + "@types/prop-types": "15.7.14", "@types/react": "18.3.13", "@types/react-dom": "18.3.1", "@types/recharts": "1.8.29", From d54a532b5ce2813b16d01b9622ea40f1163ec2a7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 07:40:42 +0100 Subject: [PATCH 29/82] chore(deps): update react monorepo (#2319) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 18 +++++++++--------- frontend/package.json | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index dadb1f4cb..21de3f34f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,8 +42,8 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.14", - "@types/react": "18.3.13", - "@types/react-dom": "18.3.1", + "@types/react": "18.3.14", + "@types/react-dom": "18.3.2", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.17.0", "@typescript-eslint/parser": "8.17.0", @@ -3201,9 +3201,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.13", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.13.tgz", - "integrity": "sha512-ii/gswMmOievxAJed4PAHT949bpYjPKXvXo1v6cRB/kqc2ZR4n+SgyCyvyc5Fec5ez8VnUumI1Vk7j6fRyRogg==", + "version": "18.3.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.14.tgz", + "integrity": "sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -3211,13 +3211,13 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.2.tgz", + "integrity": "sha512-Fqp+rcvem9wEnGr3RY8dYNvSQ8PoLqjZ9HLgaPUOjJJD120uDyOxOjc/39M4Kddp9JQCxpGQbnhVQF0C0ncYVg==", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "*" + "@types/react": "^18" } }, "node_modules/@types/react-transition-group": { diff --git a/frontend/package.json b/frontend/package.json index 34b4614f1..dc170aa62 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -51,8 +51,8 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.14", - "@types/react": "18.3.13", - "@types/react-dom": "18.3.1", + "@types/react": "18.3.14", + "@types/react-dom": "18.3.2", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.17.0", "@typescript-eslint/parser": "8.17.0", From 5efc65b96c044ea9021a5a29ba2dd12823167063 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 14:32:54 +0000 Subject: [PATCH 30/82] fix(deps): update dependency coverage to v7.6.9 (#2321) --- backend/poetry.lock | 128 ++++++++++++++++++++--------------------- backend/pyproject.toml | 2 +- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 6591c3403..3408c4b9e 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -424,73 +424,73 @@ files = [ [[package]] name = "coverage" -version = "7.6.8" +version = "7.6.9" description = "Code coverage measurement for Python" optional = true python-versions = ">=3.9" files = [ - {file = "coverage-7.6.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50"}, - {file = "coverage-7.6.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf"}, - {file = "coverage-7.6.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee"}, - {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6"}, - {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d"}, - {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331"}, - {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638"}, - {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed"}, - {file = "coverage-7.6.8-cp310-cp310-win32.whl", hash = "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e"}, - {file = "coverage-7.6.8-cp310-cp310-win_amd64.whl", hash = "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a"}, - {file = "coverage-7.6.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4"}, - {file = "coverage-7.6.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94"}, - {file = "coverage-7.6.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4"}, - {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1"}, - {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb"}, - {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8"}, - {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a"}, - {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0"}, - {file = "coverage-7.6.8-cp311-cp311-win32.whl", hash = "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801"}, - {file = "coverage-7.6.8-cp311-cp311-win_amd64.whl", hash = "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"}, - {file = "coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee"}, - {file = "coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a"}, - {file = "coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d"}, - {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb"}, - {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649"}, - {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787"}, - {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c"}, - {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443"}, - {file = "coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad"}, - {file = "coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4"}, - {file = "coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb"}, - {file = "coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63"}, - {file = "coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365"}, - {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002"}, - {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3"}, - {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022"}, - {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e"}, - {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b"}, - {file = "coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146"}, - {file = "coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28"}, - {file = "coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d"}, - {file = "coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451"}, - {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764"}, - {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf"}, - {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5"}, - {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4"}, - {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83"}, - {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b"}, - {file = "coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71"}, - {file = "coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc"}, - {file = "coverage-7.6.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e"}, - {file = "coverage-7.6.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c"}, - {file = "coverage-7.6.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0"}, - {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779"}, - {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92"}, - {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4"}, - {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc"}, - {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea"}, - {file = "coverage-7.6.8-cp39-cp39-win32.whl", hash = "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e"}, - {file = "coverage-7.6.8-cp39-cp39-win_amd64.whl", hash = "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076"}, - {file = "coverage-7.6.8-pp39.pp310-none-any.whl", hash = "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce"}, - {file = "coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb"}, + {file = "coverage-7.6.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1"}, + {file = "coverage-7.6.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5"}, + {file = "coverage-7.6.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073"}, + {file = "coverage-7.6.9-cp310-cp310-win32.whl", hash = "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198"}, + {file = "coverage-7.6.9-cp310-cp310-win_amd64.whl", hash = "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9"}, + {file = "coverage-7.6.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9"}, + {file = "coverage-7.6.9-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b"}, + {file = "coverage-7.6.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3"}, + {file = "coverage-7.6.9-cp311-cp311-win32.whl", hash = "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0"}, + {file = "coverage-7.6.9-cp311-cp311-win_amd64.whl", hash = "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8"}, + {file = "coverage-7.6.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"}, + {file = "coverage-7.6.9-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6"}, + {file = "coverage-7.6.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f"}, + {file = "coverage-7.6.9-cp312-cp312-win32.whl", hash = "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692"}, + {file = "coverage-7.6.9-cp312-cp312-win_amd64.whl", hash = "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664"}, + {file = "coverage-7.6.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00"}, + {file = "coverage-7.6.9-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077"}, + {file = "coverage-7.6.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb"}, + {file = "coverage-7.6.9-cp313-cp313-win32.whl", hash = "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba"}, + {file = "coverage-7.6.9-cp313-cp313-win_amd64.whl", hash = "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419"}, + {file = "coverage-7.6.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae"}, + {file = "coverage-7.6.9-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e"}, + {file = "coverage-7.6.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9"}, + {file = "coverage-7.6.9-cp313-cp313t-win32.whl", hash = "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b"}, + {file = "coverage-7.6.9-cp313-cp313t-win_amd64.whl", hash = "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902"}, + {file = "coverage-7.6.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08"}, + {file = "coverage-7.6.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf"}, + {file = "coverage-7.6.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678"}, + {file = "coverage-7.6.9-cp39-cp39-win32.whl", hash = "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6"}, + {file = "coverage-7.6.9-cp39-cp39-win_amd64.whl", hash = "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4"}, + {file = "coverage-7.6.9-pp39.pp310-none-any.whl", hash = "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b"}, + {file = "coverage-7.6.9.tar.gz", hash = "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d"}, ] [package.extras] @@ -2543,4 +2543,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "d17cba08b553689506f7270a36b2ad1109134fad9b35f000d4d95d236d7d9c6b" +content-hash = "d5401abd82e8c00d0ba2bc4e2f3a369fccbfb745b8b990cc1e5378f97df1c2fb" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 05c129afb..d156d9b34 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -71,7 +71,7 @@ django-extensions = { version = "3.2.3", optional = true } # https://github.com # Unittest dependencies # ------------------------------------------------------------------------------ -coverage = { version = "7.6.8", optional = true } # https://github.com/nedbat/coveragepy +coverage = { version = "7.6.9", optional = true } # https://github.com/nedbat/coveragepy django-coverage-plugin = { version = "3.1.0", optional = true } # https://github.com/nedbat/django_coverage_plugin # Code quality dependencies From a72166c211abcd0033f5adaf2c7ee8369cbddda6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:54:48 +0000 Subject: [PATCH 31/82] chore(deps): update dependency poetry to v1.8.5 (#2322) --- backend/poetry_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/poetry_requirements.txt b/backend/poetry_requirements.txt index 100070956..d3538688b 100644 --- a/backend/poetry_requirements.txt +++ b/backend/poetry_requirements.txt @@ -1 +1 @@ -poetry==1.8.4 # https://python-poetry.org/ +poetry==1.8.5 # https://python-poetry.org/ From fd2cb683d801e9159705a484ab0575ab57727fb9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 07:46:48 +0100 Subject: [PATCH 32/82] chore(deps): update dependency mkdocs-material to v9.5.48 (#2323) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- mkdocs_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs_requirements.txt b/mkdocs_requirements.txt index 030c5c4bc..b3da4011e 100644 --- a/mkdocs_requirements.txt +++ b/mkdocs_requirements.txt @@ -1 +1 @@ -mkdocs-material==9.5.47 # https://github.com/squidfunk/mkdocs-material +mkdocs-material==9.5.48 # https://github.com/squidfunk/mkdocs-material From a8558023deef4ae8ab631dda5d9c5d43d6ce387d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 09:19:06 +0100 Subject: [PATCH 33/82] fix(deps): update dependency tss-react to v4.9.14 (#2324) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 11 ++++++----- frontend/package.json | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 21de3f34f..1947c3678 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -31,7 +31,7 @@ "react-is": "18.3.1", "react-oidc-context": "3.2.0", "runtime-env-cra": "file:lib/runtime-env-cra", - "tss-react": "4.9.13" + "tss-react": "4.9.14" }, "devDependencies": { "@eslint/compat": "1.2.4", @@ -8737,9 +8737,9 @@ "license": "0BSD" }, "node_modules/tss-react": { - "version": "4.9.13", - "resolved": "https://registry.npmjs.org/tss-react/-/tss-react-4.9.13.tgz", - "integrity": "sha512-Gu19qqPH8/SAyKVIgDE5qHygirEDnNIQcXhiEc+l4Q9T7C1sfvUnbVWs+yBpmN26/wyk4FTOupjYS2wq4vH0yA==", + "version": "4.9.14", + "resolved": "https://registry.npmjs.org/tss-react/-/tss-react-4.9.14.tgz", + "integrity": "sha512-nAj4RCQk3ADzrmtxmTcmN1B9EKxPMIxuCfJ3ll964CksndJ2/ZImF6rAMo2Kud5yE3ENXHpPIBHCyuMtgptMvw==", "license": "MIT", "dependencies": { "@emotion/cache": "*", @@ -8750,7 +8750,8 @@ "@emotion/react": "^11.4.1", "@emotion/server": "^11.4.0", "@mui/material": "^5.0.0 || ^6.0.0", - "react": "^16.8.0 || ^17.0.2 || ^18.0.0" + "@types/react": "^16.8.0 || ^17.0.2 || ^18.0.0 || ^19.0.0", + "react": "^16.8.0 || ^17.0.2 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/server": { diff --git a/frontend/package.json b/frontend/package.json index dc170aa62..9ad395591 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -27,7 +27,7 @@ "react-is": "18.3.1", "react-oidc-context": "3.2.0", "runtime-env-cra": "file:lib/runtime-env-cra", - "tss-react": "4.9.13" + "tss-react": "4.9.14" }, "scripts": { "start": "NODE_ENV=development ./node_modules/runtime-env-cra/lib/index.js --config-name=./public/runtime-env.js && vite", From 1cd1cfcc8c6a26314cc4976df2051555109bf85c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 14:57:40 +0100 Subject: [PATCH 34/82] fix(deps): update emotion monorepo to v11.14.0 (#2325) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 34 +++++++++++++++++----------------- frontend/package.json | 4 ++-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1947c3678..76abaafc0 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,8 +9,8 @@ "version": "1.22.5", "license": "BSD-3-Clause", "dependencies": { - "@emotion/react": "11.13.5", - "@emotion/styled": "11.13.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", "@fortawesome/fontawesome-svg-core": "6.7.1", "@fortawesome/free-brands-svg-icons": "6.7.1", "@fortawesome/free-solid-svg-icons": "6.7.1", @@ -534,9 +534,9 @@ } }, "node_modules/@emotion/cache": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.5.tgz", - "integrity": "sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", @@ -568,16 +568,16 @@ "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", - "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.13.5", + "@emotion/cache": "^11.14.0", "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" @@ -611,16 +611,16 @@ "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", - "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", "@emotion/utils": "^1.4.2" }, "peerDependencies": { @@ -640,9 +640,9 @@ "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0" diff --git a/frontend/package.json b/frontend/package.json index 9ad395591..64230a129 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,8 +5,8 @@ "description": "SecObserve is an open source vulnerability management system for software development and cloud environments.", "private": true, "dependencies": { - "@emotion/react": "11.13.5", - "@emotion/styled": "11.13.5", + "@emotion/react": "11.14.0", + "@emotion/styled": "11.14.0", "@fortawesome/fontawesome-svg-core": "6.7.1", "@fortawesome/free-brands-svg-icons": "6.7.1", "@fortawesome/free-solid-svg-icons": "6.7.1", From 0d3e6dd9ab79eec4c9ab2208c656aa50fdce35b8 Mon Sep 17 00:00:00 2001 From: Lukas Voetmand Date: Tue, 10 Dec 2024 20:36:52 +0100 Subject: [PATCH 35/82] feat: bulk reviews and separate reviews listing (#2280) * feat: bulk reviews and separate reviews listing * fix: frontend lint fixes * feat: UI improvements * chore: finetuning --------- Co-authored-by: Stefan Fleckenstein --- backend/application/core/api/filters.py | 16 ++ .../core/api/serializers_observation.py | 15 +- backend/application/core/api/views.py | 20 ++ .../services/observations_bulk_actions.py | 60 +++++- .../test_authorization_observation_logs.py | 4 +- frontend/src/commons/layout/Menu.tsx | 8 + .../AssessmentBulkApproval.tsx | 120 ++++++++++++ .../ObservationLogApprovalEmbeddedList.tsx | 180 ++++++++++++++++++ .../ObservationLogApprovalList.tsx | 175 +++++++++-------- .../ObservationLogEmbeddedList.tsx | 1 + .../observation_logs/ObservationLogShow.tsx | 19 +- .../src/core/observation_logs/functions.ts | 6 + frontend/src/core/observation_logs/index.ts | 2 + frontend/src/core/products/ProductReviews.tsx | 4 +- 14 files changed, 528 insertions(+), 102 deletions(-) create mode 100644 frontend/src/core/observation_logs/AssessmentBulkApproval.tsx create mode 100644 frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx create mode 100644 frontend/src/core/observation_logs/functions.ts diff --git a/backend/application/core/api/filters.py b/backend/application/core/api/filters.py index e2a58062a..74f979070 100644 --- a/backend/application/core/api/filters.py +++ b/backend/application/core/api/filters.py @@ -267,16 +267,32 @@ class ObservationLogFilter(FilterSet): field_name="observation__product", queryset=Product.objects.all(), ) + product_group = ModelChoiceFilter( + field_name="observation__product__product_group", + queryset=Product.objects.filter(is_product_group=True), + ) observation_title = CharFilter( field_name="observation__title", lookup_expr="icontains", ) + branch_name = CharFilter( + field_name="observation__branch__name", lookup_expr="icontains" + ) + branch = ModelChoiceFilter( + field_name="observation__branch", queryset=Branch.objects.all() + ) + origin_component_name_version = CharFilter( + field_name="observation__origin_component_name_version", lookup_expr="icontains" + ) ordering = OrderingFilter( # tuple-mapping retains order fields=( ("id", "id"), ("user__full_name", "user_full_name"), + ("observation__product__name", "product_name"), + ("observation__product__product_group__name", "product.product_group_name"), + ("observation__branch__name", "branch_name"), ("observation__title", "observation_title"), ("severity", "severity"), ("status", "status"), diff --git a/backend/application/core/api/serializers_observation.py b/backend/application/core/api/serializers_observation.py index 5929e6913..e6decdacc 100644 --- a/backend/application/core/api/serializers_observation.py +++ b/backend/application/core/api/serializers_observation.py @@ -549,7 +549,7 @@ class Meta: class ObservationLogListSerializer(ModelSerializer): - observation_title = SerializerMethodField() + observation_data = ObservationListSerializer(source="observation") user_full_name = SerializerMethodField() approval_user_full_name = SerializerMethodField() @@ -559,9 +559,6 @@ def get_user_full_name(self, obj: Observation_Log) -> Optional[str]: return None - def get_observation_title(self, obj: Observation_Log) -> str: - return obj.observation.title - def get_approval_user_full_name(self, obj: Observation_Log) -> Optional[str]: if obj.approval_user: return obj.approval_user.full_name @@ -580,6 +577,16 @@ class ObservationLogApprovalSerializer(Serializer): approval_remark = CharField(max_length=255, required=True) +class ObservationLogBulkApprovalSerializer(Serializer): + assessment_status = ChoiceField( + choices=Assessment_Status.ASSESSMENT_STATUS_CHOICES_APPROVAL, required=False + ) + approval_remark = CharField(max_length=255, required=True) + observation_logs = ListField( + child=IntegerField(min_value=1), min_length=0, max_length=100, required=True + ) + + class PotentialDuplicateSerializer(ModelSerializer): potential_duplicate_observation = NestedObservationSerializer() diff --git a/backend/application/core/api/views.py b/backend/application/core/api/views.py index dab16f39a..14029af39 100644 --- a/backend/application/core/api/views.py +++ b/backend/application/core/api/views.py @@ -48,6 +48,7 @@ ObservationCreateSerializer, ObservationListSerializer, ObservationLogApprovalSerializer, + ObservationLogBulkApprovalSerializer, ObservationLogListSerializer, ObservationLogSerializer, ObservationRemoveAssessmentSerializer, @@ -103,6 +104,7 @@ export_observations_excel, ) from application.core.services.observations_bulk_actions import ( + observation_logs_bulk_approval, observations_bulk_assessment, observations_bulk_delete, observations_bulk_mark_duplicates, @@ -681,6 +683,24 @@ def approval(self, request, pk=None): return Response() + @extend_schema( + methods=["PATCH"], + request=ObservationLogBulkApprovalSerializer, + responses={HTTP_204_NO_CONTENT: None}, + ) + @action(detail=False, methods=["patch"]) + def bulk_approval(self, request): + request_serializer = ObservationLogBulkApprovalSerializer(data=request.data) + if not request_serializer.is_valid(): + raise ValidationError(request_serializer.errors) + + observation_logs_bulk_approval( + request_serializer.validated_data.get("assessment_status"), + request_serializer.validated_data.get("approval_remark"), + request_serializer.validated_data.get("observation_logs"), + ) + return Response(status=HTTP_204_NO_CONTENT) + class EvidenceViewSet(GenericViewSet, ListModelMixin, RetrieveModelMixin): serializer_class = EvidenceSerializer diff --git a/backend/application/core/services/observations_bulk_actions.py b/backend/application/core/services/observations_bulk_actions.py index c30636fe4..49731b9b8 100644 --- a/backend/application/core/services/observations_bulk_actions.py +++ b/backend/application/core/services/observations_bulk_actions.py @@ -8,10 +8,18 @@ from application.access_control.services.authorization import user_has_permission from application.access_control.services.roles_permissions import Permissions from application.commons.services.global_request import get_current_user -from application.core.models import Observation, Potential_Duplicate, Product +from application.core.models import ( + Observation, + Observation_Log, + Potential_Duplicate, + Product, +) from application.core.queries.observation import get_current_observation_log -from application.core.services.assessment import save_assessment -from application.core.services.potential_duplicates import set_potential_duplicate +from application.core.services.assessment import assessment_approval, save_assessment +from application.core.services.potential_duplicates import ( + set_potential_duplicate, + set_potential_duplicate_both_ways, +) from application.core.services.security_gate import check_security_gate from application.core.types import Assessment_Status, Status from application.issue_tracker.services.issue_tracker import ( @@ -136,3 +144,49 @@ def _check_observations( ) return observations + + +def observation_logs_bulk_approval( + assessment_status: str, + approval_remark: str, + observation_log_ids: list[int], +) -> None: + observation_logs = _check_observation_logs(None, observation_log_ids) + for observation_log in observation_logs: + assessment_approval(observation_log, assessment_status, approval_remark) + set_potential_duplicate_both_ways(observation_log.observation) + + +def _check_observation_logs( + product: Optional[Product], observation_log_ids: list[int] +) -> QuerySet[Observation_Log]: + observation_logs = Observation_Log.objects.filter(id__in=observation_log_ids) + if len(observation_logs) != len(observation_log_ids): + raise ValidationError("Some observation logs do not exist") + + for observation_log in observation_logs: + if product: + if observation_log.observation.product != product: + raise ValidationError( + f"Observation log {observation_log.pk} does not belong to product {product.pk}" + ) + else: + if not user_has_permission( + observation_log, Permissions.Observation_Log_Approval + ): + raise ValidationError( + f"First observation log without approval permission: {observation_log.pk}" + ) + if ( + not observation_log.assessment_status + == Assessment_Status.ASSESSMENT_STATUS_NEEDS_APPROVAL + ): + raise ValidationError( + f"First observation log that does not need approval: {observation_log.pk}" + ) + if get_current_user() == observation_log.user: + raise ValidationError( + f"First observation log where user cannot approve their own assessment: {observation_log.pk}" + ) + + return observation_logs diff --git a/backend/unittests/access_control/api/test_authorization_observation_logs.py b/backend/unittests/access_control/api/test_authorization_observation_logs.py index a9997c289..c47f3fbae 100644 --- a/backend/unittests/access_control/api/test_authorization_observation_logs.py +++ b/backend/unittests/access_control/api/test_authorization_observation_logs.py @@ -16,14 +16,14 @@ def test_authorization_observation_logs_product_authorization_group_member(self) self._test_authorization_observation_logs() def _test_authorization_observation_logs(self): - expected_data = "{'count': 4, 'next': None, 'previous': None, 'results': [{'id': 2, 'observation_title': 'db_observation_internal', 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': '', 'status': 'Duplicate', 'comment': 'Set by product rule', 'created': '2022-12-15T17:10:35.524000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 1, 'observation_title': 'db_observation_internal', 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': 'Medium', 'status': 'Open', 'comment': 'Set by parser', 'created': '2022-12-15T17:10:35.518000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 4, 'observation_title': 'db_observation_internal', 'user_full_name': 'db_external', 'approval_user_full_name': None, 'severity': '', 'status': 'False positive', 'comment': 'Set by product rule', 'created': '2022-12-15T17:12:23.196000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 2, 'user': 4, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 3, 'observation_title': 'db_observation_internal', 'user_full_name': 'db_external', 'approval_user_full_name': None, 'severity': 'Medium', 'status': 'Open', 'comment': 'Set by parser', 'created': '2022-12-15T17:11:28.326000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 2, 'user': 4, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}]}" + expected_data = "{'count': 4, 'next': None, 'previous': None, 'results': [{'id': 2, 'observation_data': {'id': 1, 'product_data': {'id': 1, 'product_group_name': 'db_product_group', 'name': 'db_product_internal', 'description': '', 'purl': '', 'cpe23': '', 'repository_prefix': '', 'repository_branch_housekeeping_active': None, 'repository_branch_housekeeping_keep_inactive_days': None, 'repository_branch_housekeeping_exempt_branches': '', 'security_gate_passed': True, 'security_gate_active': None, 'security_gate_threshold_critical': None, 'security_gate_threshold_high': None, 'security_gate_threshold_medium': None, 'security_gate_threshold_low': None, 'security_gate_threshold_none': None, 'security_gate_threshold_unknown': None, 'apply_general_rules': True, 'notification_ms_teams_webhook': '', 'notification_slack_webhook': '', 'notification_email_to': '', 'issue_tracker_active': False, 'issue_tracker_type': '', 'issue_tracker_base_url': '', 'issue_tracker_username': '', 'issue_tracker_api_key': '', 'issue_tracker_project_id': '', 'issue_tracker_labels': '', 'issue_tracker_issue_type': '', 'issue_tracker_status_closed': '', 'issue_tracker_minimum_severity': '', 'last_observation_change': '2022-12-16T17:13:18.283000+01:00', 'assessments_need_approval': False, 'product_rules_need_approval': False, 'risk_acceptance_expiry_active': None, 'risk_acceptance_expiry_days': None, 'has_cloud_resource': False, 'has_component': False, 'has_docker_image': False, 'has_endpoint': False, 'has_kubernetes_resource': False, 'has_source': False, 'has_potential_duplicates': False, 'product_group': 3, 'repository_default_branch': 1, 'license_policy': None}, 'branch_name': 'db_branch_internal_dev', 'parser_data': {'id': 1, 'name': 'db_parser_file', 'type': 'DAST', 'source': 'File', 'module_name': '', 'class_name': ''}, 'scanner_name': 'db_parser', 'origin_component_name_version': '', 'title': 'db_observation_internal', 'description': '', 'recommendation': '', 'current_severity': 'Medium', 'parser_severity': 'Medium', 'rule_severity': '', 'assessment_severity': '', 'current_status': 'Duplicate', 'parser_status': 'Open', 'vex_status': '', 'rule_status': 'Duplicate', 'assessment_status': '', 'scanner_observation_id': '', 'vulnerability_id': '', 'origin_component_name': '', 'origin_component_version': '', 'origin_component_purl': '', 'origin_component_purl_type': '', 'origin_component_cpe': '', 'origin_docker_image_name': '', 'origin_docker_image_tag': '', 'origin_docker_image_name_tag': '', 'origin_docker_image_name_tag_short': '', 'origin_docker_image_digest': '', 'origin_endpoint_url': '', 'origin_endpoint_scheme': '', 'origin_endpoint_hostname': '', 'origin_endpoint_port': None, 'origin_endpoint_path': '', 'origin_endpoint_params': '', 'origin_endpoint_query': '', 'origin_endpoint_fragment': '', 'origin_service_name': 'db_service_internal_backend', 'origin_source_file': '', 'origin_source_line_start': None, 'origin_source_line_end': None, 'origin_cloud_provider': '', 'origin_cloud_account_subscription_project': '', 'origin_cloud_resource': '', 'origin_cloud_resource_type': '', 'origin_cloud_qualified_resource': '', 'origin_kubernetes_cluster': '', 'origin_kubernetes_namespace': '', 'origin_kubernetes_resource_type': '', 'origin_kubernetes_resource_name': '', 'origin_kubernetes_qualified_resource': '', 'cvss3_score': None, 'cvss3_vector': '', 'cwe': None, 'epss_score': None, 'epss_percentile': None, 'found': None, 'scanner': 'db_parser', 'upload_filename': 'parser.json', 'api_configuration_name': '', 'import_last_seen': '2022-12-15T17:14:20.870000+01:00', 'created': '2022-12-15T17:10:35.513000+01:00', 'modified': '2022-12-16T17:13:18.282000+01:00', 'last_observation_log': '2022-12-16T17:13:18.281000+01:00', 'identity_hash': '6eef8088480aa2523aeeb64ad35f876a942cc3172cfb36752f3a052a4f88642c', 'issue_tracker_issue_id': '', 'issue_tracker_issue_closed': False, 'has_potential_duplicates': False, 'current_vex_justification': '', 'parser_vex_justification': '', 'vex_vex_justification': '', 'rule_vex_justification': '', 'assessment_vex_justification': '', 'risk_acceptance_expiry_date': None, 'product': 1, 'branch': 1, 'parser': 1, 'origin_service': 1, 'general_rule': None, 'product_rule': 1, 'vex_statement': None}, 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': '', 'status': 'Duplicate', 'comment': 'Set by product rule', 'created': '2022-12-15T17:10:35.524000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 1, 'observation_data': {'id': 1, 'product_data': {'id': 1, 'product_group_name': 'db_product_group', 'name': 'db_product_internal', 'description': '', 'purl': '', 'cpe23': '', 'repository_prefix': '', 'repository_branch_housekeeping_active': None, 'repository_branch_housekeeping_keep_inactive_days': None, 'repository_branch_housekeeping_exempt_branches': '', 'security_gate_passed': True, 'security_gate_active': None, 'security_gate_threshold_critical': None, 'security_gate_threshold_high': None, 'security_gate_threshold_medium': None, 'security_gate_threshold_low': None, 'security_gate_threshold_none': None, 'security_gate_threshold_unknown': None, 'apply_general_rules': True, 'notification_ms_teams_webhook': '', 'notification_slack_webhook': '', 'notification_email_to': '', 'issue_tracker_active': False, 'issue_tracker_type': '', 'issue_tracker_base_url': '', 'issue_tracker_username': '', 'issue_tracker_api_key': '', 'issue_tracker_project_id': '', 'issue_tracker_labels': '', 'issue_tracker_issue_type': '', 'issue_tracker_status_closed': '', 'issue_tracker_minimum_severity': '', 'last_observation_change': '2022-12-16T17:13:18.283000+01:00', 'assessments_need_approval': False, 'product_rules_need_approval': False, 'risk_acceptance_expiry_active': None, 'risk_acceptance_expiry_days': None, 'has_cloud_resource': False, 'has_component': False, 'has_docker_image': False, 'has_endpoint': False, 'has_kubernetes_resource': False, 'has_source': False, 'has_potential_duplicates': False, 'product_group': 3, 'repository_default_branch': 1, 'license_policy': None}, 'branch_name': 'db_branch_internal_dev', 'parser_data': {'id': 1, 'name': 'db_parser_file', 'type': 'DAST', 'source': 'File', 'module_name': '', 'class_name': ''}, 'scanner_name': 'db_parser', 'origin_component_name_version': '', 'title': 'db_observation_internal', 'description': '', 'recommendation': '', 'current_severity': 'Medium', 'parser_severity': 'Medium', 'rule_severity': '', 'assessment_severity': '', 'current_status': 'Duplicate', 'parser_status': 'Open', 'vex_status': '', 'rule_status': 'Duplicate', 'assessment_status': '', 'scanner_observation_id': '', 'vulnerability_id': '', 'origin_component_name': '', 'origin_component_version': '', 'origin_component_purl': '', 'origin_component_purl_type': '', 'origin_component_cpe': '', 'origin_docker_image_name': '', 'origin_docker_image_tag': '', 'origin_docker_image_name_tag': '', 'origin_docker_image_name_tag_short': '', 'origin_docker_image_digest': '', 'origin_endpoint_url': '', 'origin_endpoint_scheme': '', 'origin_endpoint_hostname': '', 'origin_endpoint_port': None, 'origin_endpoint_path': '', 'origin_endpoint_params': '', 'origin_endpoint_query': '', 'origin_endpoint_fragment': '', 'origin_service_name': 'db_service_internal_backend', 'origin_source_file': '', 'origin_source_line_start': None, 'origin_source_line_end': None, 'origin_cloud_provider': '', 'origin_cloud_account_subscription_project': '', 'origin_cloud_resource': '', 'origin_cloud_resource_type': '', 'origin_cloud_qualified_resource': '', 'origin_kubernetes_cluster': '', 'origin_kubernetes_namespace': '', 'origin_kubernetes_resource_type': '', 'origin_kubernetes_resource_name': '', 'origin_kubernetes_qualified_resource': '', 'cvss3_score': None, 'cvss3_vector': '', 'cwe': None, 'epss_score': None, 'epss_percentile': None, 'found': None, 'scanner': 'db_parser', 'upload_filename': 'parser.json', 'api_configuration_name': '', 'import_last_seen': '2022-12-15T17:14:20.870000+01:00', 'created': '2022-12-15T17:10:35.513000+01:00', 'modified': '2022-12-16T17:13:18.282000+01:00', 'last_observation_log': '2022-12-16T17:13:18.281000+01:00', 'identity_hash': '6eef8088480aa2523aeeb64ad35f876a942cc3172cfb36752f3a052a4f88642c', 'issue_tracker_issue_id': '', 'issue_tracker_issue_closed': False, 'has_potential_duplicates': False, 'current_vex_justification': '', 'parser_vex_justification': '', 'vex_vex_justification': '', 'rule_vex_justification': '', 'assessment_vex_justification': '', 'risk_acceptance_expiry_date': None, 'product': 1, 'branch': 1, 'parser': 1, 'origin_service': 1, 'general_rule': None, 'product_rule': 1, 'vex_statement': None}, 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': 'Medium', 'status': 'Open', 'comment': 'Set by parser', 'created': '2022-12-15T17:10:35.518000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 4, 'observation_data': {'id': 2, 'product_data': {'id': 2, 'product_group_name': '', 'name': 'db_product_external', 'description': '', 'purl': '', 'cpe23': '', 'repository_prefix': '', 'repository_branch_housekeeping_active': None, 'repository_branch_housekeeping_keep_inactive_days': None, 'repository_branch_housekeeping_exempt_branches': '', 'security_gate_passed': None, 'security_gate_active': False, 'security_gate_threshold_critical': None, 'security_gate_threshold_high': None, 'security_gate_threshold_medium': None, 'security_gate_threshold_low': None, 'security_gate_threshold_none': None, 'security_gate_threshold_unknown': None, 'apply_general_rules': True, 'notification_ms_teams_webhook': '', 'notification_slack_webhook': '', 'notification_email_to': '', 'issue_tracker_active': False, 'issue_tracker_type': '', 'issue_tracker_base_url': '', 'issue_tracker_username': '', 'issue_tracker_api_key': '', 'issue_tracker_project_id': '', 'issue_tracker_labels': '', 'issue_tracker_issue_type': '', 'issue_tracker_status_closed': '', 'issue_tracker_minimum_severity': '', 'last_observation_change': '2022-12-16T17:13:18.283000+01:00', 'assessments_need_approval': False, 'product_rules_need_approval': False, 'risk_acceptance_expiry_active': None, 'risk_acceptance_expiry_days': None, 'has_cloud_resource': False, 'has_component': False, 'has_docker_image': False, 'has_endpoint': False, 'has_kubernetes_resource': False, 'has_source': False, 'has_potential_duplicates': False, 'product_group': None, 'repository_default_branch': 3, 'license_policy': None}, 'branch_name': '', 'parser_data': {'id': 1, 'name': 'db_parser_file', 'type': 'DAST', 'source': 'File', 'module_name': '', 'class_name': ''}, 'scanner_name': 'db_parser', 'origin_component_name_version': '', 'title': 'db_observation_internal', 'description': '', 'recommendation': '', 'current_severity': 'Medium', 'parser_severity': 'Medium', 'rule_severity': '', 'assessment_severity': '', 'current_status': 'False positive', 'parser_status': 'Open', 'vex_status': '', 'rule_status': 'False positive', 'assessment_status': '', 'scanner_observation_id': '', 'vulnerability_id': '', 'origin_component_name': '', 'origin_component_version': '', 'origin_component_purl': '', 'origin_component_purl_type': '', 'origin_component_cpe': '', 'origin_docker_image_name': '', 'origin_docker_image_tag': '', 'origin_docker_image_name_tag': '', 'origin_docker_image_name_tag_short': '', 'origin_docker_image_digest': '', 'origin_endpoint_url': '', 'origin_endpoint_scheme': '', 'origin_endpoint_hostname': '', 'origin_endpoint_port': None, 'origin_endpoint_path': '', 'origin_endpoint_params': '', 'origin_endpoint_query': '', 'origin_endpoint_fragment': '', 'origin_service_name': '', 'origin_source_file': '', 'origin_source_line_start': None, 'origin_source_line_end': None, 'origin_cloud_provider': '', 'origin_cloud_account_subscription_project': '', 'origin_cloud_resource': '', 'origin_cloud_resource_type': '', 'origin_cloud_qualified_resource': '', 'origin_kubernetes_cluster': '', 'origin_kubernetes_namespace': '', 'origin_kubernetes_resource_type': '', 'origin_kubernetes_resource_name': '', 'origin_kubernetes_qualified_resource': '', 'cvss3_score': None, 'cvss3_vector': '', 'cwe': None, 'epss_score': None, 'epss_percentile': None, 'found': None, 'scanner': 'db_parser', 'upload_filename': 'parser.json', 'api_configuration_name': '', 'import_last_seen': '2022-12-15T17:14:20.876000+01:00', 'created': '2022-12-15T17:10:35.521000+01:00', 'modified': '2022-12-16T17:13:18.283000+01:00', 'last_observation_log': '2022-12-16T17:13:18.283000+01:00', 'identity_hash': 'bc8e59b7687fe3533616b3914c636389c131eac3bdbda1b67d8d26f890a74007', 'issue_tracker_issue_id': '', 'issue_tracker_issue_closed': False, 'has_potential_duplicates': False, 'current_vex_justification': '', 'parser_vex_justification': '', 'vex_vex_justification': '', 'rule_vex_justification': '', 'assessment_vex_justification': '', 'risk_acceptance_expiry_date': None, 'product': 2, 'branch': None, 'parser': 1, 'origin_service': None, 'general_rule': None, 'product_rule': 2, 'vex_statement': None}, 'user_full_name': 'db_external', 'approval_user_full_name': None, 'severity': '', 'status': 'False positive', 'comment': 'Set by product rule', 'created': '2022-12-15T17:12:23.196000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 2, 'user': 4, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 3, 'observation_data': {'id': 2, 'product_data': {'id': 2, 'product_group_name': '', 'name': 'db_product_external', 'description': '', 'purl': '', 'cpe23': '', 'repository_prefix': '', 'repository_branch_housekeeping_active': None, 'repository_branch_housekeeping_keep_inactive_days': None, 'repository_branch_housekeeping_exempt_branches': '', 'security_gate_passed': None, 'security_gate_active': False, 'security_gate_threshold_critical': None, 'security_gate_threshold_high': None, 'security_gate_threshold_medium': None, 'security_gate_threshold_low': None, 'security_gate_threshold_none': None, 'security_gate_threshold_unknown': None, 'apply_general_rules': True, 'notification_ms_teams_webhook': '', 'notification_slack_webhook': '', 'notification_email_to': '', 'issue_tracker_active': False, 'issue_tracker_type': '', 'issue_tracker_base_url': '', 'issue_tracker_username': '', 'issue_tracker_api_key': '', 'issue_tracker_project_id': '', 'issue_tracker_labels': '', 'issue_tracker_issue_type': '', 'issue_tracker_status_closed': '', 'issue_tracker_minimum_severity': '', 'last_observation_change': '2022-12-16T17:13:18.283000+01:00', 'assessments_need_approval': False, 'product_rules_need_approval': False, 'risk_acceptance_expiry_active': None, 'risk_acceptance_expiry_days': None, 'has_cloud_resource': False, 'has_component': False, 'has_docker_image': False, 'has_endpoint': False, 'has_kubernetes_resource': False, 'has_source': False, 'has_potential_duplicates': False, 'product_group': None, 'repository_default_branch': 3, 'license_policy': None}, 'branch_name': '', 'parser_data': {'id': 1, 'name': 'db_parser_file', 'type': 'DAST', 'source': 'File', 'module_name': '', 'class_name': ''}, 'scanner_name': 'db_parser', 'origin_component_name_version': '', 'title': 'db_observation_internal', 'description': '', 'recommendation': '', 'current_severity': 'Medium', 'parser_severity': 'Medium', 'rule_severity': '', 'assessment_severity': '', 'current_status': 'False positive', 'parser_status': 'Open', 'vex_status': '', 'rule_status': 'False positive', 'assessment_status': '', 'scanner_observation_id': '', 'vulnerability_id': '', 'origin_component_name': '', 'origin_component_version': '', 'origin_component_purl': '', 'origin_component_purl_type': '', 'origin_component_cpe': '', 'origin_docker_image_name': '', 'origin_docker_image_tag': '', 'origin_docker_image_name_tag': '', 'origin_docker_image_name_tag_short': '', 'origin_docker_image_digest': '', 'origin_endpoint_url': '', 'origin_endpoint_scheme': '', 'origin_endpoint_hostname': '', 'origin_endpoint_port': None, 'origin_endpoint_path': '', 'origin_endpoint_params': '', 'origin_endpoint_query': '', 'origin_endpoint_fragment': '', 'origin_service_name': '', 'origin_source_file': '', 'origin_source_line_start': None, 'origin_source_line_end': None, 'origin_cloud_provider': '', 'origin_cloud_account_subscription_project': '', 'origin_cloud_resource': '', 'origin_cloud_resource_type': '', 'origin_cloud_qualified_resource': '', 'origin_kubernetes_cluster': '', 'origin_kubernetes_namespace': '', 'origin_kubernetes_resource_type': '', 'origin_kubernetes_resource_name': '', 'origin_kubernetes_qualified_resource': '', 'cvss3_score': None, 'cvss3_vector': '', 'cwe': None, 'epss_score': None, 'epss_percentile': None, 'found': None, 'scanner': 'db_parser', 'upload_filename': 'parser.json', 'api_configuration_name': '', 'import_last_seen': '2022-12-15T17:14:20.876000+01:00', 'created': '2022-12-15T17:10:35.521000+01:00', 'modified': '2022-12-16T17:13:18.283000+01:00', 'last_observation_log': '2022-12-16T17:13:18.283000+01:00', 'identity_hash': 'bc8e59b7687fe3533616b3914c636389c131eac3bdbda1b67d8d26f890a74007', 'issue_tracker_issue_id': '', 'issue_tracker_issue_closed': False, 'has_potential_duplicates': False, 'current_vex_justification': '', 'parser_vex_justification': '', 'vex_vex_justification': '', 'rule_vex_justification': '', 'assessment_vex_justification': '', 'risk_acceptance_expiry_date': None, 'product': 2, 'branch': None, 'parser': 1, 'origin_service': None, 'general_rule': None, 'product_rule': 2, 'vex_statement': None}, 'user_full_name': 'db_external', 'approval_user_full_name': None, 'severity': 'Medium', 'status': 'Open', 'comment': 'Set by parser', 'created': '2022-12-15T17:11:28.326000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 2, 'user': 4, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}]}" self._test_api( APITest( "db_admin", "get", "/api/observation_logs/", None, 200, expected_data ) ) - expected_data = "{'count': 2, 'next': None, 'previous': None, 'results': [{'id': 2, 'observation_title': 'db_observation_internal', 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': '', 'status': 'Duplicate', 'comment': 'Set by product rule', 'created': '2022-12-15T17:10:35.524000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 1, 'observation_title': 'db_observation_internal', 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': 'Medium', 'status': 'Open', 'comment': 'Set by parser', 'created': '2022-12-15T17:10:35.518000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}]}" + expected_data = "{'count': 2, 'next': None, 'previous': None, 'results': [{'id': 2, 'observation_data': {'id': 1, 'product_data': {'id': 1, 'product_group_name': 'db_product_group', 'name': 'db_product_internal', 'description': '', 'purl': '', 'cpe23': '', 'repository_prefix': '', 'repository_branch_housekeeping_active': None, 'repository_branch_housekeeping_keep_inactive_days': None, 'repository_branch_housekeeping_exempt_branches': '', 'security_gate_passed': True, 'security_gate_active': None, 'security_gate_threshold_critical': None, 'security_gate_threshold_high': None, 'security_gate_threshold_medium': None, 'security_gate_threshold_low': None, 'security_gate_threshold_none': None, 'security_gate_threshold_unknown': None, 'apply_general_rules': True, 'notification_ms_teams_webhook': '', 'notification_slack_webhook': '', 'notification_email_to': '', 'issue_tracker_active': False, 'issue_tracker_type': '', 'issue_tracker_base_url': '', 'issue_tracker_username': '', 'issue_tracker_api_key': '', 'issue_tracker_project_id': '', 'issue_tracker_labels': '', 'issue_tracker_issue_type': '', 'issue_tracker_status_closed': '', 'issue_tracker_minimum_severity': '', 'last_observation_change': '2022-12-16T17:13:18.283000+01:00', 'assessments_need_approval': False, 'product_rules_need_approval': False, 'risk_acceptance_expiry_active': None, 'risk_acceptance_expiry_days': None, 'has_cloud_resource': False, 'has_component': False, 'has_docker_image': False, 'has_endpoint': False, 'has_kubernetes_resource': False, 'has_source': False, 'has_potential_duplicates': False, 'product_group': 3, 'repository_default_branch': 1, 'license_policy': None}, 'branch_name': 'db_branch_internal_dev', 'parser_data': {'id': 1, 'name': 'db_parser_file', 'type': 'DAST', 'source': 'File', 'module_name': '', 'class_name': ''}, 'scanner_name': 'db_parser', 'origin_component_name_version': '', 'title': 'db_observation_internal', 'description': '', 'recommendation': '', 'current_severity': 'Medium', 'parser_severity': 'Medium', 'rule_severity': '', 'assessment_severity': '', 'current_status': 'Duplicate', 'parser_status': 'Open', 'vex_status': '', 'rule_status': 'Duplicate', 'assessment_status': '', 'scanner_observation_id': '', 'vulnerability_id': '', 'origin_component_name': '', 'origin_component_version': '', 'origin_component_purl': '', 'origin_component_purl_type': '', 'origin_component_cpe': '', 'origin_docker_image_name': '', 'origin_docker_image_tag': '', 'origin_docker_image_name_tag': '', 'origin_docker_image_name_tag_short': '', 'origin_docker_image_digest': '', 'origin_endpoint_url': '', 'origin_endpoint_scheme': '', 'origin_endpoint_hostname': '', 'origin_endpoint_port': None, 'origin_endpoint_path': '', 'origin_endpoint_params': '', 'origin_endpoint_query': '', 'origin_endpoint_fragment': '', 'origin_service_name': 'db_service_internal_backend', 'origin_source_file': '', 'origin_source_line_start': None, 'origin_source_line_end': None, 'origin_cloud_provider': '', 'origin_cloud_account_subscription_project': '', 'origin_cloud_resource': '', 'origin_cloud_resource_type': '', 'origin_cloud_qualified_resource': '', 'origin_kubernetes_cluster': '', 'origin_kubernetes_namespace': '', 'origin_kubernetes_resource_type': '', 'origin_kubernetes_resource_name': '', 'origin_kubernetes_qualified_resource': '', 'cvss3_score': None, 'cvss3_vector': '', 'cwe': None, 'epss_score': None, 'epss_percentile': None, 'found': None, 'scanner': 'db_parser', 'upload_filename': 'parser.json', 'api_configuration_name': '', 'import_last_seen': '2022-12-15T17:14:20.870000+01:00', 'created': '2022-12-15T17:10:35.513000+01:00', 'modified': '2022-12-16T17:13:18.282000+01:00', 'last_observation_log': '2022-12-16T17:13:18.281000+01:00', 'identity_hash': '6eef8088480aa2523aeeb64ad35f876a942cc3172cfb36752f3a052a4f88642c', 'issue_tracker_issue_id': '', 'issue_tracker_issue_closed': False, 'has_potential_duplicates': False, 'current_vex_justification': '', 'parser_vex_justification': '', 'vex_vex_justification': '', 'rule_vex_justification': '', 'assessment_vex_justification': '', 'risk_acceptance_expiry_date': None, 'product': 1, 'branch': 1, 'parser': 1, 'origin_service': 1, 'general_rule': None, 'product_rule': 1, 'vex_statement': None}, 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': '', 'status': 'Duplicate', 'comment': 'Set by product rule', 'created': '2022-12-15T17:10:35.524000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}, {'id': 1, 'observation_data': {'id': 1, 'product_data': {'id': 1, 'product_group_name': 'db_product_group', 'name': 'db_product_internal', 'description': '', 'purl': '', 'cpe23': '', 'repository_prefix': '', 'repository_branch_housekeeping_active': None, 'repository_branch_housekeeping_keep_inactive_days': None, 'repository_branch_housekeeping_exempt_branches': '', 'security_gate_passed': True, 'security_gate_active': None, 'security_gate_threshold_critical': None, 'security_gate_threshold_high': None, 'security_gate_threshold_medium': None, 'security_gate_threshold_low': None, 'security_gate_threshold_none': None, 'security_gate_threshold_unknown': None, 'apply_general_rules': True, 'notification_ms_teams_webhook': '', 'notification_slack_webhook': '', 'notification_email_to': '', 'issue_tracker_active': False, 'issue_tracker_type': '', 'issue_tracker_base_url': '', 'issue_tracker_username': '', 'issue_tracker_api_key': '', 'issue_tracker_project_id': '', 'issue_tracker_labels': '', 'issue_tracker_issue_type': '', 'issue_tracker_status_closed': '', 'issue_tracker_minimum_severity': '', 'last_observation_change': '2022-12-16T17:13:18.283000+01:00', 'assessments_need_approval': False, 'product_rules_need_approval': False, 'risk_acceptance_expiry_active': None, 'risk_acceptance_expiry_days': None, 'has_cloud_resource': False, 'has_component': False, 'has_docker_image': False, 'has_endpoint': False, 'has_kubernetes_resource': False, 'has_source': False, 'has_potential_duplicates': False, 'product_group': 3, 'repository_default_branch': 1, 'license_policy': None}, 'branch_name': 'db_branch_internal_dev', 'parser_data': {'id': 1, 'name': 'db_parser_file', 'type': 'DAST', 'source': 'File', 'module_name': '', 'class_name': ''}, 'scanner_name': 'db_parser', 'origin_component_name_version': '', 'title': 'db_observation_internal', 'description': '', 'recommendation': '', 'current_severity': 'Medium', 'parser_severity': 'Medium', 'rule_severity': '', 'assessment_severity': '', 'current_status': 'Duplicate', 'parser_status': 'Open', 'vex_status': '', 'rule_status': 'Duplicate', 'assessment_status': '', 'scanner_observation_id': '', 'vulnerability_id': '', 'origin_component_name': '', 'origin_component_version': '', 'origin_component_purl': '', 'origin_component_purl_type': '', 'origin_component_cpe': '', 'origin_docker_image_name': '', 'origin_docker_image_tag': '', 'origin_docker_image_name_tag': '', 'origin_docker_image_name_tag_short': '', 'origin_docker_image_digest': '', 'origin_endpoint_url': '', 'origin_endpoint_scheme': '', 'origin_endpoint_hostname': '', 'origin_endpoint_port': None, 'origin_endpoint_path': '', 'origin_endpoint_params': '', 'origin_endpoint_query': '', 'origin_endpoint_fragment': '', 'origin_service_name': 'db_service_internal_backend', 'origin_source_file': '', 'origin_source_line_start': None, 'origin_source_line_end': None, 'origin_cloud_provider': '', 'origin_cloud_account_subscription_project': '', 'origin_cloud_resource': '', 'origin_cloud_resource_type': '', 'origin_cloud_qualified_resource': '', 'origin_kubernetes_cluster': '', 'origin_kubernetes_namespace': '', 'origin_kubernetes_resource_type': '', 'origin_kubernetes_resource_name': '', 'origin_kubernetes_qualified_resource': '', 'cvss3_score': None, 'cvss3_vector': '', 'cwe': None, 'epss_score': None, 'epss_percentile': None, 'found': None, 'scanner': 'db_parser', 'upload_filename': 'parser.json', 'api_configuration_name': '', 'import_last_seen': '2022-12-15T17:14:20.870000+01:00', 'created': '2022-12-15T17:10:35.513000+01:00', 'modified': '2022-12-16T17:13:18.282000+01:00', 'last_observation_log': '2022-12-16T17:13:18.281000+01:00', 'identity_hash': '6eef8088480aa2523aeeb64ad35f876a942cc3172cfb36752f3a052a4f88642c', 'issue_tracker_issue_id': '', 'issue_tracker_issue_closed': False, 'has_potential_duplicates': False, 'current_vex_justification': '', 'parser_vex_justification': '', 'vex_vex_justification': '', 'rule_vex_justification': '', 'assessment_vex_justification': '', 'risk_acceptance_expiry_date': None, 'product': 1, 'branch': 1, 'parser': 1, 'origin_service': 1, 'general_rule': None, 'product_rule': 1, 'vex_statement': None}, 'user_full_name': 'db_internal_write', 'approval_user_full_name': None, 'severity': 'Medium', 'status': 'Open', 'comment': 'Set by parser', 'created': '2022-12-15T17:10:35.518000+01:00', 'vex_justification': '', 'assessment_status': 'Auto approved', 'approval_remark': '', 'approval_date': None, 'risk_acceptance_expiry_date': None, 'observation': 1, 'user': 2, 'approval_user': None, 'general_rule': None, 'product_rule': None, 'vex_statement': None}]}" self._test_api( APITest( "db_internal_write", diff --git a/frontend/src/commons/layout/Menu.tsx b/frontend/src/commons/layout/Menu.tsx index eab39597e..f8cb835e6 100644 --- a/frontend/src/commons/layout/Menu.tsx +++ b/frontend/src/commons/layout/Menu.tsx @@ -1,3 +1,4 @@ +import ChecklistIcon from "@mui/icons-material/Checklist"; import SecurityIcon from "@mui/icons-material/Security"; import SettingsIcon from "@mui/icons-material/Settings"; import Box from "@mui/material/Box"; @@ -66,6 +67,13 @@ const Menu = ({ dense = false }: MenuProps) => { leftIcon={} dense={dense} /> + } + dense={dense} + /> { + const [open, setOpen] = useState(false); + const refresh = useRefresh(); + const notify = useNotify(); + const { selectedIds } = useListContext(); + const unselectAll = useUnselectAll("observation_logs"); + const [loading, setLoading] = useState(false); + + const assessmentUpdate = async (data: any) => { + setLoading(true); + const patch = { + assessment_status: data.assessment_status, + approval_remark: data.approval_remark, + observation_logs: selectedIds, + }; + + httpClient(window.__RUNTIME_CONFIG__.API_BASE_URL + "/observation_logs/bulk_approval/", { + method: "PATCH", + body: JSON.stringify(patch), + }) + .then(() => { + refresh(); + setOpen(false); + setLoading(false); + unselectAll(); + notify("Assessments updated", { + type: "success", + }); + }) + .catch((error) => { + refresh(); + setOpen(false); + setLoading(false); + unselectAll(); + notify(error.message, { + type: "warning", + }); + }); + }; + + const handleClose = (event: object, reason: string) => { + if (reason && reason == "backdropClick") return; + setOpen(false); + }; + + const handleCancel = () => setOpen(false); + + const handleOpen = () => setOpen(true); + + const CancelButton = () => ( + + ); + + const CustomToolbar = () => ( + + + + + ); + return ( + + + + + +   Assessment approval + + + }> + + + + + + {loading ? ( + theme.zIndex.drawer + 1 }} open={open}> + + + ) : null} + + ); +}; + +export default AssessmentBulkApproval; diff --git a/frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx b/frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx new file mode 100644 index 000000000..7cf608490 --- /dev/null +++ b/frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx @@ -0,0 +1,180 @@ +import { + AutocompleteInput, + Datagrid, + DateField, + FilterForm, + FunctionField, + ListContextProvider, + ReferenceInput, + ResourceContextProvider, + TextField, + TextInput, + useListController, +} from "react-admin"; + +import { CustomPagination } from "../../commons/custom_fields/CustomPagination"; +import { feature_vex_enabled } from "../../commons/functions"; +import { AutocompleteInputMedium } from "../../commons/layout/themes"; +import { getSettingListSize } from "../../commons/user_settings/functions"; +import { ASSESSMENT_STATUS_NEEDS_APPROVAL } from "../types"; +import { OBSERVATION_SEVERITY_CHOICES, OBSERVATION_STATUS_CHOICES } from "../types"; +import { commentShortened } from "./functions"; + +function listFilters(product: any) { + const filters = []; + if (product && product.has_branches) { + filters.push( + + + + ); + } + filters.push(); + + if (product && product.has_component) { + filters.push(); + } + if (product && product.has_docker_image) { + filters.push(); + } + if (product && product.has_endpoint) { + filters.push(); + } + if (product && product.has_source) { + filters.push(); + } + if (product && product.has_cloud_resource) { + filters.push(); + } + if (product && product.has_kubernetes_resource) { + filters.push(); + } + + filters.push( + + + , + , + + ); + return filters; +} + +type ObservationLogApprovalEmbeddedListProps = { + product: any; +}; + +const ObservationLogApprovalEmbeddedList = ({ product }: ObservationLogApprovalEmbeddedListProps) => { + const listContext = useListController({ + filter: { product: Number(product.id), assessment_status: ASSESSMENT_STATUS_NEEDS_APPROVAL }, + perPage: 25, + resource: "observation_logs", + sort: { field: "created", order: "ASC" }, + disableSyncWithLocation: true, + storeKey: "observation_logs.approvalembedded", + }); + + if (listContext.isLoading) { + return
Loading...
; + } + + const ShowObservationLogs = (id: any) => { + return "../../../../observation_logs/" + id + "/show"; + }; + + localStorage.setItem("observationlogapprovalembeddedlist", "true"); + localStorage.removeItem("observationlogapprovallist"); + localStorage.removeItem("observationlogembeddedlist"); + + return ( + + +
+ + + {product && product.has_branches && ( + + )} + + {product && product.has_component && ( + + )} + {product && product.has_docker_image && ( + + )} + {product && product.has_endpoint && ( + + )} + {product && product.has_source && ( + + )} + {product && product.has_cloud_resource && ( + + )} + {product && product.has_kubernetes_resource && ( + + )} + + + + {feature_vex_enabled() && ( + + )} + commentShortened(record.comment)} + sortable={false} + sx={{ wordBreak: "break-word" }} + /> + + + +
+
+
+ ); +}; + +export default ObservationLogApprovalEmbeddedList; diff --git a/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx b/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx index 553d62e80..6b88f9d9e 100644 --- a/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx +++ b/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx @@ -1,115 +1,114 @@ +import ChecklistIcon from "@mui/icons-material/Checklist"; import { AutocompleteInput, - ChipField, Datagrid, DateField, - FilterForm, - ListContextProvider, - ReferenceField, + FunctionField, + List, ReferenceInput, - ResourceContextProvider, TextField, TextInput, - useListController, } from "react-admin"; +import { Fragment } from "react/jsx-runtime"; import { CustomPagination } from "../../commons/custom_fields/CustomPagination"; import { feature_vex_enabled } from "../../commons/functions"; -import { AutocompleteInputMedium } from "../../commons/layout/themes"; +import ListHeader from "../../commons/layout/ListHeader"; +import { AutocompleteInputMedium, AutocompleteInputWide } from "../../commons/layout/themes"; import { getSettingListSize } from "../../commons/user_settings/functions"; import { ASSESSMENT_STATUS_NEEDS_APPROVAL } from "../types"; import { OBSERVATION_SEVERITY_CHOICES, OBSERVATION_STATUS_CHOICES } from "../types"; +import AssessmentBulkApproval from "./AssessmentBulkApproval"; +import { commentShortened } from "./functions"; -function listFilters() { - return [ - , - - - , - , - , - ]; -} +const BulkActionButtons = () => ( + + + +); -type ObservationLogApprovalListProps = { - product: any; -}; - -const ObservationLogApprovalList = ({ product }: ObservationLogApprovalListProps) => { - const listContext = useListController({ - filter: { product: Number(product.id), assessment_status: ASSESSMENT_STATUS_NEEDS_APPROVAL }, - perPage: 25, - resource: "observation_logs", - sort: { field: "created", order: "ASC" }, - disableSyncWithLocation: true, - storeKey: "observation_logs.approval", - }); - - if (listContext.isLoading) { - return
Loading...
; - } - - if (listContext.data) { - listContext.data.forEach((element: any) => { - if (element.comment.length > 255) { - element.comment_shortened = element.comment.substring(0, 255) + "..."; - } else { - element.comment_shortened = element.comment; - } - }); - } - - const ShowObservationLogs = (id: any) => { - return "../../../../observation_logs/" + id + "/show"; - }; +const listFilters = [ + + + , + + + , + + + , + , + + + , + , + , + , +]; +const ObservationLogApprovalList = () => { localStorage.setItem("observationlogapprovallist", "true"); + localStorage.removeItem("observationlogapprovalembeddedlist"); localStorage.removeItem("observationlogembeddedlist"); return ( - - -
- - - - - - - - - - {feature_vex_enabled() && ( - - )} + + + } + filters={listFilters} + sort={{ field: "created", order: "ASC" }} + disableSyncWithLocation={false} + storeKey="observation_logs.approval" + actions={false} + sx={{ marginTop: 1 }} + > + }> + + + + + + + + {feature_vex_enabled() && ( - - - -
-
-
+ )} + commentShortened(record.comment)} + sortable={false} + sx={{ wordBreak: "break-word" }} + /> + + + + ); }; diff --git a/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx b/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx index a6f29d7f2..9f54f918a 100644 --- a/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx +++ b/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx @@ -44,6 +44,7 @@ const ObservationLogEmbeddedList = ({ observation }: ObservationLogEmbeddedListP }; localStorage.setItem("observationlogembeddedlist", "true"); + localStorage.removeItem("observationlogapprovalembeddedlist"); localStorage.removeItem("observationlogapprovallist"); return ( diff --git a/frontend/src/core/observation_logs/ObservationLogShow.tsx b/frontend/src/core/observation_logs/ObservationLogShow.tsx index c96c89149..47d2c635d 100644 --- a/frontend/src/core/observation_logs/ObservationLogShow.tsx +++ b/frontend/src/core/observation_logs/ObservationLogShow.tsx @@ -33,14 +33,25 @@ const ShowActions = () => { sort = { field: "created", order: "DESC" }; storeKey = "observation_logs.embedded"; } - if (observation_log && observation_log.observation_data && localStorage.getItem("observationlogapprovallist")) { + if (observation_log && localStorage.getItem("observationlogapprovallist")) { filter = { - product: observation_log.observation_data.product, assessment_status: ASSESSMENT_STATUS_NEEDS_APPROVAL, }; sort = { field: "created", order: "ASC" }; storeKey = "observation_logs.approval"; } + if ( + observation_log && + observation_log.observation_data && + localStorage.getItem("observationlogapprovalembeddedlist") + ) { + filter = { + product: observation_log.observation_data.product, + assessment_status: ASSESSMENT_STATUS_NEEDS_APPROVAL, + }; + sort = { field: "created", order: "ASC" }; + storeKey = "observation_logs.approvalembedded"; + } return ( @@ -50,6 +61,8 @@ const ShowActions = () => { )} {observation_log && observation_log.observation_data && + observation_log.observation_data.product_data && + observation_log.observation_data.product_data.permissions && observation_log.assessment_status == ASSESSMENT_STATUS_NEEDS_APPROVAL && observation_log.observation_data.product_data.permissions.includes( PERMISSION_OBSERVATION_LOG_APPROVAL @@ -64,7 +77,7 @@ const ObservationLogComponent = () => { ( - + Observation Log diff --git a/frontend/src/core/observation_logs/functions.ts b/frontend/src/core/observation_logs/functions.ts new file mode 100644 index 000000000..0f97882ec --- /dev/null +++ b/frontend/src/core/observation_logs/functions.ts @@ -0,0 +1,6 @@ +export const commentShortened = (comment: string | null) => { + if (comment && comment.length > 255) { + return comment.substring(0, 255) + "..."; + } + return comment; +}; diff --git a/frontend/src/core/observation_logs/index.ts b/frontend/src/core/observation_logs/index.ts index 075fb4147..d1780d074 100644 --- a/frontend/src/core/observation_logs/index.ts +++ b/frontend/src/core/observation_logs/index.ts @@ -1,8 +1,10 @@ import ObservationLogIcon from "@mui/icons-material/List"; +import ObservationLogApprovalList from "./ObservationLogApprovalList"; import ObservationLogShow from "./ObservationLogShow"; export default { + list: ObservationLogApprovalList, show: ObservationLogShow, icon: ObservationLogIcon, }; diff --git a/frontend/src/core/products/ProductReviews.tsx b/frontend/src/core/products/ProductReviews.tsx index 5d37afc06..a1bfe5ad0 100644 --- a/frontend/src/core/products/ProductReviews.tsx +++ b/frontend/src/core/products/ProductReviews.tsx @@ -4,7 +4,7 @@ import { Fragment } from "react"; import { getElevation } from "../../metrics/functions"; import ProductRuleApprovalList from "../../rules/product_rules/ProductRuleApprovalList"; -import ObservationLogApprovalList from "../observation_logs/ObservationLogApprovalList"; +import ObservationLogApprovalEmbeddedList from "../observation_logs/ObservationLogApprovalEmbeddedList"; import ObservationsReviewList from "../observations/ObservationReviewList"; type ProductReviewsProps = { @@ -59,7 +59,7 @@ const ProductReviews = ({ product }: ProductReviewsProps) => { - + )} From dfa5337810df1da7eafa469e12266399d3f51e24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:41:41 +0100 Subject: [PATCH 36/82] chore(deps): update dependency @trivago/prettier-plugin-sort-imports to v5 (#2315) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 212 ++++--------------------------------- frontend/package.json | 2 +- 2 files changed, 22 insertions(+), 192 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 76abaafc0..c0837e8fb 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -38,7 +38,7 @@ "@eslint/eslintrc": "3.2.0", "@eslint/js": "9.16.0", "@microsoft/eslint-formatter-sarif": "3.1.0", - "@trivago/prettier-plugin-sort-imports": "4.3.0", + "@trivago/prettier-plugin-sort-imports": "5.2.0", "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.14", @@ -220,46 +220,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", @@ -301,19 +261,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -2690,147 +2637,40 @@ } }, "node_modules/@trivago/prettier-plugin-sort-imports": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz", - "integrity": "sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-5.2.0.tgz", + "integrity": "sha512-yEIJ7xMKYQwyNRjxSdi4Gs37iszikAjxfky+3hu9bn24u8eHLJNDMAoOTyowp8p6EpSl8IQMdkfBx+WnJTttsw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@babel/generator": "7.17.7", - "@babel/parser": "^7.20.5", - "@babel/traverse": "7.23.2", - "@babel/types": "7.17.0", - "javascript-natural-sort": "0.7.1", + "@babel/generator": "^7.26.2", + "@babel/parser": "^7.26.2", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "javascript-natural-sort": "^0.7.1", "lodash": "^4.17.21" }, + "engines": { + "node": ">18.12" + }, "peerDependencies": { "@vue/compiler-sfc": "3.x", - "prettier": "2.x - 3.x" + "prettier": "2.x - 3.x", + "prettier-plugin-svelte": "3.x", + "svelte": "4.x" }, "peerDependenciesMeta": { "@vue/compiler-sfc": { "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + }, + "svelte": { + "optional": true } } }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/traverse/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -8679,16 +8519,6 @@ "@popperjs/core": "^2.9.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 64230a129..03ff840b4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -47,7 +47,7 @@ "@eslint/eslintrc": "3.2.0", "@eslint/js": "9.16.0", "@microsoft/eslint-formatter-sarif": "3.1.0", - "@trivago/prettier-plugin-sort-imports": "4.3.0", + "@trivago/prettier-plugin-sort-imports": "5.2.0", "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.14", From c5f6fbbc661bffcc016df9d975d63af3427c169d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 20:47:30 +0100 Subject: [PATCH 37/82] fix(deps): update react-admin monorepo to v5.4.2 (#2326) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 52 +++++++++++++++++++------------------- frontend/package.json | 4 +-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c0837e8fb..12d41f65a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,9 +23,9 @@ "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", "query-string": "9.1.1", - "ra-input-rich-text": "5.4.1", + "ra-input-rich-text": "5.4.2", "react": "18.3.1", - "react-admin": "5.4.1", + "react-admin": "5.4.2", "react-chartjs-2": "5.2.0", "react-dom": "18.3.1", "react-is": "18.3.1", @@ -7352,9 +7352,9 @@ "license": "MIT" }, "node_modules/ra-core": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ra-core/-/ra-core-5.4.1.tgz", - "integrity": "sha512-jn1kU3Yn6OMLZFi0Ym3hsNnOo6+qJRp9En61t7MccfY+ultVx2FBWi+EZRoV1+hlVZmO7OcpKJ2dM7Sb5csx1w==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/ra-core/-/ra-core-5.4.2.tgz", + "integrity": "sha512-HxfxhUVl0U6rjobb50wiv3IblnRDQPqHXXv3WNZaUK2/bAZ5qX8qfSHe96quhrzSXbv5FHS4G3aPRxANXWVauQ==", "license": "MIT", "dependencies": { "@tanstack/react-query": "^5.21.7", @@ -7422,19 +7422,19 @@ } }, "node_modules/ra-i18n-polyglot": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ra-i18n-polyglot/-/ra-i18n-polyglot-5.4.1.tgz", - "integrity": "sha512-2UIFk7yUbicCU1dpo8bdWSeAMKffjg82JaDRuoUU/eo0LkXGz0VrmFqhC4OQQ1CSMrFx+NuhD/7vFbRFOPzcww==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/ra-i18n-polyglot/-/ra-i18n-polyglot-5.4.2.tgz", + "integrity": "sha512-twBYo++iTCejdJBpROgl6uQKOwv5hyv/df3w/vWrYudpdjbudGTpj/B8Q5Rfax4op6K8dGCtOkBdNbK0XM/T9A==", "license": "MIT", "dependencies": { "node-polyglot": "^2.2.2", - "ra-core": "^5.4.1" + "ra-core": "^5.4.2" } }, "node_modules/ra-input-rich-text": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ra-input-rich-text/-/ra-input-rich-text-5.4.1.tgz", - "integrity": "sha512-RCWGFd5C4V8Vtx6UBdTW1Cr5kQk8gqisNdJc7bqqmc8vxaR5igF1Etw7+qbSvsHBbiseclbt+0OOfKNaKv6wZQ==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/ra-input-rich-text/-/ra-input-rich-text-5.4.2.tgz", + "integrity": "sha512-kgZDijdSc8d5UbmqD0z9VjNMOw7nMU/DFTRfGD++f9gP1p2jaU4ECYZduxETGpCxOVftzro+WfmaZt+6IRsS1g==", "license": "MIT", "dependencies": { "@tiptap/core": "^2.0.3", @@ -7461,18 +7461,18 @@ } }, "node_modules/ra-language-english": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ra-language-english/-/ra-language-english-5.4.1.tgz", - "integrity": "sha512-coeh3CgGNYfAVngXBaa+euIAqIr1xSGC5ZnaOjehMfeA763BdoNUE7PJ25ExrBmuXhIBOuXuUW5y+q0/DNp/yw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/ra-language-english/-/ra-language-english-5.4.2.tgz", + "integrity": "sha512-gQ6lRFRDzvuhPwq9+CXiJD6bF1Fjyuuk+PS/hUeQ7bxx4N0vJXK7Pe+GNLKEq+XD9rw9mFyU/0tOX/Pa9xy9iQ==", "license": "MIT", "dependencies": { - "ra-core": "^5.4.1" + "ra-core": "^5.4.2" } }, "node_modules/ra-ui-materialui": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ra-ui-materialui/-/ra-ui-materialui-5.4.1.tgz", - "integrity": "sha512-d1v9k/6+1HAQiKe0BN3kusD4SbpY9GLMwDbilmidcHCiqzpzvJiVdWgBtxTwd7oz2rBIQFHW34Pehzw7NlEoCQ==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/ra-ui-materialui/-/ra-ui-materialui-5.4.2.tgz", + "integrity": "sha512-bVR86VpjwMEVUcJptungxFeBra+27K6ERflabTxSzcRi3T2BOTwFF8dt4KGJ2/o7ejAHRKyjAWJLMOvT3gXQRA==", "license": "MIT", "dependencies": { "@tanstack/react-query": "^5.21.7", @@ -7565,19 +7565,19 @@ } }, "node_modules/react-admin": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/react-admin/-/react-admin-5.4.1.tgz", - "integrity": "sha512-ksQrCJHpIeTgE5NaABTVQh6hDqcZ1rPBRN+9gjG3oJqJGLisoYnUhKQc7stREnai2rxuT+vWufZg291kOOFUmQ==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/react-admin/-/react-admin-5.4.2.tgz", + "integrity": "sha512-zww+s8B8g44feQfib4zV8qU4KfH968KloKuJ75knLifGlHVxlryzwJLdnIA1v5AQN/DCK1kQUSpo8LBiYau4mg==", "license": "MIT", "dependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "@mui/icons-material": "^5.15.20", "@mui/material": "^5.15.20", - "ra-core": "^5.4.1", - "ra-i18n-polyglot": "^5.4.1", - "ra-language-english": "^5.4.1", - "ra-ui-materialui": "^5.4.1", + "ra-core": "^5.4.2", + "ra-i18n-polyglot": "^5.4.2", + "ra-language-english": "^5.4.2", + "ra-ui-materialui": "^5.4.2", "react-hook-form": "^7.53.0", "react-router": "^6.22.0", "react-router-dom": "^6.22.0" diff --git a/frontend/package.json b/frontend/package.json index 03ff840b4..4c4ac74ca 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,9 +19,9 @@ "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", "query-string": "9.1.1", - "ra-input-rich-text": "5.4.1", + "ra-input-rich-text": "5.4.2", "react": "18.3.1", - "react-admin": "5.4.1", + "react-admin": "5.4.2", "react-chartjs-2": "5.2.0", "react-dom": "18.3.1", "react-is": "18.3.1", From fd80951fd16edfbc8f9ea2295e7834a93ff72cb0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:06:18 +0100 Subject: [PATCH 38/82] chore(deps): update typescript-eslint monorepo to v8.18.0 (#2327) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 130 ++++++++++++++++--------------------- frontend/package.json | 4 +- 2 files changed, 58 insertions(+), 76 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 12d41f65a..18272019a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -45,8 +45,8 @@ "@types/react": "18.3.14", "@types/react-dom": "18.3.2", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.17.0", - "@typescript-eslint/parser": "8.17.0", + "@typescript-eslint/eslint-plugin": "8.18.0", + "@typescript-eslint/parser": "8.18.0", "@vitejs/plugin-react": "4.3.4", "eslint": "9.16.0", "eslint-plugin-react": "7.37.2", @@ -3094,17 +3094,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", - "integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", + "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/type-utils": "8.17.0", - "@typescript-eslint/utils": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/type-utils": "8.18.0", + "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3119,25 +3119,21 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz", - "integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", + "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MITClause", "dependencies": { - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "debug": "^4.3.4" }, "engines": { @@ -3148,23 +3144,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz", - "integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", + "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0" + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3175,14 +3167,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz", - "integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", + "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.17.0", - "@typescript-eslint/utils": "8.17.0", + "@typescript-eslint/typescript-estree": "8.18.0", + "@typescript-eslint/utils": "8.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3194,18 +3186,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz", - "integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", + "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", "dev": true, "license": "MIT", "engines": { @@ -3217,14 +3205,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz", - "integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", + "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/visitor-keys": "8.17.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/visitor-keys": "8.18.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3239,10 +3227,8 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -3272,16 +3258,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz", - "integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", + "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.17.0", - "@typescript-eslint/types": "8.17.0", - "@typescript-eslint/typescript-estree": "8.17.0" + "@typescript-eslint/scope-manager": "8.18.0", + "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3291,22 +3277,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz", - "integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", + "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.17.0", + "@typescript-eslint/types": "8.18.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { diff --git a/frontend/package.json b/frontend/package.json index 4c4ac74ca..6c7910576 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,8 +54,8 @@ "@types/react": "18.3.14", "@types/react-dom": "18.3.2", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.17.0", - "@typescript-eslint/parser": "8.17.0", + "@typescript-eslint/eslint-plugin": "8.18.0", + "@typescript-eslint/parser": "8.18.0", "@vitejs/plugin-react": "4.3.4", "eslint": "9.16.0", "eslint-plugin-react": "7.37.2", From 068c52c2193c25d0442f1f4560aad7172cb089fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:15:13 +0100 Subject: [PATCH 39/82] chore(deps): update dependency @types/react-dom to v18.3.3 (#2328) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 12 ++++++------ frontend/package.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 18272019a..d42ce5503 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -43,7 +43,7 @@ "@types/node": "22.10.1", "@types/prop-types": "15.7.14", "@types/react": "18.3.14", - "@types/react-dom": "18.3.2", + "@types/react-dom": "18.3.3", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.0", "@typescript-eslint/parser": "8.18.0", @@ -3051,13 +3051,13 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.2.tgz", - "integrity": "sha512-Fqp+rcvem9wEnGr3RY8dYNvSQ8PoLqjZ9HLgaPUOjJJD120uDyOxOjc/39M4Kddp9JQCxpGQbnhVQF0C0ncYVg==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.3.tgz", + "integrity": "sha512-uTYkxTLkYp41nq/ULXyXMtkNT1vu5fXJoqad6uTNCOGat5t9cLgF4vMNLBXsTOXpdOI44XzKPY1M5RRm0bQHuw==", "dev": true, "license": "MIT", - "dependencies": { - "@types/react": "^18" + "peerDependencies": { + "@types/react": "^18.0.0" } }, "node_modules/@types/react-transition-group": { diff --git a/frontend/package.json b/frontend/package.json index 6c7910576..fd31aa5da 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -52,7 +52,7 @@ "@types/node": "22.10.1", "@types/prop-types": "15.7.14", "@types/react": "18.3.14", - "@types/react-dom": "18.3.2", + "@types/react-dom": "18.3.3", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.0", "@typescript-eslint/parser": "8.18.0", From ebe905d36b183b19604e26799c5c8a9d3e43916f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:19:29 +0100 Subject: [PATCH 40/82] chore(deps): update dependency @playwright/test to v1.49.1 (#2329) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- end_to_end_tests/package-lock.json | 24 ++++++++++++------------ end_to_end_tests/package.json | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/end_to_end_tests/package-lock.json b/end_to_end_tests/package-lock.json index 8503e8d0d..b5beaf148 100644 --- a/end_to_end_tests/package-lock.json +++ b/end_to_end_tests/package-lock.json @@ -8,18 +8,18 @@ "name": "end_to_end_tests", "version": "1.22.5", "devDependencies": { - "@playwright/test": "1.49.0", + "@playwright/test": "1.49.1", "@types/node": "22.10.1" } }, "node_modules/@playwright/test": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0.tgz", - "integrity": "sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", + "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.49.0" + "playwright": "1.49.1" }, "bin": { "playwright": "cli.js" @@ -54,13 +54,13 @@ } }, "node_modules/playwright": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", - "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", + "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.49.0" + "playwright-core": "1.49.1" }, "bin": { "playwright": "cli.js" @@ -73,9 +73,9 @@ } }, "node_modules/playwright-core": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", - "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", + "version": "1.49.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", + "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/end_to_end_tests/package.json b/end_to_end_tests/package.json index 46730d02a..c5b3c9cf1 100644 --- a/end_to_end_tests/package.json +++ b/end_to_end_tests/package.json @@ -8,7 +8,7 @@ "keywords": [], "author": "", "devDependencies": { - "@playwright/test": "1.49.0", + "@playwright/test": "1.49.1", "@types/node": "22.10.1" } } From 8086119a38552b17fb5d9660bc63238961d50807 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:24:50 +0100 Subject: [PATCH 41/82] chore(deps): update mcr.microsoft.com/playwright docker tag to v1.49.1 (#2330) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker-compose-playwright.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-playwright.yml b/docker-compose-playwright.yml index 359ec09a3..b152aa168 100644 --- a/docker-compose-playwright.yml +++ b/docker-compose-playwright.yml @@ -58,7 +58,7 @@ services: playwright: - image: mcr.microsoft.com/playwright:v1.49.0 + image: mcr.microsoft.com/playwright:v1.49.1 depends_on: - frontend environment: From e49c119f3946e3a93c29dca6691df24ed1cb4921 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:37:57 +0100 Subject: [PATCH 42/82] chore(deps): update github/codeql-action action to v3.27.7 (#2332) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 215ad7574..b9b8d4204 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@aa578102511db1f4524ed59b8cc2bae4f6e88195 # v3.27.6 + uses: github/codeql-action/upload-sarif@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 with: sarif_file: results.sarif From 74aca4da9122fc4f79ab6ce59091f81626647186 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 06:52:25 +0100 Subject: [PATCH 43/82] chore(deps): update react monorepo (#2334) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 16 ++++++++-------- frontend/package.json | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d42ce5503..e7a2e82ed 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,8 +42,8 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.14", - "@types/react": "18.3.14", - "@types/react-dom": "18.3.3", + "@types/react": "18.3.16", + "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.0", "@typescript-eslint/parser": "8.18.0", @@ -3041,9 +3041,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.14.tgz", - "integrity": "sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==", + "version": "18.3.16", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.16.tgz", + "integrity": "sha512-oh8AMIC4Y2ciKufU8hnKgs+ufgbA/dhPTACaZPM86AbwX9QwnFtSoPWEeRUj8fge+v6kFt78BXcDhAU1SrrAsw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -3051,9 +3051,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.3.tgz", - "integrity": "sha512-uTYkxTLkYp41nq/ULXyXMtkNT1vu5fXJoqad6uTNCOGat5t9cLgF4vMNLBXsTOXpdOI44XzKPY1M5RRm0bQHuw==", + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, "license": "MIT", "peerDependencies": { diff --git a/frontend/package.json b/frontend/package.json index fd31aa5da..2f68e9398 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -51,8 +51,8 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.1", "@types/prop-types": "15.7.14", - "@types/react": "18.3.14", - "@types/react-dom": "18.3.3", + "@types/react": "18.3.16", + "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.0", "@typescript-eslint/parser": "8.18.0", From 5fd35dce29e29e1f76034f1dd6edf290ffefc699 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 17:57:10 +0100 Subject: [PATCH 44/82] chore(deps): update traefik docker tag to v3.2.2 (#2335) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docker-compose-prod-mysql.yml | 2 +- docker-compose-prod-postgres.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-prod-mysql.yml b/docker-compose-prod-mysql.yml index 3dfdaae3a..e0dcbbb4a 100644 --- a/docker-compose-prod-mysql.yml +++ b/docker-compose-prod-mysql.yml @@ -10,7 +10,7 @@ networks: services: traefik: - image: "traefik:v3.2.1" + image: "traefik:v3.2.2" container_name: "prod_traefik" command: - "--log.level=INFO" diff --git a/docker-compose-prod-postgres.yml b/docker-compose-prod-postgres.yml index cfa57ca5d..c74f1842e 100644 --- a/docker-compose-prod-postgres.yml +++ b/docker-compose-prod-postgres.yml @@ -10,7 +10,7 @@ networks: services: traefik: - image: "traefik:v3.2.1" + image: "traefik:v3.2.2" container_name: "prod_traefik" command: - "--log.level=INFO" From 1930d46594a10eaf513f3cd0975020bb5473a756 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:03:07 +0100 Subject: [PATCH 45/82] chore(deps): update dependency @types/node to v22.10.2 (#2336) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- end_to_end_tests/package-lock.json | 8 ++++---- end_to_end_tests/package.json | 2 +- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/end_to_end_tests/package-lock.json b/end_to_end_tests/package-lock.json index b5beaf148..81826e121 100644 --- a/end_to_end_tests/package-lock.json +++ b/end_to_end_tests/package-lock.json @@ -9,7 +9,7 @@ "version": "1.22.5", "devDependencies": { "@playwright/test": "1.49.1", - "@types/node": "22.10.1" + "@types/node": "22.10.2" } }, "node_modules/@playwright/test": { @@ -29,9 +29,9 @@ } }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/end_to_end_tests/package.json b/end_to_end_tests/package.json index c5b3c9cf1..e29953097 100644 --- a/end_to_end_tests/package.json +++ b/end_to_end_tests/package.json @@ -9,6 +9,6 @@ "author": "", "devDependencies": { "@playwright/test": "1.49.1", - "@types/node": "22.10.1" + "@types/node": "22.10.2" } } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e7a2e82ed..891d51ff1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -40,7 +40,7 @@ "@microsoft/eslint-formatter-sarif": "3.1.0", "@trivago/prettier-plugin-sort-imports": "5.2.0", "@types/inflection": "1.13.2", - "@types/node": "22.10.1", + "@types/node": "22.10.2", "@types/prop-types": "15.7.14", "@types/react": "18.3.16", "@types/react-dom": "18.3.5", @@ -3019,9 +3019,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 2f68e9398..399623ed7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -49,7 +49,7 @@ "@microsoft/eslint-formatter-sarif": "3.1.0", "@trivago/prettier-plugin-sort-imports": "5.2.0", "@types/inflection": "1.13.2", - "@types/node": "22.10.1", + "@types/node": "22.10.2", "@types/prop-types": "15.7.14", "@types/react": "18.3.16", "@types/react-dom": "18.3.5", From a61a360e9e05c5b105bd1c6b9bb0fd639961fc15 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Wed, 11 Dec 2024 21:09:50 +0000 Subject: [PATCH 46/82] feat: top level observation review list (#2337) --- backend/application/core/api/filters.py | 50 ++- .../core/api/serializers_observation.py | 4 + backend/application/core/api/views.py | 35 +- frontend/src/App.tsx | 4 + frontend/src/commons/layout/Menu.tsx | 2 +- .../AssessmentBulkApproval.tsx | 6 +- .../ObservationLogApprovalEmbeddedList.tsx | 180 ---------- .../ObservationLogApprovalList.tsx | 310 +++++++++++++----- .../ObservationLogEmbeddedList.tsx | 2 +- .../observation_logs/ObservationLogShow.tsx | 4 +- .../observations/ObservationReviewList.tsx | 120 +++++-- .../src/core/observations/ObservationShow.tsx | 6 +- frontend/src/core/observations/functions.ts | 2 + frontend/src/core/products/ProductReviews.tsx | 4 +- frontend/src/core/reviews/Reviews.tsx | 139 ++++++++ 15 files changed, 559 insertions(+), 309 deletions(-) delete mode 100644 frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx create mode 100644 frontend/src/core/reviews/Reviews.tsx diff --git a/backend/application/core/api/filters.py b/backend/application/core/api/filters.py index 74f979070..5fedab57d 100644 --- a/backend/application/core/api/filters.py +++ b/backend/application/core/api/filters.py @@ -284,16 +284,58 @@ class ObservationLogFilter(FilterSet): origin_component_name_version = CharFilter( field_name="observation__origin_component_name_version", lookup_expr="icontains" ) + origin_docker_image_name_tag_short = CharFilter( + field_name="observation__origin_docker_image_name_tag_short", + lookup_expr="icontains", + ) + origin_endpoint_hostname = CharFilter( + field_name="observation__origin_endpoint_hostname", lookup_expr="icontains" + ) + origin_source_file = CharFilter( + field_name="observation__origin_source_file", lookup_expr="icontains" + ) + origin_cloud_qualified_resource = CharFilter( + field_name="observation__origin_cloud_qualified_resource", + lookup_expr="icontains", + ) + origin_kubernetes_qualified_resource = CharFilter( + field_name="observation__origin_kubernetes_qualified_resource", + lookup_expr="icontains", + ) ordering = OrderingFilter( # tuple-mapping retains order fields=( ("id", "id"), ("user__full_name", "user_full_name"), - ("observation__product__name", "product_name"), - ("observation__product__product_group__name", "product.product_group_name"), - ("observation__branch__name", "branch_name"), - ("observation__title", "observation_title"), + ("observation__product__name", "observation_data.product_data.name"), + ( + "observation__product__product_group__name", + "observation_data.product_data.product_group_name", + ), + ("observation__branch__name", "observation_data.branch_name"), + ("observation__title", "observation_data.title"), + ( + "observation__origin_component_name_version", + "observation_data.origin_component_name_version", + ), + ( + "observation__origin_docker_image_name_tag_short", + "observation_data.origin_docker_image_name_tag_short", + ), + ( + "observation__origin_endpoint_hostname", + "observation_data.origin_endpoint_hostname", + ), + ("observation__origin_source_file", "observation_data.origin_source_file"), + ( + "observation__origin_cloud_qualified_resource", + "observation_data.origin_cloud_qualified_resource", + ), + ( + "observation__origin_kubernetes_qualified_resource", + "observation_data.origin_kubernetes_qualified_resource", + ), ("severity", "severity"), ("status", "status"), ("comment", "comment"), diff --git a/backend/application/core/api/serializers_observation.py b/backend/application/core/api/serializers_observation.py index e6decdacc..0802433eb 100644 --- a/backend/application/core/api/serializers_observation.py +++ b/backend/application/core/api/serializers_observation.py @@ -593,3 +593,7 @@ class PotentialDuplicateSerializer(ModelSerializer): class Meta: model = Potential_Duplicate fields = "__all__" + + +class CountSerializer(Serializer): + count = IntegerField() diff --git a/backend/application/core/api/views.py b/backend/application/core/api/views.py index 14029af39..409648239 100644 --- a/backend/application/core/api/views.py +++ b/backend/application/core/api/views.py @@ -12,7 +12,7 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.request import Request from rest_framework.response import Response -from rest_framework.status import HTTP_204_NO_CONTENT +from rest_framework.status import HTTP_200_OK, HTTP_204_NO_CONTENT from rest_framework.viewsets import GenericViewSet, ModelViewSet from application.access_control.services.authorization import user_has_permission_or_403 @@ -40,6 +40,7 @@ UserHasServicePermission, ) from application.core.api.serializers_observation import ( + CountSerializer, EvidenceSerializer, ObservationAssessmentSerializer, ObservationBulkAssessmentSerializer, @@ -626,6 +627,18 @@ def bulk_assessment(self, request): ) return Response(status=HTTP_204_NO_CONTENT) + @extend_schema( + methods=["GET"], + request=None, + responses={HTTP_200_OK: CountSerializer}, + ) + @action(detail=False, methods=["get"]) + def count_reviews(self, request): + count = ( + get_observations().filter(current_status=Status.STATUS_IN_REVIEW).count() + ) + return Response(status=HTTP_200_OK, data={"count": count}) + class ObservationTitleViewSet(GenericViewSet, ListModelMixin, RetrieveModelMixin): serializer_class = ObservationTitleSerializer @@ -684,11 +697,11 @@ def approval(self, request, pk=None): return Response() @extend_schema( - methods=["PATCH"], + methods=["POST"], request=ObservationLogBulkApprovalSerializer, responses={HTTP_204_NO_CONTENT: None}, ) - @action(detail=False, methods=["patch"]) + @action(detail=False, methods=["post"]) def bulk_approval(self, request): request_serializer = ObservationLogBulkApprovalSerializer(data=request.data) if not request_serializer.is_valid(): @@ -701,6 +714,22 @@ def bulk_approval(self, request): ) return Response(status=HTTP_204_NO_CONTENT) + @extend_schema( + methods=["GET"], + request=None, + responses={HTTP_200_OK: CountSerializer}, + ) + @action(detail=False, methods=["get"]) + def count_approvals(self, request): + count = ( + get_observation_logs() + .filter( + assessment_status=Assessment_Status.ASSESSMENT_STATUS_NEEDS_APPROVAL + ) + .count() + ) + return Response(status=HTTP_200_OK, data={"count": count}) + class EvidenceViewSet(GenericViewSet, ListModelMixin, RetrieveModelMixin): serializer_class = EvidenceSerializer diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index fad286a14..e72078220 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -22,6 +22,7 @@ import observation_logs from "./core/observation_logs"; import observations from "./core/observations"; import product_groups from "./core/product_groups"; import products from "./core/products"; +import Reviews from "./core/reviews/Reviews"; import { Dashboard } from "./dashboard"; import parsers from "./import_observations/parsers"; import LicenseAdministration from "./licenses/license_administration/LicenseAdministration"; @@ -65,6 +66,9 @@ const App = () => { } /> } /> } /> + } /> + } /> + } /> } /> { dense={dense} /> } diff --git a/frontend/src/core/observation_logs/AssessmentBulkApproval.tsx b/frontend/src/core/observation_logs/AssessmentBulkApproval.tsx index cca8cc8da..c6721c7cf 100644 --- a/frontend/src/core/observation_logs/AssessmentBulkApproval.tsx +++ b/frontend/src/core/observation_logs/AssessmentBulkApproval.tsx @@ -19,15 +19,15 @@ const AssessmentBulkApproval = () => { const assessmentUpdate = async (data: any) => { setLoading(true); - const patch = { + const post_data = { assessment_status: data.assessment_status, approval_remark: data.approval_remark, observation_logs: selectedIds, }; httpClient(window.__RUNTIME_CONFIG__.API_BASE_URL + "/observation_logs/bulk_approval/", { - method: "PATCH", - body: JSON.stringify(patch), + method: "POST", + body: JSON.stringify(post_data), }) .then(() => { refresh(); diff --git a/frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx b/frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx deleted file mode 100644 index 7cf608490..000000000 --- a/frontend/src/core/observation_logs/ObservationLogApprovalEmbeddedList.tsx +++ /dev/null @@ -1,180 +0,0 @@ -import { - AutocompleteInput, - Datagrid, - DateField, - FilterForm, - FunctionField, - ListContextProvider, - ReferenceInput, - ResourceContextProvider, - TextField, - TextInput, - useListController, -} from "react-admin"; - -import { CustomPagination } from "../../commons/custom_fields/CustomPagination"; -import { feature_vex_enabled } from "../../commons/functions"; -import { AutocompleteInputMedium } from "../../commons/layout/themes"; -import { getSettingListSize } from "../../commons/user_settings/functions"; -import { ASSESSMENT_STATUS_NEEDS_APPROVAL } from "../types"; -import { OBSERVATION_SEVERITY_CHOICES, OBSERVATION_STATUS_CHOICES } from "../types"; -import { commentShortened } from "./functions"; - -function listFilters(product: any) { - const filters = []; - if (product && product.has_branches) { - filters.push( - - - - ); - } - filters.push(); - - if (product && product.has_component) { - filters.push(); - } - if (product && product.has_docker_image) { - filters.push(); - } - if (product && product.has_endpoint) { - filters.push(); - } - if (product && product.has_source) { - filters.push(); - } - if (product && product.has_cloud_resource) { - filters.push(); - } - if (product && product.has_kubernetes_resource) { - filters.push(); - } - - filters.push( - - - , - , - - ); - return filters; -} - -type ObservationLogApprovalEmbeddedListProps = { - product: any; -}; - -const ObservationLogApprovalEmbeddedList = ({ product }: ObservationLogApprovalEmbeddedListProps) => { - const listContext = useListController({ - filter: { product: Number(product.id), assessment_status: ASSESSMENT_STATUS_NEEDS_APPROVAL }, - perPage: 25, - resource: "observation_logs", - sort: { field: "created", order: "ASC" }, - disableSyncWithLocation: true, - storeKey: "observation_logs.approvalembedded", - }); - - if (listContext.isLoading) { - return
Loading...
; - } - - const ShowObservationLogs = (id: any) => { - return "../../../../observation_logs/" + id + "/show"; - }; - - localStorage.setItem("observationlogapprovalembeddedlist", "true"); - localStorage.removeItem("observationlogapprovallist"); - localStorage.removeItem("observationlogembeddedlist"); - - return ( - - -
- - - {product && product.has_branches && ( - - )} - - {product && product.has_component && ( - - )} - {product && product.has_docker_image && ( - - )} - {product && product.has_endpoint && ( - - )} - {product && product.has_source && ( - - )} - {product && product.has_cloud_resource && ( - - )} - {product && product.has_kubernetes_resource && ( - - )} - - - - {feature_vex_enabled() && ( - - )} - commentShortened(record.comment)} - sortable={false} - sx={{ wordBreak: "break-word" }} - /> - - - -
-
-
- ); -}; - -export default ObservationLogApprovalEmbeddedList; diff --git a/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx b/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx index 6b88f9d9e..efeb964d1 100644 --- a/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx +++ b/frontend/src/core/observation_logs/ObservationLogApprovalList.tsx @@ -1,19 +1,21 @@ -import ChecklistIcon from "@mui/icons-material/Checklist"; import { AutocompleteInput, Datagrid, DateField, + FilterForm, FunctionField, - List, + ListContextProvider, ReferenceInput, + ResourceContextProvider, TextField, TextInput, + useListController, } from "react-admin"; import { Fragment } from "react/jsx-runtime"; +import { PERMISSION_OBSERVATION_LOG_APPROVAL } from "../../access_control/types"; import { CustomPagination } from "../../commons/custom_fields/CustomPagination"; import { feature_vex_enabled } from "../../commons/functions"; -import ListHeader from "../../commons/layout/ListHeader"; import { AutocompleteInputMedium, AutocompleteInputWide } from "../../commons/layout/themes"; import { getSettingListSize } from "../../commons/user_settings/functions"; import { ASSESSMENT_STATUS_NEEDS_APPROVAL } from "../types"; @@ -21,94 +23,234 @@ import { OBSERVATION_SEVERITY_CHOICES, OBSERVATION_STATUS_CHOICES } from "../typ import AssessmentBulkApproval from "./AssessmentBulkApproval"; import { commentShortened } from "./functions"; -const BulkActionButtons = () => ( - - - -); +const BulkActionButtons = ({ product }: any) => { + return ( + + {(!product || (product && product.permissions.includes(PERMISSION_OBSERVATION_LOG_APPROVAL))) && ( + + )} + + ); +}; + +function listFilters(product: any) { + const filters = []; + if (!product) { + filters.push( + + + + ); + } + if (!product) { + filters.push( + + + + ); + } + if (!product) { + filters.push( + + + + ); + } + + if (product && product.has_branches) { + filters.push( + + + + ); + } -const listFilters = [ - - - , - - - , - - - , - , - - - , - , - , - , -]; + filters.push(); -const ObservationLogApprovalList = () => { - localStorage.setItem("observationlogapprovallist", "true"); - localStorage.removeItem("observationlogapprovalembeddedlist"); + if (!product || (product && product.has_component)) { + filters.push(); + } + if (!product || (product && product.has_docker_image)) { + filters.push(); + } + if (!product || (product && product.has_endpoint)) { + filters.push(); + } + if (!product || (product && product.has_source)) { + filters.push(); + } + if (!product || (product && product.has_cloud_resource)) { + filters.push(); + } + if (!product || (product && product.has_kubernetes_resource)) { + filters.push(); + } + + filters.push( + + + , + , + + ); + return filters; +} + +type ObservationLogApprovalListProps = { + product?: any; +}; + +const ObservationLogApprovalList = ({ product }: ObservationLogApprovalListProps) => { + let filter = {}; + filter = { assessment_status: ASSESSMENT_STATUS_NEEDS_APPROVAL }; + if (product) { + filter = { ...filter, product: Number(product.id) }; + } + let storeKey = "observation_logs.approval"; + if (product) { + storeKey = "observation_logs.approvalproduct"; + } + const listContext = useListController({ + filter: filter, + perPage: 25, + resource: "observation_logs", + sort: { field: "created", order: "ASC" }, + disableSyncWithLocation: true, + storeKey: storeKey, + }); + + if (listContext.isLoading) { + return
Loading...
; + } + + const ShowObservationLogs = (id: any) => { + return "../../../../observation_logs/" + id + "/show"; + }; + + if (product) { + localStorage.setItem("observationlogapprovallistproduct", "true"); + localStorage.removeItem("observationlogapprovallist"); + } else { + localStorage.setItem("observationlogapprovallist", "true"); + localStorage.removeItem("observationlogapprovallistproduct"); + } localStorage.removeItem("observationlogembeddedlist"); return ( - - - } - filters={listFilters} - sort={{ field: "created", order: "ASC" }} - disableSyncWithLocation={false} - storeKey="observation_logs.approval" - actions={false} - sx={{ marginTop: 1 }} - > - }> - - - - - - - - {feature_vex_enabled() && ( - + +
+ + + ) + } + rowClick={ShowObservationLogs} + resource="observation_logs" + > + {!product && } + {!product && ( + + )} + {(!product || (product && product.has_branches)) && ( + + )} + + {(!product || (product && product.has_component)) && ( + + )} + {(!product || (product && product.has_docker_image)) && ( + + )} + {(!product || (product && product.has_endpoint)) && ( + + )} + {(!product || (product && product.has_source)) && ( + + )} + {(!product || (product && product.has_cloud_resource)) && ( + + )} + {(!product || (product && product.has_kubernetes_resource)) && ( + + )} + + + + {feature_vex_enabled() && ( + + )} + commentShortened(record.comment)} + sortable={false} sx={{ wordBreak: "break-word" }} /> - )} - commentShortened(record.comment)} - sortable={false} - sx={{ wordBreak: "break-word" }} - /> - - - - + + + +
+
+ ); }; diff --git a/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx b/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx index 9f54f918a..1d2a1eef9 100644 --- a/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx +++ b/frontend/src/core/observation_logs/ObservationLogEmbeddedList.tsx @@ -44,8 +44,8 @@ const ObservationLogEmbeddedList = ({ observation }: ObservationLogEmbeddedListP }; localStorage.setItem("observationlogembeddedlist", "true"); - localStorage.removeItem("observationlogapprovalembeddedlist"); localStorage.removeItem("observationlogapprovallist"); + localStorage.removeItem("observationlogapprovallistproduct"); return ( diff --git a/frontend/src/core/observation_logs/ObservationLogShow.tsx b/frontend/src/core/observation_logs/ObservationLogShow.tsx index 47d2c635d..8c0153ccf 100644 --- a/frontend/src/core/observation_logs/ObservationLogShow.tsx +++ b/frontend/src/core/observation_logs/ObservationLogShow.tsx @@ -43,14 +43,14 @@ const ShowActions = () => { if ( observation_log && observation_log.observation_data && - localStorage.getItem("observationlogapprovalembeddedlist") + localStorage.getItem("observationlogapprovallistproduct") ) { filter = { product: observation_log.observation_data.product, assessment_status: ASSESSMENT_STATUS_NEEDS_APPROVAL, }; sort = { field: "created", order: "ASC" }; - storeKey = "observation_logs.approvalembedded"; + storeKey = "observation_logs.approvalproduct"; } return ( diff --git a/frontend/src/core/observations/ObservationReviewList.tsx b/frontend/src/core/observations/ObservationReviewList.tsx index 58f36bd59..63f68a719 100644 --- a/frontend/src/core/observations/ObservationReviewList.tsx +++ b/frontend/src/core/observations/ObservationReviewList.tsx @@ -20,23 +20,65 @@ import { PERMISSION_OBSERVATION_ASSESSMENT } from "../../access_control/types"; import { CustomPagination } from "../../commons/custom_fields/CustomPagination"; import { SeverityField } from "../../commons/custom_fields/SeverityField"; import { humanReadableDate } from "../../commons/functions"; -import { AutocompleteInputMedium } from "../../commons/layout/themes"; +import { AutocompleteInputMedium, AutocompleteInputWide } from "../../commons/layout/themes"; import { getSettingListSize } from "../../commons/user_settings/functions"; import { AGE_CHOICES, OBSERVATION_SEVERITY_CHOICES, OBSERVATION_STATUS_IN_REVIEW, - OBSERVATION_STATUS_OPEN, Observation, PURL_TYPE_CHOICES, Product, } from "../types"; import ObservationBulkAssessment from "./ObservationBulkAssessment"; import ObservationExpand from "./ObservationExpand"; -import { IDENTIFIER_OBSERVATION_REVIEW_LIST, setListIdentifier } from "./functions"; +import { + IDENTIFIER_OBSERVATION_REVIEW_LIST, + IDENTIFIER_OBSERVATION_REVIEW_LIST_PRODUCT, + setListIdentifier, +} from "./functions"; function listFilters(product: Product) { const filters = []; + if (!product) { + filters.push( + + + + ); + } + if (!product) { + filters.push( + + + + ); + } + if (!product) { + filters.push( + + + + ); + } if (product && product.has_branches) { filters.push( ); filters.push( ); } - if (product && product.has_docker_image) { + if (!product || (product && product.has_docker_image)) { filters.push(); } - if (product && product.has_endpoint) { + if (!product || (product && product.has_endpoint)) { filters.push(); } - if (product && product.has_source) { + if (!product || (product && product.has_source)) { filters.push(); } - if (product && product.has_cloud_resource) { + if (!product || (product && product.has_cloud_resource)) { filters.push(); } - if (product && product.has_kubernetes_resource) { + if (!product || (product && product.has_kubernetes_resource)) { filters.push(); } @@ -110,28 +152,42 @@ const ShowObservations = (id: any) => { }; type ObservationsReviewListProps = { - product: any; + product?: any; }; -const BulkActionButtons = (product: any) => ( +const BulkActionButtons = ({ product }: any) => ( - {product.product.permissions.includes(PERMISSION_OBSERVATION_ASSESSMENT) && ( - + {(!product || (product && product.permissions.includes(PERMISSION_OBSERVATION_ASSESSMENT))) && ( + )} ); const ObservationsReviewList = ({ product }: ObservationsReviewListProps) => { - setListIdentifier(IDENTIFIER_OBSERVATION_REVIEW_LIST); + if (product) { + setListIdentifier(IDENTIFIER_OBSERVATION_REVIEW_LIST_PRODUCT); + } else { + setListIdentifier(IDENTIFIER_OBSERVATION_REVIEW_LIST); + } + + let filter = {}; + filter = { current_status: OBSERVATION_STATUS_IN_REVIEW }; + let filterDefaultValues = {}; + let storeKey = "observations.review"; + if (product) { + filter = { ...filter, product: Number(product.id) }; + filterDefaultValues = { branch: product.repository_default_branch }; + storeKey = "observations.review.product"; + } const listContext = useListController({ - filter: { product: Number(product.id), current_status: OBSERVATION_STATUS_IN_REVIEW }, + filter: filter, perPage: 25, resource: "observations", sort: { field: "current_severity", order: "ASC" }, - filterDefaultValues: { current_status: OBSERVATION_STATUS_OPEN, branch: product.repository_default_branch }, + filterDefaultValues: filterDefaultValues, disableSyncWithLocation: false, - storeKey: "observations.review", + storeKey: storeKey, }); if (listContext.isLoading) { @@ -148,8 +204,8 @@ const ObservationsReviewList = ({ product }: ObservationsReviewListProps) => { sx={{ width: "100%" }} rowClick={ShowObservations} bulkActionButtons={ - product && - product.permissions.includes(PERMISSION_OBSERVATION_ASSESSMENT) && ( + (!product || + (product && product.permissions.includes(PERMISSION_OBSERVATION_ASSESSMENT))) && ( ) } @@ -157,44 +213,52 @@ const ObservationsReviewList = ({ product }: ObservationsReviewListProps) => { expand={} expandSingle > - + {!product && } + {!product && } + {(!product || (product && product.has_branches)) && ( + + )} - {product && product.has_component && } + {(!product || (product && product.has_component)) && ( + + )} - {product && product.has_services && } - {product && product.has_component && ( + {(!product || (product && product.has_services)) && ( + + )} + {(!product || (product && product.has_component)) && ( )} - {product && product.has_docker_image && ( + {(!product || (product && product.has_docker_image)) && ( )} - {product && product.has_endpoint && ( + {(!product || (product && product.has_endpoint)) && ( )} - {product && product.has_source && ( + {(!product || (product && product.has_source)) && ( )} - {product && product.has_cloud_resource && ( + {(!product || (product && product.has_cloud_resource)) && ( )} - {product && product.has_kubernetes_resource && ( + {(!product || (product && product.has_kubernetes_resource)) && ( { @@ -54,8 +55,11 @@ const ShowActions = () => { current_status: OBSERVATION_STATUS_OPEN, }; storeKey = "observations.dashboard"; - } else if (observation && localStorage.getItem(IDENTIFIER_OBSERVATION_REVIEW_LIST) === "true") { + } else if (observation && localStorage.getItem(IDENTIFIER_OBSERVATION_REVIEW_LIST_PRODUCT) === "true") { filter = { product: observation.product, current_status: OBSERVATION_STATUS_IN_REVIEW }; + storeKey = "observations.review.product"; + } else if (localStorage.getItem(IDENTIFIER_OBSERVATION_REVIEW_LIST) === "true") { + filter = { current_status: OBSERVATION_STATUS_IN_REVIEW }; storeKey = "observations.review"; } diff --git a/frontend/src/core/observations/functions.ts b/frontend/src/core/observations/functions.ts index f59b4136d..7272443b1 100644 --- a/frontend/src/core/observations/functions.ts +++ b/frontend/src/core/observations/functions.ts @@ -2,12 +2,14 @@ export const IDENTIFIER_OBSERVATION_LIST = "observationlist"; export const IDENTIFIER_OBSERVATION_EMBEDDED_LIST = "observationembeddedlist"; export const IDENTIFIER_OBSERVATION_DASHBOARD_LIST = "observationdashboardlist"; export const IDENTIFIER_OBSERVATION_REVIEW_LIST = "observationreviewlist"; +export const IDENTIFIER_OBSERVATION_REVIEW_LIST_PRODUCT = "observationreviewlistproduct"; export function setListIdentifier(identifier: string): void { localStorage.removeItem(IDENTIFIER_OBSERVATION_LIST); localStorage.removeItem(IDENTIFIER_OBSERVATION_EMBEDDED_LIST); localStorage.removeItem(IDENTIFIER_OBSERVATION_DASHBOARD_LIST); localStorage.removeItem(IDENTIFIER_OBSERVATION_REVIEW_LIST); + localStorage.removeItem(IDENTIFIER_OBSERVATION_REVIEW_LIST_PRODUCT); localStorage.setItem(identifier, "true"); } diff --git a/frontend/src/core/products/ProductReviews.tsx b/frontend/src/core/products/ProductReviews.tsx index a1bfe5ad0..5d37afc06 100644 --- a/frontend/src/core/products/ProductReviews.tsx +++ b/frontend/src/core/products/ProductReviews.tsx @@ -4,7 +4,7 @@ import { Fragment } from "react"; import { getElevation } from "../../metrics/functions"; import ProductRuleApprovalList from "../../rules/product_rules/ProductRuleApprovalList"; -import ObservationLogApprovalEmbeddedList from "../observation_logs/ObservationLogApprovalEmbeddedList"; +import ObservationLogApprovalList from "../observation_logs/ObservationLogApprovalList"; import ObservationsReviewList from "../observations/ObservationReviewList"; type ProductReviewsProps = { @@ -59,7 +59,7 @@ const ProductReviews = ({ product }: ProductReviewsProps) => { - + )} diff --git a/frontend/src/core/reviews/Reviews.tsx b/frontend/src/core/reviews/Reviews.tsx new file mode 100644 index 000000000..dfc0aa4dc --- /dev/null +++ b/frontend/src/core/reviews/Reviews.tsx @@ -0,0 +1,139 @@ +import ChecklistIcon from "@mui/icons-material/Checklist"; +import { Badge, Box, Divider, Paper, Tab, Tabs } from "@mui/material"; +import { Fragment, useEffect, useState } from "react"; +import { useNotify } from "react-admin"; +import { Link, matchPath, useLocation } from "react-router-dom"; + +import ListHeader from "../../commons/layout/ListHeader"; +import { httpClient } from "../../commons/ra-data-django-rest-framework"; +import observation_logs from "../observation_logs"; +import ObservationLogApprovalList from "../observation_logs/ObservationLogApprovalList"; +import observations from "../observations"; +import ObservationsReviewList from "../observations/ObservationReviewList"; + +function useRouteMatch(patterns: readonly string[]) { + const { pathname } = useLocation(); + + for (const pattern of patterns) { + const possibleMatch = matchPath(pattern, pathname); + if (possibleMatch !== null) { + return possibleMatch; + } + } + return null; +} + +interface TabPanelProps { + children?: React.ReactNode; + index: number; + value: number; +} + +function CustomTabPanel(props: TabPanelProps) { + const { children, value, index, ...other } = props; + return ( + + ); +} + +function a11yProps(index: number) { + return { + id: `simple-tab-${index}`, + "aria-controls": `simple-tabpanel-${index}`, + }; +} + +export default function Reviews() { + const notify = useNotify(); + const [count_observation_reviews, setCountObservationReviews] = useState(0); + const [count_observation_log_approvals, setCountObservationLogApprovals] = useState(0); + + const fetchObservationReviews = async () => { + httpClient(window.__RUNTIME_CONFIG__.API_BASE_URL + "/observations/count_reviews/") + .then((response) => { + setCountObservationReviews(response.json.count); + }) + .catch((error) => { + notify(error.message, { type: "warning" }); + }); + }; + + const fetchObservationLogApprovals = async () => { + httpClient(window.__RUNTIME_CONFIG__.API_BASE_URL + "/observation_logs/count_approvals/") + .then((response) => { + setCountObservationLogApprovals(response.json.count); + }) + .catch((error) => { + notify(error.message, { type: "warning" }); + }); + }; + + useEffect(() => { + fetchObservationReviews(); + fetchObservationLogApprovals(); + }); + const routeMatch = useRouteMatch(["/reviews/observation_reviews", "/reviews/observation_log_approvals"]); + function currentTab(): number { + switch (routeMatch?.pattern?.path) { + case "/reviews/observation_reviews": { + return 0; + } + case "/reviews/observation_log_approvals": { + return 1; + } + default: { + return 0; + } + } + } + + return ( + + + + + + + + } + to="/reviews/observation_reviews" + component={Link} + {...a11yProps(0)} // nosemgrep: typescript.react.best-practice.react-props-spreading.react-props-spreading + // nosemgrep because the props are well defined in the import + /> + + + + } + to="/reviews/observation_log_approvals" + component={Link} + {...a11yProps(1)} // nosemgrep: typescript.react.best-practice.react-props-spreading.react-props-spreading + // nosemgrep because the props are well defined in the import + /> + + + + + + + + + + + ); +} From e0c9f3e6936eb7d4ac3fbed440a1ca6b309590f6 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Thu, 12 Dec 2024 06:19:13 +0000 Subject: [PATCH 47/82] chore: more authentication tests (#2338) * chore: more authentication tests * chore: black --- .../access_control/api/test_authentication.py | 44 ++++++++++++++++--- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/backend/unittests/access_control/api/test_authentication.py b/backend/unittests/access_control/api/test_authentication.py index 478d64e91..17ee024ce 100644 --- a/backend/unittests/access_control/api/test_authentication.py +++ b/backend/unittests/access_control/api/test_authentication.py @@ -248,6 +248,18 @@ def test_authentication(self, mock_user): ) self._check_authentication(["patch"], "/api/observations/1/assessment/") self._check_authentication(["patch"], "/api/observations/1/remove_assessment/") + self._check_authentication(["post"], "/api/observations/bulk_assessment/") + self._check_authentication(["post"], "/api/observations/bulk_approval/") + self._check_authentication(["get"], "/api/observations/count_reviews/") + + self._check_authentication(["get"], "/api/observation_logs/") + self._check_authentication(["get"], "/api/observation_logs/1/") + self._check_authentication(["patch"], "/api/observation_logs/1/approval/") + self._check_authentication(["post"], "/api/observation_logs/bulk_approval/") + self._check_authentication(["get"], "/api/observation_logs/count_approvals/") + + self._check_authentication(["get"], "/api/observation_titles/") + self._check_authentication(["get"], "/api/observation_titles/1/") self._check_authentication(["get"], "/api/parsers/") self._check_authentication(["get"], "/api/parsers/1/") @@ -257,6 +269,9 @@ def test_authentication(self, mock_user): ["delete", "get", "put", "patch"], "/api/branches/1/" ) + self._check_authentication(["get"], "/api/branch_names/") + self._check_authentication(["get"], "/api/branch_names/1/") + self._check_authentication(["get"], "/api/services/") self._check_authentication(["delete", "get"], "/api/services/1/") @@ -275,18 +290,14 @@ def test_authentication(self, mock_user): ["delete", "get", "put", "patch"], "/api/product_groups/1/" ) + self._check_authentication(["get"], "/api/product_group_names/") + self._check_authentication(["get"], "/api/product_group_names/1/") + self._check_authentication(["get", "post"], "/api/products/") self._check_authentication( ["delete", "get", "put", "patch"], "/api/products/1/" ) - self._check_authentication(["get"], "/api/evidences/1/") - - self._check_authentication(["get"], "/api/status/version/") - - self._check_authentication(["get", "post"], "/api/product_api_tokens/") - self._check_authentication(["delete"], "/api/product_api_tokens/1/") - self._check_authentication(["post"], "/api/products/1/apply_rules/") self._check_authentication( @@ -295,6 +306,12 @@ def test_authentication(self, mock_user): self._check_authentication( ["post"], "/api/products/1/observations_bulk_delete/" ) + self._check_authentication( + ["post"], "/api/products/1/observations_bulk_mark_duplicates/" + ) + self._check_authentication( + ["post"], "/api/products/1/license_components_bulk_delete/" + ) self._check_authentication(["get"], "/api/products/1/export_observations_csv/") self._check_authentication( @@ -308,6 +325,16 @@ def test_authentication(self, mock_user): ["get"], "/api/products/1/export_license_components_excel/" ) + self._check_authentication(["get"], "/api/product_names/") + self._check_authentication(["get"], "/api/product_names/1/") + + self._check_authentication(["get"], "/api/evidences/1/") + + self._check_authentication(["get"], "/api/status/version/") + + self._check_authentication(["get", "post"], "/api/product_api_tokens/") + self._check_authentication(["delete"], "/api/product_api_tokens/1/") + self._check_authentication(["get"], "/api/notifications/") self._check_authentication(["delete", "get"], "/api/notifications/1/") self._check_authentication(["post"], "/api/notifications/bulk_delete/") @@ -318,6 +345,9 @@ def test_authentication(self, mock_user): self._check_authentication(["get"], "/api/license_components/") self._check_authentication(["get"], "/api/license_components/1/") + self._check_authentication(["get"], "/api/license_component_ids/") + self._check_authentication(["get"], "/api/license_component_ids/1/") + self._check_authentication(["get"], "/api/license_component_evidences/") self._check_authentication(["get"], "/api/license_component_evidences/1/") From 0b7a59e3d16dd0f4e41b445067cad2e39a2e0b3f Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Thu, 12 Dec 2024 09:31:30 +0000 Subject: [PATCH 48/82] chore: two minor ui changes (#2339) --- .../core/observations/ObservationReviewList.tsx | 4 ++-- .../core/observations/ObservationShowHeader.tsx | 16 +++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/frontend/src/core/observations/ObservationReviewList.tsx b/frontend/src/core/observations/ObservationReviewList.tsx index 63f68a719..92f78c614 100644 --- a/frontend/src/core/observations/ObservationReviewList.tsx +++ b/frontend/src/core/observations/ObservationReviewList.tsx @@ -254,14 +254,14 @@ const ObservationsReviewList = ({ product }: ObservationsReviewListProps) => { {(!product || (product && product.has_cloud_resource)) && ( )} {(!product || (product && product.has_kubernetes_resource)) && ( )} diff --git a/frontend/src/core/observations/ObservationShowHeader.tsx b/frontend/src/core/observations/ObservationShowHeader.tsx index d5f1a1858..745651bbc 100644 --- a/frontend/src/core/observations/ObservationShowHeader.tsx +++ b/frontend/src/core/observations/ObservationShowHeader.tsx @@ -60,19 +60,18 @@ const ObservationShowHeader = ({ observation }: ObservationShowHeaderProps) => { - {!in_observation_log && - observation.parser_severity != "" && + {observation.parser_severity != "" && (observation.rule_severity != "" || observation.assessment_severity != "") && ( )} - {!in_observation_log && observation.rule_severity != "" && ( + {observation.rule_severity != "" && ( )} - {!in_observation_log && observation.assessment_severity != "" && ( + {observation.assessment_severity != "" && ( @@ -82,8 +81,7 @@ const ObservationShowHeader = ({ observation }: ObservationShowHeaderProps) => { - {!in_observation_log && - observation.parser_status != "" && + {observation.parser_status != "" && (observation.rule_status != "" || observation.assessment_status != "" || observation.vex_status != "") && ( @@ -91,17 +89,17 @@ const ObservationShowHeader = ({ observation }: ObservationShowHeaderProps) => { )} - {!in_observation_log && observation.vex_status != "" && ( + {observation.vex_status != "" && ( )} - {!in_observation_log && observation.rule_status != "" && ( + {observation.rule_status != "" && ( )} - {!in_observation_log && observation.assessment_status != "" && ( + {observation.assessment_status != "" && ( From af38f1db0b54c5d81af29f093538e9d99d179911 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 10:40:30 +0100 Subject: [PATCH 49/82] chore(deps): lock file maintenance (#2296) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/poetry.lock | 283 ++++----- frontend/package-lock.json | 1111 +++++++++++++++++++++--------------- 2 files changed, 795 insertions(+), 599 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 3408c4b9e..6fed13b75 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -76,13 +76,13 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "3.3.5" +version = "3.3.6" description = "An abstract syntax tree for Python with inference support." optional = true python-versions = ">=3.9.0" files = [ - {file = "astroid-3.3.5-py3-none-any.whl", hash = "sha256:a9d1c946ada25098d790e079ba2a1b112157278f3fb7e718ae6a9252f5835dc8"}, - {file = "astroid-3.3.5.tar.gz", hash = "sha256:5cfc40ae9f68311075d27ef68a4841bdc5cc7f6cf86671b49f00607d30188e2d"}, + {file = "astroid-3.3.6-py3-none-any.whl", hash = "sha256:db676dc4f3ae6bfe31cda227dc60e03438378d7a896aec57422c95634e8d722f"}, + {file = "astroid-3.3.6.tar.gz", hash = "sha256:6aaea045f938c735ead292204afdb977a36e989522b7833ef6fea94de743f442"}, ] [package.dependencies] @@ -90,21 +90,18 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "asttokens" -version = "2.4.1" +version = "3.0.0" description = "Annotate AST trees with source code positions" optional = true -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, ] -[package.dependencies] -six = ">=1.12.0" - [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "attrs" @@ -1110,13 +1107,13 @@ tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < [[package]] name = "ipython" -version = "8.29.0" +version = "8.30.0" description = "IPython: Productive Interactive Computing" optional = true python-versions = ">=3.10" files = [ - {file = "ipython-8.29.0-py3-none-any.whl", hash = "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8"}, - {file = "ipython-8.29.0.tar.gz", hash = "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb"}, + {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, + {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, ] [package.dependencies] @@ -1126,16 +1123,16 @@ exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} -prompt-toolkit = ">=3.0.41,<3.1.0" +prompt_toolkit = ">=3.0.41,<3.1.0" pygments = ">=2.4.0" -stack-data = "*" +stack_data = "*" traitlets = ">=5.13.0" -typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} [package.extras] all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] black = ["black"] -doc = ["docrepr", "exceptiongroup", "intersphinx-registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing-extensions"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "tomli", "typing_extensions"] kernel = ["ipykernel"] matplotlib = ["matplotlib"] nbconvert = ["nbconvert"] @@ -2165,101 +2162,114 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "rpds-py" -version = "0.21.0" +version = "0.22.3" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" files = [ - {file = "rpds_py-0.21.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a017f813f24b9df929674d0332a374d40d7f0162b326562daae8066b502d0590"}, - {file = "rpds_py-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc1ed0bcc86d8e1a7e968cce15be45178fd16e2ff656a243145e0b439bd250"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad116dda078d0bc4886cb7840e19811562acdc7a8e296ea6ec37e70326c1b41c"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:808f1ac7cf3b44f81c9475475ceb221f982ef548e44e024ad5f9e7060649540e"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de552f4a1916e520f2703ec474d2b4d3f86d41f353e7680b597512ffe7eac5d0"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:efec946f331349dfc4ae9d0e034c263ddde19414fe5128580f512619abed05f1"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b80b4690bbff51a034bfde9c9f6bf9357f0a8c61f548942b80f7b66356508bf5"}, - {file = "rpds_py-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085ed25baac88953d4283e5b5bd094b155075bb40d07c29c4f073e10623f9f2e"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:daa8efac2a1273eed2354397a51216ae1e198ecbce9036fba4e7610b308b6153"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:95a5bad1ac8a5c77b4e658671642e4af3707f095d2b78a1fdd08af0dfb647624"}, - {file = "rpds_py-0.21.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3e53861b29a13d5b70116ea4230b5f0f3547b2c222c5daa090eb7c9c82d7f664"}, - {file = "rpds_py-0.21.0-cp310-none-win32.whl", hash = "sha256:ea3a6ac4d74820c98fcc9da4a57847ad2cc36475a8bd9683f32ab6d47a2bd682"}, - {file = "rpds_py-0.21.0-cp310-none-win_amd64.whl", hash = "sha256:b8f107395f2f1d151181880b69a2869c69e87ec079c49c0016ab96860b6acbe5"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5555db3e618a77034954b9dc547eae94166391a98eb867905ec8fcbce1308d95"}, - {file = "rpds_py-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:97ef67d9bbc3e15584c2f3c74bcf064af36336c10d2e21a2131e123ce0f924c9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab2c2a26d2f69cdf833174f4d9d86118edc781ad9a8fa13970b527bf8236027"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e8921a259f54bfbc755c5bbd60c82bb2339ae0324163f32868f63f0ebb873d9"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a7ff941004d74d55a47f916afc38494bd1cfd4b53c482b77c03147c91ac0ac3"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5145282a7cd2ac16ea0dc46b82167754d5e103a05614b724457cffe614f25bd8"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de609a6f1b682f70bb7163da745ee815d8f230d97276db049ab447767466a09d"}, - {file = "rpds_py-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40c91c6e34cf016fa8e6b59d75e3dbe354830777fcfd74c58b279dceb7975b75"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d2132377f9deef0c4db89e65e8bb28644ff75a18df5293e132a8d67748397b9f"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0a9e0759e7be10109645a9fddaaad0619d58c9bf30a3f248a2ea57a7c417173a"}, - {file = "rpds_py-0.21.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e20da3957bdf7824afdd4b6eeb29510e83e026473e04952dca565170cd1ecc8"}, - {file = "rpds_py-0.21.0-cp311-none-win32.whl", hash = "sha256:f71009b0d5e94c0e86533c0b27ed7cacc1239cb51c178fd239c3cfefefb0400a"}, - {file = "rpds_py-0.21.0-cp311-none-win_amd64.whl", hash = "sha256:e168afe6bf6ab7ab46c8c375606298784ecbe3ba31c0980b7dcbb9631dcba97e"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:30b912c965b2aa76ba5168fd610087bad7fcde47f0a8367ee8f1876086ee6d1d"}, - {file = "rpds_py-0.21.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca9989d5d9b1b300bc18e1801c67b9f6d2c66b8fd9621b36072ed1df2c977f72"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f54e7106f0001244a5f4cf810ba8d3f9c542e2730821b16e969d6887b664266"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fed5dfefdf384d6fe975cc026886aece4f292feaf69d0eeb716cfd3c5a4dd8be"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:590ef88db231c9c1eece44dcfefd7515d8bf0d986d64d0caf06a81998a9e8cab"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f983e4c2f603c95dde63df633eec42955508eefd8d0f0e6d236d31a044c882d7"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b229ce052ddf1a01c67d68166c19cb004fb3612424921b81c46e7ea7ccf7c3bf"}, - {file = "rpds_py-0.21.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ebf64e281a06c904a7636781d2e973d1f0926a5b8b480ac658dc0f556e7779f4"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:998a8080c4495e4f72132f3d66ff91f5997d799e86cec6ee05342f8f3cda7dca"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:98486337f7b4f3c324ab402e83453e25bb844f44418c066623db88e4c56b7c7b"}, - {file = "rpds_py-0.21.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a78d8b634c9df7f8d175451cfeac3810a702ccb85f98ec95797fa98b942cea11"}, - {file = "rpds_py-0.21.0-cp312-none-win32.whl", hash = "sha256:a58ce66847711c4aa2ecfcfaff04cb0327f907fead8945ffc47d9407f41ff952"}, - {file = "rpds_py-0.21.0-cp312-none-win_amd64.whl", hash = "sha256:e860f065cc4ea6f256d6f411aba4b1251255366e48e972f8a347cf88077b24fd"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ee4eafd77cc98d355a0d02f263efc0d3ae3ce4a7c24740010a8b4012bbb24937"}, - {file = "rpds_py-0.21.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:688c93b77e468d72579351a84b95f976bd7b3e84aa6686be6497045ba84be560"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c38dbf31c57032667dd5a2f0568ccde66e868e8f78d5a0d27dcc56d70f3fcd3b"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2d6129137f43f7fa02d41542ffff4871d4aefa724a5fe38e2c31a4e0fd343fb0"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:520ed8b99b0bf86a176271f6fe23024323862ac674b1ce5b02a72bfeff3fff44"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaeb25ccfb9b9014a10eaf70904ebf3f79faaa8e60e99e19eef9f478651b9b74"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af04ac89c738e0f0f1b913918024c3eab6e3ace989518ea838807177d38a2e94"}, - {file = "rpds_py-0.21.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9b76e2afd585803c53c5b29e992ecd183f68285b62fe2668383a18e74abe7a3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5afb5efde74c54724e1a01118c6e5c15e54e642c42a1ba588ab1f03544ac8c7a"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:52c041802a6efa625ea18027a0723676a778869481d16803481ef6cc02ea8cb3"}, - {file = "rpds_py-0.21.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ee1e4fc267b437bb89990b2f2abf6c25765b89b72dd4a11e21934df449e0c976"}, - {file = "rpds_py-0.21.0-cp313-none-win32.whl", hash = "sha256:0c025820b78817db6a76413fff6866790786c38f95ea3f3d3c93dbb73b632202"}, - {file = "rpds_py-0.21.0-cp313-none-win_amd64.whl", hash = "sha256:320c808df533695326610a1b6a0a6e98f033e49de55d7dc36a13c8a30cfa756e"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:2c51d99c30091f72a3c5d126fad26236c3f75716b8b5e5cf8effb18889ced928"}, - {file = "rpds_py-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cbd7504a10b0955ea287114f003b7ad62330c9e65ba012c6223dba646f6ffd05"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dcc4949be728ede49e6244eabd04064336012b37f5c2200e8ec8eb2988b209c"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f414da5c51bf350e4b7960644617c130140423882305f7574b6cf65a3081cecb"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9afe42102b40007f588666bc7de82451e10c6788f6f70984629db193849dced1"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b929c2bb6e29ab31f12a1117c39f7e6d6450419ab7464a4ea9b0b417174f044"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8404b3717da03cbf773a1d275d01fec84ea007754ed380f63dfc24fb76ce4592"}, - {file = "rpds_py-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e12bb09678f38b7597b8346983d2323a6482dcd59e423d9448108c1be37cac9d"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:58a0e345be4b18e6b8501d3b0aa540dad90caeed814c515e5206bb2ec26736fd"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3761f62fcfccf0864cc4665b6e7c3f0c626f0380b41b8bd1ce322103fa3ef87"}, - {file = "rpds_py-0.21.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c2b2f71c6ad6c2e4fc9ed9401080badd1469fa9889657ec3abea42a3d6b2e1ed"}, - {file = "rpds_py-0.21.0-cp39-none-win32.whl", hash = "sha256:b21747f79f360e790525e6f6438c7569ddbfb1b3197b9e65043f25c3c9b489d8"}, - {file = "rpds_py-0.21.0-cp39-none-win_amd64.whl", hash = "sha256:0626238a43152918f9e72ede9a3b6ccc9e299adc8ade0d67c5e142d564c9a83d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6b4ef7725386dc0762857097f6b7266a6cdd62bfd209664da6712cb26acef035"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6bc0e697d4d79ab1aacbf20ee5f0df80359ecf55db33ff41481cf3e24f206919"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da52d62a96e61c1c444f3998c434e8b263c384f6d68aca8274d2e08d1906325c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:98e4fe5db40db87ce1c65031463a760ec7906ab230ad2249b4572c2fc3ef1f9f"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30bdc973f10d28e0337f71d202ff29345320f8bc49a31c90e6c257e1ccef4333"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:faa5e8496c530f9c71f2b4e1c49758b06e5f4055e17144906245c99fa6d45356"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32eb88c30b6a4f0605508023b7141d043a79b14acb3b969aa0b4f99b25bc7d4a"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a89a8ce9e4e75aeb7fa5d8ad0f3fecdee813802592f4f46a15754dcb2fd6b061"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:241e6c125568493f553c3d0fdbb38c74babf54b45cef86439d4cd97ff8feb34d"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3b766a9f57663396e4f34f5140b3595b233a7b146e94777b97a8413a1da1be18"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:af4a644bf890f56e41e74be7d34e9511e4954894d544ec6b8efe1e21a1a8da6c"}, - {file = "rpds_py-0.21.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3e30a69a706e8ea20444b98a49f386c17b26f860aa9245329bab0851ed100677"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:031819f906bb146561af051c7cef4ba2003d28cff07efacef59da973ff7969ba"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b876f2bc27ab5954e2fd88890c071bd0ed18b9c50f6ec3de3c50a5ece612f7a6"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc5695c321e518d9f03b7ea6abb5ea3af4567766f9852ad1560f501b17588c7b"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4de1da871b5c0fd5537b26a6fc6814c3cc05cabe0c941db6e9044ffbb12f04a"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:878f6fea96621fda5303a2867887686d7a198d9e0f8a40be100a63f5d60c88c9"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8eeec67590e94189f434c6d11c426892e396ae59e4801d17a93ac96b8c02a6c"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff2eba7f6c0cb523d7e9cff0903f2fe1feff8f0b2ceb6bd71c0e20a4dcee271"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a429b99337062877d7875e4ff1a51fe788424d522bd64a8c0a20ef3021fdb6ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:d167e4dbbdac48bd58893c7e446684ad5d425b407f9336e04ab52e8b9194e2ed"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eb2de8a147ffe0626bfdc275fc6563aa7bf4b6db59cf0d44f0ccd6ca625a24e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e78868e98f34f34a88e23ee9ccaeeec460e4eaf6db16d51d7a9b883e5e785a5e"}, - {file = "rpds_py-0.21.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4991ca61656e3160cdaca4851151fd3f4a92e9eba5c7a530ab030d6aee96ec89"}, - {file = "rpds_py-0.21.0.tar.gz", hash = "sha256:ed6378c9d66d0de903763e7706383d60c33829581f0adff47b6535f1802fa6db"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967"}, + {file = "rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec"}, + {file = "rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00"}, + {file = "rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf"}, + {file = "rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652"}, + {file = "rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f"}, + {file = "rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1"}, + {file = "rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74"}, + {file = "rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a"}, + {file = "rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64"}, + {file = "rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e"}, + {file = "rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15"}, + {file = "rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61"}, + {file = "rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7"}, + {file = "rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627"}, + {file = "rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea"}, + {file = "rpds_py-0.22.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543"}, + {file = "rpds_py-0.22.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831"}, + {file = "rpds_py-0.22.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520"}, + {file = "rpds_py-0.22.3-cp39-cp39-win32.whl", hash = "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9"}, + {file = "rpds_py-0.22.3-cp39-cp39-win_amd64.whl", hash = "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe"}, + {file = "rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7"}, + {file = "rpds_py-0.22.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] [[package]] @@ -2273,26 +2283,15 @@ files = [ {file = "semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc"}, ] -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - [[package]] name = "sqlparse" -version = "0.5.2" +version = "0.5.3" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" files = [ - {file = "sqlparse-0.5.2-py3-none-any.whl", hash = "sha256:e99bc85c78160918c3e1d9230834ab8d80fc06c59d03f8db2618f65f65dda55e"}, - {file = "sqlparse-0.5.2.tar.gz", hash = "sha256:9e37b35e16d1cc652a2545f0997c1deb23ea28fa1f3eefe609eee3063c3b105f"}, + {file = "sqlparse-0.5.3-py3-none-any.whl", hash = "sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca"}, + {file = "sqlparse-0.5.3.tar.gz", hash = "sha256:09f67787f56a0b16ecdbde1bfc7f5d9c3371ca683cfeaa8e6ff60b4807ec9272"}, ] [package.extras] @@ -2320,13 +2319,43 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" description = "A lil' TOML parser" optional = true python-versions = ">=3.8" files = [ - {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, - {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 891d51ff1..ebd14b2fc 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -120,9 +120,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true, "license": "MIT", "engines": { @@ -178,13 +178,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -304,12 +304,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -377,16 +377,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -404,9 +404,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -1046,13 +1046,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.4", + "@eslint/object-schema": "^2.1.5", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -1061,11 +1061,14 @@ } }, "node_modules/@eslint/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", + "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -1118,9 +1121,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1128,9 +1131,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", + "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1295,24 +1298,25 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.33.tgz", - "integrity": "sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.2.0.tgz", + "integrity": "sha512-9A5eZQV9eKlNCXlI/SgYsGRS7YmGmB1oAsRpNVIYBmIzGJRgH+hfG+lo4069s+GFWFNnBAtDg10c53vQZBLfnA==", "license": "MIT", "dependencies": { - "@antfu/install-pkg": "^0.4.0", + "@antfu/install-pkg": "^0.4.1", "@antfu/utils": "^0.7.10", "@iconify/types": "^2.0.0", - "debug": "^4.3.6", + "debug": "^4.4.0", + "globals": "^15.13.0", "kolorist": "^1.8.0", - "local-pkg": "^0.5.0", - "mlly": "^1.7.1" + "local-pkg": "^0.5.1", + "mlly": "^1.7.3" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -1572,9 +1576,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", - "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "version": "5.16.11", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.11.tgz", + "integrity": "sha512-2eVDGg9OvIXNRmfDUQyKYH+jNcjdv1JkCH5F2YDgUye5fMX5nxGiYHAUe1BXaXyDMaLSwXC7LRksEKMiIQsFdw==", "license": "MIT", "funding": { "type": "opencollective", @@ -1582,9 +1586,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.7.tgz", - "integrity": "sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==", + "version": "5.16.11", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.11.tgz", + "integrity": "sha512-LjIiDVGGPzessDd5uSGFYZNqrXqECLiJ9hESE6Xkk8CtGTN2m2h6iImKJpkoryNXYxulv87WLeqfTMWAfA4Igg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9" @@ -1598,8 +1602,8 @@ }, "peerDependencies": { "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1608,16 +1612,16 @@ } }, "node_modules/@mui/material": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", - "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "version": "5.16.11", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.11.tgz", + "integrity": "sha512-uoc67oecKdnVKaMHBVE433YrMuxQs22xY5nIjRb5sAPB+GaeZQWp8brQ3/adeH6k2IDa8+9i2IVd4fNLuvHSvA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.7", - "@mui/system": "^5.16.7", + "@mui/core-downloads-tracker": "^5.16.11", + "@mui/system": "^5.16.8", "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@mui/utils": "^5.16.8", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", @@ -1636,9 +1640,9 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1653,13 +1657,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", - "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.8.tgz", + "integrity": "sha512-3Vl9yFVLU6T3CFtxRMQTcJ60Ijv7wxQi4yjH92+9YXcsqvVspeIYoocqNoIV/1bXGYfyWu5zrCmwQVHaGY7bug==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.6", + "@mui/utils": "^5.16.8", "prop-types": "^15.8.1" }, "engines": { @@ -1670,8 +1674,8 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1680,9 +1684,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", - "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.8.tgz", + "integrity": "sha512-OFdgFf8JczSRs0kvWGdSn0ZeXxWrY0LITDPJ/nAtLEvUUTyrlFaO4il3SECX8ruzvf1VnAxHx4M/4mX9oOn9yA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", @@ -1700,7 +1704,7 @@ "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1712,16 +1716,16 @@ } }, "node_modules/@mui/system": { - "version": "5.16.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", - "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.8.tgz", + "integrity": "sha512-L32TaFDFpGIi1g6ysRtmhc9zDgrlxDXu3NlrGE8gAsQw/ziHrPdr0PNr20O0POUshA1q14W4dNZ/z0Nx2F9lhA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.6", - "@mui/styled-engine": "^5.16.6", + "@mui/private-theming": "^5.16.8", + "@mui/styled-engine": "^5.16.8", "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.6", + "@mui/utils": "^5.16.8", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1736,8 +1740,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1766,9 +1770,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", - "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.8.tgz", + "integrity": "sha512-P/yb7BSWallQUeiNGxb+TM8epHteIUC8gzNTdPV2VfKhVY/EnGliHgt5np0GPkjQ7EzwDi/+gBevrAJtf+K94A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", @@ -1786,8 +1790,8 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1859,9 +1863,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", - "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", + "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", "cpu": [ "arm" ], @@ -1873,9 +1877,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", - "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", + "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", "cpu": [ "arm64" ], @@ -1887,9 +1891,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", - "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", + "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", "cpu": [ "arm64" ], @@ -1901,9 +1905,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", - "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", + "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", "cpu": [ "x64" ], @@ -1915,9 +1919,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", - "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", + "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", "cpu": [ "arm64" ], @@ -1929,9 +1933,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", - "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", + "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", "cpu": [ "x64" ], @@ -1943,9 +1947,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", - "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", + "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", "cpu": [ "arm" ], @@ -1957,9 +1961,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", - "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", + "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", "cpu": [ "arm" ], @@ -1971,9 +1975,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", - "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", + "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", "cpu": [ "arm64" ], @@ -1985,9 +1989,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", - "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", + "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", "cpu": [ "arm64" ], @@ -1998,10 +2002,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", + "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", - "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", + "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", "cpu": [ "ppc64" ], @@ -2013,9 +2031,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", - "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", + "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", "cpu": [ "riscv64" ], @@ -2027,9 +2045,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", - "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", + "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", "cpu": [ "s390x" ], @@ -2041,9 +2059,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", - "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", + "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", "cpu": [ "x64" ], @@ -2055,9 +2073,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", - "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", + "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", "cpu": [ "x64" ], @@ -2069,9 +2087,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", - "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", + "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", "cpu": [ "arm64" ], @@ -2083,9 +2101,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", - "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", + "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", "cpu": [ "ia32" ], @@ -2097,9 +2115,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", - "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", + "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", "cpu": [ "x64" ], @@ -2111,9 +2129,9 @@ ] }, "node_modules/@tanstack/query-core": { - "version": "5.60.6", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.60.6.tgz", - "integrity": "sha512-tI+k0KyCo1EBJ54vxK1kY24LWj673ujTydCZmzEZKAew4NqZzTaVQJEuaG1qKj2M03kUHN46rchLRd+TxVq/zQ==", + "version": "5.62.7", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.7.tgz", + "integrity": "sha512-fgpfmwatsrUal6V+8EC2cxZIQVl9xvL7qYa03gsdsCy985UTUlS4N+/3hCzwR0PclYDqisca2AqR1BVgJGpUDA==", "license": "MIT", "funding": { "type": "github", @@ -2121,12 +2139,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.61.3", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.61.3.tgz", - "integrity": "sha512-c3Oz9KaCBapGkRewu7AJLhxE9BVqpMcHsd3KtFxSd7FSCu2qGwqfIN37zbSGoyk6Ix9LGZBNHQDPI6GpWABnmA==", + "version": "5.62.7", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.7.tgz", + "integrity": "sha512-+xCtP4UAFDTlRTYyEjLx0sRtWyr5GIk7TZjZwBu4YaNahi3Rt2oMyRqfpfVrtwsqY2sayP4iXVCwmC+ZqqFmuw==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.60.6" + "@tanstack/query-core": "5.62.7" }, "funding": { "type": "github", @@ -2155,9 +2173,9 @@ } }, "node_modules/@tiptap/core": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.10.2.tgz", - "integrity": "sha512-jYLXbYHTi1stLla/74J8NJizDtcJ/uokhG+1gN4DMWHDujaZOrRZhW98o9gN5BYAp4zv//TVX8H+afLZwKGCKQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.10.3.tgz", + "integrity": "sha512-wAG/0/UsLeZLmshWb6rtWNXKJftcmnned91/HLccHVQAuQZ1UWH+wXeQKu/mtodxEO7JcU2mVPR9mLGQkK0McQ==", "license": "MIT", "funding": { "type": "github", @@ -2168,9 +2186,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.2.tgz", - "integrity": "sha512-whmep+v0VvBI9Kg5TJ4sKIj7Z+MOjBKAndP0qn1bMoqPNNVRxt92iIud72wfXwfBNcrYiGNlssvsAnPwXfbG9w==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.3.tgz", + "integrity": "sha512-u9Mq4r8KzoeGVT8ms6FQDIMN95dTh3TYcT7fZpwcVM96mIl2Oyt+Bk66mL8z4zuFptfRI57Cu9QdnHEeILd//w==", "license": "MIT", "funding": { "type": "github", @@ -2181,9 +2199,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.2.tgz", - "integrity": "sha512-1KNTXA8HDkhXblkfeRYDdqAu/Xz2fygyaSrvabrfzg5QVYyVYPNJwjrtfTQNyzWOejBVGE3mOyqnjlLUzPmyYA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.3.tgz", + "integrity": "sha512-xnF1tS2BsORenr11qyybW120gHaeHKiKq+ZOP14cGA0MsriKvWDnaCSocXP/xMEYHy7+2uUhJ0MsKkHVj4bPzQ==", "license": "MIT", "funding": { "type": "github", @@ -2194,9 +2212,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.10.2.tgz", - "integrity": "sha512-KAh2bvYcixJ3RFv2P05kPNLAJ4uW6BDj1AfEMn0YguBWWTgZg8Kot1AzBRgTjBBFCInQS6b49db1ff4M07DGsg==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.10.3.tgz", + "integrity": "sha512-e9a4yMjQezuKy0rtyyzxbV2IAE1bm1PY3yoZEFrcaY0o47g1CMUn2Hwe+9As2HdntEjQpWR7NO1mZeKxHlBPYA==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2211,9 +2229,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.2.tgz", - "integrity": "sha512-jXtTQXZ3j2cyG2dNyVnGauIbsX8CmDY56MJfDg1p+1UZ3zW2GVbKHfvyuulsjobxEd0DNLxduGqbkDY7x3I+HA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.3.tgz", + "integrity": "sha512-PTkwJOVlHi4RR4Wrs044tKMceweXwNmWA6EoQ93hPUVtQcwQL990Es5Izp+i88twTPLuGD9dH+o9QDyH9SkWdA==", "license": "MIT", "funding": { "type": "github", @@ -2224,9 +2242,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.2.tgz", - "integrity": "sha512-VV14oeOsJ3VqUEjuUl+lzSW/IBLhurmcj9IiN2sq/Voin04dwvtchqP5fNXgmM3+rFM88zNOsbX0e4uSG4R10w==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.3.tgz", + "integrity": "sha512-JyLbfyY3cPctq9sVdpcRWTcoUOoq3/MnGE1eP6eBNyMTHyBPcM9TPhOkgj+xkD1zW/884jfelB+wa70RT/AMxQ==", "license": "MIT", "funding": { "type": "github", @@ -2237,9 +2255,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.2.tgz", - "integrity": "sha512-Y/wkK9Ni4ALGqiGezov62p6cpPcJauBfn2wF1lgJVr6XJ4na5KTCUEbiyBZNbo3aD52vZKgWt8LpLvJ2/5STSw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.3.tgz", + "integrity": "sha512-yiDVNg22fYkzsFk5kBlDSHcjwVJgajvO/M5fDXA+Hfxwo2oNcG6aJyyHXFe+UaXTVjdkPej0J6kcMKrTMCiFug==", "license": "MIT", "funding": { "type": "github", @@ -2251,9 +2269,9 @@ } }, "node_modules/@tiptap/extension-color": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.10.2.tgz", - "integrity": "sha512-lIUrsk8XBG0h8ft5vU6u0ehPk0pcZK3xjhOLF/qxiGhZNBynX5/Nb7mez05J0/P6GKsD9Hj6UD7wm4ZkGmNT9A==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.10.3.tgz", + "integrity": "sha512-FC2hPMSQ4w9UmO9kJCAdoU7gHpDbJ6MeJAmikB9EPp16dbGwFLrZm9TZ/4pv74fGfVm0lv720316ALOEgPEDjQ==", "license": "MIT", "funding": { "type": "github", @@ -2265,9 +2283,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.10.2.tgz", - "integrity": "sha512-Xodp6rMg6vtKZkyX3I6gVd6OZ9PNz9udhDLdCG6JscVJQPO8viV++39UOH416FCvRT46BdHWNCRu/xjUG1C0rA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.10.3.tgz", + "integrity": "sha512-6i8+xbS2zB6t8iFzli1O/QB01MmwyI5Hqiiv4m5lOxqavmJwLss2sRhoMC2hB3CyFg5UmeODy/f/RnI6q5Vixg==", "license": "MIT", "funding": { "type": "github", @@ -2278,9 +2296,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.2.tgz", - "integrity": "sha512-pzkD6Y9r3x4Mb6KqpuPraGNNfxIkQD6dJNtZ9PpU9jVtJDjsGIGdyzCbVJq984UAPBamXiF/5DLwlON7buLd6A==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.3.tgz", + "integrity": "sha512-wzWf82ixWzZQr0hxcf/A0ul8NNxgy1N63O+c56st6OomoLuKUJWOXF+cs9O7V+/5rZKWdbdYYoRB5QLvnDBAlQ==", "license": "MIT", "funding": { "type": "github", @@ -2292,9 +2310,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.10.2.tgz", - "integrity": "sha512-s/KfW5YQY13BwhSQRlgomYmHuBT0k6FBxn8mgJLHcA9sTqgy/BriOhmNkMrredNzd4UOd5JVpcT6b+eckG4nkQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.10.3.tgz", + "integrity": "sha512-Prg8rYLxeyzHxfzVu1mDkkUWMnD9ZN3y370O/1qy55e+XKVw9jFkTSuz0y0+OhMJG6bulYpDUMtb+N3+2xOWlQ==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2309,9 +2327,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.2.tgz", - "integrity": "sha512-Uj2hIYC5zRPGI9xBYFwtld8JrZ8YZXEqO7sN5VcOwt12cnSmvzga86jUKpj3WOMP/8KamLWW8m8UKHd7Qg1kMA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.3.tgz", + "integrity": "sha512-FskZi2DqDSTH1WkgLF2OLy0xU7qj3AgHsKhVsryeAtld4jAK5EsonneWgaipbz0e/MxuIvc1oyacfZKABpLaNg==", "license": "MIT", "funding": { "type": "github", @@ -2323,9 +2341,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.2.tgz", - "integrity": "sha512-jEVKEe8I+Ai/qYjVf6Idg2Gpp1Cxn4O4twJ0MnlEdzoaEHgt/OTU5NO0PBZMpoe/4BkOvkETZmqRbrcGsapeYQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.3.tgz", + "integrity": "sha512-2rFlimUKAgKDwT6nqAMtPBjkrknQY8S7oBNyIcDOUGyFkvbDUl3Jd0PiC929S5F3XStJRppnMqhpNDAlWmvBLA==", "license": "MIT", "funding": { "type": "github", @@ -2336,9 +2354,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.10.2.tgz", - "integrity": "sha512-OfvE+epZSyB0TbV5/4GdvRPMT1kd0fbgLUEaldWMZOLw/4eOGWZ8yXAtrWkoRMLZfOclgnDfwXvXJLnWXrDdDw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.10.3.tgz", + "integrity": "sha512-AlxXXPCWIvw8hQUDFRskasj32iMNB8Sb19VgyFWqwvntGs2/UffNu8VdsVqxD2HpZ0g5rLYCYtSW4wigs9R3og==", "license": "MIT", "funding": { "type": "github", @@ -2349,9 +2367,9 @@ } }, "node_modules/@tiptap/extension-highlight": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.10.2.tgz", - "integrity": "sha512-yJpqagUS672RPsGRc6JrNuqf3DbMiP+g4Al3cVpU3ff3yEORbCMsgvwkCOE9thSO9B4SOFQP4HzX2x1DLJtjew==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.10.3.tgz", + "integrity": "sha512-srMOdpUTcp1yPGmUqgKOkbmTpCYOF6Q/8CnquDkhrvK7Gyphj+n8TocrKiloaRYZKcoQWtmb+kcVPaHhHMzsWQ==", "license": "MIT", "funding": { "type": "github", @@ -2362,9 +2380,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.2.tgz", - "integrity": "sha512-Hr5cvYgOAP7vaRD5vbMjirTATFe/zYqnzePhq1c9TQESOi2o0zKxWpZIcHbFFIXCjHLSnpXOZ4yFwHP4k12rgg==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.3.tgz", + "integrity": "sha512-HaSiMdx9Im9Pb9qGlVud7W8bweRDRMez33Uzs5a2x0n1RWkelfH7TwYs41Y3wus8Ujs7kw6qh7jyhvPpQBKaSA==", "license": "MIT", "funding": { "type": "github", @@ -2376,9 +2394,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.2.tgz", - "integrity": "sha512-DqaCUxjXnoVN/yylEjoGIlvKkT1KF8mwFJncJn8oSAukYEaSAK056ETvmyZk+/bzc3aRpfv0Kfn/zmLfHZ3wnA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.3.tgz", + "integrity": "sha512-1a2IWhD00tgUNg/91RLnBvfENL7DLCui5L245+smcaLu+OXOOEpoBHawx59/M4hEpsjqvRRM79TzO9YXfopsPw==", "license": "MIT", "funding": { "type": "github", @@ -2390,9 +2408,9 @@ } }, "node_modules/@tiptap/extension-image": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.10.2.tgz", - "integrity": "sha512-xaJOVeR/fWozJMVKjYhskecsbayUUm1tIbjE+SyG7IW3Jp+081/W9z2nyfXG6YNnuVjYq+uLejR2Bt0cnEZvmA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.10.3.tgz", + "integrity": "sha512-YIjAF5CwDkMe28OQ5pvnmdRgbJ9JcGMIHY1kyqNunSf2iwphK+6SWz9UEIkDFiT7AsRZySqxFSq93iK1XyTifw==", "license": "MIT", "funding": { "type": "github", @@ -2403,9 +2421,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.2.tgz", - "integrity": "sha512-6p1YkJEWHuMROzNrK+GFJamujBswpydfR3ZMpIjQTLr4hRhSGrde/B5WODRDS+3JiK1xcN16ZQVPFsRJaHMjfQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.3.tgz", + "integrity": "sha512-wAiO6ZxoHx2H90phnKttLWGPjPZXrfKxhOCsqYrK8BpRByhr48godOFRuGwYnKaiwoVjpxc63t+kDJDWvqmgMw==", "license": "MIT", "funding": { "type": "github", @@ -2416,9 +2434,9 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.2.tgz", - "integrity": "sha512-bgsWdinDPGEiMD0NgphpKaxm4l9+PbPwdLDGDFyEX069VAyuSN4y63Sn32clpwlLcibVu3JxVFClJ+o6wKtmdg==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.3.tgz", + "integrity": "sha512-8esKlkZBzEiNcpt7I8Cd6l1mWmCc/66pPbUq9LfnIniDXE3U+ahBf4m3TJltYFBGbiiTR/xqMtJyVHOpuLDtAw==", "license": "MIT", "dependencies": { "linkifyjs": "^4.1.0" @@ -2433,9 +2451,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.2.tgz", - "integrity": "sha512-NE800m/QCk58MUcfeeCqmDjgOuiwHddaZvCCQIpErZdI2Y0io9RsSYU3HHEFPIfbKsv/ykVTYbwSweTPs1Tmxw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.3.tgz", + "integrity": "sha512-9sok81gvZfSta2K1Dwrq5/HSz1jk4zHBpFqCx0oydzodGslx6X1bNxdca+eXJpXZmQIWALK7zEr4X8kg3WZsgw==", "license": "MIT", "funding": { "type": "github", @@ -2446,9 +2464,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.2.tgz", - "integrity": "sha512-1WYknf7/feouoBN7jW9Z6fvN9gzS1WRaOrDVkLZQ2ZLgT+Bs8H8/r1pv23q8Un6lg0mApwqnUxNhLOOrVyDkGQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.3.tgz", + "integrity": "sha512-/SFuEDnbJxy3jvi72LeyiPHWkV+uFc0LUHTUHSh20vwyy+tLrzncJfXohGbTIv5YxYhzExQYZDRD4VbSghKdlw==", "license": "MIT", "funding": { "type": "github", @@ -2459,9 +2477,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.2.tgz", - "integrity": "sha512-EZG9W5rsU4uP585cIOrhbAPOUsgqrFbDrj1tZjTbvv0EWK03Un3FGYoGilkcUIxD9uB/XVHP+v2596Ifyi/dvQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.3.tgz", + "integrity": "sha512-sNkTX/iN+YoleDiTJsrWSBw9D7c4vsYwnW5y/G5ydfuJMIRQMF78pWSIWZFDRNOMkgK5UHkhu9anrbCFYgBfaA==", "license": "MIT", "funding": { "type": "github", @@ -2472,9 +2490,9 @@ } }, "node_modules/@tiptap/extension-placeholder": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.10.2.tgz", - "integrity": "sha512-QWzih69SetWYiylQzHsK29dMR8z1ParfcEw05hy3yyWqXE1DiKEot6rOGV1xenMVEA/SNGYYhQia15Bvco95TA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.10.3.tgz", + "integrity": "sha512-0OkwnDLguZgoiJM85cfnOySuMmPUF7qqw7DHQ+c3zwTAYnvzpvqrvpupc+2Zi9GfC1sDgr+Ajrp8imBHa6PHfA==", "license": "MIT", "funding": { "type": "github", @@ -2486,9 +2504,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.2.tgz", - "integrity": "sha512-TjrBbO6UbXCt55hV9wRE7h5R/jLTB+z2yn2blz1TfR7wKkX3tJOnb+ptvIHEVFGJOjkZP6Xaj+aAkGVg5dKZYA==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.3.tgz", + "integrity": "sha512-jYoPy6F6njYp3txF3u23bgdRy/S5ATcWDO9LPZLHSeikwQfJ47nqb+EUNo5M8jIOgFBTn4MEbhuZ6OGyhnxopA==", "license": "MIT", "funding": { "type": "github", @@ -2499,9 +2517,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.2.tgz", - "integrity": "sha512-7WaJCmHAnf24gZc+Bl64vZgjAFt0CSEc5Jr+f3GII6XeCkZpTCJX85po2MFUhBRZMJheyctyL+UfsRauo/iP0Q==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.3.tgz", + "integrity": "sha512-7p9XiRprsRZm8y9jvF/sS929FCELJ5N9FQnbzikOiyGNUx5mdI+exVZlfvBr9xOD5s7fBLg6jj9Vs0fXPNRkPg==", "license": "MIT", "funding": { "type": "github", @@ -2512,9 +2530,9 @@ } }, "node_modules/@tiptap/extension-text-align": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.10.2.tgz", - "integrity": "sha512-eDvks4fUZuOuAhWD8/HJ070g2OQlEnBpak2+huvzPhGdYP81vhx5OWk/rfF6WzLzxLwnDND2zvk3YL+RBqERZQ==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.10.3.tgz", + "integrity": "sha512-g75sNl73gtgjP3XIcl06kvv1qw3c0rGEUD848rUU1bvlBpU3IxjkcQLgYvHmv3vpuUp9cKUkA2wa7Sv6R3fjvw==", "license": "MIT", "funding": { "type": "github", @@ -2525,9 +2543,9 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.10.2.tgz", - "integrity": "sha512-dWx5Ean7Rb6rdqO6C/i0qIIABKHFsABZj0mTDr0/ZXsw3V2O4d1cP13evvcc7HMLNAXziRTtWCVU6M06vwM/Pw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.10.3.tgz", + "integrity": "sha512-TalYIdlF7vBA4afFhmido7AORdBbu3sV+HCByda0FiNbM6cjng3Nr9oxHOCVJy+ChqrcgF4m54zDfLmamdyu5Q==", "license": "MIT", "funding": { "type": "github", @@ -2538,9 +2556,9 @@ } }, "node_modules/@tiptap/extension-underline": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.10.2.tgz", - "integrity": "sha512-jDWGqqUYkrLgqRQDyqh+LpbkiqPfaWOoo5bydYL0u80GPEavovxZPoCJ/HDlOfdwm+FIPy55OP/29tELJRptmg==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.10.3.tgz", + "integrity": "sha512-VeGs0jeNiTnXddHHJEgOc/sKljZiyTEgSSuqMmsBACrr9aGFXbLTgKTvNjkZ9WzSnu7LwgJuBrwEhg8yYixUyQ==", "license": "MIT", "funding": { "type": "github", @@ -2551,9 +2569,9 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.2.tgz", - "integrity": "sha512-jEgC79uvuEl51XxulutUJPSlhkoY0xQc9R/G4MQltAi+JxJ+KE/pOxgqziWNxBpgUzQqloupjod0kLhLUL4Cig==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.3.tgz", + "integrity": "sha512-771p53aU0KFvujvKpngvq2uAxThlEsjYaXcVVmwrhf0vxSSg+psKQEvqvWvHv/3BwkPVCGwmEKNVJZjaXFKu4g==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.2.1", @@ -2573,7 +2591,7 @@ "prosemirror-tables": "^1.6.1", "prosemirror-trailing-node": "^3.0.0", "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.36.0" + "prosemirror-view": "^1.37.0" }, "funding": { "type": "github", @@ -2581,13 +2599,13 @@ } }, "node_modules/@tiptap/react": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.10.2.tgz", - "integrity": "sha512-xBg0uA/ON9LbC8ojwjgFQgZA1xmaEotXZnZcM3tfGjCboqk0toi59v+2CIN9icDfW+UT/hsget3SBQtRw+SBEw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.10.3.tgz", + "integrity": "sha512-5GBL3arWai8WZuCl1MMA7bT5aWwqDi5AOQhX+hovKjwHvttpKDogRoUBL5k6Eds/eQMBMGTpsfmZlGNiFxSv1g==", "license": "MIT", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.10.2", - "@tiptap/extension-floating-menu": "^2.10.2", + "@tiptap/extension-bubble-menu": "^2.10.3", + "@tiptap/extension-floating-menu": "^2.10.3", "@types/use-sync-external-store": "^0.0.6", "fast-deep-equal": "^3", "use-sync-external-store": "^1" @@ -2604,32 +2622,32 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.10.2.tgz", - "integrity": "sha512-YbS9P3zvLhfEWnCPMcvCwK/+3XjMgZX73D1qMu9jVRHtQGI2DMk9u42KWAMLQAMBUESMcIeGxJ9G5IWJO0PsyA==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.10.2", - "@tiptap/extension-blockquote": "^2.10.2", - "@tiptap/extension-bold": "^2.10.2", - "@tiptap/extension-bullet-list": "^2.10.2", - "@tiptap/extension-code": "^2.10.2", - "@tiptap/extension-code-block": "^2.10.2", - "@tiptap/extension-document": "^2.10.2", - "@tiptap/extension-dropcursor": "^2.10.2", - "@tiptap/extension-gapcursor": "^2.10.2", - "@tiptap/extension-hard-break": "^2.10.2", - "@tiptap/extension-heading": "^2.10.2", - "@tiptap/extension-history": "^2.10.2", - "@tiptap/extension-horizontal-rule": "^2.10.2", - "@tiptap/extension-italic": "^2.10.2", - "@tiptap/extension-list-item": "^2.10.2", - "@tiptap/extension-ordered-list": "^2.10.2", - "@tiptap/extension-paragraph": "^2.10.2", - "@tiptap/extension-strike": "^2.10.2", - "@tiptap/extension-text": "^2.10.2", - "@tiptap/extension-text-style": "^2.10.2", - "@tiptap/pm": "^2.10.2" + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.10.3.tgz", + "integrity": "sha512-oq8xdVIMqohSs91ofHSr7i5dCp2F56Lb9aYIAI25lZmwNwQJL2geGOYjMSfL0IC4cQHPylIuSKYCg7vRFdZmAA==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.10.3", + "@tiptap/extension-blockquote": "^2.10.3", + "@tiptap/extension-bold": "^2.10.3", + "@tiptap/extension-bullet-list": "^2.10.3", + "@tiptap/extension-code": "^2.10.3", + "@tiptap/extension-code-block": "^2.10.3", + "@tiptap/extension-document": "^2.10.3", + "@tiptap/extension-dropcursor": "^2.10.3", + "@tiptap/extension-gapcursor": "^2.10.3", + "@tiptap/extension-hard-break": "^2.10.3", + "@tiptap/extension-heading": "^2.10.3", + "@tiptap/extension-history": "^2.10.3", + "@tiptap/extension-horizontal-rule": "^2.10.3", + "@tiptap/extension-italic": "^2.10.3", + "@tiptap/extension-list-item": "^2.10.3", + "@tiptap/extension-ordered-list": "^2.10.3", + "@tiptap/extension-paragraph": "^2.10.3", + "@tiptap/extension-strike": "^2.10.3", + "@tiptap/extension-text": "^2.10.3", + "@tiptap/extension-text-style": "^2.10.3", + "@tiptap/pm": "^2.10.3" }, "funding": { "type": "github", @@ -2912,9 +2930,9 @@ } }, "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", "license": "MIT" }, "node_modules/@types/d3-selection": { @@ -2977,9 +2995,9 @@ "license": "MIT" }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "version": "7946.0.15", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", + "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", "license": "MIT" }, "node_modules/@types/inflection": { @@ -3044,6 +3062,7 @@ "version": "18.3.16", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.16.tgz", "integrity": "sha512-oh8AMIC4Y2ciKufU8hnKgs+ufgbA/dhPTACaZPM86AbwX9QwnFtSoPWEeRUj8fge+v6kFt78BXcDhAU1SrrAsw==", + "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -3061,11 +3080,11 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", - "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", "license": "MIT", - "dependencies": { + "peerDependencies": { "@types/react": "*" } }, @@ -3313,9 +3332,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", "dev": true, "license": "ISC" }, @@ -3676,16 +3695,45 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", + "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "get-intrinsic": "^1.2.5" }, "engines": { "node": ">= 0.4" @@ -3704,9 +3752,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001684", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", - "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -3928,9 +3976,9 @@ "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.30.3", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.3.tgz", - "integrity": "sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g==", + "version": "3.30.4", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.4.tgz", + "integrity": "sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A==", "license": "MIT", "engines": { "node": ">=0.10" @@ -4497,9 +4545,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4605,18 +4653,32 @@ } }, "node_modules/dompurify": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.1.tgz", - "integrity": "sha512-NBHEsc0/kzRYQd+AY6HR6B/IgsqzBABrqJbpCDQII/OK6h7B7LXzweZTDsqSW2LkTRpoxf18YUP+YjGySk6B3w==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.3.tgz", + "integrity": "sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/electron-to-chromium": { - "version": "1.5.64", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz", - "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true, "license": "ISC" }, @@ -4709,13 +4771,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -4794,15 +4853,15 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -5221,9 +5280,9 @@ } }, "node_modules/file-selector": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.1.tgz", - "integrity": "sha512-pJVY80PuSiHbnYEZ0gZYQf15x0z/lkeIF1yn95yRC/Usb43343ewXtMClQ9GLPvPm4/SscX4zvQz9QhCAyLqlg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", "license": "MIT", "dependencies": { "tslib": "^2.7.0" @@ -5425,16 +5484,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -5500,7 +5564,6 @@ "version": "15.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -5527,12 +5590,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5584,10 +5647,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -5596,9 +5663,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -5790,27 +5857,30 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", + "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5848,12 +5918,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -5980,13 +6052,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", + "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6006,14 +6079,16 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6052,13 +6127,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", + "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6068,13 +6144,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", + "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bind": "^1.0.7", + "has-symbols": "^1.0.3", + "safe-regex-test": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -6157,17 +6235,18 @@ "license": "ISC" }, "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", + "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "reflect.getprototypeof": "^1.0.8", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -6210,9 +6289,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -6296,9 +6375,9 @@ } }, "node_modules/katex": { - "version": "0.16.11", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", - "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", + "version": "0.16.15", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.15.tgz", + "integrity": "sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -6393,9 +6472,9 @@ } }, "node_modules/linkifyjs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.4.tgz", - "integrity": "sha512-0/NxkHNpiJ0k9VrYCkAn9OtU1eu8xEr1tCCpDtSsVRm/SF0xAak2Gzv3QimSfgUgqLBCDlfhMbu73XvaEHUTPQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz", + "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==", "license": "MIT" }, "node_modules/local-pkg": { @@ -6512,6 +6591,15 @@ "node": ">= 18" } }, + "node_modules/math-intrinsics": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", + "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -6629,9 +6717,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -6669,9 +6757,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, @@ -6855,9 +6943,9 @@ } }, "node_modules/package-manager-detector": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.5.tgz", - "integrity": "sha512-3dS7y28uua+UDbRCLBqltMBrbI+A5U2mI9YuxHRxIWYmLj3DwntEBmERYzIAQ4DMeuCUOBSak7dBHHoXKpOTYQ==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.7.tgz", + "integrity": "sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==", "license": "MIT" }, "node_modules/parent-module": { @@ -7183,9 +7271,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.23.0.tgz", - "integrity": "sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==", + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.1.tgz", + "integrity": "sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" @@ -7201,9 +7289,9 @@ } }, "node_modules/prosemirror-schema-list": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.4.1.tgz", - "integrity": "sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.0.tgz", + "integrity": "sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -7260,9 +7348,9 @@ } }, "node_modules/prosemirror-view": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.37.0.tgz", - "integrity": "sha512-z2nkKI1sJzyi7T47Ji/ewBPuIma1RNvQCCYVdV+MqWBV7o4Sa1n94UJCJJ1aQRF/xRkFfyqLGlGFWitIcCOtbg==", + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.37.1.tgz", + "integrity": "sha512-MEAnjOdXU1InxEmhjgmEzQAikaS6lF3hD64MveTPpjOGNTl87iRLA1HupC/DEV6YuK7m4Q9DHFNTjwIVtqz5NA==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.20.0", @@ -7493,9 +7581,9 @@ } }, "node_modules/ra-ui-materialui/node_modules/dompurify": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.7.tgz", - "integrity": "sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q==", + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.8.tgz", + "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/ra-ui-materialui/node_modules/filter-obj": { @@ -7622,9 +7710,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.53.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.2.tgz", - "integrity": "sha512-YVel6fW5sOeedd1524pltpHX+jgU2u3DSDtXEaBORNdqiNrsX/nUI/iGXONegttg0mJVnfrIkiV0cmTU6Oo2xw==", + "version": "7.54.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.0.tgz", + "integrity": "sha512-PS05+UQy/IdSbJNojBypxAo9wllhHgGmyr8/dyGQcPoiMf3e7Dfb9PWYVRco55bLbxH9S+1yDDJeTdlYCSxO3A==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -7715,19 +7803,20 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", - "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", + "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", + "dunder-proto": "^1.0.0", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "which-builtin-type": "^1.1.4" + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.0" }, "engines": { "node": ">= 0.4" @@ -8040,9 +8129,9 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", - "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", + "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", "dev": true, "license": "MIT", "dependencies": { @@ -8056,24 +8145,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.27.4", - "@rollup/rollup-android-arm64": "4.27.4", - "@rollup/rollup-darwin-arm64": "4.27.4", - "@rollup/rollup-darwin-x64": "4.27.4", - "@rollup/rollup-freebsd-arm64": "4.27.4", - "@rollup/rollup-freebsd-x64": "4.27.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", - "@rollup/rollup-linux-arm-musleabihf": "4.27.4", - "@rollup/rollup-linux-arm64-gnu": "4.27.4", - "@rollup/rollup-linux-arm64-musl": "4.27.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", - "@rollup/rollup-linux-riscv64-gnu": "4.27.4", - "@rollup/rollup-linux-s390x-gnu": "4.27.4", - "@rollup/rollup-linux-x64-gnu": "4.27.4", - "@rollup/rollup-linux-x64-musl": "4.27.4", - "@rollup/rollup-win32-arm64-msvc": "4.27.4", - "@rollup/rollup-win32-ia32-msvc": "4.27.4", - "@rollup/rollup-win32-x64-msvc": "4.27.4", + "@rollup/rollup-android-arm-eabi": "4.28.1", + "@rollup/rollup-android-arm64": "4.28.1", + "@rollup/rollup-darwin-arm64": "4.28.1", + "@rollup/rollup-darwin-x64": "4.28.1", + "@rollup/rollup-freebsd-arm64": "4.28.1", + "@rollup/rollup-freebsd-x64": "4.28.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", + "@rollup/rollup-linux-arm-musleabihf": "4.28.1", + "@rollup/rollup-linux-arm64-gnu": "4.28.1", + "@rollup/rollup-linux-arm64-musl": "4.28.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", + "@rollup/rollup-linux-riscv64-gnu": "4.28.1", + "@rollup/rollup-linux-s390x-gnu": "4.28.1", + "@rollup/rollup-linux-x64-gnu": "4.28.1", + "@rollup/rollup-linux-x64-musl": "4.28.1", + "@rollup/rollup-win32-arm64-msvc": "4.28.1", + "@rollup/rollup-win32-ia32-msvc": "4.28.1", + "@rollup/rollup-win32-x64-msvc": "4.28.1", "fsevents": "~2.3.2" } }, @@ -8130,15 +8220,16 @@ "license": "BSD-3-Clause" }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -8261,16 +8352,73 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -8372,16 +8520,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8391,16 +8542,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8521,9 +8676,9 @@ "license": "MIT" }, "node_modules/ts-api-utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.1.tgz", - "integrity": "sha512-5RU2/lxTA3YUZxju61HO2U6EoZLvBLtmV2mbTvqyu4a/7s7RmJPT+1YekhMVsQhznRWk/czIwDUg+V8Q9ZuG4w==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", "engines": { @@ -8769,12 +8924,12 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/utf8": { @@ -8938,17 +9093,20 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", + "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.0", + "is-number-object": "^1.1.0", + "is-string": "^1.1.0", + "is-symbol": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9002,9 +9160,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9147,6 +9305,15 @@ "optional": true } } + }, + "node_modules/zustand/node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } } } } From 07561e9e3194ed1d2d559e2e686f15c74cc7f717 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Thu, 12 Dec 2024 10:34:59 +0000 Subject: [PATCH 50/82] chore: prepare for release 1.23.0 (#2340) --- .github/workflows/scan_sca_current.yml | 2 +- backend/application/__init__.py | 2 +- backend/pyproject.toml | 2 +- .../parsers/cyclone_dx/files/changed/licenses_1.json | 8 ++++---- .../parsers/cyclone_dx/files/licenses_1.json | 8 ++++---- .../services/test_import_observations.py | 2 +- .../vex/api/files/csaf_given_vulnerability.json | 2 +- .../api/files/csaf_given_vulnerability_update.json | 2 +- .../vex/api/files/csaf_product_branches.json | 2 +- .../vex/api/files/csaf_product_given_branch.json | 2 +- .../vex/api/files/csaf_product_no_branch.json | 2 +- .../vex/api/files/csaf_product_no_branch_update.json | 2 +- .../vex/api/files/openvex_given_vulnerability.json | 2 +- .../files/openvex_given_vulnerability_update.json | 2 +- .../vex/api/files/openvex_product_branches.json | 2 +- .../vex/api/files/openvex_product_given_branch.json | 2 +- .../vex/api/files/openvex_product_no_branch.json | 2 +- .../api/files/openvex_product_no_branch_update.json | 2 +- .../vex/services/files/so_csaf_2024_0001_0001.json | 2 +- .../services/files/so_csaf_2024_0001_0001_short.json | 2 +- .../services/files/so_openvex_2024_0001_0001.json | 2 +- docker-compose-prod-mysql.yml | 4 ++-- docker-compose-prod-postgres.yml | 4 ++-- docs/getting_started/installation.md | 4 ++-- end_to_end_tests/package-lock.json | 4 ++-- end_to_end_tests/package.json | 2 +- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- so_configuration_sca_current.yml | 12 ++++++------ 29 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/scan_sca_current.yml b/.github/workflows/scan_sca_current.yml index 1c13a9cd3..02cdc8cd2 100644 --- a/.github/workflows/scan_sca_current.yml +++ b/.github/workflows/scan_sca_current.yml @@ -15,7 +15,7 @@ jobs: name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: 'v1.22.5' + ref: 'v1.23.0' - name: Run SCA vulnerability scanners uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main diff --git a/backend/application/__init__.py b/backend/application/__init__.py index e809b7c39..f795cbe74 100644 --- a/backend/application/__init__.py +++ b/backend/application/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.22.5" +__version__ = "1.23.0" import pymysql diff --git a/backend/pyproject.toml b/backend/pyproject.toml index d156d9b34..4faee3f0b 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "SecObserve" -version = "1.22.5" +version = "1.23.0" description = "SecObserve is an open source vulnerability management system for software development and cloud environments." license = "BSD-3-Clause" authors = [ diff --git a/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json b/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json index 4275ee5d2..d6c7fc759 100644 --- a/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json +++ b/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json @@ -31,11 +31,11 @@ ], "component": { "name": "SecObserve", - "version": "1.22.5", + "version": "1.23.0", "description": "SecObserve is an open source vulnerability management system for software development and cloud environments.", "type": "application", - "bom-ref": "pkg:pypi/secobserve@1.22.5", - "purl": "pkg:pypi/secobserve@1.22.5" + "bom-ref": "pkg:pypi/secobserve@1.23.0", + "purl": "pkg:pypi/secobserve@1.23.0" }, "properties": [ { @@ -2786,7 +2786,7 @@ ], "dependencies": [ { - "ref": "pkg:pypi/secobserve@1.22.5", + "ref": "pkg:pypi/secobserve@1.23.0", "dependsOn": [ "pkg:pypi/argon2-cffi@23.1.0", "pkg:pypi/cvss@3.2", diff --git a/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json b/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json index 7fbc42784..6d1e3c220 100644 --- a/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json +++ b/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json @@ -31,11 +31,11 @@ ], "component": { "name": "SecObserve", - "version": "1.22.5", + "version": "1.23.0", "description": "SecObserve is an open source vulnerability management system for software development and cloud environments.", "type": "application", - "bom-ref": "pkg:pypi/secobserve@1.22.5", - "purl": "pkg:pypi/secobserve@1.22.5" + "bom-ref": "pkg:pypi/secobserve@1.23.0", + "purl": "pkg:pypi/secobserve@1.23.0" }, "properties": [ { @@ -2789,7 +2789,7 @@ ], "dependencies": [ { - "ref": "pkg:pypi/secobserve@1.22.5", + "ref": "pkg:pypi/secobserve@1.23.0", "dependsOn": [ "pkg:pypi/argon2-cffi@23.1.0", "pkg:pypi/cvss@3.2", diff --git a/backend/unittests/import_observations/services/test_import_observations.py b/backend/unittests/import_observations/services/test_import_observations.py index fa73e5e39..15885e437 100644 --- a/backend/unittests/import_observations/services/test_import_observations.py +++ b/backend/unittests/import_observations/services/test_import_observations.py @@ -542,7 +542,7 @@ def _file_upload_licenses( ) self.assertEqual(license_components[1].purl_type, "pypi") self.assertEqual(license_components[1].cpe, "") - dependencies = """SecObserve:1.22.5 --> argon2-cffi:23.1.0 + dependencies = """SecObserve:1.23.0 --> argon2-cffi:23.1.0 argon2-cffi:23.1.0 --> argon2-cffi-bindings:21.2.0""" self.assertEqual(license_components[1].dependencies, dependencies) self.assertEqual( diff --git a/backend/unittests/vex/api/files/csaf_given_vulnerability.json b/backend/unittests/vex/api/files/csaf_given_vulnerability.json index 844dfa2d7..1f347327e 100644 --- a/backend/unittests/vex/api/files/csaf_given_vulnerability.json +++ b/backend/unittests/vex/api/files/csaf_given_vulnerability.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json b/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json index 2a2e8c27e..98e35d6c8 100644 --- a/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json +++ b/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "CSAF_2024_0001_0002", diff --git a/backend/unittests/vex/api/files/csaf_product_branches.json b/backend/unittests/vex/api/files/csaf_product_branches.json index aa197cc7f..4e1027786 100644 --- a/backend/unittests/vex/api/files/csaf_product_branches.json +++ b/backend/unittests/vex/api/files/csaf_product_branches.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_product_given_branch.json b/backend/unittests/vex/api/files/csaf_product_given_branch.json index 750766e83..fa6e33749 100644 --- a/backend/unittests/vex/api/files/csaf_product_given_branch.json +++ b/backend/unittests/vex/api/files/csaf_product_given_branch.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_product_no_branch.json b/backend/unittests/vex/api/files/csaf_product_no_branch.json index f7e69e2af..847263d30 100644 --- a/backend/unittests/vex/api/files/csaf_product_no_branch.json +++ b/backend/unittests/vex/api/files/csaf_product_no_branch.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_product_no_branch_update.json b/backend/unittests/vex/api/files/csaf_product_no_branch_update.json index c36406a76..9fb5dc9c2 100644 --- a/backend/unittests/vex/api/files/csaf_product_no_branch_update.json +++ b/backend/unittests/vex/api/files/csaf_product_no_branch_update.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "CSAF_2024_0001_0002", diff --git a/backend/unittests/vex/api/files/openvex_given_vulnerability.json b/backend/unittests/vex/api/files/openvex_given_vulnerability.json index 50ee003bf..38d7cbfaa 100644 --- a/backend/unittests/vex/api/files/openvex_given_vulnerability.json +++ b/backend/unittests/vex/api/files/openvex_given_vulnerability.json @@ -47,6 +47,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.22.5", + "tooling": "SecObserve / 1.23.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json b/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json index 8de179f96..2b375aa2a 100644 --- a/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json +++ b/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json @@ -37,6 +37,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.22.5", + "tooling": "SecObserve / 1.23.0", "version": 2 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_branches.json b/backend/unittests/vex/api/files/openvex_product_branches.json index 253383c70..0df3bb6a1 100644 --- a/backend/unittests/vex/api/files/openvex_product_branches.json +++ b/backend/unittests/vex/api/files/openvex_product_branches.json @@ -70,6 +70,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.22.5", + "tooling": "SecObserve / 1.23.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_given_branch.json b/backend/unittests/vex/api/files/openvex_product_given_branch.json index ccd1ab159..bea3611ee 100644 --- a/backend/unittests/vex/api/files/openvex_product_given_branch.json +++ b/backend/unittests/vex/api/files/openvex_product_given_branch.json @@ -28,6 +28,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.22.5", + "tooling": "SecObserve / 1.23.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_no_branch.json b/backend/unittests/vex/api/files/openvex_product_no_branch.json index 6f6707505..6158c1304 100644 --- a/backend/unittests/vex/api/files/openvex_product_no_branch.json +++ b/backend/unittests/vex/api/files/openvex_product_no_branch.json @@ -63,6 +63,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.22.5", + "tooling": "SecObserve / 1.23.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_no_branch_update.json b/backend/unittests/vex/api/files/openvex_product_no_branch_update.json index f55031aba..e55ad08ec 100644 --- a/backend/unittests/vex/api/files/openvex_product_no_branch_update.json +++ b/backend/unittests/vex/api/files/openvex_product_no_branch_update.json @@ -64,6 +64,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.22.5", + "tooling": "SecObserve / 1.23.0", "version": 2 } \ No newline at end of file diff --git a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json index ab670210e..abfb245a9 100644 --- a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json +++ b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "so_2024_0001_0001", diff --git a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json index 02d806177..333ddf37e 100644 --- a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json +++ b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.22.5" + "version": "1.23.0" } }, "id": "so_2024_0001_0001", diff --git a/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json b/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json index 3f6e8d1be..ab6db3a74 100644 --- a/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json +++ b/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json @@ -294,6 +294,6 @@ } ], "timestamp": "2024-07-14T11:17:57.668593+00:00", - "tooling": "SecObserve / 1.22.5", + "tooling": "SecObserve / 1.23.0", "version": 1 } \ No newline at end of file diff --git a/docker-compose-prod-mysql.yml b/docker-compose-prod-mysql.yml index e0dcbbb4a..8fea3a205 100644 --- a/docker-compose-prod-mysql.yml +++ b/docker-compose-prod-mysql.yml @@ -35,7 +35,7 @@ services: - traefik frontend: - image: maibornwolff/secobserve-frontend:1.22.5 + image: maibornwolff/secobserve-frontend:1.23.0 container_name: "prod_secobserve_frontend" labels: - "traefik.enable=true" @@ -54,7 +54,7 @@ services: - traefik backend: - image: maibornwolff/secobserve-backend:1.22.5 + image: maibornwolff/secobserve-backend:1.23.0 container_name: "prod_secobserve_backend" labels: - "traefik.enable=true" diff --git a/docker-compose-prod-postgres.yml b/docker-compose-prod-postgres.yml index c74f1842e..b39d168dc 100644 --- a/docker-compose-prod-postgres.yml +++ b/docker-compose-prod-postgres.yml @@ -35,7 +35,7 @@ services: - traefik frontend: - image: maibornwolff/secobserve-frontend:1.22.5 + image: maibornwolff/secobserve-frontend:1.23.0 container_name: "prod_secobserve_frontend" labels: - "traefik.enable=true" @@ -54,7 +54,7 @@ services: - traefik backend: - image: maibornwolff/secobserve-backend:1.22.5 + image: maibornwolff/secobserve-backend:1.23.0 container_name: "prod_secobserve_backend" labels: - "traefik.enable=true" diff --git a/docs/getting_started/installation.md b/docs/getting_started/installation.md index a9acf5723..f48e7cddc 100644 --- a/docs/getting_started/installation.md +++ b/docs/getting_started/installation.md @@ -45,7 +45,7 @@ services: - default frontend: - image: maibornwolff/secobserve-frontend:1.22.5 + image: maibornwolff/secobserve-frontend:1.23.0 labels: - "traefik.enable=true" - "traefik.http.routers.frontend.rule=Host(`secobserve.localhost`)" @@ -62,7 +62,7 @@ services: - traefik backend: - image: maibornwolff/secobserve-backend:1.22.5 + image: maibornwolff/secobserve-backend:1.23.0 labels: - "traefik.enable=true" - "traefik.http.routers.backend.rule=Host(`secobserve-backend.localhost`)" diff --git a/end_to_end_tests/package-lock.json b/end_to_end_tests/package-lock.json index 81826e121..841495c27 100644 --- a/end_to_end_tests/package-lock.json +++ b/end_to_end_tests/package-lock.json @@ -1,12 +1,12 @@ { "name": "end_to_end_tests", - "version": "1.22.5", + "version": "1.23.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "end_to_end_tests", - "version": "1.22.5", + "version": "1.23.0", "devDependencies": { "@playwright/test": "1.49.1", "@types/node": "22.10.2" diff --git a/end_to_end_tests/package.json b/end_to_end_tests/package.json index e29953097..61a0705f9 100644 --- a/end_to_end_tests/package.json +++ b/end_to_end_tests/package.json @@ -1,6 +1,6 @@ { "name": "end_to_end_tests", - "version": "1.22.5", + "version": "1.23.0", "private": true, "description": "", "main": "index.js", diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ebd14b2fc..4eff89499 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "secobserve", - "version": "1.22.5", + "version": "1.23.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "secobserve", - "version": "1.22.5", + "version": "1.23.0", "license": "BSD-3-Clause", "dependencies": { "@emotion/react": "11.14.0", diff --git a/frontend/package.json b/frontend/package.json index 399623ed7..93ff4c6a7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "secobserve", - "version": "1.22.5", + "version": "1.23.0", "license": "BSD-3-Clause", "description": "SecObserve is an open source vulnerability management system for software development and cloud environments.", "private": true, diff --git a/so_configuration_sca_current.yml b/so_configuration_sca_current.yml index cfa11ea0c..00a63cb5d 100644 --- a/so_configuration_sca_current.yml +++ b/so_configuration_sca_current.yml @@ -1,18 +1,18 @@ trivy_image_backend_current: SCANNER: trivy_image - TARGET: "maibornwolff/secobserve-backend:1.22.5" + TARGET: "maibornwolff/secobserve-backend:1.23.0" FURTHER_PARAMETERS: "--pkg-types os --db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_backend_image.json" SO_ORIGIN_SERVICE: "backend" - SO_BRANCH_NAME: "1.22.5" + SO_BRANCH_NAME: "1.23.0" trivy_image_frontend_current: SCANNER: trivy_image - TARGET: "maibornwolff/secobserve-frontend:1.22.5" + TARGET: "maibornwolff/secobserve-frontend:1.23.0" FURTHER_PARAMETERS: "--pkg-types os --db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_frontend_image.json" SO_ORIGIN_SERVICE: "frontend" - SO_BRANCH_NAME: "1.22.5" + SO_BRANCH_NAME: "1.23.0" trivy_filesystem_backend_current: SCANNER: trivy_filesystem @@ -21,7 +21,7 @@ trivy_filesystem_backend_current: FURTHER_PARAMETERS: "--db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_backend_poetry.json" SO_ORIGIN_SERVICE: "backend" - SO_BRANCH_NAME: "1.22.5" + SO_BRANCH_NAME: "1.23.0" trivy_filesystem_frontend_current: SCANNER: trivy_filesystem @@ -30,7 +30,7 @@ trivy_filesystem_frontend_current: FURTHER_PARAMETERS: "--db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_frontend_npm.json" SO_ORIGIN_SERVICE: "frontend" - SO_BRANCH_NAME: "1.22.5" + SO_BRANCH_NAME: "1.23.0" importer: SO_UPLOAD: "true" From 5a044dddb359b9660d23dd554c85efaa3ebabadc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 05:45:58 +0100 Subject: [PATCH 51/82] chore(deps): update github/codeql-action action to v3.27.9 (#2343) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index b9b8d4204..654a2177e 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@babb554ede22fd5605947329c4d04d8e7a0b8155 # v3.27.7 + uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 with: sarif_file: results.sarif From 3d49d94637d55b1119614a0734fcccc37feccd37 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 14 Dec 2024 06:24:03 +0000 Subject: [PATCH 52/82] chore(deps): update eslint monorepo to v9.17.0 (#2344) --- frontend/package-lock.json | 20 ++++++++++---------- frontend/package.json | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4eff89499..00585a2a3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -36,7 +36,7 @@ "devDependencies": { "@eslint/compat": "1.2.4", "@eslint/eslintrc": "3.2.0", - "@eslint/js": "9.16.0", + "@eslint/js": "9.17.0", "@microsoft/eslint-formatter-sarif": "3.1.0", "@trivago/prettier-plugin-sort-imports": "5.2.0", "@types/inflection": "1.13.2", @@ -48,7 +48,7 @@ "@typescript-eslint/eslint-plugin": "8.18.0", "@typescript-eslint/parser": "8.18.0", "@vitejs/plugin-react": "4.3.4", - "eslint": "9.16.0", + "eslint": "9.17.0", "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", @@ -1111,9 +1111,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", "dev": true, "license": "MIT", "engines": { @@ -4931,9 +4931,9 @@ } }, "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, "license": "MIT", "dependencies": { @@ -4942,7 +4942,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.9.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", + "@eslint/js": "9.17.0", "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -4951,7 +4951,7 @@ "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", diff --git a/frontend/package.json b/frontend/package.json index 93ff4c6a7..67a1cb989 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -45,7 +45,7 @@ "devDependencies": { "@eslint/compat": "1.2.4", "@eslint/eslintrc": "3.2.0", - "@eslint/js": "9.16.0", + "@eslint/js": "9.17.0", "@microsoft/eslint-formatter-sarif": "3.1.0", "@trivago/prettier-plugin-sort-imports": "5.2.0", "@types/inflection": "1.13.2", @@ -57,7 +57,7 @@ "@typescript-eslint/eslint-plugin": "8.18.0", "@typescript-eslint/parser": "8.18.0", "@vitejs/plugin-react": "4.3.4", - "eslint": "9.16.0", + "eslint": "9.17.0", "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", From a7388df43b8951139470d6a003b296fff478c1d1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 09:22:42 +0000 Subject: [PATCH 53/82] fix(deps): update dependency jsonpickle to v4.0.1 (#2346) --- backend/poetry.lock | 8 ++++---- backend/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 6fed13b75..61c4edb96 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1205,13 +1205,13 @@ test = ["MarkupSafe (>=0.23)", "PyYAML (>=5.1)", "docutils (>=0.12)", "flaky", " [[package]] name = "jsonpickle" -version = "4.0.0" +version = "4.0.1" description = "jsonpickle encodes/decodes any Python object to/from JSON" optional = false python-versions = ">=3.8" files = [ - {file = "jsonpickle-4.0.0-py3-none-any.whl", hash = "sha256:53730b9e094bc41f540bfdd25eaf6e6cf43811590e9e1477abcec44b866ddcd9"}, - {file = "jsonpickle-4.0.0.tar.gz", hash = "sha256:fc670852b204d77601b08f8f9333149ac37ab6d3fe4e6ed3b578427291f63736"}, + {file = "jsonpickle-4.0.1-py3-none-any.whl", hash = "sha256:2973c0b0d988c6792ed6c446fa582c48352e79c2880fa2c013f1abde15905555"}, + {file = "jsonpickle-4.0.1.tar.gz", hash = "sha256:b5336144d902958b92cb08bc1e76bfa47199b8afd454303693894defd2fa50c5"}, ] [package.extras] @@ -2572,4 +2572,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "d5401abd82e8c00d0ba2bc4e2f3a369fccbfb745b8b990cc1e5378f97df1c2fb" +content-hash = "0b2414a9638c58c42ff22a70ff998823ff378f4060f9ccbf77e02e78a5ec9a4f" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 4faee3f0b..795686e74 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -56,7 +56,7 @@ jira = "3.8.0" # https://github.com/pycontribs/jira inflect = "7.4.0" # https://github.com/jaraco/inflect validators = "0.34.0" # https://github.com/python-validators/validators cvss = "3.3" # https://github.com/RedHatProductSecurity/cvss -jsonpickle = "4.0.0" # https://github.com/jsonpickle/jsonpickle +jsonpickle = "4.0.1" # https://github.com/jsonpickle/jsonpickle py-ocsf-models = "0.2.0" # https://github.com/prowler-cloud/py-ocsf-models semver = "3.0.2" # https://github.com/python-semver/python-semver license-expression = "30.4.0" # https://github.com/aboutcode-org/license-expression From 6bb75e59a002e8b266a53f870ffb14ee1dff7e89 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 15 Dec 2024 12:52:33 +0100 Subject: [PATCH 54/82] fix(deps): update dependency djangorestframework-stubs to v3.15.2 (#2345) * fix(deps): update dependency djangorestframework-stubs to v3.15.2 * fix: corrct wrong field type * fix: unittest for product api token --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Stefan Fleckenstein --- .../application/access_control/api/serializers.py | 7 +++---- backend/poetry.lock | 14 +++++++------- backend/pyproject.toml | 2 +- .../api/test_authorization_product_api_tokens.py | 4 ++-- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/backend/application/access_control/api/serializers.py b/backend/application/access_control/api/serializers.py index b22e8a4c8..277857174 100644 --- a/backend/application/access_control/api/serializers.py +++ b/backend/application/access_control/api/serializers.py @@ -1,9 +1,8 @@ from typing import Optional -from django.core.validators import MinValueValidator +from django.core.validators import MaxValueValidator, MinValueValidator from rest_framework.serializers import ( CharField, - ChoiceField, IntegerField, ModelSerializer, Serializer, @@ -21,7 +20,7 @@ get_authorization_group_member, ) from application.access_control.services.authorization import get_user_permissions -from application.access_control.services.roles_permissions import Permissions, Roles +from application.access_control.services.roles_permissions import Permissions from application.commons.services.global_request import get_current_user from application.core.models import Product_Authorization_Group_Member, Product_Member @@ -283,7 +282,7 @@ class AuthenticationResponseSerializer(Serializer): class ProductApiTokenSerializer(Serializer): id = IntegerField(validators=[MinValueValidator(0)]) - role = ChoiceField(choices=Roles) + role = IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)]) class ApiTokenSerializer(ModelSerializer): diff --git a/backend/poetry.lock b/backend/poetry.lock index 61c4edb96..295d9c204 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -810,24 +810,24 @@ django = ">=4.2" [[package]] name = "djangorestframework-stubs" -version = "3.15.1" +version = "3.15.2" description = "PEP-484 stubs for django-rest-framework" optional = true -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "djangorestframework_stubs-3.15.1-py3-none-any.whl", hash = "sha256:79dc9018f5d5fa420f9981eec9f1e820ecbd04719791f144419cdc6c5b8e29bd"}, - {file = "djangorestframework_stubs-3.15.1.tar.gz", hash = "sha256:34539871895d66d382b6ae3655d9f95c1de7733cf50bc29097638d367ed3117d"}, + {file = "djangorestframework_stubs-3.15.2-py3-none-any.whl", hash = "sha256:0e72f1e8507bdb2acd99b304520494ea5d45bccba51a4877140cb65fd461adf0"}, + {file = "djangorestframework_stubs-3.15.2.tar.gz", hash = "sha256:3df129845acac6c1b097bc7e5b360d53e32a02029d60b4f972dfbd3e2508f236"}, ] [package.dependencies] -django-stubs = ">=5.0.4" +django-stubs = ">=5.1.1" requests = ">=2.0.0" types-PyYAML = ">=5.4.3" types-requests = ">=0.1.12" typing-extensions = ">=3.10.0" [package.extras] -compatible-mypy = ["django-stubs[compatible-mypy]", "mypy (>=1.11.0,<1.12.0)"] +compatible-mypy = ["django-stubs[compatible-mypy]", "mypy (>=1.12,<1.14)"] coreapi = ["coreapi (>=2.0.0)"] markdown = ["types-Markdown (>=0.1.5)"] @@ -2572,4 +2572,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "0b2414a9638c58c42ff22a70ff998823ff378f4060f9ccbf77e02e78a5ec9a4f" +content-hash = "c99ff233f770a01fa4eb9ea3ccab8b91fd0596f2c0eef73196ae9eef9682a99d" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 795686e74..a6bb6e334 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -84,7 +84,7 @@ pylint-django = { version = "2.6.1", optional = true } # https://github.com/PyC pre-commit = { version = "4.0.1", optional = true } # https://github.com/pre-commit/pre-commit mypy = { version = "1.13.0", optional = true } # https://github.com/python/mypy django-stubs = { version = "5.1.1", optional = true } # https://github.com/typeddjango/django-stubs -djangorestframework-stubs = { version = "3.15.1", optional = true } # https://github.com/typeddjango/djangorestframework-stubs +djangorestframework-stubs = { version = "3.15.2", optional = true } # https://github.com/typeddjango/djangorestframework-stubs types-PyMySQL = { version = "1.1.0.20241103", optional = true } # https://github.com/python/typeshed # import-linter = "2.0" # https://github.com/seddonym/import-linter --> Cannot be build with Docker diff --git a/backend/unittests/access_control/api/test_authorization_product_api_tokens.py b/backend/unittests/access_control/api/test_authorization_product_api_tokens.py index 4ac4ab52b..b5db86cec 100644 --- a/backend/unittests/access_control/api/test_authorization_product_api_tokens.py +++ b/backend/unittests/access_control/api/test_authorization_product_api_tokens.py @@ -6,7 +6,7 @@ class TestAuthorizationProductApiTokens(TestAuthorizationBase): def test_authorization_product_api_tokens(self): - expected_data = "{'results': [{'id': 2, 'role': }]}" + expected_data = "{'results': [{'id': 2, 'role': 2}]}" self._test_api( APITest( "db_admin", @@ -54,7 +54,7 @@ def test_authorization_product_api_tokens(self): ) ) - expected_data = "{'results': [{'id': 1, 'role': }]}" + expected_data = "{'results': [{'id': 1, 'role': 2}]}" self._test_api( APITest( "db_internal_write", From 0b68e9e9d6513b10e169904b25a00df7a1a47815 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Sun, 15 Dec 2024 12:08:12 +0000 Subject: [PATCH 55/82] fix: show zero observations if no licenses (#2347) --- .../src/import_observations/import/FileUploadObservations.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/import_observations/import/FileUploadObservations.tsx b/frontend/src/import_observations/import/FileUploadObservations.tsx index 143c2b04a..c1be765ff 100644 --- a/frontend/src/import_observations/import/FileUploadObservations.tsx +++ b/frontend/src/import_observations/import/FileUploadObservations.tsx @@ -91,7 +91,7 @@ const FileUploadObservations = () => { result.json.license_components_deleted > 0; let message = ""; - if (observations) + if (observations || !license_components) message += result.json.observations_new + " new observations\n" + From 9a9aae2df3309dc4452cebd636e1ec16bfa66ff4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 15:07:16 +0000 Subject: [PATCH 56/82] chore(deps): update dependency @types/react to v18.3.17 (#2350) --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 00585a2a3..93e650177 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,7 +42,7 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.2", "@types/prop-types": "15.7.14", - "@types/react": "18.3.16", + "@types/react": "18.3.17", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.0", @@ -3059,9 +3059,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.16", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.16.tgz", - "integrity": "sha512-oh8AMIC4Y2ciKufU8hnKgs+ufgbA/dhPTACaZPM86AbwX9QwnFtSoPWEeRUj8fge+v6kFt78BXcDhAU1SrrAsw==", + "version": "18.3.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", + "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index 67a1cb989..864d204f0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -51,7 +51,7 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.2", "@types/prop-types": "15.7.14", - "@types/react": "18.3.16", + "@types/react": "18.3.17", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.0", From b21d9ce09d6e7f60d6cccaadf1fb418755f2e115 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:09:44 +0100 Subject: [PATCH 57/82] chore(deps): update dependency mkdocs-material to v9.5.49 (#2351) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- mkdocs_requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs_requirements.txt b/mkdocs_requirements.txt index b3da4011e..f6d6d1f14 100644 --- a/mkdocs_requirements.txt +++ b/mkdocs_requirements.txt @@ -1 +1 @@ -mkdocs-material==9.5.48 # https://github.com/squidfunk/mkdocs-material +mkdocs-material==9.5.49 # https://github.com/squidfunk/mkdocs-material From 61767af34713091100fca1e26ea514f3c19d16eb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 17:18:01 +0100 Subject: [PATCH 58/82] chore(deps): update docker/setup-buildx-action action to v3.8.0 (#2352) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build_push_dev.yml | 2 +- .github/workflows/build_push_release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_push_dev.yml b/.github/workflows/build_push_dev.yml index 1d0c0d3ad..7b5ee348c 100644 --- a/.github/workflows/build_push_dev.yml +++ b/.github/workflows/build_push_dev.yml @@ -16,7 +16,7 @@ jobs: uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 diff --git a/.github/workflows/build_push_release.yml b/.github/workflows/build_push_release.yml index 2c3a24b74..7821dc8bc 100644 --- a/.github/workflows/build_push_release.yml +++ b/.github/workflows/build_push_release.yml @@ -24,7 +24,7 @@ jobs: uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1 + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - name: Login to Docker Hub uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 From c675b2104c0bc8a0f84a97538402ed9935551c29 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Mon, 16 Dec 2024 16:36:25 +0000 Subject: [PATCH 59/82] feat: parser for semgrep json format (#2349) * feat: parser for semgrep json format * chore: code quality * chore: unittests --- .../parsers/semgrep/__init__.py | 0 .../parsers/semgrep/parser.py | 144 ++++++++++ .../management/test_register_parsers.py | 4 +- .../parsers/semgrep/__init__.py | 0 .../semgrep/files/multiple_observations.json | 245 ++++++++++++++++++ .../parsers/semgrep/files/no_observation.json | 4 + .../parsers/semgrep/files/wrong_format.json | 3 + .../parsers/semgrep/test_parser.py | 103 ++++++++ .../github_actions_and_templates.md | 40 +-- docs/integrations/supported_scanners.md | 2 +- 10 files changed, 522 insertions(+), 23 deletions(-) create mode 100644 backend/application/import_observations/parsers/semgrep/__init__.py create mode 100644 backend/application/import_observations/parsers/semgrep/parser.py create mode 100644 backend/unittests/import_observations/parsers/semgrep/__init__.py create mode 100644 backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json create mode 100644 backend/unittests/import_observations/parsers/semgrep/files/no_observation.json create mode 100644 backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json create mode 100644 backend/unittests/import_observations/parsers/semgrep/test_parser.py diff --git a/backend/application/import_observations/parsers/semgrep/__init__.py b/backend/application/import_observations/parsers/semgrep/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/application/import_observations/parsers/semgrep/parser.py b/backend/application/import_observations/parsers/semgrep/parser.py new file mode 100644 index 000000000..9b338c933 --- /dev/null +++ b/backend/application/import_observations/parsers/semgrep/parser.py @@ -0,0 +1,144 @@ +from json import dumps, load + +from django.core.files.base import File + +from application.core.models import Observation +from application.core.types import Severity +from application.import_observations.parsers.base_parser import ( + BaseFileParser, + BaseParser, +) +from application.import_observations.types import Parser_Type + +SEVERITIES = { + "error": Severity.SEVERITY_HIGH, + "warning": Severity.SEVERITY_MEDIUM, + "info": Severity.SEVERITY_LOW, +} + + +class SemgrepParser(BaseParser, BaseFileParser): + @classmethod + def get_name(cls) -> str: + return "Semgrep" + + @classmethod + def get_type(cls) -> str: + return Parser_Type.TYPE_SAST + + def check_format(self, file: File) -> tuple[bool, list[str], dict | list]: + try: # pylint: disable=duplicate-code + data = load(file) + except Exception: + return False, ["File is not valid JSON"], {} + + if not data.get("version"): + return False, ["File is not a Semgrep format, version is missing"], {} + + if not isinstance(data.get("results"), list): + return False, ["File is not a Semgrep format, data is not a list"], {} + + if len(data.get("results")) >= 1: # pylint: disable=duplicate-code + first_element = data.get("results")[0] + if not isinstance(first_element, dict): + return ( + False, + ["File is not a Semgrep format, element is not a dictionary"], + {}, + ) + if not first_element.get("check_id"): + return ( + False, + [ + "Data is not a Semgrep format, element doesn't have a check_id entry" + ], + {}, + ) + + return True, [], data + + def get_observations(self, data: dict) -> list[Observation]: + observations = [] + + version = data.get("version") + + for result in data.get("results", {}): + extra = result.get("extra", {}) + metadata = extra.get("metadata", {}) + category = metadata.get("category") + if category.lower() != "security": + continue + + check_id = result.get("check_id") + path = result.get("path") + start_line = None + end_line = None + if path: + start_line = result.get("start", {}).get("line") + end_line = result.get("end", {}).get("line") + severity = extra.get("severity") + engine_kind = extra.get("engine_kind") + fix = extra.get("fix") + if fix: + fix = f"```\n{fix}\n```" + + so_severity = SEVERITIES.get(severity.lower(), Severity.SEVERITY_UNKNOWN) + + scanner = self.get_name() + if engine_kind: + scanner = f"{scanner} ({engine_kind})" + scanner = f"{scanner} / {version}" + + observation = Observation( + title=check_id, + description=self._get_description(result), + recommendation=fix, + parser_severity=so_severity, + origin_source_file=path, + origin_source_line_start=start_line, + origin_source_line_end=end_line, + scanner=scanner, + ) + + evidence = [] + evidence.append("Result") + evidence.append(dumps(result)) + observation.unsaved_evidences.append(evidence) + + observation.unsaved_references = self._get_references(result) + + observations.append(observation) + + return observations + + def _get_description(self, result: dict) -> str: + extra = result.get("extra", {}) + message = extra.get("message") + metadata = extra.get("metadata", {}) + vulnerability_class = metadata.get("vulnerability_class", []) + + description = f"{message}" + + if len(vulnerability_class) == 1: + description += f"\n\n**Vulnerability Class:** {vulnerability_class[0]}" + if len(vulnerability_class) > 1: + description += ( + f"\n\n**Vulnerability Classes:** {', '.join(vulnerability_class)}" + ) + + return description + + def _get_references(self, result: dict) -> list[str]: + so_references = [] + + extra = result.get("extra", {}) + metadata = extra.get("metadata", {}) + references = metadata.get("references") + source = metadata.get("source") + references = metadata.get("references", []) + + if source: + so_references.append(source) + so_references.extend(references) + + return so_references diff --git a/backend/unittests/import_observations/management/test_register_parsers.py b/backend/unittests/import_observations/management/test_register_parsers.py index a27dab7e9..6707bfd94 100644 --- a/backend/unittests/import_observations/management/test_register_parsers.py +++ b/backend/unittests/import_observations/management/test_register_parsers.py @@ -17,7 +17,7 @@ def test_register_parsers(self): command.handle() parsers = Parser.objects.all().order_by("name") - self.assertEqual(12, len(parsers)) + self.assertEqual(13, len(parsers)) parser = parsers[0] self.assertEqual("Azure Defender", parser.name) @@ -40,7 +40,7 @@ def test_register_parsers(self): self.assertEqual("", parser.module_name) self.assertEqual("", parser.class_name) - parser = parsers[10] + parser = parsers[11] self.assertEqual("Trivy Operator Prometheus", parser.name) self.assertEqual("Other", parser.type) self.assertEqual("API", parser.source) diff --git a/backend/unittests/import_observations/parsers/semgrep/__init__.py b/backend/unittests/import_observations/parsers/semgrep/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json b/backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json new file mode 100644 index 000000000..65dc8d146 --- /dev/null +++ b/backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json @@ -0,0 +1,245 @@ +{ + "version": "1.100.0", + "results": [ + { + "check_id": "python.lang.correctness.return-in-init.return-in-init", + "path": "application/api/utils.py", + "start": { + "line": 10, + "col": 44, + "offset": 398 + }, + "end": { + "line": 10, + "col": 95, + "offset": 449 + }, + "extra": { + "message": "`return` should never appear inside a class __init__ function. This will cause a runtime error.", + "metadata": { + "category": "correctness", + "technology": [ + "python" + ], + "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", + "source": "https://semgrep.dev/r/python.lang.correctness.return-in-init.return-in-init", + "shortlink": "https://sg.run/4xwl", + "semgrep.dev": { + "rule": { + "origin": "community", + "r_id": 9600, + "rule_id": "AbUzYe", + "rv_id": 946298, + "url": "https://semgrep.dev/playground/r/O9TX3WW/python.lang.correctness.return-in-init.return-in-init", + "version_id": "O9TX3WW" + } + } + }, + "severity": "ERROR", + "fingerprint": "requires login", + "lines": "requires login", + "validation_state": "NO_VALIDATOR", + "engine_kind": "OSS" + } + }, + { + "check_id": "python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", + "path": "application/management/commands/command.py", + "start": { + "line": 62, + "col": 17, + "offset": 3082 + }, + "end": { + "line": 62, + "col": 62, + "offset": 3127 + }, + "extra": { + "message": "Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.", + "metadata": { + "cwe": [ + "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')" + ], + "owasp": [ + "A01:2017 - Injection", + "A03:2021 - Injection" + ], + "references": [ + "https://docs.sqlalchemy.org/en/14/core/tutorial.html#using-textual-sql", + "https://www.tutorialspoint.com/sqlalchemy/sqlalchemy_quick_guide.htm", + "https://docs.sqlalchemy.org/en/14/core/tutorial.html#using-more-specific-text-with-table-expression-literal-column-and-expression-column" + ], + "category": "security", + "technology": [ + "sqlalchemy" + ], + "cwe2022-top25": true, + "cwe2021-top25": true, + "subcategory": [ + "audit" + ], + "likelihood": "LOW", + "impact": "HIGH", + "confidence": "LOW", + "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", + "vulnerability_class": [ + "SQL Injection" + ], + "source": "https://semgrep.dev/r/python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", + "shortlink": "https://sg.run/2b1L", + "semgrep.dev": { + "rule": { + "origin": "community", + "r_id": 10563, + "rule_id": "oqUz5y", + "rv_id": 946452, + "url": "https://semgrep.dev/playground/r/8KTKj19/python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", + "version_id": "8KTKj19" + } + } + }, + "severity": "ERROR", + "fingerprint": "requires login", + "lines": "requires login", + "validation_state": "NO_VALIDATOR", + "engine_kind": "OSS" + } + }, + { + "check_id": "python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", + "path": "application/tools/functions.py", + "start": { + "line": 45, + "col": 24, + "offset": 1496 + }, + "end": { + "line": 46, + "col": 34, + "offset": 1580 + }, + "extra": { + "message": "Detected MD5 hash algorithm which is considered insecure. MD5 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead.", + "metadata": { + "source-rule-url": "https://github.com/PyCQA/bandit/blob/d5f8fa0d89d7b11442fc6ec80ca42953974354c8/bandit/blacklists/calls.py#L59", + "cwe": [ + "CWE-327: Use of a Broken or Risky Cryptographic Algorithm" + ], + "owasp": [ + "A03:2017 - Sensitive Data Exposure", + "A02:2021 - Cryptographic Failures" + ], + "bandit-code": "B303", + "asvs": { + "control_id": "6.2.2 Insecure Custom Algorithm", + "control_url": "https://github.com/OWASP/ASVS/blob/master/4.0/en/0x14-V6-Cryptography.md#v62-algorithms", + "section": "V6 Stored Cryptography Verification Requirements", + "version": "4" + }, + "references": [ + "https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html", + "https://www.trendmicro.com/vinfo/us/security/news/vulnerabilities-and-exploits/sha-1-collision-signals-the-end-of-the-algorithm-s-viability", + "http://2012.sharcs.org/slides/stevens.pdf", + "https://pycryptodome.readthedocs.io/en/latest/src/hash/sha3_256.html" + ], + "category": "security", + "technology": [ + "python" + ], + "subcategory": [ + "vuln" + ], + "likelihood": "LOW", + "impact": "MEDIUM", + "confidence": "MEDIUM", + "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", + "vulnerability_class": [ + "Cryptographic Issues", + "Other Issues" + ], + "source": "https://semgrep.dev/r/python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", + "shortlink": "https://sg.run/vYrY", + "semgrep.dev": { + "rule": { + "origin": "community", + "r_id": 33633, + "rule_id": "PeU2e2", + "rv_id": 946401, + "url": "https://semgrep.dev/playground/r/vdTGnR5/python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", + "version_id": "vdTGnR5" + } + } + }, + "severity": "WARNING", + "fingerprint": "requires login", + "lines": "requires login", + "validation_state": "NO_VALIDATOR", + "engine_kind": "OSS" + } + }, + { + "check_id": "python.lang.security.use-defusedcsv.use-defusedcsv", + "path": "application/management/commands/command.py", + "start": { + "line": 33, + "col": 18, + "offset": 820 + }, + "end": { + "line": 33, + "col": 50, + "offset": 852 + }, + "extra": { + "message": "Detected the generation of a CSV file using the built-in `csv` module. If user data is used to generate the data in this file, it is possible that an attacker could inject a formula when the CSV is imported into a spreadsheet application that runs an attacker script, which could steal data from the importing user or, at worst, install malware on the user's computer. `defusedcsv` is a drop-in replacement with the same API that will attempt to mitigate formula injection attempts. You can use `defusedcsv` instead of `csv` to safely generate CSVs.", + "fix": "defusedcsv.writer(open(file_path, 'w'))", + "metadata": { + "cwe": [ + "CWE-1236: Improper Neutralization of Formula Elements in a CSV File" + ], + "owasp": [ + "A01:2017 - Injection", + "A03:2021 - Injection" + ], + "references": [ + "https://github.com/raphaelm/defusedcsv", + "https://owasp.org/www-community/attacks/CSV_Injection", + "https://web.archive.org/web/20220516052229/https://www.contextis.com/us/blog/comma-separated-vulnerabilities" + ], + "category": "security", + "technology": [ + "python" + ], + "confidence": "LOW", + "subcategory": [ + "audit" + ], + "likelihood": "LOW", + "impact": "LOW", + "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", + "vulnerability_class": [ + "Improper Validation" + ], + "source": "https://semgrep.dev/r/python.lang.security.use-defusedcsv.use-defusedcsv", + "shortlink": "https://sg.run/GzRn", + "semgrep.dev": { + "rule": { + "origin": "community", + "r_id": 31148, + "rule_id": "gxUrAb", + "rv_id": 946409, + "url": "https://semgrep.dev/playground/r/gETe1DO/python.lang.security.use-defusedcsv.use-defusedcsv", + "version_id": "gETe1DO" + } + } + }, + "severity": "INFO", + "fingerprint": "requires login", + "lines": "requires login", + "validation_state": "NO_VALIDATOR", + "engine_kind": "OSS" + } + } + ] +} diff --git a/backend/unittests/import_observations/parsers/semgrep/files/no_observation.json b/backend/unittests/import_observations/parsers/semgrep/files/no_observation.json new file mode 100644 index 000000000..b4ed2e6a0 --- /dev/null +++ b/backend/unittests/import_observations/parsers/semgrep/files/no_observation.json @@ -0,0 +1,4 @@ +{ + "version": "1.100.0", + "results": [] +} diff --git a/backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json b/backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json new file mode 100644 index 000000000..f43c3e770 --- /dev/null +++ b/backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json @@ -0,0 +1,3 @@ +{ + "data": "data" +} diff --git a/backend/unittests/import_observations/parsers/semgrep/test_parser.py b/backend/unittests/import_observations/parsers/semgrep/test_parser.py new file mode 100644 index 000000000..8824e063c --- /dev/null +++ b/backend/unittests/import_observations/parsers/semgrep/test_parser.py @@ -0,0 +1,103 @@ +from os import path +from unittest import TestCase + +from application.import_observations.parsers.semgrep.parser import SemgrepParser + + +class TestSemgrepParser(TestCase): + def test_no_json(self): + with open(path.dirname(__file__) + "/test_parser.py") as testfile: + parser = SemgrepParser() + check, messages, data = parser.check_format(testfile) + + self.assertFalse(check) + self.assertEqual(1, len(messages)) + self.assertEqual("File is not valid JSON", messages[0]) + self.assertFalse(data) + + def test_wrong_format(self): + with open(path.dirname(__file__) + "/files/wrong_format.json") as testfile: + parser = SemgrepParser() + check, messages, data = parser.check_format(testfile) + + self.assertFalse(check) + self.assertEqual(1, len(messages)) + self.assertEqual( + "File is not a Semgrep format, version is missing", messages[0] + ) + self.assertFalse(data) + + def test_no_observation(self): + with open(path.dirname(__file__) + "/files/no_observation.json") as testfile: + parser = SemgrepParser() + check, messages, data = parser.check_format(testfile) + observations = parser.get_observations(data) + + self.assertTrue(check) + self.assertEqual(0, len(messages)) + self.assertEqual(0, len(observations)) + + def test_multiple_observations(self): + with open( + path.dirname(__file__) + "/files/multiple_observations.json" + ) as testfile: + parser = SemgrepParser() + check, messages, data = parser.check_format(testfile) + observations = parser.get_observations(data) + + self.assertTrue(check) + self.assertEqual(0, len(messages)) + self.assertEqual(3, len(observations)) + + observation = observations[0] + self.assertEqual( + "python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", + observation.title, + ) + description = """Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option. + +**Vulnerability Class:** SQL Injection""" + self.assertEqual(description, observation.description) + self.assertEqual(None, observation.recommendation) + self.assertEqual("High", observation.parser_severity) + self.assertEqual( + "application/management/commands/command.py", + observation.origin_source_file, + ) + self.assertEqual(62, observation.origin_source_line_start) + self.assertEqual(62, observation.origin_source_line_end) + self.assertEqual("Semgrep (OSS) / 1.100.0", observation.scanner) + self.assertEqual(4, len(observation.unsaved_references)) + self.assertEqual( + "https://semgrep.dev/r/python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", + observation.unsaved_references[0], + ) + self.assertEqual( + "https://docs.sqlalchemy.org/en/14/core/tutorial.html#using-textual-sql", + observation.unsaved_references[1], + ) + self.assertEqual(1, len(observation.unsaved_evidences)) + self.assertEqual("Result", observation.unsaved_evidences[0][0]) + self.assertIn("oqUz5y", observation.unsaved_evidences[0][1]) + + observation = observations[1] + self.assertEqual( + "python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", + observation.title, + ) + description = """Detected MD5 hash algorithm which is considered insecure. MD5 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. + +**Vulnerability Classes:** Cryptographic Issues, Other Issues""" + self.assertEqual(description, observation.description) + self.assertEqual(None, observation.recommendation) + self.assertEqual("Medium", observation.parser_severity) + + observation = observations[2] + self.assertEqual( + "python.lang.security.use-defusedcsv.use-defusedcsv", observation.title + ) + recommendation = """``` +defusedcsv.writer(open(file_path, 'w')) +```""" + self.assertEqual(recommendation, observation.recommendation) + self.assertEqual("Low", observation.parser_severity) diff --git a/docs/integrations/github_actions_and_templates.md b/docs/integrations/github_actions_and_templates.md index 38d65a7f2..fa5e5ebda 100644 --- a/docs/integrations/github_actions_and_templates.md +++ b/docs/integrations/github_actions_and_templates.md @@ -89,8 +89,8 @@ jobs: - name: Run Bandit uses: MaibornWolff/secobserve_actions_templates/actions/SAST/bandit@main with: - target: 'dd_import' - report_name: 'dd_import_bandit.sarif' + target: 'backend' + report_name: 'backend_bandit.sarif' so_api_base_url: ${{ vars.SO_API_BASE_URL }} so_api_token: ${{ secrets.SO_API_TOKEN }} so_product_name: ${{ vars.SO_PRODUCT_NAME }} @@ -98,8 +98,8 @@ jobs: - name: Run Semgrep uses: MaibornWolff/secobserve_actions_templates/actions/SAST/semgrep@main with: - target: 'dd_import' - report_name: 'dd_import_semgrep.json' + target: 'backend' + report_name: 'backend_semgrep.json' configuration: 'r/python' so_api_base_url: ${{ vars.SO_API_BASE_URL }} so_api_token: ${{ secrets.SO_API_TOKEN }} @@ -109,7 +109,7 @@ jobs: uses: MaibornWolff/secobserve_actions_templates/actions/SAST/kics@main with: target: '.' - report_name: 'dd_import_kics.sarif' + report_name: 'backend_kics.sarif' so_api_base_url: ${{ vars.SO_API_BASE_URL }} so_api_token: ${{ secrets.SO_API_TOKEN }} so_product_name: ${{ vars.SO_PRODUCT_NAME }} @@ -118,7 +118,7 @@ jobs: uses: MaibornWolff/secobserve_actions_templates/actions/SAST/checkov@main with: target: '.' - report_name: 'dd_import_checkov.sarif' + report_name: 'backend_checkov.sarif' so_api_base_url: ${{ vars.SO_API_BASE_URL }} so_api_token: ${{ secrets.SO_API_TOKEN }} so_product_name: ${{ vars.SO_PRODUCT_NAME }} @@ -126,8 +126,8 @@ jobs: - name: Run Trivy image uses: MaibornWolff/secobserve_actions_templates/actions/SCA/trivy_image@main with: - target: 'maibornwolff/dd-import:latest' - report_name: 'dd_import_trivy_image.json' + target: 'maibornwolff/secobserve-backend:latest' + report_name: 'backend_trivy_image.json' so_api_base_url: ${{ vars.SO_API_BASE_URL }} so_api_token: ${{ secrets.SO_API_TOKEN }} so_product_name: ${{ vars.SO_PRODUCT_NAME }} @@ -135,8 +135,8 @@ jobs: - name: Run Grype image uses: MaibornWolff/secobserve_actions_templates/actions/SCA/grype_image@main with: - target: 'maibornwolff/dd-import:latest' - report_name: 'dd_import_grype_image.json' + target: 'maibornwolff/secobserve-backend:latest' + report_name: 'backend_grype_image.json' so_api_base_url: ${{ vars.SO_API_BASE_URL }} so_api_token: ${{ secrets.SO_API_TOKEN }} so_product_name: ${{ vars.SO_PRODUCT_NAME }} @@ -144,7 +144,7 @@ jobs: - name: Run Gitleaks uses: MaibornWolff/secobserve_actions_templates/actions/secrets/gitleaks@main with: - report_name: 'dd_import_gitleaks.sarif' + report_name: 'backend_gitleaks.sarif' so_api_base_url: ${{ vars.SO_API_BASE_URL }} so_api_token: ${{ secrets.SO_API_TOKEN }} so_product_name: ${{ vars.SO_PRODUCT_NAME }} @@ -154,13 +154,13 @@ jobs: with: name: secobserve path: | - dd_import_bandit.sarif - dd_import_semgrep.json - dd_import_kics.sarif - dd_import_checkov.sarif - dd_import_trivy_image.json - dd_import_grype_image.json - dd_import_gitleaks.sarif + backend_bandit.sarif + backend_semgrep.json + backend_kics.sarif + backend_checkov.sarif + backend_trivy_image.json + backend_grype_image.json + backend_gitleaks.sarif ``` ## Examplary pipeline for GitLab CI templates @@ -377,7 +377,7 @@ semgrep_backend: RUN_DIRECTORY: "." CONFIGURATION: "r/python" TARGET: "backend" - REPORT_NAME: "semgrep_backend.sarif" + REPORT_NAME: "semgrep_backend.json" SO_ORIGIN_SERVICE: "backend" SO_BRANCH_NAME: $GITHUB_REF_NAME @@ -386,7 +386,7 @@ semgrep_frontend: RUN_DIRECTORY: "." CONFIGURATION: "r/typescript" TARGET: "frontend/src" - REPORT_NAME: "semgrep_frontend.sarif" + REPORT_NAME: "semgrep_frontend.json" SO_ORIGIN_SERVICE: "frontend" SO_BRANCH_NAME: $GITHUB_REF_NAME diff --git a/docs/integrations/supported_scanners.md b/docs/integrations/supported_scanners.md index 8065bf72d..7a33e359e 100644 --- a/docs/integrations/supported_scanners.md +++ b/docs/integrations/supported_scanners.md @@ -39,7 +39,7 @@ These scanners have been tested with SecObserve: | [Bandit](https://bandit.readthedocs.io/en/latest) | SARIF | File | | [ESLint](https://github.com/nodesecurity/eslint-plugin-security) | SARIF | File | | [Find-Sec-Bugs](https://find-sec-bugs.github.io) | SARIF | File | -| [Semgrep](https://semgrep.dev/docs) | SARIF | File | +| [Semgrep](https://semgrep.dev/docs) | Semgrep | File | | **SAST infrastructure** | | [Checkov](https://www.checkov.io/1.Welcome/Quick%20Start.html) | SARIF | File | | [KICS](https://docs.kics.io/latest) | SARIF | File | From 39b0c35314adc097691cd16a382ef88af078fba9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 06:08:05 +0000 Subject: [PATCH 60/82] chore(deps): update typescript-eslint monorepo to v8.18.1 (#2353) --- frontend/package-lock.json | 90 +++++++++++++++++++------------------- frontend/package.json | 4 +- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 93e650177..f21f64cb4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -45,8 +45,8 @@ "@types/react": "18.3.17", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.18.0", - "@typescript-eslint/parser": "8.18.0", + "@typescript-eslint/eslint-plugin": "8.18.1", + "@typescript-eslint/parser": "8.18.1", "@vitejs/plugin-react": "4.3.4", "eslint": "9.17.0", "eslint-plugin-react": "7.37.2", @@ -3113,17 +3113,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.0.tgz", - "integrity": "sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", + "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/type-utils": "8.18.0", - "@typescript-eslint/utils": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/type-utils": "8.18.1", + "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3143,16 +3143,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.0.tgz", - "integrity": "sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", + "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", "dev": true, - "license": "MITClause", + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4" }, "engines": { @@ -3168,14 +3168,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.0.tgz", - "integrity": "sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", + "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0" + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3186,14 +3186,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.0.tgz", - "integrity": "sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", + "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.0", - "@typescript-eslint/utils": "8.18.0", + "@typescript-eslint/typescript-estree": "8.18.1", + "@typescript-eslint/utils": "8.18.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3210,9 +3210,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.0.tgz", - "integrity": "sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", + "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", "dev": true, "license": "MIT", "engines": { @@ -3224,14 +3224,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.0.tgz", - "integrity": "sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", + "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/visitor-keys": "8.18.0", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/visitor-keys": "8.18.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3277,16 +3277,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.0.tgz", - "integrity": "sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", + "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.0", - "@typescript-eslint/types": "8.18.0", - "@typescript-eslint/typescript-estree": "8.18.0" + "@typescript-eslint/scope-manager": "8.18.1", + "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3301,13 +3301,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.0.tgz", - "integrity": "sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", + "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.0", + "@typescript-eslint/types": "8.18.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { diff --git a/frontend/package.json b/frontend/package.json index 864d204f0..7441ef6f1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,8 +54,8 @@ "@types/react": "18.3.17", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.18.0", - "@typescript-eslint/parser": "8.18.0", + "@typescript-eslint/eslint-plugin": "8.18.1", + "@typescript-eslint/parser": "8.18.1", "@vitejs/plugin-react": "4.3.4", "eslint": "9.17.0", "eslint-plugin-react": "7.37.2", From d31f24d41275111fb3638eb61916f3ae2b98aa3c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 06:52:18 +0000 Subject: [PATCH 61/82] chore(deps): update traefik docker tag to v3.2.3 (#2354) --- docker-compose-prod-mysql.yml | 2 +- docker-compose-prod-postgres.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose-prod-mysql.yml b/docker-compose-prod-mysql.yml index 8fea3a205..1c738ad57 100644 --- a/docker-compose-prod-mysql.yml +++ b/docker-compose-prod-mysql.yml @@ -10,7 +10,7 @@ networks: services: traefik: - image: "traefik:v3.2.2" + image: "traefik:v3.2.3" container_name: "prod_traefik" command: - "--log.level=INFO" diff --git a/docker-compose-prod-postgres.yml b/docker-compose-prod-postgres.yml index b39d168dc..284282f4d 100644 --- a/docker-compose-prod-postgres.yml +++ b/docker-compose-prod-postgres.yml @@ -10,7 +10,7 @@ networks: services: traefik: - image: "traefik:v3.2.2" + image: "traefik:v3.2.3" container_name: "prod_traefik" command: - "--log.level=INFO" From f39a2e80373dc3a7d0e049933f0e758127f2e96e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2024 08:17:51 +0100 Subject: [PATCH 62/82] fix(deps): update font awesome to v6.7.2 (#2355) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 36 ++++++++++++++++++------------------ frontend/package.json | 6 +++--- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f21f64cb4..5d14ef5fe 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11,9 +11,9 @@ "dependencies": { "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", - "@fortawesome/fontawesome-svg-core": "6.7.1", - "@fortawesome/free-brands-svg-icons": "6.7.1", - "@fortawesome/free-solid-svg-icons": "6.7.1", + "@fortawesome/fontawesome-svg-core": "6.7.2", + "@fortawesome/free-brands-svg-icons": "6.7.2", + "@fortawesome/free-solid-svg-icons": "6.7.2", "@fortawesome/react-fontawesome": "0.2.2", "@textea/json-viewer": "3.5.0", "axios": "1.7.9", @@ -1144,45 +1144,45 @@ } }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.1.tgz", - "integrity": "sha512-gbDz3TwRrIPT3i0cDfujhshnXO9z03IT1UKRIVi/VEjpNHtSBIP2o5XSm+e816FzzCFEzAxPw09Z13n20PaQJQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", + "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.1.tgz", - "integrity": "sha512-8dBIHbfsKlCk2jHQ9PoRBg2Z+4TwyE3vZICSnoDlnsHA6SiMlTwfmW6yX0lHsRmWJugkeb92sA0hZdkXJhuz+g==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", + "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", "license": "MIT", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.1" + "@fortawesome/fontawesome-common-types": "6.7.2" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.1.tgz", - "integrity": "sha512-nJR76eqPzCnMyhbiGf6X0aclDirZriTPRcFm1YFvuupyJOGwlNF022w3YBqu+yrHRhnKRpzFX+8wJKqiIjWZkA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.2.tgz", + "integrity": "sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==", "license": "(CC-BY-4.0 AND MIT)", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.1" + "@fortawesome/fontawesome-common-types": "6.7.2" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.1.tgz", - "integrity": "sha512-BTKc0b0mgjWZ2UDKVgmwaE0qt0cZs6ITcDgjrti5f/ki7aF5zs+N91V6hitGo3TItCFtnKg6cUVGdTmBFICFRg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", + "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", "license": "(CC-BY-4.0 AND MIT)", "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.1" + "@fortawesome/fontawesome-common-types": "6.7.2" }, "engines": { "node": ">=6" diff --git a/frontend/package.json b/frontend/package.json index 7441ef6f1..550409fef 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -7,9 +7,9 @@ "dependencies": { "@emotion/react": "11.14.0", "@emotion/styled": "11.14.0", - "@fortawesome/fontawesome-svg-core": "6.7.1", - "@fortawesome/free-brands-svg-icons": "6.7.1", - "@fortawesome/free-solid-svg-icons": "6.7.1", + "@fortawesome/fontawesome-svg-core": "6.7.2", + "@fortawesome/free-brands-svg-icons": "6.7.2", + "@fortawesome/free-solid-svg-icons": "6.7.2", "@fortawesome/react-fontawesome": "0.2.2", "@textea/json-viewer": "3.5.0", "axios": "1.7.9", From d25f2eaa90f23e1828a17a505fd39d0d912bf010 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Tue, 17 Dec 2024 18:41:54 +0000 Subject: [PATCH 63/82] feat: export license policy to JSON and YAML (#2356) * feat: export license policy to JSON and YAML * fix: typo in unittest --- .../application/commons/services/export.py | 30 ++++++ backend/application/licenses/api/views.py | 68 ++++++++++++ .../services/export_license_policy.py | 83 ++++++++++++++ backend/poetry.lock | 18 ++-- backend/pyproject.toml | 13 +-- .../access_control/api/test_authentication.py | 2 + .../test_authorization_license_policies.py | 71 ++++++++++++ .../unittests/licenses/services/__init__.py | 0 .../services/test_export_license_policy.py | 99 +++++++++++++++++ .../licenses/license_policies/ExportMenu.tsx | 102 ++++++++++++++++++ .../license_policies/LicensePolicyShow.tsx | 2 + 11 files changed, 473 insertions(+), 15 deletions(-) create mode 100644 backend/application/licenses/services/export_license_policy.py create mode 100644 backend/unittests/licenses/services/__init__.py create mode 100644 backend/unittests/licenses/services/test_export_license_policy.py create mode 100644 frontend/src/licenses/license_policies/ExportMenu.tsx diff --git a/backend/application/commons/services/export.py b/backend/application/commons/services/export.py index 31ae78eb2..0bd067c86 100644 --- a/backend/application/commons/services/export.py +++ b/backend/application/commons/services/export.py @@ -1,6 +1,8 @@ +import json from datetime import datetime from typing import Any +import jsonpickle from defusedcsv import csv from django.db.models.query import QuerySet from django.http import HttpResponse @@ -98,3 +100,31 @@ def export_csv( fields.append(value) writer.writerow(fields) + + +def object_to_json(object_to_encode: Any) -> str: + jsonpickle.set_encoder_options("json", ensure_ascii=False) + json_string = jsonpickle.encode(object_to_encode, unpicklable=False) + + json_dict = json.loads(json_string) + json_dict = _remove_empty_elements(json_dict) + + return json.dumps(json_dict, indent=4, sort_keys=True, ensure_ascii=False) + + +def _remove_empty_elements(d: dict) -> dict: + """recursively remove empty lists, empty dicts, or None elements from a dictionary""" + + def empty(x): + return x is None or x == {} or x == [] + + if not isinstance(d, (dict, list)): + return d + if isinstance(d, list): + return [v for v in (_remove_empty_elements(v) for v in d) if not empty(v)] + + return { + k: v + for k, v in ((k, _remove_empty_elements(v)) for k, v in d.items()) + if not empty(v) + } diff --git a/backend/application/licenses/api/views.py b/backend/application/licenses/api/views.py index 062a6a4ad..8e4be5f0b 100644 --- a/backend/application/licenses/api/views.py +++ b/backend/application/licenses/api/views.py @@ -2,6 +2,7 @@ from typing import Optional, Tuple from django.db.models.query import QuerySet +from django.http import HttpResponse from django_filters.rest_framework import DjangoFilterBackend from drf_spectacular.utils import OpenApiParameter, extend_schema from rest_framework.decorators import action @@ -15,6 +16,7 @@ from application.access_control.services.authorization import user_has_permission_or_403 from application.access_control.services.roles_permissions import Permissions +from application.commons.services.global_request import get_current_user from application.core.models import Branch, Product from application.core.queries.branch import get_branch_by_id from application.core.queries.product import get_product_by_id @@ -99,6 +101,10 @@ get_license_policy_member, get_license_policy_members, ) +from application.licenses.services.export_license_policy import ( + export_license_policy_json, + export_license_policy_yaml, +) from application.licenses.services.license_group import ( copy_license_group, import_scancode_licensedb, @@ -545,6 +551,68 @@ def apply_product(self, request): status=HTTP_204_NO_CONTENT, ) + @extend_schema( + methods=["GET"], + responses={200: None}, + ) + @action(detail=True, methods=["get"]) + def export_json(self, request, pk=None): + license_policy = self._get_license_policy(pk, False) + license_policy_export = export_license_policy_json(license_policy) + + response = HttpResponse( # pylint: disable=http-response-with-content-type-json + content=license_policy_export, + content_type="application/json", + ) + response["Content-Disposition"] = ( + f"attachment; filename=license_policy_{pk}.json" + ) + + return response + + @extend_schema( + methods=["GET"], + responses={200: None}, + ) + @action(detail=True, methods=["get"]) + def export_yaml(self, request, pk=None): + license_policy = self._get_license_policy(pk, False) + license_policy_export = export_license_policy_yaml(license_policy) + + response = HttpResponse( + content=license_policy_export, + content_type="application/yaml", + ) + response["Content-Disposition"] = ( + f"attachment; filename=license_policy_{pk}.yaml" + ) + + return response + + def _get_license_policy(self, pk: int, manager: bool) -> License_Policy: + license_policy = get_license_policy(pk) + if license_policy is None: + raise NotFound("License policy not found") + + if not manager and license_policy.is_public: + return license_policy + + user = get_current_user() + if not user: + raise PermissionDenied("No user found") + + if user.is_superuser: + return license_policy + + license_policy_member = get_license_policy_member(license_policy, user) + if not license_policy.is_public and not license_policy_member: + raise NotFound("License policy not found") + + if manager and license_policy_member and not license_policy_member.is_manager: + raise PermissionDenied("You are not a manager of this license policy") + + return license_policy + class LicensePolicyItemViewSet(ModelViewSet): serializer_class = LicensePolicyItemSerializer diff --git a/backend/application/licenses/services/export_license_policy.py b/backend/application/licenses/services/export_license_policy.py new file mode 100644 index 000000000..ffe381168 --- /dev/null +++ b/backend/application/licenses/services/export_license_policy.py @@ -0,0 +1,83 @@ +import json +from dataclasses import dataclass +from typing import Optional + +import yaml + +from application.commons.services.export import object_to_json +from application.licenses.models import License_Policy, License_Policy_Item +from application.licenses.services.license_policy import get_ignore_component_type_list + + +@dataclass +class License_Policy_Export_Item: + evaluation_result: str + spdx_license: Optional[str] = None + license_expression: Optional[str] = None + unknown_license: Optional[str] = None + license_group: Optional[str] = None + + +@dataclass +class License_Policy_Export_Ignore_Component_Type: + component_type: str + + +@dataclass +class License_Policy_Export: + name: str + description: str + items: list[License_Policy_Export_Item] + ignore_component_types: list[License_Policy_Export_Ignore_Component_Type] + + +def export_license_policy_yaml(license_policy: License_Policy) -> str: + return yaml.dump(json.loads(export_license_policy_json(license_policy))) + + +def export_license_policy_json(license_policy: License_Policy) -> str: + return object_to_json(_create_license_policy_export(license_policy)) + + +def _create_license_policy_export( + license_policy: License_Policy, +) -> License_Policy_Export: + license_policy_eport = License_Policy_Export( + name=license_policy.name, + description=license_policy.description, + items=[], + ignore_component_types=get_ignore_component_type_list( + license_policy.ignore_component_types + ), + ) + + license_policy_item: Optional[License_Policy_Item] = None + for license_policy_item in license_policy.license_policy_items.all(): + if license_policy_item.license_group: + for spdx_license in license_policy_item.license_group.licenses.all(): + license_policy_eport_item = License_Policy_Export_Item( + spdx_license=spdx_license.spdx_id, + license_group=license_policy_item.license_group.name, + evaluation_result=license_policy_item.evaluation_result, + ) + license_policy_eport.items.append(license_policy_eport_item) + elif license_policy_item.license: + license_policy_eport_item = License_Policy_Export_Item( + spdx_license=license_policy_item.license.spdx_id, + evaluation_result=license_policy_item.evaluation_result, + ) + license_policy_eport.items.append(license_policy_eport_item) + elif license_policy_item.license_expression: + license_policy_eport_item = License_Policy_Export_Item( + license_expression=license_policy_item.license_expression, + evaluation_result=license_policy_item.evaluation_result, + ) + license_policy_eport.items.append(license_policy_eport_item) + elif license_policy_item.unknown_license: + license_policy_eport_item = License_Policy_Export_Item( + unknown_license=license_policy_item.unknown_license, + evaluation_result=license_policy_item.evaluation_result, + ) + license_policy_eport.items.append(license_policy_eport_item) + + return license_policy_eport diff --git a/backend/poetry.lock b/backend/poetry.lock index 295d9c204..98d1aa4cd 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -105,19 +105,19 @@ test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] @@ -181,13 +181,13 @@ files = [ [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -2572,4 +2572,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "c99ff233f770a01fa4eb9ea3ccab8b91fd0596f2c0eef73196ae9eef9682a99d" +content-hash = "f45c89e9735ac316d4b9a124d9c1762226f3505615d982c17a8e5383c929a5ba" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index a6bb6e334..bb7f8de5b 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -38,13 +38,18 @@ requests = "2.32.3" # https://github.com/psf/requests # ------------------------------------------------------------------------------ pymysql = "1.1.1" # https://github.com/PyMySQL/PyMySQL psycopg = { version = "3.2.3", extras = ["binary"] } # https://github.com/psycopg/psycopg -# Excel and CSV +# Dataformats # ------------------------------------------------------------------------------ defusedcsv = "2.0.0" # https://github.com/raphaelm/defusedcsv openpyxl = "3.1.5" # https://foss.heptapod.net/openpyxl/openpyxl -# Package URL +jsonpickle = "4.0.1" # https://github.com/jsonpickle/jsonpickle +pyyaml = "6.0.2" # https://github.com/yaml/pyyaml +# Field specifications # ------------------------------------------------------------------------------ packageurl-python = "0.16.0" # https://github.com/package-url/packageurl-python +cvss = "3.3" # https://github.com/RedHatProductSecurity/cvss +semver = "3.0.2" # https://github.com/python-semver/python-semver +license-expression = "30.4.0" # https://github.com/aboutcode-org/license-expression # Task queue # ------------------------------------------------------------------------------ huey = "2.5.2" # https://github.com/coleifer/huey @@ -55,11 +60,7 @@ jira = "3.8.0" # https://github.com/pycontribs/jira # ------------------------------------------------------------------------------ inflect = "7.4.0" # https://github.com/jaraco/inflect validators = "0.34.0" # https://github.com/python-validators/validators -cvss = "3.3" # https://github.com/RedHatProductSecurity/cvss -jsonpickle = "4.0.1" # https://github.com/jsonpickle/jsonpickle py-ocsf-models = "0.2.0" # https://github.com/prowler-cloud/py-ocsf-models -semver = "3.0.2" # https://github.com/python-semver/python-semver -license-expression = "30.4.0" # https://github.com/aboutcode-org/license-expression # Development dependencies # ------------------------------------------------------------------------------ diff --git a/backend/unittests/access_control/api/test_authentication.py b/backend/unittests/access_control/api/test_authentication.py index 17ee024ce..75d4999db 100644 --- a/backend/unittests/access_control/api/test_authentication.py +++ b/backend/unittests/access_control/api/test_authentication.py @@ -382,6 +382,8 @@ def test_authentication(self, mock_user): self._check_authentication(["post"], "/api/license_policies/1/copy/") self._check_authentication(["post"], "/api/license_policies/1/apply/") self._check_authentication(["post"], "/api/license_policies/apply_product/") + self._check_authentication(["get"], "/api/license_policies/1/export_json/") + self._check_authentication(["get"], "/api/license_policies/1/export_yaml/") self._check_authentication(["get", "post"], "/api/license_policy_items/") self._check_authentication( diff --git a/backend/unittests/access_control/api/test_authorization_license_policies.py b/backend/unittests/access_control/api/test_authorization_license_policies.py index e2161d243..dabcf179b 100644 --- a/backend/unittests/access_control/api/test_authorization_license_policies.py +++ b/backend/unittests/access_control/api/test_authorization_license_policies.py @@ -55,6 +55,29 @@ def test_authorization_license_policies(self): no_second_user=True, ) ) + self._test_api( + APITest( + "db_internal_write", + "get", + "/api/license_policies/1002/export_json/", + None, + 200, + None, + no_second_user=True, + ) + ) + self._test_api( + APITest( + "db_internal_write", + "get", + "/api/license_policies/1002/export_yaml/", + None, + 200, + None, + no_second_user=True, + ) + ) + expected_data = "{'message': 'No License_Policy matches the given query.'}" self._test_api( APITest( @@ -67,6 +90,31 @@ def test_authorization_license_policies(self): no_second_user=True, ) ) + expected_data = "{'message': 'License policy not found'}" + self._test_api( + APITest( + "db_internal_write", + "get", + "/api/license_policies/1001/export_json/", + None, + 404, + expected_data, + no_second_user=True, + ) + ) + self._test_api( + APITest( + "db_internal_write", + "get", + "/api/license_policies/1001/export_yaml/", + None, + 404, + expected_data, + no_second_user=True, + ) + ) + + expected_data = "{'message': 'No License_Policy matches the given query.'}" self._test_api( APITest( "db_internal_write", @@ -78,6 +126,29 @@ def test_authorization_license_policies(self): no_second_user=True, ) ) + expected_data = "{'message': 'License policy not found'}" + self._test_api( + APITest( + "db_internal_write", + "get", + "/api/license_policies/99999/export_json/", + None, + 404, + expected_data, + no_second_user=True, + ) + ) + self._test_api( + APITest( + "db_internal_write", + "get", + "/api/license_policies/99999/export_yaml/", + None, + 404, + expected_data, + no_second_user=True, + ) + ) post_data = {"name": "new_license_policy"} expected_data = "{'id': 1005, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': False, 'has_users': True, 'has_authorization_groups': False, 'name': 'new_license_policy', 'description': '', 'is_public': False, 'ignore_component_types': ''}" diff --git a/backend/unittests/licenses/services/__init__.py b/backend/unittests/licenses/services/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/unittests/licenses/services/test_export_license_policy.py b/backend/unittests/licenses/services/test_export_license_policy.py new file mode 100644 index 000000000..b3445c343 --- /dev/null +++ b/backend/unittests/licenses/services/test_export_license_policy.py @@ -0,0 +1,99 @@ +from django.core.management import call_command + +from application.licenses.models import License, License_Policy, License_Policy_Item +from application.licenses.services.export_license_policy import ( + export_license_policy_json, + export_license_policy_yaml, +) +from application.licenses.types import License_Policy_Evaluation_Result +from unittests.base_test_case import BaseTestCase + + +class TestLicenseGroupMemberSerializer(BaseTestCase): + @classmethod + def setUpClass(self): + call_command( + "loaddata", + [ + "application/licenses/fixtures/initial_data.json", + "unittests/fixtures/unittests_fixtures.json", + "unittests/fixtures/unittests_license_fixtures.json", + ], + ) + + license_policy = License_Policy.objects.get(pk=1000) + license_policy.description = "description_1000" + license_policy.ignore_component_types = "apk, oci" + license_policy.save() + License_Policy_Item( + license_policy=license_policy, + license=License.objects.get(pk=1), + evaluation_result=License_Policy_Evaluation_Result.RESULT_FORBIDDEN, + ).save() + License_Policy_Item( + license_policy=license_policy, + license_expression="MIT OR 3BSD", + evaluation_result=License_Policy_Evaluation_Result.RESULT_REVIEW_REQUIRED, + ).save() + License_Policy_Item( + license_policy=license_policy, + unknown_license="Unknown", + evaluation_result=License_Policy_Evaluation_Result.RESULT_FORBIDDEN, + ).save() + + super().setUpClass() + + def test_export_json(self): + license_policy = License_Policy.objects.get(pk=1000) + json_data = export_license_policy_json(license_policy) + + json_data_expected = """{ + "description": "description_1000", + "ignore_component_types": [ + "apk", + "oci" + ], + "items": [ + { + "evaluation_result": "Allowed", + "license_group": "Permissive Model (Blue Oak Council)", + "spdx_license": "BlueOak-1.0.0" + }, + { + "evaluation_result": "Forbidden", + "spdx_license": "0BSD" + }, + { + "evaluation_result": "Review required", + "license_expression": "MIT OR 3BSD" + }, + { + "evaluation_result": "Forbidden", + "unknown_license": "Unknown" + } + ], + "name": "public" +}""" + self.assertEqual(json_data_expected, json_data) + + def test_export_yaml(self): + license_policy = License_Policy.objects.get(pk=1000) + yaml_data = export_license_policy_yaml(license_policy) + + yaml_data_expected = """description: description_1000 +ignore_component_types: +- apk +- oci +items: +- evaluation_result: Allowed + license_group: Permissive Model (Blue Oak Council) + spdx_license: BlueOak-1.0.0 +- evaluation_result: Forbidden + spdx_license: 0BSD +- evaluation_result: Review required + license_expression: MIT OR 3BSD +- evaluation_result: Forbidden + unknown_license: Unknown +name: public +""" + self.assertEqual(yaml_data_expected, yaml_data) diff --git a/frontend/src/licenses/license_policies/ExportMenu.tsx b/frontend/src/licenses/license_policies/ExportMenu.tsx new file mode 100644 index 000000000..3651251e1 --- /dev/null +++ b/frontend/src/licenses/license_policies/ExportMenu.tsx @@ -0,0 +1,102 @@ +import DescriptionIcon from "@mui/icons-material/Description"; +import DownloadIcon from "@mui/icons-material/Download"; +import { ListItemIcon } from "@mui/material"; +import Button from "@mui/material/Button"; +import Menu from "@mui/material/Menu"; +import MenuItem from "@mui/material/MenuItem"; +import { Fragment, MouseEvent, useState } from "react"; +import { useNotify } from "react-admin"; + +import axios_instance from "../../access_control/auth_provider/axios_instance"; +import { getIconAndFontColor } from "../../commons/functions"; + +interface ExportMenuProps { + license_policy: any; +} + +const ExportMenu = ({ license_policy }: ExportMenuProps) => { + const notify = useNotify(); + const [anchorEl, setAnchorEl] = useState(null); + const open = Boolean(anchorEl); + const handleClick = (event: MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + + const exportLicensePolicyJSON = async () => { + exportLicensePolicy("json"); + }; + + const exportLicensePolicyYAML = async () => { + exportLicensePolicy("yaml"); + }; + + const exportLicensePolicy = async (format: string) => { + axios_instance + .get("/license_policies/" + license_policy.id + "/export_" + format + "/") + .then(function (response) { + let blob = new Blob([response.data], { type: "application/" + format }); + if (format === "json") { + blob = new Blob([JSON.stringify(response.data, null, 4)], { type: "application/" + format }); + } + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = "license_policy_" + license_policy.id + "." + format; + link.click(); + + notify("License Policy downloaded", { + type: "success", + }); + }) + .catch(function (error) { + notify(error.message, { + type: "warning", + }); + }); + handleClose(); + }; + + return ( + + + + + + + + JSON + + + + + + YAML + + + + ); +}; + +export default ExportMenu; diff --git a/frontend/src/licenses/license_policies/LicensePolicyShow.tsx b/frontend/src/licenses/license_policies/LicensePolicyShow.tsx index 2fd7bb434..6d5cdcea8 100644 --- a/frontend/src/licenses/license_policies/LicensePolicyShow.tsx +++ b/frontend/src/licenses/license_policies/LicensePolicyShow.tsx @@ -20,6 +20,7 @@ import ProductEmbeddedList from "../../core/products/ProductEmbeddedList"; import LicensePolicyAuthorizationGroupMemberEmbeddedList from "../license_policy_authorization_group_members/LicensePolicyAuthorizationGroupMemberEmbeddedList"; import LicensePolicyItemEmbeddedList from "../license_policy_items/LicensePolicyItemEmbeddedList"; import LicensePolicyMemberEmbeddedList from "../license_policy_members/LicensePolicyMemberEmbeddedList"; +import ExportMenu from "./ExportMenu"; import LicensePolicyApply from "./LicensePolicyApply"; import LicensePolicyCopy from "./LicensePolicyCopy"; @@ -34,6 +35,7 @@ const ShowActions = () => { filterDefaultValues={{ is_active: true }} storeKey="license_policies.embedded" /> + {license_policy && } {license_policy && (license_policy.is_manager || is_superuser()) && license_policy.has_products && ( )} From 6b4b7c5e1b70403f5aeb6164278f8ab473070318 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 00:49:41 +0100 Subject: [PATCH 64/82] chore(deps): update actions/upload-artifact action to v4.5.0 (#2357) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 654a2177e..6eb553d6a 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -59,7 +59,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 + uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 with: name: SARIF file path: results.sarif From 5c0b6f5c20828caeb304738eead002edf40b2f41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 08:09:23 +0100 Subject: [PATCH 65/82] fix(deps): update dependency markdown-to-jsx to v7.7.2 (#2358) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5d14ef5fe..4dc6e4e51 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -18,7 +18,7 @@ "@textea/json-viewer": "3.5.0", "axios": "1.7.9", "chart.js": "4.4.7", - "markdown-to-jsx": "7.7.1", + "markdown-to-jsx": "7.7.2", "mermaid": "11.4.1", "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", @@ -6568,9 +6568,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.1.tgz", - "integrity": "sha512-BjLkHb+fWCAH9gp7ndbgPrY+zeZlGFtCiQNTWk+PD+GKfLg9YsUPNonSsYXGw6nQ7eZqeR+i71X59PpWXlxc/w==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz", + "integrity": "sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g==", "license": "MIT", "engines": { "node": ">= 10" diff --git a/frontend/package.json b/frontend/package.json index 550409fef..0d397218e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,7 +14,7 @@ "@textea/json-viewer": "3.5.0", "axios": "1.7.9", "chart.js": "4.4.7", - "markdown-to-jsx": "7.7.1", + "markdown-to-jsx": "7.7.2", "mermaid": "11.4.1", "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", From 0b96600b10f39028d615f535c7e52f1f3ac15959 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:20:21 +0100 Subject: [PATCH 66/82] fix(deps): update react-admin monorepo to v5.4.3 (#2360) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 52 +++++++++++++++++++------------------- frontend/package.json | 4 +-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4dc6e4e51..e1d5afa5f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,9 +23,9 @@ "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", "query-string": "9.1.1", - "ra-input-rich-text": "5.4.2", + "ra-input-rich-text": "5.4.3", "react": "18.3.1", - "react-admin": "5.4.2", + "react-admin": "5.4.3", "react-chartjs-2": "5.2.0", "react-dom": "18.3.1", "react-is": "18.3.1", @@ -7422,9 +7422,9 @@ "license": "MIT" }, "node_modules/ra-core": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/ra-core/-/ra-core-5.4.2.tgz", - "integrity": "sha512-HxfxhUVl0U6rjobb50wiv3IblnRDQPqHXXv3WNZaUK2/bAZ5qX8qfSHe96quhrzSXbv5FHS4G3aPRxANXWVauQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/ra-core/-/ra-core-5.4.3.tgz", + "integrity": "sha512-Jf9y7e7R0qKw9xd5cfGHg9jpYtphLjbRjnaZjDA2VjB/a+N37yl9krJAsUv2HA8nubhOO6RCkJE61m4Wx8rv9Q==", "license": "MIT", "dependencies": { "@tanstack/react-query": "^5.21.7", @@ -7492,19 +7492,19 @@ } }, "node_modules/ra-i18n-polyglot": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/ra-i18n-polyglot/-/ra-i18n-polyglot-5.4.2.tgz", - "integrity": "sha512-twBYo++iTCejdJBpROgl6uQKOwv5hyv/df3w/vWrYudpdjbudGTpj/B8Q5Rfax4op6K8dGCtOkBdNbK0XM/T9A==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/ra-i18n-polyglot/-/ra-i18n-polyglot-5.4.3.tgz", + "integrity": "sha512-/O2FIjzMrU1JZp26YbAuqikleOwcRHVbEuBZg8uoIwCf3YWRcFknxgOTXbE4/iozQsY2pW5XB5YU0a2Oy58eCg==", "license": "MIT", "dependencies": { "node-polyglot": "^2.2.2", - "ra-core": "^5.4.2" + "ra-core": "^5.4.3" } }, "node_modules/ra-input-rich-text": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/ra-input-rich-text/-/ra-input-rich-text-5.4.2.tgz", - "integrity": "sha512-kgZDijdSc8d5UbmqD0z9VjNMOw7nMU/DFTRfGD++f9gP1p2jaU4ECYZduxETGpCxOVftzro+WfmaZt+6IRsS1g==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/ra-input-rich-text/-/ra-input-rich-text-5.4.3.tgz", + "integrity": "sha512-VtkQdm92U1IIpqTPUZYxM0v+hOJ8JU/L0rUfTdOyjvBr3KOzrRwpgXdQ2MWAxJ216p5cDAPB5/cP/ifrdPgXPw==", "license": "MIT", "dependencies": { "@tiptap/core": "^2.0.3", @@ -7531,18 +7531,18 @@ } }, "node_modules/ra-language-english": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/ra-language-english/-/ra-language-english-5.4.2.tgz", - "integrity": "sha512-gQ6lRFRDzvuhPwq9+CXiJD6bF1Fjyuuk+PS/hUeQ7bxx4N0vJXK7Pe+GNLKEq+XD9rw9mFyU/0tOX/Pa9xy9iQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/ra-language-english/-/ra-language-english-5.4.3.tgz", + "integrity": "sha512-i53rYz1yMNv3a+GcJe/WZRhDJafmf935VeZM71fR9u1fptR0QMCHGSvY76aC63TUfKybXZerwx8x75d+5M5/EA==", "license": "MIT", "dependencies": { - "ra-core": "^5.4.2" + "ra-core": "^5.4.3" } }, "node_modules/ra-ui-materialui": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/ra-ui-materialui/-/ra-ui-materialui-5.4.2.tgz", - "integrity": "sha512-bVR86VpjwMEVUcJptungxFeBra+27K6ERflabTxSzcRi3T2BOTwFF8dt4KGJ2/o7ejAHRKyjAWJLMOvT3gXQRA==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/ra-ui-materialui/-/ra-ui-materialui-5.4.3.tgz", + "integrity": "sha512-6Fhjtl+0NcPvlaLBz8W9TcUyCsKlEpobmk5HONiKD91sdIitinZyJeZl/ThaOTftZs7qDsoHJarmXLiLl017HA==", "license": "MIT", "dependencies": { "@tanstack/react-query": "^5.21.7", @@ -7635,19 +7635,19 @@ } }, "node_modules/react-admin": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/react-admin/-/react-admin-5.4.2.tgz", - "integrity": "sha512-zww+s8B8g44feQfib4zV8qU4KfH968KloKuJ75knLifGlHVxlryzwJLdnIA1v5AQN/DCK1kQUSpo8LBiYau4mg==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/react-admin/-/react-admin-5.4.3.tgz", + "integrity": "sha512-znI4eI5t0rwwzj/UzmfU2j4OVzOgUc+hWxHwBcJQQhZoEcPIzIcLLP2U1p1V9am7Yc5MZQp/kKV9/QdgYA3+ag==", "license": "MIT", "dependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", "@mui/icons-material": "^5.15.20", "@mui/material": "^5.15.20", - "ra-core": "^5.4.2", - "ra-i18n-polyglot": "^5.4.2", - "ra-language-english": "^5.4.2", - "ra-ui-materialui": "^5.4.2", + "ra-core": "^5.4.3", + "ra-i18n-polyglot": "^5.4.3", + "ra-language-english": "^5.4.3", + "ra-ui-materialui": "^5.4.3", "react-hook-form": "^7.53.0", "react-router": "^6.22.0", "react-router-dom": "^6.22.0" diff --git a/frontend/package.json b/frontend/package.json index 0d397218e..e81a15783 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,9 +19,9 @@ "oidc-client-ts": "3.1.0", "prop-types": "15.8.1", "query-string": "9.1.1", - "ra-input-rich-text": "5.4.2", + "ra-input-rich-text": "5.4.3", "react": "18.3.1", - "react-admin": "5.4.2", + "react-admin": "5.4.3", "react-chartjs-2": "5.2.0", "react-dom": "18.3.1", "react-is": "18.3.1", From ff9d72661faa61f9dee81b838f72650a93454138 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:12:41 +0100 Subject: [PATCH 67/82] chore(deps): update dependency globals to v15.14.0 (#2359) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e1d5afa5f..d8e050894 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -52,7 +52,7 @@ "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", - "globals": "15.13.0", + "globals": "15.14.0", "prettier": "3.4.2", "rewire": "7.0.0", "typescript": "5.7.2", @@ -5561,9 +5561,9 @@ } }, "node_modules/globals": { - "version": "15.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", - "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", "license": "MIT", "engines": { "node": ">=18" diff --git a/frontend/package.json b/frontend/package.json index e81a15783..a4dae2a05 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -61,7 +61,7 @@ "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", - "globals": "15.13.0", + "globals": "15.14.0", "prettier": "3.4.2", "rewire": "7.0.0", "typescript": "5.7.2", From c239e0dee4b9612c555b55f266731bde05621c00 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Thu, 19 Dec 2024 19:06:07 +0000 Subject: [PATCH 68/82] feat: license policies can have a parent (#2361) --- backend/application/licenses/api/filters.py | 19 ++- .../application/licenses/api/serializers.py | 48 ++++++-- ...licy_parent_license_policy_item_comment.py | 30 +++++ backend/application/licenses/models.py | 4 + .../services/export_license_policy.py | 73 +++++++----- .../licenses/services/license_component.py | 4 +- .../licenses/services/license_policy.py | 97 +++++++++++---- .../test_authorization_license_policies.py | 16 +-- ...ense_policy_authorization_group_members.py | 10 +- ...test_authorization_license_policy_items.py | 16 +-- ...st_authorization_license_policy_members.py | 10 +- .../services/test_export_license_policy.py | 111 ++++++++++++++++++ docs/getting_started/data_model.md | 3 + docs/usage/license_management.md | 2 + .../license_policies/LicensePolicyCreate.tsx | 12 +- .../license_policies/LicensePolicyEdit.tsx | 30 ++++- .../LicensePolicyEmbeddedList.tsx | 12 ++ .../license_policies/LicensePolicyShow.tsx | 13 ++ .../LicensePolicyItemAdd.tsx | 12 ++ .../LicensePolicyItemEdit.tsx | 6 + .../LicensePolicyItemEmbeddedList.tsx | 14 +++ 21 files changed, 449 insertions(+), 93 deletions(-) create mode 100644 backend/application/licenses/migrations/0013_license_policy_parent_license_policy_item_comment.py diff --git a/backend/application/licenses/api/filters.py b/backend/application/licenses/api/filters.py index 4f11232e0..1fbd82214 100644 --- a/backend/application/licenses/api/filters.py +++ b/backend/application/licenses/api/filters.py @@ -2,6 +2,7 @@ from django.utils import timezone from django_filters import ( + BooleanFilter, CharFilter, ChoiceFilter, FilterSet, @@ -234,6 +235,8 @@ class Meta: class LicensePolicyFilter(FilterSet): name = CharFilter(field_name="name", lookup_expr="icontains") + is_child = BooleanFilter(field_name="is_child", method="get_is_child") + is_not_id = NumberFilter(field_name="is_not_id", method="get_is_not_id") license = NumberFilter( field_name="license", method="get_license_policies_with_license" ) @@ -241,6 +244,17 @@ class LicensePolicyFilter(FilterSet): field_name="license_group", method="get_license_policies_with_license_group" ) + def get_is_child( + self, queryset, field_name, value # pylint: disable=unused-argument + ) -> bool: + parent_null = not value + return queryset.filter(parent__isnull=parent_null) + + def get_is_not_id( + self, queryset, field_name, value # pylint: disable=unused-argument + ) -> bool: + return queryset.exclude(pk=value) + def get_license_policies_with_license( self, queryset, field_name, value # pylint: disable=unused-argument ) -> bool: @@ -251,17 +265,18 @@ def get_license_policies_with_license_group( ) -> bool: return queryset.filter(license_policy_items__license_group=value) - ordering = OrderingFilter( + ordering = ExtendedOrderingFilter( # tuple-mapping retains order fields=( ("name", "name"), + (("parent__name", "name"), "parent_name"), ("is_public", "is_public"), ), ) class Meta: model = License_Policy - fields = ["name", "is_public"] + fields = ["name", "is_public", "parent"] class LicensePolicyItemFilter(FilterSet): diff --git a/backend/application/licenses/api/serializers.py b/backend/application/licenses/api/serializers.py index 465df6e6f..d1e3933ed 100644 --- a/backend/application/licenses/api/serializers.py +++ b/backend/application/licenses/api/serializers.py @@ -317,6 +317,8 @@ class LicenseGroupCopySerializer(Serializer): class LicensePolicySerializer(ModelSerializer): + parent_name = SerializerMethodField() + is_parent = SerializerMethodField() is_manager = SerializerMethodField() has_products = SerializerMethodField() has_product_groups = SerializerMethodField() @@ -324,18 +326,14 @@ class LicensePolicySerializer(ModelSerializer): has_users = SerializerMethodField() has_authorization_groups = SerializerMethodField() - class Meta: - model = License_Policy - exclude = ["users", "authorization_groups"] + def get_parent_name(self, obj: License_Policy) -> str: + if obj.parent: + return obj.parent.name - def validate_ignore_component_types(self, value: str) -> str: - ignore_component_types = get_ignore_component_type_list(value) - for component_type in ignore_component_types: - for component_type in ignore_component_types: - if not PURL_Type.PURL_TYPE_CHOICES.get(component_type): - raise ValidationError(f"Invalid component type {component_type}") + return "" - return value + def get_is_parent(self, obj: License_Policy) -> bool: + return obj.children.exists() def get_is_manager(self, obj: License_Policy) -> bool: user = get_current_user() @@ -373,6 +371,36 @@ def get_has_authorization_groups(self, obj: License_Policy) -> bool: .exists() ) + class Meta: + model = License_Policy + exclude = ["users", "authorization_groups"] + + def validate_ignore_component_types(self, value: str) -> str: + ignore_component_types = get_ignore_component_type_list(value) + for component_type in ignore_component_types: + for component_type in ignore_component_types: + if not PURL_Type.PURL_TYPE_CHOICES.get(component_type): + raise ValidationError(f"Invalid component type {component_type}") + + return value + + def validate_parent(self, value: License_Policy) -> License_Policy: + if value.parent: + raise ValidationError("A child cannot be a parent itself") + + return value + + def update(self, instance: License_Policy, validated_data: dict): + parent = validated_data.get("parent") + instance_has_children = instance.children.exists() + if parent: + if instance_has_children: + raise ValidationError("A parent cannot have a parent itself") + if instance == parent: + raise ValidationError("A license policy cannot be parent of itself") + + return super().update(instance, validated_data) + class LicensePolicyItemSerializer(ModelSerializer): license_spdx_id = SerializerMethodField() diff --git a/backend/application/licenses/migrations/0013_license_policy_parent_license_policy_item_comment.py b/backend/application/licenses/migrations/0013_license_policy_parent_license_policy_item_comment.py new file mode 100644 index 000000000..43d0f6d5a --- /dev/null +++ b/backend/application/licenses/migrations/0013_license_policy_parent_license_policy_item_comment.py @@ -0,0 +1,30 @@ +# Generated by Django 5.1.4 on 2024-12-19 07:27 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("licenses", "0012_update_license_names_fix"), + ] + + operations = [ + migrations.AddField( + model_name="license_policy", + name="parent", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="children", + to="licenses.license_policy", + ), + ), + migrations.AddField( + model_name="license_policy_item", + name="comment", + field=models.CharField(blank=True, max_length=255), + ), + ] diff --git a/backend/application/licenses/models.py b/backend/application/licenses/models.py index 49f990a1b..537f07682 100644 --- a/backend/application/licenses/models.py +++ b/backend/application/licenses/models.py @@ -169,6 +169,9 @@ class Meta: class License_Policy(Model): + parent = ForeignKey( + "self", on_delete=PROTECT, related_name="children", null=True, blank=True + ) name = CharField(max_length=255, unique=True) description = TextField(max_length=2048, blank=True) is_public = BooleanField(default=False) @@ -216,6 +219,7 @@ class License_Policy_Item(Model): numerical_evaluation_result = IntegerField( validators=[MinValueValidator(1), MaxValueValidator(5)] ) + comment = CharField(max_length=255, blank=True) def save(self, *args, **kwargs) -> None: self.numerical_evaluation_result = ( diff --git a/backend/application/licenses/services/export_license_policy.py b/backend/application/licenses/services/export_license_policy.py index ffe381168..b3660678c 100644 --- a/backend/application/licenses/services/export_license_policy.py +++ b/backend/application/licenses/services/export_license_policy.py @@ -5,17 +5,23 @@ import yaml from application.commons.services.export import object_to_json -from application.licenses.models import License_Policy, License_Policy_Item -from application.licenses.services.license_policy import get_ignore_component_type_list +from application.licenses.models import License_Policy +from application.licenses.services.license_policy import ( + LicensePolicyEvaluationResult, + get_ignore_component_type_list, + get_license_evaluation_results_for_license_policy, +) @dataclass class License_Policy_Export_Item: evaluation_result: str + from_parent: bool spdx_license: Optional[str] = None license_expression: Optional[str] = None unknown_license: Optional[str] = None license_group: Optional[str] = None + comment: Optional[str] = None @dataclass @@ -29,6 +35,7 @@ class License_Policy_Export: description: str items: list[License_Policy_Export_Item] ignore_component_types: list[License_Policy_Export_Ignore_Component_Type] + parent: Optional[str] = None def export_license_policy_yaml(license_policy: License_Policy) -> str: @@ -42,7 +49,7 @@ def export_license_policy_json(license_policy: License_Policy) -> str: def _create_license_policy_export( license_policy: License_Policy, ) -> License_Policy_Export: - license_policy_eport = License_Policy_Export( + license_policy_export = License_Policy_Export( name=license_policy.name, description=license_policy.description, items=[], @@ -50,34 +57,42 @@ def _create_license_policy_export( license_policy.ignore_component_types ), ) + if license_policy.parent: + license_policy_export.parent = license_policy.parent.name - license_policy_item: Optional[License_Policy_Item] = None - for license_policy_item in license_policy.license_policy_items.all(): - if license_policy_item.license_group: - for spdx_license in license_policy_item.license_group.licenses.all(): - license_policy_eport_item = License_Policy_Export_Item( - spdx_license=spdx_license.spdx_id, - license_group=license_policy_item.license_group.name, - evaluation_result=license_policy_item.evaluation_result, - ) - license_policy_eport.items.append(license_policy_eport_item) - elif license_policy_item.license: - license_policy_eport_item = License_Policy_Export_Item( - spdx_license=license_policy_item.license.spdx_id, - evaluation_result=license_policy_item.evaluation_result, + license_evaluation_results: dict[str, LicensePolicyEvaluationResult] = {} + + if license_policy.parent: + get_license_evaluation_results_for_license_policy( + license_policy.parent, True, license_evaluation_results + ) + + get_license_evaluation_results_for_license_policy( + license_policy, False, license_evaluation_results + ) + + for license_string, evaluation_result in license_evaluation_results.items(): + license_policy_export_item = License_Policy_Export_Item( + evaluation_result=evaluation_result.evaluation_result, + from_parent=evaluation_result.from_parent, + license_group=evaluation_result.license_group_name, + comment=evaluation_result.comment, + ) + if license_string.startswith("spdx_"): + license_policy_export_item.spdx_license = license_string.replace( + "spdx_", "" ) - license_policy_eport.items.append(license_policy_eport_item) - elif license_policy_item.license_expression: - license_policy_eport_item = License_Policy_Export_Item( - license_expression=license_policy_item.license_expression, - evaluation_result=license_policy_item.evaluation_result, + elif license_string.startswith("expression_"): + license_policy_export_item.license_expression = license_string.replace( + "expression_", "" ) - license_policy_eport.items.append(license_policy_eport_item) - elif license_policy_item.unknown_license: - license_policy_eport_item = License_Policy_Export_Item( - unknown_license=license_policy_item.unknown_license, - evaluation_result=license_policy_item.evaluation_result, + elif license_string.startswith("unknown_"): + license_policy_export_item.unknown_license = license_string.replace( + "unknown_", "" ) - license_policy_eport.items.append(license_policy_eport_item) + else: + continue + + license_policy_export.items.append(license_policy_export_item) - return license_policy_eport + return license_policy_export diff --git a/backend/application/licenses/services/license_component.py b/backend/application/licenses/services/license_component.py index a89326761..726edda65 100644 --- a/backend/application/licenses/services/license_component.py +++ b/backend/application/licenses/services/license_component.py @@ -15,7 +15,7 @@ from application.licenses.services.license_policy import ( apply_license_policy_to_component, get_ignore_component_type_list, - get_license_evaluation_results, + get_license_evaluation_results_for_product, ) @@ -54,7 +54,7 @@ def process_license_components( for existing_component in existing_components: existing_components_dict[existing_component.identity_hash] = existing_component - license_evaluation_results = get_license_evaluation_results( + license_evaluation_results = get_license_evaluation_results_for_product( vulnerability_check.product ) diff --git a/backend/application/licenses/services/license_policy.py b/backend/application/licenses/services/license_policy.py index 15253e9bd..4131b3f63 100644 --- a/backend/application/licenses/services/license_policy.py +++ b/backend/application/licenses/services/license_policy.py @@ -1,3 +1,4 @@ +from dataclasses import dataclass from typing import Optional from django.db.models import Q @@ -15,13 +16,38 @@ from application.licenses.types import License_Policy_Evaluation_Result -def get_license_evaluation_results(product: Product) -> dict: +@dataclass +class LicensePolicyEvaluationResult: + evaluation_result: str + from_parent: bool + license_group_name: Optional[str] = None + comment: Optional[str] = None + + +def get_license_evaluation_results_for_product(product: Product) -> dict: license_policy = _get_license_policy(product) if not license_policy: return {} - license_evaluation_results = {} + license_evaluation_results: dict[str, LicensePolicyEvaluationResult] = {} + + if license_policy.parent: + get_license_evaluation_results_for_license_policy( + license_policy.parent, True, license_evaluation_results + ) + + get_license_evaluation_results_for_license_policy( + license_policy, False, license_evaluation_results + ) + return license_evaluation_results + + +def get_license_evaluation_results_for_license_policy( + license_policy: License_Policy, + is_parent: bool, + license_evaluation_results: dict[str, LicensePolicyEvaluationResult], +) -> None: items_license_groups = License_Policy_Item.objects.filter( license_policy=license_policy, license_group__isnull=False ) @@ -29,7 +55,12 @@ def get_license_evaluation_results(product: Product) -> dict: if item.license_group: for my_license in item.license_group.licenses.all(): license_evaluation_results[f"spdx_{my_license.spdx_id}"] = ( - item.evaluation_result + LicensePolicyEvaluationResult( + evaluation_result=item.evaluation_result, + from_parent=is_parent, + license_group_name=item.license_group.name, + comment=item.comment if item.comment else None, + ) ) items_licenses = License_Policy_Item.objects.filter( @@ -38,7 +69,11 @@ def get_license_evaluation_results(product: Product) -> dict: for item in items_licenses: if item.license: license_evaluation_results[f"spdx_{item.license.spdx_id}"] = ( - item.evaluation_result + LicensePolicyEvaluationResult( + evaluation_result=item.evaluation_result, + from_parent=is_parent, + comment=item.comment if item.comment else None, + ) ) items_license_expressions = License_Policy_Item.objects.filter( @@ -46,7 +81,11 @@ def get_license_evaluation_results(product: Product) -> dict: ).exclude(license_expression="") for item in items_license_expressions: license_evaluation_results[f"expression_{item.license_expression}"] = ( - item.evaluation_result + LicensePolicyEvaluationResult( + evaluation_result=item.evaluation_result, + from_parent=is_parent, + comment=item.comment if item.comment else None, + ) ) items_unknown_licenses = License_Policy_Item.objects.filter( @@ -54,31 +93,35 @@ def get_license_evaluation_results(product: Product) -> dict: ).exclude(unknown_license="") for item in items_unknown_licenses: license_evaluation_results[f"unknown_{item.unknown_license}"] = ( - item.evaluation_result + LicensePolicyEvaluationResult( + evaluation_result=item.evaluation_result, + from_parent=is_parent, + comment=item.comment if item.comment else None, + ) ) - return license_evaluation_results - def apply_license_policy_to_component( component: License_Component, - evaluation_results: dict, + evaluation_results: dict[str, LicensePolicyEvaluationResult], ignore_component_types: list, ) -> None: evaluation_result = None if component.purl_type in ignore_component_types: evaluation_result = License_Policy_Evaluation_Result.RESULT_IGNORED elif component.license: - evaluation_result = evaluation_results.get(f"spdx_{component.license.spdx_id}") + evaluation_result = _get_license_evaluation_result( + f"spdx_{component.license.spdx_id}", evaluation_results + ) elif component.license_expression: evaluation_result = _evaluate_license_expression(component, evaluation_results) if not evaluation_result: - evaluation_result = evaluation_results.get( - f"expression_{component.license_expression}" + evaluation_result = _get_license_evaluation_result( + f"expression_{component.license_expression}", evaluation_results ) elif component.unknown_license: - evaluation_result = evaluation_results.get( - f"unknown_{component.unknown_license}" + evaluation_result = _get_license_evaluation_result( + f"unknown_{component.unknown_license}", evaluation_results ) if not evaluation_result: evaluation_result = License_Policy_Evaluation_Result.RESULT_UNKNOWN @@ -86,6 +129,15 @@ def apply_license_policy_to_component( component.evaluation_result = evaluation_result +def _get_license_evaluation_result( + license_string: str, evaluation_results: dict[str, LicensePolicyEvaluationResult] +) -> Optional[str]: + evaluation_result = evaluation_results.get(license_string) + if evaluation_result: + return evaluation_result.evaluation_result + return None + + def apply_license_policy(license_policy: License_Policy) -> None: products = Product.objects.filter( Q(license_policy=license_policy) @@ -99,7 +151,7 @@ def apply_license_policy(license_policy: License_Policy) -> None: def apply_license_policy_product(product: Product) -> None: - license_evaluation_results = get_license_evaluation_results(product) + license_evaluation_results = get_license_evaluation_results_for_product(product) components = License_Component.objects.filter(product=product) for component in components: license_before = component.license @@ -178,7 +230,8 @@ def _get_license_policy(product: Product) -> Optional[License_Policy]: def _evaluate_license_expression( - component: License_Component, evaluation_results: dict + component: License_Component, + evaluation_results: dict[str, LicensePolicyEvaluationResult], ) -> Optional[str]: evaluation_result = License_Policy_Evaluation_Result.RESULT_UNKNOWN @@ -200,15 +253,19 @@ def _evaluate_license_expression( return evaluation_result licenses.append(spdx_license) else: - return evaluation_results.get( - f"expression_{component.license_expression}" + return _get_license_evaluation_result( + f"expression_{component.license_expression}", evaluation_results ) evaluation_result_set = set() for spdx_license in licenses: - if evaluation_results.get(f"spdx_{spdx_license.spdx_id}"): + if _get_license_evaluation_result( + f"spdx_{spdx_license.spdx_id}", evaluation_results + ): evaluation_result_set.add( - evaluation_results.get(f"spdx_{spdx_license.spdx_id}") + _get_license_evaluation_result( + f"spdx_{spdx_license.spdx_id}", evaluation_results + ) ) if operator == "AND": diff --git a/backend/unittests/access_control/api/test_authorization_license_policies.py b/backend/unittests/access_control/api/test_authorization_license_policies.py index dabcf179b..e8aca6f72 100644 --- a/backend/unittests/access_control/api/test_authorization_license_policies.py +++ b/backend/unittests/access_control/api/test_authorization_license_policies.py @@ -10,14 +10,14 @@ class TestAuthorizationLicensePolicies(TestAuthorizationBase): def test_authorization_license_policies(self): License_Policy.objects.filter(pk__lt=1000).delete() - expected_data = "{'count': 5, 'next': None, 'previous': None, 'results': [{'id': 1000, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': ''}, {'id': 1001, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, {'id': 1002, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, {'id': 1004, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}]}" + expected_data = "{'count': 5, 'next': None, 'previous': None, 'results': [{'id': 1000, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': '', 'parent': None}, {'id': 1001, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}]}" self._test_api( APITest( "db_admin", "get", "/api/license_policies/", None, 200, expected_data ) ) - expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': ''}, {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, {'id': 1003, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}]}" + expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': '', 'parent': None}, {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}]}" self._test_api( APITest( "db_internal_write", @@ -30,7 +30,7 @@ def test_authorization_license_policies(self): ) ) - expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': ''}, {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, {'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}]}" + expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': '', 'parent': None}, {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}]}" self._test_api( APITest( "db_product_group_user", @@ -43,7 +43,7 @@ def test_authorization_license_policies(self): ) ) - expected_data = "{'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}" + expected_data = "{'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}" self._test_api( APITest( "db_internal_write", @@ -151,7 +151,7 @@ def test_authorization_license_policies(self): ) post_data = {"name": "new_license_policy"} - expected_data = "{'id': 1005, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': False, 'has_users': True, 'has_authorization_groups': False, 'name': 'new_license_policy', 'description': '', 'is_public': False, 'ignore_component_types': ''}" + expected_data = "{'id': 1005, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': False, 'has_users': True, 'has_authorization_groups': False, 'name': 'new_license_policy', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}" self._test_api( APITest( "db_internal_write", @@ -180,7 +180,7 @@ def test_authorization_license_policies(self): ) ) - expected_data = "{'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': 'changed', 'is_public': False, 'ignore_component_types': ''}" + expected_data = "{'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': 'changed', 'is_public': False, 'ignore_component_types': '', 'parent': None}" self._test_api( APITest( "db_internal_write", @@ -208,7 +208,7 @@ def test_authorization_license_policies(self): ) ) - expected_data = "{'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': 'changed', 'is_public': False, 'ignore_component_types': ''}" + expected_data = "{'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': 'changed', 'is_public': False, 'ignore_component_types': '', 'parent': None}" self._test_api( APITest( "db_product_group_user", @@ -249,7 +249,7 @@ def test_authorization_license_policies(self): ) post_data = {"name": "copied_license_policy"} - expected_data = "{'id': 1006, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'copied_license_policy', 'description': 'changed', 'is_public': False, 'ignore_component_types': ''}" + expected_data = "{'id': 1006, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'copied_license_policy', 'description': 'changed', 'is_public': False, 'ignore_component_types': '', 'parent': None}" self._test_api( APITest( "db_internal_write", diff --git a/backend/unittests/access_control/api/test_authorization_license_policy_authorization_group_members.py b/backend/unittests/access_control/api/test_authorization_license_policy_authorization_group_members.py index 002fb4b5c..95e696c0c 100644 --- a/backend/unittests/access_control/api/test_authorization_license_policy_authorization_group_members.py +++ b/backend/unittests/access_control/api/test_authorization_license_policy_authorization_group_members.py @@ -9,7 +9,7 @@ class TestAuthorizationLicensePolicyAuthorizationGroupMembers(TestAuthorizationB def test_authorization_license_policy_authorization_group_members(self): License_Policy.objects.filter(pk__lt=1000).delete() - expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_policy_data': {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': False, 'license_policy': 1003, 'authorization_group': 2}, {'id': 1001, 'license_policy_data': {'id': 1004, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': True, 'license_policy': 1004, 'authorization_group': 2}, {'id': 1002, 'license_policy_data': {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 3, 'name': 'non_oidc_group', 'oidc_group': ''}, 'is_manager': True, 'license_policy': 1003, 'authorization_group': 3}]}" + expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_policy_data': {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': False, 'license_policy': 1003, 'authorization_group': 2}, {'id': 1001, 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': True, 'license_policy': 1004, 'authorization_group': 2}, {'id': 1002, 'license_policy_data': {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 3, 'name': 'non_oidc_group', 'oidc_group': ''}, 'is_manager': True, 'license_policy': 1003, 'authorization_group': 3}]}" self._test_api( APITest( "db_admin", @@ -21,7 +21,7 @@ def test_authorization_license_policy_authorization_group_members(self): ) ) - expected_data = "{'count': 2, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_policy_data': {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': False, 'license_policy': 1003, 'authorization_group': 2}, {'id': 1001, 'license_policy_data': {'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': True, 'license_policy': 1004, 'authorization_group': 2}]}" + expected_data = "{'count': 2, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_policy_data': {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': False, 'license_policy': 1003, 'authorization_group': 2}, {'id': 1001, 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': True, 'license_policy': 1004, 'authorization_group': 2}]}" self._test_api( APITest( "db_product_group_user", @@ -34,7 +34,7 @@ def test_authorization_license_policy_authorization_group_members(self): ) ) - expected_data = "{'id': 1000, 'license_policy_data': {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': False, 'license_policy': 1003, 'authorization_group': 2}" + expected_data = "{'id': 1000, 'license_policy_data': {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 2, 'name': 'oidc_group_2', 'oidc_group': 'oidc_2'}, 'is_manager': False, 'license_policy': 1003, 'authorization_group': 2}" self._test_api( APITest( "db_product_group_user", @@ -65,7 +65,7 @@ def test_authorization_license_policy_authorization_group_members(self): "authorization_group": 1, "is_manager": False, } - expected_data = "{'id': 1003, 'license_policy_data': {'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 1, 'name': 'oidc_group_1', 'oidc_group': 'oidc_1'}, 'is_manager': False, 'license_policy': 1004, 'authorization_group': 1}" + expected_data = "{'id': 1003, 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 1, 'name': 'oidc_group_1', 'oidc_group': 'oidc_1'}, 'is_manager': False, 'license_policy': 1004, 'authorization_group': 1}" self._test_api( APITest( "db_product_group_user", @@ -133,7 +133,7 @@ def test_authorization_license_policy_authorization_group_members(self): ) ) - expected_data = "{'id': 1003, 'license_policy_data': {'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'authorization_group_data': {'id': 1, 'name': 'oidc_group_1', 'oidc_group': 'oidc_1'}, 'is_manager': True, 'license_policy': 1004, 'authorization_group': 1}" + expected_data = "{'id': 1003, 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'authorization_group_data': {'id': 1, 'name': 'oidc_group_1', 'oidc_group': 'oidc_1'}, 'is_manager': True, 'license_policy': 1004, 'authorization_group': 1}" self._test_api( APITest( "db_product_group_user", diff --git a/backend/unittests/access_control/api/test_authorization_license_policy_items.py b/backend/unittests/access_control/api/test_authorization_license_policy_items.py index bd6544e2d..abe19d576 100644 --- a/backend/unittests/access_control/api/test_authorization_license_policy_items.py +++ b/backend/unittests/access_control/api/test_authorization_license_policy_items.py @@ -9,7 +9,7 @@ class TestAuthorizationLicensePolicyItems(TestAuthorizationBase): def test_authorization_license_policy_items(self): License_Policy.objects.filter(pk__lt=1000).delete() - expected_data = "{'count': 5, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_spdx_id': '', 'license_group_name': 'Permissive Model (Blue Oak Council)', 'license_policy_data': {'id': 1000, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'license_policy': 1000, 'license_group': 1, 'license': None}, {'id': 1001, 'license_spdx_id': '0BSD', 'license_group_name': '', 'license_policy_data': {'id': 1001, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Forbidden', 'license_policy': 1001, 'license_group': None, 'license': 1}, {'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1002, 'license_group': None, 'license': None}, {'id': 1003, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Three unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1003, 'license_group': None, 'license': None}, {'id': 1004, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1004, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Four unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1004, 'license_group': None, 'license': None}]}" + expected_data = "{'count': 5, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_spdx_id': '', 'license_group_name': 'Permissive Model (Blue Oak Council)', 'license_policy_data': {'id': 1000, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'comment': '', 'license_policy': 1000, 'license_group': 1, 'license': None}, {'id': 1001, 'license_spdx_id': '0BSD', 'license_group_name': '', 'license_policy_data': {'id': 1001, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Forbidden', 'comment': '', 'license_policy': 1001, 'license_group': None, 'license': 1}, {'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1002, 'license_group': None, 'license': None}, {'id': 1003, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Three unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1003, 'license_group': None, 'license': None}, {'id': 1004, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Four unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1004, 'license_group': None, 'license': None}]}" self._test_api( APITest( "db_admin", @@ -21,7 +21,7 @@ def test_authorization_license_policy_items(self): ) ) - expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_spdx_id': '', 'license_group_name': 'Permissive Model (Blue Oak Council)', 'license_policy_data': {'id': 1000, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'license_policy': 1000, 'license_group': 1, 'license': None}, {'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1002, 'license_group': None, 'license': None}, {'id': 1003, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1003, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Three unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1003, 'license_group': None, 'license': None}]}" + expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_spdx_id': '', 'license_group_name': 'Permissive Model (Blue Oak Council)', 'license_policy_data': {'id': 1000, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'comment': '', 'license_policy': 1000, 'license_group': 1, 'license': None}, {'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1002, 'license_group': None, 'license': None}, {'id': 1003, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Three unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1003, 'license_group': None, 'license': None}]}" self._test_api( APITest( "db_internal_write", @@ -34,7 +34,7 @@ def test_authorization_license_policy_items(self): ) ) - expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_spdx_id': '', 'license_group_name': 'Permissive Model (Blue Oak Council)', 'license_policy_data': {'id': 1000, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'license_policy': 1000, 'license_group': 1, 'license': None}, {'id': 1003, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1003, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Three unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1003, 'license_group': None, 'license': None}, {'id': 1004, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Four unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1004, 'license_group': None, 'license': None}]}" + expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1000, 'license_spdx_id': '', 'license_group_name': 'Permissive Model (Blue Oak Council)', 'license_policy_data': {'id': 1000, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': False, 'name': 'public', 'description': '', 'is_public': True, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'comment': '', 'license_policy': 1000, 'license_group': 1, 'license': None}, {'id': 1003, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1003, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Three unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1003, 'license_group': None, 'license': None}, {'id': 1004, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Four unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1004, 'license_group': None, 'license': None}]}" self._test_api( APITest( "db_product_group_user", @@ -47,7 +47,7 @@ def test_authorization_license_policy_items(self): ) ) - expected_data = "{'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Unknown', 'license_policy': 1002, 'license_group': None, 'license': None}" + expected_data = "{'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Unknown', 'comment': '', 'license_policy': 1002, 'license_group': None, 'license': None}" self._test_api( APITest( "db_internal_write", @@ -89,7 +89,7 @@ def test_authorization_license_policy_items(self): "unknown_license": "", "evaluation_result": "Allowed", } - expected_data = "{'id': 1005, 'license_spdx_id': '', 'license_group_name': 'Permissive Gold (Blue Oak Council)', 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'license_policy': 1002, 'license_group': 2, 'license': None}" + expected_data = "{'id': 1005, 'license_spdx_id': '', 'license_group_name': 'Permissive Gold (Blue Oak Council)', 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'comment': '', 'license_policy': 1002, 'license_group': 2, 'license': None}" self._test_api( APITest( "db_internal_write", @@ -129,7 +129,7 @@ def test_authorization_license_policy_items(self): "unknown_license": "", "evaluation_result": "Allowed", } - expected_data = "{'id': 1006, 'license_spdx_id': '', 'license_group_name': 'Permissive Gold (Blue Oak Council)', 'license_policy_data': {'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'license_policy': 1004, 'license_group': 2, 'license': None}" + expected_data = "{'id': 1006, 'license_spdx_id': '', 'license_group_name': 'Permissive Gold (Blue Oak Council)', 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': '', 'evaluation_result': 'Allowed', 'comment': '', 'license_policy': 1004, 'license_group': 2, 'license': None}" self._test_api( APITest( "db_product_group_user", @@ -181,7 +181,7 @@ def test_authorization_license_policy_items(self): ) ) - expected_data = "{'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Review required', 'license_policy': 1002, 'license_group': None, 'license': None}" + expected_data = "{'id': 1002, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Two unknown licenses', 'evaluation_result': 'Review required', 'comment': '', 'license_policy': 1002, 'license_group': None, 'license': None}" self._test_api( APITest( "db_internal_write", @@ -212,7 +212,7 @@ def test_authorization_license_policy_items(self): ) ) - expected_data = "{'id': 1004, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1004, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'license_expression': '', 'unknown_license': 'Four unknown licenses', 'evaluation_result': 'Review required', 'license_policy': 1004, 'license_group': None, 'license': None}" + expected_data = "{'id': 1004, 'license_spdx_id': '', 'license_group_name': '', 'license_policy_data': {'id': 1004, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': False, 'has_authorization_groups': True, 'name': 'authorization_group_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'license_expression': '', 'unknown_license': 'Four unknown licenses', 'evaluation_result': 'Review required', 'comment': '', 'license_policy': 1004, 'license_group': None, 'license': None}" self._test_api( APITest( "db_product_group_user", diff --git a/backend/unittests/access_control/api/test_authorization_license_policy_members.py b/backend/unittests/access_control/api/test_authorization_license_policy_members.py index 05ffce7a0..b89c0c323 100644 --- a/backend/unittests/access_control/api/test_authorization_license_policy_members.py +++ b/backend/unittests/access_control/api/test_authorization_license_policy_members.py @@ -9,7 +9,7 @@ class TestAuthorizationLicensePolicyMembers(TestAuthorizationBase): def test_authorization_license_policy_members(self): License_Policy.objects.filter(pk__lt=1000).delete() - expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1001, 'license_policy_data': {'id': 1001, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'user_data': {'id': 3, 'username': 'db_internal_read', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_read', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:25:06+01:00', 'has_password': False}, 'is_manager': False, 'license_policy': 1001, 'user': 3}, {'id': 1002, 'license_policy_data': {'id': 1002, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'user_data': {'id': 2, 'username': 'db_internal_write', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_write', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:24:53+01:00', 'has_password': False}, 'is_manager': True, 'license_policy': 1002, 'user': 2}, {'id': 1003, 'license_policy_data': {'id': 1001, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'user_data': {'id': 4, 'username': 'db_external', 'first_name': '', 'last_name': '', 'full_name': 'db_external', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': True, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-12T19:48:08.514000+01:00', 'has_password': False}, 'is_manager': False, 'license_policy': 1001, 'user': 4}]}" + expected_data = "{'count': 3, 'next': None, 'previous': None, 'results': [{'id': 1001, 'license_policy_data': {'id': 1001, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'user_data': {'id': 3, 'username': 'db_internal_read', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_read', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:25:06+01:00', 'has_password': False}, 'is_manager': False, 'license_policy': 1001, 'user': 3}, {'id': 1002, 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'user_data': {'id': 2, 'username': 'db_internal_write', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_write', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:24:53+01:00', 'has_password': False}, 'is_manager': True, 'license_policy': 1002, 'user': 2}, {'id': 1003, 'license_policy_data': {'id': 1001, 'parent_name': '', 'is_parent': False, 'is_manager': False, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_read_not_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'user_data': {'id': 4, 'username': 'db_external', 'first_name': '', 'last_name': '', 'full_name': 'db_external', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': True, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-12T19:48:08.514000+01:00', 'has_password': False}, 'is_manager': False, 'license_policy': 1001, 'user': 4}]}" self._test_api( APITest( "db_admin", @@ -21,7 +21,7 @@ def test_authorization_license_policy_members(self): ) ) - expected_data = "{'count': 1, 'next': None, 'previous': None, 'results': [{'id': 1002, 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'user_data': {'id': 2, 'username': 'db_internal_write', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_write', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:24:53+01:00', 'has_password': False}, 'is_manager': True, 'license_policy': 1002, 'user': 2}]}" + expected_data = "{'count': 1, 'next': None, 'previous': None, 'results': [{'id': 1002, 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'user_data': {'id': 2, 'username': 'db_internal_write', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_write', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:24:53+01:00', 'has_password': False}, 'is_manager': True, 'license_policy': 1002, 'user': 2}]}" self._test_api( APITest( "db_internal_write", @@ -34,7 +34,7 @@ def test_authorization_license_policy_members(self): ) ) - expected_data = "{'id': 1002, 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'user_data': {'id': 2, 'username': 'db_internal_write', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_write', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:24:53+01:00', 'has_password': False}, 'is_manager': True, 'license_policy': 1002, 'user': 2}" + expected_data = "{'id': 1002, 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'user_data': {'id': 2, 'username': 'db_internal_write', 'first_name': '', 'last_name': '', 'full_name': 'db_internal_write', 'email': '', 'is_active': True, 'is_superuser': False, 'is_external': False, 'setting_theme': 'light', 'setting_list_size': 'medium', 'permissions': [, ], 'setting_list_properties': '', 'oidc_groups_hash': '', 'is_oidc_user': False, 'date_joined': '2022-12-07T20:24:53+01:00', 'has_password': False}, 'is_manager': True, 'license_policy': 1002, 'user': 2}" self._test_api( APITest( "db_internal_write", @@ -73,7 +73,7 @@ def test_authorization_license_policy_members(self): ) post_data = {"license_policy": 1002, "user": 6, "is_manager": False} - expected_data = "{'id': 1004, 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'user_data': {'id': 6, 'username': 'db_product_group_user', 'full_name': 'db_product_group_user'}, 'is_manager': False, 'license_policy': 1002, 'user': 6}" + expected_data = "{'id': 1004, 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'user_data': {'id': 6, 'username': 'db_product_group_user', 'full_name': 'db_product_group_user'}, 'is_manager': False, 'license_policy': 1002, 'user': 6}" self._test_api( APITest( "db_internal_write", @@ -115,7 +115,7 @@ def test_authorization_license_policy_members(self): ) ) - expected_data = "{'id': 1004, 'license_policy_data': {'id': 1002, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': ''}, 'user_data': {'id': 6, 'username': 'db_product_group_user', 'full_name': 'db_product_group_user'}, 'is_manager': True, 'license_policy': 1002, 'user': 6}" + expected_data = "{'id': 1004, 'license_policy_data': {'id': 1002, 'parent_name': '', 'is_parent': False, 'is_manager': True, 'has_products': False, 'has_product_groups': False, 'has_items': True, 'has_users': True, 'has_authorization_groups': False, 'name': 'internal_write_manager', 'description': '', 'is_public': False, 'ignore_component_types': '', 'parent': None}, 'user_data': {'id': 6, 'username': 'db_product_group_user', 'full_name': 'db_product_group_user'}, 'is_manager': True, 'license_policy': 1002, 'user': 6}" self._test_api( APITest( "db_internal_write", diff --git a/backend/unittests/licenses/services/test_export_license_policy.py b/backend/unittests/licenses/services/test_export_license_policy.py index b3445c343..510008464 100644 --- a/backend/unittests/licenses/services/test_export_license_policy.py +++ b/backend/unittests/licenses/services/test_export_license_policy.py @@ -41,6 +41,37 @@ def setUpClass(self): evaluation_result=License_Policy_Evaluation_Result.RESULT_FORBIDDEN, ).save() + self.license_policy_with_parent = License_Policy( + name="license_policy_with_parent", + parent=license_policy, + ) + self.license_policy_with_parent.save() + + License_Policy_Item( + license_policy=self.license_policy_with_parent, + license=License.objects.get(pk=1), + evaluation_result=License_Policy_Evaluation_Result.RESULT_ALLOWED, + comment="Permissive license", + ).save() + License_Policy_Item( + license_policy=self.license_policy_with_parent, + license_expression="MIT OR 3BSD", + evaluation_result=License_Policy_Evaluation_Result.RESULT_ALLOWED, + comment="Permissive license expression", + ).save() + License_Policy_Item( + license_policy=self.license_policy_with_parent, + unknown_license="Unknown", + evaluation_result=License_Policy_Evaluation_Result.RESULT_ALLOWED, + comment="Permissive unknown license", + ).save() + License_Policy_Item( + license_policy=self.license_policy_with_parent, + unknown_license="Another unknown", + evaluation_result=License_Policy_Evaluation_Result.RESULT_FORBIDDEN, + comment="Forbidden unknown license", + ).save() + super().setUpClass() def test_export_json(self): @@ -56,19 +87,23 @@ def test_export_json(self): "items": [ { "evaluation_result": "Allowed", + "from_parent": false, "license_group": "Permissive Model (Blue Oak Council)", "spdx_license": "BlueOak-1.0.0" }, { "evaluation_result": "Forbidden", + "from_parent": false, "spdx_license": "0BSD" }, { "evaluation_result": "Review required", + "from_parent": false, "license_expression": "MIT OR 3BSD" }, { "evaluation_result": "Forbidden", + "from_parent": false, "unknown_license": "Unknown" } ], @@ -86,14 +121,90 @@ def test_export_yaml(self): - oci items: - evaluation_result: Allowed + from_parent: false license_group: Permissive Model (Blue Oak Council) spdx_license: BlueOak-1.0.0 - evaluation_result: Forbidden + from_parent: false spdx_license: 0BSD - evaluation_result: Review required + from_parent: false license_expression: MIT OR 3BSD - evaluation_result: Forbidden + from_parent: false unknown_license: Unknown name: public +""" + self.assertEqual(yaml_data_expected, yaml_data) + + def test_export_json_with_parent(self): + json_data = export_license_policy_json(self.license_policy_with_parent) + + json_data_expected = """{ + "description": "", + "items": [ + { + "evaluation_result": "Allowed", + "from_parent": true, + "license_group": "Permissive Model (Blue Oak Council)", + "spdx_license": "BlueOak-1.0.0" + }, + { + "comment": "Permissive license", + "evaluation_result": "Allowed", + "from_parent": false, + "spdx_license": "0BSD" + }, + { + "comment": "Permissive license expression", + "evaluation_result": "Allowed", + "from_parent": false, + "license_expression": "MIT OR 3BSD" + }, + { + "comment": "Permissive unknown license", + "evaluation_result": "Allowed", + "from_parent": false, + "unknown_license": "Unknown" + }, + { + "comment": "Forbidden unknown license", + "evaluation_result": "Forbidden", + "from_parent": false, + "unknown_license": "Another unknown" + } + ], + "name": "license_policy_with_parent", + "parent": "public" +}""" + self.assertEqual(json_data_expected, json_data) + + def test_export_yaml_with_parent(self): + yaml_data = export_license_policy_yaml(self.license_policy_with_parent) + + yaml_data_expected = """description: '' +items: +- evaluation_result: Allowed + from_parent: true + license_group: Permissive Model (Blue Oak Council) + spdx_license: BlueOak-1.0.0 +- comment: Permissive license + evaluation_result: Allowed + from_parent: false + spdx_license: 0BSD +- comment: Permissive license expression + evaluation_result: Allowed + from_parent: false + license_expression: MIT OR 3BSD +- comment: Permissive unknown license + evaluation_result: Allowed + from_parent: false + unknown_license: Unknown +- comment: Forbidden unknown license + evaluation_result: Forbidden + from_parent: false + unknown_license: Another unknown +name: license_policy_with_parent +parent: public """ self.assertEqual(yaml_data_expected, yaml_data) diff --git a/docs/getting_started/data_model.md b/docs/getting_started/data_model.md index 8ee7877e4..6319aefed 100644 --- a/docs/getting_started/data_model.md +++ b/docs/getting_started/data_model.md @@ -91,6 +91,7 @@ erDiagram Product_Group }o--o| License_Policy : references License_Component }o--o| License : references License_Component ||--|{ License_Component_Evidence : has + License_Policy }o--o| License_Policy : parent License_Policy ||--o{ License_Policy_Item : has License_Policy ||--o{ License_Policy_Member : has License_Policy ||--o{ License_Policy_Authorization_Group_Member : has @@ -120,6 +121,8 @@ A `License Component` is a library or package used in a product that is licensed A `License Policy` defines the rules for the usage of licenses in a product. It can define which licenses are allowed, which are forbidden, and which need a review. +A `License Policy` can have another license policy as a `Parent`. If a license policy has a parent, the rules of the parent are also valid for the child policy, but existing rules of the parent can be overriden and new rules can be added. + #### License Policy Item A `License Policy Item` is a single rule in a license policy. It can be a rule for a specific license, a rule for a license group or a rule for an unkown license string, e.g. a license that is not in the SPDX list or a license expression. diff --git a/docs/usage/license_management.md b/docs/usage/license_management.md index 18745d9e1..00d52e742 100644 --- a/docs/usage/license_management.md +++ b/docs/usage/license_management.md @@ -52,6 +52,8 @@ A `License Policy` defines the rules for the usage of licenses in a Product. The list of `License Policies` can be found in the `Licenses` sub-menu under `Administration`. +A `License Policy` can have another license policy as a `Parent`. If a license policy has a parent, the rules of the parent are also valid for the child policy, but existing rules of the parent can be overriden and new rules can be added. A license policy which is a parent cannot have a parent itself. + Within the `License Policy` itself a comma-separated list of component (e.g. `apk` or `deb`) types can be defined, which shall be ignored in the license evaluation. This can be useful for operating system packages in a Docker container, which are not relevant for the license management. The attribute `Public` defines, if the License Policy is visible for all users or only for the members of the policy. diff --git a/frontend/src/licenses/license_policies/LicensePolicyCreate.tsx b/frontend/src/licenses/license_policies/LicensePolicyCreate.tsx index de32f6ce2..ce7acaad4 100644 --- a/frontend/src/licenses/license_policies/LicensePolicyCreate.tsx +++ b/frontend/src/licenses/license_policies/LicensePolicyCreate.tsx @@ -1,8 +1,8 @@ import { Typography } from "@mui/material"; -import { BooleanInput, Create, SimpleForm } from "react-admin"; +import { BooleanInput, Create, ReferenceInput, SimpleForm } from "react-admin"; import { validate_255, validate_2048, validate_required_255 } from "../../commons/custom_validators"; -import { TextInputWide } from "../../commons/layout/themes"; +import { AutocompleteInputWide, TextInputWide } from "../../commons/layout/themes"; const LicensePolicyCreate = () => { const transform = (data: any) => { @@ -29,6 +29,14 @@ const LicensePolicyCreate = () => { validate={validate_2048} helperText="Markdown supported." /> + + + diff --git a/frontend/src/licenses/license_policies/LicensePolicyEdit.tsx b/frontend/src/licenses/license_policies/LicensePolicyEdit.tsx index a74d9353e..0e6ba60fd 100644 --- a/frontend/src/licenses/license_policies/LicensePolicyEdit.tsx +++ b/frontend/src/licenses/license_policies/LicensePolicyEdit.tsx @@ -1,8 +1,18 @@ import { Typography } from "@mui/material"; -import { BooleanInput, DeleteButton, Edit, SaveButton, SimpleForm, Toolbar } from "react-admin"; +import { Fragment } from "react"; +import { + BooleanInput, + DeleteButton, + Edit, + ReferenceInput, + SaveButton, + SimpleForm, + Toolbar, + WithRecord, +} from "react-admin"; import { validate_255, validate_2048, validate_required_255 } from "../../commons/custom_validators"; -import { TextInputWide } from "../../commons/layout/themes"; +import { AutocompleteInputWide, TextInputWide } from "../../commons/layout/themes"; const CustomToolbar = () => { return ( @@ -38,6 +48,22 @@ const LicensePolicyEdit = () => { validate={validate_2048} helperText="Markdown supported." /> + ( + + {!license_policy.is_parent && ( + + + + )} + + )} + /> diff --git a/frontend/src/licenses/license_policies/LicensePolicyEmbeddedList.tsx b/frontend/src/licenses/license_policies/LicensePolicyEmbeddedList.tsx index 4239c1fe1..46a64c559 100644 --- a/frontend/src/licenses/license_policies/LicensePolicyEmbeddedList.tsx +++ b/frontend/src/licenses/license_policies/LicensePolicyEmbeddedList.tsx @@ -4,6 +4,7 @@ import { FilterForm, ListContextProvider, NullableBooleanInput, + ReferenceInput, ResourceContextProvider, TextField, TextInput, @@ -12,6 +13,7 @@ import { import { CustomPagination } from "../../commons/custom_fields/CustomPagination"; import { is_external } from "../../commons/functions"; +import { AutocompleteInputMedium } from "../../commons/layout/themes"; import { getSettingListSize } from "../../commons/user_settings/functions"; import LicensePolicyCreateButton from "./LicensePolicyCreateButton"; @@ -21,6 +23,15 @@ const showLicensePolicy = (id: any) => { const listFilters = [ , + + + , , ]; @@ -70,6 +81,7 @@ const LicensePolicyEmbeddedList = ({ license, license_group }: LicensePolicyEmbe resource="license_policies" > +
diff --git a/frontend/src/licenses/license_policies/LicensePolicyShow.tsx b/frontend/src/licenses/license_policies/LicensePolicyShow.tsx index 6d5cdcea8..e57b4e191 100644 --- a/frontend/src/licenses/license_policies/LicensePolicyShow.tsx +++ b/frontend/src/licenses/license_policies/LicensePolicyShow.tsx @@ -5,6 +5,7 @@ import { EditButton, Labeled, PrevNextButtons, + ReferenceField, Show, TextField, TopToolbar, @@ -68,6 +69,18 @@ const LicensePolicyComponent = () => { )} + {license_policy.parent && ( + + + + + + )} {license_policy.ignore_component_types && ( diff --git a/frontend/src/licenses/license_policy_items/LicensePolicyItemAdd.tsx b/frontend/src/licenses/license_policy_items/LicensePolicyItemAdd.tsx index 4fd76093e..e9139821a 100644 --- a/frontend/src/licenses/license_policy_items/LicensePolicyItemAdd.tsx +++ b/frontend/src/licenses/license_policy_items/LicensePolicyItemAdd.tsx @@ -34,6 +34,7 @@ const LicensePolicyItemAdd = ({ id }: LicensePolicyItemAddProps) => { const [license_expression, setLicenseExpression] = useState(); const [unknown_license, setUnknownLicense] = useState(); const [evaluation_result, setEvaluationResult] = useState(); + const [comment, setComment] = useState(); const resetState = () => { setLicenseGroup(undefined); @@ -41,6 +42,7 @@ const LicensePolicyItemAdd = ({ id }: LicensePolicyItemAddProps) => { setLicenseExpression(undefined); setUnknownLicense(undefined); setEvaluationResult(undefined); + setComment(undefined); }; const CancelButton = () => ( @@ -80,6 +82,7 @@ const LicensePolicyItemAdd = ({ id }: LicensePolicyItemAddProps) => { license_expression: license_expression, unknown_license: unknown_license, evaluation_result: evaluation_result, + comment: comment, }; return data; }; @@ -91,6 +94,9 @@ const LicensePolicyItemAdd = ({ id }: LicensePolicyItemAddProps) => { if (!data.unknown_license) { data.unknown_license = ""; } + if (!data.comment) { + data.comment = ""; + } const url = window.__RUNTIME_CONFIG__.API_BASE_URL + "/license_policy_items/"; const body = JSON.stringify({ license_policy: id, ...data }); httpClient(url, { @@ -177,6 +183,12 @@ const LicensePolicyItemAdd = ({ id }: LicensePolicyItemAddProps) => { validate={validate_required} onChange={(e) => setEvaluationResult(e)} /> + setComment(e.target.value)} + /> diff --git a/frontend/src/licenses/license_policy_items/LicensePolicyItemEdit.tsx b/frontend/src/licenses/license_policy_items/LicensePolicyItemEdit.tsx index 02a579521..a4e2c98c1 100644 --- a/frontend/src/licenses/license_policy_items/LicensePolicyItemEdit.tsx +++ b/frontend/src/licenses/license_policy_items/LicensePolicyItemEdit.tsx @@ -32,12 +32,17 @@ const LicensePolicyItemEdit = ({ license_policy_id, license_policy_item_id }: Li if (!data.unknown_license) { data.unknown_license = ""; } + if (!data.comment) { + data.comment = ""; + } + const patch = { license_group: data.license_group, license: data.license, license_expression: data.license_expression, unknown_license: data.unknown_license, evaluation_result: data.evaluation_result, + comment: data.comment, }; update( @@ -131,6 +136,7 @@ const LicensePolicyItemEdit = ({ license_policy_id, license_policy_item_id }: Li choices={EVALUATION_RESULT_CHOICES} validate={validate_required} /> + diff --git a/frontend/src/licenses/license_policy_items/LicensePolicyItemEmbeddedList.tsx b/frontend/src/licenses/license_policy_items/LicensePolicyItemEmbeddedList.tsx index d3eb65848..9e6f05347 100644 --- a/frontend/src/licenses/license_policy_items/LicensePolicyItemEmbeddedList.tsx +++ b/frontend/src/licenses/license_policy_items/LicensePolicyItemEmbeddedList.tsx @@ -3,6 +3,7 @@ import { Fragment } from "react"; import { Datagrid, FilterForm, + FunctionField, Identifier, ListContextProvider, ResourceContextProvider, @@ -46,6 +47,13 @@ const showLicense = (id: Identifier) => { return "#/licenses/" + id + "/show"; }; +export const commentShortened = (comment: string | null) => { + if (comment && comment.length > 100) { + return comment.substring(0, 96) + " ..."; + } + return comment; +}; + type LicensePolicyItemEmbeddedListProps = { license_policy: any; }; @@ -101,6 +109,12 @@ const LicensePolicyItemEmbeddedList = ({ license_policy }: LicensePolicyItemEmbe + commentShortened(record.comment)} + sortable={false} + sx={{ wordBreak: "break-word" }} + />{" "} {(is_superuser() || license_policy.is_manager) && ( ( From f28d01cb68125257a477be0d9bafed460ac3c403 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Thu, 19 Dec 2024 21:04:25 +0000 Subject: [PATCH 69/82] chore: remove semgrep parser (#2362) * chore: remove semgrep parser * fix: unittests --- .../parsers/semgrep/__init__.py | 0 .../parsers/semgrep/parser.py | 144 ---------- .../management/test_register_parsers.py | 4 +- .../parsers/semgrep/__init__.py | 0 .../semgrep/files/multiple_observations.json | 245 ------------------ .../parsers/semgrep/files/no_observation.json | 4 - .../parsers/semgrep/files/wrong_format.json | 3 - .../parsers/semgrep/test_parser.py | 103 -------- .../github_actions_and_templates.md | 4 +- docs/integrations/supported_scanners.md | 2 +- 10 files changed, 5 insertions(+), 504 deletions(-) delete mode 100644 backend/application/import_observations/parsers/semgrep/__init__.py delete mode 100644 backend/application/import_observations/parsers/semgrep/parser.py delete mode 100644 backend/unittests/import_observations/parsers/semgrep/__init__.py delete mode 100644 backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json delete mode 100644 backend/unittests/import_observations/parsers/semgrep/files/no_observation.json delete mode 100644 backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json delete mode 100644 backend/unittests/import_observations/parsers/semgrep/test_parser.py diff --git a/backend/application/import_observations/parsers/semgrep/__init__.py b/backend/application/import_observations/parsers/semgrep/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/application/import_observations/parsers/semgrep/parser.py b/backend/application/import_observations/parsers/semgrep/parser.py deleted file mode 100644 index 9b338c933..000000000 --- a/backend/application/import_observations/parsers/semgrep/parser.py +++ /dev/null @@ -1,144 +0,0 @@ -from json import dumps, load - -from django.core.files.base import File - -from application.core.models import Observation -from application.core.types import Severity -from application.import_observations.parsers.base_parser import ( - BaseFileParser, - BaseParser, -) -from application.import_observations.types import Parser_Type - -SEVERITIES = { - "error": Severity.SEVERITY_HIGH, - "warning": Severity.SEVERITY_MEDIUM, - "info": Severity.SEVERITY_LOW, -} - - -class SemgrepParser(BaseParser, BaseFileParser): - @classmethod - def get_name(cls) -> str: - return "Semgrep" - - @classmethod - def get_type(cls) -> str: - return Parser_Type.TYPE_SAST - - def check_format(self, file: File) -> tuple[bool, list[str], dict | list]: - try: # pylint: disable=duplicate-code - data = load(file) - except Exception: - return False, ["File is not valid JSON"], {} - - if not data.get("version"): - return False, ["File is not a Semgrep format, version is missing"], {} - - if not isinstance(data.get("results"), list): - return False, ["File is not a Semgrep format, data is not a list"], {} - - if len(data.get("results")) >= 1: # pylint: disable=duplicate-code - first_element = data.get("results")[0] - if not isinstance(first_element, dict): - return ( - False, - ["File is not a Semgrep format, element is not a dictionary"], - {}, - ) - if not first_element.get("check_id"): - return ( - False, - [ - "Data is not a Semgrep format, element doesn't have a check_id entry" - ], - {}, - ) - - return True, [], data - - def get_observations(self, data: dict) -> list[Observation]: - observations = [] - - version = data.get("version") - - for result in data.get("results", {}): - extra = result.get("extra", {}) - metadata = extra.get("metadata", {}) - category = metadata.get("category") - if category.lower() != "security": - continue - - check_id = result.get("check_id") - path = result.get("path") - start_line = None - end_line = None - if path: - start_line = result.get("start", {}).get("line") - end_line = result.get("end", {}).get("line") - severity = extra.get("severity") - engine_kind = extra.get("engine_kind") - fix = extra.get("fix") - if fix: - fix = f"```\n{fix}\n```" - - so_severity = SEVERITIES.get(severity.lower(), Severity.SEVERITY_UNKNOWN) - - scanner = self.get_name() - if engine_kind: - scanner = f"{scanner} ({engine_kind})" - scanner = f"{scanner} / {version}" - - observation = Observation( - title=check_id, - description=self._get_description(result), - recommendation=fix, - parser_severity=so_severity, - origin_source_file=path, - origin_source_line_start=start_line, - origin_source_line_end=end_line, - scanner=scanner, - ) - - evidence = [] - evidence.append("Result") - evidence.append(dumps(result)) - observation.unsaved_evidences.append(evidence) - - observation.unsaved_references = self._get_references(result) - - observations.append(observation) - - return observations - - def _get_description(self, result: dict) -> str: - extra = result.get("extra", {}) - message = extra.get("message") - metadata = extra.get("metadata", {}) - vulnerability_class = metadata.get("vulnerability_class", []) - - description = f"{message}" - - if len(vulnerability_class) == 1: - description += f"\n\n**Vulnerability Class:** {vulnerability_class[0]}" - if len(vulnerability_class) > 1: - description += ( - f"\n\n**Vulnerability Classes:** {', '.join(vulnerability_class)}" - ) - - return description - - def _get_references(self, result: dict) -> list[str]: - so_references = [] - - extra = result.get("extra", {}) - metadata = extra.get("metadata", {}) - references = metadata.get("references") - source = metadata.get("source") - references = metadata.get("references", []) - - if source: - so_references.append(source) - so_references.extend(references) - - return so_references diff --git a/backend/unittests/import_observations/management/test_register_parsers.py b/backend/unittests/import_observations/management/test_register_parsers.py index 6707bfd94..a27dab7e9 100644 --- a/backend/unittests/import_observations/management/test_register_parsers.py +++ b/backend/unittests/import_observations/management/test_register_parsers.py @@ -17,7 +17,7 @@ def test_register_parsers(self): command.handle() parsers = Parser.objects.all().order_by("name") - self.assertEqual(13, len(parsers)) + self.assertEqual(12, len(parsers)) parser = parsers[0] self.assertEqual("Azure Defender", parser.name) @@ -40,7 +40,7 @@ def test_register_parsers(self): self.assertEqual("", parser.module_name) self.assertEqual("", parser.class_name) - parser = parsers[11] + parser = parsers[10] self.assertEqual("Trivy Operator Prometheus", parser.name) self.assertEqual("Other", parser.type) self.assertEqual("API", parser.source) diff --git a/backend/unittests/import_observations/parsers/semgrep/__init__.py b/backend/unittests/import_observations/parsers/semgrep/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json b/backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json deleted file mode 100644 index 65dc8d146..000000000 --- a/backend/unittests/import_observations/parsers/semgrep/files/multiple_observations.json +++ /dev/null @@ -1,245 +0,0 @@ -{ - "version": "1.100.0", - "results": [ - { - "check_id": "python.lang.correctness.return-in-init.return-in-init", - "path": "application/api/utils.py", - "start": { - "line": 10, - "col": 44, - "offset": 398 - }, - "end": { - "line": 10, - "col": 95, - "offset": 449 - }, - "extra": { - "message": "`return` should never appear inside a class __init__ function. This will cause a runtime error.", - "metadata": { - "category": "correctness", - "technology": [ - "python" - ], - "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", - "source": "https://semgrep.dev/r/python.lang.correctness.return-in-init.return-in-init", - "shortlink": "https://sg.run/4xwl", - "semgrep.dev": { - "rule": { - "origin": "community", - "r_id": 9600, - "rule_id": "AbUzYe", - "rv_id": 946298, - "url": "https://semgrep.dev/playground/r/O9TX3WW/python.lang.correctness.return-in-init.return-in-init", - "version_id": "O9TX3WW" - } - } - }, - "severity": "ERROR", - "fingerprint": "requires login", - "lines": "requires login", - "validation_state": "NO_VALIDATOR", - "engine_kind": "OSS" - } - }, - { - "check_id": "python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", - "path": "application/management/commands/command.py", - "start": { - "line": 62, - "col": 17, - "offset": 3082 - }, - "end": { - "line": 62, - "col": 62, - "offset": 3127 - }, - "extra": { - "message": "Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option.", - "metadata": { - "cwe": [ - "CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')" - ], - "owasp": [ - "A01:2017 - Injection", - "A03:2021 - Injection" - ], - "references": [ - "https://docs.sqlalchemy.org/en/14/core/tutorial.html#using-textual-sql", - "https://www.tutorialspoint.com/sqlalchemy/sqlalchemy_quick_guide.htm", - "https://docs.sqlalchemy.org/en/14/core/tutorial.html#using-more-specific-text-with-table-expression-literal-column-and-expression-column" - ], - "category": "security", - "technology": [ - "sqlalchemy" - ], - "cwe2022-top25": true, - "cwe2021-top25": true, - "subcategory": [ - "audit" - ], - "likelihood": "LOW", - "impact": "HIGH", - "confidence": "LOW", - "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", - "vulnerability_class": [ - "SQL Injection" - ], - "source": "https://semgrep.dev/r/python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", - "shortlink": "https://sg.run/2b1L", - "semgrep.dev": { - "rule": { - "origin": "community", - "r_id": 10563, - "rule_id": "oqUz5y", - "rv_id": 946452, - "url": "https://semgrep.dev/playground/r/8KTKj19/python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", - "version_id": "8KTKj19" - } - } - }, - "severity": "ERROR", - "fingerprint": "requires login", - "lines": "requires login", - "validation_state": "NO_VALIDATOR", - "engine_kind": "OSS" - } - }, - { - "check_id": "python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", - "path": "application/tools/functions.py", - "start": { - "line": 45, - "col": 24, - "offset": 1496 - }, - "end": { - "line": 46, - "col": 34, - "offset": 1580 - }, - "extra": { - "message": "Detected MD5 hash algorithm which is considered insecure. MD5 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead.", - "metadata": { - "source-rule-url": "https://github.com/PyCQA/bandit/blob/d5f8fa0d89d7b11442fc6ec80ca42953974354c8/bandit/blacklists/calls.py#L59", - "cwe": [ - "CWE-327: Use of a Broken or Risky Cryptographic Algorithm" - ], - "owasp": [ - "A03:2017 - Sensitive Data Exposure", - "A02:2021 - Cryptographic Failures" - ], - "bandit-code": "B303", - "asvs": { - "control_id": "6.2.2 Insecure Custom Algorithm", - "control_url": "https://github.com/OWASP/ASVS/blob/master/4.0/en/0x14-V6-Cryptography.md#v62-algorithms", - "section": "V6 Stored Cryptography Verification Requirements", - "version": "4" - }, - "references": [ - "https://www.schneier.com/blog/archives/2012/10/when_will_we_se.html", - "https://www.trendmicro.com/vinfo/us/security/news/vulnerabilities-and-exploits/sha-1-collision-signals-the-end-of-the-algorithm-s-viability", - "http://2012.sharcs.org/slides/stevens.pdf", - "https://pycryptodome.readthedocs.io/en/latest/src/hash/sha3_256.html" - ], - "category": "security", - "technology": [ - "python" - ], - "subcategory": [ - "vuln" - ], - "likelihood": "LOW", - "impact": "MEDIUM", - "confidence": "MEDIUM", - "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", - "vulnerability_class": [ - "Cryptographic Issues", - "Other Issues" - ], - "source": "https://semgrep.dev/r/python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", - "shortlink": "https://sg.run/vYrY", - "semgrep.dev": { - "rule": { - "origin": "community", - "r_id": 33633, - "rule_id": "PeU2e2", - "rv_id": 946401, - "url": "https://semgrep.dev/playground/r/vdTGnR5/python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", - "version_id": "vdTGnR5" - } - } - }, - "severity": "WARNING", - "fingerprint": "requires login", - "lines": "requires login", - "validation_state": "NO_VALIDATOR", - "engine_kind": "OSS" - } - }, - { - "check_id": "python.lang.security.use-defusedcsv.use-defusedcsv", - "path": "application/management/commands/command.py", - "start": { - "line": 33, - "col": 18, - "offset": 820 - }, - "end": { - "line": 33, - "col": 50, - "offset": 852 - }, - "extra": { - "message": "Detected the generation of a CSV file using the built-in `csv` module. If user data is used to generate the data in this file, it is possible that an attacker could inject a formula when the CSV is imported into a spreadsheet application that runs an attacker script, which could steal data from the importing user or, at worst, install malware on the user's computer. `defusedcsv` is a drop-in replacement with the same API that will attempt to mitigate formula injection attempts. You can use `defusedcsv` instead of `csv` to safely generate CSVs.", - "fix": "defusedcsv.writer(open(file_path, 'w'))", - "metadata": { - "cwe": [ - "CWE-1236: Improper Neutralization of Formula Elements in a CSV File" - ], - "owasp": [ - "A01:2017 - Injection", - "A03:2021 - Injection" - ], - "references": [ - "https://github.com/raphaelm/defusedcsv", - "https://owasp.org/www-community/attacks/CSV_Injection", - "https://web.archive.org/web/20220516052229/https://www.contextis.com/us/blog/comma-separated-vulnerabilities" - ], - "category": "security", - "technology": [ - "python" - ], - "confidence": "LOW", - "subcategory": [ - "audit" - ], - "likelihood": "LOW", - "impact": "LOW", - "license": "Semgrep Rules License v1.0. For more details, visit semgrep.dev/legal/rules-license", - "vulnerability_class": [ - "Improper Validation" - ], - "source": "https://semgrep.dev/r/python.lang.security.use-defusedcsv.use-defusedcsv", - "shortlink": "https://sg.run/GzRn", - "semgrep.dev": { - "rule": { - "origin": "community", - "r_id": 31148, - "rule_id": "gxUrAb", - "rv_id": 946409, - "url": "https://semgrep.dev/playground/r/gETe1DO/python.lang.security.use-defusedcsv.use-defusedcsv", - "version_id": "gETe1DO" - } - } - }, - "severity": "INFO", - "fingerprint": "requires login", - "lines": "requires login", - "validation_state": "NO_VALIDATOR", - "engine_kind": "OSS" - } - } - ] -} diff --git a/backend/unittests/import_observations/parsers/semgrep/files/no_observation.json b/backend/unittests/import_observations/parsers/semgrep/files/no_observation.json deleted file mode 100644 index b4ed2e6a0..000000000 --- a/backend/unittests/import_observations/parsers/semgrep/files/no_observation.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "version": "1.100.0", - "results": [] -} diff --git a/backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json b/backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json deleted file mode 100644 index f43c3e770..000000000 --- a/backend/unittests/import_observations/parsers/semgrep/files/wrong_format.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "data": "data" -} diff --git a/backend/unittests/import_observations/parsers/semgrep/test_parser.py b/backend/unittests/import_observations/parsers/semgrep/test_parser.py deleted file mode 100644 index 8824e063c..000000000 --- a/backend/unittests/import_observations/parsers/semgrep/test_parser.py +++ /dev/null @@ -1,103 +0,0 @@ -from os import path -from unittest import TestCase - -from application.import_observations.parsers.semgrep.parser import SemgrepParser - - -class TestSemgrepParser(TestCase): - def test_no_json(self): - with open(path.dirname(__file__) + "/test_parser.py") as testfile: - parser = SemgrepParser() - check, messages, data = parser.check_format(testfile) - - self.assertFalse(check) - self.assertEqual(1, len(messages)) - self.assertEqual("File is not valid JSON", messages[0]) - self.assertFalse(data) - - def test_wrong_format(self): - with open(path.dirname(__file__) + "/files/wrong_format.json") as testfile: - parser = SemgrepParser() - check, messages, data = parser.check_format(testfile) - - self.assertFalse(check) - self.assertEqual(1, len(messages)) - self.assertEqual( - "File is not a Semgrep format, version is missing", messages[0] - ) - self.assertFalse(data) - - def test_no_observation(self): - with open(path.dirname(__file__) + "/files/no_observation.json") as testfile: - parser = SemgrepParser() - check, messages, data = parser.check_format(testfile) - observations = parser.get_observations(data) - - self.assertTrue(check) - self.assertEqual(0, len(messages)) - self.assertEqual(0, len(observations)) - - def test_multiple_observations(self): - with open( - path.dirname(__file__) + "/files/multiple_observations.json" - ) as testfile: - parser = SemgrepParser() - check, messages, data = parser.check_format(testfile) - observations = parser.get_observations(data) - - self.assertTrue(check) - self.assertEqual(0, len(messages)) - self.assertEqual(3, len(observations)) - - observation = observations[0] - self.assertEqual( - "python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", - observation.title, - ) - description = """Avoiding SQL string concatenation: untrusted input concatenated with raw SQL query can result in SQL Injection. In order to execute raw query safely, prepared statement should be used. SQLAlchemy provides TextualSQL to easily used prepared statement with named parameters. For complex SQL composition, use SQL Expression Language or Schema Definition Language. In most cases, SQLAlchemy ORM will be a better option. - -**Vulnerability Class:** SQL Injection""" - self.assertEqual(description, observation.description) - self.assertEqual(None, observation.recommendation) - self.assertEqual("High", observation.parser_severity) - self.assertEqual( - "application/management/commands/command.py", - observation.origin_source_file, - ) - self.assertEqual(62, observation.origin_source_line_start) - self.assertEqual(62, observation.origin_source_line_end) - self.assertEqual("Semgrep (OSS) / 1.100.0", observation.scanner) - self.assertEqual(4, len(observation.unsaved_references)) - self.assertEqual( - "https://semgrep.dev/r/python.sqlalchemy.security.sqlalchemy-execute-raw-query.sqlalchemy-execute-raw-query", - observation.unsaved_references[0], - ) - self.assertEqual( - "https://docs.sqlalchemy.org/en/14/core/tutorial.html#using-textual-sql", - observation.unsaved_references[1], - ) - self.assertEqual(1, len(observation.unsaved_evidences)) - self.assertEqual("Result", observation.unsaved_evidences[0][0]) - self.assertIn("oqUz5y", observation.unsaved_evidences[0][1]) - - observation = observations[1] - self.assertEqual( - "python.lang.security.insecure-hash-algorithms-md5.insecure-hash-algorithm-md5", - observation.title, - ) - description = """Detected MD5 hash algorithm which is considered insecure. MD5 is not collision resistant and is therefore not suitable as a cryptographic signature. Use SHA256 or SHA3 instead. - -**Vulnerability Classes:** Cryptographic Issues, Other Issues""" - self.assertEqual(description, observation.description) - self.assertEqual(None, observation.recommendation) - self.assertEqual("Medium", observation.parser_severity) - - observation = observations[2] - self.assertEqual( - "python.lang.security.use-defusedcsv.use-defusedcsv", observation.title - ) - recommendation = """``` -defusedcsv.writer(open(file_path, 'w')) -```""" - self.assertEqual(recommendation, observation.recommendation) - self.assertEqual("Low", observation.parser_severity) diff --git a/docs/integrations/github_actions_and_templates.md b/docs/integrations/github_actions_and_templates.md index fa5e5ebda..f449d1900 100644 --- a/docs/integrations/github_actions_and_templates.md +++ b/docs/integrations/github_actions_and_templates.md @@ -240,7 +240,7 @@ semgrep_backend: variables: CONFIGURATION: "r/python" TARGET: "backend" - REPORT_NAME: "semgrep_backend.json" + REPORT_NAME: "semgrep_backend.sarif.json" SO_ORIGIN_SERVICE: "backend" needs: [] @@ -249,7 +249,7 @@ semgrep_frontend: variables: CONFIGURATION: "r/typescript" TARGET: "frontend/src" - REPORT_NAME: "semgrep_frontend.json" + REPORT_NAME: "semgrep_frontend.sarif.json" SO_ORIGIN_SERVICE: "frontend" needs: [] diff --git a/docs/integrations/supported_scanners.md b/docs/integrations/supported_scanners.md index 7a33e359e..8065bf72d 100644 --- a/docs/integrations/supported_scanners.md +++ b/docs/integrations/supported_scanners.md @@ -39,7 +39,7 @@ These scanners have been tested with SecObserve: | [Bandit](https://bandit.readthedocs.io/en/latest) | SARIF | File | | [ESLint](https://github.com/nodesecurity/eslint-plugin-security) | SARIF | File | | [Find-Sec-Bugs](https://find-sec-bugs.github.io) | SARIF | File | -| [Semgrep](https://semgrep.dev/docs) | Semgrep | File | +| [Semgrep](https://semgrep.dev/docs) | SARIF | File | | **SAST infrastructure** | | [Checkov](https://www.checkov.io/1.Welcome/Quick%20Start.html) | SARIF | File | | [KICS](https://docs.kics.io/latest) | SARIF | File | From 82497f5772f0f48d2f3a4d954f7ca99b822c0ebf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 08:09:39 +0100 Subject: [PATCH 70/82] chore(deps): update dependency @types/react to v18.3.18 (#2363) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 8 ++++---- frontend/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d8e050894..b11e52b99 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,7 +42,7 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.2", "@types/prop-types": "15.7.14", - "@types/react": "18.3.17", + "@types/react": "18.3.18", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.1", @@ -3059,9 +3059,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz", - "integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==", + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index a4dae2a05..c5414739f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -51,7 +51,7 @@ "@types/inflection": "1.13.2", "@types/node": "22.10.2", "@types/prop-types": "15.7.14", - "@types/react": "18.3.17", + "@types/react": "18.3.18", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", "@typescript-eslint/eslint-plugin": "8.18.1", From 741db7d967927765006de607e24f512daac14a6a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 20:09:03 +0000 Subject: [PATCH 71/82] chore(deps): update github/codeql-action action to v3.28.0 (#2364) --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 6eb553d6a..70db2ca3a 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 + uses: github/codeql-action/upload-sarif@48ab28a6f5dbc2a99bf1e0131198dd8f1df78169 # v3.28.0 with: sarif_file: results.sarif From b0b5a8a1799ffc4373c330d3a3c014ed0301b9bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 20:47:34 +0000 Subject: [PATCH 72/82] fix(deps): update dependency mypy to v1.14.0 (#2365) --- backend/poetry.lock | 72 +++++++++++++++++++++--------------------- backend/pyproject.toml | 2 +- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 98d1aa4cd..fcccc60d4 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -1382,49 +1382,49 @@ files = [ [[package]] name = "mypy" -version = "1.13.0" +version = "1.14.0" description = "Optional static typing for Python" optional = true python-versions = ">=3.8" files = [ - {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, - {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, - {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, - {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, - {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, - {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, - {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, - {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, - {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, - {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, - {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, - {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, - {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, - {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, - {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, - {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, - {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, - {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, - {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, - {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, - {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, - {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, - {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, - {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, - {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, - {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, - {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, + {file = "mypy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e971c1c667007f9f2b397ffa80fa8e1e0adccff336e5e77e74cb5f22868bee87"}, + {file = "mypy-1.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e86aaeaa3221a278c66d3d673b297232947d873773d61ca3ee0e28b2ff027179"}, + {file = "mypy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1628c5c3ce823d296e41e2984ff88c5861499041cb416a8809615d0c1f41740e"}, + {file = "mypy-1.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fadb29b77fc14a0dd81304ed73c828c3e5cde0016c7e668a86a3e0dfc9f3af3"}, + {file = "mypy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:3fa76988dc760da377c1e5069200a50d9eaaccf34f4ea18428a3337034ab5a44"}, + {file = "mypy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e73c8a154eed31db3445fe28f63ad2d97b674b911c00191416cf7f6459fd49a"}, + {file = "mypy-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:273e70fcb2e38c5405a188425aa60b984ffdcef65d6c746ea5813024b68c73dc"}, + {file = "mypy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1daca283d732943731a6a9f20fdbcaa927f160bc51602b1d4ef880a6fb252015"}, + {file = "mypy-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7e68047bedb04c1c25bba9901ea46ff60d5eaac2d71b1f2161f33107e2b368eb"}, + {file = "mypy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:7a52f26b9c9b1664a60d87675f3bae00b5c7f2806e0c2800545a32c325920bcc"}, + {file = "mypy-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d5326ab70a6db8e856d59ad4cb72741124950cbbf32e7b70e30166ba7bbf61dd"}, + {file = "mypy-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bf4ec4980bec1e0e24e5075f449d014011527ae0055884c7e3abc6a99cd2c7f1"}, + {file = "mypy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:390dfb898239c25289495500f12fa73aa7f24a4c6d90ccdc165762462b998d63"}, + {file = "mypy-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e026d55ddcd76e29e87865c08cbe2d0104e2b3153a523c529de584759379d3d"}, + {file = "mypy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:585ed36031d0b3ee362e5107ef449a8b5dfd4e9c90ccbe36414ee405ee6b32ba"}, + {file = "mypy-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9f6f4c0b27401d14c483c622bc5105eff3911634d576bbdf6695b9a7c1ba741"}, + {file = "mypy-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b2280cedcb312c7a79f5001ae5325582d0d339bce684e4a529069d0e7ca1e7"}, + {file = "mypy-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:342de51c48bab326bfc77ce056ba08c076d82ce4f5a86621f972ed39970f94d8"}, + {file = "mypy-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:00df23b42e533e02a6f0055e54de9a6ed491cd8b7ea738647364fd3a39ea7efc"}, + {file = "mypy-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e8c8387e5d9dff80e7daf961df357c80e694e942d9755f3ad77d69b0957b8e3f"}, + {file = "mypy-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b16738b1d80ec4334654e89e798eb705ac0c36c8a5c4798496cd3623aa02286"}, + {file = "mypy-1.14.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10065fcebb7c66df04b05fc799a854b1ae24d9963c8bb27e9064a9bdb43aa8ad"}, + {file = "mypy-1.14.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fbb7d683fa6bdecaa106e8368aa973ecc0ddb79a9eaeb4b821591ecd07e9e03c"}, + {file = "mypy-1.14.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:3498cb55448dc5533e438cd13d6ddd28654559c8c4d1fd4b5ca57a31b81bac01"}, + {file = "mypy-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:c7b243408ea43755f3a21a0a08e5c5ae30eddb4c58a80f415ca6b118816e60aa"}, + {file = "mypy-1.14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14117b9da3305b39860d0aa34b8f1ff74d209a368829a584eb77524389a9c13e"}, + {file = "mypy-1.14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af98c5a958f9c37404bd4eef2f920b94874507e146ed6ee559f185b8809c44cc"}, + {file = "mypy-1.14.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0b343a1d3989547024377c2ba0dca9c74a2428ad6ed24283c213af8dbb0710b"}, + {file = "mypy-1.14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cdb5563c1726c85fb201be383168f8c866032db95e1095600806625b3a648cb7"}, + {file = "mypy-1.14.0-cp39-cp39-win_amd64.whl", hash = "sha256:74e925649c1ee0a79aa7448baf2668d81cc287dc5782cff6a04ee93f40fb8d3f"}, + {file = "mypy-1.14.0-py3-none-any.whl", hash = "sha256:2238d7f93fc4027ed1efc944507683df3ba406445a2b6c96e79666a045aadfab"}, + {file = "mypy-1.14.0.tar.gz", hash = "sha256:822dbd184d4a9804df5a7d5335a68cf7662930e70b8c1bc976645d1509f9a9d6"}, ] [package.dependencies] -mypy-extensions = ">=1.0.0" +mypy_extensions = ">=1.0.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.6.0" +typing_extensions = ">=4.6.0" [package.extras] dmypy = ["psutil (>=4.0)"] @@ -2572,4 +2572,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "f45c89e9735ac316d4b9a124d9c1762226f3505615d982c17a8e5383c929a5ba" +content-hash = "9a161ee2b884a83410944fb0f3c412bca8b7b67be52bf3e5c0f7f6db09c19e9a" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index bb7f8de5b..594ca3798 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -83,7 +83,7 @@ black = { version = "24.10.0", optional = true } # https://github.com/psf/black pylint = { version = "3.3.2", optional = true } # https://github.com/pylint-dev/pylint pylint-django = { version = "2.6.1", optional = true } # https://github.com/PyCQA/pylint-django pre-commit = { version = "4.0.1", optional = true } # https://github.com/pre-commit/pre-commit -mypy = { version = "1.13.0", optional = true } # https://github.com/python/mypy +mypy = { version = "1.14.0", optional = true } # https://github.com/python/mypy django-stubs = { version = "5.1.1", optional = true } # https://github.com/typeddjango/django-stubs djangorestframework-stubs = { version = "3.15.2", optional = true } # https://github.com/typeddjango/djangorestframework-stubs types-PyMySQL = { version = "1.1.0.20241103", optional = true } # https://github.com/python/typeshed From f4eaec4992825c63da0ccd84a661a166711f2d94 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Mon, 23 Dec 2024 07:56:42 +0000 Subject: [PATCH 73/82] feat: SPDX parser for license scanning (#2367) * feat: SPDX parser for license scanning * chore: black * chore: documentation --- .../parsers/base_parser.py | 2 +- .../parsers/spdx/__init__.py | 0 .../parsers/spdx/parser.py | 177 + backend/poetry.lock | 179 +- backend/pyproject.toml | 1 + .../management/test_register_parsers.py | 4 +- .../parsers/spdx/__init__.py | 0 .../spdx/files/multiple_observations.json | 8231 +++++++++++++++++ .../parsers/spdx/files/no_observation.json | 20 + .../parsers/spdx/files/wrong_format.json | 3 + .../parsers/spdx/test_parser.py | 121 + docs/getting_started/features.md | 2 +- docs/usage/license_management.md | 4 +- 13 files changed, 8719 insertions(+), 25 deletions(-) create mode 100644 backend/application/import_observations/parsers/spdx/__init__.py create mode 100644 backend/application/import_observations/parsers/spdx/parser.py create mode 100644 backend/unittests/import_observations/parsers/spdx/__init__.py create mode 100644 backend/unittests/import_observations/parsers/spdx/files/multiple_observations.json create mode 100644 backend/unittests/import_observations/parsers/spdx/files/no_observation.json create mode 100644 backend/unittests/import_observations/parsers/spdx/files/wrong_format.json create mode 100644 backend/unittests/import_observations/parsers/spdx/test_parser.py diff --git a/backend/application/import_observations/parsers/base_parser.py b/backend/application/import_observations/parsers/base_parser.py index 8e117b506..0b7ab7cd0 100644 --- a/backend/application/import_observations/parsers/base_parser.py +++ b/backend/application/import_observations/parsers/base_parser.py @@ -43,5 +43,5 @@ def check_connection( class BaseFileParser: - def check_format(self, file: File) -> tuple[bool, list[str], dict | list]: + def check_format(self, file: File) -> tuple[bool, list[str], Any]: raise NotImplementedError("check_format() must be overridden") diff --git a/backend/application/import_observations/parsers/spdx/__init__.py b/backend/application/import_observations/parsers/spdx/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/application/import_observations/parsers/spdx/parser.py b/backend/application/import_observations/parsers/spdx/parser.py new file mode 100644 index 000000000..4ffeec50c --- /dev/null +++ b/backend/application/import_observations/parsers/spdx/parser.py @@ -0,0 +1,177 @@ +from dataclasses import dataclass +from json import dumps, load +from typing import Any + +from django.core.files.base import File +from spdx_tools.spdx.model import Document +from spdx_tools.spdx.model.relationship import RelationshipType +from spdx_tools.spdx.parser.error import SPDXParsingError +from spdx_tools.spdx.parser.jsonlikedict.json_like_dict_parser import JsonLikeDictParser + +from application.core.models import Observation +from application.import_observations.parsers.base_parser import ( + BaseFileParser, + BaseParser, +) +from application.import_observations.types import Parser_Type +from application.licenses.models import License_Component + + +@dataclass +class ImportedData: + data_json: dict + document: Document + + +class SPDXParser(BaseParser, BaseFileParser): + @classmethod + def get_name(cls) -> str: + return "SPDX" + + @classmethod + def get_type(cls) -> str: + return Parser_Type.TYPE_SCA + + def check_format(self, file: File) -> tuple[bool, list[str], Any]: + try: + data = load(file) + except Exception: + return False, ["File is not valid JSON"], {} + + try: + document = JsonLikeDictParser().parse(data) + except SPDXParsingError as e: + return False, e.get_messages(), {} + + imported_data = ImportedData(data, document) + + return True, [], imported_data + + def get_observations(self, data: ImportedData) -> list[Observation]: + return [] + + def get_license_components(self, data: ImportedData) -> list[License_Component]: + observations = [] + + packages = self._create_package_dict(data.data_json) + relationships = self._create_relationship_dict(data.document, packages) + + for package in data.document.packages: + version = "" + if package.version is not None: + version = str(package.version) + + unsaved_license = None + if ( + package.license_concluded is not None + and str(package.license_concluded) != "" + and str(package.license_concluded) != "NOASSERTION" + ): + unsaved_license = package.license_concluded + elif ( + package.license_declared is not None + and str(package.license_declared) != "" + and str(package.license_declared) != "NOASSERTION" + ): + unsaved_license = package.license_declared + + purl = "" + for external_reference in package.external_references: + if external_reference.reference_type == "purl": + purl = external_reference.locator + break + + dependencies = self._get_dependencies( + package.spdx_id, packages, relationships + ) + + license_component = License_Component( + name=package.name, + version=version, + purl=purl, + dependencies=dependencies, + ) + if unsaved_license is not None: + license_component.unsaved_license = str(unsaved_license) + + evidence = [] + package_json = packages.get(package.spdx_id) + if package_json: + evidence.append("Package") + evidence.append(dumps(package_json)) + license_component.unsaved_evidences.append(evidence) + + observations.append(license_component) + + return observations + + def _create_package_dict(self, data: dict) -> dict[str, dict]: + package_dict = {} + for package in data["packages"]: + package_dict[package["SPDXID"]] = package + return package_dict + + def _create_relationship_dict( + self, document: Document, package_dict: dict[str, dict] + ) -> dict[str, list[str]]: + relationship_dict: dict[str, list[str]] = {} + for relationship in document.relationships: + if ( + relationship.spdx_element_id in package_dict.keys() + and relationship.related_spdx_element_id in package_dict.keys() + and ( + relationship.relationship_type + in (RelationshipType.DEPENDS_ON, RelationshipType.CONTAINS) + ) + ): + relationship_value = relationship_dict.get( + str(relationship.related_spdx_element_id), [] + ) + relationship_value.append(relationship.spdx_element_id) + relationship_dict[str(relationship.related_spdx_element_id)] = ( + relationship_value + ) + return relationship_dict + + def _get_dependencies( + self, package_id: str, package_dict: dict, relationship_dict: dict + ) -> str: + dependencies: list[str] = [] + self._get_dependencies_recursive( + package_id, package_dict, relationship_dict, dependencies + ) + + dependencies.sort() + return "\n".join(dependencies) + + def _get_dependencies_recursive( + self, + package_id: str, + package_dict: dict, + relationship_dict: dict, + dependencies: list, + ) -> None: + if package_id in relationship_dict.keys(): + for dependency_id in relationship_dict[package_id]: + translated_dependency_id = self._translate_package_id( + dependency_id, package_dict + ) + translated_package_id = self._translate_package_id( + package_id, package_dict + ) + dependency = f"{translated_dependency_id} --> {translated_package_id}" + if dependency not in dependencies: + dependencies.append(dependency) + self._get_dependencies_recursive( + dependency_id, package_dict, relationship_dict, dependencies + ) + + def _translate_package_id(self, package_id: str, package_dict: dict) -> str: + package = package_dict.get(package_id) + if not package: + return "" + + if package.get("versionInfo"): + return f"{package.get('name', '')}:{package.get('versionInfo', '')}" + + return package.get("name", "") diff --git a/backend/poetry.lock b/backend/poetry.lock index fcccc60d4..8f81a0799 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -76,13 +76,13 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "3.3.6" +version = "3.3.7" description = "An abstract syntax tree for Python with inference support." optional = true python-versions = ">=3.9.0" files = [ - {file = "astroid-3.3.6-py3-none-any.whl", hash = "sha256:db676dc4f3ae6bfe31cda227dc60e03438378d7a896aec57422c95634e8d722f"}, - {file = "astroid-3.3.6.tar.gz", hash = "sha256:6aaea045f938c735ead292204afdb977a36e989522b7833ef6fea94de743f442"}, + {file = "astroid-3.3.7-py3-none-any.whl", hash = "sha256:e1ea2c358a3c760ef583d4963e773100fa2c693b27ed158a1d0e81adb4436903"}, + {file = "astroid-3.3.7.tar.gz", hash = "sha256:29fe1df7ef64dc17a54dbfad67b40b445340fcdba7c4012e7ecc9270c9b2f5b6"}, ] [package.dependencies] @@ -122,6 +122,24 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +[[package]] +name = "beartype" +version = "0.19.0" +description = "Unbearably fast near-real-time hybrid runtime-static type-checking in pure Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "beartype-0.19.0-py3-none-any.whl", hash = "sha256:33b2694eda0daf052eb2aff623ed9a8a586703bbf0a90bbc475a83bbf427f699"}, + {file = "beartype-0.19.0.tar.gz", hash = "sha256:de42dfc1ba5c3710fde6c3002e3bd2cad236ed4d2aabe876345ab0b4234a6573"}, +] + +[package.extras] +dev = ["autoapi (>=0.9.0)", "coverage (>=5.5)", "equinox", "jax[cpu]", "jaxtyping", "mypy (>=0.800)", "numba", "numpy", "pandera", "pydata-sphinx-theme (<=0.7.2)", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "sphinx", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)", "tox (>=3.20.1)", "typing-extensions (>=3.10.0.0)"] +doc-rtd = ["autoapi (>=0.9.0)", "pydata-sphinx-theme (<=0.7.2)", "sphinx (>=4.2.0,<6.0.0)", "sphinxext-opengraph (>=0.7.5)"] +test = ["coverage (>=5.5)", "equinox", "jax[cpu]", "jaxtyping", "mypy (>=0.800)", "numba", "numpy", "pandera", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "sphinx", "tox (>=3.20.1)", "typing-extensions (>=3.10.0.0)"] +test-tox = ["equinox", "jax[cpu]", "jaxtyping", "mypy (>=0.800)", "numba", "numpy", "pandera", "pygments", "pyright (>=1.1.370)", "pytest (>=4.0.0)", "sphinx", "typing-extensions (>=3.10.0.0)"] +test-tox-coverage = ["coverage (>=5.5)"] + [[package]] name = "black" version = "24.10.0" @@ -396,13 +414,13 @@ files = [ [[package]] name = "click" -version = "8.1.7" +version = "8.1.8" description = "Composable command line interface toolkit" -optional = true +optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] [package.dependencies] @@ -412,7 +430,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -optional = true +optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, @@ -1107,13 +1125,13 @@ tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < [[package]] name = "ipython" -version = "8.30.0" +version = "8.31.0" description = "IPython: Productive Interactive Computing" optional = true python-versions = ">=3.10" files = [ - {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, - {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, + {file = "ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6"}, + {file = "ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b"}, ] [package.dependencies] @@ -1143,6 +1161,17 @@ qtconsole = ["qtconsole"] test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] +[[package]] +name = "isodate" +version = "0.7.2" +description = "An ISO 8601 date/time/duration parser and formatter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15"}, + {file = "isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6"}, +] + [[package]] name = "isort" version = "5.13.2" @@ -1661,6 +1690,17 @@ docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-a test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] type = ["mypy (>=1.11.2)"] +[[package]] +name = "ply" +version = "3.11" +description = "Python Lex & Yacc" +optional = false +python-versions = "*" +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] + [[package]] name = "pre-commit" version = "4.0.1" @@ -2030,6 +2070,20 @@ files = [ ed25519 = ["PyNaCl (>=1.4.0)"] rsa = ["cryptography"] +[[package]] +name = "pyparsing" +version = "3.2.0" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"}, + {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pyyaml" version = "6.0.2" @@ -2092,6 +2146,28 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "rdflib" +version = "7.1.1" +description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." +optional = false +python-versions = "<4.0.0,>=3.8.1" +files = [ + {file = "rdflib-7.1.1-py3-none-any.whl", hash = "sha256:e590fa9a2c34ba33a667818b5a84be3fb8a4d85868f8038f17912ec84f912a25"}, + {file = "rdflib-7.1.1.tar.gz", hash = "sha256:164de86bd3564558802ca983d84f6616a4a1a420c7a17a8152f5016076b2913e"}, +] + +[package.dependencies] +isodate = {version = ">=0.7.2,<1.0.0", markers = "python_version < \"3.11\""} +pyparsing = ">=2.1.0,<4" + +[package.extras] +berkeleydb = ["berkeleydb (>=18.1.0,<19.0.0)"] +html = ["html5rdf (>=1.2,<2)"] +lxml = ["lxml (>=4.3,<6.0)"] +networkx = ["networkx (>=2,<4)"] +orjson = ["orjson (>=3.9.14,<4)"] + [[package]] name = "referencing" version = "0.35.1" @@ -2272,6 +2348,21 @@ files = [ {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, ] +[[package]] +name = "semantic-version" +version = "2.10.0" +description = "A library implementing the 'SemVer' scheme." +optional = false +python-versions = ">=2.7" +files = [ + {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"}, + {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"}, +] + +[package.extras] +dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme"] + [[package]] name = "semver" version = "3.0.2" @@ -2283,6 +2374,34 @@ files = [ {file = "semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc"}, ] +[[package]] +name = "spdx-tools" +version = "0.8.3" +description = "SPDX parser and tools." +optional = false +python-versions = ">=3.7" +files = [ + {file = "spdx-tools-0.8.3.tar.gz", hash = "sha256:68b8f9ce2893b5216bd90b2e63f1c821c2884e4ebc4fd295ebbf1fa8b8a94b93"}, + {file = "spdx_tools-0.8.3-py3-none-any.whl", hash = "sha256:638fd9bd8be61901316eb6d063574e16d5403a1870073ec4d9241426a997501a"}, +] + +[package.dependencies] +beartype = "*" +click = "*" +license-expression = "*" +ply = "*" +pyyaml = "*" +rdflib = "*" +semantic-version = "*" +uritools = "*" +xmltodict = "*" + +[package.extras] +code-style = ["black", "flake8", "isort"] +development = ["black", "flake8", "isort", "networkx", "pytest"] +graph-generation = ["networkx", "pygraphviz"] +test = ["pyshacl", "pytest", "tzdata"] + [[package]] name = "sqlparse" version = "0.5.3" @@ -2415,13 +2534,13 @@ files = [ [[package]] name = "types-pyyaml" -version = "6.0.12.20240917" +version = "6.0.12.20241221" description = "Typing stubs for PyYAML" optional = true python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.20240917.tar.gz", hash = "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587"}, - {file = "types_PyYAML-6.0.12.20240917-py3-none-any.whl", hash = "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570"}, + {file = "types_PyYAML-6.0.12.20241221-py3-none-any.whl", hash = "sha256:0657a4ff8411a030a2116a196e8e008ea679696b5b1a8e1a6aa8ebb737b34688"}, + {file = "types_pyyaml-6.0.12.20241221.tar.gz", hash = "sha256:4f149aa893ff6a46889a30af4c794b23833014c469cc57cbc3ad77498a58996f"}, ] [[package]] @@ -2471,15 +2590,26 @@ files = [ {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] +[[package]] +name = "uritools" +version = "4.0.3" +description = "URI parsing, classification and composition" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uritools-4.0.3-py3-none-any.whl", hash = "sha256:bae297d090e69a0451130ffba6f2f1c9477244aa0a5543d66aed2d9f77d0dd9c"}, + {file = "uritools-4.0.3.tar.gz", hash = "sha256:ee06a182a9c849464ce9d5fa917539aacc8edd2a4924d1b7aabeeecabcae3bc2"}, +] + [[package]] name = "urllib3" -version = "2.2.3" +version = "2.3.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, ] [package.extras] @@ -2564,6 +2694,17 @@ files = [ [package.extras] brotli = ["brotli"] +[[package]] +name = "xmltodict" +version = "0.14.2" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.6" +files = [ + {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, + {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, +] + [extras] code-quality = ["black", "django-stubs", "djangorestframework-stubs", "flake8", "flake8-isort", "mypy", "pre-commit", "pylint", "pylint-django", "types-PyMySQL"] dev = ["Werkzeug", "django-extensions", "ipdb"] @@ -2572,4 +2713,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "9a161ee2b884a83410944fb0f3c412bca8b7b67be52bf3e5c0f7f6db09c19e9a" +content-hash = "ed47bf9b689e497695489fbc03ce5f8562c8e97f0e989b3b4b3ba50b47b2b7b1" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 594ca3798..cc8c53a52 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -61,6 +61,7 @@ jira = "3.8.0" # https://github.com/pycontribs/jira inflect = "7.4.0" # https://github.com/jaraco/inflect validators = "0.34.0" # https://github.com/python-validators/validators py-ocsf-models = "0.2.0" # https://github.com/prowler-cloud/py-ocsf-models +spdx-tools = "0.8.3" # https://github.com/spdx/tools-python # Development dependencies # ------------------------------------------------------------------------------ diff --git a/backend/unittests/import_observations/management/test_register_parsers.py b/backend/unittests/import_observations/management/test_register_parsers.py index a27dab7e9..6707bfd94 100644 --- a/backend/unittests/import_observations/management/test_register_parsers.py +++ b/backend/unittests/import_observations/management/test_register_parsers.py @@ -17,7 +17,7 @@ def test_register_parsers(self): command.handle() parsers = Parser.objects.all().order_by("name") - self.assertEqual(12, len(parsers)) + self.assertEqual(13, len(parsers)) parser = parsers[0] self.assertEqual("Azure Defender", parser.name) @@ -40,7 +40,7 @@ def test_register_parsers(self): self.assertEqual("", parser.module_name) self.assertEqual("", parser.class_name) - parser = parsers[10] + parser = parsers[11] self.assertEqual("Trivy Operator Prometheus", parser.name) self.assertEqual("Other", parser.type) self.assertEqual("API", parser.source) diff --git a/backend/unittests/import_observations/parsers/spdx/__init__.py b/backend/unittests/import_observations/parsers/spdx/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/unittests/import_observations/parsers/spdx/files/multiple_observations.json b/backend/unittests/import_observations/parsers/spdx/files/multiple_observations.json new file mode 100644 index 000000000..b214495f4 --- /dev/null +++ b/backend/unittests/import_observations/parsers/spdx/files/multiple_observations.json @@ -0,0 +1,8231 @@ +{ + "spdxVersion": "SPDX-2.3", + "dataLicense": "CC0-1.0", + "SPDXID": "SPDXRef-DOCUMENT", + "name": "maibornwolff/secobserve-backend:1.20.0", + "documentNamespace": "http://aquasecurity.github.io/trivy/container_image/maibornwolff/secobserve-backend:1.20.0-b3fdfb29-cea7-4576-875b-9cd70d2552ba", + "creationInfo": { + "creators": [ + "Organization: aquasecurity", + "Tool: trivy-0.58.0" + ], + "created": "2024-12-21T15:02:40Z" + }, + "packages": [ + { + "name": "maibornwolff/secobserve-backend:1.20.0", + "SPDXID": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:oci/secobserve-backend@sha256%3Ace5416f0ca293e258ac5c7d8500eb41198064904379c6b033416772e07c3cf36?arch=amd64\u0026repository_url=index.docker.io%2Fmaibornwolff%2Fsecobserve-backend" + } + ], + "primaryPackagePurpose": "CONTAINER", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:0263bd6854c03606a3b401cd768cbfd65f7369da739be97c7b3eadacefb6e920" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:067ea9e8160a8dc9d3294d0360767b84d5536a1a9af0cd4b5c8ad18db79bf211" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:1b083c3d37d4af9aac0b85ffe924b1a53755cf5938c13fd9d167e78bd5003c1f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:28d5a07364f58ee245d5574d3783872ce41306698b8e812744053e6fab904acd" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:4771b4a9ca8c3b2c620d9aa7e0ccda31729f1da2b1f1dc4ba2f3f2476f97b230" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:6441aad4c363e4447a09eba470f5b6a31c45cbc3e4d08d99f775f97fb52f4d47" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:7a9ec794eb5a5ce2075cda9ac071449ee0e03fcbd37f704298f60665bdc2235a" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:c1c0edab5366e3470d74913fa1470263be7aeaf33b8cdb13611db7f6f38c9f66" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "DiffID: sha256:fb2478cc91120d6060382363ee60596e6d6ea6baf0cf71ce68d4e7940ec9daa7" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "ImageID: sha256:3fd45f090e0fcd15489139af1579fd54cceed2df2d1675041ea7ce59f4c0eecd" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.authors: stefan.fleckenstein@maibornwolff.de" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.created: 2024-10-14T09:38:23" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.description: SecObserve is an open source vulnerability management system for software development and cloud environments." + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.documentation: https://maibornwolff.github.io/SecObserve" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.licenses: BSD3-Clause" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.revision: 53406735448ccadde50aac370d4a7f02e0cc8e54" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.source: https://github.com/MaibornWolff/SecObserve" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.title: SecObserve backend" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.url: https://github.com/MaibornWolff/SecObserve" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.vendor: MaibornWolff GmbH" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Labels:org.opencontainers.image.version: 1.20.0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "RepoDigest: maibornwolff/secobserve-backend@sha256:ce5416f0ca293e258ac5c7d8500eb41198064904379c6b033416772e07c3cf36" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "RepoTag: maibornwolff/secobserve-backend:1.20.0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "SchemaVersion: 2" + } + ] + }, + { + "name": ".python-rundeps", + "SPDXID": "SPDXRef-Package-82ad85e2f96c7331", + "versionInfo": "20241001.223602", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "320b9ca11dedba4f8f22b77fb42c99b6d1f70c26" + } + ], + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/.python-rundeps@20241001.223602?arch=noarch\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: .python-rundeps@20241001.223602" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "Django", + "SPDXID": "SPDXRef-Package-d254ad6cee138a57", + "versionInfo": "", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "9adbaa08952f54dd4f2612d23e22c9df80a88c5d" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "NOASSERTION", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/django@5.1.2" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-53908" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-53907" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "PyJWT", + "SPDXID": "SPDXRef-Package-10c43c2162ce278d", + "versionInfo": "2.9.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "354513a47550187a9b84a4ae8073aeb2e3269fc4" + }, + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pyjwt@2.9.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "PyMySQL", + "SPDXID": "SPDXRef-Package-1b2850e1ae4916b3", + "versionInfo": "1.1.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "3b81a3837f4f8641bd91978890861c2404dbb31e" + }, + "licenseConcluded": "", + "licenseDeclared": "", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pymysql@1.1.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "PyYAML", + "SPDXID": "SPDXRef-Package-c95edc7a5d8ac61e", + "versionInfo": "6.0.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "1c66d3970facd5f8e0354795ab57774433a8059e" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pyyaml@6.0.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "alpine-baselayout", + "SPDXID": "SPDXRef-Package-e54fde353d493978", + "versionInfo": "3.6.5-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "a8a719fa3db7c6cb005e681086438ef1d1e76d6c" + } + ], + "sourceInfo": "built package from: alpine-baselayout 3.6.5-r0", + "licenseConcluded": "GPL-2.0-only", + "licenseDeclared": "GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/alpine-baselayout@3.6.5-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: alpine-baselayout@3.6.5-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "alpine-baselayout-data", + "SPDXID": "SPDXRef-Package-1eaddff436e6f866", + "versionInfo": "3.6.5-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "ee68a6fb02f7e62304b428b0404a2fc1e2fc353d" + } + ], + "sourceInfo": "built package from: alpine-baselayout 3.6.5-r0", + "licenseConcluded": "GPL-2.0-only", + "licenseDeclared": "GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/alpine-baselayout-data@3.6.5-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: alpine-baselayout-data@3.6.5-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "alpine-keys", + "SPDXID": "SPDXRef-Package-401da59cbccc29c1", + "versionInfo": "2.4-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "78ab5150a3919e474204e0f91972d1cf0a344f9d" + } + ], + "sourceInfo": "built package from: alpine-keys 2.4-r1", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/alpine-keys@2.4-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: alpine-keys@2.4-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "apk-tools", + "SPDXID": "SPDXRef-Package-5f65899468be8688", + "versionInfo": "2.14.4-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "a8c5ec2451b123ac57e39b0cb6ceccdaf26d5099" + } + ], + "sourceInfo": "built package from: apk-tools 2.14.4-r0", + "licenseConcluded": "GPL-2.0-only", + "licenseDeclared": "GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/apk-tools@2.14.4-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: apk-tools@2.14.4-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "argon2-cffi", + "SPDXID": "SPDXRef-Package-9115bdc8e113b7a5", + "versionInfo": "23.1.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "1d164899e43ecc93525d839bf00c688efbd47f9e" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/argon2-cffi@23.1.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "argon2-cffi-bindings", + "SPDXID": "SPDXRef-Package-e3057fc25773852a", + "versionInfo": "21.2.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "cbb05727c35b9aa3b532edd683be4ef8a4810662" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/argon2-cffi-bindings@21.2.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "asgiref", + "SPDXID": "SPDXRef-Package-9c2b5532e4fb5826", + "versionInfo": "3.8.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "7cc1399833135024e82675d11fe0460023b4afb8" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/asgiref@3.8.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "attrs", + "SPDXID": "SPDXRef-Package-627510e078d55320", + "versionInfo": "24.2.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "2352d1086e3046fc9298bfc815c4655d6e6017bb" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/attrs@24.2.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "bash", + "SPDXID": "SPDXRef-Package-a6430cd34bca5d7f", + "versionInfo": "5.2.26-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "4fbc9b6abbbb735f61cbd80d59b40d75d5a2c853" + } + ], + "sourceInfo": "built package from: bash 5.2.26-r0", + "licenseConcluded": "GPL-3.0-or-later", + "licenseDeclared": "GPL-3.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/bash@5.2.26-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: bash@5.2.26-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "busybox", + "SPDXID": "SPDXRef-Package-4ffb25b2152f4a8", + "versionInfo": "1.36.1-r29", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c98f2584c17556181e8098247177ea68d69b0c9c" + } + ], + "sourceInfo": "built package from: busybox 1.36.1-r29", + "licenseConcluded": "GPL-2.0-only", + "licenseDeclared": "GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/busybox@1.36.1-r29?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: busybox@1.36.1-r29" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "busybox-binsh", + "SPDXID": "SPDXRef-Package-e1062025609701e1", + "versionInfo": "1.36.1-r29", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "8758e1e06605e5818449aff862e105b80b6f34bf" + } + ], + "sourceInfo": "built package from: busybox 1.36.1-r29", + "licenseConcluded": "GPL-2.0-only", + "licenseDeclared": "GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/busybox-binsh@1.36.1-r29?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: busybox-binsh@1.36.1-r29" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "ca-certificates", + "SPDXID": "SPDXRef-Package-2a7813b7f32a841b", + "versionInfo": "20240705-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "f87752f100dc5cd7cd220fb0acc7ef2a8dce64ec" + } + ], + "sourceInfo": "built package from: ca-certificates 20240705-r0", + "licenseConcluded": "MPL-2.0 AND MIT", + "licenseDeclared": "MPL-2.0 AND MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/ca-certificates@20240705-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:0263bd6854c03606a3b401cd768cbfd65f7369da739be97c7b3eadacefb6e920" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:89daaeb4e2cbd47a43a83b4468c6a7d3848f67718bb25a73acd4ab6faf4968f7" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: ca-certificates@20240705-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "ca-certificates-bundle", + "SPDXID": "SPDXRef-Package-2922cedc355f9a33", + "versionInfo": "20240705-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "a927e8d0fd49c6cff7692a115ce237ed1bd62894" + } + ], + "sourceInfo": "built package from: ca-certificates 20240705-r0", + "licenseConcluded": "MPL-2.0 AND MIT", + "licenseDeclared": "MPL-2.0 AND MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/ca-certificates-bundle@20240705-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: ca-certificates-bundle@20240705-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "certifi", + "SPDXID": "SPDXRef-Package-b8b8a1b191badaf4", + "versionInfo": "2024.8.30", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "b70016443ed75f58bcf7037bffb3102c0c3cbbd8" + }, + "licenseConcluded": "MPL-2.0", + "licenseDeclared": "MPL-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/certifi@2024.8.30" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "cffi", + "SPDXID": "SPDXRef-Package-7d31d637877ba8c5", + "versionInfo": "1.17.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "cc0022e08130fb8e9f2a31369581f9d82176b332" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/cffi@1.17.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "charset-normalizer", + "SPDXID": "SPDXRef-Package-32a24e87731e8843", + "versionInfo": "3.4.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "9c3571a405249d690320ffab8497c9061b712582" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/charset-normalizer@3.4.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "cryptography", + "SPDXID": "SPDXRef-Package-1b4d8624e75a7cfb", + "versionInfo": "43.0.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "bb63f133b3c3d3e63093f7463d23a6041d258a66" + }, + "licenseConcluded": "Apache-2.0 AND BSD-3-Clause", + "licenseDeclared": "Apache-2.0 AND BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/cryptography@43.0.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "cvss", + "SPDXID": "SPDXRef-Package-ee74d307f362426e", + "versionInfo": "3.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "7cae04194b7a304c1feaed82141e693f86fb5d7d" + }, + "licenseConcluded": "LGPL-3.0-or-later", + "licenseDeclared": "LGPL-3.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/cvss@3.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "defusedcsv", + "SPDXID": "SPDXRef-Package-c4cfbee8d6b2f705", + "versionInfo": "2.0.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "10ca4293b3252c2b19a901bcdbc460f020fe4354" + }, + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/defusedcsv@2.0.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "defusedxml", + "SPDXID": "SPDXRef-Package-8877fbd11a82d92d", + "versionInfo": "0.7.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "f1df91271659c6668268e121cce34bca738693dd" + }, + "licenseConcluded": "Python-Software-Foundation-License", + "licenseDeclared": "Python-Software-Foundation-License", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/defusedxml@0.7.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "django-cors-headers", + "SPDXID": "SPDXRef-Package-f08cfb949b96c3fd", + "versionInfo": "4.5.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "8f8f0e49c50236a91706678701c25674f4673eab" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/django-cors-headers@4.5.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "django-encrypted-model-fields", + "SPDXID": "SPDXRef-Package-a70e071e90a16411", + "versionInfo": "0.6.5", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "a2d415dd79c6df6ab0a863cdea900088e0bea083" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/django-encrypted-model-fields@0.6.5" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "django-environ", + "SPDXID": "SPDXRef-Package-667ec4d30f9448ca", + "versionInfo": "0.11.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "509f11bd9d3a8c79577bda55fe71823f1a62998e" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/django-environ@0.11.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "django-filter", + "SPDXID": "SPDXRef-Package-dda338af0e931265", + "versionInfo": "24.3", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "56b602e85b7f94830a41ea2f76e0be43e2d6a5f2" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/django-filter@24.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "django-picklefield", + "SPDXID": "SPDXRef-Package-f479683cd5b127eb", + "versionInfo": "3.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "e2887a878b7fc6f27983b88b97753f858ac76ccf" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/django-picklefield@3.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "django_csp", + "SPDXID": "SPDXRef-Package-a79b1e07db11fda2", + "versionInfo": "3.8", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "2d0558cf57bcbde42c4f42770489fa5cf585971b" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/django-csp@3.8" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "djangorestframework", + "SPDXID": "SPDXRef-Package-18397ed76ba696db", + "versionInfo": "3.15.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "8b3f8ac093e11fad9e3295624de7e15b34cca8d1" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/djangorestframework@3.15.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "dnspython", + "SPDXID": "SPDXRef-Package-b2f8d2f815610bdd", + "versionInfo": "2.7.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "85d96857641ddd898597ee54ee65cea992f05f13" + }, + "licenseConcluded": "ISC", + "licenseDeclared": "ISC", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/dnspython@2.7.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "drf-spectacular", + "SPDXID": "SPDXRef-Package-243020cad11835ba", + "versionInfo": "0.27.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "ca5a2f9c5403a10eec3ea0e978ce6099e6612dd1" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/drf-spectacular@0.27.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "drf-spectacular-sidecar", + "SPDXID": "SPDXRef-Package-bbdabb1822373e2", + "versionInfo": "2024.7.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "751a3ad82a58f8ff5ffe6c82b1a80e29a4d18335" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/drf-spectacular-sidecar@2024.7.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "email_validator", + "SPDXID": "SPDXRef-Package-9743538d37c18eef", + "versionInfo": "2.1.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "fcb68fb9c92bc7379752e812eace04bc405eb9d9" + }, + "licenseConcluded": "Unlicense", + "licenseDeclared": "Unlicense", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/email-validator@2.1.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "et-xmlfile", + "SPDXID": "SPDXRef-Package-51db5a654b97def", + "versionInfo": "1.1.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "9a636389c767629142f99a5fa9849d3c5f195c44" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/et-xmlfile@1.1.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "fmt", + "SPDXID": "SPDXRef-Package-e47460d6783f8e2f", + "versionInfo": "10.2.1-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "bf0cb0333f9a1552f8906b7c42b318e1844de98a" + } + ], + "sourceInfo": "built package from: fmt 10.2.1-r1", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/fmt@10.2.1-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: fmt@10.2.1-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "fmt-dev", + "SPDXID": "SPDXRef-Package-199bc8f7d9a3957e", + "versionInfo": "10.2.1-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "91a8083cb20402fbb426089b6b33172e7b7b97ff" + } + ], + "sourceInfo": "built package from: fmt 10.2.1-r1", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/fmt-dev@10.2.1-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: fmt-dev@10.2.1-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "gdbm", + "SPDXID": "SPDXRef-Package-ef1ec84ae53752bd", + "versionInfo": "1.23-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "a007ec06fbe5ad90f2e4fcc9a9070d18edf7a1ef" + } + ], + "sourceInfo": "built package from: gdbm 1.23-r1", + "licenseConcluded": "GPL-3.0-or-later", + "licenseDeclared": "GPL-3.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/gdbm@1.23-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: gdbm@1.23-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "gunicorn", + "SPDXID": "SPDXRef-Package-11d5ece7c5a85d42", + "versionInfo": "23.0.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "e66abad802eac950e6d0254489febaa107a872a6" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/gunicorn@23.0.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "huey", + "SPDXID": "SPDXRef-Package-1e1e038dfc221849", + "versionInfo": "2.5.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "c929e7946357daa5a32cc9c23f32b4796b1781b2" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/huey@2.5.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "idna", + "SPDXID": "SPDXRef-Package-6431baa4f8e5a1d4", + "versionInfo": "3.10", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "aafd2b9ba93d0062ddc8ed4cad6e380d367c7844" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/idna@3.10" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "inflect", + "SPDXID": "SPDXRef-Package-5f93e44943eef1f0", + "versionInfo": "7.4.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "510110d2c661946ff307f661216967f29654e35a" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/inflect@7.4.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "inflection", + "SPDXID": "SPDXRef-Package-4f89458f153860d7", + "versionInfo": "0.5.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "491b6de8a7fb361f6923e72f55ff9302140baa56" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/inflection@0.5.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "jira", + "SPDXID": "SPDXRef-Package-8db3140332c0f1a6", + "versionInfo": "3.8.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "468d84c00a0cb1f29da9266919471267334f9dbf" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/jira@3.8.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "jsonpickle", + "SPDXID": "SPDXRef-Package-a8fbcde15825725a", + "versionInfo": "3.3.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "8aa26467734049576679eecd7dbfb8d280cefbf9" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/jsonpickle@3.3.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "jsonschema", + "SPDXID": "SPDXRef-Package-d3e459be5427e289", + "versionInfo": "4.23.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "87daf6ccd61f60c921f33ab37374acafacd160c9" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/jsonschema@4.23.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "jsonschema-specifications", + "SPDXID": "SPDXRef-Package-96edaf228413e5b9", + "versionInfo": "2024.10.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "0119db43c7bb00310910dad18171d40425ec8530" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/jsonschema-specifications@2024.10.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "keyutils-libs", + "SPDXID": "SPDXRef-Package-f79e2ab5696c4e05", + "versionInfo": "1.6.3-r3", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "d81aac7471ba57a485ee291841741e4ec93c6c1c" + } + ], + "sourceInfo": "built package from: keyutils 1.6.3-r3", + "licenseConcluded": "GPL-2.0-or-later AND LGPL-2.0-or-later", + "licenseDeclared": "GPL-2.0-or-later AND LGPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/keyutils-libs@1.6.3-r3?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: keyutils-libs@1.6.3-r3" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "krb5-conf", + "SPDXID": "SPDXRef-Package-5b9f7dd697a7693e", + "versionInfo": "1.0-r2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "d44e740aac1816d87920418fd0599cdad5e69645" + } + ], + "sourceInfo": "built package from: krb5-conf 1.0-r2", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/krb5-conf@1.0-r2?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: krb5-conf@1.0-r2" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "krb5-libs", + "SPDXID": "SPDXRef-Package-e5dc6893e1fb4036", + "versionInfo": "1.21.3-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "7975c853b5a5367b2104ec21d844e58798a6457d" + } + ], + "sourceInfo": "built package from: krb5 1.21.3-r0", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/krb5-libs@1.21.3-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: krb5-libs@1.21.3-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libaio", + "SPDXID": "SPDXRef-Package-2eca785e55ab7597", + "versionInfo": "0.3.113-r2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "5595e4af3f8920919af5aed85ef22736f5758109" + } + ], + "sourceInfo": "built package from: libaio 0.3.113-r2", + "licenseConcluded": "LGPL-2.1-or-later", + "licenseDeclared": "LGPL-2.1-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libaio@0.3.113-r2?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libaio@0.3.113-r2" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libbz2", + "SPDXID": "SPDXRef-Package-6441ce192508577b", + "versionInfo": "1.0.8-r6", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "49c9f66fbb0475a2f35d997ac2776b445294eb94" + } + ], + "sourceInfo": "built package from: bzip2 1.0.8-r6", + "licenseConcluded": "bzip-2-1.0.6", + "licenseDeclared": "bzip-2-1.0.6", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libbz2@1.0.8-r6?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libbz2@1.0.8-r6" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libcom_err", + "SPDXID": "SPDXRef-Package-202055e74aac337d", + "versionInfo": "1.47.0-r5", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b12095c140bb68ff17a3667e9bf3ba8ba9a52d00" + } + ], + "sourceInfo": "built package from: e2fsprogs 1.47.0-r5", + "licenseConcluded": "GPL-2.0-or-later AND LGPL-2.0-or-later AND BSD-3-Clause AND MIT", + "licenseDeclared": "GPL-2.0-or-later AND LGPL-2.0-or-later AND BSD-3-Clause AND MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libcom_err@1.47.0-r5?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libcom_err@1.47.0-r5" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libcrypto3", + "SPDXID": "SPDXRef-Package-8ba87a91847ac38b", + "versionInfo": "3.3.2-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "9bf0618d6c5fa68e03e5c2bb47d179320f7576ba" + } + ], + "sourceInfo": "built package from: openssl 3.3.2-r0", + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libcrypto3@3.3.2-r0?arch=x86_64\u0026distro=3.20.3" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-9143" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libcrypto3@3.3.2-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libexpat", + "SPDXID": "SPDXRef-Package-33e78c2af35f19a3", + "versionInfo": "2.6.3-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "f4e87fb5eee576fbb4db82e0a7e7f8eb9c803a72" + } + ], + "sourceInfo": "built package from: expat 2.6.3-r0", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libexpat@2.6.3-r0?arch=x86_64\u0026distro=3.20.3" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-50602" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libexpat@2.6.3-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libffi", + "SPDXID": "SPDXRef-Package-5d8876ab1ae6a2f3", + "versionInfo": "3.4.6-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "ae414a5b90ceb897fd4a6aade27a201285ac694f" + } + ], + "sourceInfo": "built package from: libffi 3.4.6-r0", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libffi@3.4.6-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libffi@3.4.6-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libgcc", + "SPDXID": "SPDXRef-Package-aac78bdca65d9407", + "versionInfo": "13.2.1_git20240309-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "4ae3a15ec5a6642294eface46031d44fb9c24b9c" + } + ], + "sourceInfo": "built package from: gcc 13.2.1_git20240309-r0", + "licenseConcluded": "GPL-2.0-or-later AND LGPL-2.1-or-later", + "licenseDeclared": "GPL-2.0-or-later AND LGPL-2.1-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libgcc@13.2.1_git20240309-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libgcc@13.2.1_git20240309-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libintl", + "SPDXID": "SPDXRef-Package-d8e328dd8cddcec5", + "versionInfo": "0.22.5-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "e4653097ace0aed3ee1d0189be1155684458880d" + } + ], + "sourceInfo": "built package from: gettext 0.22.5-r0", + "licenseConcluded": "LGPL-2.1-or-later", + "licenseDeclared": "LGPL-2.1-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libintl@0.22.5-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libintl@0.22.5-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libncursesw", + "SPDXID": "SPDXRef-Package-90e0dfc3fd85b244", + "versionInfo": "6.4_p20240420-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "ea11d954db1aef9ade8abe50bf3870c994a39c70" + } + ], + "sourceInfo": "built package from: ncurses 6.4_p20240420-r1", + "licenseConcluded": "X-11", + "licenseDeclared": "X-11", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libncursesw@6.4_p20240420-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libncursesw@6.4_p20240420-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libnsl", + "SPDXID": "SPDXRef-Package-b06a1512f15d0add", + "versionInfo": "2.0.1-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "aef0f66e0569296178e8c7cc0e609787b2868b21" + } + ], + "sourceInfo": "built package from: libnsl 2.0.1-r0", + "licenseConcluded": "LGPL-2.0-or-later", + "licenseDeclared": "LGPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libnsl@2.0.1-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libnsl@2.0.1-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libpanelw", + "SPDXID": "SPDXRef-Package-2e89de7e8fff739b", + "versionInfo": "6.4_p20240420-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "3c7d031a4a9109326bc4d2ded999f07b47c6e902" + } + ], + "sourceInfo": "built package from: ncurses 6.4_p20240420-r1", + "licenseConcluded": "X-11", + "licenseDeclared": "X-11", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libpanelw@6.4_p20240420-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libpanelw@6.4_p20240420-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libpq", + "SPDXID": "SPDXRef-Package-54abf78950cda120", + "versionInfo": "16.3-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b07db865d3cdaf93e771aa182c0f531e3a7e8cae" + } + ], + "sourceInfo": "built package from: postgresql16 16.3-r0", + "licenseConcluded": "PostgreSQL", + "licenseDeclared": "PostgreSQL", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libpq@16.3-r0?arch=x86_64\u0026distro=3.20.3" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10979" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-7348" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10976" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10978" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10977" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libpq@16.3-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libssl3", + "SPDXID": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "versionInfo": "3.3.2-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "f81052a84c5e1028fe4db48e94c94ab1a826a898" + } + ], + "sourceInfo": "built package from: openssl 3.3.2-r0", + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libssl3@3.3.2-r0?arch=x86_64\u0026distro=3.20.3" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-9143" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libssl3@3.3.2-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libstdc++", + "SPDXID": "SPDXRef-Package-c13467432ae4565c", + "versionInfo": "13.2.1_git20240309-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "65af5d8db7ad2c5b5eb1d28851b61b77a27bdbe1" + } + ], + "sourceInfo": "built package from: gcc 13.2.1_git20240309-r0", + "licenseConcluded": "GPL-2.0-or-later AND LGPL-2.1-or-later", + "licenseDeclared": "GPL-2.0-or-later AND LGPL-2.1-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libstdc%2B%2B@13.2.1_git20240309-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libstdc++@13.2.1_git20240309-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libtirpc", + "SPDXID": "SPDXRef-Package-cbe665de81f012ee", + "versionInfo": "1.3.4-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "9b15f358157cf62f22ea655869e604f876cb4d5b" + } + ], + "sourceInfo": "built package from: libtirpc 1.3.4-r0", + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libtirpc@1.3.4-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libtirpc@1.3.4-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libtirpc-conf", + "SPDXID": "SPDXRef-Package-65f913157c6a4cc6", + "versionInfo": "1.3.4-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "febdd136f4b7a4986478a39a923bd14a557f2c1d" + } + ], + "sourceInfo": "built package from: libtirpc 1.3.4-r0", + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libtirpc-conf@1.3.4-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libtirpc-conf@1.3.4-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libuuid", + "SPDXID": "SPDXRef-Package-cef091d7b4c18bb2", + "versionInfo": "2.40.1-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "6ee4dbc2dfb385234fa5bf4e18af81e9c681b2c9" + } + ], + "sourceInfo": "built package from: util-linux 2.40.1-r1", + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libuuid@2.40.1-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libuuid@2.40.1-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "libverto", + "SPDXID": "SPDXRef-Package-75d27002146f51fe", + "versionInfo": "0.3.2-r2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "18aafc5ad98d6e2e11176770c8aa032576e8fecc" + } + ], + "sourceInfo": "built package from: libverto 0.3.2-r2", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/libverto@0.3.2-r2?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: libverto@0.3.2-r2" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "lz4-libs", + "SPDXID": "SPDXRef-Package-85ee10477d86015f", + "versionInfo": "1.9.4-r5", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "ce5b3cf60808bbaf5623b4c5bf898e3fb464d26d" + } + ], + "sourceInfo": "built package from: lz4 1.9.4-r5", + "licenseConcluded": "BSD-2-Clause AND GPL-2.0-only", + "licenseDeclared": "BSD-2-Clause AND GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/lz4-libs@1.9.4-r5?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: lz4-libs@1.9.4-r5" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "mariadb-client", + "SPDXID": "SPDXRef-Package-8aff0079751ebff8", + "versionInfo": "10.11.8-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "bb1fc9fa2677800c7aff40ff8474f266fa7a6a11" + } + ], + "sourceInfo": "built package from: mariadb 10.11.8-r0", + "licenseConcluded": "GPL-2.0-or-later", + "licenseDeclared": "GPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/mariadb-client@10.11.8-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: mariadb-client@10.11.8-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "mariadb-common", + "SPDXID": "SPDXRef-Package-e82f7c518b60a165", + "versionInfo": "10.11.8-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "e5f91c2109a96edb9758703f4153516fb5816cb0" + } + ], + "sourceInfo": "built package from: mariadb 10.11.8-r0", + "licenseConcluded": "GPL-2.0-or-later", + "licenseDeclared": "GPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/mariadb-common@10.11.8-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: mariadb-common@10.11.8-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "mariadb-connector-c", + "SPDXID": "SPDXRef-Package-f1ce882f705b6675", + "versionInfo": "3.3.10-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "1a8aae98e2c741774f6e7ec3524b63548b5950e1" + } + ], + "sourceInfo": "built package from: mariadb-connector-c 3.3.10-r0", + "licenseConcluded": "LGPL-2.1-or-later", + "licenseDeclared": "LGPL-2.1-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/mariadb-connector-c@3.3.10-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: mariadb-connector-c@3.3.10-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "mariadb-connector-c-dev", + "SPDXID": "SPDXRef-Package-ea567a131d641ab8", + "versionInfo": "3.3.10-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "11039c8897da463a474a11d74f9e8594e74976e1" + } + ], + "sourceInfo": "built package from: mariadb-connector-c 3.3.10-r0", + "licenseConcluded": "LGPL-2.1-or-later", + "licenseDeclared": "LGPL-2.1-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/mariadb-connector-c-dev@3.3.10-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: mariadb-connector-c-dev@3.3.10-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "mariadb-dev", + "SPDXID": "SPDXRef-Package-ad4f4be8a017bcc7", + "versionInfo": "10.11.8-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "a6dd8eb62c3e502a5c45b5c07e6124403f9a2856" + } + ], + "sourceInfo": "built package from: mariadb 10.11.8-r0", + "licenseConcluded": "GPL-2.0-or-later", + "licenseDeclared": "GPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/mariadb-dev@10.11.8-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: mariadb-dev@10.11.8-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "mariadb-embedded", + "SPDXID": "SPDXRef-Package-9d43cb62497b632f", + "versionInfo": "10.11.8-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "7e296c960f2f4180641627e8306f2bae251e4e45" + } + ], + "sourceInfo": "built package from: mariadb 10.11.8-r0", + "licenseConcluded": "GPL-2.0-or-later", + "licenseDeclared": "GPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/mariadb-embedded@10.11.8-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: mariadb-embedded@10.11.8-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "more-itertools", + "SPDXID": "SPDXRef-Package-6cae6092810cfe56", + "versionInfo": "10.5.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "6f00d6bb1d741b95af5fa428d97e59c3ce771eb0" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/more-itertools@10.5.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "musl", + "SPDXID": "SPDXRef-Package-ad1c94f3fcdbaebe", + "versionInfo": "1.2.5-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "3d2da235e1c31f7045e9382a48cbbfa5c7375c86" + } + ], + "sourceInfo": "built package from: musl 1.2.5-r0", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/musl@1.2.5-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: musl@1.2.5-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "musl-utils", + "SPDXID": "SPDXRef-Package-71df99a11256e7e", + "versionInfo": "1.2.5-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "e11671e426dc2d8189155906d007c39be1eb1367" + } + ], + "sourceInfo": "built package from: musl 1.2.5-r0", + "licenseConcluded": "MIT AND BSD-2-Clause AND GPL-2.0-or-later", + "licenseDeclared": "MIT AND BSD-2-Clause AND GPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/musl-utils@1.2.5-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: musl-utils@1.2.5-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "mysql-client", + "SPDXID": "SPDXRef-Package-ee17db0769796e9a", + "versionInfo": "10.11.8-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "d21067c5c510e282cd1463da7ab78f84bf02ae38" + } + ], + "sourceInfo": "built package from: mariadb 10.11.8-r0", + "licenseConcluded": "GPL-2.0-or-later", + "licenseDeclared": "GPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/mysql-client@10.11.8-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: mysql-client@10.11.8-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "ncurses-terminfo-base", + "SPDXID": "SPDXRef-Package-df3a4614f2bc6c13", + "versionInfo": "6.4_p20240420-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b94ecaed3ab420de295b36edb80b60ce311c4239" + } + ], + "sourceInfo": "built package from: ncurses 6.4_p20240420-r1", + "licenseConcluded": "X-11", + "licenseDeclared": "X-11", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/ncurses-terminfo-base@6.4_p20240420-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: ncurses-terminfo-base@6.4_p20240420-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "oauthlib", + "SPDXID": "SPDXRef-Package-90301652fe99a859", + "versionInfo": "3.2.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "47f11b9c74f586f5b86ab5a8494c4dbf53a69326" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/oauthlib@3.2.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "openpyxl", + "SPDXID": "SPDXRef-Package-dcf0cda282bb660f", + "versionInfo": "3.1.5", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "3ac432d8a6fc26ce589577e8d8a29a737420015f" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/openpyxl@3.1.5" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "openssl-dev", + "SPDXID": "SPDXRef-Package-7235edcd311c2435", + "versionInfo": "3.3.2-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b5b7e98905d5458fde53003bb7c0967e7b2ead6c" + } + ], + "sourceInfo": "built package from: openssl 3.3.2-r0", + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/openssl-dev@3.3.2-r0?arch=x86_64\u0026distro=3.20.3" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-9143" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: openssl-dev@3.3.2-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "packageurl-python", + "SPDXID": "SPDXRef-Package-5da9be38c091da3f", + "versionInfo": "0.15.6", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "61abb400c2c7c4ab76472f35ba7e59651af3f4e1" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/packageurl-python@0.15.6" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "packaging", + "SPDXID": "SPDXRef-Package-d02f52f0329d8cb1", + "versionInfo": "24.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "862ab95335d90c3a204ee18036e4ddca931d84ad" + }, + "licenseConcluded": "Apache-2.0 AND BSD-3-Clause", + "licenseDeclared": "Apache-2.0 AND BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/packaging@24.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "pcre2", + "SPDXID": "SPDXRef-Package-1a384e09f3e42e7", + "versionInfo": "10.43-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "447266b2ae4cb2b6ac25f42b07486a496dc71d25" + } + ], + "sourceInfo": "built package from: pcre2 10.43-r0", + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/pcre2@10.43-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: pcre2@10.43-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "perl", + "SPDXID": "SPDXRef-Package-782ffed2444bf003", + "versionInfo": "5.38.2-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "824d1f8debb7c4e89b19c4b9cef6df379ef90083" + } + ], + "sourceInfo": "built package from: perl 5.38.2-r0", + "licenseConcluded": "Artistic-1.0-Perl AND GPL-1.0-or-later", + "licenseDeclared": "Artistic-1.0-Perl AND GPL-1.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/perl@5.38.2-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: perl@5.38.2-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "pillow", + "SPDXID": "SPDXRef-Package-72de1860f4e7b2c", + "versionInfo": "10.4.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "83c34adf859b7f5ae3546ed5e019e6ce18fb803f" + }, + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pillow@10.4.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "pip", + "SPDXID": "SPDXRef-Package-88eae412e76dd37", + "versionInfo": "24.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "6989d1b874038fa9fd4954a3b8dee2aad86abdb6" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pip@24.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "pip", + "SPDXID": "SPDXRef-Package-eae33164acb9b713", + "versionInfo": "24.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "6989d1b874038fa9fd4954a3b8dee2aad86abdb6" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pip@24.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "pkgconf", + "SPDXID": "SPDXRef-Package-b22b6063ea1efc3d", + "versionInfo": "2.2.0-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c095f49aca7910322d44b03505acb20d3d5921d3" + } + ], + "sourceInfo": "built package from: pkgconf 2.2.0-r0", + "licenseConcluded": "ISC", + "licenseDeclared": "ISC", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/pkgconf@2.2.0-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: pkgconf@2.2.0-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "postgresql-common", + "SPDXID": "SPDXRef-Package-fab54ee965a31e6d", + "versionInfo": "1.2-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "4b39f312b78546b235a8a790a27b9952b23e19b1" + } + ], + "sourceInfo": "built package from: postgresql-common 1.2-r1", + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/postgresql-common@1.2-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: postgresql-common@1.2-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "postgresql-libs", + "SPDXID": "SPDXRef-Package-783f9e98a91d7d2c", + "versionInfo": "20241014.093848", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b40fd01d5f11ce43ebd45688eac16d1f25f4c595" + } + ], + "licenseConcluded": "NOASSERTION", + "licenseDeclared": "NOASSERTION", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/postgresql-libs@20241014.093848?arch=noarch\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: postgresql-libs@20241014.093848" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "postgresql16-client", + "SPDXID": "SPDXRef-Package-795b3ff06035191c", + "versionInfo": "16.3-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "8b70005d2f459a7bf31beb24ece00a792282e5cb" + } + ], + "sourceInfo": "built package from: postgresql16 16.3-r0", + "licenseConcluded": "PostgreSQL", + "licenseDeclared": "PostgreSQL", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/postgresql16-client@16.3-r0?arch=x86_64\u0026distro=3.20.3" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10979" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-7348" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10976" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10978" + }, + { + "referenceCategory": "SECURITY", + "referenceType": "advisory", + "referenceLocator": "https://avd.aquasec.com/nvd/cve-2024-10977" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: postgresql16-client@16.3-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "psycopg", + "SPDXID": "SPDXRef-Package-eec57f01303e9a12", + "versionInfo": "3.2.3", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "e2b0bed8d1dd859c25f380a33039a3f58a0868b4" + }, + "licenseConcluded": "LGPL-3.0-only", + "licenseDeclared": "LGPL-3.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/psycopg@3.2.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "psycopg-binary", + "SPDXID": "SPDXRef-Package-449107c5c9002905", + "versionInfo": "3.2.3", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "8d688ddb8ad1e68a0fb7de0d3d5924bc63c34766" + }, + "licenseConcluded": "LGPL-3.0-only", + "licenseDeclared": "LGPL-3.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/psycopg-binary@3.2.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "py-ocsf-models", + "SPDXID": "SPDXRef-Package-a2fbc9d02e6a3aac", + "versionInfo": "0.1.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "b3f3be0c445738137f1da04c8213591240d3a0bf" + }, + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/py-ocsf-models@0.1.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "pycparser", + "SPDXID": "SPDXRef-Package-e46ddc9ac0a2e17f", + "versionInfo": "2.22", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "bfd9c8723629345f7bee0d4b5c9e2d32528f6c4a" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pycparser@2.22" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "pydantic", + "SPDXID": "SPDXRef-Package-3a9ae8abbd56c887", + "versionInfo": "1.10.15", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "e77ca4ce3c5634b8926e29745322d8fde72ff27d" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/pydantic@1.10.15" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "readline", + "SPDXID": "SPDXRef-Package-6c0246de6df77792", + "versionInfo": "8.2.10-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "4a9a680cad09eaf9918906e628376c4ad8269731" + } + ], + "sourceInfo": "built package from: readline 8.2.10-r0", + "licenseConcluded": "GPL-3.0-or-later", + "licenseDeclared": "GPL-3.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/readline@8.2.10-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: readline@8.2.10-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "referencing", + "SPDXID": "SPDXRef-Package-88ae68ed1b4620c5", + "versionInfo": "0.35.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "8ce2d5e4c540f1c7c6ab81416a626c37b4b8a18d" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/referencing@0.35.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "requests", + "SPDXID": "SPDXRef-Package-6b2066a9bc9648a3", + "versionInfo": "2.32.3", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "c5ec04f756a79a4891f7f3ba6c09258fccd4a6f8" + }, + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/requests@2.32.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "requests-oauthlib", + "SPDXID": "SPDXRef-Package-f08462095b021ae6", + "versionInfo": "2.0.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "36755051c0c54ff5b54c2e4f5d7efd92e5428063" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/requests-oauthlib@2.0.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "requests-toolbelt", + "SPDXID": "SPDXRef-Package-33e6898807ae84e8", + "versionInfo": "1.0.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "115ed70cb10476b04c8caa98395a4c38eec6f044" + }, + "licenseConcluded": "Apache-2.0", + "licenseDeclared": "Apache-2.0", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/requests-toolbelt@1.0.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "rpds-py", + "SPDXID": "SPDXRef-Package-27e758a43ea1601d", + "versionInfo": "0.20.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "191a95e0d5f9cbf61b0f9501b74878e9d93e7f6e" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/rpds-py@0.20.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "scanelf", + "SPDXID": "SPDXRef-Package-d6a8d3e767a17aaa", + "versionInfo": "1.3.7-r2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c84b0b49111485cb08744822f9b34a9fa9524fcc" + } + ], + "sourceInfo": "built package from: pax-utils 1.3.7-r2", + "licenseConcluded": "GPL-2.0-only", + "licenseDeclared": "GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/scanelf@1.3.7-r2?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: scanelf@1.3.7-r2" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "sqlite-libs", + "SPDXID": "SPDXRef-Package-60b97a150fc06781", + "versionInfo": "3.45.3-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "e5269e6c127fc30c9258d0e3d7d8f0e673d91d22" + } + ], + "sourceInfo": "built package from: sqlite 3.45.3-r1", + "licenseConcluded": "blessing", + "licenseDeclared": "blessing", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/sqlite-libs@3.45.3-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: sqlite-libs@3.45.3-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "sqlparse", + "SPDXID": "SPDXRef-Package-8325a8e610f670a8", + "versionInfo": "0.5.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "f122058f631e48d5b545d683f4f9c65a12b4529f" + }, + "licenseConcluded": "BSD-3-Clause", + "licenseDeclared": "BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/sqlparse@0.5.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "ssl_client", + "SPDXID": "SPDXRef-Package-a5e10acca2d388c4", + "versionInfo": "1.36.1-r29", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "7e2867092a0edee7436f70e4430b6b7dde363094" + } + ], + "sourceInfo": "built package from: busybox 1.36.1-r29", + "licenseConcluded": "GPL-2.0-only", + "licenseDeclared": "GPL-2.0-only", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/ssl_client@1.36.1-r29?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: ssl_client@1.36.1-r29" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "typeguard", + "SPDXID": "SPDXRef-Package-ab3af1d96d8e443f", + "versionInfo": "4.3.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "fa5da4cbc08c25d4f52083f30a3a2aa709758f5f" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/typeguard@4.3.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "typing_extensions", + "SPDXID": "SPDXRef-Package-1a3d83747c2bebfa", + "versionInfo": "4.12.2", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "70adbbc6fe02a1ad8d36c4eb2a077497e1a796b4" + }, + "licenseConcluded": "Python-Software-Foundation-License", + "licenseDeclared": "Python-Software-Foundation-License", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/typing-extensions@4.12.2" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "tzdata", + "SPDXID": "SPDXRef-Package-db2933a2756ffeac", + "versionInfo": "2024b-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "78fa61c4d1307cb88216bd8a6a45236f1d2ed6eb" + } + ], + "sourceInfo": "built package from: tzdata 2024b-r0", + "licenseConcluded": "Public-Domain", + "licenseDeclared": "Public-Domain", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/tzdata@2024b-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:0263bd6854c03606a3b401cd768cbfd65f7369da739be97c7b3eadacefb6e920" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:89daaeb4e2cbd47a43a83b4468c6a7d3848f67718bb25a73acd4ab6faf4968f7" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: tzdata@2024b-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "uritemplate", + "SPDXID": "SPDXRef-Package-6a8d8909e1c02af9", + "versionInfo": "4.1.1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "e83ab78935e765f61e68489916447d6811618660" + }, + "licenseConcluded": "Apache-2.0 AND BSD-3-Clause", + "licenseDeclared": "Apache-2.0 AND BSD-3-Clause", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/uritemplate@4.1.1" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "urllib3", + "SPDXID": "SPDXRef-Package-29d399515fd9a018", + "versionInfo": "2.2.3", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "bb51c31b985a80bf126b31ed250b4bc3eeb54cfd" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/urllib3@2.2.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "validators", + "SPDXID": "SPDXRef-Package-5d88159d019d05e4", + "versionInfo": "0.34.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "4512d7b265da7ad71b2cb036e424c073804bcb5f" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/validators@0.34.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "whitenoise", + "SPDXID": "SPDXRef-Package-4922858596408ff0", + "versionInfo": "6.7.0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": true, + "packageVerificationCode": { + "packageVerificationCodeValue": "4eacf4946b8d623b0d29851cc4e5786c5882def6" + }, + "licenseConcluded": "MIT", + "licenseDeclared": "MIT", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:pypi/whitenoise@6.7.0" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:5343799b44da662ebff9e824851a71654d9cc4c224374e529098ee8a9f4a3cde" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:2c2681bb5f75d4788c31be323fa6b2dd31c0399d7fbbf1d98e5078370b79ed22" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: python-pkg" + } + ] + }, + { + "name": "xz-libs", + "SPDXID": "SPDXRef-Package-9ac26f2d156d5fec", + "versionInfo": "5.6.2-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "d59b22ae174c5a75d84c1c558e25de93d9c792b0" + } + ], + "sourceInfo": "built package from: xz 5.6.2-r0", + "licenseConcluded": "GPL-2.0-or-later AND 0BSD AND Public-Domain AND LGPL-2.1-or-later", + "licenseDeclared": "GPL-2.0-or-later AND 0BSD AND Public-Domain AND LGPL-2.1-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/xz-libs@5.6.2-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:ae31132e71b1101ac764360e85042513435c46a929ced88207642933d208ad0f" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:e4d124d6aa6342535447eb84dc6456fd3cfe0446a533a5fd472d7803338f39bc" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: xz-libs@5.6.2-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "zlib", + "SPDXID": "SPDXRef-Package-c299361fb42f7d42", + "versionInfo": "1.3.1-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "9ba6f253e2982e0e6e71cb4187e3d6b6c4bbae99" + } + ], + "sourceInfo": "built package from: zlib 1.3.1-r1", + "licenseConcluded": "Zlib", + "licenseDeclared": "Zlib", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/zlib@1.3.1-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:43c4264eed91be63b206e17d93e75256a6097070ce643c5e8f0379998b44f170" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: zlib@1.3.1-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "zlib-dev", + "SPDXID": "SPDXRef-Package-56f9336c57858b69", + "versionInfo": "1.3.1-r1", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "4a1e212702518bfc7e76a1d65a43ea9f6914f83d" + } + ], + "sourceInfo": "built package from: zlib 1.3.1-r1", + "licenseConcluded": "Zlib", + "licenseDeclared": "Zlib", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/zlib-dev@1.3.1-r1?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: zlib-dev@1.3.1-r1" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "zstd-libs", + "SPDXID": "SPDXRef-Package-e85d94ef76ba81c0", + "versionInfo": "1.5.6-r0", + "supplier": "NOASSERTION", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "4d60614645192deddc80e6e568fe535b38c315c1" + } + ], + "sourceInfo": "built package from: zstd 1.5.6-r0", + "licenseConcluded": "BSD-3-Clause AND GPL-2.0-or-later", + "licenseDeclared": "BSD-3-Clause AND GPL-2.0-or-later", + "externalRefs": [ + { + "referenceCategory": "PACKAGE-MANAGER", + "referenceType": "purl", + "referenceLocator": "pkg:apk/alpine/zstd-libs@1.5.6-r0?arch=x86_64\u0026distro=3.20.3" + } + ], + "primaryPackagePurpose": "LIBRARY", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDiffID: sha256:a587a5de664a84268836746ff3ace1b90ce1b269d32edfbfd186cbe9d23e7fc4" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "LayerDigest: sha256:387b0114c5d434c55c4252c541e0607a4a0da568800f3b271002e4d49108d915" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgID: zstd-libs@1.5.6-r0" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "PkgType: alpine" + } + ] + }, + { + "name": "alpine", + "SPDXID": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "versionInfo": "3.20.3", + "downloadLocation": "NONE", + "filesAnalyzed": false, + "primaryPackagePurpose": "OPERATING-SYSTEM", + "annotations": [ + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Class: os-pkgs" + }, + { + "annotator": "Tool: trivy-0.58.0", + "annotationDate": "2024-12-21T15:02:40Z", + "annotationType": "OTHER", + "comment": "Type: alpine" + } + ] + } + ], + "files": [ + { + "fileName": ".venv/lib/python3.12/site-packages/Django-5.1.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-98ba8870c5b9dae9", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "2e1d66ca1083431d50e574f9acbd1f2e1e1aa314" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/PyJWT-2.9.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-a56c9bc824dba5a9", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "e0c7615c40e2db2aa26d42a9cedcb8ba8b7376a5" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/PyMySQL-1.1.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-bd7badec10c087f8", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "06f90587412a90e46be4ff2e3fb4500e2fdf8d0e" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-632946f88adc95b8", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "019874e22eba3861f59a9ab72f17f58e8b504cf4" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/argon2_cffi-23.1.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-7d335467896ace84", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "db406769842859ed62b0c5f8491b5752a79f236a" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/argon2_cffi_bindings-21.2.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-815b2015a33cafce", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "163c58252ce76de6d3e24ed3b8898e0ade5796e6" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/asgiref-3.8.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-f24f33d20031d9bb", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "a5a6b2c7a76079e17099733c05cc97761bcfe8ac" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/attrs-24.2.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-ef603726c2a5823e", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "f575becf993ecdf9c6e43190c1cb74d3556cf912" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/certifi-2024.8.30.dist-info/METADATA", + "SPDXID": "SPDXRef-File-acb241158b27d69f", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "9327ad0bda86c1be61644acf536b271fd19b0929" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/cffi-1.17.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-c97cb611252a0984", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "5b6ef1ad8e0c13e33cf651a02168fb8fba2aeee3" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/charset_normalizer-3.4.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-2eea1b9fb9ece433", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c10e6e210a50bd5e932c0c69ccc7959264bf2325" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/cryptography-43.0.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-bca8e85bb00a22aa", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b6c806e2aff9a0f560916a90f793348dbf0514ba" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/cvss-3.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-2dd9eaad42ca6222", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "6297322b17cd240f6b9758d7beb6e48e0f675006" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/defusedcsv-2.0.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-7e59e499ba5ce6dc", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c818549ed3ee143f2172f1fa7434b40d8e53764f" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/defusedxml-0.7.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-1d1881a157053be1", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "bbe8ef8118fece856076610151e3ab2244d2abbf" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/django_cors_headers-4.5.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-d0fda51dc4377be3", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "ef92ffcb8f7efa85dad16b2282521c2ece96e709" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/django_csp-3.8.dist-info/METADATA", + "SPDXID": "SPDXRef-File-f5cf095525eafd61", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "2d8363413526f144f1e311784fe0f516a9af7b61" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/django_encrypted_model_fields-0.6.5.dist-info/METADATA", + "SPDXID": "SPDXRef-File-9c0b5241c71da99b", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "793d4522ffeb7b4e876f1e3e04985621e5539506" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/django_environ-0.11.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-77f076707fd219c1", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "f06126b9805116e684604056b3ee906621a3fccb" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/django_filter-24.3.dist-info/METADATA", + "SPDXID": "SPDXRef-File-43e1e0db3a0ef201", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c2c01cbfdce2d816692a6e4126a14e05e25a5e22" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/django_picklefield-3.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-bcde8239ab85bf37", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "5be7510d7286830e86592865367b091358b237bf" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/djangorestframework-3.15.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-3da0864c23a8c7b4", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c9e4b4d34b1e7344e2d8f7484244fe04103c81fc" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/dnspython-2.7.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-241d7ff76cc5ba82", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "899cdc40c48a4c28278bd661c15c41062fcba8b0" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/drf_spectacular-0.27.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-a361a2d389103d73", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "1d7f2cf3f648abd66f1e4875ccdbb89c1ed06d9a" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/drf_spectacular_sidecar-2024.7.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-aa80771872cd39d4", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b59167ac73e3452acf9564a99b4b790c6711c396" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/email_validator-2.1.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-f54ca99a59407967", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "5c50d551cb86f4ae57e0644e850ddb880c473a3c" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/et_xmlfile-1.1.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-4cc4d05054b559f9", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "6536dbda566f62a75d2acc105cf6eff829b6d949" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/gunicorn-23.0.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-8579e852ce1d06c0", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "8de2f53497d5444853a1df1f44ff417831194283" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/huey-2.5.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-18fcdf1cfabd0ee", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "3646cbc2a5baa855c35e793c9b40926535dbd504" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/idna-3.10.dist-info/METADATA", + "SPDXID": "SPDXRef-File-4fdec3486848d23a", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "c2b49b407d6a6a30fd069ab3f1ba78107825ef46" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/inflect-7.4.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-cb45c0548508fe0a", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "1a8ba2ac1503a03fde49b58ca537972b5cfb43f7" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/inflection-0.5.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-6d2a9d954cea9177", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "06eb89d01518857a8219eb24d65d78e4d741531b" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/jira-3.8.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-599bdeca5fcadb1", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "965a3279c308f2655503eec35d76e11edbe77cba" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/jsonpickle-3.3.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-c9f9bf92858e5f64", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b52b7c19b562acf439919930b14a17076f3b3f25" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/jsonschema-4.23.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-fad1a07777eb8f76", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "3cdaa4ebfac73cceb6723f26469673e19decef2b" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/jsonschema_specifications-2024.10.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-7e763212b42442fa", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "47566d40198df6b2a5f27e6de722bf8cb69fc783" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/more_itertools-10.5.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-c8dad880fbe1a36d", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "173ffcf48fc5cc7792fefb57c7bf5d5247c46e80" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/oauthlib-3.2.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-de664d037f94a5af", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "7e11037232d567a63a089b23f6f6f1f862a7a9c2" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/openpyxl-3.1.5.dist-info/METADATA", + "SPDXID": "SPDXRef-File-8ec297f4d58c06fa", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "8c199a085c3f316b15fb8ac53ed7963cd1300df0" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/packageurl_python-0.15.6.dist-info/METADATA", + "SPDXID": "SPDXRef-File-4e8d019df43286a6", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "05c1aa424e987d9ffd15954eef4638e3d1952f82" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/packaging-24.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-666e78602a0accf8", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "f99865b8d3b90ad64a0060f7f2f4c6e4faeb0a39" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/pillow-10.4.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-974e4a71da6db224", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "153302f3da5f52f4000d39b1e2320900cdfceaac" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/pip-24.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-63628559458ada0b", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "7ef1f6226c2acedce857ed89cec1548dc9bacd9c" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/psycopg-3.2.3.dist-info/METADATA", + "SPDXID": "SPDXRef-File-65e39c6b6747b6f9", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b80164ebd54ab163e5a794a366e10216e4d15f1b" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/psycopg_binary-3.2.3.dist-info/METADATA", + "SPDXID": "SPDXRef-File-6a384d198e98d5db", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "eda29cb320c36733eab411e33addf0f87abf37ce" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/py_ocsf_models-0.1.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-168c1c47440474a", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "8f63fc7e715e37cbb046e31a25d779a75163adbf" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/pycparser-2.22.dist-info/METADATA", + "SPDXID": "SPDXRef-File-f9c7b8227bf2c953", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "7ade716b0f2978fe6a0565736c6898403351eb00" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/pydantic-1.10.15.dist-info/METADATA", + "SPDXID": "SPDXRef-File-74bc1b4b85ee6f84", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "6ff8c7a44b3a56839f13fb10bb741759c03bf9d4" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/referencing-0.35.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-7db83f64c21ca9f3", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "2e6f7d13e696ea8c3a3a865e9e4111a01711a81b" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/requests-2.32.3.dist-info/METADATA", + "SPDXID": "SPDXRef-File-192a1c4efcaa29ce", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "2932497ffb7a7e281a919fc9b881c459e56653e0" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/requests_oauthlib-2.0.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-5079426543088a33", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "596968098349bfb7fe411e47b6c1ef4f3c89669e" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/requests_toolbelt-1.0.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-8f01e2f671229a63", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "171fbbc84e8b7216e237b702f3fda539ffb1e487" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/rpds_py-0.20.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-dd96e0d0a87f6bb1", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "fc83249f08370c42f1ffd682a76c5b6802f76401" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/sqlparse-0.5.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-dacb28c86430a1f7", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b33d1c3326f6e61759334ac83c50c8b23b22e887" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/typeguard-4.3.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-901c6e988e0fc9d4", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "9a94672ccfea06156a5f8a321cd0626cfd233ae8" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-1e75365dcae217ed", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "b6ada54b9516d20b69a5dd5cded868da22c5e252" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/uritemplate-4.1.1.dist-info/METADATA", + "SPDXID": "SPDXRef-File-c1ac318a08cb59c", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "e75ce58fc78b37cb3d5a77fd0b677d882c236881" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/urllib3-2.2.3.dist-info/METADATA", + "SPDXID": "SPDXRef-File-dfe4256ae9408ce0", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "150524ee8bba4b41d2e36d789748ec8ec0e65315" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/validators-0.34.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-39b4f5af12534c40", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "3729663217aa684537f6e9bcdd6bc00e291425df" + } + ], + "copyrightText": "" + }, + { + "fileName": ".venv/lib/python3.12/site-packages/whitenoise-6.7.0.dist-info/METADATA", + "SPDXID": "SPDXRef-File-dc3eb069e863a69e", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "014de6ecec66527b2123a7523478daf495daec85" + } + ], + "copyrightText": "" + }, + { + "fileName": "usr/local/lib/python3.12/site-packages/pip-24.2.dist-info/METADATA", + "SPDXID": "SPDXRef-File-61db4d7dfab802a2", + "checksums": [ + { + "algorithm": "SHA1", + "checksumValue": "7ef1f6226c2acedce857ed89cec1548dc9bacd9c" + } + ], + "copyrightText": "" + } + ], + "relationships": [ + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-10c43c2162ce278d", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-11d5ece7c5a85d42", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-18397ed76ba696db", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-1a3d83747c2bebfa", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-1b2850e1ae4916b3", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-1b4d8624e75a7cfb", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-1e1e038dfc221849", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-243020cad11835ba", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-27e758a43ea1601d", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-29d399515fd9a018", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-32a24e87731e8843", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-33e6898807ae84e8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-3a9ae8abbd56c887", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-449107c5c9002905", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-4922858596408ff0", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-4f89458f153860d7", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-51db5a654b97def", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-5d88159d019d05e4", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-5da9be38c091da3f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-5f93e44943eef1f0", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-627510e078d55320", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-6431baa4f8e5a1d4", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-667ec4d30f9448ca", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-6a8d8909e1c02af9", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-6b2066a9bc9648a3", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-6cae6092810cfe56", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-72de1860f4e7b2c", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-7d31d637877ba8c5", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-8325a8e610f670a8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-8877fbd11a82d92d", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-88ae68ed1b4620c5", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-88eae412e76dd37", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-8db3140332c0f1a6", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-90301652fe99a859", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-9115bdc8e113b7a5", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-96edaf228413e5b9", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-9743538d37c18eef", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-9c2b5532e4fb5826", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-a2fbc9d02e6a3aac", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-a70e071e90a16411", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-a79b1e07db11fda2", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-a8fbcde15825725a", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-ab3af1d96d8e443f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-b2f8d2f815610bdd", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-b8b8a1b191badaf4", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-bbdabb1822373e2", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-c4cfbee8d6b2f705", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-c95edc7a5d8ac61e", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-d02f52f0329d8cb1", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-d254ad6cee138a57", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-d3e459be5427e289", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-dcf0cda282bb660f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-dda338af0e931265", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-e3057fc25773852a", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-e46ddc9ac0a2e17f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-eae33164acb9b713", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-ee74d307f362426e", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-eec57f01303e9a12", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-f08462095b021ae6", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-f08cfb949b96c3fd", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relatedSpdxElement": "SPDXRef-Package-f479683cd5b127eb", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-DOCUMENT", + "relatedSpdxElement": "SPDXRef-ContainerImage-82bc9d1b632a36cd", + "relationshipType": "DESCRIBES" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-199bc8f7d9a3957e", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-1a384e09f3e42e7", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-1eaddff436e6f866", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-202055e74aac337d", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-2922cedc355f9a33", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-2a7813b7f32a841b", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-2e89de7e8fff739b", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-2eca785e55ab7597", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-33e78c2af35f19a3", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-401da59cbccc29c1", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-4ffb25b2152f4a8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-54abf78950cda120", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-56f9336c57858b69", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-5b9f7dd697a7693e", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-5d8876ab1ae6a2f3", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-5f65899468be8688", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-60b97a150fc06781", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-6441ce192508577b", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-65f913157c6a4cc6", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-6c0246de6df77792", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-71df99a11256e7e", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-7235edcd311c2435", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-75d27002146f51fe", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-782ffed2444bf003", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-783f9e98a91d7d2c", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-795b3ff06035191c", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-82ad85e2f96c7331", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-85ee10477d86015f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-8aff0079751ebff8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-90e0dfc3fd85b244", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-9ac26f2d156d5fec", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-9d43cb62497b632f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-a5e10acca2d388c4", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-a6430cd34bca5d7f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-aac78bdca65d9407", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-ad4f4be8a017bcc7", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-b06a1512f15d0add", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-b22b6063ea1efc3d", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-c13467432ae4565c", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-cbe665de81f012ee", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-cef091d7b4c18bb2", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-d6a8d3e767a17aaa", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-d8e328dd8cddcec5", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-db2933a2756ffeac", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-df3a4614f2bc6c13", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-e1062025609701e1", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-e47460d6783f8e2f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-e54fde353d493978", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-e5dc6893e1fb4036", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-e82f7c518b60a165", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-e85d94ef76ba81c0", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-ea567a131d641ab8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-ee17db0769796e9a", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-ef1ec84ae53752bd", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-f1ce882f705b6675", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-f79e2ab5696c4e05", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-OperatingSystem-2730d046e27e86e6", + "relatedSpdxElement": "SPDXRef-Package-fab54ee965a31e6d", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-10c43c2162ce278d", + "relatedSpdxElement": "SPDXRef-File-a56c9bc824dba5a9", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-11d5ece7c5a85d42", + "relatedSpdxElement": "SPDXRef-File-8579e852ce1d06c0", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-18397ed76ba696db", + "relatedSpdxElement": "SPDXRef-File-3da0864c23a8c7b4", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-199bc8f7d9a3957e", + "relatedSpdxElement": "SPDXRef-Package-b22b6063ea1efc3d", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-199bc8f7d9a3957e", + "relatedSpdxElement": "SPDXRef-Package-e47460d6783f8e2f", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-1a384e09f3e42e7", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-1a3d83747c2bebfa", + "relatedSpdxElement": "SPDXRef-File-1e75365dcae217ed", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-1b2850e1ae4916b3", + "relatedSpdxElement": "SPDXRef-File-bd7badec10c087f8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-1b4d8624e75a7cfb", + "relatedSpdxElement": "SPDXRef-File-bca8e85bb00a22aa", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-1e1e038dfc221849", + "relatedSpdxElement": "SPDXRef-File-18fcdf1cfabd0ee", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-202055e74aac337d", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-243020cad11835ba", + "relatedSpdxElement": "SPDXRef-File-a361a2d389103d73", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-27e758a43ea1601d", + "relatedSpdxElement": "SPDXRef-File-dd96e0d0a87f6bb1", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-29d399515fd9a018", + "relatedSpdxElement": "SPDXRef-File-dfe4256ae9408ce0", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-2a7813b7f32a841b", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-2a7813b7f32a841b", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-2a7813b7f32a841b", + "relatedSpdxElement": "SPDXRef-Package-e1062025609701e1", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-2e89de7e8fff739b", + "relatedSpdxElement": "SPDXRef-Package-90e0dfc3fd85b244", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-2e89de7e8fff739b", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-2e89de7e8fff739b", + "relatedSpdxElement": "SPDXRef-Package-df3a4614f2bc6c13", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-2eca785e55ab7597", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-32a24e87731e8843", + "relatedSpdxElement": "SPDXRef-File-2eea1b9fb9ece433", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-33e6898807ae84e8", + "relatedSpdxElement": "SPDXRef-File-8f01e2f671229a63", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-33e78c2af35f19a3", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-3a9ae8abbd56c887", + "relatedSpdxElement": "SPDXRef-File-74bc1b4b85ee6f84", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-449107c5c9002905", + "relatedSpdxElement": "SPDXRef-File-6a384d198e98d5db", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-4922858596408ff0", + "relatedSpdxElement": "SPDXRef-File-dc3eb069e863a69e", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-4f89458f153860d7", + "relatedSpdxElement": "SPDXRef-File-6d2a9d954cea9177", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-4ffb25b2152f4a8", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-51db5a654b97def", + "relatedSpdxElement": "SPDXRef-File-4cc4d05054b559f9", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-54abf78950cda120", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-54abf78950cda120", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-54abf78950cda120", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-56f9336c57858b69", + "relatedSpdxElement": "SPDXRef-Package-b22b6063ea1efc3d", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-56f9336c57858b69", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-5d88159d019d05e4", + "relatedSpdxElement": "SPDXRef-File-39b4f5af12534c40", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-5d8876ab1ae6a2f3", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-5da9be38c091da3f", + "relatedSpdxElement": "SPDXRef-File-4e8d019df43286a6", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-5f65899468be8688", + "relatedSpdxElement": "SPDXRef-Package-2922cedc355f9a33", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-5f65899468be8688", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-5f65899468be8688", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-5f65899468be8688", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-5f65899468be8688", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-5f93e44943eef1f0", + "relatedSpdxElement": "SPDXRef-File-cb45c0548508fe0a", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-60b97a150fc06781", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-627510e078d55320", + "relatedSpdxElement": "SPDXRef-File-ef603726c2a5823e", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-6431baa4f8e5a1d4", + "relatedSpdxElement": "SPDXRef-File-4fdec3486848d23a", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-6441ce192508577b", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-667ec4d30f9448ca", + "relatedSpdxElement": "SPDXRef-File-77f076707fd219c1", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-6a8d8909e1c02af9", + "relatedSpdxElement": "SPDXRef-File-c1ac318a08cb59c", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-6b2066a9bc9648a3", + "relatedSpdxElement": "SPDXRef-File-192a1c4efcaa29ce", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-6c0246de6df77792", + "relatedSpdxElement": "SPDXRef-Package-90e0dfc3fd85b244", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-6c0246de6df77792", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-6cae6092810cfe56", + "relatedSpdxElement": "SPDXRef-File-c8dad880fbe1a36d", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-71df99a11256e7e", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-71df99a11256e7e", + "relatedSpdxElement": "SPDXRef-Package-d6a8d3e767a17aaa", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-7235edcd311c2435", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-7235edcd311c2435", + "relatedSpdxElement": "SPDXRef-Package-b22b6063ea1efc3d", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-7235edcd311c2435", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-72de1860f4e7b2c", + "relatedSpdxElement": "SPDXRef-File-974e4a71da6db224", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-75d27002146f51fe", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-782ffed2444bf003", + "relatedSpdxElement": "SPDXRef-Package-6441ce192508577b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-782ffed2444bf003", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-782ffed2444bf003", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-783f9e98a91d7d2c", + "relatedSpdxElement": "SPDXRef-Package-795b3ff06035191c", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-783f9e98a91d7d2c", + "relatedSpdxElement": "SPDXRef-Package-a6430cd34bca5d7f", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-783f9e98a91d7d2c", + "relatedSpdxElement": "SPDXRef-Package-ad4f4be8a017bcc7", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-783f9e98a91d7d2c", + "relatedSpdxElement": "SPDXRef-Package-ee17db0769796e9a", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-54abf78950cda120", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-6c0246de6df77792", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-85ee10477d86015f", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-e85d94ef76ba81c0", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-795b3ff06035191c", + "relatedSpdxElement": "SPDXRef-Package-fab54ee965a31e6d", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-7d31d637877ba8c5", + "relatedSpdxElement": "SPDXRef-File-c97cb611252a0984", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-2e89de7e8fff739b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-33e78c2af35f19a3", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-5d8876ab1ae6a2f3", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-60b97a150fc06781", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-6441ce192508577b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-6c0246de6df77792", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-90e0dfc3fd85b244", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-9ac26f2d156d5fec", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-b06a1512f15d0add", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-cbe665de81f012ee", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-cef091d7b4c18bb2", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-82ad85e2f96c7331", + "relatedSpdxElement": "SPDXRef-Package-ef1ec84ae53752bd", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8325a8e610f670a8", + "relatedSpdxElement": "SPDXRef-File-dacb28c86430a1f7", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-85ee10477d86015f", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8877fbd11a82d92d", + "relatedSpdxElement": "SPDXRef-File-1d1881a157053be1", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-88ae68ed1b4620c5", + "relatedSpdxElement": "SPDXRef-File-7db83f64c21ca9f3", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-88eae412e76dd37", + "relatedSpdxElement": "SPDXRef-File-63628559458ada0b", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-782ffed2444bf003", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-90e0dfc3fd85b244", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-aac78bdca65d9407", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-c13467432ae4565c", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-e82f7c518b60a165", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8aff0079751ebff8", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8ba87a91847ac38b", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-8db3140332c0f1a6", + "relatedSpdxElement": "SPDXRef-File-599bdeca5fcadb1", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-90301652fe99a859", + "relatedSpdxElement": "SPDXRef-File-de664d037f94a5af", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-90e0dfc3fd85b244", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-90e0dfc3fd85b244", + "relatedSpdxElement": "SPDXRef-Package-df3a4614f2bc6c13", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9115bdc8e113b7a5", + "relatedSpdxElement": "SPDXRef-File-7d335467896ace84", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-96edaf228413e5b9", + "relatedSpdxElement": "SPDXRef-File-7e763212b42442fa", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-9743538d37c18eef", + "relatedSpdxElement": "SPDXRef-File-f54ca99a59407967", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-9ac26f2d156d5fec", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9c2b5532e4fb5826", + "relatedSpdxElement": "SPDXRef-File-f24f33d20031d9bb", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-1a384e09f3e42e7", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-2eca785e55ab7597", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-aac78bdca65d9407", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-c13467432ae4565c", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-e82f7c518b60a165", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-9d43cb62497b632f", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-a2fbc9d02e6a3aac", + "relatedSpdxElement": "SPDXRef-File-168c1c47440474a", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-a5e10acca2d388c4", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-a5e10acca2d388c4", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-a5e10acca2d388c4", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-a6430cd34bca5d7f", + "relatedSpdxElement": "SPDXRef-Package-6c0246de6df77792", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-a6430cd34bca5d7f", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-a6430cd34bca5d7f", + "relatedSpdxElement": "SPDXRef-Package-e1062025609701e1", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-a70e071e90a16411", + "relatedSpdxElement": "SPDXRef-File-9c0b5241c71da99b", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-a79b1e07db11fda2", + "relatedSpdxElement": "SPDXRef-File-f5cf095525eafd61", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-a8fbcde15825725a", + "relatedSpdxElement": "SPDXRef-File-c9f9bf92858e5f64", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-aac78bdca65d9407", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ab3af1d96d8e443f", + "relatedSpdxElement": "SPDXRef-File-901c6e988e0fc9d4", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-ad4f4be8a017bcc7", + "relatedSpdxElement": "SPDXRef-Package-199bc8f7d9a3957e", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ad4f4be8a017bcc7", + "relatedSpdxElement": "SPDXRef-Package-56f9336c57858b69", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ad4f4be8a017bcc7", + "relatedSpdxElement": "SPDXRef-Package-7235edcd311c2435", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ad4f4be8a017bcc7", + "relatedSpdxElement": "SPDXRef-Package-9d43cb62497b632f", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ad4f4be8a017bcc7", + "relatedSpdxElement": "SPDXRef-Package-b22b6063ea1efc3d", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ad4f4be8a017bcc7", + "relatedSpdxElement": "SPDXRef-Package-ea567a131d641ab8", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-b06a1512f15d0add", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-b06a1512f15d0add", + "relatedSpdxElement": "SPDXRef-Package-cbe665de81f012ee", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-b06a1512f15d0add", + "relatedSpdxElement": "SPDXRef-Package-d8e328dd8cddcec5", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-b22b6063ea1efc3d", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-b2f8d2f815610bdd", + "relatedSpdxElement": "SPDXRef-File-241d7ff76cc5ba82", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-b8b8a1b191badaf4", + "relatedSpdxElement": "SPDXRef-File-acb241158b27d69f", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-bbdabb1822373e2", + "relatedSpdxElement": "SPDXRef-File-aa80771872cd39d4", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-c13467432ae4565c", + "relatedSpdxElement": "SPDXRef-Package-aac78bdca65d9407", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-c13467432ae4565c", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-c299361fb42f7d42", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-c4cfbee8d6b2f705", + "relatedSpdxElement": "SPDXRef-File-7e59e499ba5ce6dc", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-c95edc7a5d8ac61e", + "relatedSpdxElement": "SPDXRef-File-632946f88adc95b8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-cbe665de81f012ee", + "relatedSpdxElement": "SPDXRef-Package-65f913157c6a4cc6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-cbe665de81f012ee", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-cbe665de81f012ee", + "relatedSpdxElement": "SPDXRef-Package-e5dc6893e1fb4036", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-cef091d7b4c18bb2", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-d02f52f0329d8cb1", + "relatedSpdxElement": "SPDXRef-File-666e78602a0accf8", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-d254ad6cee138a57", + "relatedSpdxElement": "SPDXRef-File-98ba8870c5b9dae9", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-d3e459be5427e289", + "relatedSpdxElement": "SPDXRef-File-fad1a07777eb8f76", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-d6a8d3e767a17aaa", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-d8e328dd8cddcec5", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-dcf0cda282bb660f", + "relatedSpdxElement": "SPDXRef-File-8ec297f4d58c06fa", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-dda338af0e931265", + "relatedSpdxElement": "SPDXRef-File-43e1e0db3a0ef201", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-e1062025609701e1", + "relatedSpdxElement": "SPDXRef-Package-4ffb25b2152f4a8", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e3057fc25773852a", + "relatedSpdxElement": "SPDXRef-File-815b2015a33cafce", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-e46ddc9ac0a2e17f", + "relatedSpdxElement": "SPDXRef-File-f9c7b8227bf2c953", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-e47460d6783f8e2f", + "relatedSpdxElement": "SPDXRef-Package-aac78bdca65d9407", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e47460d6783f8e2f", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e47460d6783f8e2f", + "relatedSpdxElement": "SPDXRef-Package-c13467432ae4565c", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e54fde353d493978", + "relatedSpdxElement": "SPDXRef-Package-1eaddff436e6f866", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e54fde353d493978", + "relatedSpdxElement": "SPDXRef-Package-e1062025609701e1", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e5dc6893e1fb4036", + "relatedSpdxElement": "SPDXRef-Package-202055e74aac337d", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e5dc6893e1fb4036", + "relatedSpdxElement": "SPDXRef-Package-5b9f7dd697a7693e", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e5dc6893e1fb4036", + "relatedSpdxElement": "SPDXRef-Package-75d27002146f51fe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e5dc6893e1fb4036", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e5dc6893e1fb4036", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e5dc6893e1fb4036", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e5dc6893e1fb4036", + "relatedSpdxElement": "SPDXRef-Package-f79e2ab5696c4e05", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e82f7c518b60a165", + "relatedSpdxElement": "SPDXRef-Package-e1062025609701e1", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e85d94ef76ba81c0", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ea567a131d641ab8", + "relatedSpdxElement": "SPDXRef-Package-56f9336c57858b69", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ea567a131d641ab8", + "relatedSpdxElement": "SPDXRef-Package-7235edcd311c2435", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ea567a131d641ab8", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ea567a131d641ab8", + "relatedSpdxElement": "SPDXRef-Package-b22b6063ea1efc3d", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ea567a131d641ab8", + "relatedSpdxElement": "SPDXRef-Package-f1ce882f705b6675", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-eae33164acb9b713", + "relatedSpdxElement": "SPDXRef-File-61db4d7dfab802a2", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-ee17db0769796e9a", + "relatedSpdxElement": "SPDXRef-Package-8aff0079751ebff8", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-ee74d307f362426e", + "relatedSpdxElement": "SPDXRef-File-2dd9eaad42ca6222", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-eec57f01303e9a12", + "relatedSpdxElement": "SPDXRef-File-65e39c6b6747b6f9", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-ef1ec84ae53752bd", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-f08462095b021ae6", + "relatedSpdxElement": "SPDXRef-File-5079426543088a33", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-f08cfb949b96c3fd", + "relatedSpdxElement": "SPDXRef-File-d0fda51dc4377be3", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-f1ce882f705b6675", + "relatedSpdxElement": "SPDXRef-Package-8ba87a91847ac38b", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-f1ce882f705b6675", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-f1ce882f705b6675", + "relatedSpdxElement": "SPDXRef-Package-c299361fb42f7d42", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-f1ce882f705b6675", + "relatedSpdxElement": "SPDXRef-Package-e96cbaaf7d5ef1e6", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-f479683cd5b127eb", + "relatedSpdxElement": "SPDXRef-File-bcde8239ab85bf37", + "relationshipType": "CONTAINS" + }, + { + "spdxElementId": "SPDXRef-Package-f79e2ab5696c4e05", + "relatedSpdxElement": "SPDXRef-Package-ad1c94f3fcdbaebe", + "relationshipType": "DEPENDS_ON" + }, + { + "spdxElementId": "SPDXRef-Package-fab54ee965a31e6d", + "relatedSpdxElement": "SPDXRef-Package-e1062025609701e1", + "relationshipType": "DEPENDS_ON" + } + ] + } + \ No newline at end of file diff --git a/backend/unittests/import_observations/parsers/spdx/files/no_observation.json b/backend/unittests/import_observations/parsers/spdx/files/no_observation.json new file mode 100644 index 000000000..45fb5b737 --- /dev/null +++ b/backend/unittests/import_observations/parsers/spdx/files/no_observation.json @@ -0,0 +1,20 @@ +{ + "spdxVersion": "SPDX-2.3", + "dataLicense": "CC0-1.0", + "SPDXID": "SPDXRef-DOCUMENT", + "name": "maibornwolff/secobserve-backend:1.20.0", + "documentNamespace": "http://aquasecurity.github.io/trivy/container_image/maibornwolff/secobserve-backend:1.20.0-b3fdfb29-cea7-4576-875b-9cd70d2552ba", + "creationInfo": { + "creators": [ + "Organization: aquasecurity", + "Tool: trivy-0.58.0" + ], + "created": "2024-12-21T15:02:40Z" + }, + "packages": [ + ], + "files": [ + ], + "relationships": [ + ] + } \ No newline at end of file diff --git a/backend/unittests/import_observations/parsers/spdx/files/wrong_format.json b/backend/unittests/import_observations/parsers/spdx/files/wrong_format.json new file mode 100644 index 000000000..5196be22d --- /dev/null +++ b/backend/unittests/import_observations/parsers/spdx/files/wrong_format.json @@ -0,0 +1,3 @@ +{ + "data": "data" +} \ No newline at end of file diff --git a/backend/unittests/import_observations/parsers/spdx/test_parser.py b/backend/unittests/import_observations/parsers/spdx/test_parser.py new file mode 100644 index 000000000..f8d35aa82 --- /dev/null +++ b/backend/unittests/import_observations/parsers/spdx/test_parser.py @@ -0,0 +1,121 @@ +from os import path +from unittest import TestCase + +from application.import_observations.parsers.spdx.parser import SPDXParser + + +class TestSPDXParser(TestCase): + def test_no_json(self): + with open(path.dirname(__file__) + "/test_parser.py") as testfile: + parser = SPDXParser() + check, messages, data = parser.check_format(testfile) + + self.assertFalse(check) + self.assertEqual(1, len(messages)) + self.assertEqual("File is not valid JSON", messages[0]) + self.assertFalse(data) + + def test_wrong_format(self): + with open(path.dirname(__file__) + "/files/wrong_format.json") as testfile: + parser = SPDXParser() + check, messages, data = parser.check_format(testfile) + + self.assertFalse(check) + self.assertEqual(1, len(messages)) + self.assertEqual( + "Error while parsing document None: ['CreationInfo does not exist.']", + messages[0], + ) + self.assertFalse(data) + + def test_no_observation(self): + with open(path.dirname(__file__) + "/files/no_observation.json") as testfile: + parser = SPDXParser() + check, messages, data = parser.check_format(testfile) + observations = parser.get_observations(data) + license_components = parser.get_license_components(data) + + self.assertTrue(check) + self.assertEqual(0, len(messages)) + self.assertEqual(0, len(observations)) + self.assertEqual(0, len(license_components)) + + def test_multiple_observations(self): + with open( + path.dirname(__file__) + "/files/multiple_observations.json" + ) as testfile: + parser = SPDXParser() + check, messages, data = parser.check_format(testfile) + observations = parser.get_observations(data) + license_components = parser.get_license_components(data) + + self.assertTrue(check) + self.assertEqual(0, len(messages)) + self.assertEqual(0, len(observations)) + self.assertEqual(124, len(license_components)) + + license_component = license_components[1] + self.assertEqual("", license_component.unsaved_license) + self.assertEqual(".python-rundeps", license_component.name) + self.assertEqual("20241001.223602", license_component.version) + self.assertEqual( + "pkg:apk/alpine/.python-rundeps@20241001.223602?arch=noarch&distro=3.20.3", + license_component.purl, + ) + dependencies = """alpine:3.20.3 --> .python-rundeps:20241001.223602 +maibornwolff/secobserve-backend:1.20.0 --> alpine:3.20.3""" + self.assertEqual(dependencies, license_component.dependencies) + self.assertEqual(1, len(license_component.unsaved_evidences)) + self.assertEqual("Package", license_component.unsaved_evidences[0][0]) + self.assertIn( + "SPDXRef-Package-82ad85e2f96c7331", + license_component.unsaved_evidences[0][1], + ) + + license_component = license_components[2] + self.assertEqual("BSD-3-Clause", license_component.unsaved_license) + self.assertEqual("Django", license_component.name) + self.assertEqual("", license_component.version) + self.assertEqual( + "pkg:pypi/django@5.1.2", + license_component.purl, + ) + dependencies = """maibornwolff/secobserve-backend:1.20.0 --> Django""" + self.assertEqual(dependencies, license_component.dependencies) + self.assertEqual(1, len(license_component.unsaved_evidences)) + self.assertEqual("Package", license_component.unsaved_evidences[0][0]) + self.assertIn( + "SPDXRef-Package-d254ad6cee138a57", + license_component.unsaved_evidences[0][1], + ) + + license_component = license_components[3] + self.assertEqual("MIT", license_component.unsaved_license) + self.assertEqual("PyJWT", license_component.name) + self.assertEqual("2.9.0", license_component.version) + + license_component = license_components[4] + self.assertEqual("", license_component.unsaved_license) + self.assertEqual("PyMySQL", license_component.name) + self.assertEqual("1.1.1", license_component.version) + + license_component = license_components[89] + self.assertEqual( + "Artistic-1.0-Perl AND GPL-1.0-or-later", + license_component.unsaved_license, + ) + self.assertEqual("perl", license_component.name) + self.assertEqual("5.38.2-r0", license_component.version) + self.assertEqual( + "pkg:apk/alpine/perl@5.38.2-r0?arch=x86_64&distro=3.20.3", + license_component.purl, + ) + dependencies = """alpine:3.20.3 --> mariadb-client:10.11.8-r0 +alpine:3.20.3 --> mysql-client:10.11.8-r0 +alpine:3.20.3 --> perl:5.38.2-r0 +alpine:3.20.3 --> postgresql-libs:20241014.093848 +maibornwolff/secobserve-backend:1.20.0 --> alpine:3.20.3 +mariadb-client:10.11.8-r0 --> perl:5.38.2-r0 +mysql-client:10.11.8-r0 --> mariadb-client:10.11.8-r0 +postgresql-libs:20241014.093848 --> mysql-client:10.11.8-r0""" + self.assertEqual(dependencies, license_component.dependencies) diff --git a/docs/getting_started/features.md b/docs/getting_started/features.md index 3ed7baa52..15a260f48 100644 --- a/docs/getting_started/features.md +++ b/docs/getting_started/features.md @@ -19,7 +19,7 @@ | Feature | Supported | |---------|:------------:| -| [Import of license information from CycloneDX SBOMs](../usage/license_management.md#managing-licenses-in-products) | :material-plus-circle-outline: | +| [Import of license information from CycloneDX and SPDX SBOMs](../usage/license_management.md#managing-licenses-in-products) | :material-plus-circle-outline: | | [Flexible license policies to evaluate the impact of different license conditions](../usage/license_management.md#managing-license-policies) | :material-plus-circle-outline: | | [Organize licenses with similar conditions in license groups](../usage/license_management.md#managing-license-groups) | :material-plus-circle-outline: | diff --git a/docs/usage/license_management.md b/docs/usage/license_management.md index 00d52e742..664a08753 100644 --- a/docs/usage/license_management.md +++ b/docs/usage/license_management.md @@ -10,14 +10,14 @@ If license management is deactivated: * The `Licenses` menu is not visible in the navigation. * The [automatic import of SPDX licenses](../integrations/license_data.md#spdx-licenses) is deactivated. -* Licenses for components are not imported from CycloneDX files and the `License` tab is not visible in the Product view. +* Licenses for components are not imported from CycloneDX or SPDX files and the `License` tab is not visible in the Product view. ## Managing licenses in products #### Importing components with licenses -When importing data from CycloneDX SBOMs, the licenses of the components are imported as well, if they are available in the SBOM and the parameter `SO_SUPPRESS_LICENSES` is not set or set to `false` ^1)^. The licenses are shown in the `License` tab of the Product view. +When importing data from CycloneDX or SPDX SBOMs, the licenses of the components are imported as well, if they are available in the SBOM and the parameter `SO_SUPPRESS_LICENSES` is not set or set to `false` ^1)^. The licenses are shown in the `License` tab of the Product view. **^1)^** `SO_SUPPRESS_LICENSES` will be set to `true` by the *Grype*, *Trivy Filesystem* and *Trivy Image* GitHub actions / GitLab templates if not set otherwise, to not accidently import licenses. From d8cfb4a7d4a81992b203731a7c600f8e6c708648 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Mon, 23 Dec 2024 12:39:32 +0000 Subject: [PATCH 74/82] fix: observations / license components with invalid purls can't be shown (#2368) --- .../core/api/serializers_observation.py | 15 +++++++++++---- backend/application/core/services/observation.py | 1 + backend/application/licenses/api/serializers.py | 7 +++++-- .../licenses/services/license_component.py | 1 + 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/backend/application/core/api/serializers_observation.py b/backend/application/core/api/serializers_observation.py index 0802433eb..fdae63011 100644 --- a/backend/application/core/api/serializers_observation.py +++ b/backend/application/core/api/serializers_observation.py @@ -125,16 +125,23 @@ def get_origin_source_file_url(self, observation: Observation) -> Optional[str]: def get_origin_component_purl_type(self, observation: Observation) -> str: if observation.origin_component_purl: - purl = PackageURL.from_string(observation.origin_component_purl) - return purl.type + try: + purl = PackageURL.from_string(observation.origin_component_purl) + return purl.type + except ValueError: + return "" + return "" def get_origin_component_purl_namespace( self, observation: Observation ) -> Optional[str]: if observation.origin_component_purl: - purl = PackageURL.from_string(observation.origin_component_purl) - return purl.namespace + try: + purl = PackageURL.from_string(observation.origin_component_purl) + return purl.namespace + except ValueError: + return "" return "" def _create_azure_devops_url( diff --git a/backend/application/core/services/observation.py b/backend/application/core/services/observation.py index 3b88976ea..d0cb83ce1 100644 --- a/backend/application/core/services/observation.py +++ b/backend/application/core/services/observation.py @@ -225,6 +225,7 @@ def normalize_origin_component(observation): # pylint: disable=too-many-branche purl = PackageURL.from_string(observation.origin_component_purl) observation.origin_component_purl_type = purl.type except ValueError: + observation.origin_component_purl = "" observation.origin_component_purl_type = "" if observation.origin_component_purl_type is None: diff --git a/backend/application/licenses/api/serializers.py b/backend/application/licenses/api/serializers.py index d1e3933ed..930a14998 100644 --- a/backend/application/licenses/api/serializers.py +++ b/backend/application/licenses/api/serializers.py @@ -108,8 +108,11 @@ class Meta: def get_purl_namespace(self, obj: License_Component) -> Optional[str]: if obj.purl: - purl = PackageURL.from_string(obj.purl) - return purl.namespace + try: + purl = PackageURL.from_string(obj.purl) + return purl.namespace + except ValueError: + return "" return "" diff --git a/backend/application/licenses/services/license_component.py b/backend/application/licenses/services/license_component.py index 726edda65..eb339af63 100644 --- a/backend/application/licenses/services/license_component.py +++ b/backend/application/licenses/services/license_component.py @@ -168,6 +168,7 @@ def _prepare_component(component: License_Component) -> None: purl = PackageURL.from_string(component.purl) component.purl_type = purl.type except ValueError: + component.purl = "" component.purl_type = "" if component.purl_type is None: From 34fbfcbc092f391d904cd258f8bd22cc4fe2cf42 Mon Sep 17 00:00:00 2001 From: Lukas Krug Date: Mon, 23 Dec 2024 17:41:39 +0100 Subject: [PATCH 75/82] feat: group components by vendor and name (#2273) * feat: group components by vendor and name * fix: more robust without purl --------- Co-authored-by: Stefan Fleckenstein --- .../vex/services/csaf_generator_component.py | 58 ++++++++--- backend/unittests/fixtures/vex_fixtures.json | 8 +- .../api/files/csaf_given_vulnerability.json | 68 ++++++++----- .../csaf_given_vulnerability_update.json | 68 ++++++++----- .../vex/api/files/csaf_product_branches.json | 84 +++++++++------- .../api/files/csaf_product_given_branch.json | 26 ++--- .../vex/api/files/csaf_product_no_branch.json | 96 ++++++++++++------- .../files/csaf_product_no_branch_update.json | 96 ++++++++++++------- .../files/openvex_given_vulnerability.json | 4 +- .../openvex_given_vulnerability_update.json | 4 +- .../api/files/openvex_product_branches.json | 9 +- .../files/openvex_product_given_branch.json | 7 +- .../api/files/openvex_product_no_branch.json | 4 +- .../openvex_product_no_branch_update.json | 4 +- backend/unittests/vex/api/test_views_csaf.py | 18 ++-- .../unittests/vex/api/test_views_openvex.py | 12 +-- 16 files changed, 356 insertions(+), 210 deletions(-) diff --git a/backend/application/vex/services/csaf_generator_component.py b/backend/application/vex/services/csaf_generator_component.py index 74ad16257..0134a8e45 100644 --- a/backend/application/vex/services/csaf_generator_component.py +++ b/backend/application/vex/services/csaf_generator_component.py @@ -1,5 +1,7 @@ from typing import Optional +from packageurl import PackageURL + from application.core.models import Observation from application.vex.services.csaf_generator_helpers import ( get_product_id, @@ -29,27 +31,51 @@ def append_component_to_product_tree( if not observation.origin_component_name_version: return - components_branch_name = "_components_" + purl = None + vendor_branch_name = "unknown" + if observation.origin_component_purl: + try: + purl = PackageURL.from_string(observation.origin_component_purl) + if purl.namespace: + vendor_branch_name = purl.namespace + except ValueError: + pass found = False - for components_branch in product_tree.branches: - if components_branch.name == components_branch_name: + for vendor_branch in product_tree.branches: + if vendor_branch.name == vendor_branch_name: found = True break if not found: - components_branch = CSAFProductBranch( - name=components_branch_name, - category=CSAF_Branch_Category.CSAF_BRANCH_CATEGORY_PRODUCT_FAMILY, + vendor_branch = CSAFProductBranch( + name=vendor_branch_name, + category=CSAF_Branch_Category.CSAF_BRANCH_CATEGORY_VENDOR, branches=[], ) - product_tree.branches.append(components_branch) + product_tree.branches.append(vendor_branch) _append_component_to_relationships(product_tree, observation) - if not components_branch.branches: - components_branch.branches = [] + product_branch_name = ( + purl.name if purl and purl.name else observation.origin_component_name + ) + found = False - for component_branch in components_branch.branches: + vendor_branch.branches = vendor_branch.branches or [] + for product_branch in vendor_branch.branches: + if product_branch.name == product_branch_name: + found = True + break + if not found: + product_branch = CSAFProductBranch( + name=product_branch_name, + category=CSAF_Branch_Category.CSAF_BRANCH_CATEGORY_PRODUCT_NAME, + branches=[], + ) + vendor_branch.branches.append(product_branch) + + product_branch.branches = product_branch.branches or [] + for component_branch in product_branch.branches: if ( component_branch.product and component_branch.product.product_id @@ -62,7 +88,7 @@ def append_component_to_product_tree( return component_branch = CSAFProductBranch( - name=observation.origin_component_name_version, + name=(_get_version(observation, purl)), category=CSAF_Branch_Category.CSAF_BRANCH_CATEGORY_PRODUCT_VERSION, product=_create_component( observation.origin_component_name_version, @@ -70,7 +96,7 @@ def append_component_to_product_tree( observation.origin_component_cpe, ), ) - components_branch.branches.append(component_branch) + product_branch.branches.append(component_branch) def _create_component( @@ -126,3 +152,11 @@ def _append_component_to_relationships( full_product_name=full_product_name, ) product_tree.relationships.append(relationship) + + +def _get_version(observation: Observation, purl: Optional[PackageURL]) -> str: + if purl and purl.version: + return purl.version + if observation.origin_component_version: + return observation.origin_component_version + return "unknown" diff --git a/backend/unittests/fixtures/vex_fixtures.json b/backend/unittests/fixtures/vex_fixtures.json index 0b77d6e8e..12c349e73 100644 --- a/backend/unittests/fixtures/vex_fixtures.json +++ b/backend/unittests/fixtures/vex_fixtures.json @@ -164,7 +164,7 @@ "origin_component_name": "vex_comp_2", "origin_component_version": "2.0.0", "origin_component_name_version": "vex_comp_2:2.0.0", - "origin_component_purl": "pkg:so/vex_comp_2@2.0.0", + "origin_component_purl": "pkg:so/vendor2/vex_comp_2@2.0.0", "origin_component_cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", "origin_docker_image_name": "", "origin_docker_image_tag": "", @@ -219,7 +219,7 @@ "origin_component_name": "vex_comp_3", "origin_component_version": "3.0.0", "origin_component_name_version": "vex_comp_3:3.0.0", - "origin_component_purl": "pkg:so/vex_comp_3@3.0.0", + "origin_component_purl": "pkg:so/vendor_3/vex_comp_3@3.0.0", "origin_component_cpe": "cpe:2.3:a:so:vex_comp_3:3.0.0:*:*:*:*:*:*:*", "origin_docker_image_name": "", "origin_docker_image_tag": "", @@ -300,7 +300,7 @@ "origin_component_name": "vex_comp_2", "origin_component_version": "2.0.0", "origin_component_name_version": "vex_comp_2:2.0.0", - "origin_component_purl": "pkg:so/vex_comp_2@2.0.0", + "origin_component_purl": "pkg:so/vendor2/vex_comp_2@2.0.0", "origin_component_cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", "origin_docker_image_name": "", "origin_docker_image_tag": "", @@ -468,8 +468,6 @@ "origin_component_name": "vex_comp_5", "origin_component_version": "5.0.0", "origin_component_name_version": "vex_comp_5:5.0.0", - "origin_component_purl": "pkg:so/vex_comp_5@5.0.0", - "origin_component_cpe": "cpe:2.3:a:so:vex_comp_5:5.0.0:*:*:*:*:*:*:*", "origin_docker_image_name": "", "origin_docker_image_tag": "", "origin_docker_image_name_tag": "", diff --git a/backend/unittests/vex/api/files/csaf_given_vulnerability.json b/backend/unittests/vex/api/files/csaf_given_vulnerability.json index 1f347327e..4ec8bd8b4 100644 --- a/backend/unittests/vex/api/files/csaf_given_vulnerability.json +++ b/backend/unittests/vex/api/files/csaf_given_vulnerability.json @@ -39,32 +39,26 @@ { "branches": [ { - "category": "product_version", - "name": "vex_comp_2:2.0.0", - "product": { - "name": "vex_comp_2:2.0.0", - "product_id": "pkg:so/vex_comp_2@2.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_2@2.0.0" - } - } - }, - { - "category": "product_version", - "name": "vex_comp_4:4.0.0", - "product": { - "name": "vex_comp_4:4.0.0", - "product_id": "pkg:so/vex_comp_4@4.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_4:4.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_4@4.0.0" + "branches": [ + { + "category": "product_version", + "name": "2.0.0", + "product": { + "name": "vex_comp_2:2.0.0", + "product_id": "pkg:so/vendor2/vex_comp_2@2.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vendor2/vex_comp_2@2.0.0" + } + } } - } + ], + "category": "product_name", + "name": "vex_comp_2" } ], - "category": "product_family", - "name": "_components_" + "category": "vendor", + "name": "vendor2" }, { "branches": [ @@ -96,6 +90,30 @@ ], "category": "product_family", "name": "vex_product_2" + }, + { + "branches": [ + { + "branches": [ + { + "category": "product_version", + "name": "4.0.0", + "product": { + "name": "vex_comp_4:4.0.0", + "product_id": "pkg:so/vex_comp_4@4.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_4:4.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vex_comp_4@4.0.0" + } + } + } + ], + "category": "product_name", + "name": "vex_comp_4" + } + ], + "category": "vendor", + "name": "unknown" } ], "relationships": [ @@ -105,7 +123,7 @@ "name": "vex_comp_2:2.0.0@vex_product_1", "product_id": "vex_comp_2:2.0.0@vex_product_1" }, - "product_reference": "pkg:so/vex_comp_2@2.0.0", + "product_reference": "pkg:so/vendor2/vex_comp_2@2.0.0", "relates_to_product_reference": "vex_product_1" }, { @@ -114,7 +132,7 @@ "name": "vex_comp_2:2.0.0@vex_product_2:dev", "product_id": "vex_comp_2:2.0.0@vex_product_2:dev" }, - "product_reference": "pkg:so/vex_comp_2@2.0.0", + "product_reference": "pkg:so/vendor2/vex_comp_2@2.0.0", "relates_to_product_reference": "pkg:so/vex_product_2@dev" }, { diff --git a/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json b/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json index 98e35d6c8..78f5a7179 100644 --- a/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json +++ b/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json @@ -44,32 +44,26 @@ { "branches": [ { - "category": "product_version", - "name": "vex_comp_2:2.0.0", - "product": { - "name": "vex_comp_2:2.0.0", - "product_id": "pkg:so/vex_comp_2@2.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_2@2.0.0" - } - } - }, - { - "category": "product_version", - "name": "vex_comp_4:4.0.0", - "product": { - "name": "vex_comp_4:4.0.0", - "product_id": "pkg:so/vex_comp_4@4.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_4:4.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_4@4.0.0" + "branches": [ + { + "category": "product_version", + "name": "2.0.0", + "product": { + "name": "vex_comp_2:2.0.0", + "product_id": "pkg:so/vendor2/vex_comp_2@2.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vendor2/vex_comp_2@2.0.0" + } + } } - } + ], + "category": "product_name", + "name": "vex_comp_2" } ], - "category": "product_family", - "name": "_components_" + "category": "vendor", + "name": "vendor2" }, { "branches": [ @@ -101,6 +95,30 @@ ], "category": "product_family", "name": "vex_product_2" + }, + { + "branches": [ + { + "branches": [ + { + "category": "product_version", + "name": "4.0.0", + "product": { + "name": "vex_comp_4:4.0.0", + "product_id": "pkg:so/vex_comp_4@4.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_4:4.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vex_comp_4@4.0.0" + } + } + } + ], + "category": "product_name", + "name": "vex_comp_4" + } + ], + "category": "vendor", + "name": "unknown" } ], "relationships": [ @@ -110,7 +128,7 @@ "name": "vex_comp_2:2.0.0@vex_product_1", "product_id": "vex_comp_2:2.0.0@vex_product_1" }, - "product_reference": "pkg:so/vex_comp_2@2.0.0", + "product_reference": "pkg:so/vendor2/vex_comp_2@2.0.0", "relates_to_product_reference": "vex_product_1" }, { @@ -119,7 +137,7 @@ "name": "vex_comp_2:2.0.0@vex_product_2:dev", "product_id": "vex_comp_2:2.0.0@vex_product_2:dev" }, - "product_reference": "pkg:so/vex_comp_2@2.0.0", + "product_reference": "pkg:so/vendor2/vex_comp_2@2.0.0", "relates_to_product_reference": "pkg:so/vex_product_2@dev" }, { diff --git a/backend/unittests/vex/api/files/csaf_product_branches.json b/backend/unittests/vex/api/files/csaf_product_branches.json index 4e1027786..366eeaba8 100644 --- a/backend/unittests/vex/api/files/csaf_product_branches.json +++ b/backend/unittests/vex/api/files/csaf_product_branches.json @@ -67,44 +67,64 @@ { "branches": [ { - "category": "product_version", - "name": "vex_comp_2:2.0.0", - "product": { - "name": "vex_comp_2:2.0.0", - "product_id": "pkg:so/vex_comp_2@2.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_2@2.0.0" + "branches": [ + { + "category": "product_version", + "name": "2.0.0", + "product": { + "name": "vex_comp_2:2.0.0", + "product_id": "pkg:so/vendor2/vex_comp_2@2.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vendor2/vex_comp_2@2.0.0" + } + } } - } - }, + ], + "category": "product_name", + "name": "vex_comp_2" + } + ], + "category": "vendor", + "name": "vendor2" + }, + { + "branches": [ { - "category": "product_version", - "name": "vex_comp_4:4.0.0", - "product": { - "name": "vex_comp_4:4.0.0", - "product_id": "pkg:so/vex_comp_4@4.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_4:4.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_4@4.0.0" + "branches": [ + { + "category": "product_version", + "name": "4.0.0", + "product": { + "name": "vex_comp_4:4.0.0", + "product_id": "pkg:so/vex_comp_4@4.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_4:4.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vex_comp_4@4.0.0" + } + } } - } + ], + "category": "product_name", + "name": "vex_comp_4" }, { - "category": "product_version", - "name": "vex_comp_5:5.0.0", - "product": { - "name": "vex_comp_5:5.0.0", - "product_id": "pkg:so/vex_comp_5@5.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_5:5.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_5@5.0.0" + "branches": [ + { + "category": "product_version", + "name": "5.0.0", + "product": { + "name": "vex_comp_5:5.0.0", + "product_id": "vex_comp_5:5.0.0" + } } - } + ], + "category": "product_name", + "name": "vex_comp_5" } ], - "category": "product_family", - "name": "_components_" + "category": "vendor", + "name": "unknown" } ], "relationships": [ @@ -114,7 +134,7 @@ "name": "vex_comp_2:2.0.0@vex_product_2:dev", "product_id": "vex_comp_2:2.0.0@vex_product_2:dev" }, - "product_reference": "pkg:so/vex_comp_2@2.0.0", + "product_reference": "pkg:so/vendor2/vex_comp_2@2.0.0", "relates_to_product_reference": "pkg:so/vex_product_2@dev" }, { @@ -132,7 +152,7 @@ "name": "vex_comp_5:5.0.0@vex_product_2:main", "product_id": "vex_comp_5:5.0.0@vex_product_2:main" }, - "product_reference": "pkg:so/vex_comp_5@5.0.0", + "product_reference": "vex_comp_5:5.0.0", "relates_to_product_reference": "pkg:so/vex_product_2@main" } ] diff --git a/backend/unittests/vex/api/files/csaf_product_given_branch.json b/backend/unittests/vex/api/files/csaf_product_given_branch.json index fa6e33749..4c052e298 100644 --- a/backend/unittests/vex/api/files/csaf_product_given_branch.json +++ b/backend/unittests/vex/api/files/csaf_product_given_branch.json @@ -56,20 +56,22 @@ { "branches": [ { - "category": "product_version", - "name": "vex_comp_5:5.0.0", - "product": { - "name": "vex_comp_5:5.0.0", - "product_id": "pkg:so/vex_comp_5@5.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_5:5.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_5@5.0.0" + "branches": [ + { + "category": "product_version", + "name": "5.0.0", + "product": { + "name": "vex_comp_5:5.0.0", + "product_id": "vex_comp_5:5.0.0" + } } - } + ], + "category": "product_name", + "name": "vex_comp_5" } ], - "category": "product_family", - "name": "_components_" + "category": "vendor", + "name": "unknown" } ], "relationships": [ @@ -79,7 +81,7 @@ "name": "vex_comp_5:5.0.0@vex_product_2:main", "product_id": "vex_comp_5:5.0.0@vex_product_2:main" }, - "product_reference": "pkg:so/vex_comp_5@5.0.0", + "product_reference": "vex_comp_5:5.0.0", "relates_to_product_reference": "pkg:so/vex_product_2@main" } ] diff --git a/backend/unittests/vex/api/files/csaf_product_no_branch.json b/backend/unittests/vex/api/files/csaf_product_no_branch.json index 847263d30..26c01abbe 100644 --- a/backend/unittests/vex/api/files/csaf_product_no_branch.json +++ b/backend/unittests/vex/api/files/csaf_product_no_branch.json @@ -53,44 +53,74 @@ { "branches": [ { - "category": "product_version", - "name": "vex_comp_1:1.0.0", - "product": { - "name": "vex_comp_1:1.0.0", - "product_id": "pkg:so/vex_comp_1@1.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_1:1.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_1@1.0.0" + "branches": [ + { + "category": "product_version", + "name": "1.0.0", + "product": { + "name": "vex_comp_1:1.0.0", + "product_id": "pkg:so/vex_comp_1@1.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_1:1.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vex_comp_1@1.0.0" + } + } } - } - }, + ], + "category": "product_name", + "name": "vex_comp_1" + } + ], + "category": "vendor", + "name": "unknown" + }, + { + "branches": [ { - "category": "product_version", - "name": "vex_comp_2:2.0.0", - "product": { - "name": "vex_comp_2:2.0.0", - "product_id": "pkg:so/vex_comp_2@2.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_2@2.0.0" + "branches": [ + { + "category": "product_version", + "name": "2.0.0", + "product": { + "name": "vex_comp_2:2.0.0", + "product_id": "pkg:so/vendor2/vex_comp_2@2.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vendor2/vex_comp_2@2.0.0" + } + } } - } - }, + ], + "category": "product_name", + "name": "vex_comp_2" + } + ], + "category": "vendor", + "name": "vendor2" + }, + { + "branches": [ { - "category": "product_version", - "name": "vex_comp_3:3.0.0", - "product": { - "name": "vex_comp_3:3.0.0", - "product_id": "pkg:so/vex_comp_3@3.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_3:3.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_3@3.0.0" + "branches": [ + { + "category": "product_version", + "name": "3.0.0", + "product": { + "name": "vex_comp_3:3.0.0", + "product_id": "pkg:so/vendor_3/vex_comp_3@3.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_3:3.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vendor_3/vex_comp_3@3.0.0" + } + } } - } + ], + "category": "product_name", + "name": "vex_comp_3" } ], - "category": "product_family", - "name": "_components_" + "category": "vendor", + "name": "vendor_3" } ], "relationships": [ @@ -109,7 +139,7 @@ "name": "vex_comp_2:2.0.0@vex_product_1", "product_id": "vex_comp_2:2.0.0@vex_product_1" }, - "product_reference": "pkg:so/vex_comp_2@2.0.0", + "product_reference": "pkg:so/vendor2/vex_comp_2@2.0.0", "relates_to_product_reference": "vex_product_1" }, { @@ -118,7 +148,7 @@ "name": "vex_comp_3:3.0.0@vex_product_1", "product_id": "vex_comp_3:3.0.0@vex_product_1" }, - "product_reference": "pkg:so/vex_comp_3@3.0.0", + "product_reference": "pkg:so/vendor_3/vex_comp_3@3.0.0", "relates_to_product_reference": "vex_product_1" } ] diff --git a/backend/unittests/vex/api/files/csaf_product_no_branch_update.json b/backend/unittests/vex/api/files/csaf_product_no_branch_update.json index 9fb5dc9c2..556599d1b 100644 --- a/backend/unittests/vex/api/files/csaf_product_no_branch_update.json +++ b/backend/unittests/vex/api/files/csaf_product_no_branch_update.json @@ -58,44 +58,74 @@ { "branches": [ { - "category": "product_version", - "name": "vex_comp_1:1.0.0", - "product": { - "name": "vex_comp_1:1.0.0", - "product_id": "pkg:so/vex_comp_1@1.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_1:1.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_1@1.0.0" + "branches": [ + { + "category": "product_version", + "name": "1.0.0", + "product": { + "name": "vex_comp_1:1.0.0", + "product_id": "pkg:so/vex_comp_1@1.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_1:1.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vex_comp_1@1.0.0" + } + } } - } - }, + ], + "category": "product_name", + "name": "vex_comp_1" + } + ], + "category": "vendor", + "name": "unknown" + }, + { + "branches": [ { - "category": "product_version", - "name": "vex_comp_2:2.0.0", - "product": { - "name": "vex_comp_2:2.0.0", - "product_id": "pkg:so/vex_comp_2@2.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_2@2.0.0" + "branches": [ + { + "category": "product_version", + "name": "2.0.0", + "product": { + "name": "vex_comp_2:2.0.0", + "product_id": "pkg:so/vendor2/vex_comp_2@2.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_2:2.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vendor2/vex_comp_2@2.0.0" + } + } } - } - }, + ], + "category": "product_name", + "name": "vex_comp_2" + } + ], + "category": "vendor", + "name": "vendor2" + }, + { + "branches": [ { - "category": "product_version", - "name": "vex_comp_3:3.0.0", - "product": { - "name": "vex_comp_3:3.0.0", - "product_id": "pkg:so/vex_comp_3@3.0.0", - "product_identification_helper": { - "cpe": "cpe:2.3:a:so:vex_comp_3:3.0.0:*:*:*:*:*:*:*", - "purl": "pkg:so/vex_comp_3@3.0.0" + "branches": [ + { + "category": "product_version", + "name": "3.0.0", + "product": { + "name": "vex_comp_3:3.0.0", + "product_id": "pkg:so/vendor_3/vex_comp_3@3.0.0", + "product_identification_helper": { + "cpe": "cpe:2.3:a:so:vex_comp_3:3.0.0:*:*:*:*:*:*:*", + "purl": "pkg:so/vendor_3/vex_comp_3@3.0.0" + } + } } - } + ], + "category": "product_name", + "name": "vex_comp_3" } ], - "category": "product_family", - "name": "_components_" + "category": "vendor", + "name": "vendor_3" } ], "relationships": [ @@ -114,7 +144,7 @@ "name": "vex_comp_2:2.0.0@vex_product_1", "product_id": "vex_comp_2:2.0.0@vex_product_1" }, - "product_reference": "pkg:so/vex_comp_2@2.0.0", + "product_reference": "pkg:so/vendor2/vex_comp_2@2.0.0", "relates_to_product_reference": "vex_product_1" }, { @@ -123,7 +153,7 @@ "name": "vex_comp_3:3.0.0@vex_product_1", "product_id": "vex_comp_3:3.0.0@vex_product_1" }, - "product_reference": "pkg:so/vex_comp_3@3.0.0", + "product_reference": "pkg:so/vendor_3/vex_comp_3@3.0.0", "relates_to_product_reference": "vex_product_1" } ] diff --git a/backend/unittests/vex/api/files/openvex_given_vulnerability.json b/backend/unittests/vex/api/files/openvex_given_vulnerability.json index 38d7cbfaa..f31a565d7 100644 --- a/backend/unittests/vex/api/files/openvex_given_vulnerability.json +++ b/backend/unittests/vex/api/files/openvex_given_vulnerability.json @@ -11,7 +11,7 @@ "@id": "vex_product_1", "subcomponents": [ { - "@id": "pkg:so/vex_comp_2@2.0.0" + "@id": "pkg:so/vendor2/vex_comp_2@2.0.0" } ] } @@ -33,7 +33,7 @@ }, "subcomponents": [ { - "@id": "pkg:so/vex_comp_2@2.0.0" + "@id": "pkg:so/vendor2/vex_comp_2@2.0.0" } ] } diff --git a/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json b/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json index 2b375aa2a..97033aba5 100644 --- a/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json +++ b/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json @@ -12,7 +12,7 @@ "@id": "vex_product_1", "subcomponents": [ { - "@id": "pkg:so/vex_comp_2@2.0.0" + "@id": "pkg:so/vendor2/vex_comp_2@2.0.0" } ] }, @@ -23,7 +23,7 @@ }, "subcomponents": [ { - "@id": "pkg:so/vex_comp_2@2.0.0" + "@id": "pkg:so/vendor2/vex_comp_2@2.0.0" } ] } diff --git a/backend/unittests/vex/api/files/openvex_product_branches.json b/backend/unittests/vex/api/files/openvex_product_branches.json index 0df3bb6a1..03a436e33 100644 --- a/backend/unittests/vex/api/files/openvex_product_branches.json +++ b/backend/unittests/vex/api/files/openvex_product_branches.json @@ -15,7 +15,7 @@ }, "subcomponents": [ { - "@id": "pkg:so/vex_comp_2@2.0.0" + "@id": "pkg:so/vendor2/vex_comp_2@2.0.0" } ] } @@ -54,12 +54,7 @@ "@id": "pkg:so/vex_product_2@main", "identifiers": { "purl": "pkg:so/vex_product_2@main" - }, - "subcomponents": [ - { - "@id": "pkg:so/vex_comp_5@5.0.0" - } - ] + } } ], "status": "not_affected", diff --git a/backend/unittests/vex/api/files/openvex_product_given_branch.json b/backend/unittests/vex/api/files/openvex_product_given_branch.json index bea3611ee..3b20a09b1 100644 --- a/backend/unittests/vex/api/files/openvex_product_given_branch.json +++ b/backend/unittests/vex/api/files/openvex_product_given_branch.json @@ -12,12 +12,7 @@ "@id": "pkg:so/vex_product_2@main", "identifiers": { "purl": "pkg:so/vex_product_2@main" - }, - "subcomponents": [ - { - "@id": "pkg:so/vex_comp_5@5.0.0" - } - ] + } } ], "status": "not_affected", diff --git a/backend/unittests/vex/api/files/openvex_product_no_branch.json b/backend/unittests/vex/api/files/openvex_product_no_branch.json index 6158c1304..8e099d367 100644 --- a/backend/unittests/vex/api/files/openvex_product_no_branch.json +++ b/backend/unittests/vex/api/files/openvex_product_no_branch.json @@ -30,7 +30,7 @@ "@id": "vex_product_1", "subcomponents": [ { - "@id": "pkg:so/vex_comp_2@2.0.0" + "@id": "pkg:so/vendor2/vex_comp_2@2.0.0" } ] } @@ -50,7 +50,7 @@ "@id": "vex_product_1", "subcomponents": [ { - "@id": "pkg:so/vex_comp_3@3.0.0" + "@id": "pkg:so/vendor_3/vex_comp_3@3.0.0" } ] } diff --git a/backend/unittests/vex/api/files/openvex_product_no_branch_update.json b/backend/unittests/vex/api/files/openvex_product_no_branch_update.json index e55ad08ec..a17771bf0 100644 --- a/backend/unittests/vex/api/files/openvex_product_no_branch_update.json +++ b/backend/unittests/vex/api/files/openvex_product_no_branch_update.json @@ -31,7 +31,7 @@ "@id": "vex_product_1", "subcomponents": [ { - "@id": "pkg:so/vex_comp_2@2.0.0" + "@id": "pkg:so/vendor2/vex_comp_2@2.0.0" } ] } @@ -51,7 +51,7 @@ "@id": "vex_product_1", "subcomponents": [ { - "@id": "pkg:so/vex_comp_3@3.0.0" + "@id": "pkg:so/vendor_3/vex_comp_3@3.0.0" } ] } diff --git a/backend/unittests/vex/api/test_views_csaf.py b/backend/unittests/vex/api/test_views_csaf.py index 10bce0852..50de1ac8a 100644 --- a/backend/unittests/vex/api/test_views_csaf.py +++ b/backend/unittests/vex/api/test_views_csaf.py @@ -75,6 +75,7 @@ def test_csaf_document_product_no_branch( "attachment; filename=csaf_2024_0001_0001.json", response.headers["Content-Disposition"], ) + with open( path.dirname(__file__) + "/files/csaf_product_no_branch.json", "r" ) as testfile: @@ -85,7 +86,7 @@ def test_csaf_document_product_no_branch( self.assertEqual(Product.objects.get(id=1), csaf.product) self.assertEqual(1, csaf.version) self.assertEqual( - "42cd21890a073aa88a4b6e882ae267321d2a11e2de040c97c4ba81997e0b6b2e", + "eaa6cdcec3ea5f1feff8ecd7d0c8802e027e5c26d34f57f7a8cb0f31f633da0a", csaf.content_hash, ) self.assertEqual("Title", csaf.title) @@ -174,6 +175,7 @@ def test_csaf_document_product_no_branch( "attachment; filename=csaf_2024_0001_0002.json", response.headers["Content-Disposition"], ) + with open( path.dirname(__file__) + "/files/csaf_product_no_branch_update.json", "r" ) as testfile: @@ -184,7 +186,7 @@ def test_csaf_document_product_no_branch( self.assertEqual(Product.objects.get(id=1), csaf.product) self.assertEqual(2, csaf.version) self.assertEqual( - "03da3485b7cf22c1b223343b280fb9fd8adc5b618721abe5d95e4b363fb47a69", + "65aeaea7aa45c945515b81613bd0a937b2f2262a9a6dfc0512bbde340c67aad1", csaf.content_hash, ) self.assertEqual("Title", csaf.title) @@ -267,6 +269,7 @@ def test_csaf_document_product_branches( "attachment; filename=csaf_2024_0001_0001.json", response.headers["Content-Disposition"], ) + with open( path.dirname(__file__) + "/files/csaf_product_branches.json", "r" ) as testfile: @@ -277,7 +280,7 @@ def test_csaf_document_product_branches( self.assertEqual(Product.objects.get(id=2), csaf.product) self.assertEqual(1, csaf.version) self.assertEqual( - "8dc411d11d433ad370b988ac2bf447443927de3bb57fa7e3ce72de4412eabda0", + "ad81aa72d9cd265574eef05a13f86e6c7072212532b2d167e3ca120b6d26b897", csaf.content_hash, ) self.assertEqual("Title", csaf.title) @@ -361,6 +364,7 @@ def test_csaf_document_product_given_branch( "attachment; filename=csaf_2024_0001_0001.json", response.headers["Content-Disposition"], ) + with open( path.dirname(__file__) + "/files/csaf_product_given_branch.json", "r" ) as testfile: @@ -371,7 +375,7 @@ def test_csaf_document_product_given_branch( self.assertEqual(Product.objects.get(id=2), csaf.product) self.assertEqual(1, csaf.version) self.assertEqual( - "7233ee583bc5d5d0a31439030d9e3da505368b0582e02182ab12c056854e2c60", + "cf643f6b631cf5d2bf9a11b0c7247d1be9e456482e9fc9ed073c8b3823d8bd0d", csaf.content_hash, ) self.assertEqual("Title", csaf.title) @@ -455,6 +459,7 @@ def test_csaf_document_given_vulnerability( "attachment; filename=csaf_2024_0001_0001.json", response.headers["Content-Disposition"], ) + with open( path.dirname(__file__) + "/files/csaf_given_vulnerability.json", "r" ) as testfile: @@ -465,7 +470,7 @@ def test_csaf_document_given_vulnerability( self.assertEqual(None, csaf.product) self.assertEqual(1, csaf.version) self.assertEqual( - "b4a6c3264182f1e5ae292a7386f169c04d5a0f93ef44c652ef9a97ebee71d0c8", + "191a9c71fc1f1ab976b5d45adeedbc1faf997c43d59ab4977b907b95a9ab003d", csaf.content_hash, ) self.assertEqual("Title", csaf.title) @@ -551,6 +556,7 @@ def test_csaf_document_given_vulnerability( "attachment; filename=csaf_2024_0001_0002.json", response.headers["Content-Disposition"], ) + with open( path.dirname(__file__) + "/files/csaf_given_vulnerability_update.json", "r" ) as testfile: @@ -561,7 +567,7 @@ def test_csaf_document_given_vulnerability( self.assertEqual(None, csaf.product) self.assertEqual(2, csaf.version) self.assertEqual( - "b3d5d54c989a8906100d2dcb4ccc8078d3daea6ad323ba52e55d1aa8c3c61771", + "25495e803982bde094cd1f337f48c9740cd0250f0b04a9c5af3a6cdb72640184", csaf.content_hash, ) self.assertEqual("Title", csaf.title) diff --git a/backend/unittests/vex/api/test_views_openvex.py b/backend/unittests/vex/api/test_views_openvex.py index fd2274edb..d4d5dccf1 100644 --- a/backend/unittests/vex/api/test_views_openvex.py +++ b/backend/unittests/vex/api/test_views_openvex.py @@ -79,7 +79,7 @@ def test_openvex_document_product_no_branch( self.assertEqual(Product.objects.get(id=1), openvex.product) self.assertEqual(1, openvex.version) self.assertEqual( - "7feb7c735c24a76887d877709b7ecf0dd4444892e75c1345d7a5b3024f36feac", + "2349866f922095e32c824029bffedd6a5d3a94fb48385879840542cee7a8528f", openvex.content_hash, ) self.assertEqual("https://vex.example.com", openvex.id_namespace) @@ -159,7 +159,7 @@ def test_openvex_document_product_no_branch( self.assertEqual(Product.objects.get(id=1), openvex.product) self.assertEqual(2, openvex.version) self.assertEqual( - "16c17dda22d8eac14b003b0c4cbce1c8b7b5a3a577720d6430f588a93e48c044", + "eb2c932985b9f3100a175f9d1640162aa073af950a2275220fbe1d7edafbfb53", openvex.content_hash, ) self.assertEqual("https://vex.example.com", openvex.id_namespace) @@ -232,7 +232,7 @@ def test_openvex_document_product_branches( self.assertEqual(Product.objects.get(id=2), openvex.product) self.assertEqual(1, openvex.version) self.assertEqual( - "94b35adc77df02b3ce5faf3e0892ca294cc97ac5c469a3f0c619cd47ebec53d8", + "881f388d3f22c81060697db0af4660cbf787f95567414572e3fbc3807ce10309", openvex.content_hash, ) self.assertEqual("https://vex.example.com", openvex.id_namespace) @@ -306,7 +306,7 @@ def test_openvex_document_product_given_branch( self.assertEqual(Product.objects.get(id=2), openvex.product) self.assertEqual(1, openvex.version) self.assertEqual( - "398407e8135486b39c7a14b1100b449fc19c39e76e64152c7ff706efb451582b", + "6a23e9f89f7128b0af35856153657ad7368e1311989a5cce0885e54da4ce7bd2", openvex.content_hash, ) self.assertEqual("https://vex.example.com", openvex.id_namespace) @@ -380,7 +380,7 @@ def test_openvex_document_given_vulnerability( self.assertEqual(None, openvex.product) self.assertEqual(1, openvex.version) self.assertEqual( - "acf86c76016f0c1753dbcdd32bc10f3023ab3d2548380a1cd1c1b58c87b50c1d", + "06008cc75b1a9fdf51bbd7e876c2be85ed0cf4d0162947c9bca3068267f340c4", openvex.content_hash, ) self.assertEqual("https://vex.example.com", openvex.id_namespace) @@ -458,7 +458,7 @@ def test_openvex_document_given_vulnerability( self.assertEqual(None, openvex.product) self.assertEqual(2, openvex.version) self.assertEqual( - "01c46b464b562c39734cd5d273867e65f9d01f2ac23d370b71679196cf97bc13", + "8e6638435007780014a05d1b8a568db18a50c16ebc89f8bab32a08a87b0ea4ba", openvex.content_hash, ) self.assertEqual("https://vex.example.com", openvex.id_namespace) From 9a9f7cf934911541a724a3c5558f82cb53e0d034 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:06:42 +0100 Subject: [PATCH 76/82] chore(deps): update dependency vite to v6 (#2272) * chore(deps): update dependency vite to v6 * fix: add missing package --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Stefan Fleckenstein --- frontend/package-lock.json | 310 +++++++++++++++++++++---------------- frontend/package.json | 3 +- 2 files changed, 179 insertions(+), 134 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b11e52b99..1e4f2e12a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -56,7 +56,8 @@ "prettier": "3.4.2", "rewire": "7.0.0", "typescript": "5.7.2", - "vite": "5.4.11" + "vite": "6.0.5", + "yaml": "2.6.1" } }, "lib/runtime-env-cra": { @@ -608,9 +609,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -621,13 +622,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -638,13 +639,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -655,13 +656,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -672,13 +673,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -689,13 +690,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -706,13 +707,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -723,13 +724,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -740,13 +741,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -757,13 +758,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -774,13 +775,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -791,13 +792,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -808,13 +809,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -825,13 +826,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -842,13 +843,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -859,13 +860,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -876,13 +877,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -893,13 +894,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -910,13 +911,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -927,13 +945,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -944,13 +962,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -961,13 +979,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -978,13 +996,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -995,7 +1013,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -3942,6 +3960,15 @@ "node": ">=10" } }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", @@ -4871,9 +4898,9 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4881,32 +4908,33 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/escalade": { @@ -8953,21 +8981,21 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.5.tgz", + "integrity": "sha512-akD5IAH/ID5imgue2DYhzsEwCi0/4VKY31uhMLEYJwPP4TiUp8pL5PIK+Wo7H8qT8JY9i+pVfPydcFPYD1EL7g==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -8976,19 +9004,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -9009,6 +9043,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -9230,12 +9270,16 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yargs": { diff --git a/frontend/package.json b/frontend/package.json index c5414739f..a1380f1f6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -65,6 +65,7 @@ "prettier": "3.4.2", "rewire": "7.0.0", "typescript": "5.7.2", - "vite": "5.4.11" + "vite": "6.0.5", + "yaml": "2.6.1" } } From ad357bb7fd5652b688f8a955244332a5961f59ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 18:24:12 +0100 Subject: [PATCH 77/82] chore(deps): lock file maintenance (#2348) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/poetry.lock | 6 +- frontend/package-lock.json | 1117 ++++++++++++++++++------------------ 2 files changed, 572 insertions(+), 551 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index 8f81a0799..d59dc207b 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -76,13 +76,13 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "3.3.7" +version = "3.3.6" description = "An abstract syntax tree for Python with inference support." optional = true python-versions = ">=3.9.0" files = [ - {file = "astroid-3.3.7-py3-none-any.whl", hash = "sha256:e1ea2c358a3c760ef583d4963e773100fa2c693b27ed158a1d0e81adb4436903"}, - {file = "astroid-3.3.7.tar.gz", hash = "sha256:29fe1df7ef64dc17a54dbfad67b40b445340fcdba7c4012e7ecc9270c9b2f5b6"}, + {file = "astroid-3.3.6-py3-none-any.whl", hash = "sha256:db676dc4f3ae6bfe31cda227dc60e03438378d7a896aec57422c95634e8d722f"}, + {file = "astroid-3.3.6.tar.gz", hash = "sha256:6aaea045f938c735ead292204afdb977a36e989522b7833ef6fea94de743f442"}, ] [package.dependencies] diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1e4f2e12a..84b95094d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -418,9 +418,9 @@ } }, "node_modules/@braintree/sanitize-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", - "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", "license": "MIT" }, "node_modules/@chevrotain/cst-dts-gen": { @@ -1316,9 +1316,9 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.2.0.tgz", - "integrity": "sha512-9A5eZQV9eKlNCXlI/SgYsGRS7YmGmB1oAsRpNVIYBmIzGJRgH+hfG+lo4069s+GFWFNnBAtDg10c53vQZBLfnA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.2.1.tgz", + "integrity": "sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==", "license": "MIT", "dependencies": { "@antfu/install-pkg": "^0.4.1", @@ -1594,9 +1594,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.16.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.11.tgz", - "integrity": "sha512-2eVDGg9OvIXNRmfDUQyKYH+jNcjdv1JkCH5F2YDgUye5fMX5nxGiYHAUe1BXaXyDMaLSwXC7LRksEKMiIQsFdw==", + "version": "5.16.12", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.12.tgz", + "integrity": "sha512-rkN+bPpe2Xn8h4ZLqKy5JsZt3nzMyTJ2ySdyLHHf0IL+PrxS46dxOIC1i66R8qi14kJBHfy7Byqv1yUvpwf0iw==", "license": "MIT", "funding": { "type": "opencollective", @@ -1604,9 +1604,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "5.16.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.11.tgz", - "integrity": "sha512-LjIiDVGGPzessDd5uSGFYZNqrXqECLiJ9hESE6Xkk8CtGTN2m2h6iImKJpkoryNXYxulv87WLeqfTMWAfA4Igg==", + "version": "5.16.12", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.12.tgz", + "integrity": "sha512-4Ocmbl1uzkWxAdYYARCLySJNqALgrJ+Fdr95FLpKZV7zMZxyoJRdPTO/CgUxjFjlj9Sy2Gi7j3HX4f5HS2GLeQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9" @@ -1630,22 +1630,22 @@ } }, "node_modules/@mui/material": { - "version": "5.16.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.11.tgz", - "integrity": "sha512-uoc67oecKdnVKaMHBVE433YrMuxQs22xY5nIjRb5sAPB+GaeZQWp8brQ3/adeH6k2IDa8+9i2IVd4fNLuvHSvA==", + "version": "5.16.12", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.12.tgz", + "integrity": "sha512-+M0UPy0xa9xGo8TV1vp9Mmf85TNUqpk7OoSiw+BaZf3D584S3aqfl+CL+EBTt9t52A97GnCjVNvXTO7hmLqhHw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/core-downloads-tracker": "^5.16.11", - "@mui/system": "^5.16.8", + "@mui/core-downloads-tracker": "^5.16.12", + "@mui/system": "^5.16.12", "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.8", + "@mui/utils": "^5.16.12", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1", - "react-is": "^18.3.1", + "react-is": "^19.0.0", "react-transition-group": "^4.4.5" }, "engines": { @@ -1674,14 +1674,20 @@ } } }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, "node_modules/@mui/private-theming": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.8.tgz", - "integrity": "sha512-3Vl9yFVLU6T3CFtxRMQTcJ60Ijv7wxQi4yjH92+9YXcsqvVspeIYoocqNoIV/1bXGYfyWu5zrCmwQVHaGY7bug==", + "version": "5.16.12", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.12.tgz", + "integrity": "sha512-hhLTSZxsazwZZ4bUAKgFcbsnfCrwizSnJI7/bXf/R9/tZkZBy+bKY05/Au/bIgGKzuZ4KTlKlPn+U/uufEXrNw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.16.8", + "@mui/utils": "^5.16.12", "prop-types": "^15.8.1" }, "engines": { @@ -1702,13 +1708,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.8.tgz", - "integrity": "sha512-OFdgFf8JczSRs0kvWGdSn0ZeXxWrY0LITDPJ/nAtLEvUUTyrlFaO4il3SECX8ruzvf1VnAxHx4M/4mX9oOn9yA==", + "version": "5.16.12", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.12.tgz", + "integrity": "sha512-TMf3SN19rkJPh1hQZTjoY8UsJa5qExfr78owwCuEZLjIhsajAYiWmbJzJ8mM3grEWLiP3MziDA4zy4LFNri12Q==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", + "@emotion/cache": "^11.13.5", "csstype": "^3.1.3", "prop-types": "^15.8.1" }, @@ -1734,16 +1740,16 @@ } }, "node_modules/@mui/system": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.8.tgz", - "integrity": "sha512-L32TaFDFpGIi1g6ysRtmhc9zDgrlxDXu3NlrGE8gAsQw/ziHrPdr0PNr20O0POUshA1q14W4dNZ/z0Nx2F9lhA==", + "version": "5.16.12", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.12.tgz", + "integrity": "sha512-rDsndVl0ug0Ex2rZt8x0WIF3Zc0EMFT2TmRVWP4jzk38aLS6WsxryXAZUQa0BKEnB3vfx1pSP/xa44TdKQ94dg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.16.8", - "@mui/styled-engine": "^5.16.8", + "@mui/private-theming": "^5.16.12", + "@mui/styled-engine": "^5.16.12", "@mui/types": "^7.2.15", - "@mui/utils": "^5.16.8", + "@mui/utils": "^5.16.12", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1774,9 +1780,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.19", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.19.tgz", - "integrity": "sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==", + "version": "7.2.20", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.20.tgz", + "integrity": "sha512-straFHD7L8v05l/N5vcWk+y7eL9JF0C2mtph/y4BPm3gn2Eh61dDwDB65pa8DLss3WJfDXYC7Kx5yjP0EmXpgw==", "license": "MIT", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1788,9 +1794,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.8.tgz", - "integrity": "sha512-P/yb7BSWallQUeiNGxb+TM8epHteIUC8gzNTdPV2VfKhVY/EnGliHgt5np0GPkjQ7EzwDi/+gBevrAJtf+K94A==", + "version": "5.16.12", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.12.tgz", + "integrity": "sha512-p3JAq7nA0ur8M/zLnBvR6ZeAjM8mD4LnPdKfsJAYPS26w4eDQjQzl55XvoOmch2MeXhmWaO4Pkvs/xurrISNBw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", @@ -1798,7 +1804,7 @@ "@types/prop-types": "^15.7.12", "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.3.1" + "react-is": "^19.0.0" }, "engines": { "node": ">=12.0.0" @@ -1817,6 +1823,12 @@ } } }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1881,9 +1893,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", + "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", "cpu": [ "arm" ], @@ -1895,9 +1907,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", + "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", "cpu": [ "arm64" ], @@ -1909,9 +1921,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", + "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", "cpu": [ "arm64" ], @@ -1923,9 +1935,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", + "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", "cpu": [ "x64" ], @@ -1937,9 +1949,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", + "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", "cpu": [ "arm64" ], @@ -1951,9 +1963,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", + "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", "cpu": [ "x64" ], @@ -1965,9 +1977,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", + "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", "cpu": [ "arm" ], @@ -1979,9 +1991,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", + "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", "cpu": [ "arm" ], @@ -1993,9 +2005,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", + "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", "cpu": [ "arm64" ], @@ -2007,9 +2019,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", + "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", "cpu": [ "arm64" ], @@ -2021,9 +2033,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", + "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", "cpu": [ "loong64" ], @@ -2035,9 +2047,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", + "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", "cpu": [ "ppc64" ], @@ -2049,9 +2061,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", + "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", "cpu": [ "riscv64" ], @@ -2063,9 +2075,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", + "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", "cpu": [ "s390x" ], @@ -2077,9 +2089,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", + "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", "cpu": [ "x64" ], @@ -2091,9 +2103,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", + "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", "cpu": [ "x64" ], @@ -2105,9 +2117,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", + "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", "cpu": [ "arm64" ], @@ -2119,9 +2131,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", + "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", "cpu": [ "ia32" ], @@ -2133,9 +2145,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", + "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", "cpu": [ "x64" ], @@ -2147,9 +2159,9 @@ ] }, "node_modules/@tanstack/query-core": { - "version": "5.62.7", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.7.tgz", - "integrity": "sha512-fgpfmwatsrUal6V+8EC2cxZIQVl9xvL7qYa03gsdsCy985UTUlS4N+/3hCzwR0PclYDqisca2AqR1BVgJGpUDA==", + "version": "5.62.9", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.9.tgz", + "integrity": "sha512-lwePd8hNYhyQ4nM/iRQ+Wz2cDtspGeZZHFZmCzHJ7mfKXt+9S301fULiY2IR2byJYY6Z03T427E5PoVfMexHjw==", "license": "MIT", "funding": { "type": "github", @@ -2157,12 +2169,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.62.7", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.7.tgz", - "integrity": "sha512-+xCtP4UAFDTlRTYyEjLx0sRtWyr5GIk7TZjZwBu4YaNahi3Rt2oMyRqfpfVrtwsqY2sayP4iXVCwmC+ZqqFmuw==", + "version": "5.62.9", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.9.tgz", + "integrity": "sha512-jFUH9pOsOyN2ugGIR8tjz2+bRC0PEp25LvpNvYIgiEegP5Xbfi9phuNOMnjFugyg3GM0WI/HfUEE7eM2vmcbxg==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.62.7" + "@tanstack/query-core": "5.62.9" }, "funding": { "type": "github", @@ -2191,9 +2203,9 @@ } }, "node_modules/@tiptap/core": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.10.3.tgz", - "integrity": "sha512-wAG/0/UsLeZLmshWb6rtWNXKJftcmnned91/HLccHVQAuQZ1UWH+wXeQKu/mtodxEO7JcU2mVPR9mLGQkK0McQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.10.4.tgz", + "integrity": "sha512-fExFRTRgb6MSpg2VvR5qO2dPTQAZWuUoU4UsBCurIVcPWcyVv4FG1YzgMyoLDKy44rebFtwUGJbfU9NzX7Q/bA==", "license": "MIT", "funding": { "type": "github", @@ -2204,9 +2216,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.3.tgz", - "integrity": "sha512-u9Mq4r8KzoeGVT8ms6FQDIMN95dTh3TYcT7fZpwcVM96mIl2Oyt+Bk66mL8z4zuFptfRI57Cu9QdnHEeILd//w==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.4.tgz", + "integrity": "sha512-4JSwAM3B92YWvGzu/Vd5rovPrCGwLSaSLD5rxcLyfxLSrTDQd3n7lp78pzVgGhunVECzaGF5A0ByWWpEyS0a3w==", "license": "MIT", "funding": { "type": "github", @@ -2217,9 +2229,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.3.tgz", - "integrity": "sha512-xnF1tS2BsORenr11qyybW120gHaeHKiKq+ZOP14cGA0MsriKvWDnaCSocXP/xMEYHy7+2uUhJ0MsKkHVj4bPzQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.4.tgz", + "integrity": "sha512-SdO4oFQKaERCGfwOc1CLYQRtThENam2KWfWmvpsymknokt5qYzU57ft0SE1HQV9vVYEzZ9HrWIgv2xrgu0g9kg==", "license": "MIT", "funding": { "type": "github", @@ -2230,9 +2242,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.10.3.tgz", - "integrity": "sha512-e9a4yMjQezuKy0rtyyzxbV2IAE1bm1PY3yoZEFrcaY0o47g1CMUn2Hwe+9As2HdntEjQpWR7NO1mZeKxHlBPYA==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.10.4.tgz", + "integrity": "sha512-GVtZwJaQyLBptMsmDtYl5GEobd1Uu7C9sc9Z+PdXwMuxmFfg+j07bCKCj5JJj/tjgXCSLVxWdTlDHxNrgzQHjw==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2247,9 +2259,9 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.3.tgz", - "integrity": "sha512-PTkwJOVlHi4RR4Wrs044tKMceweXwNmWA6EoQ93hPUVtQcwQL990Es5Izp+i88twTPLuGD9dH+o9QDyH9SkWdA==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.4.tgz", + "integrity": "sha512-JVwDPgOBYRU2ivaadOh4IaQYXQEiSw6sB36KT/bwqJF2GnEvLiMwptdRMn9Uuh6xYR3imjIZtV6uZAoneZdd6g==", "license": "MIT", "funding": { "type": "github", @@ -2260,9 +2272,9 @@ } }, "node_modules/@tiptap/extension-code": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.3.tgz", - "integrity": "sha512-JyLbfyY3cPctq9sVdpcRWTcoUOoq3/MnGE1eP6eBNyMTHyBPcM9TPhOkgj+xkD1zW/884jfelB+wa70RT/AMxQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.4.tgz", + "integrity": "sha512-Vj/N0nbSQiV1o7X7pRySK9Fu72Dd266gm27TSlsts6IwJu5MklFvz7ezJUWoLjt2wmCV8/U/USmk/39ic9qjvg==", "license": "MIT", "funding": { "type": "github", @@ -2273,9 +2285,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.3.tgz", - "integrity": "sha512-yiDVNg22fYkzsFk5kBlDSHcjwVJgajvO/M5fDXA+Hfxwo2oNcG6aJyyHXFe+UaXTVjdkPej0J6kcMKrTMCiFug==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.4.tgz", + "integrity": "sha512-qS4jnbJqghNMT2+B+GQ807ATgqkL9OQ//NlL+ZwVSe+DPDduNA9B6IB9SrWENDfOnzekpi7kcEcm+RenELARRQ==", "license": "MIT", "funding": { "type": "github", @@ -2287,9 +2299,9 @@ } }, "node_modules/@tiptap/extension-color": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.10.3.tgz", - "integrity": "sha512-FC2hPMSQ4w9UmO9kJCAdoU7gHpDbJ6MeJAmikB9EPp16dbGwFLrZm9TZ/4pv74fGfVm0lv720316ALOEgPEDjQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-2.10.4.tgz", + "integrity": "sha512-LgYECcWnTfonqzTUJQN+ujNlWQahGg4G6typRR44opNxwGTlmXHjc6h/JwgLiYxSMZke3EDP/17BSQDH9MMrIA==", "license": "MIT", "funding": { "type": "github", @@ -2301,9 +2313,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.10.3.tgz", - "integrity": "sha512-6i8+xbS2zB6t8iFzli1O/QB01MmwyI5Hqiiv4m5lOxqavmJwLss2sRhoMC2hB3CyFg5UmeODy/f/RnI6q5Vixg==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.10.4.tgz", + "integrity": "sha512-1Pqrl6Rr9bVEHJ3zO2dM7UUA0Qn/r70JQ9YLlestjW1sbMaMuY3Ifvu2uSyUE7SAGV3gvxwNVQCrv8f0VlVEaA==", "license": "MIT", "funding": { "type": "github", @@ -2314,9 +2326,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.3.tgz", - "integrity": "sha512-wzWf82ixWzZQr0hxcf/A0ul8NNxgy1N63O+c56st6OomoLuKUJWOXF+cs9O7V+/5rZKWdbdYYoRB5QLvnDBAlQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.4.tgz", + "integrity": "sha512-0XEM/yNLaMc/sZlYOau7XpHyYiHT9LwXUe7kmze/L8eowIa/iLvmRbcnUd3rtlZ7x7wooE6UO9c7OtlREg4ZBw==", "license": "MIT", "funding": { "type": "github", @@ -2328,9 +2340,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.10.3.tgz", - "integrity": "sha512-Prg8rYLxeyzHxfzVu1mDkkUWMnD9ZN3y370O/1qy55e+XKVw9jFkTSuz0y0+OhMJG6bulYpDUMtb+N3+2xOWlQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.10.4.tgz", + "integrity": "sha512-K2MDiu6CwQ7+Jr6g1Lh3Tuxm1L6SefSHMpQO0UW3aRGwgEV5pjlrztnBFX4K9b7MNuQ4dJGCUK9u8Cv7Xss0qg==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2345,9 +2357,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.3.tgz", - "integrity": "sha512-FskZi2DqDSTH1WkgLF2OLy0xU7qj3AgHsKhVsryeAtld4jAK5EsonneWgaipbz0e/MxuIvc1oyacfZKABpLaNg==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.4.tgz", + "integrity": "sha512-KbJfoaqTZePpkWAN+klpK5j0UVtELxN7H5B0J556/UCB/rnq+OsdEFHPks2Ss9TidqWzRUqcxUE50UZ7b8h7Ug==", "license": "MIT", "funding": { "type": "github", @@ -2359,9 +2371,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.3.tgz", - "integrity": "sha512-2rFlimUKAgKDwT6nqAMtPBjkrknQY8S7oBNyIcDOUGyFkvbDUl3Jd0PiC929S5F3XStJRppnMqhpNDAlWmvBLA==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.4.tgz", + "integrity": "sha512-nW9wubW1A/CO2Ssn9wNMP08tR9Oarg9VUGzJ5qNuz38DDNyntE1SyDS+XStkeMq5nKqJ3YKhukyAJH/PiRq4Mg==", "license": "MIT", "funding": { "type": "github", @@ -2372,9 +2384,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.10.3.tgz", - "integrity": "sha512-AlxXXPCWIvw8hQUDFRskasj32iMNB8Sb19VgyFWqwvntGs2/UffNu8VdsVqxD2HpZ0g5rLYCYtSW4wigs9R3og==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.10.4.tgz", + "integrity": "sha512-7D0h0MIvE97Gx3Qwuo2xnPDK07WfCnyh4tpOPBOus4e1g6sgxVkwDwhbkYWiwvIrf4BUVJflnke/DEDCVp6/Eg==", "license": "MIT", "funding": { "type": "github", @@ -2385,9 +2397,9 @@ } }, "node_modules/@tiptap/extension-highlight": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.10.3.tgz", - "integrity": "sha512-srMOdpUTcp1yPGmUqgKOkbmTpCYOF6Q/8CnquDkhrvK7Gyphj+n8TocrKiloaRYZKcoQWtmb+kcVPaHhHMzsWQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.10.4.tgz", + "integrity": "sha512-0E/eK+eKx7I7UotELKPFsL/jiWFVtAkyXvcs1+OzcCr8ao2M6t5hGKh0McBG4WUQdxttnIwfQemGzIHU25pDog==", "license": "MIT", "funding": { "type": "github", @@ -2398,9 +2410,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.3.tgz", - "integrity": "sha512-HaSiMdx9Im9Pb9qGlVud7W8bweRDRMez33Uzs5a2x0n1RWkelfH7TwYs41Y3wus8Ujs7kw6qh7jyhvPpQBKaSA==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.4.tgz", + "integrity": "sha512-fg6BNxbpMMtgKaiNI/GLcCzkxIQMwSYBhO9LA0CxLvmsWGU+My4r9W3DK6HwNoRJ9+6OleDPSLo1P73fbSTtEA==", "license": "MIT", "funding": { "type": "github", @@ -2412,9 +2424,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.3.tgz", - "integrity": "sha512-1a2IWhD00tgUNg/91RLnBvfENL7DLCui5L245+smcaLu+OXOOEpoBHawx59/M4hEpsjqvRRM79TzO9YXfopsPw==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.4.tgz", + "integrity": "sha512-s9ycm/BOGoW3L0Epnj541vdngHbFbMM488HoODd1CmVSw1C+wBWFgsukgqKjlyE3VGfZXuSb1ur9zinW0RiLJQ==", "license": "MIT", "funding": { "type": "github", @@ -2426,9 +2438,9 @@ } }, "node_modules/@tiptap/extension-image": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.10.3.tgz", - "integrity": "sha512-YIjAF5CwDkMe28OQ5pvnmdRgbJ9JcGMIHY1kyqNunSf2iwphK+6SWz9UEIkDFiT7AsRZySqxFSq93iK1XyTifw==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-2.10.4.tgz", + "integrity": "sha512-fPdAqP4M1zwz5jyrQNIEL4OvvGeJso45svaaBLV342yRLOpbVIgAp/RsuWSGDQTUWoGhdkHdIrbH2bUGNEbMBg==", "license": "MIT", "funding": { "type": "github", @@ -2439,9 +2451,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.3.tgz", - "integrity": "sha512-wAiO6ZxoHx2H90phnKttLWGPjPZXrfKxhOCsqYrK8BpRByhr48godOFRuGwYnKaiwoVjpxc63t+kDJDWvqmgMw==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.4.tgz", + "integrity": "sha512-8MIQ+wsbyxNCZDCFTVTOXrS2AvFyOhtlBNgVU2+6r6xnJV4AcfEA3qclysqrjOlL117ped/nzDeoB0AeX0CI+Q==", "license": "MIT", "funding": { "type": "github", @@ -2452,9 +2464,9 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.3.tgz", - "integrity": "sha512-8esKlkZBzEiNcpt7I8Cd6l1mWmCc/66pPbUq9LfnIniDXE3U+ahBf4m3TJltYFBGbiiTR/xqMtJyVHOpuLDtAw==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.4.tgz", + "integrity": "sha512-9lbtMUPc9IYCRMKV/B4k/no9J5OQQl/jJn9W2ce3NjJZSrOjuZs0CjJZgCESIaj6911s7nEJUvxKKmsbD3UC3Q==", "license": "MIT", "dependencies": { "linkifyjs": "^4.1.0" @@ -2469,9 +2481,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.3.tgz", - "integrity": "sha512-9sok81gvZfSta2K1Dwrq5/HSz1jk4zHBpFqCx0oydzodGslx6X1bNxdca+eXJpXZmQIWALK7zEr4X8kg3WZsgw==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.4.tgz", + "integrity": "sha512-8K3WUD5fPyw2poQKnJGGm7zlfeIbpld92+SRF4M9wkp95EzvgexTlodvxlrL3i8zKXcQQVyExWA8kCcGPFb9bA==", "license": "MIT", "funding": { "type": "github", @@ -2482,9 +2494,9 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.3.tgz", - "integrity": "sha512-/SFuEDnbJxy3jvi72LeyiPHWkV+uFc0LUHTUHSh20vwyy+tLrzncJfXohGbTIv5YxYhzExQYZDRD4VbSghKdlw==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.4.tgz", + "integrity": "sha512-NaeEu+qFG2O0emc8WlwOM7DKNKOaqHWuNkuKrrmQzslgL+UQSEGlGMo6NEJ5sLLckPBDpIa0MuRm30407JE+cg==", "license": "MIT", "funding": { "type": "github", @@ -2495,9 +2507,9 @@ } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.3.tgz", - "integrity": "sha512-sNkTX/iN+YoleDiTJsrWSBw9D7c4vsYwnW5y/G5ydfuJMIRQMF78pWSIWZFDRNOMkgK5UHkhu9anrbCFYgBfaA==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.4.tgz", + "integrity": "sha512-SRNVhT8OXqjpZtcyuOtofbtOpXXFrQrjqqCc/yXebda//2SfUTOvB16Lss77vQOWi6xr7TF1mZuowJgSTkcczw==", "license": "MIT", "funding": { "type": "github", @@ -2508,9 +2520,9 @@ } }, "node_modules/@tiptap/extension-placeholder": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.10.3.tgz", - "integrity": "sha512-0OkwnDLguZgoiJM85cfnOySuMmPUF7qqw7DHQ+c3zwTAYnvzpvqrvpupc+2Zi9GfC1sDgr+Ajrp8imBHa6PHfA==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-2.10.4.tgz", + "integrity": "sha512-leWG4xP7cvddR6alGZS7yojOh9941bxehgAeQDLlEisaJcNa2Od5Vbap2zipjc5sXMxZakQVChL27oH1wWhHkQ==", "license": "MIT", "funding": { "type": "github", @@ -2522,9 +2534,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.3.tgz", - "integrity": "sha512-jYoPy6F6njYp3txF3u23bgdRy/S5ATcWDO9LPZLHSeikwQfJ47nqb+EUNo5M8jIOgFBTn4MEbhuZ6OGyhnxopA==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.4.tgz", + "integrity": "sha512-OibipsomFpOJWTPVX/z4Z53HgwDA93lE/loHGa+ONJfML1dO6Zd6UTwzaVO1/g8WOwRgwkYu/6JnhxLKRlP8Lg==", "license": "MIT", "funding": { "type": "github", @@ -2535,9 +2547,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.3.tgz", - "integrity": "sha512-7p9XiRprsRZm8y9jvF/sS929FCELJ5N9FQnbzikOiyGNUx5mdI+exVZlfvBr9xOD5s7fBLg6jj9Vs0fXPNRkPg==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.4.tgz", + "integrity": "sha512-wPdVxCHrIS9S+8n08lgyyqRZPj9FBbyLlFt74/lV5yBC3LOorq1VKdjrTskmaj4jud7ImXoKDyBddAYTHdJ1xw==", "license": "MIT", "funding": { "type": "github", @@ -2548,9 +2560,9 @@ } }, "node_modules/@tiptap/extension-text-align": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.10.3.tgz", - "integrity": "sha512-g75sNl73gtgjP3XIcl06kvv1qw3c0rGEUD848rUU1bvlBpU3IxjkcQLgYvHmv3vpuUp9cKUkA2wa7Sv6R3fjvw==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-align/-/extension-text-align-2.10.4.tgz", + "integrity": "sha512-rt2Hz3N081QAgkKKSMpyDZTKorBmXKpeHkYIw+ArVuvBYhi8x5wVyZgZ2SIMW9A5G4rx1M0czn7xNi+/P3NopQ==", "license": "MIT", "funding": { "type": "github", @@ -2561,9 +2573,9 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.10.3.tgz", - "integrity": "sha512-TalYIdlF7vBA4afFhmido7AORdBbu3sV+HCByda0FiNbM6cjng3Nr9oxHOCVJy+ChqrcgF4m54zDfLmamdyu5Q==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.10.4.tgz", + "integrity": "sha512-ibq7avkcwHyUSG53Hf+P31rrwsKVbbiqbWZM4kXC7M2X3iUwFrtvaa+SWzyWQfE1jl2cCrD1+rfSkj/alcOKGg==", "license": "MIT", "funding": { "type": "github", @@ -2574,9 +2586,9 @@ } }, "node_modules/@tiptap/extension-underline": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.10.3.tgz", - "integrity": "sha512-VeGs0jeNiTnXddHHJEgOc/sKljZiyTEgSSuqMmsBACrr9aGFXbLTgKTvNjkZ9WzSnu7LwgJuBrwEhg8yYixUyQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.10.4.tgz", + "integrity": "sha512-KhlCndQFMe/Gsz+3qkVn9z1utDy8y1igvdePijMjA5B8PTu0hPs2Q1d6szfLTBdtoFNkCokknxzXhSY0OFJEyQ==", "license": "MIT", "funding": { "type": "github", @@ -2587,9 +2599,9 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.3.tgz", - "integrity": "sha512-771p53aU0KFvujvKpngvq2uAxThlEsjYaXcVVmwrhf0vxSSg+psKQEvqvWvHv/3BwkPVCGwmEKNVJZjaXFKu4g==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.4.tgz", + "integrity": "sha512-pZ4NEkRtYoDLe0spARvXZ1N3hNv/5u6vfPdPtEbmNpoOSjSNqDC1kVM+qJY0iaCYpxbxcv7cxn3kBumcFLQpJQ==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.2.1", @@ -2617,13 +2629,13 @@ } }, "node_modules/@tiptap/react": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.10.3.tgz", - "integrity": "sha512-5GBL3arWai8WZuCl1MMA7bT5aWwqDi5AOQhX+hovKjwHvttpKDogRoUBL5k6Eds/eQMBMGTpsfmZlGNiFxSv1g==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.10.4.tgz", + "integrity": "sha512-JTeqDB+xgjo46QC9ILRXe2TcSfxKVRwhZ3vDvYoemN7giRk5a/WsCF1VQIT1fax+tCl6kfv3U1f4Mkx0DkbPkA==", "license": "MIT", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.10.3", - "@tiptap/extension-floating-menu": "^2.10.3", + "@tiptap/extension-bubble-menu": "^2.10.4", + "@tiptap/extension-floating-menu": "^2.10.4", "@types/use-sync-external-store": "^0.0.6", "fast-deep-equal": "^3", "use-sync-external-store": "^1" @@ -2640,32 +2652,32 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.10.3.tgz", - "integrity": "sha512-oq8xdVIMqohSs91ofHSr7i5dCp2F56Lb9aYIAI25lZmwNwQJL2geGOYjMSfL0IC4cQHPylIuSKYCg7vRFdZmAA==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.10.3", - "@tiptap/extension-blockquote": "^2.10.3", - "@tiptap/extension-bold": "^2.10.3", - "@tiptap/extension-bullet-list": "^2.10.3", - "@tiptap/extension-code": "^2.10.3", - "@tiptap/extension-code-block": "^2.10.3", - "@tiptap/extension-document": "^2.10.3", - "@tiptap/extension-dropcursor": "^2.10.3", - "@tiptap/extension-gapcursor": "^2.10.3", - "@tiptap/extension-hard-break": "^2.10.3", - "@tiptap/extension-heading": "^2.10.3", - "@tiptap/extension-history": "^2.10.3", - "@tiptap/extension-horizontal-rule": "^2.10.3", - "@tiptap/extension-italic": "^2.10.3", - "@tiptap/extension-list-item": "^2.10.3", - "@tiptap/extension-ordered-list": "^2.10.3", - "@tiptap/extension-paragraph": "^2.10.3", - "@tiptap/extension-strike": "^2.10.3", - "@tiptap/extension-text": "^2.10.3", - "@tiptap/extension-text-style": "^2.10.3", - "@tiptap/pm": "^2.10.3" + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.10.4.tgz", + "integrity": "sha512-tu/WCs9Mkr5Nt8c3/uC4VvAbQlVX0OY7ygcqdzHGUeG9zP3twdW7o5xM3kyDKR2++sbVzqu5Ll5qNU+1JZvPGQ==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.10.4", + "@tiptap/extension-blockquote": "^2.10.4", + "@tiptap/extension-bold": "^2.10.4", + "@tiptap/extension-bullet-list": "^2.10.4", + "@tiptap/extension-code": "^2.10.4", + "@tiptap/extension-code-block": "^2.10.4", + "@tiptap/extension-document": "^2.10.4", + "@tiptap/extension-dropcursor": "^2.10.4", + "@tiptap/extension-gapcursor": "^2.10.4", + "@tiptap/extension-hard-break": "^2.10.4", + "@tiptap/extension-heading": "^2.10.4", + "@tiptap/extension-history": "^2.10.4", + "@tiptap/extension-horizontal-rule": "^2.10.4", + "@tiptap/extension-italic": "^2.10.4", + "@tiptap/extension-list-item": "^2.10.4", + "@tiptap/extension-ordered-list": "^2.10.4", + "@tiptap/extension-paragraph": "^2.10.4", + "@tiptap/extension-strike": "^2.10.4", + "@tiptap/extension-text": "^2.10.4", + "@tiptap/extension-text-style": "^2.10.4", + "@tiptap/pm": "^2.10.4" }, "funding": { "type": "github", @@ -3446,14 +3458,14 @@ "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -3505,16 +3517,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3524,16 +3536,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3560,20 +3572,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -3680,9 +3691,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -3700,9 +3711,9 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -3744,14 +3755,14 @@ } }, "node_modules/call-bound": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", - "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "get-intrinsic": "^1.2.5" + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -3770,9 +3781,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001688", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", - "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", + "version": "1.0.30001690", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", + "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", "dev": true, "funding": [ { @@ -4502,15 +4513,15 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4520,31 +4531,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -4689,12 +4700,12 @@ } }, "node_modules/dunder-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", - "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" }, @@ -4703,9 +4714,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.73", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", - "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "version": "1.5.75", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.75.tgz", + "integrity": "sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==", "dev": true, "license": "ISC" }, @@ -4737,58 +4748,59 @@ } }, "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "version": "1.23.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", + "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.6", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", + "object.assign": "^4.1.7", "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "safe-array-concat": "^1.1.3", + "safe-regex-test": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -4816,27 +4828,28 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", - "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -5285,9 +5298,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", "dev": true, "license": "ISC", "dependencies": { @@ -5464,16 +5477,18 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -5536,15 +5551,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5643,11 +5658,14 @@ "license": "MIT" }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5822,15 +5840,15 @@ "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -5846,14 +5864,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -5901,13 +5920,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", - "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" }, "engines": { @@ -5931,9 +5950,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -5964,13 +5983,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5990,13 +6010,13 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", - "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -6056,19 +6076,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -6080,13 +6087,13 @@ } }, "node_modules/is-number-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", - "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -6139,13 +6146,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -6155,13 +6162,13 @@ } }, "node_modules/is-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", - "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -6172,15 +6179,15 @@ } }, "node_modules/is-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", - "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "has-symbols": "^1.0.3", - "safe-regex-test": "^1.0.3" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6190,13 +6197,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -6219,27 +6226,30 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6403,9 +6413,9 @@ } }, "node_modules/katex": { - "version": "0.16.15", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.15.tgz", - "integrity": "sha512-yE9YJIEAk2aZ+FL/G8r+UGw0CTUzEA8ZFy6E+8tc3spHUKq3qBnzCkI1CQwGoI9atJhVyFPEypQsTY7mJ1Pi9w==", + "version": "0.16.18", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.18.tgz", + "integrity": "sha512-LRuk0rPdXrecAFwQucYjMiIs0JFefk6N1q/04mlw14aVIVgxq1FO0MA9RiIIGVaKOB5GIP5GH4aBBNraZERmaQ==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" @@ -6620,9 +6630,9 @@ } }, "node_modules/math-intrinsics": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", - "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -6823,15 +6833,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -6875,13 +6887,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -6971,9 +6984,9 @@ } }, "node_modules/package-manager-detector": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.7.tgz", - "integrity": "sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.8.tgz", + "integrity": "sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==", "license": "MIT" }, "node_modules/parent-module": { @@ -7738,9 +7751,9 @@ } }, "node_modules/react-hook-form": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.0.tgz", - "integrity": "sha512-PS05+UQy/IdSbJNojBypxAo9wllhHgGmyr8/dyGQcPoiMf3e7Dfb9PWYVRco55bLbxH9S+1yDDJeTdlYCSxO3A==", + "version": "7.54.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz", + "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -7783,9 +7796,9 @@ } }, "node_modules/react-router": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.0.tgz", - "integrity": "sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==", + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.1.tgz", + "integrity": "sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==", "license": "MIT", "dependencies": { "@remix-run/router": "1.21.0" @@ -7798,13 +7811,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.0.tgz", - "integrity": "sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==", + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.1.tgz", + "integrity": "sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==", "license": "MIT", "dependencies": { "@remix-run/router": "1.21.0", - "react-router": "6.28.0" + "react-router": "6.28.1" }, "engines": { "node": ">=14.0.0" @@ -7831,20 +7844,20 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", - "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", + "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.0", - "es-abstract": "^1.23.5", + "dunder-proto": "^1.0.1", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", + "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", - "which-builtin-type": "^1.2.0" + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -7904,18 +7917,21 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8157,9 +8173,9 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", + "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", "dev": true, "license": "MIT", "dependencies": { @@ -8173,25 +8189,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.29.1", + "@rollup/rollup-android-arm64": "4.29.1", + "@rollup/rollup-darwin-arm64": "4.29.1", + "@rollup/rollup-darwin-x64": "4.29.1", + "@rollup/rollup-freebsd-arm64": "4.29.1", + "@rollup/rollup-freebsd-x64": "4.29.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", + "@rollup/rollup-linux-arm-musleabihf": "4.29.1", + "@rollup/rollup-linux-arm64-gnu": "4.29.1", + "@rollup/rollup-linux-arm64-musl": "4.29.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", + "@rollup/rollup-linux-riscv64-gnu": "4.29.1", + "@rollup/rollup-linux-s390x-gnu": "4.29.1", + "@rollup/rollup-linux-x64-gnu": "4.29.1", + "@rollup/rollup-linux-x64-musl": "4.29.1", + "@rollup/rollup-win32-arm64-msvc": "4.29.1", + "@rollup/rollup-win32-ia32-msvc": "4.29.1", + "@rollup/rollup-win32-x64-msvc": "4.29.1", "fsevents": "~2.3.2" } }, @@ -8278,15 +8294,15 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -8510,24 +8526,25 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8784,32 +8801,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8819,19 +8836,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", - "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "reflect.getprototypeof": "^1.0.6" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -8888,16 +8905,19 @@ "license": "MIT" }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9133,17 +9153,17 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", - "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.0", - "is-number-object": "^1.1.0", - "is-string": "^1.1.0", - "is-symbol": "^1.1.0" + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -9153,25 +9173,25 @@ } }, "node_modules/which-builtin-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", - "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", + "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", + "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -9200,16 +9220,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", - "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { From 9625d212ba696a937ea1e8190295623a6103ed2c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 21:51:42 +0100 Subject: [PATCH 78/82] chore(deps): update typescript-eslint monorepo to v8.18.2 (#2370) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 88 +++++++++++++++++++------------------- frontend/package.json | 4 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 84b95094d..aa3eee15e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -45,8 +45,8 @@ "@types/react": "18.3.18", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.18.1", - "@typescript-eslint/parser": "8.18.1", + "@typescript-eslint/eslint-plugin": "8.18.2", + "@typescript-eslint/parser": "8.18.2", "@vitejs/plugin-react": "4.3.4", "eslint": "9.17.0", "eslint-plugin-react": "7.37.2", @@ -3143,17 +3143,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", - "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.2.tgz", + "integrity": "sha512-adig4SzPLjeQ0Tm+jvsozSGiCliI2ajeURDGHjZ2llnA+A67HihCQ+a3amtPhUakd1GlwHxSRvzOZktbEvhPPg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/type-utils": "8.18.1", - "@typescript-eslint/utils": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/scope-manager": "8.18.2", + "@typescript-eslint/type-utils": "8.18.2", + "@typescript-eslint/utils": "8.18.2", + "@typescript-eslint/visitor-keys": "8.18.2", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -3173,16 +3173,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", - "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.2.tgz", + "integrity": "sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/scope-manager": "8.18.2", + "@typescript-eslint/types": "8.18.2", + "@typescript-eslint/typescript-estree": "8.18.2", + "@typescript-eslint/visitor-keys": "8.18.2", "debug": "^4.3.4" }, "engines": { @@ -3198,14 +3198,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", - "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.2.tgz", + "integrity": "sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1" + "@typescript-eslint/types": "8.18.2", + "@typescript-eslint/visitor-keys": "8.18.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3216,14 +3216,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", - "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.2.tgz", + "integrity": "sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/typescript-estree": "8.18.2", + "@typescript-eslint/utils": "8.18.2", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3240,9 +3240,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", - "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.2.tgz", + "integrity": "sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==", "dev": true, "license": "MIT", "engines": { @@ -3254,14 +3254,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", - "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.2.tgz", + "integrity": "sha512-WXAVt595HjpmlfH4crSdM/1bcsqh+1weFRWIa9XMTx/XHZ9TCKMcr725tLYqWOgzKdeDrqVHxFotrvWcEsk2Tg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/types": "8.18.2", + "@typescript-eslint/visitor-keys": "8.18.2", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3307,16 +3307,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", - "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.2.tgz", + "integrity": "sha512-Cr4A0H7DtVIPkauj4sTSXVl+VBWewE9/o40KcF3TV9aqDEOWoXF3/+oRXNby3DYzZeCATvbdksYsGZzplwnK/Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1" + "@typescript-eslint/scope-manager": "8.18.2", + "@typescript-eslint/types": "8.18.2", + "@typescript-eslint/typescript-estree": "8.18.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3331,13 +3331,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", - "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.2.tgz", + "integrity": "sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/types": "8.18.2", "eslint-visitor-keys": "^4.2.0" }, "engines": { diff --git a/frontend/package.json b/frontend/package.json index a1380f1f6..fee4093f1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -54,8 +54,8 @@ "@types/react": "18.3.18", "@types/react-dom": "18.3.5", "@types/recharts": "1.8.29", - "@typescript-eslint/eslint-plugin": "8.18.1", - "@typescript-eslint/parser": "8.18.1", + "@typescript-eslint/eslint-plugin": "8.18.2", + "@typescript-eslint/parser": "8.18.2", "@vitejs/plugin-react": "4.3.4", "eslint": "9.17.0", "eslint-plugin-react": "7.37.2", From f84ea166ad6ef97900f8c7e33dbfd5c44b8aaca3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 22:01:08 +0100 Subject: [PATCH 79/82] chore(deps): update maibornwolff/secobserve_actions_templates digest to e2d75f0 (#2369) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/build_push_dev.yml | 2 +- .github/workflows/build_push_release.yml | 4 ++-- .github/workflows/check_licenses_dev.yml | 4 ++-- .github/workflows/check_vulnerabilities.yml | 2 +- .github/workflows/scan_sca_current.yml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_push_dev.yml b/.github/workflows/build_push_dev.yml index 7b5ee348c..f4e93a948 100644 --- a/.github/workflows/build_push_dev.yml +++ b/.github/workflows/build_push_dev.yml @@ -52,7 +52,7 @@ jobs: VERSION=dev - name: Run SCA vulnerability scanners - uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_configuration: 'so_configuration_sca_dev.yml' SO_API_TOKEN: ${{ secrets.SO_API_TOKEN }} diff --git a/.github/workflows/build_push_release.yml b/.github/workflows/build_push_release.yml index 7821dc8bc..5f69e8a3f 100644 --- a/.github/workflows/build_push_release.yml +++ b/.github/workflows/build_push_release.yml @@ -64,13 +64,13 @@ jobs: VERSION=${{ github.event.inputs.release }} - name: Run vulnerability scanners for images - uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_configuration: 'so_configuration_sca_current.yml' SO_API_TOKEN: ${{ secrets.SO_API_TOKEN }} - name: Run vulnerability scanners for endpoints - uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_configuration: 'so_configuration_endpoints.yml' SO_API_TOKEN: ${{ secrets.SO_API_TOKEN }} diff --git a/.github/workflows/check_licenses_dev.yml b/.github/workflows/check_licenses_dev.yml index 373b5f0b0..b0c929b3d 100644 --- a/.github/workflows/check_licenses_dev.yml +++ b/.github/workflows/check_licenses_dev.yml @@ -37,7 +37,7 @@ jobs: cdxgen ./frontend --type npm --no-babel --required-only --profile license-compliance --no-auto-compositions --project-name secobserve --output sbom_frontend_application.json - name: Import backend SBOM - uses: MaibornWolff/secobserve_actions_templates/actions/importer@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/importer@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_product_name: 'SecObserve' so_file_name: 'sbom_backend_application.json' @@ -47,7 +47,7 @@ jobs: so_api_token: ${{ secrets.SO_API_TOKEN }} - name: Import frontend SBOM - uses: MaibornWolff/secobserve_actions_templates/actions/importer@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/importer@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_product_name: 'SecObserve' so_file_name: 'sbom_frontend_application.json' diff --git a/.github/workflows/check_vulnerabilities.yml b/.github/workflows/check_vulnerabilities.yml index 9de1f74c3..d8f6415ea 100644 --- a/.github/workflows/check_vulnerabilities.yml +++ b/.github/workflows/check_vulnerabilities.yml @@ -14,7 +14,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run vulnerability scanners for code - uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_configuration: 'so_configuration_code.yml' SO_API_TOKEN: ${{ secrets.SO_API_TOKEN }} diff --git a/.github/workflows/scan_sca_current.yml b/.github/workflows/scan_sca_current.yml index 02cdc8cd2..a53d655f3 100644 --- a/.github/workflows/scan_sca_current.yml +++ b/.github/workflows/scan_sca_current.yml @@ -18,13 +18,13 @@ jobs: ref: 'v1.23.0' - name: Run SCA vulnerability scanners - uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_configuration: 'so_configuration_sca_current.yml' SO_API_TOKEN: ${{ secrets.SO_API_TOKEN }} - name: Run endpoint vulnerability scanners - uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@5476f0de11c46875081d9767ec166c1e030e9ef0 # main + uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main with: so_configuration: 'so_configuration_endpoints.yml' SO_API_TOKEN: ${{ secrets.SO_API_TOKEN }} From 90c1d0aa6f9ce669f92be0a11014cd1b075cdb32 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 06:37:26 +0100 Subject: [PATCH 80/82] chore(deps): update dependency eslint-plugin-react to v7.37.3 (#2371) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- frontend/package-lock.json | 16 ++++++++-------- frontend/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index aa3eee15e..a7cecaef6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -49,7 +49,7 @@ "@typescript-eslint/parser": "8.18.2", "@vitejs/plugin-react": "4.3.4", "eslint": "9.17.0", - "eslint-plugin-react": "7.37.2", + "eslint-plugin-react": "7.37.3", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", "globals": "15.14.0", @@ -5032,29 +5032,29 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", - "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", + "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.1.0", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.8", "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", + "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { diff --git a/frontend/package.json b/frontend/package.json index fee4093f1..d2c6c5202 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -58,7 +58,7 @@ "@typescript-eslint/parser": "8.18.2", "@vitejs/plugin-react": "4.3.4", "eslint": "9.17.0", - "eslint-plugin-react": "7.37.2", + "eslint-plugin-react": "7.37.3", "eslint-plugin-react-hooks": "rc", "eslint-plugin-security": "3.0.1", "globals": "15.14.0", From 0c0ec957cede673a685406e620fa929bee22669f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 06:41:49 +0100 Subject: [PATCH 81/82] fix(deps): update dependency pylint to v3.3.3 (#2372) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- backend/poetry.lock | 16 ++++++++-------- backend/pyproject.toml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/backend/poetry.lock b/backend/poetry.lock index d59dc207b..97582e71c 100644 --- a/backend/poetry.lock +++ b/backend/poetry.lock @@ -76,13 +76,13 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" -version = "3.3.6" +version = "3.3.8" description = "An abstract syntax tree for Python with inference support." optional = true python-versions = ">=3.9.0" files = [ - {file = "astroid-3.3.6-py3-none-any.whl", hash = "sha256:db676dc4f3ae6bfe31cda227dc60e03438378d7a896aec57422c95634e8d722f"}, - {file = "astroid-3.3.6.tar.gz", hash = "sha256:6aaea045f938c735ead292204afdb977a36e989522b7833ef6fea94de743f442"}, + {file = "astroid-3.3.8-py3-none-any.whl", hash = "sha256:187ccc0c248bfbba564826c26f070494f7bc964fd286b6d9fff4420e55de828c"}, + {file = "astroid-3.3.8.tar.gz", hash = "sha256:a88c7994f914a4ea8572fac479459f4955eeccc877be3f2d959a33273b0cf40b"}, ] [package.dependencies] @@ -1996,17 +1996,17 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] [[package]] name = "pylint" -version = "3.3.2" +version = "3.3.3" description = "python code static checker" optional = true python-versions = ">=3.9.0" files = [ - {file = "pylint-3.3.2-py3-none-any.whl", hash = "sha256:77f068c287d49b8683cd7c6e624243c74f92890f767f106ffa1ddf3c0a54cb7a"}, - {file = "pylint-3.3.2.tar.gz", hash = "sha256:9ec054ec992cd05ad30a6df1676229739a73f8feeabf3912c995d17601052b01"}, + {file = "pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183"}, + {file = "pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a"}, ] [package.dependencies] -astroid = ">=3.3.5,<=3.4.0-dev0" +astroid = ">=3.3.8,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -2713,4 +2713,4 @@ unittests = ["coverage", "django-coverage-plugin", "django-extensions"] [metadata] lock-version = "2.0" python-versions = ">= 3.10, < 3.13" -content-hash = "ed47bf9b689e497695489fbc03ce5f8562c8e97f0e989b3b4b3ba50b47b2b7b1" +content-hash = "b3bda59926c25e5fef9f18508d4e712486095715f007ed94a3fb95c54f3526cf" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index cc8c53a52..1b99b5bee 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -81,7 +81,7 @@ django-coverage-plugin = { version = "3.1.0", optional = true } # https://githu flake8 = { version = "7.1.1", optional = true } # https://github.com/PyCQA/flake8 flake8-isort = { version = "6.1.1", optional = true } # https://github.com/gforcada/flake8-isort black = { version = "24.10.0", optional = true } # https://github.com/psf/black -pylint = { version = "3.3.2", optional = true } # https://github.com/pylint-dev/pylint +pylint = { version = "3.3.3", optional = true } # https://github.com/pylint-dev/pylint pylint-django = { version = "2.6.1", optional = true } # https://github.com/PyCQA/pylint-django pre-commit = { version = "4.0.1", optional = true } # https://github.com/pre-commit/pre-commit mypy = { version = "1.14.0", optional = true } # https://github.com/python/mypy From f192b7baea85e12a2910234b8565c87b305de0a0 Mon Sep 17 00:00:00 2001 From: Stefan Fleckenstein Date: Tue, 24 Dec 2024 06:07:59 +0000 Subject: [PATCH 82/82] chore: prepare for release 1.24.0 (#2373) --- .github/workflows/scan_sca_current.yml | 2 +- backend/application/__init__.py | 2 +- backend/pyproject.toml | 2 +- .../parsers/cyclone_dx/files/changed/licenses_1.json | 8 ++++---- .../parsers/cyclone_dx/files/licenses_1.json | 8 ++++---- .../services/test_import_observations.py | 2 +- .../vex/api/files/csaf_given_vulnerability.json | 2 +- .../api/files/csaf_given_vulnerability_update.json | 2 +- .../vex/api/files/csaf_product_branches.json | 2 +- .../vex/api/files/csaf_product_given_branch.json | 2 +- .../vex/api/files/csaf_product_no_branch.json | 2 +- .../vex/api/files/csaf_product_no_branch_update.json | 2 +- .../vex/api/files/openvex_given_vulnerability.json | 2 +- .../files/openvex_given_vulnerability_update.json | 2 +- .../vex/api/files/openvex_product_branches.json | 2 +- .../vex/api/files/openvex_product_given_branch.json | 2 +- .../vex/api/files/openvex_product_no_branch.json | 2 +- .../api/files/openvex_product_no_branch_update.json | 2 +- .../vex/services/files/so_csaf_2024_0001_0001.json | 2 +- .../services/files/so_csaf_2024_0001_0001_short.json | 2 +- .../services/files/so_openvex_2024_0001_0001.json | 2 +- docker-compose-prod-mysql.yml | 4 ++-- docker-compose-prod-postgres.yml | 4 ++-- docs/getting_started/installation.md | 4 ++-- end_to_end_tests/package-lock.json | 4 ++-- end_to_end_tests/package.json | 2 +- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- so_configuration_sca_current.yml | 12 ++++++------ 29 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/scan_sca_current.yml b/.github/workflows/scan_sca_current.yml index a53d655f3..69b273cbc 100644 --- a/.github/workflows/scan_sca_current.yml +++ b/.github/workflows/scan_sca_current.yml @@ -15,7 +15,7 @@ jobs: name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: - ref: 'v1.23.0' + ref: 'v1.24.0' - name: Run SCA vulnerability scanners uses: MaibornWolff/secobserve_actions_templates/actions/vulnerability_scanner@e2d75f05ddc5d2663573183bbdf5be78a498fe44 # main diff --git a/backend/application/__init__.py b/backend/application/__init__.py index f795cbe74..a343b0797 100644 --- a/backend/application/__init__.py +++ b/backend/application/__init__.py @@ -1,4 +1,4 @@ -__version__ = "1.23.0" +__version__ = "1.24.0" import pymysql diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 1b99b5bee..5728e002e 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "SecObserve" -version = "1.23.0" +version = "1.24.0" description = "SecObserve is an open source vulnerability management system for software development and cloud environments." license = "BSD-3-Clause" authors = [ diff --git a/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json b/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json index d6c7fc759..3dec9c9df 100644 --- a/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json +++ b/backend/unittests/import_observations/parsers/cyclone_dx/files/changed/licenses_1.json @@ -31,11 +31,11 @@ ], "component": { "name": "SecObserve", - "version": "1.23.0", + "version": "1.24.0", "description": "SecObserve is an open source vulnerability management system for software development and cloud environments.", "type": "application", - "bom-ref": "pkg:pypi/secobserve@1.23.0", - "purl": "pkg:pypi/secobserve@1.23.0" + "bom-ref": "pkg:pypi/secobserve@1.24.0", + "purl": "pkg:pypi/secobserve@1.24.0" }, "properties": [ { @@ -2786,7 +2786,7 @@ ], "dependencies": [ { - "ref": "pkg:pypi/secobserve@1.23.0", + "ref": "pkg:pypi/secobserve@1.24.0", "dependsOn": [ "pkg:pypi/argon2-cffi@23.1.0", "pkg:pypi/cvss@3.2", diff --git a/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json b/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json index 6d1e3c220..00f072152 100644 --- a/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json +++ b/backend/unittests/import_observations/parsers/cyclone_dx/files/licenses_1.json @@ -31,11 +31,11 @@ ], "component": { "name": "SecObserve", - "version": "1.23.0", + "version": "1.24.0", "description": "SecObserve is an open source vulnerability management system for software development and cloud environments.", "type": "application", - "bom-ref": "pkg:pypi/secobserve@1.23.0", - "purl": "pkg:pypi/secobserve@1.23.0" + "bom-ref": "pkg:pypi/secobserve@1.24.0", + "purl": "pkg:pypi/secobserve@1.24.0" }, "properties": [ { @@ -2789,7 +2789,7 @@ ], "dependencies": [ { - "ref": "pkg:pypi/secobserve@1.23.0", + "ref": "pkg:pypi/secobserve@1.24.0", "dependsOn": [ "pkg:pypi/argon2-cffi@23.1.0", "pkg:pypi/cvss@3.2", diff --git a/backend/unittests/import_observations/services/test_import_observations.py b/backend/unittests/import_observations/services/test_import_observations.py index 15885e437..9446744dc 100644 --- a/backend/unittests/import_observations/services/test_import_observations.py +++ b/backend/unittests/import_observations/services/test_import_observations.py @@ -542,7 +542,7 @@ def _file_upload_licenses( ) self.assertEqual(license_components[1].purl_type, "pypi") self.assertEqual(license_components[1].cpe, "") - dependencies = """SecObserve:1.23.0 --> argon2-cffi:23.1.0 + dependencies = """SecObserve:1.24.0 --> argon2-cffi:23.1.0 argon2-cffi:23.1.0 --> argon2-cffi-bindings:21.2.0""" self.assertEqual(license_components[1].dependencies, dependencies) self.assertEqual( diff --git a/backend/unittests/vex/api/files/csaf_given_vulnerability.json b/backend/unittests/vex/api/files/csaf_given_vulnerability.json index 4ec8bd8b4..86726c11e 100644 --- a/backend/unittests/vex/api/files/csaf_given_vulnerability.json +++ b/backend/unittests/vex/api/files/csaf_given_vulnerability.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json b/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json index 78f5a7179..6afdc4ad1 100644 --- a/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json +++ b/backend/unittests/vex/api/files/csaf_given_vulnerability_update.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "CSAF_2024_0001_0002", diff --git a/backend/unittests/vex/api/files/csaf_product_branches.json b/backend/unittests/vex/api/files/csaf_product_branches.json index 366eeaba8..2d5b0bac7 100644 --- a/backend/unittests/vex/api/files/csaf_product_branches.json +++ b/backend/unittests/vex/api/files/csaf_product_branches.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_product_given_branch.json b/backend/unittests/vex/api/files/csaf_product_given_branch.json index 4c052e298..475dc6916 100644 --- a/backend/unittests/vex/api/files/csaf_product_given_branch.json +++ b/backend/unittests/vex/api/files/csaf_product_given_branch.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_product_no_branch.json b/backend/unittests/vex/api/files/csaf_product_no_branch.json index 26c01abbe..adb733ac7 100644 --- a/backend/unittests/vex/api/files/csaf_product_no_branch.json +++ b/backend/unittests/vex/api/files/csaf_product_no_branch.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "CSAF_2024_0001_0001", diff --git a/backend/unittests/vex/api/files/csaf_product_no_branch_update.json b/backend/unittests/vex/api/files/csaf_product_no_branch_update.json index 556599d1b..c11b991e8 100644 --- a/backend/unittests/vex/api/files/csaf_product_no_branch_update.json +++ b/backend/unittests/vex/api/files/csaf_product_no_branch_update.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "CSAF_2024_0001_0002", diff --git a/backend/unittests/vex/api/files/openvex_given_vulnerability.json b/backend/unittests/vex/api/files/openvex_given_vulnerability.json index f31a565d7..4c349e332 100644 --- a/backend/unittests/vex/api/files/openvex_given_vulnerability.json +++ b/backend/unittests/vex/api/files/openvex_given_vulnerability.json @@ -47,6 +47,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.23.0", + "tooling": "SecObserve / 1.24.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json b/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json index 97033aba5..c6afb2c8b 100644 --- a/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json +++ b/backend/unittests/vex/api/files/openvex_given_vulnerability_update.json @@ -37,6 +37,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.23.0", + "tooling": "SecObserve / 1.24.0", "version": 2 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_branches.json b/backend/unittests/vex/api/files/openvex_product_branches.json index 03a436e33..f93aaae32 100644 --- a/backend/unittests/vex/api/files/openvex_product_branches.json +++ b/backend/unittests/vex/api/files/openvex_product_branches.json @@ -65,6 +65,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.23.0", + "tooling": "SecObserve / 1.24.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_given_branch.json b/backend/unittests/vex/api/files/openvex_product_given_branch.json index 3b20a09b1..691c36a76 100644 --- a/backend/unittests/vex/api/files/openvex_product_given_branch.json +++ b/backend/unittests/vex/api/files/openvex_product_given_branch.json @@ -23,6 +23,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.23.0", + "tooling": "SecObserve / 1.24.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_no_branch.json b/backend/unittests/vex/api/files/openvex_product_no_branch.json index 8e099d367..cc5b55a4f 100644 --- a/backend/unittests/vex/api/files/openvex_product_no_branch.json +++ b/backend/unittests/vex/api/files/openvex_product_no_branch.json @@ -63,6 +63,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.23.0", + "tooling": "SecObserve / 1.24.0", "version": 1 } \ No newline at end of file diff --git a/backend/unittests/vex/api/files/openvex_product_no_branch_update.json b/backend/unittests/vex/api/files/openvex_product_no_branch_update.json index a17771bf0..03017b7e4 100644 --- a/backend/unittests/vex/api/files/openvex_product_no_branch_update.json +++ b/backend/unittests/vex/api/files/openvex_product_no_branch_update.json @@ -64,6 +64,6 @@ } ], "timestamp": "2020-01-01T04:30:00+00:00", - "tooling": "SecObserve / 1.23.0", + "tooling": "SecObserve / 1.24.0", "version": 2 } \ No newline at end of file diff --git a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json index abfb245a9..3fcbf6101 100644 --- a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json +++ b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "so_2024_0001_0001", diff --git a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json index 333ddf37e..2ff348bd6 100644 --- a/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json +++ b/backend/unittests/vex/services/files/so_csaf_2024_0001_0001_short.json @@ -18,7 +18,7 @@ "generator": { "engine": { "name": "SecObserve", - "version": "1.23.0" + "version": "1.24.0" } }, "id": "so_2024_0001_0001", diff --git a/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json b/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json index ab6db3a74..355e78a25 100644 --- a/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json +++ b/backend/unittests/vex/services/files/so_openvex_2024_0001_0001.json @@ -294,6 +294,6 @@ } ], "timestamp": "2024-07-14T11:17:57.668593+00:00", - "tooling": "SecObserve / 1.23.0", + "tooling": "SecObserve / 1.24.0", "version": 1 } \ No newline at end of file diff --git a/docker-compose-prod-mysql.yml b/docker-compose-prod-mysql.yml index 1c738ad57..1121abee8 100644 --- a/docker-compose-prod-mysql.yml +++ b/docker-compose-prod-mysql.yml @@ -35,7 +35,7 @@ services: - traefik frontend: - image: maibornwolff/secobserve-frontend:1.23.0 + image: maibornwolff/secobserve-frontend:1.24.0 container_name: "prod_secobserve_frontend" labels: - "traefik.enable=true" @@ -54,7 +54,7 @@ services: - traefik backend: - image: maibornwolff/secobserve-backend:1.23.0 + image: maibornwolff/secobserve-backend:1.24.0 container_name: "prod_secobserve_backend" labels: - "traefik.enable=true" diff --git a/docker-compose-prod-postgres.yml b/docker-compose-prod-postgres.yml index 284282f4d..f125aad73 100644 --- a/docker-compose-prod-postgres.yml +++ b/docker-compose-prod-postgres.yml @@ -35,7 +35,7 @@ services: - traefik frontend: - image: maibornwolff/secobserve-frontend:1.23.0 + image: maibornwolff/secobserve-frontend:1.24.0 container_name: "prod_secobserve_frontend" labels: - "traefik.enable=true" @@ -54,7 +54,7 @@ services: - traefik backend: - image: maibornwolff/secobserve-backend:1.23.0 + image: maibornwolff/secobserve-backend:1.24.0 container_name: "prod_secobserve_backend" labels: - "traefik.enable=true" diff --git a/docs/getting_started/installation.md b/docs/getting_started/installation.md index f48e7cddc..bf3d78e2e 100644 --- a/docs/getting_started/installation.md +++ b/docs/getting_started/installation.md @@ -45,7 +45,7 @@ services: - default frontend: - image: maibornwolff/secobserve-frontend:1.23.0 + image: maibornwolff/secobserve-frontend:1.24.0 labels: - "traefik.enable=true" - "traefik.http.routers.frontend.rule=Host(`secobserve.localhost`)" @@ -62,7 +62,7 @@ services: - traefik backend: - image: maibornwolff/secobserve-backend:1.23.0 + image: maibornwolff/secobserve-backend:1.24.0 labels: - "traefik.enable=true" - "traefik.http.routers.backend.rule=Host(`secobserve-backend.localhost`)" diff --git a/end_to_end_tests/package-lock.json b/end_to_end_tests/package-lock.json index 841495c27..40908f431 100644 --- a/end_to_end_tests/package-lock.json +++ b/end_to_end_tests/package-lock.json @@ -1,12 +1,12 @@ { "name": "end_to_end_tests", - "version": "1.23.0", + "version": "1.24.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "end_to_end_tests", - "version": "1.23.0", + "version": "1.24.0", "devDependencies": { "@playwright/test": "1.49.1", "@types/node": "22.10.2" diff --git a/end_to_end_tests/package.json b/end_to_end_tests/package.json index 61a0705f9..1e1412d16 100644 --- a/end_to_end_tests/package.json +++ b/end_to_end_tests/package.json @@ -1,6 +1,6 @@ { "name": "end_to_end_tests", - "version": "1.23.0", + "version": "1.24.0", "private": true, "description": "", "main": "index.js", diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a7cecaef6..a0a45268e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "secobserve", - "version": "1.23.0", + "version": "1.24.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "secobserve", - "version": "1.23.0", + "version": "1.24.0", "license": "BSD-3-Clause", "dependencies": { "@emotion/react": "11.14.0", diff --git a/frontend/package.json b/frontend/package.json index d2c6c5202..33a697b53 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "secobserve", - "version": "1.23.0", + "version": "1.24.0", "license": "BSD-3-Clause", "description": "SecObserve is an open source vulnerability management system for software development and cloud environments.", "private": true, diff --git a/so_configuration_sca_current.yml b/so_configuration_sca_current.yml index 00a63cb5d..73ea4e699 100644 --- a/so_configuration_sca_current.yml +++ b/so_configuration_sca_current.yml @@ -1,18 +1,18 @@ trivy_image_backend_current: SCANNER: trivy_image - TARGET: "maibornwolff/secobserve-backend:1.23.0" + TARGET: "maibornwolff/secobserve-backend:1.24.0" FURTHER_PARAMETERS: "--pkg-types os --db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_backend_image.json" SO_ORIGIN_SERVICE: "backend" - SO_BRANCH_NAME: "1.23.0" + SO_BRANCH_NAME: "1.24.0" trivy_image_frontend_current: SCANNER: trivy_image - TARGET: "maibornwolff/secobserve-frontend:1.23.0" + TARGET: "maibornwolff/secobserve-frontend:1.24.0" FURTHER_PARAMETERS: "--pkg-types os --db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_frontend_image.json" SO_ORIGIN_SERVICE: "frontend" - SO_BRANCH_NAME: "1.23.0" + SO_BRANCH_NAME: "1.24.0" trivy_filesystem_backend_current: SCANNER: trivy_filesystem @@ -21,7 +21,7 @@ trivy_filesystem_backend_current: FURTHER_PARAMETERS: "--db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_backend_poetry.json" SO_ORIGIN_SERVICE: "backend" - SO_BRANCH_NAME: "1.23.0" + SO_BRANCH_NAME: "1.24.0" trivy_filesystem_frontend_current: SCANNER: trivy_filesystem @@ -30,7 +30,7 @@ trivy_filesystem_frontend_current: FURTHER_PARAMETERS: "--db-repository public.ecr.aws/aquasecurity/trivy-db:2" REPORT_NAME: "trivy_frontend_npm.json" SO_ORIGIN_SERVICE: "frontend" - SO_BRANCH_NAME: "1.23.0" + SO_BRANCH_NAME: "1.24.0" importer: SO_UPLOAD: "true"