This is an automated email from the ASF dual-hosted git repository. marat pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
The following commit(s) were added to refs/heads/main by this push: new 012fd901 Login improvement 012fd901 is described below commit 012fd901d30a4489c6aeb7ca4618efeb8776ebef Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Fri Mar 8 12:29:33 2024 -0500 Login improvement --- .../src/main/resources/application.properties | 4 +- karavan-app/src/main/webui/src/api/KaravanApi.tsx | 8 ++-- karavan-app/src/main/webui/src/api/ProjectStore.ts | 2 +- karavan-app/src/main/webui/src/api/SsoApi.tsx | 4 +- karavan-app/src/main/webui/src/main/Main.tsx | 52 ++++++++++------------ .../src/main/webui/src/main/PageNavigation.tsx | 14 ------ .../src/main/webui/src/main/useMainHook.tsx | 6 +-- 7 files changed, 35 insertions(+), 55 deletions(-) diff --git a/karavan-app/src/main/resources/application.properties b/karavan-app/src/main/resources/application.properties index 7815c76c..aa43273b 100644 --- a/karavan-app/src/main/resources/application.properties +++ b/karavan-app/src/main/resources/application.properties @@ -36,10 +36,10 @@ karavan.docker.network=karavan # Keycloak configuration karavan.keycloak.url=http://localhost:8079 -karavan.keycloak.realm=karavan +karavan.keycloak.realm=talisman karavan.keycloak.frontend.clientId=frontend karavan.keycloak.backend.clientId=backend -karavan.keycloak.backend.secret=backend +karavan.keycloak.backend.secret=KJTyO4ukg8c3x0TZvG0ZPCerw7jEbze # Git repository Configuration karavan.git.repository=http://gitea:3000/karavan/karavan.git diff --git a/karavan-app/src/main/webui/src/api/KaravanApi.tsx b/karavan-app/src/main/webui/src/api/KaravanApi.tsx index 1738290f..3bdb20f8 100644 --- a/karavan-app/src/main/webui/src/api/KaravanApi.tsx +++ b/karavan-app/src/main/webui/src/api/KaravanApi.tsx @@ -38,7 +38,6 @@ export class KaravanApi { static me?: any; static authType?: string = undefined; - static isAuthorized: boolean = false; static basicToken: string = ''; static getInstance() { @@ -61,7 +60,7 @@ export class KaravanApi { } static setAuthType(authType: string) { - console.log("setAuthType", authType) + console.log("SetAuthType", authType) KaravanApi.authType = authType; switch (authType){ case "public": { @@ -129,7 +128,6 @@ export class KaravanApi { {headers: {'content-type': 'application/x-www-form-urlencoded'}}) .then(res => { if (res.status === 200) { - KaravanApi.isAuthorized = true; KaravanApi.basicToken = Buffer.from(username + ":" + password).toString('base64'); KaravanApi.setBasicAuthentication(); KaravanApi.getMe(user => { @@ -177,7 +175,9 @@ export class KaravanApi { instance.get('/public/auth', {headers: {'Accept': 'text/plain'}}) .then(res => { if (res.status === 200) { - KaravanApi.setAuthType(res.data); + const authType = res.data; + KaravanApi.setAuthType(authType); + useAppConfigStore.setState({isAuthorized: authType === 'public'}) after(res.data); } }).catch(err => { diff --git a/karavan-app/src/main/webui/src/api/ProjectStore.ts b/karavan-app/src/main/webui/src/api/ProjectStore.ts index 5bf4a103..00434f84 100644 --- a/karavan-app/src/main/webui/src/api/ProjectStore.ts +++ b/karavan-app/src/main/webui/src/api/ProjectStore.ts @@ -364,7 +364,7 @@ export const useLogStore = createWithEqualityFn<LogState>((set) => ({ }, }), shallow) -console.log("Start log subscriber"); +console.log("Start Log Subscriber"); const sub = ProjectEventBus.onLog()?.subscribe((result: ["add" | "set", string]) => { if (result[0] === 'add') { unstable_batchedUpdates(() => { diff --git a/karavan-app/src/main/webui/src/api/SsoApi.tsx b/karavan-app/src/main/webui/src/api/SsoApi.tsx index 9ac7ed61..6bf480c5 100644 --- a/karavan-app/src/main/webui/src/api/SsoApi.tsx +++ b/karavan-app/src/main/webui/src/api/SsoApi.tsx @@ -17,6 +17,7 @@ import Keycloak from "keycloak-js"; import {KaravanApi} from "./KaravanApi"; +import {useAppConfigStore} from "./ProjectStore"; export class SsoApi { @@ -27,7 +28,6 @@ export class SsoApi { SsoApi.keycloak = new Keycloak({url: config.url, realm: config.realm, clientId: config.clientId}); SsoApi.keycloak.init({onLoad: 'login-required', flow: 'hybrid', checkLoginIframe: false}).then(value => { console.log('SsoApi', 'User is now authenticated.'); - KaravanApi.isAuthorized = true; after(); }).catch(reason => { console.log('SsoApi', 'Error:', reason); @@ -40,7 +40,7 @@ export class SsoApi { if (SsoApi.keycloak) { SsoApi.keycloak.logout().then(value => { console.log('SsoApi', 'User is now logout.'); - KaravanApi.isAuthorized = false; + useAppConfigStore.setState({isAuthorized: false}) window.location.reload(); }).catch(reason => { console.log('SsoApi', 'Error:', reason); diff --git a/karavan-app/src/main/webui/src/main/Main.tsx b/karavan-app/src/main/webui/src/main/Main.tsx index d08f5dc8..1b29db59 100644 --- a/karavan-app/src/main/webui/src/main/Main.tsx +++ b/karavan-app/src/main/webui/src/main/Main.tsx @@ -34,13 +34,24 @@ import {NotificationApi} from "../api/NotificationApi"; export function Main() { - const [readiness, setReadiness] = useAppConfigStore((s) => [s.readiness, s.setReadiness], shallow) + const [readiness, setReadiness, isAuthorized] = useAppConfigStore((s) => [s.readiness, s.setReadiness, s.isAuthorized], shallow) const {getData} = useMainHook(); - const initialized = useRef(false); + useEffect(() => { + checkAuthType(); + const interval = setInterval(() => { + KaravanApi.getReadiness((r: any) => { + setReadiness(r); + }) + }, 10000) + return () => { + clearInterval(interval); + }; + }, []); useEffect(() => { if (showMain()) { + getData(); console.log("Start Notification fetcher"); const controller = new AbortController(); NotificationApi.notification(controller); @@ -48,35 +59,18 @@ export function Main() { console.log("Stop Notification fetcher"); controller.abort(); }; + } else if (KaravanApi.authType === 'oidc') { + SsoApi.auth(() => { + KaravanApi.getMe((user: any) => { + useAppConfigStore.setState({isAuthorized: true}); + }); + }); } - }, [readiness]); - - useEffect(() => { - if (!initialized.current) { - initialized.current = true - effect() - } - const interval = setInterval(() => { - KaravanApi.getReadiness((r: any) => { - setReadiness(r); - }) - }, 10000) - return () => { - clearInterval(interval); - }; - }, []) + }, [readiness, isAuthorized]); - function effect() { + function checkAuthType() { KaravanApi.getAuthType((authType: string) => { - console.log("authType", authType); - if (authType === 'oidc') { - SsoApi.auth(() => { - KaravanApi.getMe((user: any) => { - getData(); - }); - }); - } - getData(); + console.log("Main AuthType", authType); }); } @@ -89,7 +83,7 @@ export function Main() { } function showMain() { - return !showStepper() && !showSpinner() && (KaravanApi.isAuthorized || KaravanApi.authType === 'public'); + return KaravanApi.authType !== undefined && readiness?.status === true && isAuthorized; } return ( diff --git a/karavan-app/src/main/webui/src/main/PageNavigation.tsx b/karavan-app/src/main/webui/src/main/PageNavigation.tsx index cbe27f56..cbf4db84 100644 --- a/karavan-app/src/main/webui/src/main/PageNavigation.tsx +++ b/karavan-app/src/main/webui/src/main/PageNavigation.tsx @@ -141,18 +141,6 @@ export function PageNavigation () { <DescriptionListTerm>Display Name</DescriptionListTerm> <DescriptionListDescription>{KaravanApi.me?.displayName}</DescriptionListDescription> </DescriptionListGroup> - <DescriptionListGroup> - <DescriptionListTerm>Roles</DescriptionListTerm> - <DescriptionListDescription> - <Flex direction={{default: "row"}} gap={{default: "gapXs"}}> - {KaravanApi.me?.roles && Array.isArray(KaravanApi.me?.roles) - && KaravanApi.me?.roles - .filter((r: string) => ['administrator', 'developer', 'viewer'].includes(r)) - .map((role: string) => <Badge key={role} id={role} - isRead>{role}</Badge>)} - </Flex> - </DescriptionListDescription> - </DescriptionListGroup> </DescriptionList> } footerContent={ @@ -160,8 +148,6 @@ export function PageNavigation () { <Button size="sm" variant={"primary"} icon={<LogoutIcon/>} - // component={'a'} - // href={KaravanApi.me.logoutUrl} onClick={e => { setShowUser(false); SsoApi.logout(() => {}); diff --git a/karavan-app/src/main/webui/src/main/useMainHook.tsx b/karavan-app/src/main/webui/src/main/useMainHook.tsx index f5ce1015..6570e19d 100644 --- a/karavan-app/src/main/webui/src/main/useMainHook.tsx +++ b/karavan-app/src/main/webui/src/main/useMainHook.tsx @@ -27,13 +27,13 @@ import {ProjectService} from "../api/ProjectService"; export function useMainHook () { - const [setConfig] = useAppConfigStore((state) => [state.setConfig], shallow) + const [setConfig, isAuthorized] = useAppConfigStore((s) => [s.setConfig, s.isAuthorized], shallow) const [setProjects] = useProjectsStore((s) => [s.setProjects], shallow) const [setContainers] = useStatusesStore((state) => [state.setContainers], shallow); const [selectedEnv, selectEnvironment] = useAppConfigStore((state) => [state.selectedEnv, state.selectEnvironment], shallow) const getStatuses = () => { - if (KaravanApi.isAuthorized || KaravanApi.authType === 'public') { + if (isAuthorized || KaravanApi.authType === 'public') { KaravanApi.getAllContainerStatuses((statuses: ContainerStatus[]) => { setContainers(statuses); }); @@ -41,7 +41,7 @@ export function useMainHook () { } const getData = () => { - if (KaravanApi.isAuthorized || KaravanApi.authType === 'public') { + if (isAuthorized) { KaravanApi.getConfiguration((config: AppConfig) => { setConfig(config); if (!selectedEnv || selectedEnv.length == 0) {