Атрибуция от бота в MCP/REST + REST API по ключу (этап 2)
- MCP: getActor (владелец ключа + бот), аудит changedByName=бот/label ключа, botId, metadata.source='mcp'; аудит для update_task/update_task_status - sendTaskMessage: botId (messageType 'bot'), починен путь isBotToken без req.user - authenticateTokenOrApiKey: JWT или X-Api-Key с белым списком endpoint'ов (/api/upload, messages, field-values, create task), проверки скоупов, аудит source='api' - Лимиты файлов через env: UPLOAD_IMAGE_MAX_MB=25, UPLOAD_DOC_MAX_MB=100, UPLOAD_MAX_MB=100 - MCP upload-инструменты: параметр fileUrl для привязки уже загруженного файла; новый инструмент get_api_guide
This commit is contained in:
@@ -35,6 +35,16 @@ export function legacySha256Hash(raw: string): string {
|
||||
// Полный доступ — используется как дефолт для legacy-ключей (scopes = NULL в БД)
|
||||
export const FULL_API_KEY_SCOPES: ApiKeyScopes = { mode: 'full', formIds: null, tableIds: null };
|
||||
|
||||
// Проверка доступа к форме по скоупам ключа (null = все формы)
|
||||
export function isFormAllowedByScopes(scopes: ApiKeyScopes, formId: number): boolean {
|
||||
return scopes.formIds === null || scopes.formIds.includes(formId);
|
||||
}
|
||||
|
||||
// Проверка доступа к справочнику по скоупам ключа (null = все справочники)
|
||||
export function isTableAllowedByScopes(scopes: ApiKeyScopes, tableId: number): boolean {
|
||||
return scopes.tableIds === null || scopes.tableIds.includes(tableId);
|
||||
}
|
||||
|
||||
// Нормализация скоупов из БД: NULL/отсутствующий или частично заполненный объект
|
||||
// приводится к полной структуре ApiKeyScopes (дефолты — полный доступ).
|
||||
export function normalizeApiKeyScopes(scopes: unknown): ApiKeyScopes {
|
||||
|
||||
Reference in New Issue
Block a user