Skip to content

Commit

Permalink
[Logs Explorer] Fix Privileges Accessibility (elastic#193894)
Browse files Browse the repository at this point in the history
closes elastic#192062

## 📝  Summary

This PR adds privileges checks for `Logs Explorerer` it checks for
`Discover & Fleet` privileges before allowing the user access to `Logs
Explorer`.
Clicking on the `Logs` tab from the side nav defaults to `Stream`, as
long as its not depricated, in case the user doesn't have access to
`Logs Explorer`

## 🎥 Demo

https://github.com/user-attachments/assets/a4105ec0-7681-40ee-b2fd-e39b9c178dcf
(cherry picked from commit dbfd4f0)
  • Loading branch information
mohamedhamed-ahmed committed Oct 1, 2024
1 parent 077537c commit 2d5b4de
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const LogsApp: React.FC<{
storage: Storage;
theme$: AppMountParameters['theme$'];
}> = ({ core, history, pluginStart, plugins, setHeaderActionMenu, storage, theme$ }) => {
const uiCapabilities = core.application.capabilities;
const { logs, discover, fleet } = core.application.capabilities;

return (
<CoreProviders core={core} pluginStart={pluginStart} plugins={plugins} theme$={theme$}>
Expand All @@ -74,19 +74,21 @@ const LogsApp: React.FC<{
toastsService={core.notifications.toasts}
>
<Routes>
<Route
path="/"
exact
render={() => {
plugins.share.url.locators
.get<AllDatasetsLocatorParams>(ALL_DATASETS_LOCATOR_ID)
?.navigate({});
{Boolean(discover?.show && fleet?.read) && (
<Route
path="/"
exact
render={() => {
plugins.share.url.locators
.get<AllDatasetsLocatorParams>(ALL_DATASETS_LOCATOR_ID)
?.navigate({});

return null;
}}
/>
return null;
}}
/>
)}
<Route path="/link-to" component={LinkToLogsPage} />
{uiCapabilities?.logs?.show && <Route path="/" component={LogsPage} />}
{logs?.show && <Route path="/" component={LogsPage} />}
</Routes>
</KbnUrlStateStorageFromRouterProvider>
</Router>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ export const LogsPageContent: React.FunctionComponent = () => {
)}
<RedirectWithQueryParams from={'/analysis'} to={anomaliesTab.pathname} exact />
<RedirectWithQueryParams from={'/log-rate'} to={anomaliesTab.pathname} exact />
<RedirectWithQueryParams from={'/'} to={streamTab.pathname} exact />
<Route
render={() => (
<NotFoundPage
Expand Down
21 changes: 13 additions & 8 deletions x-pack/plugins/observability_solution/infra/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,19 +137,24 @@ export class Plugin implements InfraClientPluginClass {
],
isInfrastructureHostsViewEnabled,
]) => {
const { infrastructure, logs, discover, fleet } = capabilities;
return [
...(capabilities.logs.show
...(logs.show
? [
{
label: 'Logs',
sortKey: 200,
entries: [
{
label: 'Explorer',
app: 'observability-logs-explorer',
path: '/',
isBetaFeature: true,
},
...(discover?.show && fleet?.read
? [
{
label: 'Explorer',
app: 'observability-logs-explorer',
path: '/',
isBetaFeature: true,
},
]
: []),
...(this.config.featureFlags.logsUIEnabled
? [
{ label: 'Stream', app: 'logs', path: '/stream' },
Expand All @@ -161,7 +166,7 @@ export class Plugin implements InfraClientPluginClass {
},
]
: []),
...(capabilities.infrastructure.show
...(infrastructure.show
? [
{
label: metricsTitle,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@

import {
AppMountParameters,
AppStatus,
AppUpdater,
CoreSetup,
CoreStart,
DEFAULT_APP_CATEGORIES,
Plugin,
PluginInitializerContext,
} from '@kbn/core/public';
import { OBSERVABILITY_LOGS_EXPLORER_APP_ID } from '@kbn/deeplinks-observability';
import { BehaviorSubject } from 'rxjs';
import {
AllDatasetsLocatorDefinition,
ObservabilityLogsExplorerLocators,
Expand All @@ -35,6 +38,7 @@ export class ObservabilityLogsExplorerPlugin
{
private config: ObservabilityLogsExplorerConfig;
private locators?: ObservabilityLogsExplorerLocators;
private appStateUpdater = new BehaviorSubject<AppUpdater>(() => ({}));

constructor(context: PluginInitializerContext<ObservabilityLogsExplorerConfig>) {
this.config = context.config.get();
Expand All @@ -56,6 +60,7 @@ export class ObservabilityLogsExplorerPlugin
? ['globalSearch', 'sideNav']
: ['globalSearch'],
keywords: ['logs', 'log', 'explorer', 'logs explorer'],
updater$: this.appStateUpdater,
mount: async (appMountParams: ObservabilityLogsExplorerAppMountParameters) => {
const [coreStart, pluginsStart, ownPluginStart] = await core.getStartServices();
const { renderObservabilityLogsExplorer } = await import(
Expand Down Expand Up @@ -123,7 +128,16 @@ export class ObservabilityLogsExplorerPlugin
};
}

public start(_core: CoreStart, _pluginsStart: ObservabilityLogsExplorerStartDeps) {
public start(core: CoreStart, _pluginsStart: ObservabilityLogsExplorerStartDeps) {
const { discover, fleet, logs } = core.application.capabilities;

if (!(discover?.show && fleet?.read && logs?.show)) {
this.appStateUpdater.next(() => ({
status: AppStatus.inaccessible,
visibleIn: [],
}));
}

return {};
}
}

0 comments on commit 2d5b4de

Please sign in to comment.