X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/fd470d8f7838b57777492289e6e4195b6c39bd2e..087d49d5c43866c8a20e8ac830ccc9b12188408f:/src/store/auth/auth-action.ts diff --git a/src/store/auth/auth-action.ts b/src/store/auth/auth-action.ts index 7ebbbaa6..9f18b5b0 100644 --- a/src/store/auth/auth-action.ts +++ b/src/store/auth/auth-action.ts @@ -8,15 +8,17 @@ import { AxiosInstance } from "axios"; import { RootState } from "../store"; import { ServiceRepository } from "~/services/services"; import { SshKeyResource } from '~/models/ssh-key'; -import { User } from "~/models/user"; +import { User, UserResource } from "~/models/user"; import { Session } from "~/models/session"; -import { getDiscoveryURL, Config } from '~/common/config'; +import { Config } from '~/common/config'; import { initSessions } from "~/store/auth/auth-action-session"; -import Axios from "axios"; +import { cancelLinking } from '~/store/link-account-panel/link-account-panel-actions'; +import { matchTokenRoute, matchFedTokenRoute } from '~/routes/routes'; import { AxiosError } from "axios"; export const authActions = unionize({ SAVE_API_TOKEN: ofType(), + SAVE_USER: ofType(), LOGIN: {}, LOGOUT: {}, CONFIG: ofType<{ config: Config }>(), @@ -34,7 +36,7 @@ export const authActions = unionize({ REMOTE_CLUSTER_CONFIG: ofType<{ config: Config }>(), }); -function setAuthorizationHeader(services: ServiceRepository, token: string) { +export function setAuthorizationHeader(services: ServiceRepository, token: string) { services.apiClient.defaults.headers.common = { Authorization: `OAuth2 ${token}` }; @@ -48,34 +50,46 @@ function removeAuthorizationHeader(client: AxiosInstance) { } export const initAuth = (config: Config) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + // Cancel any link account ops in progress unless the user has + // just logged in or there has been a successful link operation + const data = services.linkAccountService.getLinkOpStatus(); + if (!matchTokenRoute(location.pathname) && (!matchFedTokenRoute(location.pathname)) && data === undefined) { + dispatch(cancelLinking()).then(() => { + dispatch(init(config)); + }); + } + else { + dispatch(init(config)); + } +}; + +const init = (config: Config) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { const user = services.authService.getUser(); const token = services.authService.getApiToken(); - const homeCluster = services.authService.getHomeCluster(); + let homeCluster = services.authService.getHomeCluster(); if (token) { setAuthorizationHeader(services, token); } + if (homeCluster && !config.remoteHosts[homeCluster]) { + homeCluster = undefined; + } dispatch(authActions.CONFIG({ config })); - dispatch(authActions.SET_HOME_CLUSTER(homeCluster || config.uuidPrefix)); + dispatch(authActions.SET_HOME_CLUSTER(config.loginCluster || homeCluster || config.uuidPrefix)); + document.title = `Arvados Workbench (${config.uuidPrefix})`; if (token && user) { dispatch(authActions.INIT({ user, token })); dispatch(initSessions(services.authService, config, user)); dispatch(getUserDetails()).then((user: User) => { dispatch(authActions.INIT({ user, token })); }).catch((err: AxiosError) => { - console.log("error"); - console.log(err); if (err.response) { // Bad token if (err.response.status === 401) { - logout()(dispatch, getState, services); + dispatch(logout()); } } }); } - Object.keys(config.remoteHosts).map((k) => { - Axios.get(getDiscoveryURL(config.remoteHosts[k])) - .then(response => dispatch(authActions.REMOTE_CLUSTER_CONFIG({ config: response.data }))); - }); }; export const saveApiToken = (token: string) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { @@ -84,12 +98,21 @@ export const saveApiToken = (token: string) => (dispatch: Dispatch, getState: () dispatch(authActions.SAVE_API_TOKEN(token)); }; -export const login = (uuidPrefix: string, homeCluster: string, remoteHosts: { [key: string]: string }) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - services.authService.login(uuidPrefix, homeCluster, remoteHosts); - dispatch(authActions.LOGIN()); +export const saveUser = (user: UserResource) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + services.authService.saveUser(user); + dispatch(authActions.SAVE_USER(user)); }; -export const logout = () => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { +export const login = (uuidPrefix: string, homeCluster: string, loginCluster: string, + remoteHosts: { [key: string]: string }) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + services.authService.login(uuidPrefix, homeCluster, loginCluster, remoteHosts); + dispatch(authActions.LOGIN()); + }; + +export const logout = (deleteLinkData: boolean = false) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + if (deleteLinkData) { + services.linkAccountService.removeAccountToLink(); + } services.authService.removeApiToken(); services.authService.removeUser(); removeAuthorizationHeader(services.apiClient);