import React from 'react'; import { selectors } from '@grafana/e2e-selectors'; import { HorizontalGroup, InfoBox, List, PluginSignatureBadge, useTheme } from '@grafana/ui'; import { StoreState } from '../../types'; import { getAllPluginsErrors } from './state/selectors'; import { loadPlugins, loadPluginsErrors } from './state/actions'; import useAsync from 'react-use/lib/useAsync'; import { connect, MapDispatchToProps, MapStateToProps } from 'react-redux'; import { hot } from 'react-hot-loader'; import { PluginError, PluginErrorCode, PluginSignatureStatus } from '@grafana/data'; import { css } from 'emotion'; interface ConnectedProps { errors: PluginError[]; } interface DispatchProps { loadPluginsErrors: typeof loadPluginsErrors; } interface OwnProps { children?: React.ReactNode; } type PluginsErrorsInfoProps = ConnectedProps & DispatchProps & OwnProps; export const PluginsErrorsInfoUnconnected: React.FC = ({ loadPluginsErrors, errors, children, }) => { const theme = useTheme(); const { loading } = useAsync(async () => { await loadPluginsErrors(); }, [loadPlugins]); if (loading || errors.length === 0) { return null; } return (

We have encountered{' '} data source backend plugins {' '} that are unsigned. Grafana Labs cannot guarantee the integrity of unsigned plugins and recommends using signed plugins only.

The following plugins are disabled and not shown in the list below: (
{e.pluginId}
)} /> {children}
); }; const mapStateToProps: MapStateToProps = (state: StoreState) => { return { errors: getAllPluginsErrors(state.plugins), }; }; const mapDispatchToProps: MapDispatchToProps = { loadPluginsErrors, }; export const PluginsErrorsInfo = hot(module)( connect(mapStateToProps, mapDispatchToProps)(PluginsErrorsInfoUnconnected) ); function mapPluginErrorCodeToSignatureStatus(code: PluginErrorCode) { switch (code) { case PluginErrorCode.invalidSignature: return PluginSignatureStatus.invalid; case PluginErrorCode.missingSignature: return PluginSignatureStatus.missing; case PluginErrorCode.modifiedSignature: return PluginSignatureStatus.modified; default: return PluginSignatureStatus.missing; } }