- ui/routes/auth.js: POST /login-token сделан async (был await без async)
- ui/routes/auth.js: IAM enrichment только при auth.isOidc (не в mock-режиме)
- src/auth.js: fetchIamUser, switchProfile возвращаются из initAuth()
- src/routes/oidc.js: auth.fetchIamUser вместо require('../auth') (устранение циклической зависимости)
- ui/routes/auth.js: auth.fetchIamUser вместо require
- tests/api-crud.sh: удалён хардкоженный prod-токен, токен только через аргумент
68 lines
4.5 KiB
Markdown
68 lines
4.5 KiB
Markdown
# AI‑анализ проекта ipwhitelist‑app — сравнение
|
||
|
||
> Дата: 2026-06-04
|
||
> Простая модель (GPT) vs DeepSeek V4 Pro
|
||
|
||
---
|
||
|
||
## 1. Анализ простой модели (prompt‑review.txt)
|
||
|
||
### Общее заключение
|
||
Нет. Нельзя деплоить в production в текущем состоянии.
|
||
|
||
### Найденные проблемы
|
||
|
||
| # | Серьёзность | Описание |
|
||
|---|---|---|
|
||
| 1 | **Critical** | `ui/routes/auth.js` — `await` без `async` в `POST /login‑token` → SyntaxError |
|
||
| 2 | **Critical** | `server.js` — `/export` открыт публично без авторизации |
|
||
| 3 | **Major** | Источники профилей не унифицированы (JWT vs IAM), хардкод `WZ01112` для admin |
|
||
| 4 | **Major** | `jwt.decode()` без верификации в UI |
|
||
| 5 | **Minor** | `'unsafe-inline'` в CSP |
|
||
| 6 | **Minor** | Разнобой таймаутов HTTP (5s vs 10s) |
|
||
| 7 | **Minor** | Логирование IAM слабое |
|
||
|
||
### Оценки
|
||
|
||
| Критерий | Балл |
|
||
|---|---|
|
||
| Понятность DevOps | 8/10 |
|
||
| Чистота кода | 6/10 |
|
||
|
||
---
|
||
|
||
## 2. Оценка DeepSeek V4 Pro
|
||
|
||
### Что модель нашла верно
|
||
- `await` без `async` — реальный критический баг, приложение упадёт при запуске.
|
||
- `/export` без авторизации — реальная дыра безопасности.
|
||
- Дублирование IAM/JWT‑логики — действительно размазано по `oidc.js`, `auth.js`, `ui/routes/auth.js`.
|
||
- `'unsafe-inline'` в CSP — надо убирать (nonce/hash).
|
||
- Разнобой таймаутов — мелочь, но стоит унифицировать.
|
||
|
||
### Что модель пропустила
|
||
|
||
| # | Серьёзность | Описание |
|
||
|---|---|---|
|
||
| 1 | **Critical** | Хардкоженный IAM‑токен `tazetdinovn@gmail.com` (prod) лежит в `tests/api-crud.sh` в открытом виде и уже в гите. |
|
||
| 2 | **Major** | `DEV_MODE=true` на итало — но код пытается вызывать `fetchIamUser` даже в mock‑режиме. IAM недоступен локально → каждый логин будет падать с таймаутом или ошибкой. |
|
||
| 3 | **Major** | Порядок middleware: `session` → `oidc` → `ui` — в OIDC‑роутере `src/routes/oidc.js` свой `req.session.user`, а `ui/index.js` делает свой `jwt.decode()` — возможен конфликт/перезапись. |
|
||
| 4 | **Major** | Нет механизма миграций БД — только `schema.sql` с CREATE, нет ALTER/версионирования. |
|
||
| 5 | **Minor** | `csrfToken` в `views/index.ejs` передаётся как пустая строка (`csrfToken: ''`) — CSRF фактически отключён для UI‑слоя. |
|
||
| 6 | **Minor** | `package.json` → `"version": "0.5.17"`, а `README.md` → `v0.5.14` — расхождение версий. |
|
||
| 7 | **Minor** | `require('../auth')` внутри `src/routes/oidc.js` создаёт циклическую зависимость: `auth.js` → `routes/oidc.js` → `auth.js`. Работает только из‑за кеша Node.js, но хрупко. |
|
||
|
||
---
|
||
|
||
## 3. Итоговое сравнение
|
||
|
||
| Параметр | Простая модель | DeepSeek |
|
||
|---|---|---|
|
||
| Критические баги найдены | 2 из 3 | +1 (токен в гите) |
|
||
| Архитектурные проблемы | Поверхностно | Глубже (middleware, циклические зависимости, миграции) |
|
||
| Рантайм‑поведение | Не анализировала | Учёл DEV_MODE и реальные сценарии |
|
||
| Точность попаданий | 6/7 верных | Все найденные подтверждены + новые |
|
||
| Ложные срабатывания | 0 | 0 |
|
||
|
||
**Вывод:** простая модель дала добротный первый проход — нашла два критических бага и дала разумные рекомендации. Но не копнула глубже: пропустила утекший токен, не проверила рантайм‑поведение в DEV_MODE и не заметила архитектурные завязки. Для production‑review нужен более глубокий анализ.
|