diff --git a/server/SHServ/Integrations/GAuth/PermissionResolver.php b/server/SHServ/Integrations/GAuth/PermissionResolver.php index 87c719c..3a56325 100644 --- a/server/SHServ/Integrations/GAuth/PermissionResolver.php +++ b/server/SHServ/Integrations/GAuth/PermissionResolver.php @@ -78,7 +78,7 @@ $tb = app()->thin_builder; $result = $tb->select('shserv_roles', ['default_permissions'], [['slug', '=', $roleSlug]]); if (!$result) { - return []; + return $roleSlug === 'superadmin' ? ['*' => true] : []; } $perms = json_decode($result[0]['default_permissions'] ?? '[]', true); @@ -89,11 +89,15 @@ // Handle wildcard '*' for superadmin if (in_array('*', $perms, true)) { - $all = $tb->select('shserv_permissions', ['slug']); - if ($all) { - foreach ($all as $row) { - $map[$row['slug']] = true; + try { + $all = $tb->select('shserv_permissions', ['slug']); + if ($all) { + foreach ($all as $row) { + $map[$row['slug']] = true; + } } + } catch (\Throwable $e) { + $map['*'] = true; } } @@ -103,12 +107,16 @@ private function getGroupPermissions(int $userId): array { $tb = app()->thin_builder; - $result = $tb->query(" - SELECT p.permission_slug, p.granted - FROM shserv_group_permissions p - JOIN shserv_group_members m ON m.group_id = p.group_id - WHERE m.user_id = {$userId} - "); + try { + $result = $tb->query(" + SELECT p.permission_slug, p.granted + FROM shserv_group_permissions p + JOIN shserv_group_members m ON m.group_id = p.group_id + WHERE m.user_id = {$userId} + "); + } catch (\Throwable $e) { + return []; + } if (!$result) { return []; @@ -139,9 +147,13 @@ private function getAllPermissionSlugs(): array { $tb = app()->thin_builder; - $result = $tb->select('shserv_permissions', ['slug']); + try { + $result = $tb->select('shserv_permissions', ['slug']); + } catch (\Throwable $e) { + return ['*']; + } if (!$result) { - return []; + return ['*']; } return array_column($result, 'slug'); } diff --git a/server/database/migrations/2026_06_07_000001_seed_gauth_permissions.php b/server/database/migrations/2026_06_07_000001_seed_gauth_permissions.php new file mode 100644 index 0000000..2a29578 --- /dev/null +++ b/server/database/migrations/2026_06_07_000001_seed_gauth_permissions.php @@ -0,0 +1,53 @@ +prepare(" + INSERT IGNORE INTO shserv_roles (slug, name, is_system, default_permissions) + VALUES (?, ?, ?, ?) + "); + foreach ($roles as $role) { + $stmt->execute($role); + } + + // Seed permissions + $permissions = [ + ['devices.view', 'Просмотр устройств', 'Просмотр списка устройств и их статуса', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => true])], + ['devices.scan', 'Сканирование сети', 'Поиск новых устройств в локальной сети', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])], + ['devices.control', 'Управление устройствами', 'Включение/выключение, изменение состояния каналов', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])], + ['devices.setup', 'Добавление устройств', 'Регистрация новых устройств в системе', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])], + ['devices.edit', 'Редактирование устройств', 'Изменение имени, зоны, схемы каналов', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['devices.delete', 'Удаление устройств', 'Удаление устройств из системы', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['areas.view', 'Просмотр зон', 'Просмотр списка зон', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => true])], + ['areas.manage', 'Управление зонами', 'Создание, редактирование, удаление зон', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['scripts.view', 'Просмотр скриптов', 'Просмотр списка скриптов автоматизации', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])], + ['scripts.edit', 'Редактирование скриптов', 'Создание и изменение скриптов', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['scripts.run', 'Запуск скриптов', 'Ручной запуск скриптов автоматизации', json_encode(['superadmin' => true, 'admin' => true, 'user' => true, 'guest' => false])], + ['firmware.view', 'Просмотр прошивок', 'Просмотр списка доступных прошивок', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['firmware.upload', 'Загрузка прошивок', 'Загрузка новых версий прошивок', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['admin.users', 'Управление пользователями', 'Просмотр и редактирование пользователей', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['admin.roles', 'Управление ролями', 'Назначение ролей и прав', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['admin.audit', 'Просмотр аудита', 'Просмотр журнала действий', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ['settings.edit', 'Настройки системы', 'Изменение глобальных настроек', json_encode(['superadmin' => true, 'admin' => true, 'user' => false, 'guest' => false])], + ]; + $stmt = $tb->prepare(" + INSERT IGNORE INTO shserv_permissions (slug, name, description, default_for_roles) + VALUES (?, ?, ?, ?) + "); + foreach ($permissions as $perm) { + $stmt->execute($perm); + } + + return true; +};