This commit is contained in:
1 parent
8efd032cc6
commit
df38dccbf1
735 files changed
+128321
-120870
No files matched your search
@@ -1,26 +1,40 @@
|
||||
export interface AuthorizationActor {
|
||||
id: number;
|
||||
username: string;
|
||||
rank: number;
|
||||
id: number;
|
||||
username: string;
|
||||
rank: number;
|
||||
}
|
||||
export type AuthorizationDenialReason = "invalid_rank" | "permission_denied" | "no_ranks";
|
||||
export type AuthorizationDenialReason =
|
||||
| "invalid_rank"
|
||||
| "permission_denied"
|
||||
| "no_ranks";
|
||||
export type AuthorizationDecision =
|
||||
{ allowed: true; superAdmin: boolean } | { allowed: false; reason: AuthorizationDenialReason };
|
||||
| { allowed: true; superAdmin: boolean }
|
||||
| { allowed: false; reason: AuthorizationDenialReason };
|
||||
|
||||
export function isDynamicSuperAdmin(rank: number, highestRank: number | null): boolean {
|
||||
return Number.isInteger(rank) && rank > 0 && highestRank !== null && rank === highestRank;
|
||||
export function isDynamicSuperAdmin(
|
||||
rank: number,
|
||||
highestRank: number | null,
|
||||
): boolean {
|
||||
return (
|
||||
Number.isInteger(rank) &&
|
||||
rank > 0 &&
|
||||
highestRank !== null &&
|
||||
rank === highestRank
|
||||
);
|
||||
}
|
||||
|
||||
export function decideAuthorization(input: {
|
||||
actor: AuthorizationActor;
|
||||
highestRank: number | null;
|
||||
permission?: string;
|
||||
hasPermission: boolean;
|
||||
actor: AuthorizationActor;
|
||||
highestRank: number | null;
|
||||
permission?: string;
|
||||
hasPermission: boolean;
|
||||
}): AuthorizationDecision {
|
||||
if (!Number.isInteger(input.actor.rank) || input.actor.rank <= 0)
|
||||
return { allowed: false, reason: "invalid_rank" };
|
||||
if (input.highestRank === null) return { allowed: false, reason: "no_ranks" };
|
||||
if (isDynamicSuperAdmin(input.actor.rank, input.highestRank)) return { allowed: true, superAdmin: true };
|
||||
if (!input.permission || input.hasPermission) return { allowed: true, superAdmin: false };
|
||||
return { allowed: false, reason: "permission_denied" };
|
||||
if (!Number.isInteger(input.actor.rank) || input.actor.rank <= 0)
|
||||
return { allowed: false, reason: "invalid_rank" };
|
||||
if (input.highestRank === null) return { allowed: false, reason: "no_ranks" };
|
||||
if (isDynamicSuperAdmin(input.actor.rank, input.highestRank))
|
||||
return { allowed: true, superAdmin: true };
|
||||
if (!input.permission || input.hasPermission)
|
||||
return { allowed: true, superAdmin: false };
|
||||
return { allowed: false, reason: "permission_denied" };
|
||||
}
|
||||
Reference in new issue
Block a user