Skip to content

Commit 2326f1e

Browse files
committed
added fixes from old PR
1 parent 599f1ff commit 2326f1e

File tree

8 files changed

+47
-37
lines changed

8 files changed

+47
-37
lines changed

src/components/ControlPlane/GitRepositories.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ import { useHandleResourcePatch } from '../../hooks/useHandleResourcePatch.ts';
2424
import { ErrorDialog, ErrorDialogHandle } from '../Shared/ErrorMessageBox.tsx';
2525
import type { GitReposResponse } from '../../lib/api/types/flux/listGitRepo';
2626
import { ActionsMenu, type ActionItem } from './ActionsMenu';
27-
import { useAuthMcp } from '../../spaces/mcp/auth/AuthContextMcp.tsx';
27+
2828
import { ApiConfigContext } from '../Shared/k8s';
29+
import { useHasMcpAdminRights } from '../../spaces/mcp/auth/useHasMcpAdminRights.ts';
2930

3031
export type GitRepoItem = GitReposResponse['items'][0] & {
3132
apiVersion?: string;
@@ -49,7 +50,7 @@ export function GitRepositories() {
4950
revision?: string;
5051
};
5152
const apiConfig = useContext(ApiConfigContext);
52-
const { hasMCPAdminRights } = useAuthMcp();
53+
const hasMCPAdminRights = useHasMcpAdminRights();
5354
const openEditPanel = useCallback(
5455
(item: GitRepoItem) => {
5556
const identityKey = `${item.kind}:${item.metadata.namespace ?? ''}:${item.metadata.name}`;

src/components/ControlPlane/Kustomizations.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ import { useHandleResourcePatch } from '../../hooks/useHandleResourcePatch.ts';
2525
import { ErrorDialog, ErrorDialogHandle } from '../Shared/ErrorMessageBox.tsx';
2626
import type { KustomizationsResponse } from '../../lib/api/types/flux/listKustomization';
2727
import { ActionsMenu, type ActionItem } from './ActionsMenu';
28-
import { useAuthMcp } from '../../spaces/mcp/auth/AuthContextMcp.tsx';
28+
2929
import { ApiConfigContext } from '../Shared/k8s';
30+
import { useHasMcpAdminRights } from '../../spaces/mcp/auth/useHasMcpAdminRights.ts';
3031

3132
export type KustomizationItem = KustomizationsResponse['items'][0] & {
3233
apiVersion?: string;
@@ -67,7 +68,7 @@ export function Kustomizations() {
6768
},
6869
[openInAside, handlePatch, apiConfig],
6970
);
70-
const { hasMCPAdminRights } = useAuthMcp();
71+
const hasMCPAdminRights = useHasMcpAdminRights();
7172

7273
const columns = useMemo<AnalyticalTableColumnDefinition[]>(
7374
() =>

src/components/ControlPlane/ManagedResources.cy.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ describe('ManagedResources - Delete Resource', () => {
4242
};
4343
};
4444

45-
const fakeUseAuthMcp = () => {
46-
return { hasMCPAdminRights: true, isLoading: false, isAuthenticated: true, error: null, login: () => {} };
45+
const fakeuseHasMcpAdminRights = () => {
46+
return true;
4747
};
4848

4949
const fakeUseResourcePluralNames: typeof useResourcePluralNames = (): any => {
@@ -102,7 +102,7 @@ describe('ManagedResources - Delete Resource', () => {
102102
useApiResourceMutation={fakeUseApiResourceMutation}
103103
useApiResource={fakeUseApiResource}
104104
useResourcePluralNames={fakeUseResourcePluralNames}
105-
useAuthMcp={fakeUseAuthMcp}
105+
useHasMcpAdminRights={fakeuseHasMcpAdminRights}
106106
/>
107107
</SplitterProvider>
108108
</MemoryRouter>,
@@ -137,7 +137,7 @@ describe('ManagedResources - Delete Resource', () => {
137137
useApiResourceMutation={fakeUseApiResourceMutation}
138138
useApiResource={fakeUseApiResource}
139139
useResourcePluralNames={fakeUseResourcePluralNames}
140-
useAuthMcp={fakeUseAuthMcp}
140+
useHasMcpAdminRights={fakeuseHasMcpAdminRights}
141141
/>
142142
</SplitterProvider>
143143
</MemoryRouter>,
@@ -180,7 +180,7 @@ describe('ManagedResources - Delete Resource', () => {
180180
useApiResourceMutation={fakeUseApiResourceMutation}
181181
useApiResource={fakeUseApiResource}
182182
useResourcePluralNames={fakeUseResourcePluralNames}
183-
useAuthMcp={fakeUseAuthMcp}
183+
useHasMcpAdminRights={fakeuseHasMcpAdminRights}
184184
/>
185185
</SplitterProvider>
186186
</MemoryRouter>,
@@ -216,8 +216,8 @@ describe('ManagedResources - Edit Resource', () => {
216216
let patchCalled = false;
217217
let patchedItem: any = null;
218218

219-
const fakeUseAuthMcp = () => {
220-
return { hasMCPAdminRights: true, isLoading: false, isAuthenticated: true, error: null, login: () => {} };
219+
const fakeUseHasMcpAdminRights = () => {
220+
return true;
221221
};
222222

223223
const fakeUseHandleResourcePatch: typeof useHandleResourcePatch = () => {
@@ -305,7 +305,7 @@ describe('ManagedResources - Edit Resource', () => {
305305
useHandleResourcePatch={fakeUseHandleResourcePatch}
306306
useApiResource={fakeUseApiResource}
307307
useResourcePluralNames={fakeUseResourcePluralNames}
308-
useAuthMcp={fakeUseAuthMcp}
308+
useHasMcpAdminRights={fakeUseHasMcpAdminRights}
309309
/>
310310
</SplitterLayout>
311311
</SplitterProvider>

src/components/ControlPlane/ManagedResources.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ import { YamlSidePanel } from '../Yaml/YamlSidePanel.tsx';
3939
import { ErrorDialog, ErrorDialogHandle } from '../Shared/ErrorMessageBox.tsx';
4040
import { APIError } from '../../lib/api/error.ts';
4141
import { useHandleResourcePatch as _useHandleResourcePatch } from '../../hooks/useHandleResourcePatch.ts';
42-
import { useAuthMcp as _useAuthMcp } from '../../spaces/mcp/auth/AuthContextMcp.tsx';
42+
4343
import { ApiConfigContext } from '../Shared/k8s';
44+
import { useHasMcpAdminRights as _useHasMcpAdminRights } from '../../spaces/mcp/auth/useHasMcpAdminRights.ts';
4445

4546
interface StatusFilterColumn {
4647
filterValue?: string;
@@ -78,13 +79,13 @@ export function ManagedResources({
7879
useHandleResourcePatch = _useHandleResourcePatch,
7980
useApiResource = _useApiResource,
8081
useResourcePluralNames = _useResourcePluralNames,
81-
useAuthMcp = _useAuthMcp,
82+
useHasMcpAdminRights = _useHasMcpAdminRights,
8283
}: {
8384
useApiResourceMutation?: typeof _useApiResourceMutation;
8485
useHandleResourcePatch?: typeof _useHandleResourcePatch;
8586
useApiResource?: typeof _useApiResource;
8687
useResourcePluralNames?: typeof _useResourcePluralNames;
87-
useAuthMcp?: typeof _useAuthMcp;
88+
useHasMcpAdminRights?: typeof _useHasMcpAdminRights;
8889
} = {}) {
8990
const { t } = useTranslation();
9091
const toast = useToast();
@@ -138,7 +139,7 @@ export function ManagedResources({
138139
},
139140
[openInAside, handlePatch, apiConfig],
140141
);
141-
const { hasMCPAdminRights } = useAuthMcp();
142+
const hasMCPAdminRights = useHasMcpAdminRights();
142143
const columns = useMemo<AnalyticalTableColumnDefinition[]>(
143144
() =>
144145
[

src/components/ControlPlane/ProvidersConfig.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ import { useSplitter } from '../Splitter/SplitterContext.tsx';
2424
import { YamlSidePanel } from '../Yaml/YamlSidePanel.tsx';
2525
import { useHandleResourcePatch } from '../../hooks/useHandleResourcePatch.ts';
2626
import { ErrorDialog, ErrorDialogHandle } from '../Shared/ErrorMessageBox.tsx';
27-
import { useAuthMcp } from '../../spaces/mcp/auth/AuthContextMcp.tsx';
27+
2828
import { ApiConfigContext } from '../Shared/k8s';
29+
import { useHasMcpAdminRights } from '../../spaces/mcp/auth/useHasMcpAdminRights.ts';
2930

3031
type Rows = {
3132
parent: string;
@@ -78,7 +79,7 @@ export function ProvidersConfig() {
7879
},
7980
[openInAside, handlePatch, apiConfig],
8081
);
81-
const { hasMCPAdminRights } = useAuthMcp();
82+
const hasMCPAdminRights = useHasMcpAdminRights();
8283
const columns = useMemo<AnalyticalTableColumnDefinition[]>(
8384
() =>
8485
[

src/lib/shared/McpContext.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createContext, ReactNode, useContext } from 'react';
2-
import { ControlPlane as ManagedControlPlaneResource } from '../api/types/crate/controlPlanes.ts';
2+
import { ControlPlane as ManagedControlPlaneResource, RoleBinding } from '../api/types/crate/controlPlanes.ts';
33
import { ApiConfigProvider } from '../../components/Shared/k8s';
44
import { useApiResource } from '../api/useApiResource.ts';
55
import { GetKubeconfig } from '../api/types/crate/getKubeconfig.ts';
@@ -15,6 +15,7 @@ interface Mcp {
1515
secretName?: string;
1616
secretKey?: string;
1717
kubeconfig?: string;
18+
roleBindings?: RoleBinding[];
1819
}
1920

2021
interface Props {
@@ -44,6 +45,7 @@ export const McpContextProvider = ({ children, context }: Props) => {
4445
return <></>;
4546
}
4647
context.kubeconfig = kubeconfig.data;
48+
context.roleBindings = mcp.data?.spec?.authorization?.roleBindings;
4749
return <McpContext.Provider value={context}>{children}</McpContext.Provider>;
4850
};
4951

src/spaces/mcp/auth/AuthContextMcp.tsx

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,17 @@ import { MeResponseSchema } from './auth.schemas';
33
import { AUTH_FLOW_SESSION_KEY } from '../../../common/auth/AuthCallbackHandler.tsx';
44
import { getRedirectSuffix } from '../../../common/auth/getRedirectSuffix.ts';
55
import { RoleBinding } from '../../../lib/api/types/crate/controlPlanes.ts';
6-
import { useAuthOnboarding } from '../../onboarding/auth/AuthContextOnboarding.tsx';
76

87
interface AuthContextMcpType {
98
isLoading: boolean;
109
isAuthenticated: boolean;
1110
error: Error | null;
1211
login: () => void;
13-
hasMCPAdminRights: boolean;
1412
}
1513

1614
const AuthContextMcp = createContext<AuthContextMcpType | null>(null);
1715

18-
export function AuthProviderMcp({ children, mcpUsers = [] }: { children: ReactNode; mcpUsers?: RoleBinding[] }) {
19-
const auth = useAuthOnboarding();
20-
21-
const userEmail = auth.user?.email;
22-
23-
const matchingRoleBinding = mcpUsers.find(
24-
(roleBinding) =>
25-
Array.isArray(roleBinding.subjects) &&
26-
!!userEmail &&
27-
roleBinding.subjects.some((subject) => subject?.name?.includes(userEmail ?? '')),
28-
);
29-
const hasMCPAdminRights = matchingRoleBinding?.role === 'admin';
30-
16+
export function AuthProviderMcp({ children }: { children: ReactNode; mcpUsers?: RoleBinding[] }) {
3117
const [isAuthenticated, setIsAuthenticated] = useState(false);
3218
const [isLoading, setIsLoading] = useState(true);
3319
const [error, setError] = useState<Error | null>(null);
@@ -74,9 +60,7 @@ export function AuthProviderMcp({ children, mcpUsers = [] }: { children: ReactNo
7460
window.location.replace(`/api/auth/mcp/login?redirectTo=${encodeURIComponent(getRedirectSuffix())}`);
7561
};
7662

77-
return (
78-
<AuthContextMcp value={{ isLoading, isAuthenticated, error, login, hasMCPAdminRights }}>{children}</AuthContextMcp>
79-
);
63+
return <AuthContextMcp value={{ isLoading, isAuthenticated, error, login }}>{children}</AuthContextMcp>;
8064
}
8165

8266
export const useAuthMcp = () => {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { useAuthOnboarding } from '../../onboarding/auth/AuthContextOnboarding.tsx';
2+
import { useMcp } from '../../../lib/shared/McpContext.tsx';
3+
4+
export function useHasMcpAdminRights(): boolean {
5+
const auth = useAuthOnboarding();
6+
const mcp = useMcp();
7+
const userEmail = auth.user?.email;
8+
const mcpUsers = mcp.roleBindings ?? [];
9+
10+
if (!userEmail) {
11+
return false;
12+
}
13+
14+
const matchingRoleBinding = mcpUsers.find(
15+
(roleBinding) =>
16+
Array.isArray(roleBinding.subjects) && roleBinding.subjects.some((subject) => subject?.name?.includes(userEmail)),
17+
);
18+
19+
return matchingRoleBinding?.role === 'admin';
20+
}

0 commit comments

Comments
 (0)