From 87122b00297ec3cd0687fd8cd4587d03b3eef355 Mon Sep 17 00:00:00 2001 From: shausing Date: Tue, 25 Mar 2025 19:17:36 +0530 Subject: [PATCH] AMBARI-26425: signout feature and showing logged in user --- .../resources/ui/ambari-admin/src/NavBar.tsx | 98 +++++++++++++++++++ .../ui/ambari-admin/src/api/logout.ts | 35 +++++++ 2 files changed, 133 insertions(+) create mode 100644 ambari-admin/src/main/resources/ui/ambari-admin/src/NavBar.tsx create mode 100644 ambari-admin/src/main/resources/ui/ambari-admin/src/api/logout.ts diff --git a/ambari-admin/src/main/resources/ui/ambari-admin/src/NavBar.tsx b/ambari-admin/src/main/resources/ui/ambari-admin/src/NavBar.tsx new file mode 100644 index 00000000000..453b4766850 --- /dev/null +++ b/ambari-admin/src/main/resources/ui/ambari-admin/src/NavBar.tsx @@ -0,0 +1,98 @@ +import { faUser } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { useEffect, useState } from "react"; +import { + Container, + Navbar, + Nav, + Dropdown, + DropdownDivider, +} from "react-bootstrap"; +import { + decryptData, + getFromLocalStorage, + parseJSONData +} from "./api/Utility.ts"; +import { get } from "lodash"; +import AmbariAboutModal from "./AmbariAboutModal"; + +type NavBarProps = { + subPath: string; + clusterName: string; +}; + +export default function NavBar({ subPath, clusterName }: NavBarProps) { + const [showAmbariAboutModal, setShowAmbariAboutModal] = useState(false); + const [loginUserName, setLoginUserName] = useState(""); + const [ambariLsVal, setAmbariLsVal] = useState(null); + + useEffect(() => { + let ambariKey = getFromLocalStorage('ambari'); + if (ambariKey) { + setAmbariLsVal(parseJSONData(decryptData(ambariKey))); + } + }, []); + + useEffect(() => { + if (ambariLsVal) { + const loginName = get(ambariLsVal, 'app.loginName'); + if (loginName) { + setLoginUserName(loginName); + } + } + }, [ambariLsVal]); + + return ( +
+ {showAmbariAboutModal ? ( + setShowAmbariAboutModal(false)} + /> + ) : null} + + + + {" "} + Admin / +
+ {subPath} +
+
+
+ + {clusterName} + + + + +
{loginUserName}
+
+ + + { + setShowAmbariAboutModal(true); + }} + > + About + + + Signout + +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/ambari-admin/src/main/resources/ui/ambari-admin/src/api/logout.ts b/ambari-admin/src/main/resources/ui/ambari-admin/src/api/logout.ts new file mode 100644 index 00000000000..14266c9a776 --- /dev/null +++ b/ambari-admin/src/main/resources/ui/ambari-admin/src/api/logout.ts @@ -0,0 +1,35 @@ +import { encryptData, decryptData, getFromLocalStorage, parseJSONData, setInLocalStorage } from "./Utility.ts"; +import { adminApi } from "./configs/axiosConfig.ts"; +import { AxiosError } from 'axios'; + +const signOut = async () => { + // var data = JSON.parse(decryptData(localStorage.getItem("ambari"))); + let ambariKey = getFromLocalStorage('ambari'); + let data; + if (ambariKey) { + data = parseJSONData(decryptData(ambariKey)); + } + delete data.app.authenticated; + delete data.app.loginName; + delete data.app.user; + + //with encrypting set data in LS + setInLocalStorage('ambari', encryptData(JSON.stringify(data))); + + const headers = { + 'Authorization': 'Basic ' + 'invalid_username:password' + }; + + try { + const url = "/logout" + await adminApi.request({ + url: url, + method: 'GET', + headers: headers + }); + } catch (error) { + const axiosError = error as AxiosError; + throw new Error(`Logout failed with status: ${axiosError.response?.status}`); + } +} +export default signOut; \ No newline at end of file