[Security Solution] Cleanup network page inconsistencies (#133900)

This commit is contained in:
Steph Milovic 2022-06-13 10:10:37 -06:00 committed by GitHub
parent 517395148a
commit 2657221748
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
49 changed files with 249 additions and 459 deletions

View file

@ -7,7 +7,7 @@
import type { IEsSearchResponse } from '@kbn/data-plugin/common';
import { CursorType, Inspect, Maybe, PageInfoPaginated, SortField } from '../../../common';
import { FlowTarget } from '../common';
import { FlowTargetSourceDest } from '../common';
import { RequestOptionsPaginated } from '../..';
export enum NetworkUsersFields {
@ -18,7 +18,7 @@ export enum NetworkUsersFields {
export interface NetworkUsersRequestOptions extends RequestOptionsPaginated {
ip: string;
sort: SortField<NetworkUsersFields>;
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
}
export interface NetworkUsersStrategyResponse extends IEsSearchResponse {

View file

@ -21,7 +21,7 @@ import {
success,
success_count as successCount,
} from '../../detection_engine/schemas/common/schemas';
import { FlowTarget } from '../../search_strategy/security_solution/network';
import { FlowTargetSourceDest } from '../../search_strategy/security_solution/network';
import { errorSchema } from '../../detection_engine/schemas/response/error_schema';
import { Direction, Maybe } from '../../search_strategy';
@ -526,7 +526,7 @@ export type TimelineExpandedNetworkType =
panelView?: 'networkDetail';
params?: {
ip: string;
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
};
}
| EmptyObject;

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { FlowTarget } from '../../../../../common/search_strategy';
import { FlowTarget, FlowTargetSourceDest } from '../../../../../common/search_strategy';
import { CriteriaFields } from '../types';
import { networkToCriteria } from './network_to_criteria';
@ -17,7 +17,7 @@ describe('network_to_criteria', () => {
fieldValue: '127.0.0.1',
},
];
expect(networkToCriteria('127.0.0.1', FlowTarget.source)).toEqual(expectedCriteria);
expect(networkToCriteria('127.0.0.1', FlowTargetSourceDest.source)).toEqual(expectedCriteria);
});
test('converts a network to a criteria of destination if given a destination', () => {
@ -27,10 +27,14 @@ describe('network_to_criteria', () => {
fieldValue: '127.0.0.1',
},
];
expect(networkToCriteria('127.0.0.1', FlowTarget.destination)).toEqual(expectedCriteria);
expect(networkToCriteria('127.0.0.1', FlowTargetSourceDest.destination)).toEqual(
expectedCriteria
);
});
test('returns an empty array if the Flow Type is anything else', () => {
expect(networkToCriteria('127.0.0.1', FlowTarget.server)).toEqual([]);
expect(
networkToCriteria('127.0.0.1', FlowTarget.server as unknown as FlowTargetSourceDest)
).toEqual([]);
});
});

View file

