@cccsaurora/howler-ui 2.18.0-dev.700 → 2.18.0-dev.704

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.
Files changed (246) hide show
  1. package/api/index.d.ts +0 -2
  2. package/api/index.js +2 -4
  3. package/api/search/index.d.ts +1 -2
  4. package/api/search/index.js +1 -2
  5. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  6. package/components/app/App.js +7 -34
  7. package/components/app/hooks/useMatchers.js +2 -2
  8. package/components/app/hooks/useMatchers.test.js +22 -22
  9. package/components/app/hooks/useTitle.js +3 -3
  10. package/components/app/providers/FavouritesProvider.js +2 -2
  11. package/components/app/providers/HitProvider.d.ts +22 -0
  12. package/components/app/providers/{RecordProvider.js → HitProvider.js} +41 -41
  13. package/components/app/providers/{RecordSearchProvider.d.ts → HitSearchProvider.d.ts} +6 -6
  14. package/components/app/providers/{RecordSearchProvider.js → HitSearchProvider.js} +17 -12
  15. package/components/app/providers/{RecordSearchProvider.test.js → HitSearchProvider.test.js} +70 -51
  16. package/components/app/providers/ModalProvider.d.ts +0 -1
  17. package/components/app/providers/ParameterProvider.d.ts +2 -9
  18. package/components/app/providers/ParameterProvider.js +240 -165
  19. package/components/app/providers/ParameterProvider.test.js +14 -307
  20. package/components/elements/PluginTypography.d.ts +1 -2
  21. package/components/elements/PluginTypography.js +2 -3
  22. package/components/elements/UserList.d.ts +2 -5
  23. package/components/elements/UserList.js +5 -14
  24. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  25. package/components/elements/display/ChipPopper.d.ts +1 -1
  26. package/components/elements/display/HowlerCard.js +1 -1
  27. package/components/elements/display/Modal.js +0 -2
  28. package/components/elements/display/icons/BundleButton.d.ts +6 -0
  29. package/components/elements/display/icons/BundleButton.js +32 -0
  30. package/components/elements/hit/HitActions.js +4 -4
  31. package/components/elements/hit/HitBanner.js +48 -28
  32. package/components/elements/hit/HitCard.js +5 -5
  33. package/components/elements/{record/RecordComments.d.ts → hit/HitComments.d.ts} +4 -5
  34. package/components/elements/{record/RecordComments.js → hit/HitComments.js} +28 -29
  35. package/components/elements/{ObjectDetails.js → hit/HitDetails.js} +17 -17
  36. package/components/elements/hit/HitLabels.js +2 -2
  37. package/components/elements/hit/{HitPreview.d.ts → HitQuickSearch.d.ts} +3 -3
  38. package/components/elements/hit/{HitPreview.js → HitQuickSearch.js} +4 -10
  39. package/components/elements/hit/HitRelated.d.ts +6 -0
  40. package/components/elements/hit/HitRelated.js +7 -0
  41. package/components/elements/hit/HitSummary.d.ts +1 -2
  42. package/components/elements/hit/HitSummary.js +5 -6
  43. package/components/elements/{record/RecordWorklog.d.ts → hit/HitWorklog.d.ts} +3 -4
  44. package/components/elements/{record/RecordWorklog.js → hit/HitWorklog.js} +13 -15
  45. package/components/elements/hit/aggregate/HitGraph.js +8 -8
  46. package/components/elements/hit/outlines/DefaultOutline.js +1 -1
  47. package/components/elements/view/ViewTitle.d.ts +0 -1
  48. package/components/elements/view/ViewTitle.js +2 -9
  49. package/components/hooks/useHitActions.d.ts +1 -1
  50. package/components/hooks/useHitActions.js +4 -4
  51. package/components/hooks/{useRecordSelection.d.ts → useHitSelection.d.ts} +2 -2
  52. package/components/hooks/{useRecordSelection.js → useHitSelection.js} +33 -12
  53. package/components/hooks/useMyPreferences.js +1 -10
  54. package/components/hooks/useMySearch.js +2 -2
  55. package/components/hooks/useMySitemap.js +1 -4
  56. package/components/hooks/useMyTheme.js +2 -9
  57. package/components/hooks/useParamState.test.js +4 -3
  58. package/components/routes/action/edit/ActionEditor.js +2 -2
  59. package/components/routes/action/view/ActionSearch.js +1 -1
  60. package/components/routes/advanced/QueryBuilder.js +1 -1
  61. package/components/routes/advanced/QueryEditor.js +3 -3
  62. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  63. package/components/routes/analytics/AnalyticDetails.js +2 -2
  64. package/components/routes/analytics/AnalyticSearch.js +1 -1
  65. package/components/routes/dossiers/DossierEditor.js +2 -2
  66. package/components/routes/dossiers/DossierEditor.test.js +1 -1
  67. package/components/routes/help/ApiDocumentation.js +1 -1
  68. package/components/routes/help/BundleDocumentation.d.ts +3 -0
  69. package/components/routes/help/BundleDocumentation.js +12 -0
  70. package/components/routes/help/HitBannerDocumentation.js +0 -1
  71. package/components/routes/help/HitDocumentation.js +3 -1
  72. package/components/routes/help/markdown/en/bundles.md.js +1 -0
  73. package/components/routes/help/markdown/fr/bundles.md.js +1 -0
  74. package/components/routes/hits/search/BundleParentMenu.d.ts +6 -0
  75. package/components/routes/hits/search/BundleParentMenu.js +32 -0
  76. package/components/routes/hits/search/BundleScroller.d.ts +2 -0
  77. package/components/routes/hits/search/BundleScroller.js +6 -0
  78. package/components/routes/hits/search/{RecordBrowser.js → HitBrowser.js} +9 -9
  79. package/components/{elements/record/RecordContextMenu.d.ts → routes/hits/search/HitContextMenu.d.ts} +3 -3
  80. package/components/routes/hits/search/HitContextMenu.js +227 -0
  81. package/components/{elements/record/RecordContextMenu.test.js → routes/hits/search/HitContextMenu.test.js} +39 -94
  82. package/components/routes/hits/search/{RecordQuery.d.ts → HitQuery.d.ts} +2 -2
  83. package/components/routes/hits/search/{RecordQuery.js → HitQuery.js} +6 -6
  84. package/components/routes/hits/search/InformationPane.d.ts +0 -1
  85. package/components/routes/hits/search/InformationPane.js +60 -47
  86. package/components/routes/hits/search/LayoutSettings.js +3 -3
  87. package/components/routes/hits/search/QuerySettings.js +1 -2
  88. package/components/routes/hits/search/QuerySettings.test.js +9 -14
  89. package/components/routes/hits/search/SearchPane.js +49 -26
  90. package/components/routes/hits/search/ViewLink.js +3 -3
  91. package/components/routes/hits/search/ViewLink.test.js +8 -8
  92. package/components/routes/hits/search/grid/AddColumnModal.js +4 -5
  93. package/components/routes/hits/search/grid/EnhancedCell.d.ts +1 -2
  94. package/components/routes/hits/search/grid/EnhancedCell.js +2 -2
  95. package/components/routes/hits/search/grid/HitGrid.js +18 -20
  96. package/components/routes/hits/search/grid/{RecordRow.d.ts → HitRow.d.ts} +2 -3
  97. package/components/routes/hits/search/grid/{RecordRow.js → HitRow.js} +8 -10
  98. package/components/routes/hits/view/HitViewer.js +13 -12
  99. package/components/routes/home/ViewCard.js +41 -47
  100. package/components/{elements/MarkdownEditor.js → routes/overviews/OverviewEditor.js} +3 -3
  101. package/components/routes/overviews/OverviewViewer.js +2 -2
  102. package/components/routes/views/ViewComposer.js +19 -46
  103. package/locales/en/translation.json +3 -80
  104. package/locales/fr/translation.json +3 -78
  105. package/models/WithMetadata.d.ts +1 -2
  106. package/models/entities/generated/{ThreatEnrichment.d.ts → Enrichment.d.ts} +1 -1
  107. package/models/entities/generated/Hit.d.ts +0 -1
  108. package/models/entities/generated/Howler.d.ts +4 -0
  109. package/models/entities/generated/Rule.d.ts +10 -2
  110. package/models/entities/generated/Threat.d.ts +2 -2
  111. package/models/entities/generated/View.d.ts +0 -1
  112. package/package.json +106 -123
  113. package/plugins/clue/components/ClueTypography.js +2 -2
  114. package/plugins/clue/helpers.js +1 -1
  115. package/plugins/clue/utils.d.ts +1 -2
  116. package/tests/server-handlers.js +1 -6
  117. package/tests/utils.d.ts +0 -4
  118. package/tests/utils.js +0 -20
  119. package/utils/constants.d.ts +3 -3
  120. package/utils/hitFunctions.d.ts +1 -2
  121. package/utils/hitFunctions.js +4 -4
  122. package/utils/viewUtils.js +0 -3
  123. package/api/search/case.d.ts +0 -4
  124. package/api/search/case.js +0 -8
  125. package/api/v2/case/index.d.ts +0 -8
  126. package/api/v2/case/index.js +0 -20
  127. package/api/v2/case/items.d.ts +0 -6
  128. package/api/v2/case/items.js +0 -18
  129. package/api/v2/index.d.ts +0 -4
  130. package/api/v2/index.js +0 -6
  131. package/api/v2/search/facet.d.ts +0 -3
  132. package/api/v2/search/facet.js +0 -12
  133. package/api/v2/search/index.d.ts +0 -5
  134. package/api/v2/search/index.js +0 -24
  135. package/components/app/providers/RecordProvider.d.ts +0 -23
  136. package/components/elements/ContextMenu.d.ts +0 -56
  137. package/components/elements/ContextMenu.js +0 -109
  138. package/components/elements/ContextMenu.test.js +0 -215
  139. package/components/elements/ObjectDetails.d.ts +0 -6
  140. package/components/elements/case/CaseCard.d.ts +0 -12
  141. package/components/elements/case/CaseCard.js +0 -42
  142. package/components/elements/case/CasePreview.d.ts +0 -6
  143. package/components/elements/case/CasePreview.js +0 -17
  144. package/components/elements/case/StatusIcon.d.ts +0 -5
  145. package/components/elements/case/StatusIcon.js +0 -13
  146. package/components/elements/hit/elements/AnalyticLink.d.ts +0 -8
  147. package/components/elements/hit/elements/AnalyticLink.js +0 -22
  148. package/components/elements/hit/related/RelatedRecords.js +0 -63
  149. package/components/elements/observable/ObservableCard.d.ts +0 -6
  150. package/components/elements/observable/ObservableCard.js +0 -23
  151. package/components/elements/observable/ObservablePreview.d.ts +0 -6
  152. package/components/elements/observable/ObservablePreview.js +0 -12
  153. package/components/elements/record/RecordContextMenu.js +0 -247
  154. package/components/elements/record/RecordContextMenu.test.d.ts +0 -1
  155. package/components/elements/record/RecordRelated.d.ts +0 -7
  156. package/components/elements/record/RecordRelated.js +0 -34
  157. package/components/hooks/useRelatedRecords.d.ts +0 -13
  158. package/components/hooks/useRelatedRecords.js +0 -32
  159. package/components/routes/cases/CaseViewer.d.ts +0 -2
  160. package/components/routes/cases/CaseViewer.js +0 -22
  161. package/components/routes/cases/Cases.d.ts +0 -2
  162. package/components/routes/cases/Cases.js +0 -101
  163. package/components/routes/cases/constants.d.ts +0 -5
  164. package/components/routes/cases/constants.js +0 -5
  165. package/components/routes/cases/detail/AlertPanel.d.ts +0 -6
  166. package/components/routes/cases/detail/AlertPanel.js +0 -33
  167. package/components/routes/cases/detail/CaseAssets.d.ts +0 -12
  168. package/components/routes/cases/detail/CaseAssets.js +0 -104
  169. package/components/routes/cases/detail/CaseAssets.test.d.ts +0 -1
  170. package/components/routes/cases/detail/CaseAssets.test.js +0 -167
  171. package/components/routes/cases/detail/CaseDashboard.d.ts +0 -7
  172. package/components/routes/cases/detail/CaseDashboard.js +0 -54
  173. package/components/routes/cases/detail/CaseDetails.d.ts +0 -6
  174. package/components/routes/cases/detail/CaseDetails.js +0 -61
  175. package/components/routes/cases/detail/CaseOverview.d.ts +0 -7
  176. package/components/routes/cases/detail/CaseOverview.js +0 -43
  177. package/components/routes/cases/detail/CaseSidebar.d.ts +0 -8
  178. package/components/routes/cases/detail/CaseSidebar.js +0 -61
  179. package/components/routes/cases/detail/CaseTask.d.ts +0 -11
  180. package/components/routes/cases/detail/CaseTask.js +0 -57
  181. package/components/routes/cases/detail/ItemPage.d.ts +0 -6
  182. package/components/routes/cases/detail/ItemPage.js +0 -99
  183. package/components/routes/cases/detail/RelatedCasePanel.d.ts +0 -6
  184. package/components/routes/cases/detail/RelatedCasePanel.js +0 -31
  185. package/components/routes/cases/detail/TaskPanel.d.ts +0 -7
  186. package/components/routes/cases/detail/TaskPanel.js +0 -52
  187. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +0 -12
  188. package/components/routes/cases/detail/aggregates/CaseAggregate.js +0 -19
  189. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +0 -6
  190. package/components/routes/cases/detail/aggregates/SourceAggregate.js +0 -30
  191. package/components/routes/cases/detail/assets/Asset.d.ts +0 -14
  192. package/components/routes/cases/detail/assets/Asset.js +0 -12
  193. package/components/routes/cases/detail/assets/Asset.test.d.ts +0 -1
  194. package/components/routes/cases/detail/assets/Asset.test.js +0 -72
  195. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +0 -14
  196. package/components/routes/cases/detail/sidebar/CaseFolder.js +0 -133
  197. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +0 -34
  198. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +0 -105
  199. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +0 -1
  200. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +0 -351
  201. package/components/routes/cases/detail/sidebar/types.d.ts +0 -3
  202. package/components/routes/cases/detail/sidebar/utils.d.ts +0 -3
  203. package/components/routes/cases/detail/sidebar/utils.js +0 -25
  204. package/components/routes/cases/hooks/useCase.d.ts +0 -13
  205. package/components/routes/cases/hooks/useCase.js +0 -51
  206. package/components/routes/cases/modals/AddToCaseModal.d.ts +0 -7
  207. package/components/routes/cases/modals/AddToCaseModal.js +0 -62
  208. package/components/routes/cases/modals/RenameItemModal.d.ts +0 -9
  209. package/components/routes/cases/modals/RenameItemModal.js +0 -48
  210. package/components/routes/cases/modals/ResolveModal.d.ts +0 -7
  211. package/components/routes/cases/modals/ResolveModal.js +0 -62
  212. package/components/routes/hits/search/shared/IndexPicker.d.ts +0 -2
  213. package/components/routes/hits/search/shared/IndexPicker.js +0 -20
  214. package/components/routes/observables/ObservableViewer.d.ts +0 -7
  215. package/components/routes/observables/ObservableViewer.js +0 -27
  216. package/models/entities/generated/AttachmentsFile.d.ts +0 -12
  217. package/models/entities/generated/Case.d.ts +0 -28
  218. package/models/entities/generated/DestinationOriginal.d.ts +0 -19
  219. package/models/entities/generated/EmailAttachment.d.ts +0 -8
  220. package/models/entities/generated/EmailParent.d.ts +0 -19
  221. package/models/entities/generated/Enrichments.d.ts +0 -7
  222. package/models/entities/generated/EnrichmentsIndicator.d.ts +0 -21
  223. package/models/entities/generated/HttpResponse.d.ts +0 -11
  224. package/models/entities/generated/Item.d.ts +0 -9
  225. package/models/entities/generated/Observable.d.ts +0 -85
  226. package/models/entities/generated/ObservableCloud.d.ts +0 -20
  227. package/models/entities/generated/ObservableDestination.d.ts +0 -23
  228. package/models/entities/generated/ObservableEmail.d.ts +0 -30
  229. package/models/entities/generated/ObservableFile.d.ts +0 -36
  230. package/models/entities/generated/ObservableHowler.d.ts +0 -43
  231. package/models/entities/generated/ObservableHttp.d.ts +0 -11
  232. package/models/entities/generated/ObservableObserver.d.ts +0 -21
  233. package/models/entities/generated/ObservableOrganization.d.ts +0 -7
  234. package/models/entities/generated/ObservableProcess.d.ts +0 -34
  235. package/models/entities/generated/ObservableSource.d.ts +0 -23
  236. package/models/entities/generated/ObservableThreat.d.ts +0 -21
  237. package/models/entities/generated/ObservableTls.d.ts +0 -12
  238. package/models/entities/generated/ObserverIngress.d.ts +0 -9
  239. package/models/entities/generated/Task.d.ts +0 -10
  240. package/utils/typeUtils.d.ts +0 -7
  241. package/utils/typeUtils.js +0 -27
  242. /package/components/app/providers/{RecordSearchProvider.test.d.ts → HitSearchProvider.test.d.ts} +0 -0
  243. /package/components/elements/hit/{related/RelatedRecords.d.ts → HitDetails.d.ts} +0 -0
  244. /package/components/routes/hits/search/{RecordBrowser.d.ts → HitBrowser.d.ts} +0 -0
  245. /package/components/{elements/ContextMenu.test.d.ts → routes/hits/search/HitContextMenu.test.d.ts} +0 -0
  246. /package/components/{elements/MarkdownEditor.d.ts → routes/overviews/OverviewEditor.d.ts} +0 -0
