@kartverket/backstage-plugin-risk-scorecard 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/riScDialog/ConfigEncryptionDialog.esm.js +10 -26
- package/dist/components/riScDialog/ConfigEncryptionDialog.esm.js.map +1 -1
- package/dist/components/riScDialog/RiScDialog.esm.js +1 -2
- package/dist/components/riScDialog/RiScDialog.esm.js.map +1 -1
- package/dist/utils/DTOs.esm.js.map +1 -1
- package/dist/utils/utilityfunctions.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,20 +19,14 @@ const ConfigEncryptionDialog = ({
|
|
|
19
19
|
const [publicAgeKeyError, setPublicKeyTextFieldError] = useState(false);
|
|
20
20
|
const [newPublicAgeKey, setNewPublicAgeKey] = useState("");
|
|
21
21
|
const [publicAgeKeys, setPublicAgeKeys] = useState(() => {
|
|
22
|
-
if (sopsData?.
|
|
23
|
-
return sopsData.
|
|
24
|
-
(key) => key !== "age18e0t6ve0vdxqzzjt7rxf0r6vzc37fhs5cad2qz40r02c3spzgvvq8uxz23"
|
|
25
|
-
).filter(
|
|
26
|
-
(key) => key !== "age145s860ux96jvx6d7nwvzar588qjmgv5p47sp6nmmt2jnmhqh4scqcuk0mg"
|
|
27
|
-
).filter(
|
|
28
|
-
(key) => key !== "age1kjpgclkjev08aa8l2uy277gn0cngrkrkazt240405ezqywkm5axqt3d3tq"
|
|
29
|
-
);
|
|
22
|
+
if (sopsData?.age) {
|
|
23
|
+
return sopsData.age.map((age) => age.recipient);
|
|
30
24
|
}
|
|
31
25
|
return [];
|
|
32
26
|
});
|
|
33
27
|
const [chosenGcpCryptoKey, setChosenGcpCryptoKey] = useState(() => {
|
|
34
|
-
if (state === RiScDialogStates.EditEncryption && sopsData?.
|
|
35
|
-
const gcpKms = sopsData.
|
|
28
|
+
if (state === RiScDialogStates.EditEncryption && sopsData?.gcp_kms) {
|
|
29
|
+
const gcpKms = sopsData.gcp_kms[0];
|
|
36
30
|
if (gcpKms?.resource_id) {
|
|
37
31
|
const resourceParts = gcpKms.resource_id.split("/");
|
|
38
32
|
if (resourceParts.length === 8) {
|
|
@@ -53,23 +47,13 @@ const ConfigEncryptionDialog = ({
|
|
|
53
47
|
useEffect(() => {
|
|
54
48
|
setValue("sopsConfig", {
|
|
55
49
|
shamir_threshold: 2,
|
|
56
|
-
|
|
50
|
+
gcp_kms: [
|
|
57
51
|
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
]
|
|
64
|
-
},
|
|
65
|
-
...publicAgeKeys.length > 0 ? [
|
|
66
|
-
{
|
|
67
|
-
age: publicAgeKeys.map((key) => ({
|
|
68
|
-
recipient: key
|
|
69
|
-
}))
|
|
70
|
-
}
|
|
71
|
-
] : []
|
|
72
|
-
]
|
|
52
|
+
resource_id: chosenGcpCryptoKey.resourceId,
|
|
53
|
+
created_at: chosenGcpCryptoKey.createdAt
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
age: publicAgeKeys.map((key) => ({ recipient: key }))
|
|
73
57
|
});
|
|
74
58
|
}, [chosenGcpCryptoKey, publicAgeKeys, setValue]);
|
|
75
59
|
const handleChangeGcpCryptoKey = (newKey) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigEncryptionDialog.esm.js","sources":["../../../src/components/riScDialog/ConfigEncryptionDialog.tsx"],"sourcesContent":["import {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Box,\n Button,\n DialogContentText,\n FormLabel,\n IconButton,\n Link,\n List,\n ListItem,\n ListItemSecondaryAction,\n ListItemText,\n TextField,\n Typography,\n} from '@mui/material';\nimport { GcpCryptoKeyMenu } from '../sopsConfigDialog/GcpCryptoKeyMenu';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { AddCircle, ExpandMore } from '@mui/icons-material';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { GcpCryptoKeyObject, SopsConfigDTO } from '../../utils/DTOs';\nimport React, { useEffect, useState } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { UseFormRegister, UseFormSetValue } from 'react-hook-form';\nimport { RiScDialogStates } from './RiScDialog';\nimport { isPublicAgeKeyValid } from '../../utils/utilityfunctions';\n\ninterface ConfigEncryptionDialogProps {\n gcpCryptoKeys: GcpCryptoKeyObject[];\n sopsData?: SopsConfigDTO;\n setValue: UseFormSetValue<RiScWithMetadata>;\n register: UseFormRegister<RiScWithMetadata>;\n state: RiScDialogStates;\n}\n\nconst ConfigEncryptionDialog = ({\n gcpCryptoKeys,\n sopsData,\n setValue,\n state,\n}: ConfigEncryptionDialogProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [publicAgeKeyHelperText, setPublicKeyTextFieldHelperText] =\n useState('');\n const [publicAgeKeyError, setPublicKeyTextFieldError] = useState(false);\n const [newPublicAgeKey, setNewPublicAgeKey] = useState('');\n const [publicAgeKeys, setPublicAgeKeys] = useState<string[]>(() => {\n if (sopsData?.key_groups) {\n return sopsData.key_groups\n .flatMap(group => group.age || [])\n .map(age => age.recipient)\n .filter(\n key =>\n key !==\n 'age18e0t6ve0vdxqzzjt7rxf0r6vzc37fhs5cad2qz40r02c3spzgvvq8uxz23',\n )\n .filter(\n key =>\n key !==\n 'age145s860ux96jvx6d7nwvzar588qjmgv5p47sp6nmmt2jnmhqh4scqcuk0mg',\n )\n .filter(\n key =>\n key !==\n 'age1kjpgclkjev08aa8l2uy277gn0cngrkrkazt240405ezqywkm5axqt3d3tq',\n );\n }\n return [];\n });\n\n const [chosenGcpCryptoKey, setChosenGcpCryptoKey] =\n useState<GcpCryptoKeyObject>(() => {\n if (state === RiScDialogStates.EditEncryption && sopsData?.key_groups) {\n const gcpKms = sopsData.key_groups.find(keygroup => keygroup.gcp_kms)\n ?.gcp_kms?.[0];\n if (gcpKms?.resource_id) {\n const resourceParts = gcpKms.resource_id.split('/');\n if (resourceParts.length === 8) {\n return {\n projectId: resourceParts[1],\n keyRing: resourceParts[5],\n keyName: resourceParts[7],\n locations: resourceParts[3],\n resourceId: gcpKms.resource_id,\n createdAt: gcpKms.created_at,\n hasEncryptDecryptAccess: true,\n };\n }\n }\n }\n return gcpCryptoKeys[0];\n });\n\n useEffect(() => {\n setValue('sopsConfig', {\n shamir_threshold: 2,\n key_groups: [\n {\n gcp_kms: [\n {\n resource_id: chosenGcpCryptoKey.resourceId,\n created_at: chosenGcpCryptoKey.createdAt,\n },\n ],\n },\n ...(publicAgeKeys.length > 0\n ? [\n {\n age: publicAgeKeys.map(key => ({\n recipient: key,\n })),\n },\n ]\n : []),\n ],\n });\n }, [chosenGcpCryptoKey, publicAgeKeys, setValue]);\n\n const handleChangeGcpCryptoKey = (newKey: GcpCryptoKeyObject) => {\n setChosenGcpCryptoKey(newKey);\n };\n\n const handleAddPublicAgeKey = () => {\n if (isPublicAgeKeyValid(newPublicAgeKey)) {\n if (publicAgeKeys.includes(newPublicAgeKey)) {\n setPublicKeyTextFieldHelperText(\n t('sopsConfigDialog.publicKeyHelperTextKeyAlreadyExistInSopsConfig'),\n );\n setPublicKeyTextFieldError(true);\n } else {\n setPublicAgeKeys([...publicAgeKeys, newPublicAgeKey]);\n setNewPublicAgeKey('');\n }\n } else {\n setPublicKeyTextFieldHelperText(\n t('sopsConfigDialog.publicKeyHelperTextKeyNotValid'),\n );\n setPublicKeyTextFieldError(true);\n }\n };\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n <DialogContentText>\n {state === RiScDialogStates.Create\n ? t('sopsConfigDialog.description.new')\n : t('sopsConfigDialog.description.edit')}\n </DialogContentText>\n {t('sopsConfigDialog.selectKeysTitle')}\n {t('sopsConfigDialog.gcpCryptoKeyDescription')}\n\n <GcpCryptoKeyMenu\n chosenGcpCryptoKey={chosenGcpCryptoKey}\n onChange={handleChangeGcpCryptoKey}\n gcpCryptoKeys={gcpCryptoKeys}\n />\n <Box>\n <Accordion elevation={1} defaultExpanded={publicAgeKeys.length > 0}>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"panel1-content\"\n id=\"panel1-header\"\n >\n {t('sopsConfigDialog.publicAgeKeyQuestion')}\n </AccordionSummary>\n <AccordionDetails>\n <Box>\n {publicAgeKeys.length > 0 && (\n <FormLabel>\n {t('sopsConfigDialog.publicAgeKeysAlreadyPresent')}\n </FormLabel>\n )}\n <List>\n {publicAgeKeys.map(key => (\n <ListItem key={key} dense>\n <ListItemText>{key}</ListItemText>\n <ListItemSecondaryAction>\n <IconButton\n onClick={() => {\n setPublicAgeKeys(\n publicAgeKeys.filter(k => k !== key),\n );\n }}\n >\n <DeleteIcon />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n ))}\n </List>\n <Typography>\n {t('dictionary.click')}{' '}\n <Link\n href=\"https://kartverket.atlassian.net/wiki/spaces/SIK/pages/1472528509/Skrive+koden+r+RoS+lokalt\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n color=\"primary\"\n underline=\"hover\"\n >\n {t('dictionary.here')}\n </Link>{' '}\n {t('sopsConfigDialog.writeLocalRiscSuffix')}\n </Typography>\n <Typography>\n {`${t('sopsConfigDialog.publicAgeKeyDescription')} (${t(\n 'dictionary.optional',\n )})`}\n </Typography>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'space-between',\n gap: 2,\n }}\n >\n <TextField\n label={t('sopsConfigDialog.publicAgeKey')}\n helperText={publicAgeKeyHelperText}\n error={publicAgeKeyError}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleAddPublicAgeKey();\n }\n }}\n onFocus={() => {\n setPublicKeyTextFieldError(false);\n setPublicKeyTextFieldHelperText('');\n }}\n value={newPublicAgeKey}\n onChange={e => setNewPublicAgeKey(e.target.value)}\n />\n <Button\n startIcon={<AddCircle />}\n variant=\"text\"\n color=\"primary\"\n onClick={handleAddPublicAgeKey}\n sx={{\n maxWidth: 200,\n mt: 1,\n }}\n >\n {t('sopsConfigDialog.addPublicAgeKey')}\n </Button>\n </Box>\n </Box>\n </AccordionDetails>\n </Accordion>\n </Box>\n </Box>\n );\n};\n\nexport default ConfigEncryptionDialog;\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConfigEncryptionDialog.esm.js","sources":["../../../src/components/riScDialog/ConfigEncryptionDialog.tsx"],"sourcesContent":["import {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Box,\n Button,\n DialogContentText,\n FormLabel,\n IconButton,\n Link,\n List,\n ListItem,\n ListItemSecondaryAction,\n ListItemText,\n TextField,\n Typography,\n} from '@mui/material';\nimport { GcpCryptoKeyMenu } from '../sopsConfigDialog/GcpCryptoKeyMenu';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { AddCircle, ExpandMore } from '@mui/icons-material';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { GcpCryptoKeyObject, SopsConfigDTO } from '../../utils/DTOs';\nimport React, { useEffect, useState } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { UseFormRegister, UseFormSetValue } from 'react-hook-form';\nimport { RiScDialogStates } from './RiScDialog';\nimport { isPublicAgeKeyValid } from '../../utils/utilityfunctions';\n\ninterface ConfigEncryptionDialogProps {\n gcpCryptoKeys: GcpCryptoKeyObject[];\n sopsData?: SopsConfigDTO;\n setValue: UseFormSetValue<RiScWithMetadata>;\n register: UseFormRegister<RiScWithMetadata>;\n state: RiScDialogStates;\n}\n\nconst ConfigEncryptionDialog = ({\n gcpCryptoKeys,\n sopsData,\n setValue,\n state,\n}: ConfigEncryptionDialogProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [publicAgeKeyHelperText, setPublicKeyTextFieldHelperText] =\n useState('');\n const [publicAgeKeyError, setPublicKeyTextFieldError] = useState(false);\n const [newPublicAgeKey, setNewPublicAgeKey] = useState('');\n const [publicAgeKeys, setPublicAgeKeys] = useState<string[]>(() => {\n if (sopsData?.age) {\n return sopsData.age.map(age => age.recipient);\n }\n return [];\n });\n\n const [chosenGcpCryptoKey, setChosenGcpCryptoKey] =\n useState<GcpCryptoKeyObject>(() => {\n if (state === RiScDialogStates.EditEncryption && sopsData?.gcp_kms) {\n const gcpKms = sopsData.gcp_kms[0];\n if (gcpKms?.resource_id) {\n const resourceParts = gcpKms.resource_id.split('/');\n if (resourceParts.length === 8) {\n return {\n projectId: resourceParts[1],\n keyRing: resourceParts[5],\n keyName: resourceParts[7],\n locations: resourceParts[3],\n resourceId: gcpKms.resource_id,\n createdAt: gcpKms.created_at,\n hasEncryptDecryptAccess: true,\n };\n }\n }\n }\n return gcpCryptoKeys[0];\n });\n\n useEffect(() => {\n setValue('sopsConfig', {\n shamir_threshold: 2,\n gcp_kms: [\n {\n resource_id: chosenGcpCryptoKey.resourceId,\n created_at: chosenGcpCryptoKey.createdAt,\n },\n ],\n age: publicAgeKeys.map(key => ({ recipient: key })),\n });\n }, [chosenGcpCryptoKey, publicAgeKeys, setValue]);\n\n const handleChangeGcpCryptoKey = (newKey: GcpCryptoKeyObject) => {\n setChosenGcpCryptoKey(newKey);\n };\n\n const handleAddPublicAgeKey = () => {\n if (isPublicAgeKeyValid(newPublicAgeKey)) {\n if (publicAgeKeys.includes(newPublicAgeKey)) {\n setPublicKeyTextFieldHelperText(\n t('sopsConfigDialog.publicKeyHelperTextKeyAlreadyExistInSopsConfig'),\n );\n setPublicKeyTextFieldError(true);\n } else {\n setPublicAgeKeys([...publicAgeKeys, newPublicAgeKey]);\n setNewPublicAgeKey('');\n }\n } else {\n setPublicKeyTextFieldHelperText(\n t('sopsConfigDialog.publicKeyHelperTextKeyNotValid'),\n );\n setPublicKeyTextFieldError(true);\n }\n };\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}>\n <DialogContentText>\n {state === RiScDialogStates.Create\n ? t('sopsConfigDialog.description.new')\n : t('sopsConfigDialog.description.edit')}\n </DialogContentText>\n {t('sopsConfigDialog.selectKeysTitle')}\n {t('sopsConfigDialog.gcpCryptoKeyDescription')}\n\n <GcpCryptoKeyMenu\n chosenGcpCryptoKey={chosenGcpCryptoKey}\n onChange={handleChangeGcpCryptoKey}\n gcpCryptoKeys={gcpCryptoKeys}\n />\n <Box>\n <Accordion elevation={1} defaultExpanded={publicAgeKeys.length > 0}>\n <AccordionSummary\n expandIcon={<ExpandMore />}\n aria-controls=\"panel1-content\"\n id=\"panel1-header\"\n >\n {t('sopsConfigDialog.publicAgeKeyQuestion')}\n </AccordionSummary>\n <AccordionDetails>\n <Box>\n {publicAgeKeys.length > 0 && (\n <FormLabel>\n {t('sopsConfigDialog.publicAgeKeysAlreadyPresent')}\n </FormLabel>\n )}\n <List>\n {publicAgeKeys.map(key => (\n <ListItem key={key} dense>\n <ListItemText>{key}</ListItemText>\n <ListItemSecondaryAction>\n <IconButton\n onClick={() => {\n setPublicAgeKeys(\n publicAgeKeys.filter(k => k !== key),\n );\n }}\n >\n <DeleteIcon />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n ))}\n </List>\n <Typography>\n {t('dictionary.click')}{' '}\n <Link\n href=\"https://kartverket.atlassian.net/wiki/spaces/SIK/pages/1472528509/Skrive+koden+r+RoS+lokalt\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n color=\"primary\"\n underline=\"hover\"\n >\n {t('dictionary.here')}\n </Link>{' '}\n {t('sopsConfigDialog.writeLocalRiscSuffix')}\n </Typography>\n <Typography>\n {`${t('sopsConfigDialog.publicAgeKeyDescription')} (${t(\n 'dictionary.optional',\n )})`}\n </Typography>\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'space-between',\n gap: 2,\n }}\n >\n <TextField\n label={t('sopsConfigDialog.publicAgeKey')}\n helperText={publicAgeKeyHelperText}\n error={publicAgeKeyError}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n handleAddPublicAgeKey();\n }\n }}\n onFocus={() => {\n setPublicKeyTextFieldError(false);\n setPublicKeyTextFieldHelperText('');\n }}\n value={newPublicAgeKey}\n onChange={e => setNewPublicAgeKey(e.target.value)}\n />\n <Button\n startIcon={<AddCircle />}\n variant=\"text\"\n color=\"primary\"\n onClick={handleAddPublicAgeKey}\n sx={{\n maxWidth: 200,\n mt: 1,\n }}\n >\n {t('sopsConfigDialog.addPublicAgeKey')}\n </Button>\n </Box>\n </Box>\n </AccordionDetails>\n </Accordion>\n </Box>\n </Box>\n );\n};\n\nexport default ConfigEncryptionDialog;\n"],"names":["React"],"mappings":"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"}
|
|
@@ -47,8 +47,7 @@ const RiScDialog = ({ onClose, dialogState }) => {
|
|
|
47
47
|
defaultValues: dialogState === 2 /* EditRiscInfo */ || dialogState === 3 /* EditEncryption */ ? selectedRiSc : {
|
|
48
48
|
content: emptyRiSc(),
|
|
49
49
|
sopsConfig: {
|
|
50
|
-
shamir_threshold: 2
|
|
51
|
-
key_groups: []
|
|
50
|
+
shamir_threshold: 2
|
|
52
51
|
}
|
|
53
52
|
},
|
|
54
53
|
mode: "onBlur"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScDialog.esm.js","sources":["../../../src/components/riScDialog/RiScDialog.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { emptyRiSc } from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useForm } from 'react-hook-form';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogActions from '@mui/material/DialogActions';\nimport { dialogActions } from '../common/mixins';\nimport Box from '@mui/material/Box';\nimport { Step, StepLabel, Stepper } from '@mui/material';\nimport ConfigEncryptionDialog from './ConfigEncryptionDialog';\nimport ConfigRiscInfo from './ConfigRiscInfo';\n\nexport enum RiScDialogStates {\n Closed,\n Create,\n EditRiscInfo,\n EditEncryption,\n}\n\ninterface RiScDialogProps {\n onClose: () => void;\n dialogState: RiScDialogStates;\n}\n\nexport enum CreateRiScFrom {\n Scratch,\n Default,\n}\n\nconst RiScStepper = ({\n children,\n activeStep,\n}: {\n children: React.ReactNode;\n activeStep: number;\n}) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const steps = [t('rosDialog.stepRiscDetails'), t('rosDialog.stepEncryption')];\n return (\n <Box sx={{ width: '100%', p: 2 }}>\n <Stepper activeStep={activeStep}>\n {steps.map(label => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n {children}\n </Box>\n );\n};\n\nexport const RiScDialog = ({ onClose, dialogState }: RiScDialogProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { selectedRiSc, createNewRiSc, updateRiSc, gcpCryptoKeys } = useRiScs();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n setValue,\n } = useForm<RiScWithMetadata>({\n defaultValues:\n dialogState === RiScDialogStates.EditRiscInfo ||\n dialogState === RiScDialogStates.EditEncryption\n ? selectedRiSc!\n : {\n content: emptyRiSc(),\n sopsConfig: {\n shamir_threshold: 2,\n key_groups: [],\n },\n },\n mode: 'onBlur',\n });\n\n const [activeStep, setActiveStep] = useState(0);\n const titleTranslation = (() => {\n if (dialogState === RiScDialogStates.Create) {\n return t('rosDialog.titleNew', {});\n }\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return t('rosDialog.titleEdit', {});\n }\n return t('rosDialog.editEncryption', {});\n })();\n\n const [createRiScFrom, setCreateRiScFrom] = useState<CreateRiScFrom>(\n CreateRiScFrom.Scratch,\n );\n const handleChangeCreateRiScFrom = () => {\n if (createRiScFrom === CreateRiScFrom.Scratch) {\n setCreateRiScFrom(CreateRiScFrom.Default);\n } else {\n setCreateRiScFrom(CreateRiScFrom.Scratch);\n }\n };\n\n const handleNext = handleSubmit(() => {\n if (activeStep === 0) {\n setActiveStep(1);\n }\n });\n\n const handleBack = () => {\n if (activeStep === 1) {\n setActiveStep(0);\n }\n };\n\n const handleFinish = handleSubmit((data: RiScWithMetadata) => {\n if (dialogState === RiScDialogStates.Create) {\n createNewRiSc(data, createRiScFrom === CreateRiScFrom.Default);\n } else {\n updateRiSc(data);\n }\n onClose();\n });\n\n if (dialogState === RiScDialogStates.Create) {\n return (\n <Dialog open={dialogState === RiScDialogStates.Create} onClose={onClose}>\n <DialogTitle>{titleTranslation}</DialogTitle>\n <RiScStepper activeStep={activeStep}>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n {activeStep === 0 && (\n <ConfigRiscInfo\n dialogState={dialogState}\n createRiScFrom={createRiScFrom}\n handleChangeCreateRiScFrom={handleChangeCreateRiScFrom}\n register={register}\n errors={errors}\n />\n )}\n {activeStep === 1 && (\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n setValue={setValue}\n state={dialogState}\n register={register}\n />\n )}\n </DialogContent>\n </RiScStepper>\n <DialogActions sx={dialogActions}>\n {activeStep > 0 && (\n <Button variant=\"outlined\" onClick={handleBack}>\n {t('dictionary.previous')}\n </Button>\n )}\n <Button variant=\"outlined\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n {activeStep === 0 ? (\n <Button variant=\"contained\" onClick={handleNext}>\n {t('dictionary.next')}\n </Button>\n ) : (\n <Button variant=\"contained\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return (\n <Dialog\n open={dialogState === RiScDialogStates.EditRiscInfo}\n onClose={onClose}\n >\n <DialogTitle>{titleTranslation}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n <ConfigRiscInfo\n dialogState={dialogState}\n createRiScFrom={createRiScFrom}\n handleChangeCreateRiScFrom={handleChangeCreateRiScFrom}\n register={register}\n errors={errors}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button variant=\"outlined\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button variant=\"contained\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditEncryption) {\n return (\n <Dialog\n open={dialogState === RiScDialogStates.EditEncryption}\n onClose={onClose}\n >\n <DialogTitle>{titleTranslation}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n sopsData={selectedRiSc?.sopsConfig}\n setValue={setValue}\n state={dialogState}\n register={register}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button variant=\"outlined\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button variant=\"contained\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n return null;\n};\n"],"names":["RiScDialogStates","CreateRiScFrom","React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RiScDialog.esm.js","sources":["../../../src/components/riScDialog/RiScDialog.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { emptyRiSc } from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useForm } from 'react-hook-form';\nimport Button from '@mui/material/Button';\nimport Dialog from '@mui/material/Dialog';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogActions from '@mui/material/DialogActions';\nimport { dialogActions } from '../common/mixins';\nimport Box from '@mui/material/Box';\nimport { Step, StepLabel, Stepper } from '@mui/material';\nimport ConfigEncryptionDialog from './ConfigEncryptionDialog';\nimport ConfigRiscInfo from './ConfigRiscInfo';\n\nexport enum RiScDialogStates {\n Closed,\n Create,\n EditRiscInfo,\n EditEncryption,\n}\n\ninterface RiScDialogProps {\n onClose: () => void;\n dialogState: RiScDialogStates;\n}\n\nexport enum CreateRiScFrom {\n Scratch,\n Default,\n}\n\nconst RiScStepper = ({\n children,\n activeStep,\n}: {\n children: React.ReactNode;\n activeStep: number;\n}) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const steps = [t('rosDialog.stepRiscDetails'), t('rosDialog.stepEncryption')];\n return (\n <Box sx={{ width: '100%', p: 2 }}>\n <Stepper activeStep={activeStep}>\n {steps.map(label => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n {children}\n </Box>\n );\n};\n\nexport const RiScDialog = ({ onClose, dialogState }: RiScDialogProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { selectedRiSc, createNewRiSc, updateRiSc, gcpCryptoKeys } = useRiScs();\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n setValue,\n } = useForm<RiScWithMetadata>({\n defaultValues:\n dialogState === RiScDialogStates.EditRiscInfo ||\n dialogState === RiScDialogStates.EditEncryption\n ? selectedRiSc!\n : {\n content: emptyRiSc(),\n sopsConfig: {\n shamir_threshold: 2,\n },\n },\n mode: 'onBlur',\n });\n\n const [activeStep, setActiveStep] = useState(0);\n const titleTranslation = (() => {\n if (dialogState === RiScDialogStates.Create) {\n return t('rosDialog.titleNew', {});\n }\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return t('rosDialog.titleEdit', {});\n }\n return t('rosDialog.editEncryption', {});\n })();\n\n const [createRiScFrom, setCreateRiScFrom] = useState<CreateRiScFrom>(\n CreateRiScFrom.Scratch,\n );\n const handleChangeCreateRiScFrom = () => {\n if (createRiScFrom === CreateRiScFrom.Scratch) {\n setCreateRiScFrom(CreateRiScFrom.Default);\n } else {\n setCreateRiScFrom(CreateRiScFrom.Scratch);\n }\n };\n\n const handleNext = handleSubmit(() => {\n if (activeStep === 0) {\n setActiveStep(1);\n }\n });\n\n const handleBack = () => {\n if (activeStep === 1) {\n setActiveStep(0);\n }\n };\n\n const handleFinish = handleSubmit((data: RiScWithMetadata) => {\n if (dialogState === RiScDialogStates.Create) {\n createNewRiSc(data, createRiScFrom === CreateRiScFrom.Default);\n } else {\n updateRiSc(data);\n }\n onClose();\n });\n\n if (dialogState === RiScDialogStates.Create) {\n return (\n <Dialog open={dialogState === RiScDialogStates.Create} onClose={onClose}>\n <DialogTitle>{titleTranslation}</DialogTitle>\n <RiScStepper activeStep={activeStep}>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n {activeStep === 0 && (\n <ConfigRiscInfo\n dialogState={dialogState}\n createRiScFrom={createRiScFrom}\n handleChangeCreateRiScFrom={handleChangeCreateRiScFrom}\n register={register}\n errors={errors}\n />\n )}\n {activeStep === 1 && (\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n setValue={setValue}\n state={dialogState}\n register={register}\n />\n )}\n </DialogContent>\n </RiScStepper>\n <DialogActions sx={dialogActions}>\n {activeStep > 0 && (\n <Button variant=\"outlined\" onClick={handleBack}>\n {t('dictionary.previous')}\n </Button>\n )}\n <Button variant=\"outlined\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n {activeStep === 0 ? (\n <Button variant=\"contained\" onClick={handleNext}>\n {t('dictionary.next')}\n </Button>\n ) : (\n <Button variant=\"contained\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return (\n <Dialog\n open={dialogState === RiScDialogStates.EditRiscInfo}\n onClose={onClose}\n >\n <DialogTitle>{titleTranslation}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n <ConfigRiscInfo\n dialogState={dialogState}\n createRiScFrom={createRiScFrom}\n handleChangeCreateRiScFrom={handleChangeCreateRiScFrom}\n register={register}\n errors={errors}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button variant=\"outlined\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button variant=\"contained\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditEncryption) {\n return (\n <Dialog\n open={dialogState === RiScDialogStates.EditEncryption}\n onClose={onClose}\n >\n <DialogTitle>{titleTranslation}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n sopsData={selectedRiSc?.sopsConfig}\n setValue={setValue}\n state={dialogState}\n register={register}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button variant=\"outlined\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button variant=\"contained\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n return null;\n};\n"],"names":["RiScDialogStates","CreateRiScFrom","React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n SopsConfig,\n Valuations,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n valuations: Valuations[];\n scenarios: ScenarioDTO[];\n};\n\nexport type SopsConfigResultDTO = {\n status: ProcessingStatus;\n statusMessage: string;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n sopsConfigs: SopsConfig[];\n} & ProcessRiScResultDTO;\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n keyName: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n hasEncryptDecryptAccess?: boolean;\n};\n\nexport type PullRequestObject = {\n url: string;\n title: string;\n openedBy: string;\n createdAt: string;\n};\n\nexport type SopsConfigRequestBody = {\n gcpCryptoKey: GcpCryptoKeyObject;\n publicAgeKeys: string[];\n};\n\nexport type SopsConfigCreateResponse = {\n status: ProcessingStatus;\n statusMessage: string;\n sopsConfig: SopsConfig;\n} & ProcessRiScResultDTO;\n\nexport type SopsConfigUpdateResponse = {\n status: ProcessingStatus;\n statusMessage: string;\n} & ProcessRiScResultDTO;\n\nexport type OpenPullRequestForSopsConfigResponseBody = {\n status: ProcessingStatus;\n statusMessage: string;\n pullRequest: PullRequestObject;\n} & ProcessRiScResultDTO;\n\ntype ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\ntype ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nfunction dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nfunction dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function sopsConfigToDTOString(\n sopsConfig: SopsConfigRequestBody,\n): string {\n return JSON.stringify({\n gcpCryptoKey: {\n projectId: sopsConfig.gcpCryptoKey.projectId,\n keyRing: sopsConfig.gcpCryptoKey.keyRing,\n keyName: sopsConfig.gcpCryptoKey.keyName,\n },\n publicAgeKeys: sopsConfig.publicAgeKeys,\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n ...riSc,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n
|
|
1
|
+
{"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n SopsConfig,\n Valuations,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n valuations: Valuations[];\n scenarios: ScenarioDTO[];\n};\n\nexport type SopsConfigResultDTO = {\n status: ProcessingStatus;\n statusMessage: string;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n sopsConfigs: SopsConfig[];\n} & ProcessRiScResultDTO;\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n keyName: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n hasEncryptDecryptAccess?: boolean;\n};\n\nexport type PullRequestObject = {\n url: string;\n title: string;\n openedBy: string;\n createdAt: string;\n};\n\nexport type SopsConfigRequestBody = {\n gcpCryptoKey: GcpCryptoKeyObject;\n publicAgeKeys: string[];\n};\n\nexport type SopsConfigCreateResponse = {\n status: ProcessingStatus;\n statusMessage: string;\n sopsConfig: SopsConfig;\n} & ProcessRiScResultDTO;\n\nexport type SopsConfigUpdateResponse = {\n status: ProcessingStatus;\n statusMessage: string;\n} & ProcessRiScResultDTO;\n\nexport type OpenPullRequestForSopsConfigResponseBody = {\n status: ProcessingStatus;\n statusMessage: string;\n pullRequest: PullRequestObject;\n} & ProcessRiScResultDTO;\n\ntype ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\ntype ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nfunction dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nfunction dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function sopsConfigToDTOString(\n sopsConfig: SopsConfigRequestBody,\n): string {\n return JSON.stringify({\n gcpCryptoKey: {\n projectId: sopsConfig.gcpCryptoKey.projectId,\n keyRing: sopsConfig.gcpCryptoKey.keyRing,\n keyName: sopsConfig.gcpCryptoKey.keyName,\n },\n publicAgeKeys: sopsConfig.publicAgeKeys,\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n ...riSc,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n age?: AgeEntry[];\n gcp_kms: GcpKmsEntry[];\n lastmodified?: string;\n unencrypted_suffix?: string;\n version?: string;\n};\n\nexport type GcpKmsEntry = {\n resource_id: string;\n created_at: string;\n};\n\nexport type AgeEntry = {\n recipient: string;\n};\n"],"names":[],"mappings":"AAiIO,SAAS,UAAU,OAAwB,EAAA;AAChD,EAAO,OAAA;AAAA,IACL,GAAG,OAAA;AAAA;AAAA;AAAA,IAGH,SAAW,EAAA,OAAA,CAAQ,SAAU,CAAA,GAAA,CAAI,aAAa;AAAA,GAChD;AACF;AAEA,SAAS,cAAc,WAAoC,EAAA;AACzD,EAAO,OAAA;AAAA,IACL,GAAG,WAAY,CAAA,QAAA;AAAA,IACf,OAAO,WAAY,CAAA,KAAA;AAAA,IACnB,OAAS,EAAA,WAAA,CAAY,QAAS,CAAA,OAAA,CAAQ,IAAI,WAAW;AAAA,GACvD;AACF;AAEA,SAAS,YAAY,SAA+B,EAAA;AAClD,EAAO,OAAA;AAAA,IACL,GAAG,SAAU,CAAA,MAAA;AAAA,IACb,OAAO,SAAU,CAAA;AAAA,GACnB;AACF;AAEO,SAAS,uBAAuB,OAA8B,EAAA;AACnE,EAAA,OAAO,KAAK,SAAU,CAAA;AAAA,IACpB,IAAA,EAAM,QAAQ,WAAe,IAAA,EAAA;AAAA,IAC7B,KAAA,EAAO,QAAQ,KAAS,IAAA;AAAA,GACzB,CAAA;AACH;AAEO,SAAS,sBACd,UACQ,EAAA;AACR,EAAA,OAAO,KAAK,SAAU,CAAA;AAAA,IACpB,YAAc,EAAA;AAAA,MACZ,SAAA,EAAW,WAAW,YAAa,CAAA,SAAA;AAAA,MACnC,OAAA,EAAS,WAAW,YAAa,CAAA,OAAA;AAAA,MACjC,OAAA,EAAS,WAAW,YAAa,CAAA;AAAA,KACnC;AAAA,IACA,eAAe,UAAW,CAAA;AAAA,GAC3B,CAAA;AACH;AAEO,SAAS,eACd,CAAA,IAAA,EACA,qBACA,EAAA,OAAA,EACA,UACQ,EAAA;AACR,EAAM,MAAA,IAAA,GAAO,KAAK,SAAU,CAAA;AAAA,IAC1B,IAAM,EAAA,IAAA,CAAK,SAAU,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IACpC,qBAAA;AAAA,IACA,eAAe,IAAK,CAAA,aAAA;AAAA,IACpB,QAAU,EAAA;AAAA,MACR,IAAA,EAAM,QAAQ,WAAe,IAAA,EAAA;AAAA,MAC7B,KAAA,EAAO,QAAQ,KAAS,IAAA;AAAA,KAC1B;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAO,OAAA,IAAA;AACT;AAEA,SAAS,UAAU,IAAqB,EAAA;AACtC,EAAO,OAAA;AAAA,IACL,GAAG,IAAA;AAAA,IACH,SAAW,EAAA,IAAA,CAAK,SAAU,CAAA,GAAA,CAAI,aAAa;AAAA,GAC7C;AACF;AAEA,SAAS,cAAc,QAAiC,EAAA;AACtD,EAAO,OAAA;AAAA,IACL,OAAO,QAAS,CAAA,KAAA;AAAA,IAChB,QAAU,EAAA;AAAA,MACR,IAAI,QAAS,CAAA,EAAA;AAAA,MACb,KAAK,QAAS,CAAA,GAAA;AAAA,MACd,aAAa,QAAS,CAAA,WAAA;AAAA,MACtB,cAAc,QAAS,CAAA,YAAA;AAAA,MACvB,iBAAiB,QAAS,CAAA,eAAA;AAAA,MAC1B,MAAM,QAAS,CAAA,IAAA;AAAA,MACf,OAAS,EAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,WAAW,CAAA;AAAA,MACzC,eAAe,QAAS,CAAA;AAAA;AAC1B,GACF;AACF;AAEA,SAAS,YAAY,MAA4B,EAAA;AAC/C,EAAO,OAAA;AAAA,IACL,OAAO,MAAO,CAAA,KAAA;AAAA,IACd,MAAQ,EAAA;AAAA,MACN,IAAI,MAAO,CAAA,EAAA;AAAA,MACX,aAAa,MAAO,CAAA,WAAA;AAAA,MACpB,QAAQ,MAAO,CAAA,MAAA;AAAA,MACf,KAAK,MAAO,CAAA;AAAA;AACd,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilityfunctions.esm.js","sources":["../../src/utils/utilityfunctions.ts"],"sourcesContent":["import { RiSc, RiScWithMetadata, Risk, Scenario } from './types';\nimport {\n consequenceOptions,\n latestSupportedVersion,\n probabilityOptions,\n riskMatrix,\n} from './constants';\nimport { formatISO } from 'date-fns';\nimport { UpdateStatus } from '../contexts/RiScContext';\nimport { SopsConfigDTO } from './DTOs';\n\nexport function generateRandomId(): string {\n return [...Array(5)]\n .map(() => {\n const randomChar = Math.random().toString(36)[2];\n return Math.random() < 0.5 ? randomChar.toUpperCase() : randomChar;\n })\n .join('');\n}\n\nconst formatter = new Intl.NumberFormat('nb-NO', {\n maximumFractionDigits: 0,\n});\n\nexport function formatNOK(amount: number): string {\n return formatter.format(amount);\n}\n\nexport function getAlertSeverity(\n updateStatus: UpdateStatus,\n): 'error' | 'info' | 'warning' {\n if (updateStatus.isSuccess) {\n return 'info';\n } else if (updateStatus.isError) {\n return 'error';\n }\n return 'warning';\n}\n\nexport function getRiskMatrixColor(risiko: Risk) {\n const sannsynlighet = probabilityOptions.indexOf(risiko.probability);\n const konsekvens = consequenceOptions.indexOf(risiko.consequence);\n return riskMatrix[4 - konsekvens][sannsynlighet];\n}\n\nexport const getProbabilityLevel = (risiko: Risk) =>\n probabilityOptions.indexOf(risiko.probability) + 1;\n\nexport const getConsequenceLevel = (risiko: Risk) =>\n consequenceOptions.indexOf(risiko.consequence) + 1;\n\nexport const emptyRiSc = (): RiSc => ({\n schemaVersion: latestSupportedVersion,\n title: '',\n scope: '',\n valuations: [],\n scenarios: [],\n});\n\nexport function arrayNotEquals<T>(array1: T[], array2: T[]): boolean {\n if (array1.length !== array2.length) {\n return true;\n }\n return array1.reduce((returnValue, currentElement, index) => {\n if (currentElement !== array2[index]) {\n return true;\n }\n return returnValue;\n }, false);\n}\n\n// keys that does not change the approval status: tittel, beskrivelse, oppsummering, tiltak.beskrivelse, tiltak.tiltakseier, tiltak.status\nexport const requiresNewApproval = (\n oldRiSc: RiSc,\n updatedRiSc: RiSc,\n): boolean => {\n if (oldRiSc.scenarios.length !== updatedRiSc.scenarios.length) {\n return true;\n }\n let requiresApproval = false;\n\n const updatedScenarioMap = new Map<string, Scenario>(\n updatedRiSc.scenarios.map(scenario => [scenario.ID, scenario]),\n );\n\n oldRiSc.scenarios.forEach(oldScenario => {\n const updatedScenario = updatedScenarioMap.get(oldScenario.ID);\n\n if (!updatedScenario) {\n requiresApproval = true;\n return;\n }\n\n if (\n arrayNotEquals(oldScenario.threatActors, updatedScenario.threatActors)\n ) {\n requiresApproval = true;\n }\n\n if (\n arrayNotEquals(\n oldScenario.vulnerabilities,\n updatedScenario.vulnerabilities,\n )\n ) {\n requiresApproval = true;\n }\n\n if (oldScenario.risk.probability !== updatedScenario.risk.probability) {\n requiresApproval = true;\n }\n\n if (oldScenario.risk.consequence !== updatedScenario.risk.consequence) {\n requiresApproval = true;\n }\n\n if (oldScenario.actions.length !== updatedScenario.actions.length) {\n requiresApproval = true;\n }\n if (\n oldScenario.remainingRisk.probability !==\n updatedScenario.remainingRisk.probability\n ) {\n requiresApproval = true;\n }\n if (\n oldScenario.remainingRisk.consequence !==\n updatedScenario.remainingRisk.consequence\n ) {\n requiresApproval = true;\n }\n });\n return requiresApproval;\n};\n\nexport function formatNumber(\n cost: number,\n t: (s: any, c: any) => string,\n): string {\n function getTranslationWithCorrectUnit(\n costValue: number,\n threshold: number,\n unit: string,\n ): string {\n return t(`riskMatrix.estimatedRisk.suffix.${unit}`, {\n count: Number(((costValue / threshold) * 1000).toFixed(0)),\n });\n }\n\n if (cost < 1e4) {\n return formatNOK(cost);\n }\n if (cost < 1e6) {\n return getTranslationWithCorrectUnit(cost, 1e6, 'thousand');\n }\n if (cost < 1e9) {\n return getTranslationWithCorrectUnit(cost, 1e9, 'million');\n }\n if (cost < 1e12) {\n return getTranslationWithCorrectUnit(cost, 1e12, 'billion');\n }\n return getTranslationWithCorrectUnit(cost, 1e15, 'trillion');\n}\n\nexport function parseISODateFromEncryptedROS(date?: string): string | null {\n // Early return if date is null, could happen from recursion\n if (!date) {\n return null;\n }\n try {\n return formatISO(date);\n } catch (e) {\n if (e instanceof RangeError) {\n // Could not parse string to date\n // Sometimes this is because SOPS saved the date with ekstra escaped quotations: \\\"date\\\"\n // Trim the string and try again\n return parseISODateFromEncryptedROS(date.substring(1, date.length - 1));\n }\n return null;\n }\n}\n\nexport function getTranslationKey(\n type: string,\n key: string,\n t: (s: any) => string,\n): string {\n if (type === 'error') {\n return t([`errorMessages.${key}`, 'errorMessages.DefaultErrorMessage']);\n }\n return t(`infoMessages.${key}`);\n}\n\nexport function gcpProjectIdToReadableString(gcpProjectId: string) {\n const parts = gcpProjectId.split('-');\n parts.pop();\n return parts.join('-');\n}\n\nexport function isPublicAgeKeyValid(publicAgeKey: string) {\n if (publicAgeKey.length !== 62) {\n return false;\n }\n\n if (!publicAgeKey.startsWith('age1')) {\n return false;\n }\n\n const ageKeyRegex = /^age1[ac-hj-np-z02-9]{58}$/;\n return ageKeyRegex.test(publicAgeKey);\n}\n\nexport function findKeyGroupByAgeKey(\n sopsConfig: SopsConfigDTO,\n ageKey: string,\n) {\n return sopsConfig.key_groups.find(keyGroup =>\n keyGroup.age?.some(key => key.recipient === ageKey),\n );\n}\n\nexport function getGCPKey(sopsConfig: SopsConfigDTO) {\n return sopsConfig.key_groups\n .find(keyGroup => keyGroup.gcp_kms)\n ?.gcp_kms?.at(0);\n}\n\nexport interface Duration {\n months: number;\n weeks: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport function getPullRequestSecondaryText(\n fromDate: Date,\n userName: string,\n t: (s: any) => string,\n) {\n const now = new Date();\n const diffMilliseconds = now.getTime() - fromDate.getTime();\n\n const seconds = Math.floor(diffMilliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const weeks = Math.floor(days / 7);\n const months =\n now.getUTCMonth() -\n fromDate.getUTCMonth() +\n (now.getUTCFullYear() - fromDate.getUTCFullYear()) * 12;\n\n const text = t('sopsConfigDialog.secondaryPullRequestText');\n\n // Rounding up (like GitHub?)\n if (months > 0) {\n return `${text.replace(\n '_n_',\n `${months} ${\n months > 1 ? t('dictionary.months') : t('dictionary.month')\n }`,\n )} ${userName}`;\n }\n if (weeks > 0) {\n return `${text.replace(\n '_n_',\n `${weeks} ${weeks > 1 ? t('dictionary.weeks') : t('dictionary.week')}`,\n )} ${userName}`;\n }\n if (days > 0) {\n const remainingHours = hours % 24;\n const adjustedDays = remainingHours >= 12 ? days + 1 : days;\n return `${text.replace(\n '_n_',\n `${adjustedDays} ${\n adjustedDays > 1 ? t('dictionary.days') : t('dictionary.day')\n }`,\n )} ${userName}`;\n }\n if (hours > 0) {\n const remainingMinutes = minutes % 60;\n const adjustedHours = remainingMinutes >= 30 ? hours + 1 : hours;\n return `${text.replace(\n '_n_',\n `${adjustedHours} ${\n adjustedHours > 1 ? t('dictionary.hours') : t('dictionary.hour')\n }`,\n )} ${userName}`;\n }\n if (minutes > 0) {\n const remainingSeconds = seconds % 60;\n const adjustedMinutes = remainingSeconds >= 30 ? minutes + 1 : minutes;\n return `${text.replace(\n '_n_',\n `${adjustedMinutes} ${\n adjustedMinutes > 1 ? t('dictionary.minutes') : t('dictionary.minute')\n }`,\n )} ${userName}`;\n }\n return `${text.replace(\n '_n_',\n `${seconds} ${\n seconds > 1 ? t('dictionary.seconds') : t('dictionary.second')\n }`,\n )} ${userName}`;\n}\n\nexport const deleteScenario = (\n riSc: RiScWithMetadata | null,\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void,\n scenario: Scenario,\n) => {\n if (riSc) {\n const updatedScenarios = riSc.content.scenarios.filter(\n s => s.ID !== scenario.ID,\n );\n updateRiSc({\n ...riSc,\n content: { ...riSc.content, scenarios: updatedScenarios },\n });\n }\n};\n\nexport const deleteAction = (\n remove: (index?: number | number[]) => void,\n index: number,\n onSubmit: () => void,\n) => {\n remove(index);\n onSubmit();\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utilityfunctions.esm.js","sources":["../../src/utils/utilityfunctions.ts"],"sourcesContent":["import { RiSc, RiScWithMetadata, Risk, Scenario } from './types';\nimport {\n consequenceOptions,\n latestSupportedVersion,\n probabilityOptions,\n riskMatrix,\n} from './constants';\nimport { formatISO } from 'date-fns';\nimport { UpdateStatus } from '../contexts/RiScContext';\n\nexport function generateRandomId(): string {\n return [...Array(5)]\n .map(() => {\n const randomChar = Math.random().toString(36)[2];\n return Math.random() < 0.5 ? randomChar.toUpperCase() : randomChar;\n })\n .join('');\n}\n\nconst formatter = new Intl.NumberFormat('nb-NO', {\n maximumFractionDigits: 0,\n});\n\nexport function formatNOK(amount: number): string {\n return formatter.format(amount);\n}\n\nexport function getAlertSeverity(\n updateStatus: UpdateStatus,\n): 'error' | 'info' | 'warning' {\n if (updateStatus.isSuccess) {\n return 'info';\n } else if (updateStatus.isError) {\n return 'error';\n }\n return 'warning';\n}\n\nexport function getRiskMatrixColor(risiko: Risk) {\n const sannsynlighet = probabilityOptions.indexOf(risiko.probability);\n const konsekvens = consequenceOptions.indexOf(risiko.consequence);\n return riskMatrix[4 - konsekvens][sannsynlighet];\n}\n\nexport const getProbabilityLevel = (risiko: Risk) =>\n probabilityOptions.indexOf(risiko.probability) + 1;\n\nexport const getConsequenceLevel = (risiko: Risk) =>\n consequenceOptions.indexOf(risiko.consequence) + 1;\n\nexport const emptyRiSc = (): RiSc => ({\n schemaVersion: latestSupportedVersion,\n title: '',\n scope: '',\n valuations: [],\n scenarios: [],\n});\n\nexport function arrayNotEquals<T>(array1: T[], array2: T[]): boolean {\n if (array1.length !== array2.length) {\n return true;\n }\n return array1.reduce((returnValue, currentElement, index) => {\n if (currentElement !== array2[index]) {\n return true;\n }\n return returnValue;\n }, false);\n}\n\n// keys that does not change the approval status: tittel, beskrivelse, oppsummering, tiltak.beskrivelse, tiltak.tiltakseier, tiltak.status\nexport const requiresNewApproval = (\n oldRiSc: RiSc,\n updatedRiSc: RiSc,\n): boolean => {\n if (oldRiSc.scenarios.length !== updatedRiSc.scenarios.length) {\n return true;\n }\n let requiresApproval = false;\n\n const updatedScenarioMap = new Map<string, Scenario>(\n updatedRiSc.scenarios.map(scenario => [scenario.ID, scenario]),\n );\n\n oldRiSc.scenarios.forEach(oldScenario => {\n const updatedScenario = updatedScenarioMap.get(oldScenario.ID);\n\n if (!updatedScenario) {\n requiresApproval = true;\n return;\n }\n\n if (\n arrayNotEquals(oldScenario.threatActors, updatedScenario.threatActors)\n ) {\n requiresApproval = true;\n }\n\n if (\n arrayNotEquals(\n oldScenario.vulnerabilities,\n updatedScenario.vulnerabilities,\n )\n ) {\n requiresApproval = true;\n }\n\n if (oldScenario.risk.probability !== updatedScenario.risk.probability) {\n requiresApproval = true;\n }\n\n if (oldScenario.risk.consequence !== updatedScenario.risk.consequence) {\n requiresApproval = true;\n }\n\n if (oldScenario.actions.length !== updatedScenario.actions.length) {\n requiresApproval = true;\n }\n if (\n oldScenario.remainingRisk.probability !==\n updatedScenario.remainingRisk.probability\n ) {\n requiresApproval = true;\n }\n if (\n oldScenario.remainingRisk.consequence !==\n updatedScenario.remainingRisk.consequence\n ) {\n requiresApproval = true;\n }\n });\n return requiresApproval;\n};\n\nexport function formatNumber(\n cost: number,\n t: (s: any, c: any) => string,\n): string {\n function getTranslationWithCorrectUnit(\n costValue: number,\n threshold: number,\n unit: string,\n ): string {\n return t(`riskMatrix.estimatedRisk.suffix.${unit}`, {\n count: Number(((costValue / threshold) * 1000).toFixed(0)),\n });\n }\n\n if (cost < 1e4) {\n return formatNOK(cost);\n }\n if (cost < 1e6) {\n return getTranslationWithCorrectUnit(cost, 1e6, 'thousand');\n }\n if (cost < 1e9) {\n return getTranslationWithCorrectUnit(cost, 1e9, 'million');\n }\n if (cost < 1e12) {\n return getTranslationWithCorrectUnit(cost, 1e12, 'billion');\n }\n return getTranslationWithCorrectUnit(cost, 1e15, 'trillion');\n}\n\nexport function parseISODateFromEncryptedROS(date?: string): string | null {\n // Early return if date is null, could happen from recursion\n if (!date) {\n return null;\n }\n try {\n return formatISO(date);\n } catch (e) {\n if (e instanceof RangeError) {\n // Could not parse string to date\n // Sometimes this is because SOPS saved the date with ekstra escaped quotations: \\\"date\\\"\n // Trim the string and try again\n return parseISODateFromEncryptedROS(date.substring(1, date.length - 1));\n }\n return null;\n }\n}\n\nexport function getTranslationKey(\n type: string,\n key: string,\n t: (s: any) => string,\n): string {\n if (type === 'error') {\n return t([`errorMessages.${key}`, 'errorMessages.DefaultErrorMessage']);\n }\n return t(`infoMessages.${key}`);\n}\n\nexport function gcpProjectIdToReadableString(gcpProjectId: string) {\n const parts = gcpProjectId.split('-');\n parts.pop();\n return parts.join('-');\n}\n\nexport function isPublicAgeKeyValid(publicAgeKey: string) {\n if (publicAgeKey.length !== 62) {\n return false;\n }\n\n if (!publicAgeKey.startsWith('age1')) {\n return false;\n }\n\n const ageKeyRegex = /^age1[ac-hj-np-z02-9]{58}$/;\n return ageKeyRegex.test(publicAgeKey);\n}\n\nexport interface Duration {\n months: number;\n weeks: number;\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport function getPullRequestSecondaryText(\n fromDate: Date,\n userName: string,\n t: (s: any) => string,\n) {\n const now = new Date();\n const diffMilliseconds = now.getTime() - fromDate.getTime();\n\n const seconds = Math.floor(diffMilliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n const weeks = Math.floor(days / 7);\n const months =\n now.getUTCMonth() -\n fromDate.getUTCMonth() +\n (now.getUTCFullYear() - fromDate.getUTCFullYear()) * 12;\n\n const text = t('sopsConfigDialog.secondaryPullRequestText');\n\n // Rounding up (like GitHub?)\n if (months > 0) {\n return `${text.replace(\n '_n_',\n `${months} ${\n months > 1 ? t('dictionary.months') : t('dictionary.month')\n }`,\n )} ${userName}`;\n }\n if (weeks > 0) {\n return `${text.replace(\n '_n_',\n `${weeks} ${weeks > 1 ? t('dictionary.weeks') : t('dictionary.week')}`,\n )} ${userName}`;\n }\n if (days > 0) {\n const remainingHours = hours % 24;\n const adjustedDays = remainingHours >= 12 ? days + 1 : days;\n return `${text.replace(\n '_n_',\n `${adjustedDays} ${\n adjustedDays > 1 ? t('dictionary.days') : t('dictionary.day')\n }`,\n )} ${userName}`;\n }\n if (hours > 0) {\n const remainingMinutes = minutes % 60;\n const adjustedHours = remainingMinutes >= 30 ? hours + 1 : hours;\n return `${text.replace(\n '_n_',\n `${adjustedHours} ${\n adjustedHours > 1 ? t('dictionary.hours') : t('dictionary.hour')\n }`,\n )} ${userName}`;\n }\n if (minutes > 0) {\n const remainingSeconds = seconds % 60;\n const adjustedMinutes = remainingSeconds >= 30 ? minutes + 1 : minutes;\n return `${text.replace(\n '_n_',\n `${adjustedMinutes} ${\n adjustedMinutes > 1 ? t('dictionary.minutes') : t('dictionary.minute')\n }`,\n )} ${userName}`;\n }\n return `${text.replace(\n '_n_',\n `${seconds} ${\n seconds > 1 ? t('dictionary.seconds') : t('dictionary.second')\n }`,\n )} ${userName}`;\n}\n\nexport const deleteScenario = (\n riSc: RiScWithMetadata | null,\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void,\n scenario: Scenario,\n) => {\n if (riSc) {\n const updatedScenarios = riSc.content.scenarios.filter(\n s => s.ID !== scenario.ID,\n );\n updateRiSc({\n ...riSc,\n content: { ...riSc.content, scenarios: updatedScenarios },\n });\n }\n};\n\nexport const deleteAction = (\n remove: (index?: number | number[]) => void,\n index: number,\n onSubmit: () => void,\n) => {\n remove(index);\n onSubmit();\n};\n"],"names":[],"mappings":"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"}
|