@ -5,13 +5,16 @@
* 2.0.
*/
import { FlowTarget } from '../../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../../common/search_strategy';
import { CriteriaFields } from '../types';
export const networkToCriteria = (ip: string, flowTarget: FlowTarget): CriteriaFields[] => {
if (flowTarget === FlowTarget.source) {
export const networkToCriteria = (
ip: string,
flowTarget: FlowTargetSourceDest
): CriteriaFields[] => {
if (flowTarget === FlowTargetSourceDest.source) {
return [{ fieldName: 'source.ip', fieldValue: ip }];
} else if (flowTarget === FlowTarget.destination) {
} else if (flowTarget === FlowTargetSourceDest.destination) {
return [{ fieldName: 'destination.ip', fieldValue: ip }];
} else {
return [];

View file

@ -11,7 +11,7 @@ import { UpdateDateRange } from '../../../components/charts/common';
import { GlobalTimeArgs } from '../../use_global_time';
import { HostsType } from '../../../../hosts/store/model';
import { NetworkType } from '../../../../network/store/model';
import { FlowTarget } from '../../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../../common/search_strategy';
import { UsersType } from '../../../../users/store/model';
interface QueryTabBodyProps {
@ -25,7 +25,7 @@ export type AnomaliesQueryTabBodyProps = QueryTabBodyProps & {
AnomaliesTableComponent: React.NamedExoticComponent<any>;
deleteQuery?: ({ id }: { id: string }) => void;
endDate: GlobalTimeArgs['to'];
flowTarget?: FlowTarget;
flowTarget?: FlowTargetSourceDest;
indexNames: string[];
narrowDateRange: NarrowDateRange;
setQuery: GlobalTimeArgs['setQuery'];

View file

@ -8,7 +8,7 @@
import deepmerge from 'deepmerge';
import { MlSummaryJob } from '@kbn/ml-plugin/public';
import { FlowTarget } from '../../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../../common/search_strategy';
import { ESTermQuery } from '../../../../../common/typed_json';
import { createFilter } from '../../helpers';
@ -17,7 +17,7 @@ export const getAnomaliesFilterQuery = (
anomaliesFilterQuery: object = {},
securityJobs: MlSummaryJob[] = [],
anomalyScore: number,
flowTarget?: FlowTarget,
flowTarget?: FlowTargetSourceDest,
ip?: string
): string => {
const securityJobIds = securityJobs

View file

@ -24,7 +24,7 @@ import { IpOverview } from '.';
import { mockData } from './mock';
import { mockAnomalies } from '../../../common/components/ml/mock';
import { NarrowDateRange } from '../../../common/components/ml/types';
import { FlowTarget } from '../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../common/search_strategy';
describe('IP Overview Component', () => {
const state: State = mockGlobalState;
@ -41,7 +41,7 @@ describe('IP Overview Component', () => {
anomaliesData: mockAnomalies,
data: mockData.IpOverview,
endDate: '2019-06-18T06:00:00.000Z',
flowTarget: FlowTarget.source,
flowTarget: FlowTargetSourceDest.source,
loading: false,
id: 'ipOverview',
ip: '10.10.10.10',
@ -51,7 +51,7 @@ describe('IP Overview Component', () => {
startDate: '2019-06-15T06:00:00.000Z',
type: networkModel.NetworkType.details,
updateFlowTargetAction: jest.fn() as unknown as ActionCreator<{
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
}>,
};

View file

@ -11,7 +11,10 @@ import React from 'react';
import { DEFAULT_DARK_MODE } from '../../../../common/constants';
import { DescriptionList } from '../../../../common/utility_types';
import { useUiSetting$ } from '../../../common/lib/kibana';
import { FlowTarget, NetworkDetailsStrategyResponse } from '../../../../common/search_strategy';
import {
FlowTargetSourceDest,
NetworkDetailsStrategyResponse,
} from '../../../../common/search_strategy';
import { networkModel } from '../../store';
import { getEmptyTagValue } from '../../../common/components/empty_value';
@ -39,7 +42,7 @@ export interface IpOverviewProps {
contextID?: string; // used to provide unique draggable context when viewing in the side panel
data: NetworkDetailsStrategyResponse['networkDetails'];
endDate: string;
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
id: string;
ip: string;
isDraggable?: boolean;

View file

@ -7,7 +7,11 @@
import { EuiSuperSelect } from '@elastic/eui';
import React from 'react';
import { FlowTarget, FlowDirection } from '../../../../common/search_strategy';
import {
FlowTarget,
FlowTargetSourceDest,
FlowDirection,
} from '../../../../common/search_strategy';
import * as i18n from './translations';
@ -41,10 +45,10 @@ const toggleTargetOptions = (id: string, displayText: string[]) => [
interface OwnProps {
id: string;
isLoading: boolean;
selectedTarget: FlowTarget;
selectedTarget: FlowTarget | FlowTargetSourceDest;
displayTextOverride?: string[];
selectedDirection?: FlowDirection;
updateFlowTargetAction: (flowTarget: FlowTarget) => void;
updateFlowTargetAction: (flowTarget: FlowTarget | FlowTargetSourceDest) => void;
}
export type FlowTargetSelectProps = OwnProps;

View file

@ -15,7 +15,11 @@ import * as i18nIp from '../details/translations';
import { FlowTargetSelect } from '../flow_controls/flow_target_select';
import { IpOverviewId } from '../../../timelines/components/field_renderers/field_renderers';
import { FlowTarget, FlowDirection } from '../../../../common/search_strategy';
import {
FlowTarget,
FlowTargetSourceDest,
FlowDirection,
} from '../../../../common/search_strategy';
const SelectTypeItem = styled(EuiFlexItem)`
min-width: 180px;
@ -24,13 +28,13 @@ const SelectTypeItem = styled(EuiFlexItem)`
SelectTypeItem.displayName = 'SelectTypeItem';
interface Props {
flowTarget: FlowTarget;
flowTarget: FlowTarget | FlowTargetSourceDest;
}
const getUpdatedFlowTargetPath = (
location: Location,
currentFlowTarget: FlowTarget,
newFlowTarget: FlowTarget
currentFlowTarget: FlowTarget | FlowTargetSourceDest,
newFlowTarget: FlowTarget | FlowTargetSourceDest
) => {
const newPathame = location.pathname.replace(currentFlowTarget, newFlowTarget);
@ -42,7 +46,7 @@ export const FlowTargetSelectConnectedComponent: React.FC<Props> = ({ flowTarget
const location = useLocation();
const updateNetworkDetailsFlowTarget = useCallback(
(newFlowTarget: FlowTarget) => {
(newFlowTarget: FlowTarget | FlowTargetSourceDest) => {
const newPath = getUpdatedFlowTargetPath(location, flowTarget, newFlowTarget);
history.push(newPath);
},

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { FlowTarget, NetworkUsersItem } from '../../../../common/search_strategy';
import { FlowTargetSourceDest, NetworkUsersItem } from '../../../../common/search_strategy';
import { defaultToEmptyTag } from '../../../common/components/empty_value';
import { Columns } from '../../../common/components/paginated_table';
@ -23,7 +23,10 @@ export type UsersColumns = [
Columns<NetworkUsersItem['count']>
];
export const getUsersColumns = (flowTarget: FlowTarget, tableId: string): UsersColumns => [
export const getUsersColumns = (
flowTarget: FlowTargetSourceDest,
tableId: string
): UsersColumns => [
{
field: 'node.user.name',
name: i18n.USER_NAME,

View file

@ -24,7 +24,7 @@ import { networkModel } from '../../store';
import { UsersTable } from '.';
import { mockUsersData } from './mock';
import { FlowTarget } from '../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../common/search_strategy';
jest.mock('../../../common/lib/kibana');
@ -42,7 +42,7 @@ describe('Users Table Component', () => {
const defaultProps = {
data: mockUsersData.edges,
flowTarget: FlowTarget.source,
flowTarget: FlowTargetSourceDest.source,
fakeTotalCount: getOr(50, 'fakeTotalCount', mockUsersData.pageInfo),
id: 'user',
isInspect: false,

View file

@ -14,7 +14,7 @@ import { assertUnreachable } from '../../../../common/utility_types';
import { networkActions, networkModel, networkSelectors } from '../../store';
import {
Direction,
FlowTarget,
FlowTargetSourceDest,
NetworkUsersEdges,
NetworkUsersFields,
SortField,
@ -32,7 +32,7 @@ const tableType = networkModel.NetworkDetailsTableType.users;
interface UsersTableProps {
data: NetworkUsersEdges[];
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
fakeTotalCount: number;
id: string;
isInspect: boolean;

View file

@ -7,7 +7,7 @@
import { act, renderHook } from '@testing-library/react-hooks';
import { TestProviders } from '../../../common/mock';
import { useNetworkDns } from '.';
import { ID, useNetworkDns } from '.';
import { NetworkType } from '../../store/model';
describe('useNetworkDns', () => {
@ -17,6 +17,7 @@ describe('useNetworkDns', () => {
docValueFields: [],
startDate: '2020-07-07T08:20:18.966Z',
endDate: '2020-07-08T08:20:18.966Z',
id: `${ID}-${NetworkType.page}`,
indexNames: ['cool'],
type: NetworkType.page,
skip: false,

View file

@ -48,7 +48,7 @@ export interface NetworkDnsArgs {
}
interface UseNetworkDns {
id?: string;
id: string;
docValueFields: DocValueFields[];
indexNames: string[];
type: networkModel.NetworkType;
@ -62,6 +62,7 @@ export const useNetworkDns = ({
docValueFields,
endDate,
filterQuery,
id,
indexNames,
skip,
startDate,
@ -96,7 +97,7 @@ export const useNetworkDns = ({
const [networkDnsResponse, setNetworkDnsResponse] = useState<NetworkDnsArgs>({
networkDns: [],
histogram: [],
id: ID,
id,
inspect: {
dsl: [],
response: [],

View file

@ -7,7 +7,7 @@
import { act, renderHook } from '@testing-library/react-hooks';
import { TestProviders } from '../../../common/mock';
import { useNetworkHttp } from '.';
import { ID, useNetworkHttp } from '.';
import { NetworkType } from '../../store/model';
describe('useNetworkHttp', () => {
@ -17,6 +17,7 @@ describe('useNetworkHttp', () => {
docValueFields: [],
startDate: '2020-07-07T08:20:18.966Z',
endDate: '2020-07-08T08:20:18.966Z',
id: `${ID}-${NetworkType.page}`,
indexNames: ['cool'],
type: NetworkType.page,
skip: false,

View file

@ -46,7 +46,7 @@ export interface NetworkHttpArgs {
}
interface UseNetworkHttp {
id?: string;
id: string;
ip?: string;
indexNames: string[];
type: networkModel.NetworkType;
@ -59,7 +59,7 @@ interface UseNetworkHttp {
export const useNetworkHttp = ({
endDate,
filterQuery,
id = ID,
id,
indexNames,
ip,
skip,

View file

@ -7,7 +7,7 @@
import { act, renderHook } from '@testing-library/react-hooks';
import { TestProviders } from '../../../common/mock';
import { useNetworkTopCountries } from '.';
import { ID, useNetworkTopCountries } from '.';
import { NetworkType } from '../../store/model';
import { FlowTargetSourceDest } from '../../../../common/search_strategy';
@ -19,6 +19,7 @@ describe('useNetworkTopCountries', () => {
flowTarget: FlowTargetSourceDest.source,
startDate: '2020-07-07T08:20:18.966Z',
endDate: '2020-07-08T08:20:18.966Z',
id: `${ID}-${NetworkType.page}`,
indexNames: ['cool'],
type: NetworkType.page,
skip: false,

View file

@ -38,27 +38,29 @@ export interface NetworkTopCountriesArgs {
inspect: InspectResponse;
isInspected: boolean;
loadPage: (newActivePage: number) => void;
networkTopCountries: NetworkTopCountriesEdges[];
pageInfo: PageInfoPaginated;
refetch: inputsModel.Refetch;
networkTopCountries: NetworkTopCountriesEdges[];
totalCount: number;
}
interface UseNetworkTopCountries {
flowTarget: FlowTargetSourceDest;
ip?: string;
indexNames: string[];
type: networkModel.NetworkType;
filterQuery?: ESTermQuery | string;
endDate: string;
startDate: string;
filterQuery?: ESTermQuery | string;
flowTarget: FlowTargetSourceDest;
id: string;
indexNames: string[];
ip?: string;
skip: boolean;
startDate: string;
type: networkModel.NetworkType;
}
export const useNetworkTopCountries = ({
endDate,
filterQuery,
flowTarget,
id,
indexNames,
ip,
skip,
@ -74,7 +76,6 @@ export const useNetworkTopCountries = ({
const abortCtrl = useRef(new AbortController());
const searchSubscription$ = useRef(new Subscription());
const [loading, setLoading] = useState(false);
const queryId = useMemo(() => `${ID}-${flowTarget}`, [flowTarget]);
const [networkTopCountriesRequest, setHostRequest] =
useState<NetworkTopCountriesRequestOptions | null>(null);
@ -99,7 +100,7 @@ export const useNetworkTopCountries = ({
const [networkTopCountriesResponse, setNetworkTopCountriesResponse] =
useState<NetworkTopCountriesArgs>({
networkTopCountries: [],
id: queryId,
id,
inspect: {
dsl: [],
response: [],

View file

@ -7,7 +7,7 @@
import { act, renderHook } from '@testing-library/react-hooks';
import { TestProviders } from '../../../common/mock';
import { useNetworkTopNFlow } from '.';
import { ID, useNetworkTopNFlow } from '.';
import { NetworkType } from '../../store/model';
import { FlowTargetSourceDest } from '../../../../common/search_strategy';
@ -19,6 +19,7 @@ describe('useNetworkTopNFlow', () => {
flowTarget: FlowTargetSourceDest.source,
startDate: '2020-07-07T08:20:18.966Z',
endDate: '2020-07-08T08:20:18.966Z',
id: `${ID}-${NetworkType.page}`,
indexNames: ['cool'],
type: NetworkType.page,
skip: false,

View file

@ -46,6 +46,7 @@ export interface NetworkTopNFlowArgs {
interface UseNetworkTopNFlow {
flowTarget: FlowTargetSourceDest;
id: string;
ip?: string;
indexNames: string[];
type: networkModel.NetworkType;
@ -59,6 +60,7 @@ export const useNetworkTopNFlow = ({
endDate,
filterQuery,
flowTarget,
id,
indexNames,
ip,
skip,
@ -96,7 +98,7 @@ export const useNetworkTopNFlow = ({
const [networkTopNFlowResponse, setNetworkTopNFlowResponse] = useState<NetworkTopNFlowArgs>({
networkTopNFlow: [],
id: `${ID}-${flowTarget}`,
id,
inspect: {
dsl: [],
response: [],

View file

@ -7,7 +7,7 @@
import { act, renderHook } from '@testing-library/react-hooks';
import { TestProviders } from '../../../common/mock';
import { useNetworkTls } from '.';
import { ID, useNetworkTls } from '.';
import { NetworkType } from '../../store/model';
import { FlowTargetSourceDest } from '../../../../common/search_strategy';
@ -19,6 +19,7 @@ describe('useNetworkTls', () => {
flowTarget: FlowTargetSourceDest.source,
startDate: '2020-07-07T08:20:18.966Z',
endDate: '2020-07-08T08:20:18.966Z',
id: `${ID}-${NetworkType.page}`,
indexNames: ['cool'],
ip: '1.1.1.1',
type: NetworkType.page,

View file

@ -51,14 +51,14 @@ interface UseNetworkTls {
endDate: string;
startDate: string;
skip: boolean;
id?: string;
id: string;
}
export const useNetworkTls = ({
endDate,
filterQuery,
flowTarget,
id = ID,
id,
indexNames,
ip,
skip,

View file

@ -7,17 +7,18 @@
import { act, renderHook } from '@testing-library/react-hooks';
import { TestProviders } from '../../../common/mock';
import { useNetworkUsers } from '.';
import { ID, useNetworkUsers } from '.';
import { NetworkType } from '../../store/model';
import { FlowTarget } from '../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../common/search_strategy';
describe('useNetworkUsers', () => {
it('skip = true will cancel any running request', () => {
const abortSpy = jest.spyOn(AbortController.prototype, 'abort');
const localProps = {
docValueFields: [],
id: `${ID}-${NetworkType.page}`,
ip: '1.1.1.1',
flowTarget: FlowTarget.source,
flowTarget: FlowTargetSourceDest.source,
startDate: '2020-07-07T08:20:18.966Z',
endDate: '2020-07-08T08:20:18.966Z',
indexNames: ['cool'],

View file

@ -20,7 +20,7 @@ import { createFilter } from '../../../common/containers/helpers';
import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers';
import { networkSelectors } from '../../store';
import {
FlowTarget,
FlowTargetSourceDest,
NetworkQueries,
NetworkUsersRequestOptions,
NetworkUsersStrategyResponse,
@ -46,12 +46,12 @@ export interface NetworkUsersArgs {
}
interface UseNetworkUsers {
id?: string;
id: string;
filterQuery?: ESTermQuery | string;
endDate: string;
startDate: string;
skip: boolean;
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
ip: string;
}
@ -59,7 +59,7 @@ export const useNetworkUsers = ({
endDate,
filterQuery,
flowTarget,
id = ID,
id,
ip,
skip,
startDate,

View file

@ -21,7 +21,7 @@ import {
import { useMountAppended } from '../../../common/utils/use_mount_appended';
import { createStore, State } from '../../../common/store';
import { NetworkDetails } from '.';
import { FlowTarget } from '../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../common/search_strategy';
jest.mock('@elastic/eui', () => {
const original = jest.requireActual('@elastic/eui');
@ -117,7 +117,7 @@ describe('Network Details', () => {
const ip = '123.456.78.90';
(useParams as jest.Mock).mockReturnValue({
detailName: ip,
flowTarget: FlowTarget.source,
flowTarget: FlowTargetSourceDest.source,
});
const wrapper = mount(
<TestProviders store={store}>
@ -137,7 +137,7 @@ describe('Network Details', () => {
});
(useParams as jest.Mock).mockReturnValue({
detailName: ip,
flowTarget: FlowTarget.source,
flowTarget: FlowTargetSourceDest.source,
});
const wrapper = mount(
<TestProviders store={store}>

View file

@ -11,12 +11,15 @@ import { useDispatch } from 'react-redux';
import { useParams } from 'react-router-dom';
import { getEsQueryConfig } from '@kbn/data-plugin/common';
import { useDeepEqualSelector } from '../../../common/hooks/use_selector';
import {
FlowTarget,
FlowTargetSourceDest,
LastEventIndexKey,
} from '../../../../common/search_strategy';
CountriesQueryTabBody,
HttpQueryTabBody,
IPsQueryTabBody,
TlsQueryTabBody,
UsersQueryTabBody,
} from '../navigation';
import { useDeepEqualSelector } from '../../../common/hooks/use_selector';
import { FlowTargetSourceDest, LastEventIndexKey } from '../../../../common/search_strategy';
import { useGlobalTime } from '../../../common/containers/use_global_time';
import { FiltersGlobal } from '../../../common/components/filters_global';
import { HeaderPage } from '../../../common/components/header_page';
@ -39,11 +42,6 @@ import { inputsSelectors } from '../../../common/store';
import { setAbsoluteRangeDatePicker } from '../../../common/store/inputs/actions';
import { setNetworkDetailsTablesActivePageToZero } from '../../store/actions';
import { SpyRoute } from '../../../common/utils/route/spy_routes';
import { NetworkHttpQueryTable } from './network_http_query_table';
import { NetworkTopCountriesQueryTable } from './network_top_countries_query_table';
import { NetworkTopNFlowQueryTable } from './network_top_n_flow_query_table';
import { TlsQueryTable } from './tls_query_table';
import { UsersQueryTable } from './users_query_table';
import { AnomaliesQueryTabBody } from '../../../common/containers/anomalies/anomalies_query_tab_body';
import { networkModel } from '../../store';
import { SecurityPageName } from '../../../app/types';
@ -59,7 +57,7 @@ const NetworkDetailsComponent: React.FC = () => {
const { to, from, setQuery, isInitializing } = useGlobalTime();
const { detailName, flowTarget } = useParams<{
detailName: string;
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
}>();
const getGlobalQuerySelector = useMemo(() => inputsSelectors.globalQuerySelector(), []);
const getGlobalFiltersQuerySelector = useMemo(
@ -176,32 +174,32 @@ const NetworkDetailsComponent: React.FC = () => {
<ConditionalFlexGroup direction="column">
<EuiFlexItem>
<NetworkTopNFlowQueryTable
<IPsQueryTabBody
endDate={to}
filterQuery={filterQuery}
flowTarget={FlowTargetSourceDest.source}
indexNames={selectedPatterns}
indexPattern={indexPattern}
ip={ip}
setQuery={setQuery}
skip={shouldSkip}
startDate={from}
type={type}
setQuery={setQuery}
indexPattern={indexPattern}
/>
</EuiFlexItem>
<EuiFlexItem>
<NetworkTopNFlowQueryTable
<IPsQueryTabBody
endDate={to}
flowTarget={FlowTargetSourceDest.destination}
filterQuery={filterQuery}
flowTarget={FlowTargetSourceDest.destination}
indexNames={selectedPatterns}
indexPattern={indexPattern}
ip={ip}
setQuery={setQuery}
skip={shouldSkip}
startDate={from}
type={type}
setQuery={setQuery}
indexPattern={indexPattern}
/>
</EuiFlexItem>
</ConditionalFlexGroup>
@ -210,69 +208,69 @@ const NetworkDetailsComponent: React.FC = () => {
<ConditionalFlexGroup direction="column">
<EuiFlexItem>
<NetworkTopCountriesQueryTable
<CountriesQueryTabBody
endDate={to}
filterQuery={filterQuery}
flowTarget={FlowTargetSourceDest.source}
indexNames={selectedPatterns}
indexPattern={indexPattern}
ip={ip}
setQuery={setQuery}
skip={shouldSkip}
startDate={from}
type={type}
setQuery={setQuery}
indexPattern={indexPattern}
/>
</EuiFlexItem>
<EuiFlexItem>
<NetworkTopCountriesQueryTable
<CountriesQueryTabBody
endDate={to}
flowTarget={FlowTargetSourceDest.destination}
filterQuery={filterQuery}
flowTarget={FlowTargetSourceDest.destination}
indexNames={selectedPatterns}
indexPattern={indexPattern}
ip={ip}
setQuery={setQuery}
skip={shouldSkip}
startDate={from}
type={type}
setQuery={setQuery}
indexPattern={indexPattern}
/>
</EuiFlexItem>
</ConditionalFlexGroup>
<EuiSpacer />
<UsersQueryTable
<UsersQueryTabBody
endDate={to}
filterQuery={filterQuery}
flowTarget={flowTarget}
indexNames={selectedPatterns}
ip={ip}
setQuery={setQuery}
skip={shouldSkip}
startDate={from}
type={type}
setQuery={setQuery}
/>
<EuiSpacer />
<NetworkHttpQueryTable
<HttpQueryTabBody
endDate={to}
filterQuery={filterQuery}
indexNames={selectedPatterns}
ip={ip}
setQuery={setQuery}
skip={shouldSkip}
startDate={from}
type={type}
setQuery={setQuery}
/>
<EuiSpacer />
<TlsQueryTable
<TlsQueryTabBody
endDate={to}
filterQuery={filterQuery}
flowTarget={flowTarget as unknown as FlowTargetSourceDest}
flowTarget={flowTarget}
indexNames={selectedPatterns}
ip={ip}
setQuery={setQuery}
@ -284,18 +282,18 @@ const NetworkDetailsComponent: React.FC = () => {
<EuiSpacer />
<AnomaliesQueryTabBody
filterQuery={filterQuery}
setQuery={setQuery}
startDate={from}
AnomaliesTableComponent={AnomaliesNetworkTable}
endDate={to}
skip={shouldSkip}
filterQuery={filterQuery}
flowTarget={flowTarget}
hideHistogramIfEmpty={true}
indexNames={selectedPatterns}
ip={ip}
type={type}
flowTarget={flowTarget}
narrowDateRange={narrowDateRange}
hideHistogramIfEmpty={true}
AnomaliesTableComponent={AnomaliesNetworkTable}
setQuery={setQuery}
skip={shouldSkip}
startDate={from}
type={type}
/>
</SecuritySolutionPageWrapper>
</>

View file

@ -1,65 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import React, { useEffect, useState } from 'react';
import { getOr } from 'lodash/fp';
import { manageQuery } from '../../../common/components/page/manage_query';
import { OwnProps } from './types';
import { useNetworkHttp, ID } from '../../containers/network_http';
import { NetworkHttpTable } from '../../components/network_http_table';
import { useQueryToggle } from '../../../common/containers/query_toggle';
const NetworkHttpTableManage = manageQuery(NetworkHttpTable);
export const NetworkHttpQueryTable = ({
endDate,
filterQuery,
indexNames,
ip,
setQuery,
skip,
startDate,
type,
}: OwnProps) => {
const { toggleStatus } = useQueryToggle(ID);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
}, [skip, toggleStatus]);
const [
loading,
{ id, inspect, isInspected, loadPage, networkHttp, pageInfo, refetch, totalCount },
] = useNetworkHttp({
endDate,
filterQuery,
indexNames,
ip,
skip: querySkip,
startDate,
type,
});
return (
<NetworkHttpTableManage
data={networkHttp}
fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)}
id={id}
inspect={inspect}
isInspect={isInspected}
loading={loading}
loadPage={loadPage}
refetch={refetch}
setQuery={setQuery}
setQuerySkip={setQuerySkip}
showMorePagesIndicator={getOr(false, 'showMorePagesIndicator', pageInfo)}
totalCount={totalCount}
type={type}
/>
);
};
NetworkHttpQueryTable.displayName = 'NetworkHttpQueryTable';

View file

@ -1,70 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import React, { useEffect, useState } from 'react';
import { getOr } from 'lodash/fp';
import { manageQuery } from '../../../common/components/page/manage_query';
import { NetworkWithIndexComponentsQueryTableProps } from './types';
import { useNetworkTopCountries, ID } from '../../containers/network_top_countries';
import { NetworkTopCountriesTable } from '../../components/network_top_countries_table';
import { useQueryToggle } from '../../../common/containers/query_toggle';
const NetworkTopCountriesTableManage = manageQuery(NetworkTopCountriesTable);
export const NetworkTopCountriesQueryTable = ({
endDate,
filterQuery,
flowTarget,
indexNames,
ip,
setQuery,
skip,
startDate,
type,
indexPattern,
}: NetworkWithIndexComponentsQueryTableProps) => {
const { toggleStatus } = useQueryToggle(`${ID}-${flowTarget}`);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
}, [skip, toggleStatus]);
const [
loading,
{ id, inspect, isInspected, loadPage, networkTopCountries, pageInfo, refetch, totalCount },
] = useNetworkTopCountries({
endDate,
flowTarget,
filterQuery,
indexNames,
ip,
skip: querySkip,
startDate,
type,
});
return (
<NetworkTopCountriesTableManage
data={networkTopCountries}
fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)}
flowTargeted={flowTarget}
id={id}
indexPattern={indexPattern}
inspect={inspect}
isInspect={isInspected}
loading={loading}
loadPage={loadPage}
refetch={refetch}
setQuery={setQuery}
setQuerySkip={setQuerySkip}
showMorePagesIndicator={getOr(false, 'showMorePagesIndicator', pageInfo)}
totalCount={totalCount}
type={type}
/>
);
};
NetworkTopCountriesQueryTable.displayName = 'NetworkTopCountriesQueryTable';

View file

@ -1,68 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { getOr } from 'lodash/fp';
import React, { useEffect, useState } from 'react';
import { manageQuery } from '../../../common/components/page/manage_query';
import { NetworkTopNFlowTable } from '../../components/network_top_n_flow_table';
import { useNetworkTopNFlow, ID } from '../../containers/network_top_n_flow';
import { NetworkWithIndexComponentsQueryTableProps } from './types';
import { useQueryToggle } from '../../../common/containers/query_toggle';
const NetworkTopNFlowTableManage = manageQuery(NetworkTopNFlowTable);
export const NetworkTopNFlowQueryTable = ({
endDate,
filterQuery,
flowTarget,
ip,
indexNames,
setQuery,
skip,
startDate,
type,
}: NetworkWithIndexComponentsQueryTableProps) => {
const { toggleStatus } = useQueryToggle(`${ID}-${flowTarget}`);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
}, [skip, toggleStatus]);
const [
loading,
{ id, inspect, isInspected, loadPage, networkTopNFlow, pageInfo, refetch, totalCount },
] = useNetworkTopNFlow({
endDate,
filterQuery,
flowTarget,
indexNames,
ip,
skip: querySkip,
startDate,
type,
});
return (
<NetworkTopNFlowTableManage
data={networkTopNFlow}
fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)}
flowTargeted={flowTarget}
id={id}
inspect={inspect}
isInspect={isInspected}
loading={loading}
loadPage={loadPage}
refetch={refetch}
setQuery={setQuery}
setQuerySkip={setQuerySkip}
showMorePagesIndicator={getOr(false, 'showMorePagesIndicator', pageInfo)}
totalCount={totalCount}
type={type}
/>
);
};
NetworkTopNFlowQueryTable.displayName = 'NetworkTopNFlowQueryTable';

View file

@ -1,65 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { getOr } from 'lodash/fp';
import React, { useEffect, useState } from 'react';
import { manageQuery } from '../../../common/components/page/manage_query';
import { TlsTable } from '../../components/tls_table';
import { ID, useNetworkTls } from '../../containers/tls';
import { TlsQueryTableComponentProps } from './types';
import { useQueryToggle } from '../../../common/containers/query_toggle';
const TlsTableManage = manageQuery(TlsTable);
export const TlsQueryTable = ({
endDate,
filterQuery,
flowTarget,
indexNames,
ip,
setQuery,
skip,
startDate,
type,
}: TlsQueryTableComponentProps) => {
const { toggleStatus } = useQueryToggle(ID);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
}, [skip, toggleStatus]);
const [loading, { id, inspect, isInspected, tls, totalCount, pageInfo, loadPage, refetch }] =
useNetworkTls({
endDate,
filterQuery,
flowTarget,
indexNames,
ip,
skip: querySkip,
startDate,
type,
});
return (
<TlsTableManage
data={tls}
id={id}
inspect={inspect}
isInspect={isInspected}
fakeTotalCount={getOr(50, 'fakeTotalCount', pageInfo)}
loading={loading}
loadPage={loadPage}
showMorePagesIndicator={getOr(false, 'showMorePagesIndicator', pageInfo)}
refetch={refetch}
setQuery={setQuery}
setQuerySkip={setQuerySkip}
totalCount={totalCount}
type={type}
/>
);
};
TlsQueryTable.displayName = 'TlsQueryTable';

View file

@ -10,7 +10,6 @@ import { getOr } from 'lodash/fp';
import { NetworkTopCountriesTable } from '../../components/network_top_countries_table';
import { useNetworkTopCountries, ID } from '../../containers/network_top_countries';
import { networkModel } from '../../store';
import { manageQuery } from '../../../common/components/page/manage_query';
import { IPsQueryTabBodyProps as CountriesQueryTabBodyProps } from './types';
@ -21,14 +20,17 @@ const NetworkTopCountriesTableManage = manageQuery(NetworkTopCountriesTable);
export const CountriesQueryTabBody = ({
endDate,
filterQuery,
flowTarget,
indexNames,
indexPattern,
ip,
setQuery,
skip,
startDate,
setQuery,
indexPattern,
flowTarget,
type,
}: CountriesQueryTabBodyProps) => {
const { toggleStatus } = useQueryToggle(`${ID}-${flowTarget}`);
const queryId = `${ID}-${flowTarget}-${type}`;
const { toggleStatus } = useQueryToggle(queryId);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
@ -40,10 +42,12 @@ export const CountriesQueryTabBody = ({
endDate,
flowTarget,
filterQuery,
id: queryId,
indexNames,
ip,
skip: querySkip,
startDate,
type: networkModel.NetworkType.page,
type,
});
return (
@ -62,7 +66,7 @@ export const CountriesQueryTabBody = ({
setQuerySkip={setQuerySkip}
showMorePagesIndicator={getOr(false, 'showMorePagesIndicator', pageInfo)}
totalCount={totalCount}
type={networkModel.NetworkType.page}
type={type}
/>
);
};

View file

@ -18,7 +18,7 @@ import {
MatrixHistogramOption,
MatrixHistogramConfigs,
} from '../../../common/components/matrix_histogram/types';
import * as i18n from '../translations';
import * as i18n from './translations';
import { MatrixHistogram } from '../../../common/components/matrix_histogram';
import { MatrixHistogramType } from '../../../../common/search_strategy/security_solution';
import { networkSelectors } from '../../store';
@ -72,8 +72,8 @@ const DnsQueryTabBodyComponent: React.FC<NetworkComponentQueryProps> = ({
}
};
}, [deleteQuery]);
const { toggleStatus } = useQueryToggle(ID);
const queryId = `${ID}-${type}`;
const { toggleStatus } = useQueryToggle(queryId);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
@ -85,6 +85,7 @@ const DnsQueryTabBodyComponent: React.FC<NetworkComponentQueryProps> = ({
docValueFields: docValueFields ?? [],
endDate,
filterQuery,
id: queryId,
indexNames,
skip: querySkip,
startDate,

View file

@ -10,7 +10,6 @@ import { getOr } from 'lodash/fp';
import { NetworkHttpTable } from '../../components/network_http_table';
import { ID, useNetworkHttp } from '../../containers/network_http';
import { networkModel } from '../../store';
import { manageQuery } from '../../../common/components/page/manage_query';
import { HttpQueryTabBodyProps } from './types';
@ -25,8 +24,10 @@ export const HttpQueryTabBody = ({
skip,
startDate,
setQuery,
type,
}: HttpQueryTabBodyProps) => {
const { toggleStatus } = useQueryToggle(ID);
const queryId = `${ID}-${type}`;
const { toggleStatus } = useQueryToggle(queryId);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
@ -37,10 +38,11 @@ export const HttpQueryTabBody = ({
] = useNetworkHttp({
endDate,
filterQuery,
id: queryId,
indexNames,
skip: querySkip,
startDate,
type: networkModel.NetworkType.page,
type,
});
return (
@ -57,7 +59,7 @@ export const HttpQueryTabBody = ({
setQuerySkip={setQuerySkip}
showMorePagesIndicator={getOr(false, 'showMorePagesIndicator', pageInfo)}
totalCount={totalCount}
type={networkModel.NetworkType.page}
type={type}
/>
);
};

View file

@ -9,3 +9,10 @@ export * from './network_routes';
export * from './network_routes_loading';
export * from './nav_tabs';
export * from './utils';
export * from './alerts_query_tab_body';
export * from './countries_query_tab_body';
export * from './dns_query_tab_body';
export * from './http_query_tab_body';
export * from './ips_query_tab_body';
export * from './tls_query_tab_body';
export * from './users_query_tab_body';

View file

@ -10,7 +10,6 @@ import { getOr } from 'lodash/fp';
import { NetworkTopNFlowTable } from '../../components/network_top_n_flow_table';
import { ID, useNetworkTopNFlow } from '../../containers/network_top_n_flow';
import { networkModel } from '../../store';
import { manageQuery } from '../../../common/components/page/manage_query';
import { IPsQueryTabBodyProps } from './types';
@ -21,13 +20,16 @@ const NetworkTopNFlowTableManage = manageQuery(NetworkTopNFlowTable);
export const IPsQueryTabBody = ({
endDate,
filterQuery,
flowTarget,
indexNames,
ip,
setQuery,
skip,
startDate,
setQuery,
flowTarget,
type,
}: IPsQueryTabBodyProps) => {
const { toggleStatus } = useQueryToggle(`${ID}-${flowTarget}`);
const queryId = `${ID}-${flowTarget}-${type}`;
const { toggleStatus } = useQueryToggle(queryId);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
@ -39,10 +41,12 @@ export const IPsQueryTabBody = ({
endDate,
flowTarget,
filterQuery,
id: queryId,
indexNames,
ip,
skip: querySkip,
startDate,
type: networkModel.NetworkType.page,
type,
});
return (
@ -60,7 +64,7 @@ export const IPsQueryTabBody = ({
setQuerySkip={setQuerySkip}
showMorePagesIndicator={getOr(false, 'showMorePagesIndicator', pageInfo)}
totalCount={totalCount}
type={networkModel.NetworkType.page}
type={type}
/>
);
};

View file

@ -13,17 +13,19 @@ import { EuiFlexItem, EuiSpacer } from '@elastic/eui';
import { FlowTargetSourceDest } from '../../../../common/search_strategy/security_solution/network';
import { scoreIntervalToDateTime } from '../../../common/components/ml/score/score_interval_to_datetime';
import { IPsQueryTabBody } from './ips_query_tab_body';
import { CountriesQueryTabBody } from './countries_query_tab_body';
import { HttpQueryTabBody } from './http_query_tab_body';
import {
CountriesQueryTabBody,
DnsQueryTabBody,
HttpQueryTabBody,
IPsQueryTabBody,
NetworkAlertsQueryTabBody,
TlsQueryTabBody,
} from '.';
import { AnomaliesQueryTabBody } from '../../../common/containers/anomalies/anomalies_query_tab_body';
import { AnomaliesNetworkTable } from '../../../common/components/ml/tables/anomalies_network_table';
import { DnsQueryTabBody } from './dns_query_tab_body';
import { ConditionalFlexGroup } from './conditional_flex_group';
import { NetworkRoutesProps, NetworkRouteType } from './types';
import { TlsQueryTabBody } from './tls_query_tab_body';
import { Anomaly } from '../../../common/components/ml/types';
import { NetworkAlertsQueryTabBody } from './alerts_query_tab_body';
import { UpdateDateRange } from '../../../common/components/charts/common';
import { NETWORK_PATH } from '../../../../common/constants';

View file

@ -10,12 +10,12 @@ import { getOr } from 'lodash/fp';
import { manageQuery } from '../../../common/components/page/manage_query';
import { useNetworkTls, ID } from '../../containers/tls';
import { TlsTable } from '../../components/tls_table';
import { TlsQueryTabBodyProps } from './types';
import { FTQueryTabBodyProps } from './types';
import { useQueryToggle } from '../../../common/containers/query_toggle';
const TlsTableManage = manageQuery(TlsTable);
const TlsQueryTabBodyComponent: React.FC<TlsQueryTabBodyProps> = ({
const TlsQueryTabBodyComponent: React.FC<FTQueryTabBodyProps> = ({
endDate,
filterQuery,
flowTarget,
@ -26,7 +26,8 @@ const TlsQueryTabBodyComponent: React.FC<TlsQueryTabBodyProps> = ({
startDate,
type,
}) => {
const { toggleStatus } = useQueryToggle(ID);
const queryId = `${ID}-${type}`;
const { toggleStatus } = useQueryToggle(queryId);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
@ -36,6 +37,7 @@ const TlsQueryTabBodyComponent: React.FC<TlsQueryTabBodyProps> = ({
endDate,
filterQuery,
flowTarget,
id: queryId,
indexNames,
ip,
skip: querySkip,

View file

@ -0,0 +1,19 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { i18n } from '@kbn/i18n';
export const ERROR_FETCHING_DNS_DATA = i18n.translate(
'xpack.securitySolution.hosts.navigation.dns.histogram.errorFetchingDnsData',
{
defaultMessage: 'Failed to query DNS data',
}
);
export const DOMAINS_COUNT_BY = (groupByField: string) =>
i18n.translate('xpack.securitySolution.network.dns.stackByUniqueSubdomain', {
values: { groupByField },
defaultMessage: 'Top domains by {groupByField}',
});

View file

@ -6,6 +6,7 @@
*/
import type { DataViewBase } from '@kbn/es-query';
import { NarrowDateRange } from '../../../common/components/ml/types';
import { ESTermQuery } from '../../../../common/typed_json';
import { NavTab } from '../../../common/components/navigation/types';
@ -14,17 +15,17 @@ import { networkModel } from '../../store';
import { GlobalTimeArgs } from '../../../common/containers/use_global_time';
import { SetAbsoluteRangeDatePicker } from '../types';
import { NarrowDateRange } from '../../../common/components/ml/types';
import { DocValueFields } from '../../../common/containers/source';
interface QueryTabBodyProps extends Pick<GlobalTimeArgs, 'setQuery' | 'deleteQuery'> {
skip: boolean;
type: networkModel.NetworkType;
startDate: string;
endDate: string;
filterQuery?: string | ESTermQuery;
narrowDateRange?: NarrowDateRange;
indexNames: string[];
ip?: string;
narrowDateRange?: NarrowDateRange;
skip: boolean;
startDate: string;
type: networkModel.NetworkType;
}
export type NetworkComponentQueryProps = QueryTabBodyProps & {
@ -32,18 +33,19 @@ export type NetworkComponentQueryProps = QueryTabBodyProps & {
};
export type IPsQueryTabBodyProps = QueryTabBodyProps & {
flowTarget: FlowTargetSourceDest;
indexPattern: DataViewBase;
};
export type FTQueryTabBodyProps = QueryTabBodyProps & {
flowTarget: FlowTargetSourceDest;
};
export type TlsQueryTabBodyProps = QueryTabBodyProps & {
flowTarget: FlowTargetSourceDest;
ip?: string;
export type IPQueryTabBodyProps = FTQueryTabBodyProps & {
ip: string;
};
export type HttpQueryTabBodyProps = QueryTabBodyProps & {
ip?: string;
};
export type HttpQueryTabBodyProps = QueryTabBodyProps;
export type NetworkRoutesProps = GlobalTimeArgs & {
docValueFields: DocValueFields[];
@ -54,6 +56,15 @@ export type NetworkRoutesProps = GlobalTimeArgs & {
setAbsoluteRangeDatePicker: SetAbsoluteRangeDatePicker;
};
export enum NetworkRouteType {
flows = 'flows',
dns = 'dns',
anomalies = 'anomalies',
tls = 'tls',
http = 'http',
alerts = 'external-alerts',
}
export type KeyNetworkNavTabWithoutMlPermission = NetworkRouteType.dns &
NetworkRouteType.flows &
NetworkRouteType.http &
@ -67,15 +78,6 @@ type KeyNetworkNavTab = KeyNetworkNavTabWithoutMlPermission | KeyNetworkNavTabWi
export type NetworkNavTab = Record<KeyNetworkNavTab, NavTab>;
export enum NetworkRouteType {
flows = 'flows',
dns = 'dns',
anomalies = 'anomalies',
tls = 'tls',
http = 'http',
alerts = 'external-alerts',
}
export type GetNetworkRoutePath = (
capabilitiesFetched: boolean,
hasMlUserPermission: boolean

View file

@ -9,13 +9,13 @@ import React, { useEffect, useState } from 'react';
import { getOr } from 'lodash/fp';
import { manageQuery } from '../../../common/components/page/manage_query';
import { useNetworkUsers, ID } from '../../containers/users';
import { NetworkComponentsQueryProps } from './types';
import { IPQueryTabBodyProps } from './types';
import { UsersTable } from '../../components/users_table';
import { useQueryToggle } from '../../../common/containers/query_toggle';
const UsersTableManage = manageQuery(UsersTable);
export const UsersQueryTable = ({
export const UsersQueryTabBody = ({
endDate,
filterQuery,
flowTarget,
@ -24,8 +24,9 @@ export const UsersQueryTable = ({
skip,
startDate,
type,
}: NetworkComponentsQueryProps) => {
const { toggleStatus } = useQueryToggle(ID);
}: IPQueryTabBodyProps) => {
const queryId = `${ID}-${type}`;
const { toggleStatus } = useQueryToggle(queryId);
const [querySkip, setQuerySkip] = useState(skip || !toggleStatus);
useEffect(() => {
setQuerySkip(skip || !toggleStatus);
@ -37,6 +38,7 @@ export const UsersQueryTable = ({
endDate,
filterQuery,
flowTarget,
id: queryId,
ip,
skip: querySkip,
startDate,
@ -62,4 +64,4 @@ export const UsersQueryTable = ({
);
};
UsersQueryTable.displayName = 'UsersQueryTable';
UsersQueryTabBody.displayName = 'UsersQueryTable';

View file

@ -29,13 +29,6 @@ export const NAVIGATION_DNS_TITLE = i18n.translate(
}
);
export const ERROR_FETCHING_DNS_DATA = i18n.translate(
'xpack.securitySolution.hosts.navigation.dns.histogram.errorFetchingDnsData',
{
defaultMessage: 'Failed to query DNS data',
}
);
export const NAVIGATION_TLS_TITLE = i18n.translate(
'xpack.securitySolution.network.navigation.tlsTitle',
{
@ -63,9 +56,3 @@ export const NAVIGATION_ALERTS_TITLE = i18n.translate(
defaultMessage: 'External alerts',
}
);
export const DOMAINS_COUNT_BY = (groupByField: string) =>
i18n.translate('xpack.securitySolution.network.dns.stackByUniqueSubdomain', {
values: { groupByField },
defaultMessage: 'Top domains by {groupByField}',
});

View file

@ -15,6 +15,7 @@ import { HostEcs } from '../../../../common/ecs/host';
import {
AutonomousSystem,
FlowTarget,
FlowTargetSourceDest,
NetworkDetailsStrategyResponse,
} from '../../../../common/search_strategy';
import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers';
@ -75,7 +76,7 @@ export const dateRenderer = (timestamp?: string | null): React.ReactElement => (
export const autonomousSystemRenderer = (
as: AutonomousSystem,
flowTarget: FlowTarget,
flowTarget: FlowTarget | FlowTargetSourceDest,
contextID?: string,
isDraggable?: boolean
): React.ReactElement =>

View file

@ -12,7 +12,7 @@ import deepEqual from 'fast-deep-equal';
import { EuiButtonEmpty, EuiButtonIcon } from '@elastic/eui';
import { StatefulEventContext } from '@kbn/timelines-plugin/public';
import { FlowTarget } from '../../../../common/search_strategy/security_solution/network';
import { FlowTargetSourceDest } from '../../../../common/search_strategy/security_solution/network';
import {
DragEffects,
DraggableWrapper,
@ -198,9 +198,9 @@ const AddressLinksItemComponent: React.FC<AddressLinksItemProps> = ({
panelView: 'networkDetail',
params: {
ip: address,
flowTarget: fieldName.includes(FlowTarget.destination)
? FlowTarget.destination
: FlowTarget.source,
flowTarget: fieldName.includes(FlowTargetSourceDest.destination)
? FlowTargetSourceDest.destination
: FlowTargetSourceDest.source,
},
};

View file

@ -23,7 +23,7 @@ import {
TimelineId,
TimelineTabs,
} from '../../../../common/types/timeline';
import { FlowTarget } from '../../../../common/search_strategy/security_solution/network';
import { FlowTargetSourceDest } from '../../../../common/search_strategy/security_solution/network';
import { EventDetailsPanel } from './event_details';
import { useKibana } from '../../../common/lib/kibana';
import { mockCasesContext } from '@kbn/cases-plugin/public/mocks/mock_cases_context';
@ -66,7 +66,7 @@ describe('Details Panel Component', () => {
panelView: 'networkDetail',
params: {
ip: 'woohoo!',
flowTarget: FlowTarget.source,
flowTarget: FlowTargetSourceDest.source,
},
},
};

View file

@ -12,7 +12,7 @@ import React, { useCallback, useMemo } from 'react';
import { useDispatch } from 'react-redux';
import { getEsQueryConfig } from '@kbn/data-plugin/common';
import { useInvalidFilterQuery } from '../../../../common/hooks/use_invalid_filter_query';
import { FlowTarget } from '../../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../../common/search_strategy';
import { NetworkDetailsLink } from '../../../../common/components/links';
import { IpOverview } from '../../../../network/components/details';
import { useDeepEqualSelector } from '../../../../common/hooks/use_selector';
@ -30,7 +30,7 @@ import { useAnomaliesTableData } from '../../../../common/components/ml/anomaly/
import { LandingCards } from '../../../../common/components/landing_cards';
interface ExpandableNetworkProps {
expandedNetwork: { ip: string; flowTarget: FlowTarget };
expandedNetwork: { ip: string; flowTarget: FlowTargetSourceDest };
}
const StyledTitle = styled.h4`

View file

@ -18,7 +18,7 @@ import {
import { i18n } from '@kbn/i18n';
import React from 'react';
import styled from 'styled-components';
import { FlowTarget } from '../../../../../common/search_strategy';
import { FlowTargetSourceDest } from '../../../../../common/search_strategy';
import {
ExpandableNetworkDetailsTitle,
ExpandableNetworkDetailsPageLink,
@ -59,7 +59,7 @@ const StyledPanelContent = styled.div`
interface NetworkDetailsProps {
contextID: string;
expandedNetwork: { ip: string; flowTarget: FlowTarget };
expandedNetwork: { ip: string; flowTarget: FlowTargetSourceDest };
handleOnNetworkClosed: () => void;
isFlyoutView?: boolean;
isDraggable?: boolean;

View file

@ -9,7 +9,7 @@ import type { IEsSearchResponse } from '@kbn/data-plugin/common';
import {
Direction,
FlowTarget,
FlowTargetSourceDest,
NetworkQueries,
NetworkUsersFields,
NetworkUsersRequestOptions,
@ -28,7 +28,7 @@ export const mockOptions: NetworkUsersRequestOptions = {
],
factoryQueryType: NetworkQueries.users,
filterQuery: '{"bool":{"must":[],"filter":[{"match_all":{}}],"should":[],"must_not":[]}}',
flowTarget: FlowTarget.source,
flowTarget: FlowTargetSourceDest.source,
ip: '10.142.0.7',
pagination: { activePage: 0, cursorStart: 0, fakePossibleCount: 50, querySize: 10 },
sort: { field: NetworkUsersFields.name, direction: Direction.asc },

View file

@ -503,20 +503,16 @@ export type TimelineExpandedUserType =
};
}
| EmptyObject;
enum FlowTarget {
client = 'client',
enum FlowTargetSourceDest {
destination = 'destination',
server = 'server',
source = 'source',
}
export type TimelineExpandedNetworkType =
| {
panelView?: 'networkDetail';
params?: {
ip: string;
flowTarget: FlowTarget;
flowTarget: FlowTargetSourceDest;
};
}
| EmptyObject;