From ca27d05089a30718878ca77a40dfb6734cee08fd Mon Sep 17 00:00:00 2001 From: Abderrahmane Smimite Date: Sat, 18 Jan 2025 20:46:17 +0100 Subject: [PATCH 01/10] starting point --- .../components/Chart/EcosystemRadarChart.svelte | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte b/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte index d4e1b3aff3..68fa1acef5 100644 --- a/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte +++ b/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte @@ -12,6 +12,11 @@ export let name = ''; export let data; + export let max = 6; + export let greenZoneRadius = 0.2; + export let yellowZoneRadius = 0.9; + export let redZoneRadius = 2.5; + // data format: f1-f4 (fiabilité cyber = maturité x confiance ) to get the clusters and colors // x,y, z // x: criticité calculée avec cap à 5,5 @@ -122,7 +127,7 @@ }, radiusAxis: { type: 'value', - max: 6, + max: max, inverse: true, axisLabel: { show: true }, axisLine: { @@ -194,7 +199,7 @@ itemStyle: { borderJoin: 'round' }, symbol: 'none', data: new Array(360).fill(0).map((_, index) => { - return [2.5, index]; + return [redZoneRadius, index]; }), lineStyle: { color: '#E73E51', @@ -211,10 +216,10 @@ coordinateSystem: 'polar', symbol: 'none', data: new Array(360).fill(0).map((_, index) => { - return [0.2, index]; + return [yellowZoneRadius, index]; }), lineStyle: { - color: '#00ADA8', + color: '#F8EA47', width: 5 }, // If you don't want this to show up in the legend: @@ -228,10 +233,10 @@ coordinateSystem: 'polar', symbol: 'none', data: new Array(360).fill(0).map((_, index) => { - return [0.9, index]; + return [greenZoneRadius, index]; }), lineStyle: { - color: '#F8EA47', + color: '#00ADA8', width: 5 }, // If you don't want this to show up in the legend: From dcd31d9005cfe28aa2eef10369cd351b3012c942 Mon Sep 17 00:00:00 2001 From: Mohamed-Hacene Date: Fri, 24 Jan 2025 13:41:37 +0100 Subject: [PATCH 02/10] feat: add ebios radar parameters in global settings --- backend/global_settings/serializers.py | 4 +++ backend/global_settings/views.py | 20 +++++++++++- .../Forms/ModelForm/GeneralSettingForm.svelte | 32 +++++++++++++++++++ .../lib/components/Forms/NumberField.svelte | 2 ++ frontend/src/lib/utils/schemas.ts | 6 +++- 5 files changed, 62 insertions(+), 2 deletions(-) diff --git a/backend/global_settings/serializers.py b/backend/global_settings/serializers.py index bb68b0f778..71d0d5ed9f 100644 --- a/backend/global_settings/serializers.py +++ b/backend/global_settings/serializers.py @@ -4,6 +4,10 @@ GENERAL_SETTINGS_KEYS = [ "security_objective_scale", + "ebios_radar_max", + "ebios_radar_green_zone_radius", + "ebios_radar_yellow_zone_radius", + "ebios_radar_red_zone_radius", ] diff --git a/backend/global_settings/views.py b/backend/global_settings/views.py index 1f969f0951..5d412c3211 100644 --- a/backend/global_settings/views.py +++ b/backend/global_settings/views.py @@ -61,7 +61,15 @@ def get_object(self): def object(self, request, pk=None): GlobalSettings.objects.get_or_create( name="general", - defaults={"value": {"security_objective_scale": "1-4"}}, + defaults={ + "value": { + "security_objective_scale": "1-4", + "ebios_radar_max": 6, + "ebios_radar_green_zone_radius": 0.2, + "ebios_radar_yellow_zone_radius": 0.9, + "ebios_radar_red_zone_radius": 2.5, + } + } ) return Response(GeneralSettingsSerializer(self.get_object()).data.get("value")) @@ -73,6 +81,16 @@ def security_objective_scale(self, request): "FIPS-199": "FIPS-199", } return Response(choices) + + @action(detail=True, name="Get ebios rm radar parameters") + def ebios_radar_parameters(self, request): + ebios_rm_parameters = { + "ebios_radar_max": self.get_object().value.get("ebios_radar_max"), + "ebios_radar_green_zone_radius": self.get_object().value.get("ebios_radar_green_zone_radius"), + "ebios_radar_yellow_zone_radius": self.get_object().value.get("ebios_radar_yellow_zone_radius"), + "ebios_radar_red_zone_radius": self.get_object().value.get("ebios_radar_red_zone_radius"), + } + return Response(ebios_rm_parameters) @api_view(["GET"]) diff --git a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte index 9860f23b21..821c667688 100644 --- a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte +++ b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte @@ -1,5 +1,6 @@ - + + + + {m.ebiosRadarParameters()} + + + + + + + + diff --git a/frontend/src/lib/components/Forms/NumberField.svelte b/frontend/src/lib/components/Forms/NumberField.svelte index 6d962ce4c7..7b77edde75 100644 --- a/frontend/src/lib/components/Forms/NumberField.svelte +++ b/frontend/src/lib/components/Forms/NumberField.svelte @@ -58,7 +58,7 @@
Date: Fri, 24 Jan 2025 14:16:48 +0100 Subject: [PATCH 04/10] feat: link ebios radar parameters with component --- .../src/lib/components/Chart/EcosystemRadarChart.svelte | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte b/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte index 68fa1acef5..36ed382b29 100644 --- a/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte +++ b/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte @@ -2,6 +2,7 @@ import { onMount } from 'svelte'; import { safeTranslate } from '$lib/utils/i18n'; import * as m from '$paraglide/messages.js'; + import { page } from '$app/stores'; // export let name: string; @@ -12,10 +13,10 @@ export let name = ''; export let data; - export let max = 6; - export let greenZoneRadius = 0.2; - export let yellowZoneRadius = 0.9; - export let redZoneRadius = 2.5; + export let max = $page.data.settings.ebios_radar_max; + export let greenZoneRadius = $page.data.settings.ebios_radar_green_zone_radius; + export let yellowZoneRadius = $page.data.settings.ebios_radar_yellow_zone_radius; + export let redZoneRadius = $page.data.settings.ebios_radar_red_zone_radius; // data format: f1-f4 (fiabilité cyber = maturité x confiance ) to get the clusters and colors // x,y, z From 214f4c00d4a9ed53fa3df5c5b8036a17bb02dc6a Mon Sep 17 00:00:00 2001 From: Mohamed-Hacene Date: Fri, 24 Jan 2025 14:28:11 +0100 Subject: [PATCH 05/10] feat: update translations --- frontend/messages/en.json | 2 +- frontend/messages/fr.json | 7 ++++++- .../components/Forms/ModelForm/GeneralSettingForm.svelte | 3 ++- frontend/src/lib/utils/schemas.ts | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/frontend/messages/en.json b/frontend/messages/en.json index e90a97f7e7..5b044af158 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -1130,7 +1130,7 @@ "no": "No", "updateAvailable": "Update available", "ebiosRadarParameters": "Ebios RM radar parameters", - "max": "Max", + "maxRadius": "Max Radius", "greenZoneRadius": "Green zone radius", "yellowZoneRadius": "Yellow zone radius", "redZoneRadius": "Red zone radius" diff --git a/frontend/messages/fr.json b/frontend/messages/fr.json index a515ce7cdb..d5612a77c5 100644 --- a/frontend/messages/fr.json +++ b/frontend/messages/fr.json @@ -1128,5 +1128,10 @@ "missingLibrariesInImport": "Certaines bibliothèques sont manquantes, voir la liste ci-dessus", "yes": "Oui", "no": "Non", - "updateAvailable": "Mise à jour disponible" + "updateAvailable": "Mise à jour disponible", + "ebiosRadarParameters": "Paramètres du radar Ebios RM", + "maxRadius": "Rayon maximal", + "greenZoneRadius": "Rayon de la zone verte", + "yellowZoneRadius": "Rayon de la zone jaune", + "redZoneRadius": "Rayon de la zone rouge" } diff --git a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte index efc9290c4d..59e0c3d408 100644 --- a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte +++ b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte @@ -36,7 +36,8 @@ diff --git a/frontend/src/lib/utils/schemas.ts b/frontend/src/lib/utils/schemas.ts index ef64dac5fb..72b479d5b3 100644 --- a/frontend/src/lib/utils/schemas.ts +++ b/frontend/src/lib/utils/schemas.ts @@ -291,7 +291,7 @@ export const EvidenceSchema = z.object({ export const GeneralSettingsSchema = z.object({ security_objective_scale: z.string(), - ebios_radar_max: z.number().int().default(6), + ebios_radar_max: z.number().default(6), ebios_radar_green_zone_radius: z.number().default(0.2), ebios_radar_yellow_zone_radius: z.number().default(0.9), ebios_radar_red_zone_radius: z.number().default(2.5) From 031b32bf9a9860e669e2605682eaf13c71af940e Mon Sep 17 00:00:00 2001 From: Mohamed-Hacene Date: Fri, 24 Jan 2025 14:35:24 +0100 Subject: [PATCH 06/10] feat: initialize/update global settings with default settings --- backend/global_settings/views.py | 30 +++++++++++++++++------------- frontend/src/lib/utils/schemas.ts | 8 ++++---- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/backend/global_settings/views.py b/backend/global_settings/views.py index f6c7dcd89a..7baafa5be1 100644 --- a/backend/global_settings/views.py +++ b/backend/global_settings/views.py @@ -59,19 +59,23 @@ def get_object(self): @action(detail=True, name="Get write data") def object(self, request, pk=None): - GlobalSettings.objects.get_or_create( - name="general", - defaults={ - "value": { - "security_objective_scale": "1-4", - "ebios_radar_max": 6, - "ebios_radar_green_zone_radius": 0.2, - "ebios_radar_yellow_zone_radius": 0.9, - "ebios_radar_red_zone_radius": 2.5, - } - }, - ) - return Response(GeneralSettingsSerializer(self.get_object()).data.get("value")) + default_settings = { + "security_objective_scale": "1-4", + "ebios_radar_max": 6, + "ebios_radar_green_zone_radius": 0.2, + "ebios_radar_yellow_zone_radius": 0.9, + "ebios_radar_red_zone_radius": 2.5, + } + + settings, created = GlobalSettings.objects.get_or_create(name="general") + + if created or not all(key in settings.value for key in default_settings): + existing_value = settings.value or {} + updated_value = {**default_settings, **existing_value} + settings.value = updated_value + settings.save() + + return Response(GeneralSettingsSerializer(settings).data.get("value")) @action(detail=True, name="Get security objective scales") def security_objective_scale(self, request): diff --git a/frontend/src/lib/utils/schemas.ts b/frontend/src/lib/utils/schemas.ts index 72b479d5b3..643c3df8b0 100644 --- a/frontend/src/lib/utils/schemas.ts +++ b/frontend/src/lib/utils/schemas.ts @@ -291,10 +291,10 @@ export const EvidenceSchema = z.object({ export const GeneralSettingsSchema = z.object({ security_objective_scale: z.string(), - ebios_radar_max: z.number().default(6), - ebios_radar_green_zone_radius: z.number().default(0.2), - ebios_radar_yellow_zone_radius: z.number().default(0.9), - ebios_radar_red_zone_radius: z.number().default(2.5) + ebios_radar_max: z.number(), + ebios_radar_green_zone_radius: z.number(), + ebios_radar_yellow_zone_radius: z.number(), + ebios_radar_red_zone_radius: z.number() }); export const SSOSettingsSchema = z.object({ From cc634b12bd2101514905dd8e73e415743efa68de Mon Sep 17 00:00:00 2001 From: Mohamed-Hacene Date: Fri, 24 Jan 2025 14:37:02 +0100 Subject: [PATCH 07/10] chore: remove spaces --- backend/global_settings/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/global_settings/views.py b/backend/global_settings/views.py index 7baafa5be1..17e3929346 100644 --- a/backend/global_settings/views.py +++ b/backend/global_settings/views.py @@ -66,15 +66,15 @@ def object(self, request, pk=None): "ebios_radar_yellow_zone_radius": 0.9, "ebios_radar_red_zone_radius": 2.5, } - + settings, created = GlobalSettings.objects.get_or_create(name="general") - + if created or not all(key in settings.value for key in default_settings): existing_value = settings.value or {} updated_value = {**default_settings, **existing_value} settings.value = updated_value settings.save() - + return Response(GeneralSettingsSerializer(settings).data.get("value")) @action(detail=True, name="Get security objective scales") From b3b6959eedf8326269f46e5ee41e3a41e8fccb26 Mon Sep 17 00:00:00 2001 From: Abderrahmane Smimite Date: Fri, 24 Jan 2025 20:47:09 +0100 Subject: [PATCH 08/10] Better ingestion of the params --- backend/ebios_rm/helpers.py | 13 ++++++++----- .../lib/components/Chart/EcosystemRadarChart.svelte | 12 +++++------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/backend/ebios_rm/helpers.py b/backend/ebios_rm/helpers.py index 61f57d768f..33cfacd7b1 100644 --- a/backend/ebios_rm/helpers.py +++ b/backend/ebios_rm/helpers.py @@ -1,6 +1,7 @@ from django.db.models.query import QuerySet import math import random +from global_settings.models import GlobalSettings def ecosystem_radar_chart_data(stakeholders_queryset: QuerySet): @@ -35,7 +36,7 @@ def get_reliability_cluster(value): """ // data format: f1-f4 (fiabilité cyber = maturité x confiance ) to get the clusters and colors // x,y, z - // x: criticité calculée avec cap à 5,5 + // x: criticité calculée avec cap basé sur le max finalement // y: the angle (output of dict to make sure they end up on the right quadrant, min: 45, max:-45) -> done on BE // z: the size of item (exposition = dependence x penetration) based on a dict, -> done on BE // label: name of the 3rd party entity @@ -46,6 +47,8 @@ def get_reliability_cluster(value): r_data = {"clst1": [], "clst2": [], "clst3": [], "clst4": []} angle_offset = {"client": 135, "partner": 225, "supplier": 45} + max_val = GlobalSettings.objects.get(name="general").value.get("ebios_radar_max", 6) + for sh in qs: # current c_reliability = sh.current_maturity * sh.current_trust @@ -54,8 +57,8 @@ def get_reliability_cluster(value): c_criticality = ( math.floor(sh.current_criticality * 100) / 100.0 - if sh.current_criticality <= 5 - else 5.25 + if sh.current_criticality <= max_val + else max_val - 1 + 0.25 ) angle = angle_offset[sh.category] + ( @@ -74,8 +77,8 @@ def get_reliability_cluster(value): r_criticality = ( math.floor(sh.residual_criticality * 100) / 100.0 - if sh.residual_criticality <= 5 - else 5.25 + if sh.residual_criticality <= max_val + else max_val - 1 + 0.25 ) angle = angle_offset[sh.category] + ( diff --git a/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte b/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte index 36ed382b29..5f2b19d3db 100644 --- a/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte +++ b/frontend/src/lib/components/Chart/EcosystemRadarChart.svelte @@ -194,7 +194,7 @@ } }, { - name: 'Circle', + name: 'CircleR', type: 'line', coordinateSystem: 'polar', itemStyle: { borderJoin: 'round' }, @@ -206,13 +206,12 @@ color: '#E73E51', width: 5 }, - // If you don't want this to show up in the legend: showInLegend: false, silent: true, zlevel: -1 }, { - name: 'Circle', + name: 'CircleY', type: 'line', coordinateSystem: 'polar', symbol: 'none', @@ -223,13 +222,12 @@ color: '#F8EA47', width: 5 }, - // If you don't want this to show up in the legend: showInLegend: false, silent: true, zlevel: -1 }, { - name: 'Circle', + name: 'CircleG', type: 'line', coordinateSystem: 'polar', symbol: 'none', @@ -256,7 +254,7 @@ color: '#007FB9', borderWidth: 1 }, - data: [[5.999, 0]], + data: [[max - 0.001, 0]], silent: true, zlevel: -1, showInLegend: false @@ -273,7 +271,7 @@ }, data: mainAngles.flatMap((angle) => [ [0, angle], - [6, angle], + [max, angle], [NaN, NaN] ]) } From 839e1b3dc0c07bbf464b14d7352bc045d97187c4 Mon Sep 17 00:00:00 2001 From: Abderrahmane Smimite Date: Fri, 24 Jan 2025 20:50:37 +0100 Subject: [PATCH 09/10] Limit the max radius for consistency with the scale --- .../lib/components/Forms/ModelForm/GeneralSettingForm.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte index 59e0c3d408..3943befb0e 100644 --- a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte +++ b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte @@ -37,6 +37,8 @@ {form} field="ebios_radar_max" label={m.maxRadius()} + min={6} + max={16} step={0.1} cacheLock={cacheLocks['ebios_radar_max']} bind:cachedValue={formDataCache['ebios_radar_max']} From 05d7954c2786a36b258c63b9198435e77745bd44 Mon Sep 17 00:00:00 2001 From: Abderrahmane Smimite Date: Fri, 24 Jan 2025 20:58:01 +0100 Subject: [PATCH 10/10] values safeguards --- .../components/Forms/ModelForm/GeneralSettingForm.svelte | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte index 3943befb0e..3f7c6a42c5 100644 --- a/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte +++ b/frontend/src/lib/components/Forms/ModelForm/GeneralSettingForm.svelte @@ -47,6 +47,8 @@ {form} field="ebios_radar_green_zone_radius" label={m.greenZoneRadius()} + min={0.1} + max={16} step={0.1} cacheLock={cacheLocks['ebios_radar_green_zone_radius']} bind:cachedValue={formDataCache['ebios_radar_green_zone_radius']} @@ -55,6 +57,8 @@ {form} field="ebios_radar_yellow_zone_radius" label={m.yellowZoneRadius()} + min={0.5} + max={16} step={0.1} cacheLock={cacheLocks['ebios_radar_yellow_zone_radius']} bind:cachedValue={formDataCache['ebios_radar_yellow_zone_radius']} @@ -63,6 +67,8 @@ {form} field="ebios_radar_red_zone_radius" label={m.redZoneRadius()} + min={1} + max={16} step={0.1} cacheLock={cacheLocks['ebios_radar_red_zone_radius']} bind:cachedValue={formDataCache['ebios_radar_red_zone_radius']}