From 4ca188973e7528fcc5f89899df7590ea4bd04e62 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Mon, 7 Jul 2025 14:25:49 +0800 Subject: [PATCH] fix: Add rule validation for FTP account creation (#9437) --- frontend/src/lang/modules/en.ts | 4 ++ frontend/src/lang/modules/ja.ts | 4 ++ frontend/src/lang/modules/ko.ts | 4 ++ frontend/src/lang/modules/ms.ts | 4 ++ frontend/src/lang/modules/pt-br.ts | 4 ++ frontend/src/lang/modules/ru.ts | 4 ++ frontend/src/lang/modules/zh-Hant.ts | 3 ++ frontend/src/lang/modules/zh.ts | 3 ++ frontend/src/utils/util.ts | 22 ++++++++ .../src/views/toolbox/ftp/operate/index.vue | 54 ++++++++++++------- 10 files changed, 86 insertions(+), 20 deletions(-) diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index b2d4f2a30..db0c9ebac 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1263,6 +1263,10 @@ const message = { disableHelper: 'Disabling the selected FTP account will revoke its access permissions. Do you want to continue?', syncHelper: 'Sync FTP account data between server and database. Do you want to continue?', + dirSystem: + 'This directory is system-reserved. Modification may cause system crash, please modify and try again!', + dirHelper: 'Enabling FTP requires directory permission changes - please choose carefully', + dirMsg: 'Enabling FTP will modify permissions for the entire {0} directory. Continue?', }, clam: { clam: 'Virus scan', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index faca850f7..1296315bb 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -1207,6 +1207,10 @@ const message = { enableHelper: '選択したFTPアカウントを有効にすると、アクセス許可が復元されます。続けたいですか?', disableHelper: '選択したFTPアカウントを無効にすると、アクセス許可が取り消されます。続けたいですか?', syncHelper: 'サーバーとデータベースの間でFTPアカウントデータを同期します。続けたいですか?', + dirSystem: + 'このディレクトリはシステム予約領域です。変更するとシステムがクラッシュする可能性があります。修正して再試行してください!', + dirHelper: 'FTPを有効にするにはディレクトリ権限の変更が必要です。慎重に選択してください', + dirMsg: 'FTPを有効にすると{0}ディレクトリ全体の権限が変更されます。続行しますか?', }, clam: { clam: 'ウイルススキャン', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index a85380066..859fbc5d0 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -1196,6 +1196,10 @@ const message = { enableHelper: '선택한 FTP 계정을 활성화하면 접근 권한이 복원됩니다. 계속하시겠습니까?', disableHelper: '선택한 FTP 계정을 비활성화하면 접근 권한이 취소됩니다. 계속하시겠습니까?', syncHelper: '서버와 데이터베이스 간의 FTP 계정 데이터를 동기화합니다. 계속하시겠습니까?', + dirSystem: + '이 디렉터리는 시스템 예약 디렉터리입니다. 수정 시 시스템 충돌이 발생할 수 있으니 수정 후 다시 시도하세요!', + dirHelper: 'FTP 활성화를 위해 디렉터리 권한 변경이 필요합니다. 신중하게 선택하세요', + dirMsg: 'FTP 활성화 시 {0} 디렉터리 전체의 권한이 변경됩니다. 계속하시겠습니까?', }, clam: { clam: '바이러스 검사', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 0f6d1e453..e3457292d 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -1247,6 +1247,10 @@ const message = { disableHelper: 'Melumpuhkan akaun FTP yang dipilih akan membatalkan kebenaran aksesnya. Adakah anda mahu meneruskan?', syncHelper: 'Selaraskan data akaun FTP antara pelayan dan pangkalan data. Adakah anda mahu meneruskan?', + dirSystem: + 'Direktori ini dikhaskan untuk sistem. Pengubahsuaian mungkin menyebabkan sistem rosak, sila ubah dan cuba lagi!', + dirHelper: 'Membolehkan FTP memerlukan perubahan kebenaran direktori - sila pilih dengan berhati-hati', + dirMsg: 'Membolehkan FTP akan mengubah kebenaran untuk seluruh direktori {0}. Teruskan?', }, clam: { clam: 'Imbasan virus', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index d8cbae567..cb9454d65 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -1233,6 +1233,10 @@ const message = { enableHelper: 'Ativar a conta FTP selecionada restaurará suas permissões de acesso. Deseja continuar?', disableHelper: 'Desativar a conta FTP selecionada revogará suas permissões de acesso. Deseja continuar?', syncHelper: 'Sincronizar os dados da conta FTP entre o servidor e o banco de dados. Deseja continuar?', + dirSystem: + 'Este diretório é reservado do sistema. Modificações podem causar falhas no sistema. Por favor, modifique e tente novamente!', + dirHelper: 'Habilitar FTP requer alterações nas permissões do diretório - por favor, escolha com cuidado', + dirMsg: 'Habilitar FTP modificará as permissões de todo o diretório {0}. Continuar?', }, clam: { clam: 'Scan de vírus', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 274741e3e..2fb928ef7 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -1237,6 +1237,10 @@ const message = { enableHelper: 'Включение выбранного FTP аккаунта восстановит его права доступа. Хотите продолжить?', disableHelper: 'Отключение выбранного FTP аккаунта отзовет его права доступа. Хотите продолжить?', syncHelper: 'Синхронизировать данные FTP аккаунта между сервером и базой данных. Хотите продолжить?', + dirSystem: + 'Это системный каталог. Его изменение может вызвать сбой системы. Пожалуйста, измените и повторите попытку!', + dirHelper: 'Для включения FTP требуется изменение прав доступа к каталогу - выбирайте осторожно', + dirMsg: 'Включение FTP изменит права доступа для всего каталога {0}. Продолжить?', }, clam: { clam: 'Антивирусное сканирование', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index facc2f8dc..2082cc626 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -1200,6 +1200,9 @@ const message = { enableHelper: '啟用選取的 FTP 帳號後,該 FTP 帳號將恢復訪問權限,是否繼續操作?', disableHelper: '停用選取的 FTP 帳號後,該 FTP 帳號將失去訪問權限,是否繼續操作?', syncHelper: '同步伺服器與資料庫中的 FTP 帳戶資料,是否繼續操作?', + dirSystem: '該目錄為系統保留目錄,修改可能導致系統崩潰,請修改後重試!', + dirHelper: '開啟 FTP 需要修改目錄權限,請謹慎選擇', + dirMsg: '開啟 FTP 將修改整個 {0} 目錄權限,是否繼續?', }, clam: { clam: '病毒掃描', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index c3d6d2116..c68b0ddae 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1199,6 +1199,9 @@ const message = { enableHelper: '启用选中的 FTP 账号后,该 FTP 账号恢复访问权限,是否继续操作?', disableHelper: '停用选中的 FTP 账号后,该 FTP 账号将失去访问权限,是否继续操作?', syncHelper: '同步服务器与数据库中的 FTP 账户数据,是否继续操作?', + dirSystem: '该目录为系统保留目录,修改可能导致系统崩溃,请修改后重试!', + dirHelper: '开启 FTP 需要修改目录权限,请谨慎选择', + dirMsg: '开启 FTP 将修改整个 {0} 目录权限,是否继续?', }, clam: { clam: '病毒扫描', diff --git a/frontend/src/utils/util.ts b/frontend/src/utils/util.ts index 5dc6de0b1..6ce368d3c 100644 --- a/frontend/src/utils/util.ts +++ b/frontend/src/utils/util.ts @@ -819,3 +819,25 @@ export const preloadImage = (url: string): Promise => { img.src = url; }); }; + +export const isSensitiveLinuxPath = (path) => { + let sensitivePath = [ + '/', + '/bin', + '/sbin', + '/usr/bin', + '/usr/sbin', + '/usr/local/bin', + '/etc', + '/lib', + '/lib64', + '/usr/lib', + '/home', + '/tmp', + '/var', + '/dev', + '/proc', + '/sys', + ]; + return sensitivePath.indexOf(path) !== -1; +}; diff --git a/frontend/src/views/toolbox/ftp/operate/index.vue b/frontend/src/views/toolbox/ftp/operate/index.vue index fe96e117d..a000dcebc 100644 --- a/frontend/src/views/toolbox/ftp/operate/index.vue +++ b/frontend/src/views/toolbox/ftp/operate/index.vue @@ -23,6 +23,7 @@ + {{ $t('toolbox.ftp.dirHelper') }} @@ -48,7 +49,7 @@ import { ElForm } from 'element-plus'; import { MsgSuccess } from '@/utils/message'; import { Toolbox } from '@/api/interface/toolbox'; import { createFtp, updateFtp } from '@/api/modules/toolbox'; -import { getRandomStr } from '@/utils/util'; +import { getRandomStr, isSensitiveLinuxPath } from '@/utils/util'; interface DialogProps { title: string; @@ -77,10 +78,18 @@ const handleClose = () => { drawerVisible.value = false; }; +const verifyPath = (rule: any, value: any, callback: any) => { + if (isSensitiveLinuxPath(dialogData.value.rowData.path)) { + callback(new Error(i18n.global.t('toolbox.ftp.dirSystem'))); + return; + } + callback(); +}; + const rules = reactive({ user: [Rules.simpleName], password: [Rules.simplePassword], - path: [Rules.requiredInput, Rules.noSpace], + path: [Rules.requiredInput, Rules.noSpace, { validator: verifyPath, trigger: 'change', required: true }], }); type FormInstance = InstanceType; @@ -94,32 +103,37 @@ const onSubmit = async (formEl: FormInstance | undefined) => { if (!formEl) return; formEl.validate(async (valid) => { if (!valid) return; - loading.value = true; - if (dialogData.value.title === 'edit') { - await updateFtp(dialogData.value.rowData) + ElMessageBox.confirm(i18n.global.t('toolbox.ftp.dirMsg', [dialogData.value.rowData.path]), 'FTP', { + confirmButtonText: i18n.global.t('commons.button.confirm'), + cancelButtonText: i18n.global.t('commons.button.cancel'), + }).then(async () => { + loading.value = true; + if (dialogData.value.title === 'edit') { + await updateFtp(dialogData.value.rowData) + .then(() => { + loading.value = false; + drawerVisible.value = false; + MsgSuccess(i18n.global.t('commons.msg.operationSuccess')); + emit('search'); + }) + .catch(() => { + loading.value = false; + }); + + return; + } + + await createFtp(dialogData.value.rowData) .then(() => { loading.value = false; - drawerVisible.value = false; MsgSuccess(i18n.global.t('commons.msg.operationSuccess')); emit('search'); + drawerVisible.value = false; }) .catch(() => { loading.value = false; }); - - return; - } - - await createFtp(dialogData.value.rowData) - .then(() => { - loading.value = false; - MsgSuccess(i18n.global.t('commons.msg.operationSuccess')); - emit('search'); - drawerVisible.value = false; - }) - .catch(() => { - loading.value = false; - }); + }); }); };