diff --git a/dashboard/src/app/(inside)/user/[id]/page.tsx b/dashboard/src/app/(inside)/user/[id]/page.tsx
index 83cc3b3..98a578a 100644
--- a/dashboard/src/app/(inside)/user/[id]/page.tsx
+++ b/dashboard/src/app/(inside)/user/[id]/page.tsx
@@ -11,6 +11,9 @@ import { Badge } from '@/components/ui/badge';
import { Check, X } from 'lucide-react';
import { IdentityActions } from '@/components/identity/identity-actions';
import { IdentityCredentials } from '@/components/identity/identity-credentials';
+import { checkPermission, requirePermission, requireSession } from '@/lib/action/authentication';
+import { permission, relation } from '@/lib/permission';
+import { redirect } from 'next/navigation';
interface MergedAddress {
recovery_id?: string;
@@ -76,19 +79,35 @@ function mergeAddresses(
export default async function UserDetailsPage({ params }: { params: Promise<{ id: string }> }) {
- const identityId = (await params).id;
+ const session = await requireSession();
+ const identityId = session.identity!.id;
+
+ await requirePermission(permission.stack.dashboard, relation.access, identityId);
+
+ const pmAccessUser = await checkPermission(permission.user.it, relation.access, identityId);
+ if (!pmAccessUser) {
+ return redirect('/user');
+ }
+
+ const pmEditUser = await checkPermission(permission.user.it, relation.edit, identityId);
+ const pmDeleteUser = await checkPermission(permission.user.it, relation.delete, identityId);
+ const pmEditUserState = await checkPermission(permission.user.state, relation.edit, identityId);
+ const pmDeleteUserSession = await checkPermission(permission.user.session, relation.delete, identityId);
+ const pmCreateUserCode = await checkPermission(permission.user.code, relation.create, identityId);
+ const pmCreateUserLink = await checkPermission(permission.user.link, relation.create, identityId);
+
+ const detailIdentityId = (await params).id;
const identityApi = await getIdentityApi();
- const identity = await identityApi.getIdentity({ id: identityId })
+ const identity = await identityApi.getIdentity({ id: detailIdentityId })
.then((response) => {
- console.log('identity', response.data);
return response.data;
})
.catch(() => {
console.log('Identity not found');
});
- const sessions = await identityApi.listIdentitySessions({ id: identityId })
+ const sessions = await identityApi.listIdentitySessions({ id: detailIdentityId })
.then((response) => response.data)
.catch(() => {
console.log('No sessions found');
@@ -97,7 +116,7 @@ export default async function UserDetailsPage({ params }: { params: Promise<{ id
if (!identity) {
return ;
+ message={`The requested identity with id ${detailIdentityId} does not exist`}/>;
}
if (!identity.verifiable_addresses || !identity.verifiable_addresses[0]) {
@@ -137,7 +156,17 @@ export default async function UserDetailsPage({ params }: { params: Promise<{ id
Quick actions to manage the identity
-
+
diff --git a/dashboard/src/components/identity/identity-actions.tsx b/dashboard/src/components/identity/identity-actions.tsx
index 0ddcf32..b6a48ca 100644
--- a/dashboard/src/components/identity/identity-actions.tsx
+++ b/dashboard/src/components/identity/identity-actions.tsx
@@ -28,12 +28,22 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
interface IdentityActionProps {
- identity: Identity;
+ identity: Identity,
+ permissions: {
+ pmEditUser: boolean;
+ pmDeleteUser: boolean;
+ pmEditUserState: boolean;
+ pmDeleteUserSession: boolean;
+ pmCreateUserCode: boolean;
+ pmCreateUserLink: boolean;
+ }
}
-export function IdentityActions({ identity }: IdentityActionProps,
+export function IdentityActions({ identity, permissions }: IdentityActionProps,
) {
+ console.log('IdentityActions', 'Permissions', permissions);
+
const router = useRouter();
const [dialogVisible, setDialogVisible] = useState(false);
@@ -122,7 +132,10 @@ export function IdentityActions({ identity }: IdentityActionProps,
dialogDescription="Are you sure you want to create a recovery code for this identity?"
dialogButtonSubmit="Create code"
>
-