Arvados-DCO-1.1-Signed-off-by: Daniel Kutyła <daniel.kutyla@contractors.roche.com>
describe('redirect-to', () => {
const { location } = window;
- const redirectTo = 'http://localhost/test123';
+ const config: any = {
+ keepWebServiceUrl: 'http://localhost'
+ };
+ const redirectTo = '/test123';
const locationTemplate = {
hash: '',
hostname: '',
});
it('should redirect to page when it is present in session storage', () => {
- // given
- const token = 'testToken';
-
// when
- handleRedirects(token);
+ handleRedirects(config);
// then
- expect(window.location.href).toBe(`${redirectTo}?api_token=${token}`);
+ expect(window.location.href).toBe(`${config.keepWebServiceUrl}${redirectTo}`);
});
});
});
\ No newline at end of file
//
// SPDX-License-Identifier: AGPL-3.0
+import { Config } from './config';
+
const REDIRECT_TO_KEY = 'redirectTo';
export const storeRedirects = () => {
}
};
-export const handleRedirects = (token: string) => {
+export const handleRedirects = (config: Config) => {
const { sessionStorage } = window;
+ const { keepWebServiceUrl } = config;
if (sessionStorage && sessionStorage.getItem(REDIRECT_TO_KEY)) {
const redirectUrl = sessionStorage.getItem(REDIRECT_TO_KEY);
sessionStorage.removeItem(REDIRECT_TO_KEY);
- window.location.href = `${redirectUrl}?api_token=${token}`;
+ window.location.href = `${keepWebServiceUrl}${redirectUrl}`;
}
};
\ No newline at end of file
}
}
});
- const store = configureStore(history, services);
+ const store = configureStore(history, services, config);
store.subscribe(initListener(history, store, services, config));
store.dispatch(initAuth(config));
let store: RootStore;
let services: ServiceRepository;
+ const config: any = {};
const actions: ApiActions = {
progressFn: (id: string, working: boolean) => { },
errorFn: (id: string, message: string) => { }
beforeEach(() => {
axiosMock.reset();
services = createServices(mockConfig({}), actions, axiosInst);
- store = configureStore(createBrowserHistory(), services);
+ store = configureStore(createBrowserHistory(), services, config);
localStorage.clear();
importMocks = [];
});
let store: RootStore;
let services: ServiceRepository;
let axiosInst: AxiosInstance;
+ const config: any = {};
const actions: ApiActions = {
progressFn: (id: string, working: boolean) => { },
errorFn: (id: string, message: string) => { }
beforeEach(() => {
axiosInst = Axios.create({ headers: {} });
services = createServices(mockConfig({}), actions, axiosInst);
- store = configureStore(createBrowserHistory(), services);
+ store = configureStore(createBrowserHistory(), services, config);
localStorage.clear();
});
import { SubprocessMiddlewareService } from '~/store/subprocess-panel/subprocess-panel-middleware-service';
import { SUBPROCESS_PANEL_ID } from '~/store/subprocess-panel/subprocess-panel-actions';
import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
+import { Config } from '~/common/config';
const composeEnhancers =
(process.env.NODE_ENV === 'development' &&
export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
-export function configureStore(history: History, services: ServiceRepository): RootStore {
+export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
const rootReducer = createRootReducer(services);
const projectPanelMiddleware = dataExplorerMiddleware(
const state = store.getState();
if (state.auth && state.auth.apiToken) {
- const { apiToken } = state.auth;
- handleRedirects(apiToken);
+ handleRedirects(config);
}
return next(action);
import { connect } from "react-redux";
import { RootState } from "../../../store/store";
import { getNodeValue } from "~/models/tree";
-import { CollectionFileType } from "~/models/collection-file";
import { ContextMenuKind } from '~/views-components/context-menu/context-menu';
import { CopyToClipboardAction } from "./copy-to-clipboard-action";
const mapStateToProps = (state: RootState) => {
const { resource } = state.contextMenu;
const currentCollectionUuid = state.collectionPanel.item ? state.collectionPanel.item.uuid : '';
+ const { keepWebServiceUrl } = state.auth.config;
if (resource && resource.menuKind === ContextMenuKind.COLLECTION_FILES_ITEM) {
const file = getNodeValue(resource.uuid)(state.collectionPanelFiles);
if (file) {
return {
- href: file.url,
- download: file.type === CollectionFileType.DIRECTORY ? undefined : file.name,
+ href: file.url.replace(keepWebServiceUrl, ''),
kind: 'file',
currentCollectionUuid
};
import { RootState } from "../../../store/store";
import { FileViewerAction } from '~/views-components/context-menu/actions/file-viewer-action';
import { getNodeValue } from "~/models/tree";
-import { CollectionFileType } from "~/models/collection-file";
import { ContextMenuKind } from '~/views-components/context-menu/context-menu';
const mapStateToProps = (state: RootState) => {
if (file) {
return {
href: file.url,
- download: file.type === CollectionFileType.DIRECTORY ? undefined : file.name,
kind: 'file',
currentCollectionUuid
};
import { RootState } from "../../../store/store";
import { DownloadAction } from "./download-action";
import { getNodeValue } from "../../../models/tree";
-import { CollectionFileType } from "../../../models/collection-file";
import { ContextMenuKind } from '../context-menu';
import { filterCollectionFilesBySelection } from "~/store/collection-panel/collection-panel-files/collection-panel-files-state";
+import { sanitizeToken } from "./helpers";
const mapStateToProps = (state: RootState) => {
const { resource } = state.contextMenu;
const file = getNodeValue(resource.uuid)(state.collectionPanelFiles);
if (file) {
return {
- href: file.url,
- download: file.type === CollectionFileType.DIRECTORY ? undefined : file.name,
+ href: sanitizeToken(file.url, false),
kind: 'file',
currentCollectionUuid
};
} else {
const files = filterCollectionFilesBySelection(state.collectionPanelFiles, true);
return {
- href: files.map(file => file.url),
- download: files.map(file => file.name),
+ href: files.map(file => sanitizeToken(file.url, false)),
kind: 'files',
currentCollectionUuid
};
import { sanitizeToken } from "./helpers";
export const FileViewerAction = (props: { href?: any, download?: any, onClick?: () => void, kind?: string, currentCollectionUuid?: string; }) => {
- const fileProps = props.download ? { download: props.download } : {};
return props.href
? <a
style={{ textDecoration: 'none' }}
- href={sanitizeToken(props.href)}
+ href={sanitizeToken(props.href, false)}
target="_blank"
- onClick={props.onClick}
- {...fileProps}>
+ onClick={props.onClick}>
<ListItem button>
<ListItemIcon>
<OpenIcon />
export const getClipboardUrl = (href: string): string => {
const { origin } = window.location;
+ const url = sanitizeToken(href, false);
- return `${origin}?redirectTo=${sanitizeToken(href, false)}`;
+ return `${origin}?redirectTo=${url}`;
};
\ No newline at end of file