Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 0 additions & 15 deletions x-pack/legacy/plugins/security/index.d.ts

This file was deleted.

156 changes: 0 additions & 156 deletions x-pack/legacy/plugins/security/index.js

This file was deleted.

93 changes: 93 additions & 0 deletions x-pack/legacy/plugins/security/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import { Root } from 'joi';
import { resolve } from 'path';
import { Server } from 'src/legacy/server/kbn_server';
import { KibanaRequest, LegacyRequest } from '../../../../src/core/server';
// @ts-ignore
import { AuditLogger } from '../../server/lib/audit_logger';
// @ts-ignore
import { watchStatusAndLicenseToInitialize } from '../../server/lib/watch_status_and_license_to_initialize';
import { AuthenticatedUser, SecurityPluginSetup } from '../../../plugins/security/server';

/**
* Public interface of the security plugin.
*/
export interface SecurityPlugin {
getUser: (request: LegacyRequest) => Promise<AuthenticatedUser>;
}

function getSecurityPluginSetup(server: Server) {
const securityPlugin = server.newPlatform.setup.plugins.security as SecurityPluginSetup;
if (!securityPlugin) {
throw new Error('Kibana Platform Security plugin is not available.');
}

return securityPlugin;
}

export const security = (kibana: Record<string, any>) =>
new kibana.Plugin({
id: 'security',
configPrefix: 'xpack.security',
publicDir: resolve(__dirname, 'public'),
require: ['kibana', 'elasticsearch', 'xpack_main'],

// This config is only used by `AuditLogger` and should be removed as soon as `AuditLogger`
// is migrated to Kibana Platform.
config(Joi: Root) {
return Joi.object({
enabled: Joi.boolean().default(true),
audit: Joi.object({ enabled: Joi.boolean().default(false) }).default(),
})
.unknown()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this obviate all of the HANDLED_IN_NEW_PLATFORM values that we had before?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep!

.default();
},

uiExports: {
hacks: ['plugins/security/hacks/legacy'],
injectDefaultVars: (server: Server) => {
return {
secureCookies: getSecurityPluginSetup(server).__legacyCompat.config.secureCookies,
enableSpaceAwarePrivileges: server.config().get('xpack.spaces.enabled'),
};
},
},

async postInit(server: Server) {
watchStatusAndLicenseToInitialize(server.plugins.xpack_main, this, async () => {
const xpackInfo = server.plugins.xpack_main.info;
if (xpackInfo.isAvailable() && xpackInfo.feature('security').isEnabled()) {
await getSecurityPluginSetup(server).__legacyCompat.registerPrivilegesWithCluster();
}
});
},

async init(server: Server) {
const securityPlugin = getSecurityPluginSetup(server);

const xpackInfo = server.plugins.xpack_main.info;
securityPlugin.__legacyCompat.registerLegacyAPI({
auditLogger: new AuditLogger(server, 'security', server.config(), xpackInfo),
});

// Legacy xPack Info endpoint returns whatever we return in a callback for `registerLicenseCheckResultsGenerator`
// and the result is consumed by the legacy plugins all over the place, so we should keep it here for now. We assume
// that when legacy callback is called license has been already propagated to the new platform security plugin and
// features are up to date.
xpackInfo
.feature(this.id)
.registerLicenseCheckResultsGenerator(() =>
securityPlugin.__legacyCompat.license.getFeatures()
);

server.expose({
getUser: async (request: LegacyRequest) =>
securityPlugin.authc.getCurrentUser(KibanaRequest.from(request)),
});
},
});
65 changes: 65 additions & 0 deletions x-pack/legacy/plugins/security/public/hacks/legacy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*

This comment was marked as resolved.

* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

// @ts-ignore
import { uiModules } from 'ui/modules';
import { npSetup, npStart } from 'ui/new_platform';
import routes from 'ui/routes';
import { isSystemApiRequest } from '../../../../../../src/plugins/kibana_legacy/public';
import { SecurityPluginSetup } from '../../../../../plugins/security/public';

const securityPluginSetup = (npSetup.plugins as any).security as SecurityPluginSetup;
if (securityPluginSetup) {
routes.when('/account', {

This comment was marked as resolved.

This comment was marked as resolved.

This comment was marked as resolved.

template: '<div />',
controller: () => npStart.core.application.navigateToApp('security'),
});

const getNextParameter = () => {
const { location } = window;
const next = encodeURIComponent(`${location.pathname}${location.search}${location.hash}`);
return `&next=${next}`;
};

const getProviderParameter = (tenant: string) => {
const key = `${tenant}/session_provider`;
const providerName = sessionStorage.getItem(key);
return providerName ? `&provider=${encodeURIComponent(providerName)}` : '';
};

const module = uiModules.get('security', []);
module.config(($httpProvider: ng.IHttpProvider) => {
$httpProvider.interceptors.push(($q, $window, Promise) => {
const isAnonymous = npSetup.core.http.anonymousPaths.isAnonymous(window.location.pathname);

function interceptorFactory(responseHandler: (response: ng.IHttpResponse<unknown>) => any) {
return function interceptor(response: ng.IHttpResponse<unknown>) {
// TODO: SHOULD WE CHECK THAT IT'S NOT ERROR RESPONSE (&& response.status !== 401)?

This comment was marked as resolved.

This comment was marked as resolved.

This comment was marked as resolved.

if (!isAnonymous && !isSystemApiRequest(response.config)) {
securityPluginSetup.sessionTimeout.extend(response.config.url);
}

if (response.status !== 401 || isAnonymous) {

This comment was marked as resolved.

return responseHandler(response);
}

const { logoutUrl, tenant } = securityPluginSetup.__legacyCompat;
const next = getNextParameter();
const provider = getProviderParameter(tenant);

$window.location.href = `${logoutUrl}?msg=SESSION_EXPIRED${next}${provider}`;

return Promise.halt();
};
}

return {
response: interceptorFactory(response => response),
responseError: interceptorFactory($q.reject),
};
});
});
}
31 changes: 0 additions & 31 deletions x-pack/legacy/plugins/security/public/hacks/on_session_timeout.js

This file was deleted.

Loading