mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-09-23 16:00:52 +00:00
fix: Add rule validation for FTP account creation (#9437)
This commit is contained in:
@@ -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',
|
||||
|
||||
@@ -1207,6 +1207,10 @@ const message = {
|
||||
enableHelper: '選択したFTPアカウントを有効にすると、アクセス許可が復元されます。続けたいですか?',
|
||||
disableHelper: '選択したFTPアカウントを無効にすると、アクセス許可が取り消されます。続けたいですか?',
|
||||
syncHelper: 'サーバーとデータベースの間でFTPアカウントデータを同期します。続けたいですか?',
|
||||
dirSystem:
|
||||
'このディレクトリはシステム予約領域です。変更するとシステムがクラッシュする可能性があります。修正して再試行してください!',
|
||||
dirHelper: 'FTPを有効にするにはディレクトリ権限の変更が必要です。慎重に選択してください',
|
||||
dirMsg: 'FTPを有効にすると{0}ディレクトリ全体の権限が変更されます。続行しますか?',
|
||||
},
|
||||
clam: {
|
||||
clam: 'ウイルススキャン',
|
||||
|
||||
@@ -1196,6 +1196,10 @@ const message = {
|
||||
enableHelper: '선택한 FTP 계정을 활성화하면 접근 권한이 복원됩니다. 계속하시겠습니까?',
|
||||
disableHelper: '선택한 FTP 계정을 비활성화하면 접근 권한이 취소됩니다. 계속하시겠습니까?',
|
||||
syncHelper: '서버와 데이터베이스 간의 FTP 계정 데이터를 동기화합니다. 계속하시겠습니까?',
|
||||
dirSystem:
|
||||
'이 디렉터리는 시스템 예약 디렉터리입니다. 수정 시 시스템 충돌이 발생할 수 있으니 수정 후 다시 시도하세요!',
|
||||
dirHelper: 'FTP 활성화를 위해 디렉터리 권한 변경이 필요합니다. 신중하게 선택하세요',
|
||||
dirMsg: 'FTP 활성화 시 {0} 디렉터리 전체의 권한이 변경됩니다. 계속하시겠습니까?',
|
||||
},
|
||||
clam: {
|
||||
clam: '바이러스 검사',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -1237,6 +1237,10 @@ const message = {
|
||||
enableHelper: 'Включение выбранного FTP аккаунта восстановит его права доступа. Хотите продолжить?',
|
||||
disableHelper: 'Отключение выбранного FTP аккаунта отзовет его права доступа. Хотите продолжить?',
|
||||
syncHelper: 'Синхронизировать данные FTP аккаунта между сервером и базой данных. Хотите продолжить?',
|
||||
dirSystem:
|
||||
'Это системный каталог. Его изменение может вызвать сбой системы. Пожалуйста, измените и повторите попытку!',
|
||||
dirHelper: 'Для включения FTP требуется изменение прав доступа к каталогу - выбирайте осторожно',
|
||||
dirMsg: 'Включение FTP изменит права доступа для всего каталога {0}. Продолжить?',
|
||||
},
|
||||
clam: {
|
||||
clam: 'Антивирусное сканирование',
|
||||
|
||||
@@ -1200,6 +1200,9 @@ const message = {
|
||||
enableHelper: '啟用選取的 FTP 帳號後,該 FTP 帳號將恢復訪問權限,是否繼續操作?',
|
||||
disableHelper: '停用選取的 FTP 帳號後,該 FTP 帳號將失去訪問權限,是否繼續操作?',
|
||||
syncHelper: '同步伺服器與資料庫中的 FTP 帳戶資料,是否繼續操作?',
|
||||
dirSystem: '該目錄為系統保留目錄,修改可能導致系統崩潰,請修改後重試!',
|
||||
dirHelper: '開啟 FTP 需要修改目錄權限,請謹慎選擇',
|
||||
dirMsg: '開啟 FTP 將修改整個 {0} 目錄權限,是否繼續?',
|
||||
},
|
||||
clam: {
|
||||
clam: '病毒掃描',
|
||||
|
||||
@@ -1199,6 +1199,9 @@ const message = {
|
||||
enableHelper: '启用选中的 FTP 账号后,该 FTP 账号恢复访问权限,是否继续操作?',
|
||||
disableHelper: '停用选中的 FTP 账号后,该 FTP 账号将失去访问权限,是否继续操作?',
|
||||
syncHelper: '同步服务器与数据库中的 FTP 账户数据,是否继续操作?',
|
||||
dirSystem: '该目录为系统保留目录,修改可能导致系统崩溃,请修改后重试!',
|
||||
dirHelper: '开启 FTP 需要修改目录权限,请谨慎选择',
|
||||
dirMsg: '开启 FTP 将修改整个 {0} 目录权限,是否继续?',
|
||||
},
|
||||
clam: {
|
||||
clam: '病毒扫描',
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user