diff --git a/app/react/components/NavTabs/NavTabs.tsx b/app/react/components/NavTabs/NavTabs.tsx index d4b5d8900..6922f7ad1 100644 --- a/app/react/components/NavTabs/NavTabs.tsx +++ b/app/react/components/NavTabs/NavTabs.tsx @@ -7,6 +7,7 @@ export interface Option { label: ReactNode; children?: ReactNode; id: T; + hidden?: boolean; } interface Props { @@ -33,31 +34,34 @@ export function NavTabs({ {selected && selected.children && (
{selected.children}
diff --git a/app/react/docker/containers/CreateView/CapabilitiesTab/toRequest.ts b/app/react/docker/containers/CreateView/CapabilitiesTab/toRequest.ts index 3db379c9f..208e11eb7 100644 --- a/app/react/docker/containers/CreateView/CapabilitiesTab/toRequest.ts +++ b/app/react/docker/containers/CreateView/CapabilitiesTab/toRequest.ts @@ -5,16 +5,19 @@ import { Values } from './CapabilitiesTab'; export function toRequest( oldConfig: CreateContainerRequest, - values: Values + values: Values, + hideCapabilities: boolean ): CreateContainerRequest { return { ...oldConfig, HostConfig: { ...oldConfig.HostConfig, - CapAdd: values, - CapDrop: capabilities - .filter((cap) => !values.includes(cap.key)) - .map((cap) => cap.key), + CapAdd: hideCapabilities ? [] : values, + CapDrop: hideCapabilities + ? [] + : capabilities + .filter((cap) => !values.includes(cap.key)) + .map((cap) => cap.key), }, }; } diff --git a/app/react/docker/containers/CreateView/CreateView.tsx b/app/react/docker/containers/CreateView/CreateView.tsx index f6c086612..2502812f1 100644 --- a/app/react/docker/containers/CreateView/CreateView.tsx +++ b/app/react/docker/containers/CreateView/CreateView.tsx @@ -2,7 +2,7 @@ import { Formik } from 'formik'; import { useRouter } from '@uirouter/react'; import { useEffect, useState } from 'react'; -import { useCurrentUser } from '@/react/hooks/useUser'; +import { useCurrentUser, useIsEnvironmentAdmin } from '@/react/hooks/useUser'; import { useEnvironmentId } from '@/react/hooks/useEnvironmentId'; import { useCurrentEnvironment } from '@/react/hooks/useCurrentEnvironment'; import { useEnvironmentRegistries } from '@/react/portainer/environments/queries/useEnvironmentRegistries'; @@ -48,6 +48,7 @@ function CreateForm() { const router = useRouter(); const { trackEvent } = useAnalytics(); const { isAdmin } = useCurrentUser(); + const isEnvironmentAdmin = useIsEnvironmentAdmin(); const [isDockerhubRateLimited, setIsDockerhubRateLimited] = useState(false); const mutation = useCreateOrReplaceMutation(); @@ -79,6 +80,10 @@ function CreateForm() { const environment = envQuery.data; + const hideCapabilities = + !environment.SecuritySettings.allowContainerCapabilitiesForRegularUsers && + !isEnvironmentAdmin; + const { isDuplicating = false, initialValues, @@ -112,6 +117,7 @@ function CreateForm() { validationSchema={validationSchema} > void; @@ -202,6 +204,7 @@ export function InnerForm({ { id: 'capabilities', label: 'Capabilities', + hidden: hideCapabilities, children: (