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"