aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorJeremy Davis <jeremy.davis@sonarsource.com>2020-02-24 11:02:37 +0100
committerSonarTech <sonartech@sonarsource.com>2020-02-26 10:41:19 +0100
commit1c870c915125912fec3569cf283b58a2a35281a5 (patch)
treed5e1d1301163a33c336a72e04575b7f8c735f6eb /server
parentd57aeee822d83a3b5fe22229e9865af52ae71ea3 (diff)
downloadsonarqube-1c870c915125912fec3569cf283b58a2a35281a5.tar.gz
sonarqube-1c870c915125912fec3569cf283b58a2a35281a5.zip
SONAR-13117 Handle 403 gracefully
Diffstat (limited to 'server')
-rw-r--r--server/sonar-web/src/main/js/api/issues.ts2
-rw-r--r--server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/CrossComponentSourceViewerWrapper.tsx24
-rw-r--r--server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/CrossComponentSourceViewerWrapper-test.tsx10
-rw-r--r--server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/__snapshots__/CrossComponentSourceViewerWrapper-test.tsx.snap9
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]