diff --git a/admin-ui/app/routes/Dashboards/DashboardPage.js b/admin-ui/app/routes/Dashboards/DashboardPage.js index 0ce05a2f8a..37dcc33172 100644 --- a/admin-ui/app/routes/Dashboards/DashboardPage.js +++ b/admin-ui/app/routes/Dashboards/DashboardPage.js @@ -1,93 +1,93 @@ -import React, { useState, useEffect, useMemo } from "react"; -import Grid from "@mui/material/Grid"; -import Paper from "@mui/material/Paper"; -import { useMediaQuery } from "react-responsive"; -import GluuLoader from "Routes/Apps/Gluu/GluuLoader"; -import GluuViewWrapper from "Routes/Apps/Gluu/GluuViewWrapper"; -import { getClients } from "Redux/features/initSlice"; +import React, { useState, useEffect, useMemo } from 'react' +import Grid from '@mui/material/Grid' +import Paper from '@mui/material/Paper' +import { useMediaQuery } from 'react-responsive' +import GluuLoader from 'Routes/Apps/Gluu/GluuLoader' +import GluuViewWrapper from 'Routes/Apps/Gluu/GluuViewWrapper' +import { getClients } from 'Redux/features/initSlice' import { hasBoth, buildPayload, STAT_READ, - STAT_JANS_READ, -} from "Utils/PermChecker"; -import { useTranslation } from "react-i18next"; -import { useDispatch, useSelector } from "react-redux"; -import { getLicenseDetails } from "Redux/features/licenseDetailsSlice"; -import { getHealthStatus } from "Redux/features/healthSlice"; -import DashboardChart from "./Chart/DashboardChart"; -import DateRange from "./DateRange"; -import CheckIcon from "../../images/svg/check.svg"; -import CrossIcon from "../../images/svg/cross.svg"; -import SetTitle from "Utils/SetTitle"; -import styles from "./styles"; -import { formatDate } from "Utils/Util"; -import UsersIcon from "Components/SVG/menu/Users"; -import Administrator from "Components/SVG/menu/Administrator"; -import OAuthIcon from "Components/SVG/menu/OAuth"; -import JansLockUsers from "Components/SVG/menu/JansLockUsers"; -import JansLockClients from "Components/SVG/menu/JansLockClients"; -import { getHealthServerStatus } from "../../redux/features/healthSlice"; -import GluuPermissionModal from "Routes/Apps/Gluu/GluuPermissionModal"; -import { auditLogoutLogs } from "../../../plugins/user-management/redux/features/userSlice"; -import { useNavigate } from "react-router"; -import { getLockStatus } from "Redux/features/lockSlice"; -import moment from "moment"; + STAT_JANS_READ +} from 'Utils/PermChecker' +import { useTranslation } from 'react-i18next' +import { useDispatch, useSelector } from 'react-redux' +import { getLicenseDetails } from 'Redux/features/licenseDetailsSlice' +import { getHealthStatus } from 'Redux/features/healthSlice' +import DashboardChart from './Chart/DashboardChart' +import DateRange from './DateRange' +import CheckIcon from '../../images/svg/check.svg' +import CrossIcon from '../../images/svg/cross.svg' +import SetTitle from 'Utils/SetTitle' +import styles from './styles' +import { formatDate } from 'Utils/Util' +import UsersIcon from 'Components/SVG/menu/Users' +import Administrator from 'Components/SVG/menu/Administrator' +import OAuthIcon from 'Components/SVG/menu/OAuth' +import JansLockUsers from 'Components/SVG/menu/JansLockUsers' +import JansLockClients from 'Components/SVG/menu/JansLockClients' +import { getHealthServerStatus } from '../../redux/features/healthSlice' +import GluuPermissionModal from 'Routes/Apps/Gluu/GluuPermissionModal' +import { auditLogoutLogs } from '../../../plugins/user-management/redux/features/userSlice' +import { useNavigate } from 'react-router' +import { getLockStatus } from 'Redux/features/lockSlice' +import moment from 'moment' function DashboardPage() { - const { t } = useTranslation(); - const navigate = useNavigate(); - const isTabletOrMobile = useMediaQuery({ query: "(max-width: 1224px)" }); - const breakDashboardCard = useMediaQuery({ query: "(max-width: 1424px)" }); - const isMobile = useMediaQuery({ maxWidth: 767 }); - const userAction = {}; - const options = {}; - const { classes } = styles(); - const FETCHING_LICENSE_DETAILS = "Fetch license details"; - const [mauCount, setMauCount] = useState(null); - const [tokenCount, setTokenCount] = useState(null); - - const statData = useSelector((state) => state.mauReducer.stat); - const loading = useSelector((state) => state.mauReducer.loading); - const clients = useSelector((state) => state.initReducer.clients); - const lock = useSelector((state) => state.lockReducer.lockDetail); + const { t } = useTranslation() + const navigate = useNavigate() + const isTabletOrMobile = useMediaQuery({ query: '(max-width: 1224px)' }) + const breakDashboardCard = useMediaQuery({ query: '(max-width: 1424px)' }) + const isMobile = useMediaQuery({ maxWidth: 767 }) + const userAction = {} + const options = {} + const { classes } = styles() + const FETCHING_LICENSE_DETAILS = 'Fetch license details' + const [mauCount, setMauCount] = useState(null) + const [tokenCount, setTokenCount] = useState(null) + + const statData = useSelector(state => state.mauReducer.stat) + const loading = useSelector(state => state.mauReducer.loading) + const clients = useSelector(state => state.initReducer.clients) + const lock = useSelector(state => state.lockReducer.lockDetail) const totalClientsEntries = useSelector( - (state) => state.initReducer.totalClientsEntries - ); - const license = useSelector((state) => state.licenseDetailsReducer.item); - const serverStatus = useSelector((state) => state.healthReducer.serverStatus); - const serverHealth = useSelector((state) => state.healthReducer.health); - const dbStatus = useSelector((state) => state.healthReducer.dbStatus); + state => state.initReducer.totalClientsEntries + ) + const license = useSelector(state => state.licenseDetailsReducer.item) + const serverStatus = useSelector(state => state.healthReducer.serverStatus) + const serverHealth = useSelector(state => state.healthReducer.health) + const dbStatus = useSelector(state => state.healthReducer.dbStatus) const access_token = useSelector( - (state) => state.authReducer.token?.access_token - ); - const permissions = useSelector((state) => state.authReducer.permissions); - const dispatch = useDispatch(); + state => state.authReducer.token?.access_token + ) + const permissions = useSelector(state => state.authReducer.permissions) + const dispatch = useDispatch() - SetTitle(t("menus.dashboard")); + SetTitle(t('menus.dashboard')) useEffect(() => { - const date = new Date(); - const currentYear = date.getFullYear(); - const currentMonth = date.getMonth() + 1; - const formattedMonth = currentMonth > 9 ? currentMonth : `0${currentMonth}`; - const yearMonth = `${currentYear}${formattedMonth}`; + const date = new Date() + const currentYear = date.getFullYear() + const currentMonth = date.getMonth() + 1 + const formattedMonth = currentMonth > 9 ? currentMonth : `0${currentMonth}` + const yearMonth = `${currentYear}${formattedMonth}` const currentMonthData = statData.find( ({ month }) => month.toString() === yearMonth - ); + ) - const mau = currentMonthData?.mau; + const mau = currentMonthData?.mau const token = currentMonthData?.authz_code_access_token_count + - currentMonthData?.client_credentials_access_token_count; + currentMonthData?.client_credentials_access_token_count if (mau) { - setMauCount(mau); + setMauCount(mau) } if (token) { - setTokenCount(token); + setTokenCount(token) } - }, [statData]); + }, [statData]) useEffect(() => { if ( @@ -95,9 +95,9 @@ function DashboardPage() { access_token && hasBoth(permissions, STAT_READ, STAT_JANS_READ) ) { - getLicense(); + getLicense() } - }, [access_token, license]); + }, [access_token, license]) useEffect(() => { if ( @@ -105,191 +105,186 @@ function DashboardPage() { access_token && hasBoth(permissions, STAT_READ, STAT_JANS_READ) ) { - buildPayload(userAction, "Fetch openid connect clients", {}); - dispatch(getClients({ action: userAction })); + buildPayload(userAction, 'Fetch openid connect clients', {}) + dispatch(getClients({ action: userAction })) } - }, [access_token, clients]); + }, [access_token, clients]) useEffect(() => { if (access_token && hasBoth(permissions, STAT_READ, STAT_JANS_READ)) { - getServerStatus(); - getJansLockDetails(); - buildPayload(userAction, "GET Health Status", { service: "all" }); - dispatch(getHealthServerStatus({ action: userAction })); + getServerStatus() + getJansLockDetails() + buildPayload(userAction, 'GET Health Status', { service: 'all' }) + dispatch(getHealthServerStatus({ action: userAction })) } - }, [access_token]); + }, [access_token]) function getLicense() { - buildPayload(userAction, FETCHING_LICENSE_DETAILS, options); - dispatch(getLicenseDetails({})); + buildPayload(userAction, FETCHING_LICENSE_DETAILS, options) + dispatch(getLicenseDetails({})) } function isUp(status) { if (status) { return ( - status.toUpperCase() === "ONLINE".toUpperCase() || - status.toUpperCase() === "RUNNING".toUpperCase() - ); + status.toUpperCase() === 'ONLINE'.toUpperCase() || + status.toUpperCase() === 'RUNNING'.toUpperCase() + ) } - return false; + return false } function getServerStatus() { - buildPayload(userAction, "GET Health Status", options); - dispatch(getHealthStatus({ action: userAction })); + buildPayload(userAction, 'GET Health Status', options) + dispatch(getHealthStatus({ action: userAction })) } function getJansLockDetails() { - const months = []; + const months = [] for (let i = 0; i < 12; i++) { - months.push(moment().subtract(i, "months").format("YYYYMM")); + months.push(moment().subtract(i, 'months').format('YYYYMM')) } - const startMonth = months[months.length - 1]; - const endMonth = months[0]; + const startMonth = months[months.length - 1] + const endMonth = months[0] dispatch( getLockStatus({ startMonth, - endMonth, + endMonth }) - ); + ) } let summaryData = [ { - text: t("dashboard.oidc_clients_count"), + text: t('dashboard.oidc_clients_count'), value: totalClientsEntries, icon: ( - - ), + + ) }, { - text: t("dashboard.active_users_count"), + text: t('dashboard.active_users_count'), value: mauCount ?? 0, - icon: ( - - ), + icon: }, { - text: t("dashboard.token_issued_count"), + text: t('dashboard.token_issued_count'), value: tokenCount ?? 0, - icon: ( - - ), - }, - ]; + icon: + } + ] if (lock && lock.length > 0) { summaryData.push( { - text: t("dashboard.mau_users"), + text: t('dashboard.mau_users'), value: lock[0]?.monthly_active_users ?? 0, icon: ( - ), + ) }, { - text: t("dashboard.mau_clients"), + text: t('dashboard.mau_clients'), value: lock[0]?.monthly_active_clients ?? 0, icon: ( - ), + ) } - ); + ) } const userInfo = [ { - text: t("dashboard.product_name"), - value: license?.productName, + text: t('dashboard.product_name'), + value: license?.productName }, { - text: t("dashboard.license_type"), - value: license?.licenseType, + text: t('dashboard.license_type'), + value: license?.licenseType }, { - text: t("dashboard.customer_email"), - value: license?.customerEmail, + text: t('dashboard.customer_email'), + value: license?.customerEmail }, { - text: t("dashboard.customer_name"), - value: `${license?.customerFirstName || ""} ${ - license?.customerLastName || "" - }`, + text: t('dashboard.customer_name'), + value: `${license?.customerFirstName || ''} ${ + license?.customerLastName || '' + }` }, { - text: t("fields.validityPeriod"), + text: t('fields.validityPeriod'), value: formatDate(license.validityPeriod), - key: "License Validity Period", + key: 'License Validity Period' }, { - text: t("dashboard.license_status"), - value: license?.licenseActive ? "active" : "inactive", - key: "License Status", - }, - ]; + text: t('dashboard.license_status'), + value: license?.licenseActive ? 'active' : 'inactive', + key: 'License Status' + } + ] const statusDetails = [ - { label: "dashboard.database_status", status: dbStatus, key: "db_status" }, + { label: 'dashboard.database_status', status: dbStatus, key: 'db_status' }, { - label: "dashboard.server_status", + label: 'dashboard.server_status', status: serverStatus, - key: "status", + key: 'status' }, { - label: "dashboard.oauth_server_status", + label: 'dashboard.oauth_server_status', status: serverStatus, - key: "jans-auth", + key: 'jans-auth' }, { - label: "dashboard.config_api", + label: 'dashboard.config_api', status: serverStatus, - key: "jans-config-api", + key: 'jans-config-api' }, - { label: "FIDO", status: serverStatus, key: "jans-fido2" }, - { label: "CASA", status: serverStatus, key: "jans-casa" }, - { label: "dashboard.key_cloak", status: serverStatus, key: "keycloak" }, - { label: "SCIM", status: false, key: "jans-scim" }, - { label: "dashboard.jans_lock", status: serverStatus, key: "jans-lock" }, - { label: "dashboard.jans_link", status: false, key: "jans-link" }, - ]; + { label: 'FIDO', status: serverStatus, key: 'jans-fido2' }, + { label: 'CASA', status: serverStatus, key: 'jans-casa' }, + { label: 'dashboard.key_cloak', status: serverStatus, key: 'keycloak' }, + { label: 'SCIM', status: false, key: 'jans-scim' }, + { label: 'dashboard.jans_lock', status: serverStatus, key: 'jans-lock' } + ] // Helper function to get the status value - const getStatusValue = (key) => { - if (key !== "db_status" && key !== "status") { - return serverHealth[key]; - } else if (key === "db_status") { - return dbStatus; + const getStatusValue = key => { + if (key !== 'db_status' && key !== 'status') { + return serverHealth[key] + } else if (key === 'db_status') { + return dbStatus } else { - return serverStatus; + return serverStatus } - }; + } // Helper function to determine the class name - const getClassName = (key) => { - const value = getStatusValue(key); - return isUp(value) ? classes.checkText : classes.crossText; - }; + const getClassName = key => { + const value = getStatusValue(key) + return isUp(value) ? classes.checkText : classes.crossText + } // Helper function to get the status text - const getStatusText = (key) => { - const value = getStatusValue(key); - return isUp(value) ? "Running" : "Down"; - }; + const getStatusText = key => { + const value = getStatusValue(key) + return isUp(value) ? 'Running' : 'Down' + } // Helper function to get the icon - const getStatusIcon = (key) => { - const value = getStatusValue(key); - return isUp(value) ? CheckIcon : CrossIcon; - }; + const getStatusIcon = key => { + const value = getStatusValue(key) + return isUp(value) ? CheckIcon : CrossIcon + } // Refactored StatusCard component const StatusCard = useMemo(() => { @@ -299,41 +294,41 @@ function DashboardPage() {
- {t("dashboard.system_status")} + {t('dashboard.system_status')}
{statusDetails.map(({ label, key }) => (
- + {t(label)} {getStatusText(key)}
- +
- ); - }, [serverStatus, serverHealth, dbStatus, t, statusDetails, classes]); + ) + }, [serverStatus, serverHealth, dbStatus, t, statusDetails, classes]) const handleLogout = () => { if (access_token) { dispatch( auditLogoutLogs({ message: - "Logging out due to insufficient permissions for Admin UI access.", + 'Logging out due to insufficient permissions for Admin UI access.' }) - ); - } else navigate("/logout"); - }; + ) + } else navigate('/logout') + } return ( { - handleLogout(); + handleLogout() }} isOpen={ !access_token || !hasBoth(permissions, STAT_READ, STAT_JANS_READ) @@ -379,17 +374,17 @@ function DashboardPage() {
- {t("dashboard.summary_title")} + {t('dashboard.summary_title')}
{summaryData.map((data, key) => ( @@ -400,7 +395,7 @@ function DashboardPage() {
{data.icon}
@@ -421,36 +416,36 @@ function DashboardPage() { spacing={2} > - +
- {t("dashboard.user_info")} + {t('dashboard.user_info')}
{userInfo.map((info, key) => (
- {info.text}:{" "} + {info.text}:{' '} - {info?.key === "License Status" ? ( + {info?.key === 'License Status' ? ( - +

- {t("dashboard.access_tokens_graph")} + {t('dashboard.access_tokens_graph')}

{isTabletOrMobile ? ( @@ -486,7 +481,7 @@ function DashboardPage() { : { marginLeft: 40, marginBottom: 40 } } > -
{t("dashboard.select_date_range")}
+
{t('dashboard.select_date_range')}
@@ -507,8 +502,8 @@ function DashboardPage() { -
- {t("dashboard.select_date_range")} +
+ {t('dashboard.select_date_range')}
@@ -526,17 +521,17 @@ function DashboardPage() { >
  • - {t("dashboard.client_credentials_access_token")} + {t('dashboard.client_credentials_access_token')}
  • - {t("dashboard.authorization_code_access_token")} + {t('dashboard.authorization_code_access_token')}
  • - {t("dashboard.authorization_code_id_token")} + {t('dashboard.authorization_code_id_token')}
@@ -545,7 +540,7 @@ function DashboardPage() {
- ); + ) } -export default DashboardPage; +export default DashboardPage diff --git a/admin-ui/app/utils/PermChecker.js b/admin-ui/app/utils/PermChecker.js index 22a54d1ad2..494a463627 100644 --- a/admin-ui/app/utils/PermChecker.js +++ b/admin-ui/app/utils/PermChecker.js @@ -81,15 +81,9 @@ export const FIDO_READ = BASE_URL + '/config/fido2.readonly' export const FIDO_WRITE = BASE_URL + '/config/fido2.write' export const FIDO_DELETE = BASE_URL + '/config/fido2.delete' -export const JANS_LINK_READ = BASE_URL + '/config/jans-link.readonly' -export const JANS_LINK_WRITE = BASE_URL + '/config/jans-link.write' - export const JANS_LOCK_READ = BASE_URL + '/lock-config.readonly' export const JANS_LOCK_WRITE = BASE_URL + '/lock-config.write' -export const JANS_KC_LINK_READ = BASE_URL + '/kc-link-config.readonly' -export const JANS_KC_LINK_WRITE = BASE_URL + '/kc-link-config.write' - export const CACHE_READ = BASE_URL + '/config/cache.readonly' export const CACHE_WRITE = BASE_URL + '/config/cache.write' export const CACHE_DELETE = BASE_URL + '/config/cache.delete' @@ -128,9 +122,12 @@ export const SCIM_CONFIG_WRITE = 'https://jans.io/scim/config.write' export const MESSAGE_READ = BASE_URL + '/config/message.readonly' export const MESSAGE_WRITE = BASE_URL + '/config/message.write' -export const WEBHOOK_READ = BASE_URL + '/jans-auth-server/config/adminui/webhook.readonly' -export const WEBHOOK_WRITE = BASE_URL + '/jans-auth-server/config/adminui/webhook.write' -export const WEBHOOK_DELETE = BASE_URL + '/jans-auth-server/config/adminui/webhook.delete' +export const WEBHOOK_READ = + BASE_URL + '/jans-auth-server/config/adminui/webhook.readonly' +export const WEBHOOK_WRITE = + BASE_URL + '/jans-auth-server/config/adminui/webhook.write' +export const WEBHOOK_DELETE = + BASE_URL + '/jans-auth-server/config/adminui/webhook.delete' export const ASSETS_READ = BASE_URL + '/config/jans_asset-read' export const ASSETS_WRITE = BASE_URL + '/config/jans_asset-write' export const ASSETS_DELETE = BASE_URL + '/config/jans_asset-delete' @@ -141,8 +138,8 @@ export const API_CONFIG_WRITE = BASE_URL + '/config/properties.write' export const hasPermission = (scopes, scope) => { let available = false if (scopes) { - for(const i in scopes){ - if(scopes[i] === scope){ + for (const i in scopes) { + if (scopes[i] === scope) { available = true } } diff --git a/admin-ui/plugins.config.json b/admin-ui/plugins.config.json index ff1ba0e1b1..00b08ce0da 100644 --- a/admin-ui/plugins.config.json +++ b/admin-ui/plugins.config.json @@ -31,14 +31,7 @@ "key": "jans-lock", "metadataFile": "./jans-lock/plugin-metadata" }, - { - "key": "jans-link", - "metadataFile": "./jans-link/plugin-metadata" - }, - { - "key": "jans-kc-link", - "metadataFile": "./jans-kc-link/plugin-metadata" - }, + { "key": "scim", "metadataFile": "./scim/plugin-metadata" diff --git a/admin-ui/plugins/jans-kc-link/components/ConfigurationForm.js b/admin-ui/plugins/jans-kc-link/components/ConfigurationForm.js deleted file mode 100644 index 4afc6d7c2d..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/ConfigurationForm.js +++ /dev/null @@ -1,257 +0,0 @@ -import React, { useState } from 'react' -import { isEmpty } from 'lodash' -import { useFormik } from 'formik' -import { Row, Col, Form, FormGroup } from 'Components' -import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog' -import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter' -import GluuToogleRow from 'Routes/Apps/Gluu/GluuToogleRow' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import GluuLabel from 'Routes/Apps/Gluu/GluuLabel' -import GluuProperties from 'Routes/Apps/Gluu/GluuProperties' -import PropTypes from 'prop-types' -import { useLocation } from 'react-router' -import { useSelector } from 'react-redux' -import { hasPermission, JANS_KC_LINK_WRITE } from 'Utils/PermChecker' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const ConfigurationForm = ({ - initialValues, - validationSchema, - handleFormSubmission, -}) => { - const permissions = useSelector((state) => state.authReducer.permissions) - const disabled = !hasPermission(permissions, JANS_KC_LINK_WRITE) - const viewOnly = useLocation().state?.viewOnly || false - - const userAction = {} - const [modal, setModal] = useState(false) - const toggle = () => { - setModal(!modal) - } - const formik = useFormik({ - initialValues, - validationSchema, - onSubmit: () => { - if (isEmpty(formik.errors)) { - toggle() - } - }, - }) - - const submitForm = (userMessage) => { - toggle() - handleFormSubmission({ userMessage, userAction, values: formik.values }) - } - - return ( -
{ - e.preventDefault() - formik.handleSubmit() - }} - className='mt-4' - > - - - - - - - - - - - - - - - - - - ({ - configKey: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_server' - showError={formik.errors?.servers && formik.touched?.servers} - errorMessage={formik.errors?.servers} - disabled={viewOnly || disabled} - /> - - - - - - - - ({ - configKey: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_base_dn' - showError={formik.errors?.baseDNs && formik.touched?.baseDNs} - errorMessage={formik.errors?.baseDNs} - disabled={viewOnly || disabled} - /> - - - - - - - - - - - { - formik.setFieldValue(`useAnonymousBind`, e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.useAnonymousBind} - disabled={viewOnly || disabled} - /> - - - { - formik.setFieldValue(`useSSL`, e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.useSSL} - disabled={viewOnly || disabled} - /> - - - { - formik.setFieldValue(`enabled`, e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.enabled} - disabled={viewOnly || disabled} - /> - - - - {(!viewOnly && !disabled) && - - - - - - } - - - ) -} - -export default ConfigurationForm -ConfigurationForm.propTypes = { - validationSchema: PropTypes.object.isRequired, - initialValues: PropTypes.object.isRequired, - handleFormSubmission: PropTypes.func.isRequired, -} \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/JansKcLinkPage.js b/admin-ui/plugins/jans-kc-link/components/JansKcLinkPage.js deleted file mode 100644 index 4a57975e24..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/JansKcLinkPage.js +++ /dev/null @@ -1,81 +0,0 @@ -import React, { useEffect } from 'react' -import SetTitle from 'Utils/SetTitle' -import GluuLoader from 'Routes/Apps/Gluu/GluuLoader' -import { Card, CardBody } from 'Components' -import GluuTabs from 'Routes/Apps/Gluu/GluuTabs' -import applicationStyle from 'Routes/Apps/Gluu/styles/applicationstyle' -import { useDispatch, useSelector } from 'react-redux' -import { getConfiguration } from 'Plugins/jans-kc-link/redux/features/JansKcLinkSlice' -import { useTranslation } from 'react-i18next' -import BasicConfiguration from './Tabs/BasicConfiguration' -import InumConfiguration from './Tabs/InumConfiguration' -import Sources from './Tabs/Sources' -import TargetConfiguration from './Tabs/TargetConfiguration' -import KeycloackConfiguration from './Tabs/KeycloackConfiguration' - -const JansKcLinkPage = () => { - const { t } = useTranslation() - const dispatch = useDispatch() - const isLoading = useSelector((state) => state.jansKcLinkReducer.loading) - SetTitle(t('titles.jans_kc_ink')) - - useEffect(() => { - dispatch(getConfiguration()) - }, []) - - const tabNames = [ - { - name: t('menus.basic_configuration'), - path: '/jans-kc-link/basic-configuration', - }, - { - name: t('menus.inum_configuration'), - path: '/jans-kc-link/inum-configuration', - }, - { - name: t('menus.sources'), - path: '/jans-kc-link/sources', - }, - { - name: t('menus.target_configuration'), - path: '/jans-kc-link/target-configuration', - }, - { - name: t('menus.keycloack_configuration'), - path: '/jans-kc-link/keycloack-configuration', - }, - ] - - const tabToShow = (tabName) => { - switch (tabName) { - case t('menus.basic_configuration'): - return - case t('menus.inum_configuration'): - return - case t('menus.sources'): - return - case t('menus.target_configuration'): - return - case t('menus.keycloack_configuration'): - return - } - } - - return ( - - - - {!isLoading && ( - - )} - - - - ) -} - -export default JansKcLinkPage \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/JansKcSourceForm.js b/admin-ui/plugins/jans-kc-link/components/JansKcSourceForm.js deleted file mode 100644 index b9cdd5cbf1..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/JansKcSourceForm.js +++ /dev/null @@ -1,105 +0,0 @@ -import React, { useEffect } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { useLocation, useNavigate } from 'react-router' -import { - convertToStringArray, - isStringsArray, -} from 'Plugins/jans-link/components/SourceBackendServers/SourceBackendServerForm' -import { buildPayload } from 'Utils/PermChecker' -import { putConfiguration, toggleSavedFormFlag } from 'Plugins/jans-kc-link/redux/features/JansKcLinkSlice' -import ConfigurationForm from './ConfigurationForm' -import { useTranslation } from 'react-i18next' -import applicationStyle from 'Routes/Apps/Gluu/styles/applicationstyle' -import GluuLoader from 'Routes/Apps/Gluu/GluuLoader' -import { Card, CardBody } from 'Components' -import { getInitalValues, getValidationSchema } from 'Plugins/jans-kc-link/helper/index' -import SetTitle from 'Utils/SetTitle' - -const JansKcSourceForm = () => { - const navigate = useNavigate() - const { t } = useTranslation() - const dispatch = useDispatch() - const sourceConfig = useLocation().state?.sourceConfig || {} - const configuration = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - const savedForm = useSelector((state) => state.jansKcLinkReducer.savedForm) - const loading = useSelector((state) => state.jansKcLinkReducer.loading) - const viewOnly = useLocation().state?.viewOnly || false - - if (viewOnly) { - SetTitle(t('menus.view_source')) - } else if (sourceConfig?.configId) { - SetTitle(t('menus.edit_source')) - } else { - SetTitle(t('menus.add_source')) - } - - const handleSubmit = ({ userAction, userMessage, values }) => { - const baseDNs = isStringsArray(values?.baseDNs || []) - ? values.baseDNs - : convertToStringArray(values?.baseDNs || []) - const servers = isStringsArray(values?.servers || []) - ? values?.servers - : convertToStringArray(values?.servers || []) - - let payload - - if (!sourceConfig?.configId) { - const sourceConfigs = [...(configuration?.sourceConfigs || [])] - payload = [ - ...sourceConfigs, - { - ...values, - baseDNs: baseDNs, - servers: servers, - }, - ] - } else { - payload = configuration.sourceConfigs?.map((config) => { - return config.configId === sourceConfig.configId - ? { - ...config, - ...values, - baseDNs: baseDNs, - servers: servers, - } - : config - }) - } - buildPayload(userAction, userMessage, { - appConfiguration4: { - ...configuration, - sourceConfigs: payload, - }, - }) - - dispatch(putConfiguration({ action: userAction })) - } - - useEffect(() => { - if (savedForm) { - navigate('/jans-kc-link/sources') - } - - return () => { - dispatch(toggleSavedFormFlag(false)) - } - }, [savedForm]) - - return ( - - - - - - - - ) -} - -export default JansKcSourceForm \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/SharedFooter.js b/admin-ui/plugins/jans-kc-link/components/SharedFooter.js deleted file mode 100644 index 014492b5f2..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/SharedFooter.js +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react' -import { Row, Col } from 'Components' -import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter' -import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog' -import PropTypes from 'prop-types' - -const SharedFooter = ({ disabled, toggle, modal, submitForm, formik, feature }) => { - return ( - <> - {!disabled && ( - - - - - - )} - - - ) -} - -export default SharedFooter -SharedFooter.propTypes = { - disabled: PropTypes.bool.isRequired, - toggle: PropTypes.func.isRequired, - modal: PropTypes.bool.isRequired, - submitForm: PropTypes.func.isRequired, - formik: PropTypes.object.isRequired, - feature: PropTypes.string -} \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/Tabs/BasicConfiguration.js b/admin-ui/plugins/jans-kc-link/components/Tabs/BasicConfiguration.js deleted file mode 100644 index 82441c9c07..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/Tabs/BasicConfiguration.js +++ /dev/null @@ -1,497 +0,0 @@ -import React, { useState } from 'react' -import { useTranslation } from 'react-i18next' -import { useDispatch, useSelector } from 'react-redux' -import * as Yup from 'yup' -import { buildPayload, hasPermission, JANS_KC_LINK_WRITE } from 'Utils/PermChecker' -import { isEmpty } from 'lodash' -import { putConfiguration } from 'Plugins/jans-kc-link/redux/features/JansKcLinkSlice' -import { useFormik } from 'formik' -import { Row, Col, Form, FormGroup } from 'Components' -import GluuToogleRow from 'Routes/Apps/Gluu/GluuToogleRow' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import GluuLabel from 'Routes/Apps/Gluu/GluuLabel' -import GluuProperties from 'Routes/Apps/Gluu/GluuProperties' -import GluuSelectRow from 'Routes/Apps/Gluu/GluuSelectRow' -import moment from 'moment/moment' -import { - convertToStringArray, - isStringsArray, -} from 'Plugins/jans-link/components/SourceBackendServers/SourceBackendServerForm' -import SharedFooter from '../SharedFooter' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const BasicConfiguration = () => { - const { t } = useTranslation() - const dispatch = useDispatch() - const configuration = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - const permissions = useSelector((state) => state.authReducer.permissions) - const disabled = !hasPermission(permissions, JANS_KC_LINK_WRITE) - const userAction = {} - const [modal, setModal] = useState(false) - const toggle = () => { - setModal(!modal) - } - - const { - keycloakLinkEnabled = false, - ldapSearchSizeLimit = 25, - customLdapFilter = '', - keyAttributes = [], - sourceAttributes = [], - snapshotFolder = '', - defaultInumServer = false, - keepExternalPerson = false, - useSearchLimit = false, - allowPersonModification = false, - metricReporterInterval = 0, - metricReporterKeepDataDays = 0, - cleanServiceInterval = 0, - disableJdkLogger = false, - useLocalCache = false, - loggingLevel = '', - keycloakLinkServerIpAddress = '', - keycloakLinkPollingInterval = 0, - keycloakLinkLastUpdate, - keycloakLinkLastUpdateCount, - keycloakLinkProblemCount, - updateMethod = '', - attributeMapping = [] - } = useSelector((state) => state.jansKcLinkReducer.configuration) - - const initialValues = { - keycloakLinkEnabled, - ldapSearchSizeLimit, - customLdapFilter, - keyAttributes, - sourceAttributes, - snapshotFolder, - defaultInumServer, - keepExternalPerson, - useSearchLimit, - allowPersonModification, - metricReporterInterval, - metricReporterKeepDataDays, - cleanServiceInterval, - disableJdkLogger, - useLocalCache, - loggingLevel, - keycloakLinkServerIpAddress, - keycloakLinkPollingInterval, - keycloakLinkLastUpdate, - keycloakLinkLastUpdateCount, - keycloakLinkProblemCount, - updateMethod, - attributeMapping - } - - const formik = useFormik({ - initialValues: initialValues, - enableReinitialize: true, - validationSchema: Yup.object({ - snapshotFolder: Yup.string().required( - `${t('fields.snapshot_folder')} ${t('messages.is_required')}` - ), - }), - onSubmit: () => { - if (isEmpty(formik.errors)) { - toggle() - } - }, - }) - - const submitForm = (userMessage) => { - toggle() - - buildPayload(userAction, userMessage, { - appConfiguration4: { - ...configuration, - ...formik.values, - sourceAttributes: isStringsArray(formik.values?.sourceAttributes || []) - ? formik.values.sourceAttributes - : convertToStringArray(formik.values?.sourceAttributes || []), - keyAttributes: isStringsArray(formik.values.keyAttributes || []) - ? formik.values.keyAttributes - : convertToStringArray(formik.values?.keyAttributes || []), - attributeMapping: formik.values.attributeMapping?.length - ? formik.values.attributeMapping.map((attribute) => { - return { - source: attribute.source, - destination: attribute.destination, - } - }) - : [], - }, - }) - - dispatch(putConfiguration({ action: userAction })) - } - - return ( -
{ - e.preventDefault() - formik.handleSubmit() - }} - className='mt-4' - > - - - { - formik.setFieldValue('keycloakLinkEnabled', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.keycloakLinkEnabled} - disabled={disabled} - /> - - - - - - - - - - - - - - - ({ - key: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_key_attribute' - showError={ - formik.errors.keyAttributes && formik.touched.keyAttributes - } - errorMessage={formik.errors.keyAttributes} - disabled={disabled} - /> - - - - - - - - - ({ - key: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_source_attribute' - showError={ - formik.errors.sourceAttributes && - formik.touched.sourceAttributes - } - errorMessage={formik.errors.sourceAttributes} - disabled={disabled} - /> - - - - - - - - - - - - - - { - formik.setFieldValue('defaultInumServer', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.defaultInumServer} - doc_category={null} - disabled={disabled} - /> - - - - { - formik.setFieldValue('keepExternalPerson', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.keepExternalPerson} - disabled={disabled} - /> - - - - { - formik.setFieldValue('useSearchLimit', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.useSearchLimit} - disabled={disabled} - /> - - - - { - formik.setFieldValue('allowPersonModification', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.allowPersonModification} - disabled={disabled} - /> - - - - - - - ({ - source, - destination, - }) - ) - : [] - } - isKeys={false} - buttonText='actions.add_attribute_mapping' - showError={ - formik.errors.attributeMapping && - formik.touched.attributeMapping - } - errorMessage={formik.errors.attributeMapping} - disabled={disabled} - /> - - - - - - - - - - - - - - - - - - { - formik.setFieldValue('disableJdkLogger', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.disableJdkLogger} - disabled={disabled} - /> - - - - { - formik.setFieldValue('useLocalCache', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.useLocalCache} - disabled={disabled} - /> - - - - - - - - - - {formik.values.keycloakLinkPollingInterval} - - - - - - - {formik.values.keycloakLinkLastUpdate - ? moment(formik.values.keycloakLinkLastUpdate).format('YYYY-MM-DD HH:mm:ss') - : null} - - - - - - - {formik.values.keycloakLinkLastUpdateCount} - - - - - - {formik.values.keycloakLinkProblemCount} - - - - - - - - - - - ) -} - -export default BasicConfiguration \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/Tabs/InumConfiguration.js b/admin-ui/plugins/jans-kc-link/components/Tabs/InumConfiguration.js deleted file mode 100644 index 1b901d9498..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/Tabs/InumConfiguration.js +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react' -import ConfigurationForm from '../ConfigurationForm' -import { buildPayload } from 'Utils/PermChecker' -import { useDispatch, useSelector } from 'react-redux' -import { - convertToStringArray, - isStringsArray, -} from 'Plugins/jans-link/components/SourceBackendServers/SourceBackendServerForm' -import { putConfiguration } from 'Plugins/jans-kc-link/redux/features/JansKcLinkSlice' -import { useTranslation } from 'react-i18next' -import { getInitalValues, getValidationSchema } from 'Plugins/jans-kc-link/helper/index' - -const InumConfiguration = () => { - const { t } = useTranslation() - const dispatch = useDispatch() - const configuration = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - const { inumConfig = {} } = configuration - const handleFormSubmission = ({ userAction, userMessage, values }) => { - const baseDNs = isStringsArray(values?.baseDNs || []) - ? values.baseDNs - : convertToStringArray(values?.baseDNs || []) - const servers = isStringsArray(values?.servers || []) - ? values?.servers - : convertToStringArray(values?.servers || []) - - buildPayload(userAction, userMessage, { - appConfiguration4: { - ...configuration, - inumConfig: { - ...values, - servers: servers, - baseDNs: baseDNs, - }, - }, - }) - - dispatch(putConfiguration({ action: userAction })) - } - - return ( - - ) -} - -export default InumConfiguration \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/Tabs/KeycloackConfiguration.js b/admin-ui/plugins/jans-kc-link/components/Tabs/KeycloackConfiguration.js deleted file mode 100644 index e379223c12..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/Tabs/KeycloackConfiguration.js +++ /dev/null @@ -1,166 +0,0 @@ -import { useFormik } from 'formik' -import React, { useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { buildPayload, hasPermission, JANS_KC_LINK_WRITE } from 'Utils/PermChecker' -import { putConfiguration } from 'Plugins/jans-kc-link/redux/features/JansKcLinkSlice' -import { Col, Form, FormGroup } from 'Components' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import SharedFooter from '../SharedFooter' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const KeycloackConfiguration = () => { - const dispatch = useDispatch() - const configuration = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - const permissions = useSelector((state) => state.authReducer.permissions) - const disabled = !hasPermission(permissions, JANS_KC_LINK_WRITE) - - const userAction = {} - const [modal, setModal] = useState(false) - const toggle = () => { - setModal(!modal) - } - - const { keycloakConfiguration = {} } = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - - const { - serverUrl = '', - realm = '', - clientId = '', - clientSecret = '', - grantType = '', - username = '', - password = '', - } = keycloakConfiguration - - const initialValues = { - keycloakConfiguration: { - serverUrl, - realm, - clientId, - clientSecret, - grantType, - username, - password, - }, - } - - const formik = useFormik({ - initialValues: initialValues, - onSubmit: () => { - toggle() - }, - }) - - const submitForm = (userMessage) => { - toggle() - - buildPayload(userAction, userMessage, { - appConfiguration4: { - ...configuration, - ...formik.values, - }, - }) - - dispatch(putConfiguration({ action: userAction })) - } - - return ( -
{ - e.preventDefault() - formik.handleSubmit() - }} - className='mt-4' - > - - - - - - - - - - - - - - - - - - - - - - - - - - - ) -} - -export default KeycloackConfiguration \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/Tabs/Sources.js b/admin-ui/plugins/jans-kc-link/components/Tabs/Sources.js deleted file mode 100644 index 5d43a80b27..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/Tabs/Sources.js +++ /dev/null @@ -1,154 +0,0 @@ -import React, { useCallback, useContext, useState } from 'react' -import { ThemeContext } from 'Context/theme/themeContext' -import { useDispatch, useSelector } from 'react-redux' -import applicationStyle from 'Routes/Apps/Gluu/styles/applicationstyle' -import MaterialTable from '@material-table/core' -import { Paper } from '@mui/material' -import { DeleteOutlined } from '@mui/icons-material' -import { useNavigate } from 'react-router' -import getThemeColor from 'Context/theme/config' -import { useTranslation } from 'react-i18next' -import GluuViewWrapper from 'Routes/Apps/Gluu/GluuViewWrapper' -import GluuDialog from 'Routes/Apps/Gluu/GluuDialog' -import { putConfiguration } from 'Plugins/jans-kc-link/redux/features/JansKcLinkSlice' -import { buildPayload, hasPermission, JANS_KC_LINK_WRITE, JANS_KC_LINK_READ } from 'Utils/PermChecker' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const Sources = () => { - const { t } = useTranslation() - const theme = useContext(ThemeContext) - const permissions = useSelector((state) => state.authReducer.permissions) - const navigate = useNavigate() - const selectedTheme = theme.state.theme - const themeColors = getThemeColor(selectedTheme) - const bgThemeColor = { background: themeColors.background } - let actions = [] - const dispatch = useDispatch() - const configuration = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - const userAction = {} - const [item, setItem] = useState({}) - const [modal, setModal] = useState(false) - const toggle = () => setModal(!modal) - const { sourceConfigs = [] } = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - const loading = useSelector((state) => state.ldapReducer.loading) - - const columns = [ - { field: 'configId', title: `${t('fields.name')}` }, - { field: 'enabled', title: `${t('fields.enabled')}` }, - ] - - const navigateToEdit = (rowData) => { - delete rowData?.tableData - navigate('/jans-kc-link/sources/edit', { - state: { sourceConfig: rowData }, - }) - } - - const deleteConfig = (data) => { - setItem(data) - toggle() - } - - const navigateToAdd = () => navigate('/jans-kc-link/sources/add') - - const navigateToView = (rowData) => navigate('/jans-kc-link/sources/view', { state: { sourceConfig: rowData, viewOnly: true } }) - - actions.push((rowData) => ({ - icon: 'edit', - iconProps: { - id: 'editClient' + rowData.configId, - }, - tooltip: `${t('messages.edit_configuration')}`, - onClick: (event, rowData) => navigateToEdit(rowData), - disabled: !hasPermission(permissions, JANS_KC_LINK_WRITE), - })) - - actions.push((rowData) => ({ - icon: DeleteIcon, - iconProps: { - color: 'secondary', - id: 'deleteClient' + rowData.configId, - }, - tooltip: `${t('messages.delete_configuration')}`, - onClick: (event, rowData) => deleteConfig(rowData), - disabled: !hasPermission(permissions, JANS_KC_LINK_WRITE), - })) - - actions.push({ - icon: 'add', - tooltip: `${t('messages.add_configuration')}`, - iconProps: { color: 'primary' }, - isFreeAction: true, - onClick: () => navigateToAdd(), - disabled: !hasPermission(permissions, JANS_KC_LINK_WRITE), - }) - - actions.push({ - icon: 'visibility', - tooltip: `${t('messages.view_configuration')}`, - onClick: (event, rowData) => navigateToView(rowData), - disabled: !hasPermission(permissions, JANS_KC_LINK_READ), - }) - - const PaperContainer = useCallback( - (props) => , - [] - ) - - const DeleteIcon = useCallback((props) => , []) - - function onDeletionConfirmed(message) { - const sourceConfigs = configuration.sourceConfigs?.filter( - (config) => config.configId !== item.configId - ) - buildPayload(userAction, message, { - appConfiguration4: { - ...configuration, - sourceConfigs: sourceConfigs, - }, - }) - dispatch(putConfiguration({ action: userAction })) - toggle() - } - - return ( - <> - - - - - - ) -} - -export default Sources \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/components/Tabs/TargetConfiguration.js b/admin-ui/plugins/jans-kc-link/components/Tabs/TargetConfiguration.js deleted file mode 100644 index 2ab361faee..0000000000 --- a/admin-ui/plugins/jans-kc-link/components/Tabs/TargetConfiguration.js +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react' -import ConfigurationForm from '../ConfigurationForm' -import { buildPayload } from 'Utils/PermChecker' -import { useDispatch, useSelector } from 'react-redux' -import { - convertToStringArray, - isStringsArray, -} from 'Plugins/jans-link/components/SourceBackendServers/SourceBackendServerForm' -import { putConfiguration } from 'Plugins/jans-kc-link/redux/features/JansKcLinkSlice' -import { useTranslation } from 'react-i18next' -import { getInitalValues, getValidationSchema } from 'Plugins/jans-kc-link/helper/index' - -const TargetConfiguration = () => { - const { t } = useTranslation() - const dispatch = useDispatch() - const configuration = useSelector( - (state) => state.jansKcLinkReducer.configuration - ) - const handleFormSubmission = ({ userAction, userMessage, values }) => { - const baseDNs = isStringsArray(values?.baseDNs || []) - ? values.baseDNs - : convertToStringArray(values?.baseDNs || []) - const servers = isStringsArray(values?.servers || []) - ? values?.servers - : convertToStringArray(values?.servers || []) - - buildPayload(userAction, userMessage, { - appConfiguration4: { - ...configuration, - targetConfig: { - ...values, - servers: servers, - baseDNs: baseDNs, - }, - }, - }) - - dispatch(putConfiguration({ action: userAction })) - } - - const { targetConfig = {} } = configuration - - return ( - - ) -} - -export default TargetConfiguration \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/helper/index.js b/admin-ui/plugins/jans-kc-link/helper/index.js deleted file mode 100644 index fbce28a0ba..0000000000 --- a/admin-ui/plugins/jans-kc-link/helper/index.js +++ /dev/null @@ -1,56 +0,0 @@ -import * as Yup from 'yup' - -export const getInitalValues = (values) => { - const { - bindDN = '', - configId = '', - bindPassword, - maxConnections = 0, - baseDNs = [], - servers = [], - useAnonymousBind = false, - useSSL = false, - enabled = false, - localPrimaryKey = '', - primaryKey = '', - } = values - - return { - bindDN, - configId, - bindPassword, - maxConnections, - baseDNs, - servers, - useAnonymousBind, - useSSL, - enabled, - localPrimaryKey, - primaryKey, - } -} - -export const getValidationSchema = (t) => { - return Yup.object({ - configId: Yup.string() - .min(2, 'Mininum 2 characters') - .required(`${t('fields.name')} ${t('messages.is_required')}`), - bindDN: Yup.string() - .min(2, 'Mininum 2 characters') - .required(`${t('fields.bind_dn')} ${t('messages.is_required')}`), - maxConnections: Yup.string().required( - `${t('fields.max_connections')} ${t('messages.is_required')}` - ), - bindPassword: Yup.string().required( - `${t('fields.bind_password')} ${t('messages.is_required')}` - ), - servers: Yup.array().min( - 1, - `${t('fields.server_port')} ${t('messages.is_required')}` - ), - baseDNs: Yup.array().min( - 1, - `${t('fields.base_dns')} ${t('messages.is_required')}` - ), - }) -} \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/plugin-metadata.js b/admin-ui/plugins/jans-kc-link/plugin-metadata.js deleted file mode 100644 index 4e8c8e656a..0000000000 --- a/admin-ui/plugins/jans-kc-link/plugin-metadata.js +++ /dev/null @@ -1,69 +0,0 @@ -import { JANS_KC_LINK_READ, JANS_KC_LINK_WRITE } from 'Utils/PermChecker' -import JansKcLinkPage from './components/JansKcLinkPage' -import jansKcLinkSaga from './redux/sagas/JansKcLinkSaga' -import jansKcLinkReducer from './redux/features/JansKcLinkSlice' -import JansKcSourceForm from './components/JansKcSourceForm' - -const PLUGIN_BASE_PATH = '/jans-kc-link' - -const pluginMetadata = { - menus: [ - { - title: 'menus.jans_kc_link', - icon: 'jans_kc_link', - path: PLUGIN_BASE_PATH, - permission: JANS_KC_LINK_READ, - }, - ], - routes: [ - { - component: JansKcLinkPage, - path: PLUGIN_BASE_PATH, - permission: JANS_KC_LINK_READ, - }, - { - component: JansKcLinkPage, - path: PLUGIN_BASE_PATH + '/basic-configuration', - permission: JANS_KC_LINK_READ, - }, - { - component: JansKcLinkPage, - path: PLUGIN_BASE_PATH + '/inum-configuration', - permission: JANS_KC_LINK_READ, - }, - { - component: JansKcLinkPage, - path: PLUGIN_BASE_PATH + '/sources', - permission: JANS_KC_LINK_READ, - }, - { - component: JansKcSourceForm, - path: PLUGIN_BASE_PATH + '/sources/add', - permission: JANS_KC_LINK_WRITE, - }, - { - component: JansKcSourceForm, - path: PLUGIN_BASE_PATH + '/sources/edit', - permission: JANS_KC_LINK_WRITE, - }, - { - component: JansKcSourceForm, - path: PLUGIN_BASE_PATH + '/sources/view', - permission: JANS_KC_LINK_READ, - }, - { - component: JansKcLinkPage, - path: PLUGIN_BASE_PATH + '/target-configuration', - permission: JANS_KC_LINK_READ, - }, - { - component: JansKcLinkPage, - path: PLUGIN_BASE_PATH + '/keycloack-configuration', - permission: JANS_KC_LINK_READ, - }, - ], - reducers: [{ name: 'jansKcLinkReducer', reducer: jansKcLinkReducer }], - sagas: [jansKcLinkSaga()], -} - -export default pluginMetadata \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/redux/api/JansKcLinkApi.js b/admin-ui/plugins/jans-kc-link/redux/api/JansKcLinkApi.js deleted file mode 100644 index bd59f03f6a..0000000000 --- a/admin-ui/plugins/jans-kc-link/redux/api/JansKcLinkApi.js +++ /dev/null @@ -1,23 +0,0 @@ -import { handleResponse } from 'Utils/ApiUtils' - -export default class JansKcLinkApi { - constructor(api) { - this.api = api - } - - getKcLinkProperties = () => { - return new Promise((resolve, reject) => { - this.api.getKcLinkProperties((error, data) => { - handleResponse(error, reject, resolve, data) - }) - }) - } - - updateKcLinkConfig = (input) => { - return new Promise((resolve, reject) => { - this.api.putKcLinkProperties(input, (error, data) => { - handleResponse(error, reject, resolve, data) - }) - }) - } -} \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/redux/features/JansKcLinkSlice.js b/admin-ui/plugins/jans-kc-link/redux/features/JansKcLinkSlice.js deleted file mode 100644 index 877b392521..0000000000 --- a/admin-ui/plugins/jans-kc-link/redux/features/JansKcLinkSlice.js +++ /dev/null @@ -1,43 +0,0 @@ -import reducerRegistry from 'Redux/reducers/ReducerRegistry' -import { createSlice } from '@reduxjs/toolkit' - -const initialState = { - configuration: {}, - loading: true, - savedForm: false, -} - -const jansKcLink = createSlice({ - name: 'jansKcLink', - initialState: initialState, - reducers: { - getConfiguration: (state) => { - state.loading = true - }, - getConfigurationResponse: (state, action) => { - state.configuration = action.payload ? action.payload : {} - state.loading = false - }, - putConfiguration: (state) => { - state.loading = true - }, - setLoading: (state, action) => { - state.loading = action.payload - }, - toggleSavedFormFlag: (state, action) => { - state.savedForm = action.payload || false - }, - }, -}) - -export const { - getConfiguration, - getConfigurationResponse, - putConfiguration, - toggleSavedFormFlag, - setLoading, -} = jansKcLink.actions - -export default jansKcLink.reducer - -reducerRegistry.register('jansKcLinkReducer', jansKcLink.reducer) \ No newline at end of file diff --git a/admin-ui/plugins/jans-kc-link/redux/sagas/JansKcLinkSaga.js b/admin-ui/plugins/jans-kc-link/redux/sagas/JansKcLinkSaga.js deleted file mode 100644 index e212463c47..0000000000 --- a/admin-ui/plugins/jans-kc-link/redux/sagas/JansKcLinkSaga.js +++ /dev/null @@ -1,96 +0,0 @@ -import { initAudit } from 'Redux/sagas/SagaUtils' -import { getClient } from 'Redux/api/base' -import { isFourZeroOneError, addAdditionalData } from 'Utils/TokenController' -import { - call, - all, - put, - fork, - takeLatest, - select, - takeEvery, -} from 'redux-saga/effects' -import { postUserAction } from 'Redux/api/backend-api' -import { updateToast } from 'Redux/features/toastSlice' -import JansKcLinkApi from '../api/JansKcLinkApi' -import { - getConfigurationResponse, - toggleSavedFormFlag, - setLoading -} from '../features/JansKcLinkSlice' -import { getAPIAccessToken } from 'Redux/features/authSlice' -import { UPDATE, FETCH } from '../../../../app/audit/UserActionType' -import { triggerWebhook } from 'Plugins/admin/redux/sagas/WebhookSaga' - -const JansConfigApi = require('jans_config_api') - -export const JANS_KC_LINK = 'jans-kc-link' - -function* newFunction() { - const token = yield select((state) => state.authReducer.token.access_token) - const issuer = yield select((state) => state.authReducer.issuer) - const api = new JansConfigApi.KCLinkConfigurationApi( - getClient(JansConfigApi, token, issuer) - ) - return new JansKcLinkApi(api) -} - -export function* getKcConfiguration() { - const audit = yield* initAudit() - try { - addAdditionalData(audit, FETCH, JANS_KC_LINK, {}) - const jansKcApi = yield* newFunction() - const data = yield call(jansKcApi.getKcLinkProperties) - yield put(getConfigurationResponse(data)) - yield call(postUserAction, audit) - yield put(toggleSavedFormFlag(false)) - return data - } catch (e) { - yield put(getConfigurationResponse(null)) - yield put(toggleSavedFormFlag(false)) - if (isFourZeroOneError(e)) { - const jwt = yield select((state) => state.authReducer.userinfo_jwt) - yield put(getAPIAccessToken(jwt)) - } - return e - } -} - -export function* editJansKcLinkConfig({ payload }) { - const audit = yield* initAudit() - addAdditionalData(audit, UPDATE, JANS_KC_LINK, payload) - try { - const jansKcApi = yield* newFunction() - const data = yield call( - jansKcApi.updateKcLinkConfig, - payload.action.action_data - ) - yield put(updateToast(true, 'success')) - yield put(getConfigurationResponse(data)) - yield put(toggleSavedFormFlag(true)) - yield call(postUserAction, audit) - yield* triggerWebhook({ payload: { createdFeatureValue: data } }) - return data - } catch (e) { - yield put(setLoading(false)) - yield put(toggleSavedFormFlag(false)) - yield put(updateToast(true, 'error')) - if (isFourZeroOneError(e)) { - const jwt = yield select((state) => state.authReducer.userinfo_jwt) - yield put(getAPIAccessToken(jwt)) - } - return e - } -} - -export function* watchGetJansKcConfig() { - yield takeEvery('jansKcLink/getConfiguration', getKcConfiguration) -} - -export function* watchPutJansKcConfig() { - yield takeLatest('jansKcLink/putConfiguration', editJansKcLinkConfig) -} - -export default function* rootSaga() { - yield all([fork(watchGetJansKcConfig), fork(watchPutJansKcConfig)]) -} \ No newline at end of file diff --git a/admin-ui/plugins/jans-link/__tests__/api/JansLink.test.js b/admin-ui/plugins/jans-link/__tests__/api/JansLink.test.js deleted file mode 100644 index ea6047e145..0000000000 --- a/admin-ui/plugins/jans-link/__tests__/api/JansLink.test.js +++ /dev/null @@ -1,100 +0,0 @@ -import { combineReducers } from '@reduxjs/toolkit' -import { - authReducerInit, - beforeAllAsync, -} from 'Plugins/jans-link/__tests__/api/setup.test' -import { - getCacheRefreshSaga, - editCacheConfig, -} from 'Plugins/jans-link/redux/sagas/CacheRefreshSaga' -import cacheRefreshReducer from 'Plugins/jans-link/redux/features/CacheRefreshSlice' -import { expectSaga } from 'redux-saga-test-plan' -import authReducer from 'Redux/features/authSlice' -import { log } from 'console' - -let initialState - -const formInitState = (token, issuer) => { - initialState = { - authReducer: authReducerInit(token, issuer), - cacheRefreshReducer: { configuration: {} }, - } -} - -beforeAll(async () => { - try { - await beforeAllAsync(formInitState) - } catch (error) { - log(error.message) - } -}) - -const rootReducer = combineReducers({ - authReducer, - cacheRefreshReducer, -}) - -describe('fetch & update jans-link configuration', () => { - let configurations - it('should GET current jans-link configuration', async () => { - const result = await expectSaga(getCacheRefreshSaga) - .withReducer(rootReducer, initialState) - .run(false) - - expect(result.returnValue instanceof Error).toBe(false) - if (!(result.returnValue instanceof Error)) { - configurations = result.returnValue - expect(result.returnValue).toEqual(result.storeState.cacheRefreshReducer.configuration) - } - }) - - it('should Update Polling interval & Search size limit value in Dynaminc Config', async () => { - // pollingInterval - // ldapSearchSizeLimit - if (configurations) { - const result = await expectSaga(editCacheConfig, { - payload: { - action: { - action_data: { - appConfiguration2: { - ...configurations, - pollingInterval: 100, - ldapSearchSizeLimit: 80, - }, - }, - }, - }, - }) - .withReducer(rootReducer, initialState) - .run(false) - - expect(result.returnValue instanceof Error).toBe(false) - } else { - throw new Error('skipping tests, no configurations found from GET!') - } - }) - - it('should Update with original value', async () => { - if (configurations) { - const result = await expectSaga(editCacheConfig, { - payload: { - action: { - action_data: { - appConfiguration2: { - ...configurations, - pollingInterval: configurations.pollingInterval, - ldapSearchSizeLimit: configurations.ldapSearchSizeLimit, - }, - }, - }, - }, - }) - .withReducer(rootReducer, initialState) - .run(false) - - expect(result.returnValue instanceof Error).toBe(false) - } else { - throw new Error('skipping tests, no configurations found from GET!') - } - }) -}) diff --git a/admin-ui/plugins/jans-link/__tests__/api/setup.test.js b/admin-ui/plugins/jans-link/__tests__/api/setup.test.js deleted file mode 100644 index bbe4aa19f3..0000000000 --- a/admin-ui/plugins/jans-link/__tests__/api/setup.test.js +++ /dev/null @@ -1,6 +0,0 @@ -import { - authReducerInit, - beforeAllAsync, -} from 'Plugins/auth-server/__tests__/api/setup.test' - -export { authReducerInit, beforeAllAsync } diff --git a/admin-ui/plugins/jans-link/components/CacheRefresh/BindPasswordModal.js b/admin-ui/plugins/jans-link/components/CacheRefresh/BindPasswordModal.js deleted file mode 100644 index 0f7540a17b..0000000000 --- a/admin-ui/plugins/jans-link/components/CacheRefresh/BindPasswordModal.js +++ /dev/null @@ -1,109 +0,0 @@ -import React, { useContext } from "react"; -import { useTranslation } from "react-i18next"; -import { - Button, - Modal, - ModalHeader, - ModalBody, - ModalFooter, - Row, -} from "reactstrap"; -import applicationstyle from "Routes/Apps/Gluu/styles/applicationstyle"; -import { ThemeContext } from "Context/theme/themeContext"; -import GluuInputRow from "Routes/Apps/Gluu/GluuInputRow"; -import { FormGroup } from "Components"; -import { useFormik } from "formik"; - -const BindPasswordModal = ({ handler, isOpen, handleChangePassword }) => { - const { t } = useTranslation(); - const theme = useContext(ThemeContext); - const selectedTheme = theme.state.theme; - const formik = useFormik({ - initialValues: { - new_password: "", - confirm_new_password: "", - isValid: true, - errorMessage: "", - }, - setFieldValue: (field) => { - delete values[field]; - }, - }); - - const handleSetNewPassword = () => { - if (formik.values.new_password !== formik.values.confirm_new_password) { - formik.setFieldValue( - "errorMessage", - `${t("messages.both_password_should_match")}.` - ); - formik.setFieldValue("isValid", false); - return; - } - handler(); - handleChangePassword(formik.values.new_password); - }; - - return ( - - -

- {t("titles.change_backend_bind_password")} -

-
- - - - - - - - - {!formik.values.isValid && ( -
{formik.values.errorMessage}
- )} -
-
- - - - -
- ); -}; - -export default BindPasswordModal; diff --git a/admin-ui/plugins/jans-link/components/CacheRefresh/JansLinkPage.js b/admin-ui/plugins/jans-link/components/CacheRefresh/JansLinkPage.js deleted file mode 100644 index 4a40dcc713..0000000000 --- a/admin-ui/plugins/jans-link/components/CacheRefresh/JansLinkPage.js +++ /dev/null @@ -1,60 +0,0 @@ -import React, { useEffect } from "react"; -import SetTitle from "Utils/SetTitle"; -import GluuLoader from "Routes/Apps/Gluu/GluuLoader"; -import { Card, CardBody } from "Components"; -import GluuTabs from "Routes/Apps/Gluu/GluuTabs"; -import ConfigurationTab from "../Tabs/ConfigurationTab"; -import CustomerBackendKeyTab from "../Tabs/CustomerBackendKeyTab"; -import SourceBackendServersTab from "../Tabs/SourceBackendServersTab"; -import InumDBServerTab from "../Tabs/InumDBServerTab"; -import applicationStyle from "Routes/Apps/Gluu/styles/applicationstyle"; -import { useDispatch, useSelector } from "react-redux"; -import { getCacheRefreshConfiguration } from "Plugins/jans-link/redux/features/CacheRefreshSlice"; -import { useTranslation } from "react-i18next"; - -const JansLinkPage = () => { - const { t } = useTranslation(); - const dispatch = useDispatch(); - const isLoading = useSelector((state) => state.cacheRefreshReducer.loading); - SetTitle(t("titles.jans_ink")); - - useEffect(() => { - dispatch(getCacheRefreshConfiguration()); - }, []); - - const tabNames = [ - { name: t("menus.configuration"), path: '/jans-link/configuration' }, - { name: t("menus.customer_backend_key_attributes"), path: '/jans-link/customer-backend-key-attributes' }, - { name: t("menus.source_backend_ldap_servers"), path: '/jans-link/source-backend-ldap-servers' }, - { name: t("menus.inum_db_server"), path: '/jans-link/inum-db-server' }, - ]; - - const tabToShow = (tabName) => { - switch (tabName) { - case t("menus.configuration"): - return ; - case t("menus.customer_backend_key_attributes"): - return ; - case t("menus.source_backend_ldap_servers"): - return ; - case t("menus.inum_db_server"): - return ; - } - }; - - return ( - - - - - {!isLoading && ( - - )} - - - - - ); -}; - -export default JansLinkPage; diff --git a/admin-ui/plugins/jans-link/components/CacheRefresh/JansLinkPage.test.js b/admin-ui/plugins/jans-link/components/CacheRefresh/JansLinkPage.test.js deleted file mode 100644 index 090e22860d..0000000000 --- a/admin-ui/plugins/jans-link/components/CacheRefresh/JansLinkPage.test.js +++ /dev/null @@ -1,110 +0,0 @@ -import React from "react"; -import { - render, - screen, - waitFor, -} from "@testing-library/react"; -import AppTestWrapper from "Routes/Apps/Gluu/Tests/Components/AppTestWrapper.test"; -import JansLinkPage from "./JansLinkPage"; -import { t } from "i18next"; -import { Provider } from "react-redux"; -import { combineReducers, createStore } from "redux"; -import userEvent from "@testing-library/user-event"; - -const cachRefreshState = { - loading: false, - configuration: { - updateMethod: null, - snapshotFolder: null, - snapshotMaxCount: null, - ldapSearchSizeLimit: null, - keepExternalPerson: null, - serverIpAddress: null, - pollingInterval: null, - linkEnabled: null, - attributeMapping: [], - problemCount: null, - lastUpdateCount: null, - }, -}; - -const ldapReducer = { - loading: false -} - -const store = createStore( - combineReducers({ - noReducer: (state = {}) => state, - cacheRefreshReducer: (state = cachRefreshState) => state, - ldapReducer: (state = ldapReducer) => state - }) -); - -const Wrapper = ({ children }) => ( - - {children} - -); - -const pageRenderSetup = () => { - render(, { - wrapper: Wrapper, - }); -}; - -it("Should render cache refresh management page properly", () => { - render(, { - wrapper: Wrapper, - }); - - const cacheRefreshLink = screen.getByText(`${t("menus.configuration")}`); - expect(cacheRefreshLink).toBeInTheDocument(); - - const customerBackendKeyAttributesLink = screen.getByText( - `${t("menus.customer_backend_key_attributes")}` - ); - expect(customerBackendKeyAttributesLink).toBeInTheDocument(); - - const inumDbServerLink = screen.getByText(`${t("menus.inum_db_server")}`); - expect(inumDbServerLink).toBeInTheDocument(); - - const sourceBackendLdapServersLink = screen.getByText( - `${t("menus.source_backend_ldap_servers")}` - ); - expect(sourceBackendLdapServersLink).toBeInTheDocument(); -}); - -it("Should display change password modal", async () => { - render(, { - wrapper: Wrapper, - }); - - const sourceBackendLdapServersLink = screen.getByText( - `${t("menus.source_backend_ldap_servers")}` - ); - expect(sourceBackendLdapServersLink).toBeInTheDocument(); - userEvent.click(sourceBackendLdapServersLink); - - await waitFor(async () => { - const addSourceServerBtn = screen.getByText("Add source LDAP server", { - exact: false, - }); - expect(addSourceServerBtn).toBeInTheDocument(); - userEvent.click(addSourceServerBtn); - - await waitFor(async () => { - const changePasswordBtn = screen.getByText("Change Bind Password", { - exact: false, - }); - expect(changePasswordBtn).toBeInTheDocument(); - userEvent.click(changePasswordBtn); - await waitFor(async () => { - expect( - screen.getByTestId("Change Backend Bind Password", { - exact: false, - }) - ).toBeInTheDocument(); - }); - }); - }); -}); diff --git a/admin-ui/plugins/jans-link/components/SourceBackendServers/SourceBackendServerForm.js b/admin-ui/plugins/jans-link/components/SourceBackendServers/SourceBackendServerForm.js deleted file mode 100644 index b010dc39fc..0000000000 --- a/admin-ui/plugins/jans-link/components/SourceBackendServers/SourceBackendServerForm.js +++ /dev/null @@ -1,407 +0,0 @@ -import React, { useContext, useEffect, useState } from 'react' -import { buildPayload } from 'Utils/PermChecker' -import { - testLdap, - resetTestLdap, -} from 'Plugins/services/redux/features/ldapSlice' -import { updateToast } from 'Redux/features/toastSlice' -import { ThemeContext } from 'Context/theme/themeContext' -import { useDispatch, useSelector } from 'react-redux' -import { useFormik } from 'formik' -import { Row, Col, Form, FormGroup, Button, Card, CardBody } from 'Components' -import GluuProperties from 'Routes/Apps/Gluu/GluuProperties' -import GluuLabel from 'Routes/Apps/Gluu/GluuLabel' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import { Box } from '@mui/material' -import BindPasswordModal from '../CacheRefresh/BindPasswordModal' -import GluuToogleRow from 'Routes/Apps/Gluu/GluuToogleRow' -import * as Yup from 'yup' -import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter' -import { isEmpty } from 'lodash' -import { - putCacheRefreshConfiguration, - toggleSavedFormFlag, -} from 'Plugins/jans-link/redux/features/CacheRefreshSlice' -import { useTranslation } from 'react-i18next' -import { useLocation, useNavigate } from 'react-router' -import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog' -import applicationStyle from 'Routes/Apps/Gluu/styles/applicationstyle' -import GluuLoader from 'Routes/Apps/Gluu/GluuLoader' - -export const isStringsArray = (arr) => arr.every((i) => typeof i === 'string') -export const convertToStringArray = (arr) => { - return arr.map((item) => item.value) -} - -const SourceBackendServerForm = () => { - const sourceConfig = useLocation().state?.sourceConfig - const navigate = useNavigate() - const { t } = useTranslation() - const theme = useContext(ThemeContext) - const selectedTheme = theme.state.theme - const cacheRefreshConfiguration = useSelector( - (state) => state.cacheRefreshReducer.configuration - ) - const loading = useSelector((state) => state.cacheRefreshReducer.loading) - const loadingTest = useSelector((state) => state.ldapReducer.loading) - const savedForm = useSelector((state) => state.cacheRefreshReducer.savedForm) - const [password, setPassword] = useState(sourceConfig?.bindPassword || null) - const userAction = {} - const { testStatus } = useSelector((state) => state.ldapReducer) - const [testRunning, setTestRunning] = useState(false) - const dispatch = useDispatch() - const [modal, setModal] = useState(false) - const toggle = () => { - setModal(!modal) - } - - const [auditModal, setAuditModal] = useState(false) - const toggleAudit = () => { - setAuditModal(!auditModal) - } - - const initialValues = { - sourceConfigs: { - ...sourceConfig, - servers: sourceConfig?.servers || [], - baseDNs: sourceConfig?.baseDNs || [], - bindPassword: sourceConfig?.bindPassword || null, - configId: sourceConfig?.configId || '', - bindDN: sourceConfig?.bindDN || '', - maxConnections: sourceConfig?.maxConnections || null, - enabled: sourceConfig?.enabled || false, - }, - } - - const validationSchema = Yup.object({ - sourceConfigs: Yup.object().shape({ - configId: Yup.string() - .min(2, 'Mininum 2 characters') - .required(`${t('fields.name')} ${t('messages.is_required')}`), - bindDN: Yup.string() - .min(2, 'Mininum 2 characters') - .required(`${t('fields.bind_dn')} ${t('messages.is_required')}`), - maxConnections: Yup.string().required( - `${t('fields.max_connections')} ${t('messages.is_required')}` - ), - servers: Yup.array().min( - 1, - `${t('fields.server_port')} ${t('messages.is_required')}` - ), - baseDNs: Yup.array().min( - 1, - `${t('fields.base_dns')} ${t('messages.is_required')}` - ), - }), - }) - - const handleChangePassword = (updatedPassword) => { - setPassword(updatedPassword) - } - - function checkLdapConnection() { - const testPromise = new Promise(function (resolve, reject) { - dispatch(resetTestLdap()) - resolve() - }) - - testPromise.then(() => { - setTestRunning(true) - dispatch(testLdap({ data: formik.values.sourceConfigs })) - }) - } - - useEffect(() => { - if (testStatus === null || !testRunning) { - return - } - if (testStatus) { - dispatch( - updateToast(true, 'success', `${t('messages.ldap_connection_success')}`) - ) - } else { - dispatch( - updateToast(true, 'error', `${t('messages.ldap_connection_error')}`) - ) - } - }, [testStatus]) - - const submitForm = (userMessage) => { - toggleAudit() - const baseDNs = isStringsArray(formik.values.sourceConfigs.baseDNs || []) - ? formik.values.sourceConfigs.baseDNs - : convertToStringArray(formik.values?.sourceConfigs.baseDNs || []) - const servers = isStringsArray(formik.values.sourceConfigs.servers || []) - ? formik.values.sourceConfigs.servers - : convertToStringArray(formik.values?.sourceConfigs.servers || []) - - let payload - - if (!sourceConfig?.configId) { - const sourceConfigs = [...(cacheRefreshConfiguration.sourceConfigs || [])] - payload = [ - ...sourceConfigs, - { - ...formik.values.sourceConfigs, - baseDNs: baseDNs, - servers: servers, - bindPassword: password, - }, - ] - } else { - payload = cacheRefreshConfiguration.sourceConfigs?.map((config) => { - return config.configId === sourceConfig.configId - ? { - ...config, - ...formik.values.sourceConfigs, - baseDNs: baseDNs, - servers: servers, - bindPassword: password, - } - : config - }) - } - - buildPayload(userAction, userMessage, { - appConfiguration2: { - ...cacheRefreshConfiguration, - sourceConfigs: payload, - }, - }) - - dispatch(putCacheRefreshConfiguration({ action: userAction })) - toggleAudit() - } - - const formik = useFormik({ - initialValues: initialValues, - validationSchema: validationSchema, - onSubmit: (data) => { - if (isEmpty(formik.errors)) { - toggleAudit() - } - }, - }) - - useEffect(() => { - if (savedForm) { - navigate('/jans-link/source-backend-ldap-servers') - } - - return () => { - dispatch(toggleSavedFormFlag(false)) - } - }, [savedForm]) - - return ( - <> - - - -
{ - e.preventDefault() - formik.handleSubmit() - }} - className='mt-4' - > - - - {sourceConfig?.enabled && ( - - )} - - <> - - - - - - - - - - - - - - ({ - key: '', - value: item, - }) - ) - : [] - } - isKeys={false} - buttonText='actions.add_server' - showError={ - formik.errors.sourceConfigs?.servers && - formik.touched.sourceConfigs?.servers - } - errorMessage={formik.errors.sourceConfigs?.servers} - /> - - - - - - - - ({ - key: '', - value: item, - }) - ) - : [] - } - isKeys={false} - buttonText='actions.add_base_dn' - showError={ - formik.errors.sourceConfigs?.baseDNs && - formik.touched.sourceConfigs?.baseDNs - } - errorMessage={formik.errors.sourceConfigs?.baseDNs} - /> - - - - - - - - - - { - formik.setFieldValue( - 'sourceConfigs.useSSL', - e.target.checked - ) - }} - lsize={4} - rsize={8} - value={formik.values.sourceConfigs?.useSSL} - doc_category='jans_link' - /> - - - { - formik.setFieldValue( - 'sourceConfigs.enabled', - e.target.checked - ) - }} - lsize={4} - rsize={8} - value={formik.values.sourceConfigs?.enabled} - doc_category='jans_link' - /> - - - - - - - - - {modal && ( - - )} - -
-
- -
- - ) -} - -export default SourceBackendServerForm diff --git a/admin-ui/plugins/jans-link/components/Tabs/ConfigurationTab.js b/admin-ui/plugins/jans-link/components/Tabs/ConfigurationTab.js deleted file mode 100644 index 25aa85c012..0000000000 --- a/admin-ui/plugins/jans-link/components/Tabs/ConfigurationTab.js +++ /dev/null @@ -1,314 +0,0 @@ -import React, { useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { useFormik } from 'formik' -import { Row, Col, Form, FormGroup } from 'Components' -import GluuProperties from 'Routes/Apps/Gluu/GluuProperties' -import GluuLabel from 'Routes/Apps/Gluu/GluuLabel' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import GluuSelectRow from 'Routes/Apps/Gluu/GluuSelectRow' -import GluuToogleRow from 'Routes/Apps/Gluu/GluuToogleRow' -import * as Yup from 'yup' -import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter' -import { isEmpty } from 'lodash' -import { putCacheRefreshConfiguration } from 'Plugins/jans-link/redux/features/CacheRefreshSlice' -import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog' -import { useTranslation } from 'react-i18next' -import { buildPayload } from 'Utils/PermChecker' -import moment from 'moment/moment' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const ConfigurationTab = () => { - const { t } = useTranslation() - const dispatch = useDispatch() - const cacheRefreshConfiguration = useSelector( - (state) => state.cacheRefreshReducer.configuration - ) - const userAction = {} - const [modal, setModal] = useState(false) - const toggle = () => { - setModal(!modal) - } - - const { - updateMethod = null, - snapshotFolder = null, - snapshotMaxCount = null, - ldapSearchSizeLimit = null, - keepExternalPerson = null, - serverIpAddress = null, - pollingInterval = null, - linkEnabled = null, - attributeMapping = [], - problemCount = null, - lastUpdateCount = null, - lastUpdate = null, - loggingLevel = '', - useSearchLimit = false - } = useSelector((state) => state.cacheRefreshReducer.configuration) - - const initialValues = { - updateMethod, - snapshotFolder, - snapshotMaxCount, - ldapSearchSizeLimit, - keepExternalPerson, - serverIpAddress, - pollingInterval, - linkEnabled, - attributeMapping, - problemCount, - lastUpdateCount, - lastUpdate, - loggingLevel, - useSearchLimit - } - - const formik = useFormik({ - initialValues: initialValues, - enableReinitialize: true, - validationSchema: Yup.object({ - snapshotMaxCount: Yup.mixed().required( - `${t('fields.snapshots_count')} ${t('messages.is_required')}` - ), - snapshotFolder: Yup.string().required( - `${t('fields.snapshot_folder')} ${t('messages.is_required')}` - ), - updateMethod: Yup.string().required( - `${t('fields.refresh_method')} ${t('messages.is_required')}` - ), - attributeMapping: Yup.array().min( - 1, - `${t('fields.mandatory_fields_required')}` - ), - }), - onSubmit: () => { - if (isEmpty(formik.errors)) { - toggle() - } - }, - }) - - const submitForm = (userMessage) => { - toggle() - - buildPayload(userAction, userMessage, { - appConfiguration2: { - ...cacheRefreshConfiguration, - ...formik.values, - attributeMapping: formik.values.attributeMapping?.length - ? formik.values.attributeMapping.map((attribute) => { - return { - source: attribute.source, - destination: attribute.destination, - } - }) - : [], - }, - }) - - dispatch( - putCacheRefreshConfiguration({ action: userAction }) - ) - } - - return ( - <> -
{ - e.preventDefault() - formik.handleSubmit() - }} - className='mt-4' - > - - - - - {formik.values.lastUpdate ? moment(formik.values.lastUpdate).format('YYYY-MM-DD HH:mm:ss') : null} - - - - - - {formik.values.lastUpdateCount} - - - - - - {formik.values.problemCount} - - - - - - - - - - - - - ({ - source, - destination, - }) - ) - : [] - } - isKeys={false} - buttonText='actions.add_attribute_mapping' - showError={ - formik.errors.attributeMapping && - formik.touched.attributeMapping - } - errorMessage={formik.errors.attributeMapping} - /> - - - - - - - - - - - { - formik.setFieldValue('keepExternalPerson', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.keepExternalPerson} - /> - - - - - - - - - { - formik.setFieldValue('linkEnabled', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.linkEnabled} - /> - - - { - formik.setFieldValue('useSearchLimit', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.useSearchLimit} - /> - - - - - - - - - - - ) -} - -export default ConfigurationTab diff --git a/admin-ui/plugins/jans-link/components/Tabs/CustomerBackendKeyTab.js b/admin-ui/plugins/jans-link/components/Tabs/CustomerBackendKeyTab.js deleted file mode 100644 index aef5fb39ec..0000000000 --- a/admin-ui/plugins/jans-link/components/Tabs/CustomerBackendKeyTab.js +++ /dev/null @@ -1,214 +0,0 @@ -import React, { useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { useFormik } from 'formik' -import { Row, Col, Form, FormGroup } from 'Components' -import GluuProperties from 'Routes/Apps/Gluu/GluuProperties' -import GluuLabel from 'Routes/Apps/Gluu/GluuLabel' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter' -import * as Yup from 'yup' -import { t } from 'i18next' -import { isEmpty } from 'lodash' -import { putCacheRefreshConfiguration } from 'Plugins/jans-link/redux/features/CacheRefreshSlice' -import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog' -import { buildPayload } from 'Utils/PermChecker' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const isStringsArray = (arr) => arr.every((i) => typeof i === 'string') -const convertToStringArray = (arr) => { - return arr.map((item) => item.value) -} - -const CustomerBackendKeyTab = () => { - const dispatch = useDispatch() - const cacheRefreshConfiguration = useSelector( - (state) => state.cacheRefreshReducer.configuration - ) - const [modal, setModal] = useState(false) - const toggle = () => { - setModal(!modal) - } - - const { - keyAttributes = [], - keyObjectClasses = [], - sourceAttributes = [], - customLdapFilter = '', - } = useSelector((state) => state.cacheRefreshReducer.configuration) - const initialValues = { - keyAttributes, - keyObjectClasses, - sourceAttributes, - customLdapFilter, - } - const userAction = {} - const formik = useFormik({ - initialValues: initialValues, - setFieldValue: (field) => { - delete values[field] - }, - validationSchema: Yup.object({ - keyAttributes: Yup.array().min( - 1, - `${t('fields.key_attribute')} ${t('messages.is_required')}` - ), - keyObjectClasses: Yup.array().min( - 1, - `${t('fields.object_class')} ${t('messages.is_required')}` - ), - sourceAttributes: Yup.array().min( - 1, - `${t('fields.source_attribute')} ${t('messages.is_required')}` - ), - }), - onSubmit: (data) => { - if (isEmpty(formik.errors)) { - toggle() - } - }, - }) - - const submitForm = (userMessage) => { - toggle() - - buildPayload(userAction, userMessage, { - appConfiguration2: { - ...cacheRefreshConfiguration, - ...formik.values, - sourceAttributes: isStringsArray(formik.values?.sourceAttributes || []) - ? formik.values.sourceAttributes - : convertToStringArray(formik.values?.sourceAttributes || []), - keyObjectClasses: isStringsArray(formik.values.keyObjectClasses || []) - ? formik.values.keyObjectClasses - : convertToStringArray(formik.values?.keyObjectClasses || []), - keyAttributes: isStringsArray(formik.values.keyAttributes || []) - ? formik.values.keyAttributes - : convertToStringArray(formik.values?.keyAttributes || []), - }, - }) - dispatch( - putCacheRefreshConfiguration({ action: userAction }) - ) - } - - return ( -
{ - e.preventDefault() - formik.handleSubmit() - }} - className='mt-4' - > - - - - - - ({ - key: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_key_attribute' - showError={ - formik.errors.keyAttributes && formik.touched.keyAttributes - } - errorMessage={formik.errors.keyAttributes} - /> - - - - - - - - ({ - key: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_object_class' - showError={ - formik.errors.keyObjectClasses && - formik.touched.keyObjectClasses - } - errorMessage={formik.errors.keyObjectClasses} - /> - - - - - - - - ({ - key: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_source_attribute' - showError={ - formik.errors.sourceAttributes && - formik.touched.sourceAttributes - } - errorMessage={formik.errors.sourceAttributes} - /> - - - - - - - - - - - - - - - ) -} - -export default CustomerBackendKeyTab diff --git a/admin-ui/plugins/jans-link/components/Tabs/InumDBServerTab.js b/admin-ui/plugins/jans-link/components/Tabs/InumDBServerTab.js deleted file mode 100644 index 339e093148..0000000000 --- a/admin-ui/plugins/jans-link/components/Tabs/InumDBServerTab.js +++ /dev/null @@ -1,337 +0,0 @@ -import { useFormik } from 'formik' -import React, { useContext, useState } from 'react' -import { Row, Col, Form, FormGroup, Button } from 'Components' -import GluuInputRow from 'Routes/Apps/Gluu/GluuInputRow' -import GluuToogleRow from 'Routes/Apps/Gluu/GluuToogleRow' -import { useDispatch, useSelector } from 'react-redux' -import GluuProperties from 'Routes/Apps/Gluu/GluuProperties' -import GluuLabel from 'Routes/Apps/Gluu/GluuLabel' -import { t } from 'i18next' -import { ThemeContext } from 'Context/theme/themeContext' -import BindPasswordModal from '../CacheRefresh/BindPasswordModal' -import * as Yup from 'yup' -import GluuCommitFooter from 'Routes/Apps/Gluu/GluuCommitFooter' -import { isEmpty } from 'lodash' -import { putCacheRefreshConfiguration } from 'Plugins/jans-link/redux/features/CacheRefreshSlice' -import GluuCommitDialog from 'Routes/Apps/Gluu/GluuCommitDialog' -import { buildPayload } from 'Utils/PermChecker' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const isStringsArray = (arr) => arr.every((i) => typeof i === 'string') -const convertToStringArray = (arr) => { - return arr.map((item) => item.value) -} - -const InumDBServerTab = () => { - const theme = useContext(ThemeContext) - const selectedTheme = theme.state.theme - const dispatch = useDispatch() - const cacheRefreshConfiguration = useSelector( - (state) => state.cacheRefreshReducer.configuration - ) - const { defaultInumServer, targetConfig } = useSelector( - (state) => state.cacheRefreshReducer.configuration - ) - const userAction = {} - const initialValues = { - defaultInumServer: defaultInumServer || false, - targetConfig: { - ...targetConfig, - servers: targetConfig?.servers || [], - baseDNs: targetConfig?.baseDNs || [], - bindPassword: targetConfig?.bindPassword || null, - configId: targetConfig?.configId || null, - bindDN: targetConfig?.bindDN || null - }, - } - - const [modal, setModal] = useState(false) - const toggle = () => { - setModal(!modal) - } - - const [auditModal, setAuditModal] = useState(false) - const toggleAudit = () => { - setAuditModal(!auditModal) - } - - const formik = useFormik({ - initialValues: initialValues, - validationSchema: Yup.object({ - defaultInumServer: Yup.boolean(), - targetConfig: Yup.object() - .shape() - .when('defaultInumServer', { - is: false, - then: () => - Yup.object({ - configId: Yup.string().min(2, 'Mininum 2 characters').required( - `${t('fields.name')} ${t('messages.is_required')}` - ), - bindDN: Yup.string().min(2, 'Mininum 2 characters').required( - `${t('fields.bind_dn')} ${t('messages.is_required')}` - ), - maxConnections: Yup.string().required( - `${t('fields.max_connections')} ${t('messages.is_required')}` - ), - servers: Yup.array().min( - 1, - `${t('fields.server_port')} ${t('messages.is_required')}` - ), - baseDNs: Yup.array().min( - 1, - `${t('fields.base_dns')} ${t('messages.is_required')}` - ), - }), - }), - }), - setFieldValue: (field) => { - delete values[field] - }, - onSubmit: (data) => { - if (isEmpty(formik.errors)) { - toggleAudit() - } - }, - }) - - const submitForm = (userMessage) => { - toggleAudit() - - buildPayload(userAction, userMessage, { - appConfiguration2: { - ...cacheRefreshConfiguration, - targetConfig: { - ...formik.values.targetConfig, - baseDNs: isStringsArray(formik.values?.targetConfig?.baseDNs || []) - ? formik.values.targetConfig.baseDNs - : convertToStringArray(formik.values?.targetConfig.baseDNs || []), - servers: isStringsArray(formik.values?.targetConfig?.servers || []) - ? formik.values.targetConfig.servers - : convertToStringArray(formik.values?.targetConfig?.servers || []), - }, - defaultInumServer: formik.values.defaultInumServer, - }, - }) - - dispatch( - putCacheRefreshConfiguration({ action: userAction }) - ) - } - - const handleChangePassword = (updatedPassword) => { - buildPayload(userAction, 'CHANGE INUMDB BIND PASSWORD', { - appConfiguration2: { - ...cacheRefreshConfiguration, - targetConfig: { - ...formik.values.targetConfig, - baseDNs: isStringsArray(formik.values?.targetConfig?.baseDNs || []) - ? formik.values.targetConfig.baseDNs - : convertToStringArray(formik.values?.targetConfig?.baseDNs || []), - servers: isStringsArray(formik.values?.targetConfig?.servers || []) - ? formik.values.targetConfig.servers - : convertToStringArray(formik.values?.targetConfig?.servers || []), - bindPassword: updatedPassword, - }, - }, - }) - - dispatch( - putCacheRefreshConfiguration({ action: userAction }) - ) - } - - return ( -
{ - e.preventDefault() - formik.handleSubmit() - }} - className='mt-4' - > - - - { - formik.setFieldValue('defaultInumServer', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.defaultInumServer} - doc_category={null} - /> - - {!formik.values.defaultInumServer && ( - <> - - - - - - - - - - - - - - ({ - key: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_server' - showError={ - formik.errors.targetConfig?.servers && formik.touched.targetConfig?.servers ? true : false - } - errorMessage={formik.errors.targetConfig?.servers} - /> - - - - - - - - ({ - key: '', - value: item, - })) - : [] - } - isKeys={false} - buttonText='actions.add_base_dn' - showError={ - formik.errors.targetConfig?.baseDNs && formik.touched.targetConfig?.baseDNs ? true : false - } - errorMessage={formik.errors.targetConfig?.baseDNs} - /> - - - - - - - - - - { - formik.setFieldValue('targetConfig.useSSL', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.targetConfig?.useSSL} - doc_category='jans_link' - /> - - - { - formik.setFieldValue('targetConfig.enabled', e.target.checked) - }} - lsize={3} - rsize={9} - value={formik.values.targetConfig?.enabled} - doc_category='jans_link' - /> - - - )} - - - - - - - {modal && ( - - )} - - - ) -} - -export default InumDBServerTab diff --git a/admin-ui/plugins/jans-link/components/Tabs/SourceBackendServersTab.js b/admin-ui/plugins/jans-link/components/Tabs/SourceBackendServersTab.js deleted file mode 100644 index dd687a3e58..0000000000 --- a/admin-ui/plugins/jans-link/components/Tabs/SourceBackendServersTab.js +++ /dev/null @@ -1,144 +0,0 @@ -import React, { useCallback, useContext, useEffect, useState } from 'react' -import { ThemeContext } from 'Context/theme/themeContext' -import { useDispatch, useSelector } from 'react-redux' -import applicationStyle from 'Routes/Apps/Gluu/styles/applicationstyle' -import MaterialTable from '@material-table/core' -import { Paper } from '@mui/material' -import { DeleteOutlined } from '@mui/icons-material' -import { useNavigate } from 'react-router' -import getThemeColor from 'Context/theme/config' -import { useTranslation } from 'react-i18next' -import GluuViewWrapper from 'Routes/Apps/Gluu/GluuViewWrapper' -import GluuDialog from 'Routes/Apps/Gluu/GluuDialog' -import { putCacheRefreshConfiguration } from 'Plugins/jans-link/redux/features/CacheRefreshSlice' -import { buildPayload } from 'Utils/PermChecker' -import { adminUiFeatures } from 'Plugins/admin/helper/utils' - -const SourceBackendServersTab = () => { - const { t } = useTranslation() - const theme = useContext(ThemeContext) - const navigate = useNavigate() - const selectedTheme = theme.state.theme - const themeColors = getThemeColor(selectedTheme) - const bgThemeColor = { background: themeColors.background } - let actions = [] - const dispatch = useDispatch() - const cacheRefreshConfiguration = useSelector( - (state) => state.cacheRefreshReducer.configuration - ) - const userAction = {} - const [item, setItem] = useState({}) - const [modal, setModal] = useState(false) - const toggle = () => setModal(!modal) - const { sourceConfigs } = useSelector( - (state) => state.cacheRefreshReducer.configuration - ) - const loading = useSelector((state) => state.ldapReducer.loading) - - const tableColumns = [ - { field: 'configId', title: `${t('fields.name')}` }, - { field: 'enabled', title: `${t('fields.enabled')}` }, - ] - - const navigateToEdit = (rowData) => { - delete rowData?.tableData - navigate('/jans-link/source-backend-ldap-servers/edit', { state: { sourceConfig: rowData } }) - } - - const deleteConfig = (data) => { - setItem(data) - toggle() - } - - const navigateToAdd = () => { - navigate('/jans-link/source-backend-ldap-servers/add') - } - - actions.push((rowData) => ({ - icon: 'edit', - iconProps: { - id: 'editClient' + rowData.configId, - }, - tooltip: `${t('messages.edit_configuration')}`, - onClick: (event, rowData) => navigateToEdit(rowData), - disabled: false, - })) - - actions.push((rowData) => ({ - icon: DeleteIcon, - iconProps: { - color: 'secondary', - id: 'deleteClient' + rowData.configId, - }, - tooltip: `${t('messages.delete_configuration')}`, - onClick: (event, rowData) => deleteConfig(rowData), - disabled: false, - })) - - actions.push({ - icon: 'add', - tooltip: `${t('messages.add_configuration')}`, - iconProps: { color: 'primary' }, - isFreeAction: true, - onClick: () => navigateToAdd(), - }) - - const PaperContainer = useCallback( - (props) => , - [] - ) - - const DeleteIcon = useCallback( - (props) => , - [] - ) - - function onDeletionConfirmed(message) { - const sourceConfigs = cacheRefreshConfiguration?.sourceConfigs?.filter((config) => config.configId !== item.configId) - buildPayload(userAction, message, { - appConfiguration2: { - ...cacheRefreshConfiguration, - sourceConfigs: sourceConfigs, - }, - }) - dispatch(putCacheRefreshConfiguration({ action: userAction })) - toggle() - } - - return ( - <> - - - - - - ) -} - -export default SourceBackendServersTab diff --git a/admin-ui/plugins/jans-link/plugin-metadata.js b/admin-ui/plugins/jans-link/plugin-metadata.js deleted file mode 100644 index d161c1f670..0000000000 --- a/admin-ui/plugins/jans-link/plugin-metadata.js +++ /dev/null @@ -1,59 +0,0 @@ -import { JANS_LINK_READ, JANS_LINK_WRITE } from "Utils/PermChecker"; -import JansLinkPage from "./components/CacheRefresh/JansLinkPage"; -import cacheRefreshReducer from "./redux/features/CacheRefreshSlice"; -import cacheRefreshSaga from "./redux/sagas/CacheRefreshSaga"; -import SourceBackendServerForm from "./components/SourceBackendServers/SourceBackendServerForm"; - -const PLUGIN_BASE_PATH = "/jans-link"; - -const pluginMetadata = { - menus: [ - { - title: "menus.jans_link", - icon: "jans_link", - path: PLUGIN_BASE_PATH, - permission: JANS_LINK_READ, - }, - ], - routes: [ - { - component: JansLinkPage, - path: PLUGIN_BASE_PATH, - permission: JANS_LINK_WRITE, - }, - { - component: SourceBackendServerForm, - path: `${PLUGIN_BASE_PATH}/source-backend-ldap-servers/edit`, - permission: JANS_LINK_WRITE, - }, - { - component: SourceBackendServerForm, - path: `${PLUGIN_BASE_PATH}/source-backend-ldap-servers/add`, - permission: JANS_LINK_WRITE, - }, - { - component: JansLinkPage, - path: `${PLUGIN_BASE_PATH}/configuration`, - permission: JANS_LINK_WRITE, - }, - { - component: JansLinkPage, - path: `${PLUGIN_BASE_PATH}/customer-backend-key-attributes`, - permission: JANS_LINK_WRITE, - }, - { - component: JansLinkPage, - path: `${PLUGIN_BASE_PATH}/source-backend-ldap-servers`, - permission: JANS_LINK_WRITE, - }, - { - component: JansLinkPage, - path: `${PLUGIN_BASE_PATH}/inum-db-server`, - permission: JANS_LINK_WRITE, - }, - ], - reducers: [{ name: 'cacheRefreshReducer', reducer: cacheRefreshReducer }], - sagas: [cacheRefreshSaga()], -}; - -export default pluginMetadata; diff --git a/admin-ui/plugins/jans-link/redux/api/CacheRefreshApi.js b/admin-ui/plugins/jans-link/redux/api/CacheRefreshApi.js deleted file mode 100644 index 5cfd34527d..0000000000 --- a/admin-ui/plugins/jans-link/redux/api/CacheRefreshApi.js +++ /dev/null @@ -1,23 +0,0 @@ -import { handleResponse } from 'Utils/ApiUtils' - -export default class CacheRefreshApi { - constructor(api) { - this.api = api - } - - getPropertiesCacheRefresh = () => { - return new Promise((resolve, reject) => { - this.api.getJansLinkProperties((error, data) => { - handleResponse(error, reject, resolve, data) - }) - }) - } - - updateCacheRefreshConfig = (input) => { - return new Promise((resolve, reject) => { - this.api.putJansLinkProperties(input, (error, data) => { - handleResponse(error, reject, resolve, data) - }) - }) - } -} \ No newline at end of file diff --git a/admin-ui/plugins/jans-link/redux/features/CacheRefreshSlice.js b/admin-ui/plugins/jans-link/redux/features/CacheRefreshSlice.js deleted file mode 100644 index 90836e8d34..0000000000 --- a/admin-ui/plugins/jans-link/redux/features/CacheRefreshSlice.js +++ /dev/null @@ -1,39 +0,0 @@ -import reducerRegistry from 'Redux/reducers/ReducerRegistry' -import { createSlice } from '@reduxjs/toolkit' - -const initialState = { - configuration: {}, - loading: true, - savedForm: false, -} - -const cacheRefreshSlice = createSlice({ - name: 'cacheRefresh', - initialState: initialState, - reducers: { - getCacheRefreshConfiguration: (state) => { - state.loading = true - }, - getCacheRefreshConfigurationResponse: (state, action) => { - state.configuration = action.payload ? action.payload : {} - state.loading = false - }, - putCacheRefreshConfiguration: (state) => { - state.loading = true - }, - toggleSavedFormFlag: (state, action) => { - state.savedForm = action.payload || false - } - } -}) - -export const { - getCacheRefreshConfiguration, - getCacheRefreshConfigurationResponse, - putCacheRefreshConfiguration, - toggleSavedFormFlag -} = cacheRefreshSlice.actions - -export default cacheRefreshSlice.reducer - -reducerRegistry.register('cacheRefreshReducer', cacheRefreshSlice.reducer); diff --git a/admin-ui/plugins/jans-link/redux/sagas/CacheRefreshSaga.js b/admin-ui/plugins/jans-link/redux/sagas/CacheRefreshSaga.js deleted file mode 100644 index d1a9ef9fd7..0000000000 --- a/admin-ui/plugins/jans-link/redux/sagas/CacheRefreshSaga.js +++ /dev/null @@ -1,91 +0,0 @@ -import { initAudit } from "Redux/sagas/SagaUtils"; -import { getClient } from "Redux/api/base"; -import { isFourZeroOneError, addAdditionalData } from "Utils/TokenController"; -import { - call, - all, - put, - fork, - takeLatest, - select, - takeEvery, -} from "redux-saga/effects"; -import { postUserAction } from "Redux/api/backend-api"; -import { updateToast } from 'Redux/features/toastSlice' -import CacheRefreshApi from "../api/CacheRefreshApi" -import { - getCacheRefreshConfiguration, - getCacheRefreshConfigurationResponse, - toggleSavedFormFlag, -} from "../features/CacheRefreshSlice"; -import { getAPIAccessToken } from "Redux/features/authSlice"; -import { UPDATE } from "../../../../app/audit/UserActionType"; -import { triggerWebhook } from 'Plugins/admin/redux/sagas/WebhookSaga' - -const JansConfigApi = require("jans_config_api"); - -export const JANS_LINK = 'jans-link' - -function* newFunction() { - const token = yield select((state) => state.authReducer.token.access_token); - const issuer = yield select((state) => state.authReducer.issuer); - const api = new JansConfigApi.JansLinkConfigurationApi( - getClient(JansConfigApi, token, issuer) - ); - return new CacheRefreshApi(api); -} - -export function* getCacheRefreshSaga() { - const audit = yield* initAudit(); - try { - const cacheRefreshApi = yield* newFunction(); - const data = yield call(cacheRefreshApi.getPropertiesCacheRefresh); - yield put(getCacheRefreshConfigurationResponse(data)); - yield call(postUserAction, audit); - yield put(toggleSavedFormFlag(false)) - return data - } catch (e) { - yield put(getCacheRefreshConfigurationResponse(null)); - yield put(toggleSavedFormFlag(false)) - if (isFourZeroOneError(e)) { - const jwt = yield select((state) => state.authReducer.userinfo_jwt); - yield put(getAPIAccessToken(jwt)); - } - return e - } -} - -export function* editCacheConfig({ payload }) { - const audit = yield* initAudit(); - addAdditionalData(audit, UPDATE, JANS_LINK, payload) - try { - const cacheRefreshApi = yield* newFunction(); - const data = yield call(cacheRefreshApi.updateCacheRefreshConfig, payload.action.action_data); - yield put(updateToast(true, "success")); - yield put(getCacheRefreshConfiguration()); - yield put(toggleSavedFormFlag(true)) - yield call(postUserAction, audit); - yield* triggerWebhook({ payload: { createdFeatureValue: data } }) - return data - } catch (e) { - yield put(toggleSavedFormFlag(false)) - yield put(updateToast(true, "error")); - if (isFourZeroOneError(e)) { - const jwt = yield select((state) => state.authReducer.userinfo_jwt); - yield put(getAPIAccessToken(jwt)); - } - return e - } -} - -export function* watchGetCacheRefresh() { - yield takeEvery('cacheRefresh/getCacheRefreshConfiguration', getCacheRefreshSaga); -} - -export function* watchPutCacheRefreshConfig() { - yield takeLatest('cacheRefresh/putCacheRefreshConfiguration', editCacheConfig); -} - -export default function* rootSaga() { - yield all([fork(watchGetCacheRefresh), fork(watchPutCacheRefreshConfig)]); -}