diff --git a/src/ui/public/flyout/flyout_session.tsx b/src/ui/public/flyout/flyout_session.tsx index 185c7378fa86a..58bb5d625ed31 100644 --- a/src/ui/public/flyout/flyout_session.tsx +++ b/src/ui/public/flyout/flyout_session.tsx @@ -85,6 +85,7 @@ class FlyoutSession extends EventEmitter { export function openFlyout( flyoutChildren: React.ReactNode, flyoutProps: { + closeButtonAriaLabel?: string; onClose?: () => void; 'data-test-subj'?: string; } = {} diff --git a/src/ui/public/inspector/inspector.tsx b/src/ui/public/inspector/inspector.tsx index 7d19674945a6a..1fa3d7f54c909 100644 --- a/src/ui/public/inspector/inspector.tsx +++ b/src/ui/public/inspector/inspector.tsx @@ -69,6 +69,7 @@ function open(adapters: Adapters, options: InspectorOptions = {}): InspectorSess return openFlyout(, { 'data-test-subj': 'inspectorPanel', + closeButtonAriaLabel: 'Close Inspector', }); } diff --git a/x-pack/plugins/beats_management/common/domain_types.ts b/x-pack/plugins/beats_management/common/domain_types.ts index a1750a25b4350..42878c0b6bd34 100644 --- a/x-pack/plugins/beats_management/common/domain_types.ts +++ b/x-pack/plugins/beats_management/common/domain_types.ts @@ -13,6 +13,7 @@ export interface ConfigurationBlock { export interface CMBeat { id: string; enrollment_token: string; + active: boolean; access_token: string; verified_on?: string; type: string; diff --git a/x-pack/plugins/beats_management/public/components/table/controls.tsx b/x-pack/plugins/beats_management/public/components/table/controls.tsx index 730c73a37d5e1..f4d85d57d4cf8 100644 --- a/x-pack/plugins/beats_management/public/components/table/controls.tsx +++ b/x-pack/plugins/beats_management/public/components/table/controls.tsx @@ -30,6 +30,7 @@ export function ControlBar(props: ControlBarProps) { selectionCount, showAssignmentOptions, } = props; + const filters = controlDefinitions.filters.length === 0 ? null : controlDefinitions.filters; return selectionCount !== 0 && showAssignmentOptions ? ( { } public render() { + const { actionHandler, assignmentOptions, diff --git a/x-pack/plugins/beats_management/public/components/table/table_type_configs.tsx b/x-pack/plugins/beats_management/public/components/table/table_type_configs.tsx index 6f20e68e16b1b..643c7ce4b810f 100644 --- a/x-pack/plugins/beats_management/public/components/table/table_type_configs.tsx +++ b/x-pack/plugins/beats_management/public/components/table/table_type_configs.tsx @@ -9,6 +9,7 @@ import { EuiBadge, EuiFlexGroup, EuiIcon, EuiLink } from '@elastic/eui'; import { flatten, uniq } from 'lodash'; import moment from 'moment'; import React from 'react'; + import { TABLE_CONFIG } from '../../../common/constants'; import { BeatTag, CMPopulatedBeat, ConfigurationBlock } from '../../../common/domain_types'; diff --git a/x-pack/plugins/beats_management/public/lib/adapters/beats/adapter_types.ts b/x-pack/plugins/beats_management/public/lib/adapters/beats/adapter_types.ts index 38129f27ab38f..c47ea7a4c6350 100644 --- a/x-pack/plugins/beats_management/public/lib/adapters/beats/adapter_types.ts +++ b/x-pack/plugins/beats_management/public/lib/adapters/beats/adapter_types.ts @@ -8,6 +8,7 @@ import { CMBeat } from '../../../../common/domain_types'; export interface CMBeatsAdapter { get(id: string): Promise; + update(id: string, beatData: Partial): Promise; getAll(): Promise; removeTagsFromBeats(removals: BeatsTagAssignment[]): Promise; assignTagsToBeats(assignments: BeatsTagAssignment[]): Promise; diff --git a/x-pack/plugins/beats_management/public/lib/adapters/beats/memory_beats_adapter.ts b/x-pack/plugins/beats_management/public/lib/adapters/beats/memory_beats_adapter.ts index af02c4edf26c3..745a11ac65464 100644 --- a/x-pack/plugins/beats_management/public/lib/adapters/beats/memory_beats_adapter.ts +++ b/x-pack/plugins/beats_management/public/lib/adapters/beats/memory_beats_adapter.ts @@ -25,6 +25,17 @@ export class MemoryBeatsAdapter implements CMBeatsAdapter { return this.beatsDB.find(beat => beat.id === id) || null; } + public async update(id: string, beatData: Partial): Promise { + const index = this.beatsDB.findIndex(beat => beat.id === id); + + if (index === -1) { + return false; + } + + this.beatsDB[index] = { ...this.beatsDB[index], ...beatData }; + return true; + } + public async getAll() { return this.beatsDB.map((beat: any) => omit(beat, ['access_token'])); } @@ -35,6 +46,12 @@ export class MemoryBeatsAdapter implements CMBeatsAdapter { const beatIds = removals.map(r => r.beatId); const response = this.beatsDB.filter(beat => beatIds.includes(beat.id)).map(beat => { + const tagData = removals.find(r => r.beatId === beat.id); + if (tagData) { + if (beat.tags) { + beat.tags = beat.tags.filter(tag => tag !== tagData.tag); + } + } const removalsForBeat = removals.filter(r => r.beatId === beat.id); if (removalsForBeat.length) { removalsForBeat.forEach((assignment: BeatsTagAssignment) => { diff --git a/x-pack/plugins/beats_management/public/lib/adapters/beats/rest_beats_adapter.ts b/x-pack/plugins/beats_management/public/lib/adapters/beats/rest_beats_adapter.ts index aaf9d545dffee..30a052a182945 100644 --- a/x-pack/plugins/beats_management/public/lib/adapters/beats/rest_beats_adapter.ts +++ b/x-pack/plugins/beats_management/public/lib/adapters/beats/rest_beats_adapter.ts @@ -28,6 +28,11 @@ export class RestBeatsAdapter implements CMBeatsAdapter { return (await this.REST.get<{ beats: CMBeat[] }>('/api/beats/agents')).beats; } + public async update(id: string, beatData: Partial): Promise { + await this.REST.put<{ success: true }>(`/api/beats/agent/${id}`, beatData); + return true; + } + public async removeTagsFromBeats(removals: BeatsTagAssignment[]): Promise { return (await this.REST.post<{ removals: BeatsRemovalReturn[] }>( `/api/beats/agents_tags/removals`, diff --git a/x-pack/plugins/beats_management/public/lib/adapters/framework/kibana_framework_adapter.ts b/x-pack/plugins/beats_management/public/lib/adapters/framework/kibana_framework_adapter.ts index 1a61a5581ce4e..497f47a48d57d 100644 --- a/x-pack/plugins/beats_management/public/lib/adapters/framework/kibana_framework_adapter.ts +++ b/x-pack/plugins/beats_management/public/lib/adapters/framework/kibana_framework_adapter.ts @@ -17,7 +17,6 @@ import { export class KibanaFrameworkAdapter implements FrameworkAdapter { public appState: object; - public kbnVersion?: string; private management: any; private adapterService: KibanaAdapterServiceProvider; diff --git a/x-pack/plugins/beats_management/public/lib/adapters/rest_api/axios_rest_api_adapter.ts b/x-pack/plugins/beats_management/public/lib/adapters/rest_api/axios_rest_api_adapter.ts index b05f2b41e30b3..56bd9b63df686 100644 --- a/x-pack/plugins/beats_management/public/lib/adapters/rest_api/axios_rest_api_adapter.ts +++ b/x-pack/plugins/beats_management/public/lib/adapters/rest_api/axios_rest_api_adapter.ts @@ -9,11 +9,7 @@ import { RestAPIAdapter } from './adapter_types'; let globalAPI: AxiosInstance; export class AxiosRestAPIAdapter implements RestAPIAdapter { - constructor( - private readonly kbnVersion: string, - private readonly xsrfToken: string, - private readonly basePath: string - ) {} + constructor(private readonly xsrfToken: string, private readonly basePath: string) {} public async get(url: string): Promise { return await this.REST.get(url).then(resp => resp.data); @@ -48,7 +44,7 @@ export class AxiosRestAPIAdapter implements RestAPIAdapter { Accept: 'application/json', credentials: 'same-origin', 'Content-Type': 'application/json', - 'kbn-version': this.kbnVersion, + 'kbn-version': this.xsrfToken, 'kbn-xsrf': this.xsrfToken, }, }); diff --git a/x-pack/plugins/beats_management/public/lib/compose/kibana.ts b/x-pack/plugins/beats_management/public/lib/compose/kibana.ts index 9f8f183170fd1..ef395a54ba73b 100644 --- a/x-pack/plugins/beats_management/public/lib/compose/kibana.ts +++ b/x-pack/plugins/beats_management/public/lib/compose/kibana.ts @@ -22,8 +22,7 @@ import { RestTokensAdapter } from '../adapters/tokens/rest_tokens_adapter'; import { FrontendDomainLibs, FrontendLibs } from '../lib'; export function compose(): FrontendLibs { - const kbnVersion = (window as any).__KBN__.version; - const api = new AxiosRestAPIAdapter(kbnVersion, chrome.getXsrfToken(), chrome.getBasePath()); + const api = new AxiosRestAPIAdapter(chrome.getXsrfToken(), chrome.getBasePath()); const tags = new RestTagsAdapter(api); const tokens = new RestTokensAdapter(api); diff --git a/x-pack/plugins/beats_management/public/pages/main/beats.tsx b/x-pack/plugins/beats_management/public/pages/main/beats.tsx index 5653a74e83130..7854e3336f070 100644 --- a/x-pack/plugins/beats_management/public/pages/main/beats.tsx +++ b/x-pack/plugins/beats_management/public/pages/main/beats.tsx @@ -79,10 +79,16 @@ export class BeatsPage extends React.PureComponent { - // const selected = this.getSelectedBeats(); - // await this.props.libs.beats.delete(selected); + const selected = this.getSelectedBeats(); + for (const beat of selected) { + await this.props.libs.beats.update(beat.id, { active: false }); + } + // because the compile code above has a very minor race condition, we wait, + // the max race condition time is really 10ms but doing 100 to be safe + setTimeout(async () => { + await this.loadBeats(); + }, 100); }; private async loadBeats() { @@ -110,7 +116,7 @@ export class BeatsPage extends React.PureComponent this.removeTagsFromBeats(selectedBeats, tag) @@ -143,7 +149,7 @@ export class BeatsPage extends React.PureComponent { + private getSelectedBeats = (): CMPopulatedBeat[] => { return this.state.tableRef.current.state.selection; }; } diff --git a/x-pack/plugins/beats_management/public/pages/main/tags.tsx b/x-pack/plugins/beats_management/public/pages/main/tags.tsx index d7ed848fd10c3..9c8c0ac2347b1 100644 --- a/x-pack/plugins/beats_management/public/pages/main/tags.tsx +++ b/x-pack/plugins/beats_management/public/pages/main/tags.tsx @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ + // @ts-ignore EuiToolTip has no typings in current version import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiToolTip } from '@elastic/eui'; import React from 'react'; diff --git a/x-pack/plugins/beats_management/server/lib/adapters/beats/adapter_types.ts b/x-pack/plugins/beats_management/server/lib/adapters/beats/adapter_types.ts index aa12674bf25b7..9fc2578ccf8da 100644 --- a/x-pack/plugins/beats_management/server/lib/adapters/beats/adapter_types.ts +++ b/x-pack/plugins/beats_management/server/lib/adapters/beats/adapter_types.ts @@ -8,8 +8,8 @@ import { CMBeat } from '../../../../common/domain_types'; import { FrameworkUser } from '../framework/adapter_types'; export interface CMBeatsAdapter { - insert(beat: CMBeat): Promise; - update(beat: CMBeat): Promise; + insert(user: FrameworkUser, beat: CMBeat): Promise; + update(user: FrameworkUser, beat: CMBeat): Promise; get(user: FrameworkUser, id: string): Promise; getAll(user: FrameworkUser): Promise; getWithIds(user: FrameworkUser, beatIds: string[]): Promise; diff --git a/x-pack/plugins/beats_management/server/lib/adapters/beats/elasticsearch_beats_adapter.ts b/x-pack/plugins/beats_management/server/lib/adapters/beats/elasticsearch_beats_adapter.ts index dbe16067dc6f2..22bba3661a752 100644 --- a/x-pack/plugins/beats_management/server/lib/adapters/beats/elasticsearch_beats_adapter.ts +++ b/x-pack/plugins/beats_management/server/lib/adapters/beats/elasticsearch_beats_adapter.ts @@ -8,17 +8,15 @@ import { flatten, get as _get, omit } from 'lodash'; import { INDEX_NAMES } from '../../../../common/constants'; import { CMBeat } from '../../../../common/domain_types'; import { DatabaseAdapter } from '../database/adapter_types'; -import { BackendFrameworkAdapter } from '../framework/adapter_types'; + import { FrameworkUser } from '../framework/adapter_types'; import { BeatsTagAssignment, CMBeatsAdapter } from './adapter_types'; export class ElasticsearchBeatsAdapter implements CMBeatsAdapter { private database: DatabaseAdapter; - private framework: BackendFrameworkAdapter; - constructor(database: DatabaseAdapter, framework: BackendFrameworkAdapter) { + constructor(database: DatabaseAdapter) { this.database = database; - this.framework = framework; } public async get(user: FrameworkUser, id: string) { @@ -37,13 +35,13 @@ export class ElasticsearchBeatsAdapter implements CMBeatsAdapter { return _get(response, '_source.beat'); } - public async insert(beat: CMBeat) { + public async insert(user: FrameworkUser, beat: CMBeat) { const body = { beat, type: 'beat', }; - await this.database.create(this.framework.internalUser, { + await this.database.index(user, { body, id: `beat:${beat.id}`, index: INDEX_NAMES.BEATS, @@ -52,7 +50,7 @@ export class ElasticsearchBeatsAdapter implements CMBeatsAdapter { }); } - public async update(beat: CMBeat) { + public async update(user: FrameworkUser, beat: CMBeat) { const body = { beat, type: 'beat', @@ -65,7 +63,7 @@ export class ElasticsearchBeatsAdapter implements CMBeatsAdapter { refresh: 'wait_for', type: '_doc', }; - await this.database.index(this.framework.internalUser, params); + await this.database.index(user, params); } public async getWithIds(user: FrameworkUser, beatIds: string[]) { @@ -115,11 +113,12 @@ export class ElasticsearchBeatsAdapter implements CMBeatsAdapter { const params = { index: INDEX_NAMES.BEATS, q: 'type:beat', + size: 10000, type: '_doc', }; const response = await this.database.search(user, params); - const beats = _get(response, 'hits.hits', []); + return beats.map((beat: any) => omit(beat._source.beat, ['access_token'])); } @@ -129,16 +128,15 @@ export class ElasticsearchBeatsAdapter implements CMBeatsAdapter { ): Promise { const body = flatten( removals.map(({ beatId, tag }) => { - const script = - '' + - 'def beat = ctx._source.beat; ' + - 'if (beat.tags != null) { ' + - ' beat.tags.removeAll([params.tag]); ' + - '}'; + const script = ` + def beat = ctx._source.beat; + if (beat.tags != null) { + beat.tags.removeAll([params.tag]); + }`; return [ { update: { _id: `beat:${beatId}` } }, - { script: { source: script, params: { tag } } }, + { script: { source: script.replace(' ', ''), params: { tag } } }, ]; }) ); @@ -162,19 +160,18 @@ export class ElasticsearchBeatsAdapter implements CMBeatsAdapter { ): Promise { const body = flatten( assignments.map(({ beatId, tag }) => { - const script = - '' + - 'def beat = ctx._source.beat; ' + - 'if (beat.tags == null) { ' + - ' beat.tags = []; ' + - '} ' + - 'if (!beat.tags.contains(params.tag)) { ' + - ' beat.tags.add(params.tag); ' + - '}'; + const script = ` + def beat = ctx._source.beat; + if (beat.tags == null) { + beat.tags = []; + } + if (!beat.tags.contains(params.tag)) { + beat.tags.add(params.tag); + }`; return [ { update: { _id: `beat:${beatId}` } }, - { script: { source: script, params: { tag } } }, + { script: { source: script.replace(' ', ''), params: { tag } } }, ]; }) ); diff --git a/x-pack/plugins/beats_management/server/lib/adapters/beats/memory_beats_adapter.ts b/x-pack/plugins/beats_management/server/lib/adapters/beats/memory_beats_adapter.ts index 350d88ab6cada..3ab38a0716455 100644 --- a/x-pack/plugins/beats_management/server/lib/adapters/beats/memory_beats_adapter.ts +++ b/x-pack/plugins/beats_management/server/lib/adapters/beats/memory_beats_adapter.ts @@ -21,11 +21,11 @@ export class MemoryBeatsAdapter implements CMBeatsAdapter { return this.beatsDB.find(beat => beat.id === id) || null; } - public async insert(beat: CMBeat) { + public async insert(user: FrameworkUser, beat: CMBeat) { this.beatsDB.push(beat); } - public async update(beat: CMBeat) { + public async update(user: FrameworkUser, beat: CMBeat) { const beatIndex = this.beatsDB.findIndex(b => b.id === beat.id); this.beatsDB[beatIndex] = { diff --git a/x-pack/plugins/beats_management/server/lib/compose/kibana.ts b/x-pack/plugins/beats_management/server/lib/compose/kibana.ts index 685171669a887..bc00278251610 100644 --- a/x-pack/plugins/beats_management/server/lib/compose/kibana.ts +++ b/x-pack/plugins/beats_management/server/lib/compose/kibana.ts @@ -25,9 +25,10 @@ export function compose(server: any): CMServerLibs { const tokens = new CMTokensDomain(new ElasticsearchTokensAdapter(database, framework), { framework, }); - const beats = new CMBeatsDomain(new ElasticsearchBeatsAdapter(database, framework), { + const beats = new CMBeatsDomain(new ElasticsearchBeatsAdapter(database), { tags, tokens, + framework, }); const domainLibs: CMDomainLibs = { diff --git a/x-pack/plugins/beats_management/server/lib/compose/testing.ts b/x-pack/plugins/beats_management/server/lib/compose/testing.ts index 25b6776b6908b..7928891443708 100644 --- a/x-pack/plugins/beats_management/server/lib/compose/testing.ts +++ b/x-pack/plugins/beats_management/server/lib/compose/testing.ts @@ -36,6 +36,7 @@ export function compose({ const beats = new CMBeatsDomain(new MemoryBeatsAdapter(beatsDB), { tags, tokens, + framework, }); const domainLibs: CMDomainLibs = { diff --git a/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/assign_tags.test.ts b/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/assign_tags.test.ts index 20f4a7d36e4f0..48b1f63335ec7 100644 --- a/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/assign_tags.test.ts +++ b/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/assign_tags.test.ts @@ -39,6 +39,8 @@ describe('Beats Domain Lib', () => { beatsDB = [ { access_token: '9a6c99ae0fd84b068819701169cd8a4b', + active: true, + enrollment_token: '23423423423', host_ip: '1.2.3.4', host_name: 'foo.bar.com', id: 'qux', @@ -46,6 +48,8 @@ describe('Beats Domain Lib', () => { }, { access_token: '188255eb560a4448b72656c5e99cae6f', + active: true, + enrollment_token: 'reertrte', host_ip: '22.33.11.44', host_name: 'baz.bar.com', id: 'baz', @@ -53,6 +57,8 @@ describe('Beats Domain Lib', () => { }, { access_token: '93c4a4dd08564c189a7ec4e4f046b975', + active: true, + enrollment_token: '23s423423423', host_ip: '1.2.3.4', host_name: 'foo.bar.com', id: 'foo', @@ -62,6 +68,8 @@ describe('Beats Domain Lib', () => { }, { access_token: '3c4a4dd08564c189a7ec4e4f046b9759', + enrollment_token: 'gdfsgdf', + active: true, host_ip: '11.22.33.44', host_name: 'foo.com', id: 'bar', @@ -72,14 +80,17 @@ describe('Beats Domain Lib', () => { { configuration_blocks: [], id: 'production', + last_updated: new Date(), }, { configuration_blocks: [], id: 'development', + last_updated: new Date(), }, { configuration_blocks: [], id: 'qa', + last_updated: new Date(), }, ]; const framework = new TestingBackendFrameworkAdapter(settings); @@ -93,6 +104,7 @@ describe('Beats Domain Lib', () => { beatsLib = new CMBeatsDomain(new MemoryBeatsAdapter(beatsDB), { tags: tagsLib, tokens: tokensLib, + framework, }); }); diff --git a/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/enroll.test.ts b/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/enroll.test.ts index c5bc0935dc6cc..5f8a0b683a5b5 100644 --- a/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/enroll.test.ts +++ b/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/enroll.test.ts @@ -81,6 +81,7 @@ describe('Beats Domain Lib', () => { beatsLib = new CMBeatsDomain(new MemoryBeatsAdapter(beatsDB), { tags: tagsLib, tokens: tokensLib, + framework, }); }); diff --git a/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/remove_tags.test.ts b/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/remove_tags.test.ts index f75334e917c2b..a35da72889111 100644 --- a/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/remove_tags.test.ts +++ b/x-pack/plugins/beats_management/server/lib/domains/__tests__/beats/remove_tags.test.ts @@ -5,9 +5,9 @@ */ import { BeatTag, CMBeat } from '../../../../../common/domain_types'; +import { FrameworkInternalUser } from '../../../adapters/framework/adapter_types'; import { compose } from '../../../compose/testing'; import { CMServerLibs } from '../../../lib'; -import { FrameworkInternalUser } from './../../../adapters/framework/adapter_types'; const internalUser: FrameworkInternalUser = { kind: 'internal' }; @@ -21,6 +21,8 @@ describe('Beats Domain Lib', () => { beatsDB = [ { access_token: '9a6c99ae0fd84b068819701169cd8a4b', + active: true, + enrollment_token: '123kuil;4', host_ip: '1.2.3.4', host_name: 'foo.bar.com', id: 'qux', @@ -28,6 +30,8 @@ describe('Beats Domain Lib', () => { }, { access_token: '188255eb560a4448b72656c5e99cae6f', + active: true, + enrollment_token: '12fghjyu34', host_ip: '22.33.11.44', host_name: 'baz.bar.com', id: 'baz', @@ -35,6 +39,8 @@ describe('Beats Domain Lib', () => { }, { access_token: '93c4a4dd08564c189a7ec4e4f046b975', + active: true, + enrollment_token: '12nfhgj34', host_ip: '1.2.3.4', host_name: 'foo.bar.com', id: 'foo', @@ -44,6 +50,9 @@ describe('Beats Domain Lib', () => { }, { access_token: '3c4a4dd08564c189a7ec4e4f046b9759', + active: true, + + enrollment_token: '123sfd4', host_ip: '11.22.33.44', host_name: 'foo.com', id: 'bar', @@ -54,14 +63,17 @@ describe('Beats Domain Lib', () => { { configuration_blocks: [], id: 'production', + last_updated: new Date(), }, { configuration_blocks: [], id: 'development', + last_updated: new Date(), }, { configuration_blocks: [], id: 'qa', + last_updated: new Date(), }, ]; diff --git a/x-pack/plugins/beats_management/server/lib/domains/beats.ts b/x-pack/plugins/beats_management/server/lib/domains/beats.ts index 2d81b0eb05950..199077d8570c3 100644 --- a/x-pack/plugins/beats_management/server/lib/domains/beats.ts +++ b/x-pack/plugins/beats_management/server/lib/domains/beats.ts @@ -14,7 +14,7 @@ import { FrameworkUser } from '../adapters/framework/adapter_types'; import { CMAssignmentReturn } from '../adapters/beats/adapter_types'; import { BeatsRemovalReturn } from '../adapters/beats/adapter_types'; -import { BeatEnrollmentStatus, CMDomainLibs, CMServerLibs } from '../lib'; +import { BeatEnrollmentStatus, CMDomainLibs, CMServerLibs, UserOrToken } from '../lib'; export class CMBeatsDomain { private tags: CMDomainLibs['tags']; @@ -35,32 +35,41 @@ export class CMBeatsDomain { this.framework = libs.framework; } - public async getById(user: FrameworkUser, beatId: string) { - return await this.adapter.get(user, beatId); + public async getById(user: FrameworkUser, beatId: string): Promise { + const beat = await this.adapter.get(user, beatId); + return beat && beat.active ? beat : null; + } + + public async getAll(user: FrameworkUser) { + return (await this.adapter.getAll(user)).filter((beat: CMBeat) => beat.active === true); } public async getByEnrollmentToken(user: FrameworkUser, enrollmentToken: string) { - return await this.adapter.getBeatWithToken(user, enrollmentToken); + const beat = await this.adapter.getBeatWithToken(user, enrollmentToken); + return beat && beat.active ? beat : null; } - public async update(beatId: string, accessToken: string, beatData: Partial) { + public async update(userOrToken: UserOrToken, beatId: string, beatData: Partial) { const beat = await this.adapter.get(this.framework.internalUser, beatId); - const { verified: isAccessTokenValid } = this.tokens.verifyToken( - beat ? beat.access_token : '', - accessToken - ); - // TODO make return type enum if (beat === null) { return 'beat-not-found'; } - if (!isAccessTokenValid) { - return 'invalid-access-token'; + if (typeof userOrToken === 'string') { + const { verified: isAccessTokenValid } = this.tokens.verifyToken( + beat ? beat.access_token : '', + userOrToken + ); + if (!isAccessTokenValid) { + return 'invalid-access-token'; + } } - await this.adapter.update({ + const user = typeof userOrToken === 'string' ? this.framework.internalUser : userOrToken; + + await this.adapter.update(user, { ...beat, ...beatData, }); @@ -85,8 +94,9 @@ export class CMBeatsDomain { const accessToken = this.tokens.generateAccessToken(); const verifiedOn = moment().toJSON(); - await this.adapter.insert({ + await this.adapter.insert(this.framework.internalUser, { ...beat, + active: true, enrollment_token: enrollmentToken, verified_on: verifiedOn, access_token: accessToken, @@ -141,10 +151,6 @@ export class CMBeatsDomain { return response; } - public async getAllBeats(user: FrameworkUser) { - return await this.adapter.getAll(user); - } - public async assignTagsToBeats( user: FrameworkUser, assignments: BeatsTagAssignment[] diff --git a/x-pack/plugins/beats_management/server/lib/domains/tags.ts b/x-pack/plugins/beats_management/server/lib/domains/tags.ts index 39bc2c147ea03..5f5e6747cc847 100644 --- a/x-pack/plugins/beats_management/server/lib/domains/tags.ts +++ b/x-pack/plugins/beats_management/server/lib/domains/tags.ts @@ -35,6 +35,7 @@ export class CMTagsDomain { const tag = { configuration_blocks: configs, id: tagId, + last_updated: new Date(), }; return { isValid: true, diff --git a/x-pack/plugins/beats_management/server/lib/lib.ts b/x-pack/plugins/beats_management/server/lib/lib.ts index 824c5722a4bd8..b8d51374741fe 100644 --- a/x-pack/plugins/beats_management/server/lib/lib.ts +++ b/x-pack/plugins/beats_management/server/lib/lib.ts @@ -5,11 +5,14 @@ */ import { DatabaseAdapter } from './adapters/database/adapter_types'; -import { BackendFrameworkAdapter } from './adapters/framework/adapter_types'; +import { BackendFrameworkAdapter, FrameworkUser } from './adapters/framework/adapter_types'; + import { CMBeatsDomain } from './domains/beats'; import { CMTagsDomain } from './domains/tags'; import { CMTokensDomain } from './domains/tokens'; +export type UserOrToken = FrameworkUser | string; + export interface CMDomainLibs { beats: CMBeatsDomain; tags: CMTagsDomain; diff --git a/x-pack/plugins/beats_management/server/rest_api/beats/list.ts b/x-pack/plugins/beats_management/server/rest_api/beats/list.ts index 72105fc2f5440..876f717dd8f4a 100644 --- a/x-pack/plugins/beats_management/server/rest_api/beats/list.ts +++ b/x-pack/plugins/beats_management/server/rest_api/beats/list.ts @@ -14,7 +14,8 @@ export const createListAgentsRoute = (libs: CMServerLibs) => ({ path: '/api/beats/agents', handler: async (request: FrameworkRequest, reply: any) => { try { - const beats = await libs.beats.getAllBeats(request.user); + const beats = await libs.beats.getAll(request.user); + reply({ beats }); } catch (err) { // TODO move this to kibana route thing in adapter diff --git a/x-pack/plugins/beats_management/server/rest_api/beats/update.ts b/x-pack/plugins/beats_management/server/rest_api/beats/update.ts index 9c8e7daf475f8..26a22fe1d11f9 100644 --- a/x-pack/plugins/beats_management/server/rest_api/beats/update.ts +++ b/x-pack/plugins/beats_management/server/rest_api/beats/update.ts @@ -15,7 +15,9 @@ export const createBeatUpdateRoute = (libs: CMServerLibs) => ({ method: 'PUT', path: '/api/beats/agent/{beatId}', config: { - auth: false, + auth: { + mode: 'optional', + }, validate: { headers: Joi.object({ 'kbn-beats-access-token': Joi.string(), @@ -26,34 +28,43 @@ export const createBeatUpdateRoute = (libs: CMServerLibs) => ({ beatId: Joi.string(), }), payload: Joi.object({ + active: Joi.bool(), ephemeral_id: Joi.string(), host_name: Joi.string(), local_configuration_yml: Joi.string(), metadata: Joi.object(), type: Joi.string(), version: Joi.string(), - }).required(), + }), }, }, handler: async (request: FrameworkRequest, reply: any) => { const { beatId } = request.params; const accessToken = request.headers['kbn-beats-access-token']; const remoteAddress = request.info.remoteAddress; + const userOrToken = accessToken || request.user; + + if (request.user.kind === 'unauthenticated' && request.payload.active !== undefined) { + return reply({ message: 'access-token is not a valid auth type to change beat status' }).code( + 401 + ); + } try { - const status = await libs.beats.update(beatId, accessToken, { + const status = await libs.beats.update(userOrToken, beatId, { ...request.payload, host_ip: remoteAddress, }); switch (status) { case 'beat-not-found': - return reply({ message: 'Beat not found' }).code(404); + return reply({ message: 'Beat not found', success: false }).code(404); case 'invalid-access-token': - return reply({ message: 'Invalid access token' }).code(401); + return reply({ message: 'Invalid access token', success: false }).code(401); } - reply().code(204); + reply({ success: true }).code(204); + } catch (err) { return reply(wrapEsError(err)); } diff --git a/x-pack/plugins/beats_management/server/utils/index_templates/beats_template.json b/x-pack/plugins/beats_management/server/utils/index_templates/beats_template.json index c77d8f9719680..0442c31fd7c2d 100644 --- a/x-pack/plugins/beats_management/server/utils/index_templates/beats_template.json +++ b/x-pack/plugins/beats_management/server/utils/index_templates/beats_template.json @@ -51,6 +51,9 @@ "id": { "type": "keyword" }, + "active": { + "type": "boolean" + }, "enrollment_token": { "type": "keyword" }, diff --git a/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js b/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js index 0b0524acd58bf..3a6a61474f8dd 100644 --- a/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js +++ b/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js @@ -20,8 +20,8 @@ export function jobAuditMessagesProvider(callWithRequest) { let gte = null; if (jobId !== undefined && from === undefined) { const jobs = await callWithRequest('ml.jobs', { jobId }); - if (jobs.length) { - gte = moment(jobs[0].create_time).valueOf(); + if (jobs.count > 0 && jobs.jobs !== undefined) { + gte = moment(jobs.jobs[0].create_time).valueOf(); } } else if (from !== undefined) { gte = `now-${from}`; diff --git a/x-pack/yarn.lock b/x-pack/yarn.lock index 7d1dc68653e81..fdf775dddc6ab 100644 --- a/x-pack/yarn.lock +++ b/x-pack/yarn.lock @@ -123,10 +123,18 @@ version "4.3.10" resolved "https://registry.yarnpkg.com/@types/boom/-/boom-4.3.10.tgz#39dad8c0614c26b91ef016a57d7eee4ffe4f8a25" +"@types/chance@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.0.1.tgz#c10703020369602c40dd9428cc6e1437027116df" + "@types/delay@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/delay/-/delay-2.0.1.tgz#61bcf318a74b61e79d1658fbf054f984c90ef901" +"@types/elasticsearch@^5.0.24": + version "5.0.25" + resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.25.tgz#717255a52acd9fa3ba165072d43a242283b1c898" + "@types/events@*": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" @@ -161,6 +169,12 @@ version "10.6.2" resolved "https://registry.yarnpkg.com/@types/joi/-/joi-10.6.2.tgz#0e7d632fe918c337784e87b16c7cc0098876179a" +"@types/jsonwebtoken@^7.2.7": + version "7.2.8" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-7.2.8.tgz#8d199dab4ddb5bba3234f8311b804d2027af2b3a" + dependencies: + "@types/node" "*" + "@types/lodash@^3.10.0": version "3.10.2" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-3.10.2.tgz#c1fbda1562ef5603c8192fe1fe65b017849d5873" @@ -222,6 +236,10 @@ version "0.10.2" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.10.2.tgz#bd1740c4ad51966609b058803ee6874577848b37" +"@types/sinon@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-5.0.1.tgz#a15b36ec42f1f53166617491feabd1734cb03e21" + "@types/url-join@^0.8.2": version "0.8.2" resolved "https://registry.yarnpkg.com/@types/url-join/-/url-join-0.8.2.tgz#1181ecbe1d97b7034e0ea1e35e62e86cc26b422d" @@ -1230,6 +1248,10 @@ buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" @@ -2174,6 +2196,12 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +ecdsa-sig-formatter@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" + dependencies: + safe-buffer "^5.0.1" + elasticsearch@^14.1.0: version "14.2.2" resolved "https://registry.yarnpkg.com/elasticsearch/-/elasticsearch-14.2.2.tgz#6bbb63b19b17fa97211b22eeacb0f91197f4d6b6" @@ -4502,6 +4530,20 @@ jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" +jsonwebtoken@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz#056c90eee9a65ed6e6c72ddb0a1d325109aaf643" + dependencies: + jws "^3.1.5" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -4519,6 +4561,21 @@ just-extend@^1.1.27: version "1.1.27" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" +jwa@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.10" + safe-buffer "^5.0.1" + +jws@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" + dependencies: + jwa "^1.1.5" + safe-buffer "^5.0.1" + keymirror@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/keymirror/-/keymirror-0.1.1.tgz#918889ea13f8d0a42e7c557250eee713adc95c35" @@ -4770,6 +4827,10 @@ lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -4778,6 +4839,10 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + lodash.isempty@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" @@ -4786,10 +4851,26 @@ lodash.isequal@^4.1.1, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + lodash.isobject@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + lodash.istypedarray@^3.0.0: version "3.0.6" resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" @@ -4810,6 +4891,10 @@ lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + lodash.orderby@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.orderby/-/lodash.orderby-4.6.0.tgz#e697f04ce5d78522f54d9338b32b81a3393e4eb3" @@ -5227,7 +5312,7 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -ms@^2.0.0: +ms@^2.0.0, ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" diff --git a/yarn.lock b/yarn.lock index 92bd3108bf025..5fa60901215e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -304,6 +304,10 @@ version "2.0.1" resolved "https://registry.yarnpkg.com/@types/delay/-/delay-2.0.1.tgz#61bcf318a74b61e79d1658fbf054f984c90ef901" +"@types/elasticsearch@^5.0.24": + version "5.0.25" + resolved "https://registry.yarnpkg.com/@types/elasticsearch/-/elasticsearch-5.0.25.tgz#717255a52acd9fa3ba165072d43a242283b1c898" + "@types/enzyme@^3.1.12": version "3.1.12" resolved "https://registry.yarnpkg.com/@types/enzyme/-/enzyme-3.1.12.tgz#293bb07c1ef5932d37add3879e72e0f5bc614f3c" @@ -417,6 +421,12 @@ version "1.0.32" resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.32.tgz#121f6917c4389db3923640b2e68de5fa64dda88e" +"@types/jsonwebtoken@^7.2.7": + version "7.2.8" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-7.2.8.tgz#8d199dab4ddb5bba3234f8311b804d2027af2b3a" + dependencies: + "@types/node" "*" + "@types/listr@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@types/listr/-/listr-0.13.0.tgz#6250bc4a04123cafa24fc73d1b880653a6ae6721" @@ -2282,6 +2292,10 @@ buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" @@ -4210,6 +4224,12 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +ecdsa-sig-formatter@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" + dependencies: + safe-buffer "^5.0.1" + editions@^1.1.1, editions@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" @@ -7833,6 +7853,20 @@ jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" +jsonwebtoken@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.3.0.tgz#056c90eee9a65ed6e6c72ddb0a1d325109aaf643" + dependencies: + jws "^3.1.5" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -7881,6 +7915,21 @@ just-extend@^1.1.27: version "1.1.27" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" +jwa@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.10" + safe-buffer "^5.0.1" + +jws@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" + dependencies: + jwa "^1.1.5" + safe-buffer "^5.0.1" + karma-chrome-launcher@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz#216879c68ac04d8d5140e99619ba04b59afd46cf" @@ -8417,6 +8466,10 @@ lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -8425,6 +8478,10 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + lodash.isempty@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" @@ -8433,10 +8490,26 @@ lodash.isequal@^4.0.0, lodash.isequal@^4.1.1, lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + lodash.isobject@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + lodash.istypedarray@^3.0.0: version "3.0.6" resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" @@ -8473,6 +8546,10 @@ lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + lodash.orderby@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.orderby/-/lodash.orderby-4.6.0.tgz#e697f04ce5d78522f54d9338b32b81a3393e4eb3" @@ -9040,7 +9117,7 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -ms@^2.0.0: +ms@^2.0.0, ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"