Skip to content

Commit

Permalink
added easier way of setting up multitenant/partner/singletenant mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
KelvinTegelaar committed Apr 16, 2024
1 parent eeee870 commit 894c017
Show file tree
Hide file tree
Showing 3 changed files with 146 additions and 26 deletions.
43 changes: 19 additions & 24 deletions src/hooks/useRouteNavCompare.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,28 @@ import routes from 'src/routes'
export const useRouteNavCompare = (navigation) => {
const dispatch = useDispatch()
const { data: profile, isFetching } = useLoadClientPrincipalQuery()

if (isFetching) {
return { isLoading: true, component: null }
}

dispatch(updateAccessToken(profile))
const roles = profile?.clientPrincipal?.userRoles || []

if (roles.includes('superadmin')) {
// For 'superadmin', simplify to Dashboard and /cipp/ routes directly so people don't work under this account.
return navigation.filter((nav) => nav.to === '/home' || nav.to?.startsWith('/cipp'))
}
let roles = profile?.clientPrincipal?.userRoles || []
let newNavigation = navigation.map((nav) => {
if (nav.items) {
nav.items = nav.items.filter((item) => {
const route = routes.find((r) => r.path === item.to)
if (
!route ||
(route.allowedRoles && route.allowedRoles.some((role) => roles.includes(role)))
) {
return true
} else {
//console.log('Removing route', item)
return false
}
})
}
return nav
})

// For other roles, use existing filtering logic
return navigation
.map((nav) => {
if (nav.items) {
nav.items = nav.items.filter((item) => {
const route = routes.find((r) => r.path === item.to)
return (
route &&
(!route.allowedRoles || route.allowedRoles.some((role) => roles.includes(role)))
)
})
return nav
}
return nav
})
.filter((nav) => nav.items && nav.items.length > 0) // Remove empty navigation groups
return newNavigation
}
16 changes: 14 additions & 2 deletions src/views/cipp/app-settings/CIPPSettings.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import { SettingsMaintenance } from 'src/views/cipp/app-settings/SettingsMainten
import { SettingsExtensionMappings } from 'src/views/cipp/app-settings/SettingsExtensionMappings.jsx'
import { SettingsPartner } from 'src/views/cipp/app-settings/SettingsPartner.jsx'
import useQuery from 'src/hooks/useQuery.jsx'
import { SettingsSuperAdmin } from './SettingsSuperAdmin.jsx'
import { useLoadClientPrincipalQuery } from 'src/store/api/auth.js'

/**
* This function returns the settings page content for CIPP.
Expand All @@ -25,13 +27,13 @@ export default function CIPPSettings() {

const tab = queryString.get('tab')
const [active, setActiveTab] = useState(tab ? parseInt(tab) : 1)

const { data: profile, isFetching } = useLoadClientPrincipalQuery()
const setActive = (tab) => {
setActiveTab(tab)
queryString.set('tab', tab.toString())
navigate(`${location.pathname}?${queryString}`)
}

const superAdmin = profile?.clientPrincipal?.userRoles?.includes('superadmin')
return (
<CippPage title="Settings" tenantSelector={false}>
<CNav variant="tabs" role="tablist">
Expand Down Expand Up @@ -62,6 +64,11 @@ export default function CIPPSettings() {
<CNavItem active={active === 9} onClick={() => setActive(9)} href="#">
Extension Mappings
</CNavItem>
{superAdmin && (
<CNavItem active={active === 10} onClick={() => setActive(10)} href="#">
SuperAdmin Settings
</CNavItem>
)}
</CNav>
<CTabContent>
<CTabPane visible={active === 1} className="mt-3">
Expand Down Expand Up @@ -107,6 +114,11 @@ export default function CIPPSettings() {
<SettingsExtensionMappings />
</CippLazy>
</CTabPane>
<CTabPane visible={active === 10} className="mt-3">
<CippLazy visible={active === 10}>
<SettingsSuperAdmin />
</CippLazy>
</CTabPane>
</CTabContent>
</CippPage>
)
Expand Down
113 changes: 113 additions & 0 deletions src/views/cipp/app-settings/SettingsSuperAdmin.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { useGenericGetRequestQuery, useLazyGenericPostRequestQuery } from 'src/store/api/app.js'
import {
CButton,
CCallout,
CCard,
CCardBody,
CCardHeader,
CCol,
CForm,
CLink,
CRow,
CSpinner,
} from '@coreui/react'
import { Form } from 'react-final-form'
import { RFFCFormRadio } from 'src/components/forms/index.js'
import React from 'react'
import { CippCallout } from 'src/components/layout/index.js'

export function SettingsSuperAdmin() {
const partnerConfig = useGenericGetRequestQuery({
path: '/api/ExecPartnerMode',
params: { Action: 'ListCurrent' },
})

const [submitWebhook, webhookCreateResult] = useLazyGenericPostRequestQuery()

const onSubmit = (values) => {
submitWebhook({
path: '/api/ExecPartnerMode',
values: values,
}).then((res) => {})
}

return (
<CCard className="h-100">
<CCardHeader></CCardHeader>
<CCardBody>
<>
<>
<h3 className="underline mb-5">Super Admin Configuration</h3>
<CRow>
<CCol sm={12} md={6} lg={8} className="mb-3">
<p className="me-1">
The configuration settings below should only be modified by a super admin. Super
admins can configure what tenant mode CIPP operates in. See
<CLink
href="https://docs.cipp.app/setup/installation/owntenant"
target="_blank"
className="m-1"
>
our documentation
</CLink>
for more information on how to configure these modes and what they mean.
</p>
</CCol>
</CRow>
<CRow>
<CCol sm={12} md={12} className="mb-3">
<p className="fw-lighter">Tenant Mode</p>
<Form
onSubmit={onSubmit}
initialValues={partnerConfig.data}
render={({ handleSubmit }) => (
<>
{partnerConfig.isFetching && <CSpinner size="sm" className="me-2" />}
<CForm onSubmit={handleSubmit}>
<RFFCFormRadio
name="TenantMode"
label="Multi Tenant - GDAP Mode"
value="default"
/>
<RFFCFormRadio
name="TenantMode"
label="Multi Tenant - Add Partner Tenant"
value="PartnerTenantAvailable"
/>
<RFFCFormRadio
name="TenantMode"
label="Single Tenant - Own Tenant Mode"
value="owntenant"
/>
<CButton
type="submit"
color="primary"
className="my-3"
disabled={webhookCreateResult.isFetching}
>
{webhookCreateResult.isFetching ? (
<>
<CSpinner size="sm" className="me-2" />
Saving...
</>
) : (
'Save'
)}
</CButton>
</CForm>
</>
)}
/>
{webhookCreateResult.isSuccess && (
<CippCallout color="info" dismissible>
{webhookCreateResult?.data?.results}
</CippCallout>
)}
</CCol>
</CRow>
</>
</>
</CCardBody>
</CCard>
)
}

0 comments on commit 894c017

Please sign in to comment.