From 7f1cab989fa1ea95f0442cd10474b9baae7f6a43 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Thu, 22 Jan 2026 06:52:52 +0000 Subject: [PATCH] fix: add i18n translation key and fix security validation path in SaveImageTool --- src/core/tools/SaveImageTool.ts | 30 +++++++++++++++--------------- src/i18n/locales/ca/tools.json | 3 +++ src/i18n/locales/de/tools.json | 3 +++ src/i18n/locales/en/tools.json | 3 +++ src/i18n/locales/es/tools.json | 3 +++ src/i18n/locales/fr/tools.json | 3 +++ src/i18n/locales/hi/tools.json | 3 +++ src/i18n/locales/id/tools.json | 3 +++ src/i18n/locales/it/tools.json | 3 +++ src/i18n/locales/ja/tools.json | 3 +++ src/i18n/locales/ko/tools.json | 3 +++ src/i18n/locales/nl/tools.json | 3 +++ src/i18n/locales/pl/tools.json | 3 +++ src/i18n/locales/pt-BR/tools.json | 3 +++ src/i18n/locales/ru/tools.json | 3 +++ src/i18n/locales/tr/tools.json | 3 +++ src/i18n/locales/vi/tools.json | 3 +++ src/i18n/locales/zh-CN/tools.json | 3 +++ src/i18n/locales/zh-TW/tools.json | 3 +++ 19 files changed, 69 insertions(+), 15 deletions(-) diff --git a/src/core/tools/SaveImageTool.ts b/src/core/tools/SaveImageTool.ts index ecf9fbf5b9..aac282b567 100644 --- a/src/core/tools/SaveImageTool.ts +++ b/src/core/tools/SaveImageTool.ts @@ -36,21 +36,7 @@ export class SaveImageTool extends BaseTool<"save_image"> { return } - // Validate access via .rooignore - const accessAllowed = task.rooIgnoreController?.validateAccess(relPath) - if (!accessAllowed) { - await task.say("rooignore_error", relPath) - pushToolResult(formatResponse.rooIgnoreError(relPath)) - return - } - - // Check write protection - const isWriteProtected = task.rooProtectedController?.isWriteProtected(relPath) || false - - const fullPath = path.resolve(task.cwd, relPath) - const isOutsideWorkspace = isPathOutsideWorkspace(fullPath) - - // Validate the image data format + // Validate the image data format first (to determine finalPath) const base64Match = data.match(/^data:image\/(png|jpeg|jpg|gif|webp|svg\+xml);base64,(.+)$/) if (!base64Match) { await task.say("error", t("tools:saveImage.invalidDataFormat")) @@ -74,6 +60,20 @@ export class SaveImageTool extends BaseTool<"save_image"> { finalPath = `${finalPath}.${ext}` } + // Validate access via .rooignore (using finalPath after extension is added) + const accessAllowed = task.rooIgnoreController?.validateAccess(finalPath) + if (!accessAllowed) { + await task.say("rooignore_error", finalPath) + pushToolResult(formatResponse.rooIgnoreError(finalPath)) + return + } + + // Check write protection (using finalPath after extension is added) + const isWriteProtected = task.rooProtectedController?.isWriteProtected(finalPath) || false + + const fullPath = path.resolve(task.cwd, finalPath) + const isOutsideWorkspace = isPathOutsideWorkspace(fullPath) + const sharedMessageProps = { tool: "saveImage" as const, path: getReadablePath(task.cwd, finalPath), diff --git a/src/i18n/locales/ca/tools.json b/src/i18n/locales/ca/tools.json index 7e9385abf0..d0f505b8e2 100644 --- a/src/i18n/locales/ca/tools.json +++ b/src/i18n/locales/ca/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Es requereix autenticació de Roo Code Cloud per a la generació d'imatges. Inicia sessió a Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Format de dades d'imatge no vàlid. S'esperava una URL de dades base64 (p. ex., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/de/tools.json b/src/i18n/locales/de/tools.json index 8dc5e93e70..4043722d9a 100644 --- a/src/i18n/locales/de/tools.json +++ b/src/i18n/locales/de/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Roo Code Cloud-Authentifizierung ist für die Bildgenerierung erforderlich. Bitte melde dich bei Roo Code Cloud an." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/en/tools.json b/src/i18n/locales/en/tools.json index 94e1820249..4f2fc57849 100644 --- a/src/i18n/locales/en/tools.json +++ b/src/i18n/locales/en/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Roo Code Cloud authentication is required for image generation. Please sign in to Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/es/tools.json b/src/i18n/locales/es/tools.json index 9103643cfc..077704db9d 100644 --- a/src/i18n/locales/es/tools.json +++ b/src/i18n/locales/es/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Se requiere autenticación de Roo Code Cloud para la generación de imágenes. Por favor, inicia sesión en Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/fr/tools.json b/src/i18n/locales/fr/tools.json index df0a1136cb..6023db8663 100644 --- a/src/i18n/locales/fr/tools.json +++ b/src/i18n/locales/fr/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "L'authentification Roo Code Cloud est requise pour la génération d'images. Veuillez vous connecter à Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/hi/tools.json b/src/i18n/locales/hi/tools.json index 73c7729a93..7bd5a26c8d 100644 --- a/src/i18n/locales/hi/tools.json +++ b/src/i18n/locales/hi/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "छवि निर्माण के लिए Roo Code Cloud प्रमाणीकरण आवश्यक है। कृपया Roo Code Cloud में साइन इन करें।" } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/id/tools.json b/src/i18n/locales/id/tools.json index 412711104b..cf4c5167a1 100644 --- a/src/i18n/locales/id/tools.json +++ b/src/i18n/locales/id/tools.json @@ -30,5 +30,8 @@ "roo": { "authRequired": "Autentikasi Roo Code Cloud diperlukan untuk menghasilkan gambar. Silakan masuk ke Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/it/tools.json b/src/i18n/locales/it/tools.json index 24022f52ae..f50de5bb97 100644 --- a/src/i18n/locales/it/tools.json +++ b/src/i18n/locales/it/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "L'autenticazione Roo Code Cloud è richiesta per la generazione di immagini. Accedi a Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/ja/tools.json b/src/i18n/locales/ja/tools.json index f79ce9ac2f..c135355f84 100644 --- a/src/i18n/locales/ja/tools.json +++ b/src/i18n/locales/ja/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "画像生成にはRoo Code Cloud認証が必要です。Roo Code Cloudにサインインしてください。" } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/ko/tools.json b/src/i18n/locales/ko/tools.json index 88cf28cdcc..0eff7b6967 100644 --- a/src/i18n/locales/ko/tools.json +++ b/src/i18n/locales/ko/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "이미지 생성에는 Roo Code Cloud 인증이 필요합니다. Roo Code Cloud에 로그인하세요." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/nl/tools.json b/src/i18n/locales/nl/tools.json index d696a19937..9108cde996 100644 --- a/src/i18n/locales/nl/tools.json +++ b/src/i18n/locales/nl/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Roo Code Cloud-authenticatie is vereist voor het genereren van afbeeldingen. Log in bij Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/pl/tools.json b/src/i18n/locales/pl/tools.json index d7c0d18c14..3999986ea9 100644 --- a/src/i18n/locales/pl/tools.json +++ b/src/i18n/locales/pl/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Uwierzytelnienie Roo Code Cloud jest wymagane do generowania obrazów. Zaloguj się do Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/pt-BR/tools.json b/src/i18n/locales/pt-BR/tools.json index e8da6dae7f..20d72a6c11 100644 --- a/src/i18n/locales/pt-BR/tools.json +++ b/src/i18n/locales/pt-BR/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "A autenticação do Roo Code Cloud é necessária para geração de imagens. Faça login no Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/ru/tools.json b/src/i18n/locales/ru/tools.json index 0e4e146605..d13c380195 100644 --- a/src/i18n/locales/ru/tools.json +++ b/src/i18n/locales/ru/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Для генерации изображений требуется аутентификация Roo Code Cloud. Войдите в Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/tr/tools.json b/src/i18n/locales/tr/tools.json index 2f4263b20d..1a09c8e952 100644 --- a/src/i18n/locales/tr/tools.json +++ b/src/i18n/locales/tr/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Görüntü oluşturma için Roo Code Cloud kimlik doğrulaması gereklidir. Lütfen Roo Code Cloud'da oturum açın." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/vi/tools.json b/src/i18n/locales/vi/tools.json index 4bccf1ff48..2855519da3 100644 --- a/src/i18n/locales/vi/tools.json +++ b/src/i18n/locales/vi/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "Yêu cầu xác thực Roo Code Cloud để tạo hình ảnh. Vui lòng đăng nhập vào Roo Code Cloud." } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/zh-CN/tools.json b/src/i18n/locales/zh-CN/tools.json index 886706ff85..88b60f0a42 100644 --- a/src/i18n/locales/zh-CN/tools.json +++ b/src/i18n/locales/zh-CN/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "图像生成需要 Roo Code Cloud 认证。请登录 Roo Code Cloud。" } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } } diff --git a/src/i18n/locales/zh-TW/tools.json b/src/i18n/locales/zh-TW/tools.json index ebd0f104ad..618f5e6a9b 100644 --- a/src/i18n/locales/zh-TW/tools.json +++ b/src/i18n/locales/zh-TW/tools.json @@ -27,5 +27,8 @@ "roo": { "authRequired": "圖像生成需要 Roo Code Cloud 認證。請登入 Roo Code Cloud。" } + }, + "saveImage": { + "invalidDataFormat": "Invalid image data format. Expected a base64 data URL (e.g., 'data:image/png;base64,...')." } }