fix: Add rule validation for FTP account creation (#9437)

This commit is contained in:
ssongliu
2025-07-07 06:25:49 +00:00
committed by GitHub
parent f387d89a45
commit 4ca188973e
10 changed files with 86 additions and 20 deletions
+4
View File
@@ -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',
+4
View File
@@ -1207,6 +1207,10 @@ const message = {
enableHelper: '選択したFTPアカウントを有効にすると、アクセス許可が復元されます。続けたいですか?',
disableHelper: '選択したFTPアカウントを無効にすると、アクセス許可が取り消されます。続けたいですか?',
syncHelper: 'サーバーとデータベースの間でFTPアカウントデータを同期します。続けたいですか?',
dirSystem:
'このディレクトリはシステム予約領域です。変更するとシステムがクラッシュする可能性があります。修正して再試行してください!',
dirHelper: 'FTPを有効にするにはディレクトリ権限の変更が必要です。慎重に選択してください',
dirMsg: 'FTPを有効にすると{0}ディレクトリ全体の権限が変更されます。続行しますか?',
},
clam: {
clam: 'ウイルススキャン',
+4
View File
@@ -1196,6 +1196,10 @@ const message = {
enableHelper: '선택한 FTP 계정을 활성화하면 접근 권한이 복원됩니다. 계속하시겠습니까?',
disableHelper: '선택한 FTP 계정을 비활성화하면 접근 권한이 취소됩니다. 계속하시겠습니까?',
syncHelper: '서버와 데이터베이스 간의 FTP 계정 데이터를 동기화합니다. 계속하시겠습니까?',
dirSystem:
'이 디렉터리는 시스템 예약 디렉터리입니다. 수정 시 시스템 충돌이 발생할 수 있으니 수정 후 다시 시도하세요!',
dirHelper: 'FTP 활성화를 위해 디렉터리 권한 변경이 필요합니다. 신중하게 선택하세요',
dirMsg: 'FTP 활성화 시 {0} 디렉터리 전체의 권한이 변경됩니다. 계속하시겠습니까?',
},
clam: {
clam: '바이러스 검사',
+4
View File
@@ -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',
+4
View File
@@ -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',
+4
View File
@@ -1237,6 +1237,10 @@ const message = {
enableHelper: 'Включение выбранного FTP аккаунта восстановит его права доступа. Хотите продолжить?',
disableHelper: 'Отключение выбранного FTP аккаунта отзовет его права доступа. Хотите продолжить?',
syncHelper: 'Синхронизировать данные FTP аккаунта между сервером и базой данных. Хотите продолжить?',
dirSystem:
'Это системный каталог. Его изменение может вызвать сбой системы. Пожалуйста, измените и повторите попытку!',
dirHelper: 'Для включения FTP требуется изменение прав доступа к каталогу - выбирайте осторожно',
dirMsg: 'Включение FTP изменит права доступа для всего каталога {0}. Продолжить?',
},
clam: {
clam: 'Антивирусное сканирование',
+3
View File
@@ -1200,6 +1200,9 @@ const message = {
enableHelper: '啟用選取的 FTP 帳號後 FTP 帳號將恢復訪問權限是否繼續操作',
disableHelper: '停用選取的 FTP 帳號後 FTP 帳號將失去訪問權限是否繼續操作',
syncHelper: '同步伺服器與資料庫中的 FTP 帳戶資料是否繼續操作',
dirSystem: '該目錄為系統保留目錄修改可能導致系統崩潰請修改後重試',
dirHelper: '開啟 FTP 需要修改目錄權限請謹慎選擇',
dirMsg: '開啟 FTP 將修改整個 {0} 目錄權限是否繼續',
},
clam: {
clam: '病毒掃描',
+3
View File
@@ -1199,6 +1199,9 @@ const message = {
enableHelper: '启用选中的 FTP 账号后 FTP 账号恢复访问权限是否继续操作',
disableHelper: '停用选中的 FTP 账号后 FTP 账号将失去访问权限是否继续操作',
syncHelper: '同步服务器与数据库中的 FTP 账户数据是否继续操作',
dirSystem: '该目录为系统保留目录修改可能导致系统崩溃请修改后重试',
dirHelper: '开启 FTP 需要修改目录权限请谨慎选择',
dirMsg: '开启 FTP 将修改整个 {0} 目录权限是否继续',
},
clam: {
clam: '病毒扫描',
+22
View File
@@ -819,3 +819,25 @@ export const preloadImage = (url: string): Promise<string> => {
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;
};
@@ -23,6 +23,7 @@
<FileList @choose="loadDir" :dir="true"></FileList>
</template>
</el-input>
<span class="input-help">{{ $t('toolbox.ftp.dirHelper') }}</span>
</el-form-item>
<el-form-item :label="$t('commons.table.description')" prop="description">
<el-input type="textarea" :rows="3" clearable v-model="dialogData.rowData!.description" />
@@ -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<typeof ElForm>;
@@ -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;
});
});
});
};