From 189f0fa9adc75850e3162e1ee178babd7fa14183 Mon Sep 17 00:00:00 2001 From: Seth Perry Date: Thu, 3 Oct 2019 16:06:53 -0600 Subject: [PATCH] Adds PCAP/Attachment download capability (#120) * adding file/pcap download capability * updating packages * updating dev version of shared package * updating shared package dev version * update typescript, fix import * fixing broken ts build * sorting file names * update nm-web-shared version --- package.json | 5 +- .../public/discover/doc_table/doc_table.html | 3 + .../public/discover/doc_table/doc_table.js | 22 +- .../core_plugins/kibana/public/kibana.js | 1 + src/netmon/components/attach_download.tsx | 104 ++++++++ src/netmon/components/capture_download.tsx | 105 ++++++++ src/netmon/components/capture_header.tsx | 167 ++++++++++++ .../file_download/file_download_modal.tsx | 176 +++++++++++++ .../file_download/file_download_row.tsx | 142 +++++++++++ .../components/{ => save_rule}/save_rule.tsx | 0 .../{ => save_rule}/save_rule_form.tsx | 0 .../directives/attach_download_directive.js | 34 +++ .../directives/bind_html_compile_directive.js | 24 ++ .../directives/capture_download_directive.js | 33 +++ .../directives/capture_header_directive.js | 35 +++ src/netmon/directives/index.js | 24 ++ src/netmon/field_formats/boolean_formats.ts | 51 ++++ .../field_formats/should_bind_format.ts | 22 ++ yarn.lock | 240 ++++++++++++------ 19 files changed, 1112 insertions(+), 76 deletions(-) create mode 100644 src/netmon/components/attach_download.tsx create mode 100644 src/netmon/components/capture_download.tsx create mode 100644 src/netmon/components/capture_header.tsx create mode 100644 src/netmon/components/file_download/file_download_modal.tsx create mode 100644 src/netmon/components/file_download/file_download_row.tsx rename src/netmon/components/{ => save_rule}/save_rule.tsx (100%) rename src/netmon/components/{ => save_rule}/save_rule_form.tsx (100%) create mode 100644 src/netmon/directives/attach_download_directive.js create mode 100644 src/netmon/directives/bind_html_compile_directive.js create mode 100644 src/netmon/directives/capture_download_directive.js create mode 100644 src/netmon/directives/capture_header_directive.js create mode 100644 src/netmon/directives/index.js create mode 100644 src/netmon/field_formats/boolean_formats.ts create mode 100644 src/netmon/field_formats/should_bind_format.ts diff --git a/package.json b/package.json index e54c3888e8f0c..77cf3192e59c0 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "@kbn/test-subj-selector": "0.2.1", "@kbn/ui-framework": "1.0.0", "@logrhythm/icons": "^1.19.0", - "@logrhythm/nm-web-shared": "1.10.1", + "@logrhythm/nm-web-shared": "1.11.0", "@logrhythm/webui": "^5.9.15", "@types/json-stable-stringify": "^1.0.32", "@types/lodash.clonedeep": "^4.5.4", @@ -138,6 +138,7 @@ "abortcontroller-polyfill": "^1.3.0", "angular": "^1.7.9", "angular-aria": "^1.7.8", + "angular-bind-html-compile": "^1.4.1", "angular-elastic": "^2.5.1", "angular-recursion": "^1.0.5", "angular-route": "^1.7.8", @@ -225,7 +226,7 @@ "react-grid-layout": "^0.16.2", "react-hooks-testing-library": "^0.5.0", "react-input-range": "^1.3.0", - "react-jss": "^8.6.1", + "react-jss": "^10.0.0", "react-markdown": "^3.4.1", "react-redux": "^5.1.1", "react-router-dom": "^4.3.1", diff --git a/src/legacy/core_plugins/kibana/public/discover/doc_table/doc_table.html b/src/legacy/core_plugins/kibana/public/discover/doc_table/doc_table.html index b6ac1d3fd8b4a..df46d6e48b011 100644 --- a/src/legacy/core_plugins/kibana/public/discover/doc_table/doc_table.html +++ b/src/legacy/core_plugins/kibana/public/discover/doc_table/doc_table.html @@ -35,6 +35,8 @@ on-change-sort-order="onChangeSortOrder" on-move-column="onMoveColumn" on-remove-column="onRemoveColumn" + on-select-all="onSelectAll" + on-select-current-page="onSelectCurrentPage" > - !$scope.pager.hasNextPage && $scope.pager.totalItems < $scope.totalHitCount; - }, + $scope.shouldShowLimitedResultsWarning = () => ( + !$scope.pager.hasNextPage && $scope.pager.totalItems < $scope.totalHitCount + ); + + $scope.onSelectAll = () => { + const allSessions = $scope.hits + .map(h => !!h && !!h._source && h._source.Session) + .filter(h => !!h); + SelectedCaptureSessions.set(allSessions); + }; + + $scope.onSelectCurrentPage = () => { + const allSessions = $scope.pageOfItems + .map(h => !!h && !!h._source && h._source.Session) + .filter(h => !!h); + SelectedCaptureSessions.set(allSessions); + }; + } }; }); diff --git a/src/legacy/core_plugins/kibana/public/kibana.js b/src/legacy/core_plugins/kibana/public/kibana.js index 01270280c5b06..5c6c4c18db52a 100644 --- a/src/legacy/core_plugins/kibana/public/kibana.js +++ b/src/legacy/core_plugins/kibana/public/kibana.js @@ -55,6 +55,7 @@ import './management'; import './doc'; import './dev_tools'; import './context'; +import '../../../../netmon/directives'; import 'ui/vislib'; import 'ui/agg_response'; import 'ui/agg_types'; diff --git a/src/netmon/components/attach_download.tsx b/src/netmon/components/attach_download.tsx new file mode 100644 index 0000000000000..b71d96c98b6c5 --- /dev/null +++ b/src/netmon/components/attach_download.tsx @@ -0,0 +1,104 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useState, useEffect } from 'react'; +import { createUseStyles } from 'react-jss'; +import { EuiButtonIcon } from '@elastic/eui'; +import { toastNotifications } from 'ui/notify'; +import { startAttachmentDownload } from '@logrhythm/nm-web-shared/services/session_files'; +import FileDownloadModal from './file_download/file_download_modal'; + +const useStyles = createUseStyles({ + buttonWrapper: { + cursor: 'pointer', + }, +}); + +export interface AttachDownloadProps { + session: string; + fileName: string; +} + +const AttachDownload = (props: AttachDownloadProps) => { + const { session, fileName } = props; + + const classes = useStyles(); + + const [downloadId, setDownloadId] = useState(''); + const [fileNames, setFileNames] = useState([]); + + useEffect( + () => { + const newFileNames = new Set(); + + fileName + .split(',') + .map(f => f.trim()) + .forEach(file => { + let fileNameToAdd: string = file; + + const prefix: number = 1; + while (newFileNames.has(fileNameToAdd)) { + fileNameToAdd = `${prefix}_${file}`; + } + + newFileNames.add(fileNameToAdd); + }); + + setFileNames(Array.from(newFileNames)); + }, + [fileName] + ); + + const handleStartDownload = async () => { + try { + const startDownloadRes = await startAttachmentDownload(session, fileNames); + + setDownloadId(startDownloadRes.data.downloadID); + } catch (err) { + console.error( // eslint-disable-line + `An error occurred creating an attachment download for session ${session}`, + err + ); + toastNotifications.addDanger('An error initiating a download for the attachment(s).'); + return; + } + }; + + return ( + <> +
+ +
+ setDownloadId('')} + /> + + ); +}; + +export default AttachDownload; // eslint-disable-line diff --git a/src/netmon/components/capture_download.tsx b/src/netmon/components/capture_download.tsx new file mode 100644 index 0000000000000..a16b4f830b8b8 --- /dev/null +++ b/src/netmon/components/capture_download.tsx @@ -0,0 +1,105 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useState } from 'react'; +import { createUseStyles } from 'react-jss'; +import { EuiButtonIcon, EuiCheckbox } from '@elastic/eui'; +import SelectedCaptureSessions from '@logrhythm/nm-web-shared/services/selected_capture_sessions'; +import { startPcapDownload } from '@logrhythm/nm-web-shared/services/session_files'; +import { toastNotifications } from 'ui/notify'; +import FileDownloadModal from './file_download/file_download_modal'; + +const useStyles = createUseStyles({ + contentWrapper: { + display: 'flex', + alignItems: 'center', + }, + buttonWrapper: { + cursor: 'pointer', + }, +}); + +export interface AttachDownloadProps { + session: string; +} + +const CaptureDownload = (props: AttachDownloadProps) => { + const { session } = props; + + const classes = useStyles(); + + const [downloadId, setDownloadId] = useState(''); + const [isSelected, setIsSelected] = useState(false); + + useEffect( + () => { + return SelectedCaptureSessions.subscribe(session, setIsSelected); + }, + [session] + ); + + const handleStartDownload = async () => { + try { + const sessions = !SelectedCaptureSessions.isEmpty() + ? SelectedCaptureSessions.getAll() + : [session]; + + const startDownloadRes = await startPcapDownload(sessions); + + setDownloadId(startDownloadRes.data.downloadID); + SelectedCaptureSessions.reset(); + } catch (err) { + console.error(`An error occurred creating a PCAP download for session ${session}`, err); // eslint-disable-line + toastNotifications.addDanger('An error initiating a download for the PCAP(s).'); + return; + } + }; + + return ( + <> +
+
+ +
+ { + const action = e.target.checked + ? SelectedCaptureSessions.add + : SelectedCaptureSessions.remove; + action(session); + }} + /> +
+ setDownloadId('')} + /> + + ); +}; + +export default CaptureDownload; // eslint-disable-line diff --git a/src/netmon/components/capture_header.tsx b/src/netmon/components/capture_header.tsx new file mode 100644 index 0000000000000..a3074c49f4e20 --- /dev/null +++ b/src/netmon/components/capture_header.tsx @@ -0,0 +1,167 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useState } from 'react'; +import { createUseStyles } from 'react-jss'; +import { EuiButton, EuiButtonIcon, EuiPopover } from '@elastic/eui'; +import SelectedCaptureSessions from '@logrhythm/nm-web-shared/services/selected_capture_sessions'; +import { startPcapDownload } from '@logrhythm/nm-web-shared/services/session_files'; +import { toastNotifications } from 'ui/notify'; +import FileDownloadModal from './file_download/file_download_modal'; + +const useStyles = createUseStyles({ + popoverWrapper: { + marginRight: '2px', + }, + popoverPanel: { + display: 'flex', + flexDirection: 'column', + alignItems: 'start', + '& button': { + width: '100%', + }, + '& button + button': { + marginTop: '5px', + }, + }, +}); + +export interface CaptureHeaderProps { + onSelectAll?: () => void; + onSelectCurrentPage?: () => void; +} + +const CaptureHeader = (props: CaptureHeaderProps) => { + const { onSelectAll, onSelectCurrentPage } = props; + + const classes = useStyles(); + + const [open, setOpen] = useState(false); + const [selectedCount, setSelectedCount] = useState(0); + const [downloadId, setDownloadId] = useState(''); + + useEffect(() => { + const unsub = SelectedCaptureSessions.subscribeAll(sessions => { + setSelectedCount(sessions.length); + }); + + return () => { + unsub(); + // if we are unmounting the header, + // we should clear our list + SelectedCaptureSessions.reset(); + }; + }, []); + + const button = ( + setOpen(o => !o)} + /> + ); + + const handleStartDownload = async () => { + try { + if (SelectedCaptureSessions.count() === 0) { + return; + } + + const sessions = SelectedCaptureSessions.getAll(); + + const startDownloadRes = await startPcapDownload(sessions); + + setDownloadId(startDownloadRes.data.downloadID); + SelectedCaptureSessions.reset(); + } catch (err) { + console.error('An error occurred creating a PCAP download for selected sessions', err); // eslint-disable-line + toastNotifications.addDanger('An error initiating a download for the PCAP(s).'); + return; + } + }; + + return ( + <> + setOpen(false)} + > +
+ { + handleStartDownload(); + setOpen(false); + }} + > + Download Selected Sessions + + { + if (!onSelectAll) { + return; + } + onSelectAll(); + setOpen(false); + }} + > + Select All Sessions + + { + if (!onSelectCurrentPage) { + return; + } + onSelectCurrentPage(); + setOpen(false); + }} + > + Select Sessions on Current Page + + { + SelectedCaptureSessions.reset(); + setOpen(false); + }} + > + Clear Selected Sessions + +
+
+ {selectedCount} selected + setDownloadId('')} + /> + + ); +}; + +export default CaptureHeader; // eslint-disable-line diff --git a/src/netmon/components/file_download/file_download_modal.tsx b/src/netmon/components/file_download/file_download_modal.tsx new file mode 100644 index 0000000000000..4ca0843ef344b --- /dev/null +++ b/src/netmon/components/file_download/file_download_modal.tsx @@ -0,0 +1,176 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, { useEffect, useRef, useState } from 'react'; +import { createUseStyles } from 'react-jss'; +import _ from 'lodash'; +import { + EuiButton, + EuiCallOut, + EuiHorizontalRule, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, + EuiProgress, + EuiTextColor, + EuiOverlayMask, +} from '@elastic/eui'; +// @ts-ignore +import { saveAs } from '@elastic/filesaver'; +import { FileDownloadStatus, FileType } from '@logrhythm/nm-web-shared/services/session_files'; +import { SessionFileDownloader } from '@logrhythm/nm-web-shared/services/session_file_downloader'; +import { toastNotifications } from 'ui/notify'; +import FileDownloadRow from './file_download_row'; + +const useStyles = createUseStyles({ + footer: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + }, +}); + +export interface FileDownloadModalProps { + downloadId: string; + fileType: FileType; + onClose: () => void; +} + +const FileDownloadModal = (props: FileDownloadModalProps) => { + const { downloadId, fileType, onClose } = props; + + const classes = useStyles(); + + const [downloadStatus, setDownloadStatus] = useState({ + overall: 'loading', + fileStatuses: {}, + }); + const downloader = useRef(null); + + useEffect( + () => { + if (downloader.current && !downloader.current.terminated) { + downloader.current.abort(); + } + + if (!downloadId) { + return; + } + + downloader.current = new SessionFileDownloader( + downloadId, + fileType, + setDownloadStatus, + fileInfo => { + saveAs(fileInfo.blob, fileInfo.name); + }, + toastNotifications.addWarning, + toastNotifications.addDanger + ); + + downloader.current.start(); + }, + [downloadId] + ); + + const handleClose = () => { + if (downloader.current && !downloader.current.terminated) { + toastNotifications.addWarning( + 'The modal cannot be closed until the file download is cancelled or completed.' + ); + return; + } + + onClose(); + }; + + const fileNames = Object.keys(downloadStatus.fileStatuses); + + if (!downloadId) { + return null; + } + + return ( + + + + + + {downloadStatus.overall === 'loading' && 'Downloading Files'} + {downloadStatus.overall === 'partial-success' && 'Partial Success'} + {downloadStatus.overall === 'success' && 'Success'} + {downloadStatus.overall === 'error' && 'Error'} + {downloadStatus.overall === 'aborted' && 'Cancelled'} + + + + + {downloadStatus.overall === 'aborted' && ( + Lookup was cancelled. + )} + {downloadStatus.overall !== 'aborted' && fileNames.length === 0 && ( + + )} + {downloadStatus.overall !== 'aborted' && fileNames.length > 0 && ( + <> + + {fileNames.sort().map(f => ( + + ))} + + )} + + + + {downloadStatus.overall === 'loading' && ( + downloader.current && downloader.current.abort()} + > + Cancel Download + + )} + {downloadStatus.overall !== 'loading' && ( + Close + )} + + + + ); +}; + +export default FileDownloadModal; // eslint-disable-line diff --git a/src/netmon/components/file_download/file_download_row.tsx b/src/netmon/components/file_download/file_download_row.tsx new file mode 100644 index 0000000000000..8b4f9aa89d82b --- /dev/null +++ b/src/netmon/components/file_download/file_download_row.tsx @@ -0,0 +1,142 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { createUseStyles } from 'react-jss'; +import _ from 'lodash'; +import { EuiHorizontalRule, EuiIcon, EuiProgress, EuiTextColor, EuiToolTip } from '@elastic/eui'; +// @ts-ignore +import { saveAs } from '@elastic/filesaver'; +import { SingleFileStatus, DownloadStatus } from '@logrhythm/nm-web-shared/services/session_files'; + +const useStyles = createUseStyles({ + fileDownloadItem: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + }, + tooltip: { + cursor: 'pointer', + }, + infoIcon: { + marginLeft: '2px', + }, + fileDownloadText: { + width: '337.5px', + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + }, + fileDownloadProgress: { + width: '237.5px', + marginLeft: '25px', + }, + progressOngoingText: { + marginBottom: '1em', + }, + progressText: { + display: 'flex', + alignItems: 'center', + }, + statusIcon: { + marginRight: '12px', + }, +}); + +export interface FileDownloadRowProps { + overallStatus: DownloadStatus; + fileName: string; + fileStatus: SingleFileStatus; +} + +const FileDownloadRow = (props: FileDownloadRowProps) => { + const { overallStatus, fileName, fileStatus } = props; + + const classes = useStyles(); + + const renderFileName = () => ( + + {fileName.length < 38 && fileName} + {fileName.length >= 38 && ( + +
{`${fileName.substr(0, 34)}...`}
+
+ )} +
+ ); + + const renderFileStatus = () => { + switch (fileStatus.status) { + case 'locating': + case 'waiting': + case 'downloading': + return overallStatus !== 'loading' ? ( + + ) : ( + <> +
+ {fileStatus.status === 'locating' && 'Locating'} + {fileStatus.status === 'waiting' && 'Waiting'} + {fileStatus.status === 'downloading' && + typeof fileStatus.message === 'number' && + `${fileStatus.message} Bytes Downloaded`} + {fileStatus.status === 'downloading' && + typeof fileStatus.message !== 'number' && + 'Downloading'} +
+ + + ); + case 'success': + case 'failure': + return ( + + + {fileStatus.status === 'success' &&
Success
} + {fileStatus.status === 'failure' && ( + +
+ Error + +
+
+ )} +
+ ); + } + }; + + return ( + +
+ {renderFileName()} + {renderFileStatus()} +
+ +
+ ); +}; + +export default FileDownloadRow; // eslint-disable-line diff --git a/src/netmon/components/save_rule.tsx b/src/netmon/components/save_rule/save_rule.tsx similarity index 100% rename from src/netmon/components/save_rule.tsx rename to src/netmon/components/save_rule/save_rule.tsx diff --git a/src/netmon/components/save_rule_form.tsx b/src/netmon/components/save_rule/save_rule_form.tsx similarity index 100% rename from src/netmon/components/save_rule_form.tsx rename to src/netmon/components/save_rule/save_rule_form.tsx diff --git a/src/netmon/directives/attach_download_directive.js b/src/netmon/directives/attach_download_directive.js new file mode 100644 index 0000000000000..f9a67a06621bd --- /dev/null +++ b/src/netmon/directives/attach_download_directive.js @@ -0,0 +1,34 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import 'ngreact'; + +import { uiModules } from 'ui/modules'; // eslint-disable-line +const module = uiModules.get('kibana', ['react']); + +import AttachDownload from '../components/attach_download'; + +module.directive('attachDownload', function (reactDirective) { + return reactDirective(AttachDownload, + [ + 'session', + 'fileName' + ]); +}); diff --git a/src/netmon/directives/bind_html_compile_directive.js b/src/netmon/directives/bind_html_compile_directive.js new file mode 100644 index 0000000000000..5844f2b24b4f7 --- /dev/null +++ b/src/netmon/directives/bind_html_compile_directive.js @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import 'angular-bind-html-compile/angular-bind-html-compile.min'; + +import { uiModules } from 'ui/modules'; // eslint-disable-line +uiModules.get('kibana', ['angular-bind-html-compile']); diff --git a/src/netmon/directives/capture_download_directive.js b/src/netmon/directives/capture_download_directive.js new file mode 100644 index 0000000000000..11616051d1d59 --- /dev/null +++ b/src/netmon/directives/capture_download_directive.js @@ -0,0 +1,33 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import 'ngreact'; + +import { uiModules } from 'ui/modules'; // eslint-disable-line +const module = uiModules.get('kibana', ['react']); + +import CaptureDownload from '../components/capture_download'; + +module.directive('captureDownload', function (reactDirective) { + return reactDirective(CaptureDownload, + [ + 'session' + ]); +}); diff --git a/src/netmon/directives/capture_header_directive.js b/src/netmon/directives/capture_header_directive.js new file mode 100644 index 0000000000000..71429e3fc5acc --- /dev/null +++ b/src/netmon/directives/capture_header_directive.js @@ -0,0 +1,35 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import 'ngreact'; + +import { uiModules } from 'ui/modules'; // eslint-disable-line +const module = uiModules.get('kibana', ['react']); + +import CaptureHeader from '../components/capture_header'; + +module.directive('captureHeader', function (reactDirective) { + return reactDirective(CaptureHeader, + [ + 'onSelectAll', + 'onSelectCurrentPage', + 'onClearSelection' + ]); +}); diff --git a/src/netmon/directives/index.js b/src/netmon/directives/index.js new file mode 100644 index 0000000000000..4c59d18c2fd0f --- /dev/null +++ b/src/netmon/directives/index.js @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import './attach_download_directive'; +import './bind_html_compile_directive'; +import './capture_download_directive'; +import './capture_header_directive'; diff --git a/src/netmon/field_formats/boolean_formats.ts b/src/netmon/field_formats/boolean_formats.ts new file mode 100644 index 0000000000000..27d6d81ff79c0 --- /dev/null +++ b/src/netmon/field_formats/boolean_formats.ts @@ -0,0 +1,51 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export const formatAttachDownload = (value: boolean, field: any, hit: any) => { + if (!value) { + return ''; + } + + const session = hit && hit._source && hit._source.Session ? hit._source.Session : ''; + + const fileName = hit && hit._source && hit._source.Filename ? hit._source.Filename : ''; + + return ``; +}; + +export const formatCaptureDownload = (value: boolean, field: any, hit: any) => { + if (!value) { + return ''; + } + + const session = hit && hit._source && hit._source.Session ? hit._source.Session : ''; + + return ``; +}; + +export const formatNetmonBoolean = (value: boolean, field: any, hit: any) => { + switch (field.name) { + case 'Attach': + return formatAttachDownload(value, field, hit); + case 'Captured': + return formatCaptureDownload(value, field, hit); + default: + return ''; + } +}; diff --git a/src/netmon/field_formats/should_bind_format.ts b/src/netmon/field_formats/should_bind_format.ts new file mode 100644 index 0000000000000..7dc617c3fc98d --- /dev/null +++ b/src/netmon/field_formats/should_bind_format.ts @@ -0,0 +1,22 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const bindableFieldNames = ['Attach', 'Captured']; + +export const shouldBindFormat = (fieldName: string) => bindableFieldNames.includes(fieldName); diff --git a/yarn.lock b/yarn.lock index b7af7e48e8580..addc711db6fda 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1957,10 +1957,10 @@ resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/@logrhythm/lucene-parser/-/@logrhythm/lucene-parser-3.4.0.tgz#19274929b73c83713c3597febe71a0c62ff2a5e9" integrity sha1-GSdJKbc8g3E8NZf+vnGgxi/ypek= -"@logrhythm/nm-web-shared@1.10.1": - version "1.10.1" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/@logrhythm/nm-web-shared/-/@logrhythm/nm-web-shared-1.10.1.tgz#15c02d5a354daba8a170071fcaca345488395e61" - integrity sha1-FcAtWjVNq6ihcAcfyso0VIg5XmE= +"@logrhythm/nm-web-shared@1.11.0": + version "1.11.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/@logrhythm/nm-web-shared/-/@logrhythm/nm-web-shared-1.11.0.tgz#cfbe53ba15f310025cbf9e8514b04a9b3047c976" + integrity sha1-z75TuhXzEAJcv56FFLBKmzBHyXY= "@logrhythm/webui@^5.9.15": version "5.9.15" @@ -3609,7 +3609,7 @@ dependencies: "@types/node" "*" -"@types/jss@*", "@types/jss@^9.5.6": +"@types/jss@^9.5.6": version "9.5.8" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/@types/jss/-/jss-9.5.8.tgz#258391f42211c042fc965508d505cbdc579baa5b" integrity sha1-JYOR9CIRwEL8llUI1QXL3Febqls= @@ -4172,13 +4172,6 @@ resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/@types/tether/-/tether-1.4.4.tgz#0fde1ccbd2f1fad74f8f465fe6227ff3b7bff634" integrity sha1-D94cy9Lx+tdPj0Zf5iJ/87e/9jQ= -"@types/theming@*": - version "1.3.3" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/@types/theming/-/theming-1.3.3.tgz#e770833b38b43f138acd4d0794b52892caf34c6c" - integrity sha512-xcCIvBHFFxNDxDUn0Po6FXQPpGA6Y5dzt6/fbzVhBba7Qx4cxkxStmLVEkFqEF4jy01SH9DjbRUqdj7RziC/XA== - dependencies: - "@types/react" "*" - "@types/tinycolor2@^1.4.1": version "1.4.1" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/@types/tinycolor2/-/tinycolor2-1.4.1.tgz#2f5670c9d1d6e558897a810ed284b44918fc1253" @@ -9229,6 +9222,14 @@ css-vendor@^0.3.8: dependencies: is-in-browser "^1.0.2" +css-vendor@^2.0.6: + version "2.0.6" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/css-vendor/-/css-vendor-2.0.6.tgz#a205f73d7562e8728c86ef6ce5ee7c7e5eefd71b" + integrity sha1-ogX3PXVi6HKMhu9s5e58fl7v1xs= + dependencies: + "@babel/runtime" "^7.5.5" + is-in-browser "^1.0.2" + css-what@2.1, css-what@^2.1.2: version "2.1.3" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -9298,7 +9299,7 @@ cssstyle@^1.1.1: dependencies: cssom "0.3.x" -csstype@^2.0.0: +csstype@^2.0.0, csstype@^2.6.5: version "2.6.6" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/csstype/-/csstype-2.6.6.tgz#c34f8226a94bbb10c32cc0d714afdf942291fc41" integrity sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg== @@ -17387,37 +17388,18 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jss-camel-case@^6.0.0, jss-camel-case@^6.1.0: +jss-camel-case@^6.0.0: version "6.1.0" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-camel-case/-/jss-camel-case-6.1.0.tgz#ccb1ff8d6c701c02a1fed6fb6fb6b7896e11ce44" integrity sha1-zLH/jWxwHAKh/tb7b7a3iW4RzkQ= dependencies: hyphenate-style-name "^1.0.2" -jss-compose@^5.0.0: - version "5.0.0" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-compose/-/jss-compose-5.0.0.tgz#ce01b2e4521d65c37ea42cf49116e5f7ab596484" - integrity sha512-YofRYuiA0+VbeOw0VjgkyO380sA4+TWDrW52nSluD9n+1FWOlDzNbgpZ/Sb3Y46+DcAbOS21W5jo6SAqUEiuwA== - dependencies: - warning "^3.0.0" - jss-default-unit@^8.0.2: version "8.0.2" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-default-unit/-/jss-default-unit-8.0.2.tgz#cc1e889bae4c0b9419327b314ab1c8e2826890e6" integrity sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg== -jss-expand@^5.3.0: - version "5.3.0" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-expand/-/jss-expand-5.3.0.tgz#02be076efe650125c842f5bb6fb68786fe441ed6" - integrity sha512-NiM4TbDVE0ykXSAw6dfFmB1LIqXP/jdd0ZMnlvlGgEMkMt+weJIl8Ynq1DsuBY9WwkNyzWktdqcEW2VN0RAtQg== - -jss-extend@^6.2.0: - version "6.2.0" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-extend/-/jss-extend-6.2.0.tgz#4af09d0b72fb98ee229970f8ca852fec1ca2a8dc" - integrity sha512-YszrmcB6o9HOsKPszK7NeDBNNjVyiW864jfoiHoMlgMIg2qlxKw70axZHqgczXHDcoyi/0/ikP1XaHDPRvYtEA== - dependencies: - warning "^3.0.0" - jss-global@^3.0.0: version "3.0.0" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-global/-/jss-global-3.0.0.tgz#e19e5c91ab2b96353c227e30aa2cbd938cdaafa2" @@ -17430,34 +17412,134 @@ jss-nested@^6.0.1: dependencies: warning "^3.0.0" -jss-preset-default@^4.3.0: - version "4.5.0" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-preset-default/-/jss-preset-default-4.5.0.tgz#d3a457012ccd7a551312014e394c23c4b301cadd" - integrity sha512-qZbpRVtHT7hBPpZEBPFfafZKWmq3tA/An5RNqywDsZQGrlinIF/mGD9lmj6jGqu8GrED2SMHZ3pPKLmjCZoiaQ== - dependencies: - jss-camel-case "^6.1.0" - jss-compose "^5.0.0" - jss-default-unit "^8.0.2" - jss-expand "^5.3.0" - jss-extend "^6.2.0" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-template "^1.0.1" - jss-vendor-prefixer "^7.0.0" +jss-plugin-camel-case@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.0.tgz#d601bae2e8e2041cc526add289dcd7062db0a248" + integrity sha1-1gG64ujiBBzFJq3SidzXBi2wokg= + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.0.0" + +jss-plugin-compose@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-compose/-/jss-plugin-compose-10.0.0.tgz#6a33566373b9d98b2c086d41b7477d5391b0ec91" + integrity sha1-ajNWY3O52YssCG1Bt0d9U5Gw7JE= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + tiny-warning "^1.0.2" + +jss-plugin-default-unit@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.0.tgz#601caf5f576fc0c66986fbe8a9aa37307a3a3ea3" + integrity sha1-YByvX1dvwMZphvvoqao3MHo6PqM= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + +jss-plugin-expand@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-expand/-/jss-plugin-expand-10.0.0.tgz#ab6a3fac5925267c9d25119aa51de7756b4ff8d8" + integrity sha1-q2o/rFklJnydJRGapR3ndWtP+Ng= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + +jss-plugin-extend@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-extend/-/jss-plugin-extend-10.0.0.tgz#0ce24831b41b622ae3f0f29a519200e864fd303c" + integrity sha1-DOJIMbQbYirj8PKaUZIA6GT9MDw= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + tiny-warning "^1.0.2" + +jss-plugin-global@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-global/-/jss-plugin-global-10.0.0.tgz#0fed1b6461e0d57d6e394f877529009bc1cb3cb6" + integrity sha1-D+0bZGHg1X1uOU+HdSkAm8HLPLY= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + +jss-plugin-nested@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-nested/-/jss-plugin-nested-10.0.0.tgz#d37ecc013c3b0d0e4acc2b48f6b62da6ae53948b" + integrity sha1-037MATw7DQ5KzCtI9rYtpq5TlIs= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.0.tgz#38a13407384c2a4a7c026659488350669b953b18" + integrity sha1-OKE0BzhMKkp8AmZZSINQZpuVOxg= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + +jss-plugin-rule-value-function@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.0.tgz#3ec1b781b7c86080136dbef6c36e91f20244b72e" + integrity sha1-PsG3gbfIYIATbb72w26R8gJEty4= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + +jss-plugin-rule-value-observable@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-rule-value-observable/-/jss-plugin-rule-value-observable-10.0.0.tgz#1e801cbd35f29d08a6184bb073b2565376319e1e" + integrity sha1-HoAcvTXynQimGEuwc7JWU3Yxnh4= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + symbol-observable "^1.2.0" + +jss-plugin-template@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-template/-/jss-plugin-template-10.0.0.tgz#b656c95ef3994a78e1bcc7f177818b31f8015d34" + integrity sha1-tlbJXvOZSnjhvMfxd4GLMfgBXTQ= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.0.tgz#400280535b0f483a9c78105afe4eee61b70018eb" + integrity sha1-QAKAU1sPSDqceBBa/k7uYbcAGOs= + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.6" + jss "10.0.0" + +jss-preset-default@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-preset-default/-/jss-preset-default-10.0.0.tgz#ea6941b453f70f300087889ff5d81d010bfbf7e3" + integrity sha1-6mlBtFP3DzAAh4if9dgdAQv79+M= + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.0.0" + jss-plugin-camel-case "10.0.0" + jss-plugin-compose "10.0.0" + jss-plugin-default-unit "10.0.0" + jss-plugin-expand "10.0.0" + jss-plugin-extend "10.0.0" + jss-plugin-global "10.0.0" + jss-plugin-nested "10.0.0" + jss-plugin-props-sort "10.0.0" + jss-plugin-rule-value-function "10.0.0" + jss-plugin-rule-value-observable "10.0.0" + jss-plugin-template "10.0.0" + jss-plugin-vendor-prefixer "10.0.0" jss-props-sort@^6.0.0: version "6.0.0" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-props-sort/-/jss-props-sort-6.0.0.tgz#9105101a3b5071fab61e2d85ea74cc22e9b16323" integrity sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g== -jss-template@^1.0.1: - version "1.0.1" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-template/-/jss-template-1.0.1.tgz#09aed9d86cc547b07f53ef355d7e1777f7da430a" - integrity sha512-m5BqEWha17fmIVXm1z8xbJhY6GFJxNB9H68GVnCWPyGYfxiAgY9WTQyvDAVj+pYRgrXSOfN5V1T4+SzN1sJTeg== - dependencies: - warning "^3.0.0" - jss-vendor-prefixer@^7.0.0: version "7.0.0" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz#0166729650015ef19d9f02437c73667231605c71" @@ -17465,7 +17547,17 @@ jss-vendor-prefixer@^7.0.0: dependencies: css-vendor "^0.3.8" -jss@^9.7.0, jss@^9.8.7: +jss@10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss/-/jss-10.0.0.tgz#998d5026c02accae15708de83bd6ba57bac977d2" + integrity sha1-mY1QJsAqzK4VcI3oO9a6V7rJd9I= + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^2.6.5" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +jss@^9.8.7: version "9.8.7" resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/jss/-/jss-9.8.7.tgz#ed9763fc0f2f0260fc8260dac657af61e622ce05" integrity sha1-7Zdj/A8vAmD8gmDaxlevYeYizgU= @@ -23239,16 +23331,22 @@ react-is@~16.3.0: resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/react-is/-/react-is-16.3.2.tgz#f4d3d0e2f5fbb6ac46450641eb2e25bf05d36b22" integrity sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q== -react-jss@^8.6.1: - version "8.6.1" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/react-jss/-/react-jss-8.6.1.tgz#a06e2e1d2c4d91b4d11befda865e6c07fbd75252" - integrity sha512-SH6XrJDJkAphp602J14JTy3puB2Zxz1FkM3bKVE8wON+va99jnUTKWnzGECb3NfIn9JPR5vHykge7K3/A747xQ== +react-jss@^10.0.0: + version "10.0.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/react-jss/-/react-jss-10.0.0.tgz#fdde48eabe85c807a0729518e13eae25fc46e59a" + integrity sha1-/d5I6r6FyAegcpUY4T6uJfxG5Zo= dependencies: - hoist-non-react-statics "^2.5.0" - jss "^9.7.0" - jss-preset-default "^4.3.0" + "@babel/runtime" "^7.3.1" + "@emotion/is-prop-valid" "^0.7.3" + css-jss "10.0.0" + hoist-non-react-statics "^3.2.0" + is-in-browser "^1.1.3" + jss "10.0.0" + jss-preset-default "10.0.0" prop-types "^15.6.0" - theming "^1.3.0" + shallow-equal "^1.2.0" + theming "3.2.0" + tiny-warning "^1.0.2" react-konva@16.8.3: version "16.8.3" @@ -27151,15 +27249,15 @@ textextensions@2: resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/textextensions/-/textextensions-2.2.0.tgz#38ac676151285b658654581987a0ce1a4490d286" integrity sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA== -theming@^1.3.0: - version "1.3.0" - resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/theming/-/theming-1.3.0.tgz#286d5bae80be890d0adc645e5ca0498723725bdc" - integrity sha512-ya5Ef7XDGbTPBv5ENTwrwkPUexrlPeiAg/EI9kdlUAZhNlRbCdhMKRgjNX1IcmsmiPcqDQZE6BpSaH+cr31FKw== +theming@3.2.0: + version "3.2.0" + resolved "https://logrhythm.jfrog.io/logrhythm/api/npm/npm-virtual/theming/-/theming-3.2.0.tgz#237b13ae46e0596a7d1dc2ce4a31bcfce52cad8e" + integrity sha1-I3sTrkbgWWp9HcLOSjG8/OUsrY4= dependencies: - brcast "^3.0.1" - is-function "^1.0.1" - is-plain-object "^2.0.1" + hoist-non-react-statics "^3.3.0" prop-types "^15.5.8" + react-display-name "^0.2.4" + tiny-warning "^1.0.2" thenify-all@^1.0.0: version "1.6.0"