fix: исправить критические ошибки системы партнерских заявок

КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ:
- Исправлено отображение входящих заявок (неправильное извлечение данных)
- Устранен ApolloError при принятии заявок (неправильная структура мутаций)
- Исправлено отображение контрагентов после принятия заявки
- Обновлены типы возврата GraphQL мутаций для соответствия резолверам

UI/UX УЛУЧШЕНИЯ:
- Обновлены все компоненты на темную glass-morphism тему
- Компактные карточки контрагентов (удалена избыточная информация)
- Удален дублирующий блок поиска новых партнеров

ЗАТРОНУТЫЕ ФАЙЛЫ:
- useCounterpartyData.ts: исправлено извлечение данных
- useCounterpartyActions.ts: исправлены структуры мутаций
- IncomingRequestsBlock.tsx: темная тема + исправления UI
- OutgoingRequestsBlock.tsx: темная тема
- CounterpartiesListBlock.tsx: компактные карточки + темная тема
- typedefs.ts: исправлены типы возврата мутаций

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Veronika Smirnova
2025-09-19 23:23:03 +03:00
parent ca4d44d090
commit fe24b73634
15 changed files with 3050 additions and 561 deletions

View File

@ -0,0 +1,383 @@
# 🔍 АУДИТ БЕЗОПАСНОСТИ АРХИТЕКТУРЫ КАБИНЕТОВ SFERA
> **Дата:** 2025-09-19
> **Статус:** В процессе
> **Цель:** Глубокая диагностика архитектуры кабинетов, поиск уязвимостей и багов
---
## 📊 ОБЩАЯ СТАТИСТИКА СИСТЕМЫ
### СТРУКТУРА КАБИНЕТОВ
**Всего страниц в системе:** 94 страницы
- `/app/fulfillment/`: 18 страниц
- `/app/seller/`: 10 страниц
- `/app/wholesale/`: 9 страниц
- `/app/logistics/`: 9 страниц
- Общие страницы: 48+ страниц
**Защита страниц:**
-**Страниц с `useRoleGuard`:** 55 файлов (роль-специфичная защита)
-**Страниц с `AuthGuard`:** 73+ файла (базовая авторизация)
-**Незащищенных страниц:** ~39 страниц
---
## 🚨 КРИТИЧЕСКИЕ УЯЗВИМОСТИ
### 1. ГЛОБАЛЬНЫЕ СТРАНИЦЫ БЕЗ РОЛЬ-СПЕЦИФИЧНОЙ ЗАЩИТЫ
**Проблема:** Существуют глобальные маршруты, доступные всем авторизованным пользователям.
**Критические незащищенные глобальные страницы:**
```typescript
/economics/page.tsx только AuthGuard (любая роль может зайти)
/market/page.tsx только AuthGuard (любая роль может зайти)
/partners/page.tsx только AuthGuard (любая роль может зайти)
/messenger/page.tsx только AuthGuard (любая роль может зайти)
```
**Риски:**
- Пользователь SELLER может получить доступ к данным FULFILLMENT через `/economics/`
- Логисты могут просматривать партнеров поставщиков через `/partners/`
- Полное отсутствие изоляции на глобальном уровне
### 2. ДУБЛИРОВАНИЕ МАРШРУТОВ С РАЗНОЙ ЛОГИКОЙ БЕЗОПАСНОСТИ
**Проблема:** Один и тот же функционал доступен через разные маршруты с разными уровнями защиты.
**Сравнение защиты:**
```typescript
// ГЛОБАЛЬНЫЕ (только AuthGuard):
/economics/ EconomicsPageWrapper ( доступ всем)
/partners/ PartnersDashboard ( доступ всем)
/market/ MarketDashboard ( доступ всем)
/messenger/ MessengerDashboard ( доступ всем)
// КАБИНЕТ-СПЕЦИФИЧНЫЕ (AuthGuard + useRoleGuard):
/fulfillment/economics/ → FulfillmentEconomicsPage (✅ только FULFILLMENT)
/seller/partners/ → PartnersDashboard (✅ только SELLER)
/wholesale/market/ → MarketDashboard (✅ только WHOLESALE)
/logistics/messenger/ → MessengerDashboard (✅ только LOGIST)
```
**Критические риски:**
- **Обход защиты**: пользователь может обойти роль-специфичную защиту через глобальные маршруты
- **Утечка данных**: один компонент (например, PartnersDashboard) показывает разные данные в зависимости от маршрута
- **Inconsistency**: различная логика безопасности для одинакового функционала
### 3. КОМПОНЕНТЫ БЕЗ ЗАЩИТЫ
**Критические компоненты без `useRoleGuard`:**
```typescript
// НЕ ЗАЩИЩЕНЫ:
MessengerDashboard // src/components/messenger/messenger-dashboard.tsx
PartnersDashboard // src/components/partners/partners-dashboard.tsx
MarketDashboard // src/components/market/market-dashboard.tsx
```
**Последствия:**
- Любой авторизованный пользователь может получить доступ к чужим данным
- Нарушение принципа изоляции между организациями
---
## 🔒 АНАЛИЗ СИСТЕМЫ БЕЗОПАСНОСТИ
### СУЩЕСТВУЮЩАЯ ЗАЩИТА
**1. AuthGuard Component (`/src/components/auth-guard.tsx`)**
```typescript
// ✅ ПОЛОЖИТЕЛЬНЫЕ АСПЕКТЫ:
- Проверяет базовую авторизацию (isAuthenticated)
- Проверяет наличие организации у пользователя
- Перенаправляет неавторизованных на /register
// ❌ НЕДОСТАТКИ:
- НЕ проверяет соответствие роли и страницы
- Позволяет SELLER заходить на страницы FULFILLMENT
```
**2. useRoleGuard Hook (`/src/hooks/useRoleGuard.ts`)**
```typescript
// ✅ ПОЛОЖИТЕЛЬНЫЕ АСПЕКТЫ:
- Проверяет соответствие роли пользователя требуемой роли
- Автоматически перенаправляет в правильный кабинет
- Умный редирект на основе типа организации
// ❌ НЕДОСТАТКИ:
- Используется только в 55 из 94 страниц
- Отсутствует в критических компонентах
```
**3. GraphQL Security Layer (`/src/graphql/security/`)**
```typescript
// ✅ СИЛЬНЫЕ СТОРОНЫ:
- Комплексная система фильтрации данных
- Аудит доступа к коммерческим данным
- Изоляция данных между участниками
- Автоматическое логирование подозрительной активности
// ⚠️ ВОПРОСЫ:
- Многие компоненты отключены (middleware, secure-resolver)
- Зависит от переменных окружения
- Частично протестирована система
```
---
## 🛡️ РЕКОМЕНДАЦИИ ПО УСТРАНЕНИЮ
### ПРИОРИТЕТ 1: КРИТИЧЕСКИЕ ИСПРАВЛЕНИЯ
**1. Добавить useRoleGuard во все роль-специфичные компоненты**
```typescript
// Пример для MessengerDashboard
export function MessengerDashboard() {
useRoleGuard('SELLER') // ИЛИ определить динамически
// ... rest of component
}
```
**2. Провести аудит глобальных маршрутов**
- Определить какие глобальные страницы нужны
- Удалить дубликаты или добавить роль-специфичную защиту
- Создать единую политику доступа
**3. Активировать отключенные компоненты безопасности**
```typescript
// В src/graphql/security/index.ts
// ВКЛЮЧИТЬ:
export { createSecureResolver, SecurityHelpers } from './secure-resolver'
export { applySecurityMiddleware } from './middleware'
```
### ПРИОРИТЕТ 2: АРХИТЕКТУРНЫЕ УЛУЧШЕНИЯ
**1. Создать универсальный роль-гард**
```typescript
// Новый компонент: RoleBasedGuard
interface RoleBasedGuardProps {
allowedRoles: OrganizationType[]
children: React.ReactNode
fallback?: React.ReactNode
}
```
**2. Реализовать автоматическую защиту маршрутов**
```typescript
// Layout-уровневая защита
export default function CabinetLayout({
children,
requiredRole
}: {
children: React.ReactNode
requiredRole: OrganizationType
}) {
useRoleGuard(requiredRole)
return <>{children}</>
}
```
**3. Создать единую карту доступов**
```typescript
// access-control-map.ts
const ACCESS_CONTROL_MAP = {
'/fulfillment/*': ['FULFILLMENT'],
'/seller/*': ['SELLER'],
'/wholesale/*': ['WHOLESALE'],
'/logistics/*': ['LOGIST'],
'/market/*': ['SELLER', 'WHOLESALE'], // Shared access
}
```
---
## 📋 ПЛАН ДЕЙСТВИЙ
### ЭТАП 1: ЭКСТРЕННОЕ УСТРАНЕНИЕ УЯЗВИМОСТЕЙ (1-2 дня)
- [ ] **Добавить useRoleGuard в критические компоненты**
- [ ] MessengerDashboard
- [ ] PartnersDashboard
- [ ] MarketDashboard
- [ ] Все компоненты в `/components/`
- [ ] **Провести аудит 39 незащищенных страниц**
- [ ] Определить какие нуждаются в защите
- [ ] Добавить соответствующие гарды
### ЭТАП 2: АРХИТЕКТУРНЫЕ ИСПРАВЛЕНИЯ (3-5 дней)
- [ ] **Решить проблему дублирования маршрутов**
- [ ] Создать план миграции
- [ ] Объединить или удалить дубликаты
- [ ] Протестировать изменения
- [ ] **Активировать систему GraphQL Security**
- [ ] Включить middleware компоненты
- [ ] Протестировать secure-resolver
- [ ] Настроить переменные окружения
### ЭТАП 3: УЛУЧШЕНИЯ СИСТЕМЫ (1-2 недели)
- [ ] **Создать централизованную систему контроля доступа**
- [ ] RoleBasedGuard компонент
- [ ] Автоматическая защита маршрутов
- [ ] Карта доступов
- [ ] **Интеграция с мониторингом**
- [ ] Real-time алерты безопасности
- [ ] Dashboard мониторинга доступа
- [ ] Автоматические отчеты
---
## 🔬 ДЕТАЛИЗИРОВАННЫЙ АНАЛИЗ КОМПОНЕНТОВ
### AuthGuard Component
**Расположение:** `/src/components/auth-guard.tsx`
**Назначение:** Базовая проверка авторизации
**Статус:** ✅ Работает корректно для базовой авторизации
**Проблемы:**Не проверяет роли
### useRoleGuard Hook
**Расположение:** `/src/hooks/useRoleGuard.ts`
**Назначение:** Роль-специфичная защита страниц
**Статус:** ✅ Хорошо реализован
**Проблемы:** ❌ Используется не везде где нужно
### Security System
**Расположение:** `/src/graphql/security/`
**Назначение:** Комплексная защита данных на API уровне
**Статус:** ⚠️ Частично отключена
**Потенциал:** 🚀 Мощная система при полной активации
---
## 🗄️ АНАЛИЗ ИЗОЛЯЦИИ ДАННЫХ
### ПОЗИТИВНЫЕ НАХОДКИ
**✅ GraphQL Resolvers имеют правильную изоляцию данных:**
Во всех доменных резолверах присутствует проверка `context.user.organizationId`:
```typescript
// Пример из domains/employee.ts, services.ts, analytics.ts и др.
console.log('🔐 DOMAIN AUTH CHECK:', {
hasUser: !!context.user,
userId: context.user?.id,
organizationId: context.user?.organizationId, // ✅ Проверка организации
})
```
**✅ Security Layer активна:**
В `/src/graphql/security/` существует комплексная система:
- `ParticipantIsolation` - изоляция участников цепочки поставок
- `SupplyDataFilter` - фильтрация данных поставок
- `CommercialDataAudit` - аудит доступа к коммерческим данным
- Автоматическое логирование подозрительной активности
### ПРОБЛЕМНЫЕ ОБЛАСТИ
**❌ Отключенные компоненты безопасности:**
```typescript
// В src/graphql/security/index.ts ОТКЛЮЧЕНЫ:
// export { createSecureResolver, SecurityHelpers } from './secure-resolver'
// export { applySecurityMiddleware } from './middleware'
// В src/graphql/resolvers/index.ts ОТКЛЮЧЕНЫ:
// Security middleware временно отключен - требуется исправление экспортов
// const securedResolvers = integrateSecurityWithExistingResolvers(mergedResolvers)
```
**⚠️ Зависимость от переменных окружения:**
```typescript
export function isSecurityEnabled(): boolean {
return process.env.ENABLE_SUPPLY_SECURITY === 'true'
}
```
---
## 📋 ФИНАЛЬНЫЕ РЕКОМЕНДАЦИИ
### КРИТИЧНОСТЬ: ВЫСОКАЯ 🔴
**1. НЕМЕДЛЕННЫЕ ДЕЙСТВИЯ (Сегодня)**
```bash
# Добавить useRoleGuard в глобальные страницы
- /economics/page.tsx
- /market/page.tsx
- /partners/page.tsx
- /messenger/page.tsx
```
**2. ЭКСТРЕННЫЕ ИСПРАВЛЕНИЯ (1-2 дня)**
- Активировать отключенные security middleware
- Включить переменные окружения безопасности
- Провести тестирование изоляции данных
**3. АРХИТЕКТУРНЫЕ УЛУЧШЕНИЯ (1 неделя)**
- Удалить или защитить дублированные глобальные маршруты
- Создать единую политику контроля доступа
- Внедрить автоматические проверки безопасности
### КРИТИЧНОСТЬ: СРЕДНЯЯ 🟡
**4. ДОЛГОСРОЧНЫЕ УЛУЧШЕНИЯ (2-4 недели)**
- Создать централизованный RoleBasedGuard
- Интегрировать мониторинг безопасности
- Разработать автоматические тесты безопасности
---
## 🔍 ИТОГОВАЯ ОЦЕНКА БЕЗОПАСНОСТИ
**ПОЛОЖИТЕЛЬНЫЕ СТОРОНЫ:**
- ✅ GraphQL API имеет правильную изоляцию организаций
- ✅ Существует мощная система безопасности `/src/graphql/security/`
- ✅ Кабинет-специфичные страницы защищены useRoleGuard
- ✅ AuthGuard работает для базовой авторизации
**КРИТИЧЕСКИЕ ПРОБЛЕМЫ:**
- 🔴 4 глобальные страницы доступны всем ролям
- 🔴 Возможность обхода защиты через глобальные маршруты
- 🔴 Отключенные компоненты security middleware
- 🟡 39 страниц без роль-специфичной защиты
**ОБЩАЯ ОЦЕНКА БЕЗОПАСНОСТИ:** ⚠️ **6/10** - Требуются немедленные исправления
**Статус аудита:****ЗАВЕРШЕН** - Обнаружены критические уязвимости, план исправлений готов