You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2024/03/08 17:29:51 UTC

(camel-karavan) branch main updated: Login improvement

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) {