@cccsaurora/howler-ui 2.13.0-dev.77 → 2.13.0

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 (118) hide show
  1. package/api/hit/index.d.ts +1 -1
  2. package/api/hit/index.js +6 -2
  3. package/api/search/index.d.ts +1 -0
  4. package/api/view/index.d.ts +1 -1
  5. package/api/view/index.js +2 -2
  6. package/commons/components/notification/elements/item/NotificationItemDate.js +2 -2
  7. package/commons/components/utils/hooks/useEnv.d.ts +1 -1
  8. package/components/app/App.js +1 -3
  9. package/components/app/drawers/ApiKeyDrawer.js +4 -4
  10. package/components/app/hooks/useMatchers.d.ts +9 -0
  11. package/components/app/hooks/useMatchers.js +82 -0
  12. package/components/app/hooks/useMatchers.test.d.ts +1 -0
  13. package/components/app/hooks/useMatchers.test.js +237 -0
  14. package/components/app/hooks/useTitle.js +5 -4
  15. package/components/app/providers/AnalyticProvider.d.ts +0 -4
  16. package/components/app/providers/AnalyticProvider.js +1 -44
  17. package/components/app/providers/ApiConfigProvider.js +2 -1
  18. package/components/app/providers/HitProvider.d.ts +2 -1
  19. package/components/app/providers/HitProvider.js +8 -2
  20. package/components/app/providers/HitSearchProvider.d.ts +2 -1
  21. package/components/app/providers/HitSearchProvider.js +2 -1
  22. package/components/app/providers/SocketProvider.js +1 -1
  23. package/components/app/providers/ViewProvider.d.ts +1 -1
  24. package/components/app/providers/ViewProvider.js +3 -3
  25. package/components/app/providers/ViewProvider.test.d.ts +1 -0
  26. package/components/app/providers/ViewProvider.test.js +150 -0
  27. package/components/elements/display/ActionButton.d.ts +8 -0
  28. package/components/elements/display/ActionButton.js +18 -0
  29. package/components/elements/display/handlebars/helpers.js +17 -2
  30. package/components/elements/display/json/JSONViewer.d.ts +2 -0
  31. package/components/elements/display/json/JSONViewer.js +6 -13
  32. package/components/elements/hit/HitActions.js +4 -6
  33. package/components/elements/hit/HitBanner.js +13 -5
  34. package/components/elements/hit/HitCard.js +0 -5
  35. package/components/elements/hit/HitComments.js +5 -4
  36. package/components/elements/hit/HitOutline.d.ts +2 -2
  37. package/components/elements/hit/HitOutline.js +11 -21
  38. package/components/elements/hit/HitOverview.js +7 -4
  39. package/components/elements/hit/HitSummary.d.ts +2 -1
  40. package/components/elements/hit/HitSummary.js +8 -7
  41. package/components/elements/hit/aggregate/HitGraph.d.ts +1 -1
  42. package/components/elements/hit/aggregate/HitGraph.js +7 -7
  43. package/components/elements/hit/elements/HitTimestamp.js +8 -8
  44. package/components/elements/hit/related/PivotLink.js +11 -5
  45. package/components/elements/hit/related/RelatedIcon.d.ts +8 -0
  46. package/components/elements/hit/related/RelatedIcon.js +32 -0
  47. package/components/elements/hit/related/RelatedLink.js +4 -25
  48. package/components/hooks/useMyChart.d.ts +1 -1
  49. package/components/hooks/useMyChart.js +1 -1
  50. package/components/routes/advanced/QueryBuilder.js +47 -11
  51. package/components/routes/advanced/QueryEditor.js +8 -13
  52. package/components/routes/analytics/AnalyticOverview.d.ts +1 -1
  53. package/components/routes/analytics/AnalyticOverview.js +1 -1
  54. package/components/routes/analytics/AnalyticOverviews.d.ts +1 -1
  55. package/components/routes/analytics/AnalyticOverviews.js +1 -1
  56. package/components/routes/analytics/AnalyticSearch.js +14 -2
  57. package/components/routes/analytics/AnalyticTemplates.d.ts +1 -1
  58. package/components/routes/analytics/AnalyticTemplates.js +10 -7
  59. package/components/routes/analytics/RuleView.d.ts +1 -1
  60. package/components/routes/analytics/RuleView.js +1 -1
  61. package/components/routes/analytics/TriageSettings.d.ts +1 -1
  62. package/components/routes/analytics/TriageSettings.js +1 -1
  63. package/components/routes/analytics/widgets/Assessment.d.ts +1 -1
  64. package/components/routes/analytics/widgets/Assessment.js +1 -1
  65. package/components/routes/analytics/widgets/Created.d.ts +1 -1
  66. package/components/routes/analytics/widgets/Created.js +1 -1
  67. package/components/routes/analytics/widgets/Detection.d.ts +1 -1
  68. package/components/routes/analytics/widgets/Detection.js +1 -1
  69. package/components/routes/analytics/widgets/Escalation.d.ts +1 -1
  70. package/components/routes/analytics/widgets/Escalation.js +1 -1
  71. package/components/routes/analytics/widgets/Stacked.d.ts +1 -1
  72. package/components/routes/analytics/widgets/Stacked.js +1 -1
  73. package/components/routes/analytics/widgets/Status.d.ts +1 -1
  74. package/components/routes/analytics/widgets/Status.js +1 -1
  75. package/components/routes/help/SearchDocumentation.js +2 -1
  76. package/components/routes/help/TemplateDocumentation.js +5 -5
  77. package/components/routes/hits/search/HitBrowser.js +2 -2
  78. package/components/routes/hits/search/HitContextMenu.js +6 -7
  79. package/components/routes/hits/search/HitQuery.js +2 -1
  80. package/components/routes/hits/search/InformationPane.js +75 -78
  81. package/components/routes/hits/search/SearchPane.js +3 -9
  82. package/components/routes/hits/search/grid/AddColumnModal.js +10 -5
  83. package/components/routes/hits/search/grid/HitGrid.js +6 -5
  84. package/components/routes/hits/search/shared/CustomSpan.js +6 -6
  85. package/components/routes/hits/view/HitViewer.js +18 -26
  86. package/components/routes/home/index.js +4 -4
  87. package/components/routes/overviews/OverviewViewer.js +33 -31
  88. package/components/routes/settings/SecuritySection.js +2 -2
  89. package/components/routes/templates/TemplateViewer.js +27 -36
  90. package/components/routes/templates/Templates.js +4 -11
  91. package/components/routes/views/ViewComposer.js +8 -1
  92. package/components/routes/views/Views.js +25 -9
  93. package/index.js +7 -0
  94. package/locales/en/help/search.json +17 -0
  95. package/locales/en/translation.json +12 -3
  96. package/locales/fr/help/search.json +17 -0
  97. package/locales/fr/translation.json +12 -4
  98. package/models/WithMetadata.d.ts +10 -0
  99. package/models/WithMetadata.js +1 -0
  100. package/models/entities/generated/ApiType.d.ts +7 -0
  101. package/package.json +112 -111
  102. package/plugins/borealis/components/BorealisTypography.js +4 -2
  103. package/setupTests.d.ts +1 -0
  104. package/setupTests.js +12 -0
  105. package/tests/MockLocalStorage.d.ts +5 -0
  106. package/tests/MockLocalStorage.js +44 -0
  107. package/tests/server-handlers.d.ts +5 -0
  108. package/tests/server-handlers.js +97 -0
  109. package/tests/server.d.ts +3 -0
  110. package/tests/server.js +5 -0
  111. package/utils/constants.js +2 -2
  112. package/utils/stringUtils.d.ts +1 -0
  113. package/utils/stringUtils.js +9 -0
  114. package/utils/utils.js +3 -3
  115. package/components/app/providers/DossierProvider.d.ts +0 -16
  116. package/components/app/providers/DossierProvider.js +0 -82
  117. package/components/app/providers/TemplateProvider.d.ts +0 -14
  118. package/components/app/providers/TemplateProvider.js +0 -103
