diff options
author | Jeremy Davis <jeremy.davis@sonarsource.com> | 2020-02-24 11:02:37 +0100 |
---|---|---|
committer | SonarTech <sonartech@sonarsource.com> | 2020-02-26 10:41:19 +0100 |
commit | 1c870c915125912fec3569cf283b58a2a35281a5 (patch) | |
tree | d5e1d1301163a33c336a72e04575b7f8c735f6eb /server | |
parent | d57aeee822d83a3b5fe22229e9865af52ae71ea3 (diff) | |
download | sonarqube-1c870c915125912fec3569cf283b58a2a35281a5.tar.gz sonarqube-1c870c915125912fec3569cf283b58a2a35281a5.zip |
SONAR-13117 Handle 403 gracefully
Diffstat (limited to 'server')
4 files changed, 40 insertions, 5 deletions
diff --git a/server/sonar-web/src/main/js/api/issues.ts b/server/sonar-web/src/main/js/api/issues.ts index a6b8b87c70c..d0756260502 100644 --- a/server/sonar-web/src/main/js/api/issues.ts +++ b/server/sonar-web/src/main/js/api/issues.ts @@ -179,5 +179,5 @@ export function getIssueFlowSnippets(issueKey: string): Promise<T.Dict<T.Snippet } }); return result; - }, throwGlobalError); + }); } diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx index 6ad0277f98f..0fd57eb1956 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx @@ -18,9 +18,12 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import * as React from 'react'; +import { Alert } from 'sonar-ui-common/components/ui/Alert'; import DeferredSpinner from 'sonar-ui-common/components/ui/DeferredSpinner'; +import { translate } from 'sonar-ui-common/helpers/l10n'; import { getDuplications } from '../../../api/components'; import { getIssueFlowSnippets } from '../../../api/issues'; +import throwGlobalError from '../../../app/utils/throwGlobalError'; import DuplicationPopup from '../../../components/SourceViewer/components/DuplicationPopup'; import { filterDuplicationBlocksByLine, @@ -59,6 +62,7 @@ interface State { issuePopup?: { issue: string; name: string }; linePopup?: T.LinePopup & { component: string }; loading: boolean; + notAccessible: boolean; } export default class CrossComponentSourceViewerWrapper extends React.PureComponent<Props, State> { @@ -66,7 +70,8 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone state: State = { components: {}, duplicationsByLine: {}, - loading: true + loading: true, + notAccessible: false }; componentDidMount() { @@ -122,9 +127,12 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone } } }, - () => { + (response: Response) => { + if (response.status !== 403) { + throwGlobalError(response); + } if (this.mounted) { - this.setState({ loading: false }); + this.setState({ loading: false, notAccessible: response.status === 403 }); } } ); @@ -197,7 +205,7 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone }; render() { - const { loading } = this.state; + const { loading, notAccessible } = this.state; if (loading) { return ( @@ -207,6 +215,14 @@ export default class CrossComponentSourceViewerWrapper extends React.PureCompone ); } + if (notAccessible) { + return ( + <Alert className="spacer-top" variant="warning"> + {translate('code_viewer.no_source_code_displayed_due_to_security')} + </Alert> + ); + } + const { components, duplications, duplicationsByLine, linePopup } = this.state; const issuesByComponent = issuesByComponentAndLine(this.props.issues); const locationsByComponent = groupLocationsByComponent(this.props.locations, components); diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx index 2dcfa8f3ee9..318e6646d6b 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx @@ -66,6 +66,16 @@ it('Should fetch data', async () => { expect(getIssueFlowSnippets).toBeCalledWith('foo'); }); +it('Should handle no access rights', async () => { + (getIssueFlowSnippets as jest.Mock).mockRejectedValueOnce({ status: 403 }); + + const wrapper = shallowRender(); + await waitAndUpdate(wrapper); + + expect(wrapper.state().notAccessible).toBe(true); + expect(wrapper).toMatchSnapshot(); +}); + it('should handle issue popup', () => { const wrapper = shallowRender(); // open diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap index 5f6913c5ace..c6362cb8a71 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap @@ -1,5 +1,14 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Should handle no access rights 1`] = ` +<Alert + className="spacer-top" + variant="warning" +> + code_viewer.no_source_code_displayed_due_to_security +</Alert> +`; + exports[`should handle duplication popup 1`] = ` <Context.Consumer> [Function] |