mirror of
https://github.com/sct/overseerr.git
synced 2025-09-17 17:24:35 +02:00

* fix: correct 'StatusChecker' typo * feat: add restart required check to StatusChecker * fix(perms): remove MANAGE_SETTINGS permission * fix: allow alert to be dismissed * fix(lang): add missing string in SettingsServices * fix(frontend): fix modal icon border * fix(frontend): un-dismiss alert if setting reverted not require server restart * fix(backend): restart flag only needs to track main settings * fix: rebase issue * refactor: appease Prettier * refactor: swap settings badge order * fix: type import for MainSettings * test: add cypress test for restart prompt
67 lines
1.7 KiB
TypeScript
67 lines
1.7 KiB
TypeScript
export enum Permission {
|
|
NONE = 0,
|
|
ADMIN = 2,
|
|
MANAGE_USERS = 8,
|
|
MANAGE_REQUESTS = 16,
|
|
REQUEST = 32,
|
|
VOTE = 64,
|
|
AUTO_APPROVE = 128,
|
|
AUTO_APPROVE_MOVIE = 256,
|
|
AUTO_APPROVE_TV = 512,
|
|
REQUEST_4K = 1024,
|
|
REQUEST_4K_MOVIE = 2048,
|
|
REQUEST_4K_TV = 4096,
|
|
REQUEST_ADVANCED = 8192,
|
|
REQUEST_VIEW = 16384,
|
|
AUTO_APPROVE_4K = 32768,
|
|
AUTO_APPROVE_4K_MOVIE = 65536,
|
|
AUTO_APPROVE_4K_TV = 131072,
|
|
REQUEST_MOVIE = 262144,
|
|
REQUEST_TV = 524288,
|
|
MANAGE_ISSUES = 1048576,
|
|
VIEW_ISSUES = 2097152,
|
|
CREATE_ISSUES = 4194304,
|
|
}
|
|
|
|
export interface PermissionCheckOptions {
|
|
type: 'and' | 'or';
|
|
}
|
|
|
|
/**
|
|
* Takes a Permission and the users permission value and determines
|
|
* if the user has access to the permission provided. If the user has
|
|
* the admin permission, true will always be returned from this check!
|
|
*
|
|
* @param permissions Single permission or array of permissions
|
|
* @param value users current permission value
|
|
* @param options Extra options to control permission check behavior (mainly for arrays)
|
|
*/
|
|
export const hasPermission = (
|
|
permissions: Permission | Permission[],
|
|
value: number,
|
|
options: PermissionCheckOptions = { type: 'and' }
|
|
): boolean => {
|
|
let total = 0;
|
|
|
|
// If we are not checking any permissions, bail out and return true
|
|
if (permissions === 0) {
|
|
return true;
|
|
}
|
|
|
|
if (Array.isArray(permissions)) {
|
|
if (value & Permission.ADMIN) {
|
|
return true;
|
|
}
|
|
switch (options.type) {
|
|
case 'and':
|
|
return permissions.every((permission) => !!(value & permission));
|
|
case 'or':
|
|
return permissions.some((permission) => !!(value & permission));
|
|
}
|
|
} else {
|
|
total = permissions;
|
|
}
|
|
|
|
return !!(value & Permission.ADMIN) || !!(value & total);
|
|
};
|