@@ -1,82 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import api from '@cccsaurora/howler-ui/api';
3
- import { useAppUser } from '@cccsaurora/howler-ui/commons/components/app/hooks';
4
- import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
5
- import { useCallback, useEffect, useState } from 'react';
6
- import { createContext, useContextSelector } from 'use-context-selector';
7
- export const DossierContext = createContext(null);
8
- const DossierProvider = ({ children }) => {
9
- const { dispatchApi } = useMyApi();
10
- const appUser = useAppUser();
11
- const [loading, setLoading] = useState(false);
12
- const [ready, setReady] = useState(false);
13
- const [dossiers, setDossiers] = useState([]);
14
- const [idToDossiers, setIdToDossiers] = useState({});
15
- const fetchDossiers = useCallback(async (force = false) => {
16
- if (ready && !force) {
17
- return;
18
- }
19
- if (!appUser.isReady()) {
20
- return;
21
- }
22
- setLoading(true);
23
- try {
24
- setDossiers((await api.dossier.get()));
25
- setReady(true);
26
- }
27
- finally {
28
- setLoading(false);
29
- }
30
- }, [appUser, ready]);
31
- useEffect(() => {
32
- if (!ready && !loading) {
33
- fetchDossiers();
34
- }
35
- }, [fetchDossiers, ready, loading]);
36
- const getCurrentDossiers = useCallback(() => {
37
- return [];
38
- }, []);
39
- const editDossier = useCallback(async (dossier) => {
40
- const result = await api.dossier.put(dossier.dossier_id, dossier);
41
- setDossiers(_dossiers => _dossiers.map(_dossier => (_dossier.dossier_id === dossier.dossier_id ? { ..._dossier, dossier } : _dossier)));
42
- return result;
43
- }, []);
44
- const addDossier = useCallback(async (dossier) => {
45
- const newDossier = await dispatchApi(api.dossier.post(dossier));
46
- setDossiers(_dossiers => [..._dossiers, newDossier]);
47
- return newDossier;
48
- }, [dispatchApi]);
49
- const removeDossier = useCallback(async (id) => {
50
- const result = await api.dossier.del(id);
51
- setDossiers(_dossiers => _dossiers.filter(v => v.dossier_id !== id));
52
- return result;
53
- }, []);
54
- const getMatchingDossiers = useCallback(async (id) => {
55
- if (idToDossiers[id]) {
56
- return idToDossiers[id];
57
- }
58
- const result = await dispatchApi(api.dossier.hit.get(id), { throwError: false });
59
- if (result) {
60
- setIdToDossiers(_dossiers => ({
61
- ..._dossiers,
62
- [id]: result
63
- }));
64
- return result;
65
- }
66
- return [];
67
- }, [dispatchApi, idToDossiers]);
68
- return (_jsx(DossierContext.Provider, { value: {
69
- ready,
70
- dossiers,
71
- fetchDossiers,
72
- addDossier,
73
- editDossier,
74
- removeDossier,
75
- getCurrentDossiers,
76
- getMatchingDossiers
77
- }, children: children }));
78
- };
79
- export const useDossierContextSelector = (selector) => {
80
- return useContextSelector(DossierContext, selector);
81
- };
82
- export default DossierProvider;
@@ -1,14 +0,0 @@
1
- import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
2
- import type { Template } from '@cccsaurora/howler-ui/models/entities/generated/Template';
3
- import type { FC, PropsWithChildren } from 'react';
4
- interface TemplateContextType {
5
- templates: Template[];
6
- getTemplates: (force?: boolean) => Promise<Template[]>;
7
- getMatchingTemplate: (h: Hit) => Template;
8
- refresh: () => void;
9
- loaded: boolean;
10
- }
11
- export declare const TemplateContext: import("use-context-selector").Context<TemplateContextType>;
12
- declare const TemplateProvider: FC<PropsWithChildren>;
13
- export declare const useTemplateContextSelector: <Selected>(selector: (value: TemplateContextType) => Selected) => Selected;
14
- export default TemplateProvider;
@@ -1,103 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import api from '@cccsaurora/howler-ui/api';
3
- import useMyApi from '@cccsaurora/howler-ui/components/hooks/useMyApi';
4
- import { useCallback, useRef, useState } from 'react';
5
- import { createContext, useContextSelector } from 'use-context-selector';
6
- const SIX_TAIL_PHISH_DETAILS = [
7
- 'event.start',
8
- 'event.end',
9
- 'destination.ip',
10
- 'destination.domain',
11
- 'cloud.service.name',
12
- 'error.code',
13
- 'error.message'
14
- ];
15
- /**
16
- * TODO: Ask analysts to move these into the API
17
- */
18
- const BUILTIN_TEMPLATES = [
19
- {
20
- analytic: '6TailPhish',
21
- keys: SIX_TAIL_PHISH_DETAILS,
22
- owner: 'none',
23
- template_id: '6tailphish.builtin',
24
- type: 'readonly'
25
- }
26
- ];
27
- export const TemplateContext = createContext(null);
28
- const TemplateProvider = ({ children }) => {
29
- const request = useRef(null);
30
- const { dispatchApi } = useMyApi();
31
- const [loaded, setLoaded] = useState(false);
32
- const templateRequest = useRef(null);
33
- const [templates, setTemplates] = useState(BUILTIN_TEMPLATES);
34
- const getTemplates = useCallback(async (force = false) => {
35
- if (request.current) {
36
- return request.current;
37
- }
38
- if (loaded && !force) {
39
- return templates;
40
- }
41
- else if (templateRequest.current) {
42
- return templateRequest.current;
43
- }
44
- else {
45
- try {
46
- request.current = dispatchApi(api.template.get());
47
- const result = await request.current;
48
- const fullList = [...BUILTIN_TEMPLATES, ...result];
49
- setTemplates(fullList);
50
- setLoaded(true);
51
- return fullList;
52
- }
53
- catch (e) {
54
- return [];
55
- }
56
- finally {
57
- request.current = null;
58
- }
59
- }
60
- }, [dispatchApi, loaded, templates]);
61
- /**
62
- * Based on a given hit, retrieve the best match for a template
63
- */
64
- const getMatchingTemplate = useCallback((hit) => templates
65
- .filter(_template =>
66
- // The analytic must match, and the detection must either a) not exist or b) match the hit
67
- _template.analytic === hit.howler.analytic &&
68
- (!_template.detection || _template.detection.toLowerCase() === hit.howler.detection?.toLowerCase()))
69
- .sort((a, b) => {
70
- // Sort priority:
71
- // 1. personal > readonly > global
72
- // 2. detection > !detection
73
- if (a.type !== b.type) {
74
- const order = {
75
- personal: 2,
76
- readonly: 1,
77
- global: 0
78
- };
79
- return order[b.type] - order[a.type];
80
- }
81
- else {
82
- if (a.detection && !b.detection) {
83
- return -1;
84
- }
85
- else if (!a.detection && b.detection) {
86
- return 1;
87
- }
88
- else {
89
- return 0;
90
- }
91
- }
92
- })[0], [templates]);
93
- const refresh = useCallback(() => {
94
- setLoaded(false);
95
- getTemplates();
96
- // eslint-disable-next-line react-hooks/exhaustive-deps
97
- }, []);
98
- return (_jsx(TemplateContext.Provider, { value: { templates, getTemplates, getMatchingTemplate, refresh, loaded }, children: children }));
99
- };
100
- export const useTemplateContextSelector = (selector) => {
101
- return useContextSelector(TemplateContext, selector);
102
- };
103
- export default TemplateProvider;