0.6.0
Added
- Изоляция памяти между пользователями (multi-tenancy): колонки
user_idвmemory_factsиmemory_chunks, миграция017_user_isolation(SQLite + PG) - Параметр
userID *int64вSearchFacts/ListFacts/SearchChunks:nil— общая память (admin/системный режим), не-nil — общие + свои факты Store.GetAPIToken(id)— получение токена по ID для проверки владельца- Helper-методы в
internal/server/handler:requireFactInAgent,requireSessionInAgent,scopeUserID,canAccessFact,canAccessSession— единообразные ownership-проверки - Базовые cross-tenant integration-тесты в
internal/store/user_isolation_test.goиinternal/server/handler/cross_tenant_test.go(12 тестов)
Changed
Consolidator.ConsolidateAgentпривязывает извлечённые факты кsess.UserID; приватные категории (user_fact,preference,personal) не сохраняются для анонимных сессийContextBuilder.buildMemoryContextпринимаетuserID *int64— RAG отдаёт только видимые caller-у факты и чанкиMemoryHandler.{GetFact,UpdateFact,DeleteFact,DeactivateFact}проверяют принадлежность факта агенту и доступ caller-а; неавторизованный доступ → 404 (anti-enumeration)MemoryHandler.{ListFacts,Search,CreateFact,AddChunks}фильтруют/создают данные по scope caller-аChatHandler.{GetSessionMessages,UpdateSession,DeleteSession,ListSessions}ограничивают доступ к чужим сессиямUserHandler.DeleteTokenпроверяет владельца токена; чужой токен → 404middleware/authorize.goиспользуетstrconv.ParseIntвместо самописного парсера; невалидный agentID → 404 вместо 403/200
Fixed
- IDOR-уязвимости в
/agents/{id}/memory/facts/{factID},/agents/{id}/sessions/{sessionID},/users/me/tokens/{id}(раздел C-3 аудита) - Утечка приватных фактов между пользователями одного агента через
SearchFacts/SearchChunks(раздел C1, C2 аудита памяти) - Cross-tenant утечка через consolidator: автоматически извлечённые preferences пользователя A могли становиться общими и попадать в RAG пользователя B