mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Plugin signing: UI information (#28469)
* first pass * return list * types and cleanup * add to plugin page and add styles * update comment * update comment * fix component path * simplify error component * simplify error struct * fix tests * don't export and fix string() * update naming * remove frontend * introduce phantom loader * track single error * remove error from base * remove unused struct * remove unnecessary filter * add errors endpoint * Update set log to use id field Co-authored-by: Arve Knudsen <arve.knudsen@gmail.com> * skip adding BE plugins * remove errs from plugin + ds list * remove unnecessary fields * add signature state to panels * Fetch plugins errors * grafana/ui component tweaks * DS Picker - add unsigned badge * VizPicker - add unsigned badge * PluginSignatureBadge tweaks * Plugins list - add signatures info box * New datasource page - add signatures info box * Plugin page - add signatures info box * Fix test * Do not show Core label in viz picker * Update public/app/features/plugins/PluginsErrorsInfo.tsx Co-authored-by: Torkel Ödegaard <torkel@grafana.org> * Update public/app/features/plugins/PluginListPage.test.tsx Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * Update public/app/features/plugins/PluginListPage.tsx Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * Update public/app/features/datasources/NewDataSourcePage.tsx Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com> * Review comments 1 * Review comments 2 * Update public/app/features/plugins/PluginsErrorsInfo.tsx * Update public/app/features/plugins/PluginPage.tsx * Prettier fix * remove stale backend code * Docs issues fix Co-authored-by: Will Browne <will.browne@grafana.com> Co-authored-by: Will Browne <wbrowne@users.noreply.github.com> Co-authored-by: Arve Knudsen <arve.knudsen@gmail.com> Co-authored-by: Torkel Ödegaard <torkel@grafana.org> Co-authored-by: Alex Khomenko <Clarity-89@users.noreply.github.com>
This commit is contained in:
@@ -14,11 +14,12 @@ import {
|
||||
PluginIncludeType,
|
||||
PluginMeta,
|
||||
PluginMetaInfo,
|
||||
PluginSignatureStatus,
|
||||
PluginType,
|
||||
UrlQueryMap,
|
||||
} from '@grafana/data';
|
||||
import { AppNotificationSeverity, CoreEvents, StoreState } from 'app/types';
|
||||
import { Alert, Tooltip } from '@grafana/ui';
|
||||
import { Alert, InfoBox, Tooltip } from '@grafana/ui';
|
||||
|
||||
import Page from 'app/core/components/Page/Page';
|
||||
import { getPluginSettings } from './PluginSettingsCache';
|
||||
@@ -30,6 +31,9 @@ import { PluginDashboards } from './PluginDashboards';
|
||||
import { appEvents } from 'app/core/core';
|
||||
import { config } from 'app/core/config';
|
||||
import { ContextSrv } from '../../core/services/context_srv';
|
||||
import { css } from 'emotion';
|
||||
import { PluginSignatureBadge } from './PluginSignatureBadge';
|
||||
import { selectors } from '@grafana/e2e-selectors';
|
||||
|
||||
export function getLoadingNav(): NavModel {
|
||||
const node = {
|
||||
@@ -102,6 +106,7 @@ class PluginPage extends PureComponent<Props, State> {
|
||||
const { appSubUrl } = config;
|
||||
|
||||
const plugin = await loadPlugin(pluginId);
|
||||
|
||||
if (!plugin) {
|
||||
this.setState({
|
||||
loading: false,
|
||||
@@ -293,13 +298,48 @@ class PluginPage extends PureComponent<Props, State> {
|
||||
);
|
||||
}
|
||||
|
||||
renderPluginNotice() {
|
||||
const { plugin } = this.state;
|
||||
|
||||
if (!plugin) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (plugin.meta.signature === PluginSignatureStatus.internal) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<InfoBox
|
||||
aria-label={selectors.pages.PluginPage.signatureInfo}
|
||||
severity={plugin.meta.signature !== PluginSignatureStatus.valid ? 'warning' : 'info'}
|
||||
urlTitle="Read more about plugins signing"
|
||||
url="https://grafana.com/docs/grafana/latest/plugins/plugin-signature-verification/"
|
||||
>
|
||||
<p>
|
||||
<PluginSignatureBadge
|
||||
status={plugin.meta.signature}
|
||||
className={css`
|
||||
margin-top: 0;
|
||||
`}
|
||||
/>
|
||||
</p>
|
||||
<p>
|
||||
Grafana Labs checks each plugin to verify that it has a valid digital signature. Plugin signature verification
|
||||
is part of our security measure to ensure plugins are safe and trustworthy. Grafana Labs can’t guarantee the
|
||||
integrity of this unsigned plugin. Ask the plugin author to request it to be signed.
|
||||
</p>
|
||||
</InfoBox>
|
||||
);
|
||||
}
|
||||
|
||||
render() {
|
||||
const { loading, nav, plugin } = this.state;
|
||||
const { $contextSrv } = this.props;
|
||||
const isAdmin = $contextSrv.hasRole('Admin');
|
||||
|
||||
return (
|
||||
<Page navModel={nav}>
|
||||
<Page navModel={nav} aria-label={selectors.pages.PluginPage.page}>
|
||||
<Page.Contents isLoading={loading}>
|
||||
{plugin && (
|
||||
<div className="sidebar-container">
|
||||
@@ -316,6 +356,7 @@ class PluginPage extends PureComponent<Props, State> {
|
||||
}
|
||||
/>
|
||||
)}
|
||||
{this.renderPluginNotice()}
|
||||
{this.renderBody()}
|
||||
</div>
|
||||
<aside className="page-sidebar">
|
||||
|
||||
Reference in New Issue
Block a user