Skip to content

feat: enhance IPC argument validation with Zod schemas#101

Merged
KazeKaze93 merged 1 commit intomasterfrom
feat/shared-validation-polish-pack
Apr 28, 2026
Merged

feat: enhance IPC argument validation with Zod schemas#101
KazeKaze93 merged 1 commit intomasterfrom
feat/shared-validation-polish-pack

Conversation

@KazeKaze93
Copy link
Copy Markdown
Owner

  • Introduced new Zod schemas for argument validation across multiple IPC controllers, ensuring stricter type safety and reducing potential runtime errors.
  • Refactored existing handlers to utilize the new schemas, improving code clarity and maintainability.
  • Cleaned up unused imports and adhered to strict coding standards throughout the updates.

- Introduced new Zod schemas for argument validation across multiple IPC controllers, ensuring stricter type safety and reducing potential runtime errors.
- Refactored existing handlers to utilize the new schemas, improving code clarity and maintainability.
- Cleaned up unused imports and adhered to strict coding standards throughout the updates.
@KazeKaze93 KazeKaze93 merged commit 8ac9298 into master Apr 28, 2026
2 checks passed
@github-actions
Copy link
Copy Markdown

🛡️ Архитектор (AI Review)

Это жесткое ревью. Твой PR — это попытка навести порядок в хаосе IPC, и хотя направление верное, реализация местами пахнет ленью и "магией".

🚨 Критично

  1. Безопасность openExternal (ViewerController.ts):
    Ты добавил z.string().url(), но этого недостаточно. Валидация URL через Zod не защищает от file:// или javascript:. В коде виден массив DANGEROUS_PROTOCOLS, но в самом хендлере openExternal (судя по диффу) проверка этого списка отсутствует.

    • Риск: RCE через открытие вредоносных файлов или выполнение скриптов.
    • Исправить: Внутри хендлера openExternal ОБЯЗАТЕЛЬНО проверяй протокол по белому списку (http/https) ПЕРЕД вызовом shell.openExternal.
  2. Сортировка бэкапов (MaintenanceController.ts):

    .sort((a, b) => a.name.localeCompare(b.name));

    Ты полагаешься на localeCompare имен файлов для определения "старости". Если формат имени файла изменится или в папке окажется мусор, твоя логика удаления (retention) удалит не те файлы.

    • Исправить: Используй fs.statSync(file).mtime для сортировки по реальной дате изменения, а не по строковому имени.

⚠️ Надо исправить

  1. Магические числа (ViewerDialog.tsx):

    const isSideButton = (button: number): boolean => button === 3 || button === 4;

    Что такое 3 и 4? Для стороннего разработчика это мусор.

    • Исправить: Вынеси в константы: MOUSE_BUTTON_BACK = 3, MOUSE_BUTTON_FORWARD = 4.
  2. Дублирование логики парсинга (PlaylistController.ts и др.):
    Ты везде пишешь (event, ...args) => { const [data] = Schema.parse(args); ... }. Это бойлерплейт.

    • Исправить: У тебя уже есть ipcArgValidation.ts. Почему ты не используешь parseSingleArg во всех контроллерах, а только в maintenanceHandlers.ts? Будь последователен.
  3. Неконсистентность валидации (ArtistsController.ts):

    const SearchArtistsArgsSchema = z.tuple([z.string().trim().min(1)]);
    const SearchRemoteTagsArgsSchema = z.tuple([z.string().trim().min(2), ...]);

    Почему локальный поиск разрешен от 1 символа, а удаленный — от 2? Это вызовет недоумение у пользователя. Приведи к единому стандарту.

💡 Совет

  1. Оптимизация MAX_TOTAL_BACKUP_BYTES:
    Расчет Math.floor(parsedMb * 1024 * 1024) происходит при каждом импорте модуля. Вынеси это в ленивую инициализацию или в метод сервиса. И используй константы для множителей (1024 * 1024).

  2. Zod Inference:
    В PostsController.ts ты создаешь GetPostsArgsSchema. Вместо ручного дублирования типов в GetPostsParams, используй z.infer<typeof GetPostsArgsSchema>. Меньше кода — меньше багов.

  3. React Performance (ViewerDialog.tsx):
    Ты вешаешь три слушателя (mousedown, mouseup, auxclick) на window при каждом открытии диалога. Убедись, что handleSideMouseExit обернут в useCallback (вижу, что обернут, хорошо), но сама логика блокировки кнопок мыши может конфликтовать с системными жестами "Назад" в некоторых ОС. Проверь на macOS.

Вердикт:
Идея с Zod-схемами для IPC — отлично. Реализация в MaintenanceController и отсутствие проверки протоколов в ViewerControllerплохо. Исправляй.

Analyzed by: gemini-3-flash-preview

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant