]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11475 Check if url is relative before redirecting
authorGrégoire Aubert <gregoire.aubert@sonarsource.com>
Wed, 14 Nov 2018 09:00:23 +0000 (10:00 +0100)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 16 Nov 2018 12:18:45 +0000 (13:18 +0100)
server/sonar-web/src/main/js/apps/maintenance/main-view.js
server/sonar-web/src/main/js/apps/sessions/components/LoginFormContainer.tsx
server/sonar-web/src/main/js/helpers/__tests__/urls-test.ts
server/sonar-web/src/main/js/helpers/urls.ts

index 7a0ebd4afc40452d222e5e2f375685cee452046d..13d2fb1b9c3735ebc09b7619e6380201a03a3890 100644 (file)
@@ -20,7 +20,7 @@
 import Marionette from 'backbone.marionette';
 import Template from './templates/maintenance-main.hbs';
 import { getSystemStatus, getMigrationStatus, migrateDatabase } from '../../api/system';
-import { getBaseUrl } from '../../helpers/urls';
+import { getReturnUrl } from '../../helpers/urls';
 
 export default Marionette.ItemView.extend({
   template: Template,
@@ -88,7 +88,7 @@ export default Marionette.ItemView.extend({
 
   loadPreviousPage() {
     setInterval(() => {
-      window.location = this.options.returnTo || getBaseUrl();
+      window.location.href = getReturnUrl(this.options.returnTo);
     }, 2500);
   },
 
index f4096338e9ab2a5bd430c0331322b7674958eb38..740f2680eaf193a5908f951fdf1dfea3e0c86134 100644 (file)
@@ -23,7 +23,7 @@ import LoginForm from './LoginForm';
 import { doLogin } from '../../../store/rootActions';
 import { tryGetGlobalNavigation } from '../../../api/nav';
 import { IdentityProvider, getIdentityProviders } from '../../../api/users';
-import { getBaseUrl } from '../../../helpers/urls';
+import { getReturnUrl } from '../../../helpers/urls';
 
 interface Props {
   doLogin: (login: string, password: string) => Promise<void>;
@@ -59,14 +59,11 @@ class LoginFormContainer extends React.PureComponent<Props, State> {
     this.mounted = false;
   }
 
-  getReturnUrl = () => {
-    const { location } = this.props;
-    const queryReturnTo = location.query['return_to'];
-    return queryReturnTo ? `${queryReturnTo}${location.hash}` : `${getBaseUrl()}/`;
-  };
-
   handleSuccessfulLogin = () => {
-    window.location.href = this.getReturnUrl();
+    window.location.href = getReturnUrl(
+      this.props.location.query['return_to'],
+      this.props.location.hash
+    );
   };
 
   handleSubmit = (login: string, password: string) => {
@@ -84,7 +81,7 @@ class LoginFormContainer extends React.PureComponent<Props, State> {
         identityProviders={identityProviders}
         onSonarCloud={onSonarCloud}
         onSubmit={this.handleSubmit}
-        returnTo={this.getReturnUrl()}
+        returnTo={getReturnUrl(this.props.location.query['return_to'], this.props.location.hash)}
       />
     );
   }
index b78c07f1800dac8134c41e8ecd9d0bc5e18fa15e..de4ed2c804dcaf33ae0cf7c2ea1c6f8e592c70f3 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import {
+  isRelativeUrl,
   getComponentIssuesUrl,
   getComponentDrilldownUrl,
   getPathUrlAsString,
   getProjectUrl,
   getQualityGatesUrl,
-  getQualityGateUrl
+  getQualityGateUrl,
+  getReturnUrl
 } from '../urls';
 
 const SIMPLE_COMPONENT_KEY = 'sonarqube';
@@ -113,3 +115,21 @@ describe('#getQualityGate(s)Url', () => {
     });
   });
 });
+
+describe('#getReturnUrl', () => {
+  it('should get the return url', () => {
+    expect(getReturnUrl('/test')).toBe('/test');
+    expect(getReturnUrl('http://www.google.com')).toBe('/');
+    expect(getReturnUrl()).toBe('/');
+  });
+});
+
+describe('#isRelativeUrl', () => {
+  it('should check a relative url', () => {
+    expect(isRelativeUrl('/test')).toBeTruthy();
+    expect(isRelativeUrl('http://www.google.com')).toBeFalsy();
+    expect(isRelativeUrl('javascript:alert("test")')).toBeFalsy();
+    expect(isRelativeUrl('\\test')).toBeFalsy();
+    expect(isRelativeUrl('//test')).toBeFalsy();
+  });
+});
index e73d9d2d67d82e8075d34d204447d346f1df7807..f06d15a7eda631151f2aef0eb033fb18a278e1a9 100644 (file)
@@ -167,3 +167,15 @@ export function getMarkdownHelpUrl(): string {
 export function getCodeUrl(project: string, branch?: string, selected?: string) {
   return { pathname: '/code', query: { id: project, branch, selected } };
 }
+
+export function getReturnUrl(returnTo?: string, hash?: string) {
+  if (isRelativeUrl(returnTo)) {
+    return returnTo + (hash ? hash : '');
+  }
+  return getBaseUrl() + '/';
+}
+
+export function isRelativeUrl(url?: string): boolean {
+  const regex = new RegExp(/^\/[^/\\]/);
+  return Boolean(url && regex.test(url));
+}