arch/public-share: единый ShareService.resolveReadableSharePage вместо трёх копий резолва (shareId,pageId)->страница #92
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Найдено в multi-aspect code review (грань: architecture, forward-looking, не блокирует мерж).
Область: apps/server/src/core/share (ShareService) + apps/server/src/core/ai-chat (public-share-chat.controller.ts, tools/public-share-chat-tools.service.ts)
Наблюдение
Граница безопасности фичи — «резолвится ли пара (shareId, pageId) в пригодную, не-ограниченную страницу внутри ЭТОЙ шары» — выписана как async-последовательность в 3 местах, которые должны быть байт-в-байт идентичны (getShareForPage → share.id===shareId → findById → deletedAt → hasRestrictedAncestor).
Значимость
Forward-looking, не текущий баг: три пути сейчас согласованы, инструменты перепроверяют scope сервер-сайд. Но расхождение контроллер/инструмент может тихо открыть доступ.
Опции
ShareService.resolveReadableSharePage(shareId, pageId, workspaceId): {share, page} | null(null при любом сбое); getSharePage и funnel контроллера зовут его; deriveShareAccess схлопывается до «не-null ⇒ pageInShare». Pros: ядровой инвариант в одном месте, эквивалент уже есть в getSharedPage. Cons: правка нескольких call-site.Рекомендация
Склоняюсь к Option 1 — ядровой security-инвариант, эквивалентный резолв уже существует в getSharedPage.