mcp-auth: тело enforceBasicLoginGate (закрытие SSO/MFA-байпаса) не покрыто тестами #82

Closed
opened 2026-06-21 02:33:12 +03:00 by Ghost · 0 comments

Найдено в multi-aspect code review всех изменений с коммита 053a9c0d (ветка develop).

Грань: test-coverage / security · Severity: warning
Где: apps/server/src/integrations/mcp/mcp.service.ts:230-277

Проблема
enforceBasicLoginGate — ядро security-фикса. 4 нетривиальные ветки: re-surface ошибки validateSsoEnforcement как UnauthorizedException, отсутствие EE MFA-модуля → проход, вызов checkMfaRequirements, reject при userHasMfa||requiresMfaSetup. Тесты используют ЗАГЛУШКУ гейта и проверяют лишь, что resolveMcpSessionConfig вызывает её до login() и шорткатит на throw — реальное тело не исполняется. Регрессия, инвертирующая MFA-условие или сузившая catch вокруг SSO, пройдёт все тесты и заново откроет байпас. (McpService не инстанцируется под текущим jest из-за импорта AuthService → @docmost/transactional, поэтому нужен framework-free вынос или AST-контракт-тест.)

Предлагаемый фикс
Вынести решающую логику гейта в framework-free mcp-auth.helpers.ts (чистая функция: результат validateSsoEnforcement + инжектируемый checkMfaRequirements + флаги) и покрыть все ветки; как минимум — AST-контракт-тест по образцу verify-user-credentials.contract.spec.ts.

Найдено в multi-aspect code review всех изменений с коммита `053a9c0d` (ветка develop). **Грань:** test-coverage / security · **Severity:** warning **Где:** `apps/server/src/integrations/mcp/mcp.service.ts:230-277` **Проблема** enforceBasicLoginGate — ядро security-фикса. 4 нетривиальные ветки: re-surface ошибки validateSsoEnforcement как UnauthorizedException, отсутствие EE MFA-модуля → проход, вызов checkMfaRequirements, reject при userHasMfa||requiresMfaSetup. Тесты используют ЗАГЛУШКУ гейта и проверяют лишь, что resolveMcpSessionConfig вызывает её до login() и шорткатит на throw — реальное тело не исполняется. Регрессия, инвертирующая MFA-условие или сузившая catch вокруг SSO, пройдёт все тесты и заново откроет байпас. (McpService не инстанцируется под текущим jest из-за импорта AuthService → @docmost/transactional, поэтому нужен framework-free вынос или AST-контракт-тест.) **Предлагаемый фикс** Вынести решающую логику гейта в framework-free mcp-auth.helpers.ts (чистая функция: результат validateSsoEnforcement + инжектируемый checkMfaRequirements + флаги) и покрыть все ветки; как минимум — AST-контракт-тест по образцу verify-user-credentials.contract.spec.ts.
Ghost closed this issue 2026-06-21 03:02:12 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#82