@@ -1,48 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Button, Stack, TextField, Typography } from '@mui/material';
3
- import api from '@cccsaurora/howler-ui/api';
4
- import { ModalContext } from '@cccsaurora/howler-ui/components/app/providers/ModalProvider';
5
- import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
6
- import { useContext, useMemo, useState } from 'react';
7
- import { useTranslation } from 'react-i18next';
8
- const RenameItemModal = ({ _case, leaf, onRenamed }) => {
9
- const { t } = useTranslation();
10
- const { dispatchApi } = useMyApi();
11
- const { close } = useContext(ModalContext);
12
- const currentPath = leaf.path ?? '';
13
- const lastSlash = currentPath.lastIndexOf('/');
14
- const folderPrefix = lastSlash >= 0 ? currentPath.slice(0, lastSlash) : '';
15
- const currentName = lastSlash >= 0 ? currentPath.slice(lastSlash + 1) : currentPath;
16
- const [name, setName] = useState(currentName);
17
- const newPath = folderPrefix ? `${folderPrefix}/${name}` : name;
18
- const existingPaths = useMemo(() => new Set((_case.items ?? []).filter(item => item.value !== leaf.value).map(item => item.path)), [_case.items, leaf.value]);
19
- const nameError = useMemo(() => {
20
- if (!name.trim()) {
21
- return t('modal.cases.rename_item.error.empty');
22
- }
23
- if (name.includes('/')) {
24
- return t('modal.cases.rename_item.error.slash');
25
- }
26
- if (existingPaths.has(newPath)) {
27
- return t('modal.cases.rename_item.error.taken');
28
- }
29
- return null;
30
- }, [name, newPath, existingPaths, t]);
31
- const isValid = !nameError;
32
- const onSubmit = async () => {
33
- if (!isValid || !_case.case_id || !leaf.value) {
34
- return;
35
- }
36
- const updatedCase = await dispatchApi(api.v2.case.items.patch(_case.case_id, leaf.value, newPath));
37
- if (updatedCase) {
38
- onRenamed?.(updatedCase);
39
- close();
40
- }
41
- };
42
- return (_jsxs(Stack, { spacing: 2, p: 2, sx: { minWidth: 'min(600px, 60vw)' }, children: [_jsx(Typography, { variant: "h4", children: t('modal.cases.rename_item') }), folderPrefix && (_jsx(Typography, { variant: "body2", color: "textSecondary", children: t('modal.cases.rename_item.folder_path', { path: folderPrefix }) })), _jsx(TextField, { size: "small", label: t('modal.cases.rename_item.new_name'), value: name, onChange: ev => setName(ev.target.value), error: !!nameError, helperText: nameError ?? ' ', fullWidth: true, autoFocus: true, onKeyDown: ev => {
43
- if (ev.key === 'Enter' && isValid) {
44
- onSubmit();
45
- }
46
- } }), _jsxs(Stack, { direction: "row", justifyContent: "flex-end", spacing: 1, children: [_jsx(Button, { onClick: close, color: "error", variant: "outlined", children: t('button.cancel') }), _jsx(Button, { onClick: onSubmit, color: "success", variant: "outlined", disabled: !isValid, children: t('button.confirm') })] })] }));
47
- };
48
- export default RenameItemModal;
@@ -1,7 +0,0 @@
1
- import type { Case } from '@cccsaurora/howler-ui/models/entities/generated/Case';
2
- import { type FC } from 'react';
3
- declare const ResolveModal: FC<{
4
- case: Case;
5
- onConfirm: () => void;
6
- }>;
7
- export default ResolveModal;
@@ -1,62 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { OpenInNew } from '@mui/icons-material';
3
- import { Autocomplete, Box, Button, Card, Chip, Divider, IconButton, LinearProgress, Skeleton, Stack, TextField, Typography } from '@mui/material';
4
- import api from '@cccsaurora/howler-ui/api';
5
- import { ApiConfigContext } from '@cccsaurora/howler-ui/components/app/providers/ApiConfigProvider';
6
- import { ModalContext } from '@cccsaurora/howler-ui/components/app/providers/ModalProvider';
7
- import AnalyticLink from '@cccsaurora/howler-ui/components/elements/hit/elements/AnalyticLink';
8
- import EscalationChip from '@cccsaurora/howler-ui/components/elements/hit/elements/EscalationChip';
9
- import { HitLayout } from '@cccsaurora/howler-ui/components/elements/hit/HitLayout';
10
- import useHitActions from '@cccsaurora/howler-ui/components/hooks/useHitActions';
11
- import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
12
- import { uniq } from 'lodash-es';
13
- import { useContext, useEffect, useMemo, useState } from 'react';
14
- import { useTranslation } from 'react-i18next';
15
- import { Link } from 'react-router-dom';
16
- import useCase from '../hooks/useCase';
17
- const ResolveModal = ({ case: _case, onConfirm }) => {
18
- const { t } = useTranslation();
19
- const { dispatchApi } = useMyApi();
20
- const { close } = useContext(ModalContext);
21
- const { config } = useContext(ApiConfigContext);
22
- const { update: updateCase } = useCase({ case: _case });
23
- const [loading, setLoading] = useState(true);
24
- const [rationale, setRationale] = useState('');
25
- const [assessment, setAssessment] = useState(null);
26
- const [hits, setHits] = useState([]);
27
- const hitIds = useMemo(() => uniq((_case?.items ?? [])
28
- .filter(item => item.type === 'hit')
29
- .map(item => item.value)
30
- .filter(Boolean)), [_case?.items]);
31
- const { assess } = useHitActions(hits);
32
- useEffect(() => {
33
- (async () => {
34
- try {
35
- const result = await dispatchApi(api.search.hit.post({
36
- query: `howler.id:(${hitIds.join(' OR ')}) AND -howler.status:resolved`,
37
- metadata: ['analytic']
38
- }));
39
- setHits(result.items);
40
- }
41
- finally {
42
- setLoading(false);
43
- }
44
- })();
45
- }, [dispatchApi, hitIds]);
46
- const handleConfirm = async () => {
47
- setLoading(true);
48
- try {
49
- await assess(assessment, true, rationale);
50
- await updateCase({ status: 'resolved' });
51
- onConfirm();
52
- close();
53
- }
54
- finally {
55
- setLoading(false);
56
- }
57
- };
58
- return (_jsxs(Stack, { spacing: 2, p: 2, alignItems: "start", sx: { minWidth: 'min(1000px, 60vw)', maxHeight: '100%', height: '100%' }, children: [_jsx(Typography, { variant: "h4", children: t('modal.cases.resolve') }), _jsx(Typography, { children: t('modal.cases.resolve.description') }), _jsxs(Stack, { spacing: 1, overflow: "auto", width: "100%", flex: 1, children: [_jsxs(Stack, { direction: "row", spacing: 1, children: [_jsx(Box, { flex: 1, children: _jsx(TextField, { size: "small", fullWidth: true, placeholder: t('modal.rationale.label'), value: rationale, onChange: ev => setRationale(ev.target.value) }) }), _jsx(Box, { flex: 1, children: _jsx(Autocomplete, { size: "small", value: assessment, onChange: (_ev, _assessment) => setAssessment(_assessment), options: config.lookups['howler.assessment'], disablePortal: true, renderInput: params => (_jsx(TextField, { ...params, placeholder: t('hit.details.actions.assessment'), fullWidth: true })) }) })] }), _jsxs(Stack, { position: "relative", children: [_jsx(Divider, {}), _jsx(LinearProgress, { sx: { opacity: +loading } })] }), loading
59
- ? hitIds.map(id => _jsx(Skeleton, { variant: "rounded", height: "40px", width: "100%" }, id))
60
- : hits.map(hit => (_jsx(Card, { sx: { p: 1, flexShrink: 0 }, children: _jsxs(Stack, { direction: "row", alignItems: "center", spacing: 1, width: "100%", children: [_jsx(AnalyticLink, { hit: hit, compressed: true, alignSelf: "center" }), _jsx(EscalationChip, { hit: hit, layout: HitLayout.DENSE }), _jsx(Chip, { sx: { width: 'fit-content', display: 'inline-flex' }, label: hit.howler.status, size: "small", color: "primary" }), _jsx("div", { style: { flex: 1 } }), _jsx(IconButton, { size: "small", component: Link, to: `/hits/${hit.howler.id}`, children: _jsx(OpenInNew, { fontSize: "small" }) })] }) }, hit.howler.id)))] }), _jsxs(Stack, { direction: "row", spacing: 1, alignSelf: "end", children: [_jsx(Button, { variant: "outlined", color: "error", onClick: close, children: t('cancel') }), _jsx(Button, { variant: "outlined", color: "success", disabled: loading || !assessment || !rationale, onClick: handleConfirm, children: t('confirm') })] })] }));
61
- };
62
- export default ResolveModal;
@@ -1,2 +0,0 @@
1
- declare const _default: import("react").NamedExoticComponent<{}>;
2
- export default _default;
@@ -1,20 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { FilterList } from '@mui/icons-material';
3
- import { Autocomplete, TextField } from '@mui/material';
4
- import { ParameterContext } from '@cccsaurora/howler-ui/components/app/providers/ParameterProvider';
5
- import ChipPopper from '@cccsaurora/howler-ui/components/elements/display/ChipPopper';
6
- import { memo } from 'react';
7
- import { useTranslation } from 'react-i18next';
8
- import { useContextSelector } from 'use-context-selector';
9
- const FILTER_OPTIONS = [
10
- { label: 'hit.search.index.hit', value: 'hit' },
11
- { label: 'hit.search.index.observable', value: 'observable' }
12
- ];
13
- const IndexPicker = () => {
14
- const { t } = useTranslation();
15
- const indexes = useContextSelector(ParameterContext, ctx => ctx.indexes);
16
- const setIndexes = useContextSelector(ParameterContext, ctx => ctx.setIndexes);
17
- const selectedOptions = FILTER_OPTIONS.filter(opt => indexes.includes(opt.value));
18
- return (_jsx(ChipPopper, { icon: _jsx(FilterList, { fontSize: "small" }), label: selectedOptions.map(opt => t(opt.label)).join(', '), minWidth: "225px", slotProps: { chip: { size: 'small' } }, children: _jsx(Autocomplete, { size: "small", multiple: true, options: FILTER_OPTIONS, value: selectedOptions, onChange: (_ev, values) => values.length > 0 && setIndexes(values.map(val => val.value)), isOptionEqualToValue: (opt, val) => opt.value === val.value, getOptionLabel: opt => t(opt.label), renderInput: params => _jsx(TextField, { ...params }) }) }));
19
- };
20
- export default memo(IndexPicker);
@@ -1,7 +0,0 @@
1
- import type { Observable } from '@cccsaurora/howler-ui/models/entities/generated/Observable';
2
- import { type FC } from 'react';
3
- declare const ObservableViewer: FC<{
4
- observable?: Observable;
5
- observableId?: string;
6
- }>;
7
- export default ObservableViewer;
@@ -1,27 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Box, Skeleton } from '@mui/material';
3
- import api from '@cccsaurora/howler-ui/api';
4
- import ObjectDetails from '@cccsaurora/howler-ui/components/elements/ObjectDetails';
5
- import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
6
- import { useEffect, useState } from 'react';
7
- const ObservableViewer = ({ observable: provided, observableId }) => {
8
- const { dispatchApi } = useMyApi();
9
- const [observable, setObservable] = useState(null);
10
- useEffect(() => {
11
- if (provided) {
12
- setObservable(provided);
13
- }
14
- }, [provided]);
15
- useEffect(() => {
16
- if (observableId) {
17
- dispatchApi(api.v2.search.post('observable', { query: `howler.id:${observableId}`, rows: 1 }), {
18
- throwError: false
19
- }).then(res => setObservable(res.items[0]));
20
- }
21
- }, [dispatchApi, observableId]);
22
- if (!observable) {
23
- return;
24
- }
25
- return _jsx(Box, { p: 1, children: observable ? _jsx(ObjectDetails, { obj: observable }) : _jsx(Skeleton, { height: 120 }) });
26
- };
27
- export default ObservableViewer;
@@ -1,12 +0,0 @@
1
- import type { FileHash } from './FileHash';
2
-
3
- /**
4
- * NOTE: This is an auto-generated file. Don't edit this manually.
5
- */
6
- export interface AttachmentsFile {
7
- extension?: string;
8
- hash?: FileHash;
9
- mime_type?: string;
10
- name?: string;
11
- size?: number;
12
- }
@@ -1,28 +0,0 @@
1
- import type { Enrichments } from './Enrichments';
2
- import type { Item } from './Item';
3
- import type { Rule } from './Rule';
4
- import type { Task } from './Task';
5
-
6
- /**
7
- * NOTE: This is an auto-generated file. Don't edit this manually.
8
- */
9
- export interface Case {
10
- case_id?: string;
11
- created?: string;
12
- end?: string;
13
- enrichments?: Enrichments;
14
- escalation?: string;
15
- indicators?: string[];
16
- items?: Item[];
17
- overview?: string;
18
- participants?: string[];
19
- rules?: Rule[];
20
- status?: string;
21
- start?: string;
22
- summary?: string;
23
- targets?: string[];
24
- tasks?: Task[];
25
- threats?: string[];
26
- title?: string;
27
- updated?: string;
28
- }
@@ -1,19 +0,0 @@
1
- import type { AutonomousSystems } from './AutonomousSystems';
2
- import type { Geo } from './Geo';
3
- import type { Nat } from './Nat';
4
-
5
- /**
6
- * NOTE: This is an auto-generated file. Don't edit this manually.
7
- */
8
- export interface DestinationOriginal {
9
- address?: string;
10
- autonomous_systems?: AutonomousSystems;
11
- bytes?: number;
12
- domain?: string;
13
- geo?: Geo;
14
- ip?: string;
15
- mac?: string;
16
- nat?: Nat;
17
- packets?: number;
18
- port?: number;
19
- }
@@ -1,8 +0,0 @@
1
- import type { AttachmentsFile } from './AttachmentsFile';
2
-
3
- /**
4
- * NOTE: This is an auto-generated file. Don't edit this manually.
5
- */
6
- export interface EmailAttachment {
7
- file?: AttachmentsFile;
8
- }
@@ -1,19 +0,0 @@
1
- import type { Bcc } from './Bcc';
2
- import type { Cc } from './Cc';
3
- import type { From } from './From';
4
- import type { To } from './To';
5
-
6
- /**
7
- * NOTE: This is an auto-generated file. Don't edit this manually.
8
- */
9
- export interface EmailParent {
10
- bcc?: Bcc;
11
- cc?: Cc;
12
- destination?: string;
13
- from?: From;
14
- message_id?: string;
15
- origination_timestamp?: string;
16
- source?: string;
17
- subject?: string;
18
- to?: To;
19
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * NOTE: This is an auto-generated file. Don't edit this manually.
3
- */
4
- export interface Enrichments {
5
- annotations?: string;
6
- path?: string;
7
- }
@@ -1,21 +0,0 @@
1
- import type { IndicatorEmail } from './IndicatorEmail';
2
- import type { IndicatorFile } from './IndicatorFile';
3
-
4
- /**
5
- * NOTE: This is an auto-generated file. Don't edit this manually.
6
- */
7
- export interface EnrichmentsIndicator {
8
- confidence?: string;
9
- description?: string;
10
- email?: IndicatorEmail;
11
- file?: IndicatorFile;
12
- first_seen?: string;
13
- ip?: string;
14
- last_seen?: string;
15
- port?: number;
16
- provider?: string;
17
- reference?: string;
18
- scanner_stats?: number;
19
- sightings?: number;
20
- type?: string;
21
- }
@@ -1,11 +0,0 @@
1
- import type { Body } from './Body';
2
-
3
- /**
4
- * NOTE: This is an auto-generated file. Don't edit this manually.
5
- */
6
- export interface HttpResponse {
7
- body?: Body;
8
- bytes?: number;
9
- mime_type?: string;
10
- status_code?: number;
11
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * NOTE: This is an auto-generated file. Don't edit this manually.
3
- */
4
- export interface Item {
5
- path?: string;
6
- type?: string;
7
- value?: string;
8
- visible?: boolean;
9
- }
@@ -1,85 +0,0 @@
1
- import type { Agent } from './Agent';
2
- import type { Assemblyline } from './Assemblyline';
3
- import type { Aws } from './Aws';
4
- import type { Azure } from './Azure';
5
- import type { Cbs } from './Cbs';
6
- import type { Clue } from './Clue';
7
- import type { Container } from './Container';
8
- import type { Dns } from './Dns';
9
- import type { Ecs } from './Ecs';
10
- import type { Error } from './Error';
11
- import type { Event } from './Event';
12
- import type { Faas } from './Faas';
13
- import type { Gcp } from './Gcp';
14
- import type { Group } from './Group';
15
- import type { Host } from './Host';
16
- import type { Interface } from './Interface';
17
- import type { Network } from './Network';
18
- import type { ObservableCloud } from './ObservableCloud';
19
- import type { ObservableDestination } from './ObservableDestination';
20
- import type { ObservableEmail } from './ObservableEmail';
21
- import type { ObservableFile } from './ObservableFile';
22
- import type { ObservableHowler } from './ObservableHowler';
23
- import type { ObservableHttp } from './ObservableHttp';
24
- import type { ObservableObserver } from './ObservableObserver';
25
- import type { ObservableOrganization } from './ObservableOrganization';
26
- import type { ObservableProcess } from './ObservableProcess';
27
- import type { ObservableSource } from './ObservableSource';
28
- import type { ObservableThreat } from './ObservableThreat';
29
- import type { ObservableTls } from './ObservableTls';
30
- import type { Registry } from './Registry';
31
- import type { Related } from './Related';
32
- import type { Rule } from './Rule';
33
- import type { Server } from './Server';
34
- import type { Url } from './Url';
35
- import type { User } from './User';
36
- import type { UserAgent } from './UserAgent';
37
- import type { Vulnerability } from './Vulnerability';
38
-
39
- /**
40
- * NOTE: This is an auto-generated file. Don't edit this manually.
41
- */
42
- export interface Observable {
43
- __index: 'observable';
44
- agent?: Agent;
45
- assemblyline?: Assemblyline;
46
- aws?: Aws;
47
- azure?: Azure;
48
- cbs?: Cbs;
49
- cloud?: ObservableCloud;
50
- clue?: Clue;
51
- container?: Container;
52
- destination?: ObservableDestination;
53
- dns?: Dns;
54
- ecs?: Ecs;
55
- email?: ObservableEmail;
56
- error?: Error;
57
- event?: Event;
58
- faas?: Faas;
59
- file?: ObservableFile;
60
- gcp?: Gcp;
61
- group?: Group;
62
- host?: Host;
63
- howler: ObservableHowler;
64
- http?: ObservableHttp;
65
- interface?: Interface;
66
- labels?: { [index: string]: string };
67
- message?: string;
68
- network?: Network;
69
- observer?: ObservableObserver;
70
- organization?: ObservableOrganization;
71
- process?: ObservableProcess;
72
- registry?: Registry;
73
- related?: Related;
74
- rule?: Rule;
75
- server?: Server;
76
- source?: ObservableSource;
77
- tags?: string[];
78
- threat?: ObservableThreat;
79
- timestamp: string;
80
- tls?: ObservableTls;
81
- url?: Url;
82
- user?: User;
83
- user_agent?: UserAgent;
84
- vulnerability?: Vulnerability;
85
- }
@@ -1,20 +0,0 @@
1
- import type { CloudAccount } from './CloudAccount';
2
- import type { Instance } from './Instance';
3
- import type { Machine } from './Machine';
4
- import type { Project } from './Project';
5
- import type { Service } from './Service';
6
-
7
- /**
8
- * NOTE: This is an auto-generated file. Don't edit this manually.
9
- */
10
- export interface ObservableCloud {
11
- account?: CloudAccount;
12
- availability_zone?: string;
13
- instance?: Instance;
14
- machine?: Machine;
15
- project?: Project;
16
- provider?: string;
17
- region?: string;
18
- service?: Service;
19
- tenant_id?: string;
20
- }
@@ -1,23 +0,0 @@
1
- import type { AutonomousSystems } from './AutonomousSystems';
2
- import type { DestinationOriginal } from './DestinationOriginal';
3
- import type { Geo } from './Geo';
4
- import type { Nat } from './Nat';
5
- import type { User } from './User';
6
-
7
- /**
8
- * NOTE: This is an auto-generated file. Don't edit this manually.
9
- */
10
- export interface ObservableDestination {
11
- address?: string;
12
- autonomous_systems?: AutonomousSystems;
13
- bytes?: number;
14
- domain?: string;
15
- geo?: Geo;
16
- ip?: string;
17
- mac?: string;
18
- nat?: Nat;
19
- original?: DestinationOriginal;
20
- packets?: number;
21
- port?: number;
22
- user?: User;
23
- }
@@ -1,30 +0,0 @@
1
- import type { Bcc } from './Bcc';
2
- import type { Cc } from './Cc';
3
- import type { EmailAttachment } from './EmailAttachment';
4
- import type { EmailParent } from './EmailParent';
5
- import type { From } from './From';
6
- import type { ReplyTo } from './ReplyTo';
7
- import type { Sender } from './Sender';
8
- import type { To } from './To';
9
-
10
- /**
11
- * NOTE: This is an auto-generated file. Don't edit this manually.
12
- */
13
- export interface ObservableEmail {
14
- attachments?: EmailAttachment[];
15
- bcc?: Bcc;
16
- cc?: Cc;
17
- content_type?: string;
18
- delivery_timestamp?: string;
19
- direction?: string;
20
- from?: From;
21
- local_id?: string;
22
- message_id?: string;
23
- origination_timestamp?: string;
24
- parent?: EmailParent;
25
- reply_to?: ReplyTo;
26
- sender?: Sender;
27
- subject?: string;
28
- to?: To;
29
- x_mailer?: string;
30
- }
@@ -1,36 +0,0 @@
1
- import type { CodeSignature } from './CodeSignature';
2
- import type { Elf } from './Elf';
3
- import type { FileHash } from './FileHash';
4
- import type { Pe } from './Pe';
5
-
6
- /**
7
- * NOTE: This is an auto-generated file. Don't edit this manually.
8
- */
9
- export interface ObservableFile {
10
- accessed?: string;
11
- attributes?: string[];
12
- code_signature?: CodeSignature;
13
- created?: string;
14
- ctime?: string;
15
- device?: string;
16
- directory?: string;
17
- drive_letter?: string;
18
- elf?: Elf;
19
- extension?: string;
20
- fork_name?: string;
21
- gid?: string;
22
- group?: string;
23
- hash?: FileHash;
24
- inode?: string;
25
- mime_type?: string;
26
- mode?: string;
27
- mtime?: string;
28
- name?: string;
29
- owner?: string;
30
- path?: string;
31
- pe?: Pe;
32
- size?: number;
33
- target_path?: string;
34
- type?: string;
35
- uid?: string;
36
- }
@@ -1,43 +0,0 @@
1
- import type { HowlerComment } from './HowlerComment';
2
- import type { HowlerDossier } from './HowlerDossier';
3
- import type { Incident } from './Incident';
4
- import type { Labels } from './Labels';
5
- import type { Link } from './Link';
6
- import type { Log } from './Log';
7
- import type { Outline } from './Outline';
8
- import type { Votes } from './Votes';
9
-
10
- /**
11
- * NOTE: This is an auto-generated file. Don't edit this manually.
12
- */
13
- export interface ObservableHowler {
14
- analytic: string;
15
- assessment?: string;
16
- comment?: HowlerComment[];
17
- confidence?: number;
18
- data?: string[];
19
- detection?: string;
20
- dossier?: HowlerDossier[];
21
- escalation?: string;
22
- expiry?: string;
23
- hash: string;
24
- id: string;
25
- incidents?: Incident[];
26
- labels?: Labels;
27
- links?: Link[];
28
- log?: Log[];
29
- mitigated?: string;
30
- monitored?: string;
31
- outline?: Outline;
32
- rationale?: string;
33
- related?: string[];
34
- reliability?: number;
35
- reported?: string;
36
- score?: number;
37
- scrutiny?: string;
38
- severity?: number;
39
- status?: string;
40
- viewers?: string[];
41
- volume?: number;
42
- votes?: Votes;
43
- }
@@ -1,11 +0,0 @@
1
- import type { HttpResponse } from './HttpResponse';
2
- import type { Request } from './Request';
3
-
4
- /**
5
- * NOTE: This is an auto-generated file. Don't edit this manually.
6
- */
7
- export interface ObservableHttp {
8
- request?: Request;
9
- response?: HttpResponse;
10
- version?: string;
11
- }
@@ -1,21 +0,0 @@
1
- import type { Egress } from './Egress';
2
- import type { Interface } from './Interface';
3
- import type { ObserverIngress } from './ObserverIngress';
4
-
5
- /**
6
- * NOTE: This is an auto-generated file. Don't edit this manually.
7
- */
8
- export interface ObservableObserver {
9
- egress?: Egress;
10
- hostname?: string;
11
- ingress?: ObserverIngress;
12
- interface?: Interface;
13
- ip?: string[];
14
- mac?: string[];
15
- name?: string;
16
- product?: string;
17
- serial_number?: string;
18
- type?: string;
19
- vendor?: string;
20
- version?: string;
21
- }
@@ -1,7 +0,0 @@
1
- /**
2
- * NOTE: This is an auto-generated file. Don't edit this manually.
3
- */
4
- export interface ObservableOrganization {
5
- id?: string;
6
- name?: string;
7
- }
@@ -1,34 +0,0 @@
1
- import type { CodeSignature } from './CodeSignature';
2
- import type { EntryMeta } from './EntryMeta';
3
- import type { Pe } from './Pe';
4
- import type { ProcessHash } from './ProcessHash';
5
- import type { ProcessParent } from './ProcessParent';
6
- import type { ProcessUser } from './ProcessUser';
7
-
8
- /**
9
- * NOTE: This is an auto-generated file. Don't edit this manually.
10
- */
11
- export interface ObservableProcess {
12
- args?: string[];
13
- args_count?: number;
14
- code_signature?: CodeSignature;
15
- command_line?: string;
16
- end?: string;
17
- entity_id?: string;
18
- entry_meta?: EntryMeta;
19
- env_vars?: { [index: string]: string };
20
- executable?: string;
21
- exit_code?: number;
22
- hash?: ProcessHash;
23
- interactive?: boolean;
24
- name?: string;
25
- parent?: ProcessParent;
26
- pe?: Pe;
27
- pid?: number;
28
- same_as_process?: boolean;
29
- start?: string;
30
- title?: string;
31
- uptime?: number;
32
- user?: ProcessUser;
33
- working_directory?: string;
34
- }