diff --git a/backend/app/service/file.go b/backend/app/service/file.go index 9c401a4ef..f8f17b070 100644 --- a/backend/app/service/file.go +++ b/backend/app/service/file.go @@ -211,6 +211,10 @@ func (f *FileService) Create(op request.FileCreate) error { } func (f *FileService) Delete(op request.FileDelete) error { + excludeDir := global.CONF.System.DataDir + if strings.Contains(op.Path, ".1panel_clash") || op.Path == excludeDir { + return buserr.New(constant.ErrPathNotDelete) + } fo := files.NewFileOp() recycleBinStatus, _ := settingRepo.Get(settingRepo.WithByKey("FileRecycleBin")) if recycleBinStatus.Value == "disable" { diff --git a/backend/constant/errs.go b/backend/constant/errs.go index f98a70c12..313b8dab2 100644 --- a/backend/constant/errs.go +++ b/backend/constant/errs.go @@ -100,6 +100,7 @@ var ( ErrFileDownloadDir = "ErrFileDownloadDir" ErrCmdNotFound = "ErrCmdNotFound" ErrFavoriteExist = "ErrFavoriteExist" + ErrPathNotDelete = "ErrPathNotDelete" ) // mysql diff --git a/backend/i18n/lang/en.yaml b/backend/i18n/lang/en.yaml index 75acd9a99..445010302 100644 --- a/backend/i18n/lang/en.yaml +++ b/backend/i18n/lang/en.yaml @@ -81,6 +81,8 @@ ErrCmdNotFound: "{{ .name}} command does not exist, please install this command ErrSourcePathNotFound: "Source directory does not exist" ErrFavoriteExist: "This path has been collected" ErrInvalidChar: "Illegal characters are prohibited" +ErrPathNotDelete: "The selected directory cannot be deleted" + #website ErrDomainIsExist: "Domain is already exist" diff --git a/backend/i18n/lang/zh-Hant.yaml b/backend/i18n/lang/zh-Hant.yaml index 68474bbf2..f29fd67b2 100644 --- a/backend/i18n/lang/zh-Hant.yaml +++ b/backend/i18n/lang/zh-Hant.yaml @@ -81,6 +81,7 @@ ErrFileDownloadDir: "不支持下載文件夾" ErrCmdNotFound: "{{ .name}} 命令不存在,請先在宿主機安裝此命令" ErrSourcePathNotFound: "源目錄不存在" ErrFavoriteExist: "已收藏此路徑" +ErrPathNotDelete: "所選目錄不可删除" #website ErrDomainIsExist: "域名已存在" diff --git a/backend/i18n/lang/zh.yaml b/backend/i18n/lang/zh.yaml index bea6fdfdd..08d4ac3cd 100644 --- a/backend/i18n/lang/zh.yaml +++ b/backend/i18n/lang/zh.yaml @@ -81,6 +81,8 @@ ErrCmdNotFound: "{{ .name}} 命令不存在,请先在宿主机安装此命令" ErrSourcePathNotFound: "源目录不存在" ErrFavoriteExist: "已收藏此路径" ErrInvalidChar: "禁止使用非法字符" +ErrPathNotDelete: "所选目录不可删除" + #website ErrDomainIsExist: "域名已存在" diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 8a45dab62..1a9b9cbca 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -1298,6 +1298,7 @@ const message = { noNameFile: 'Untitled File', minimap: 'Code Mini Map', fileCanNotRead: 'File can not read', + panelInstallDir: '1Panel installation directory cannot be deleted', }, ssh: { autoStart: 'Auto Start', diff --git a/frontend/src/lang/modules/tw.ts b/frontend/src/lang/modules/tw.ts index f772c8a60..cbe70cd11 100644 --- a/frontend/src/lang/modules/tw.ts +++ b/frontend/src/lang/modules/tw.ts @@ -1228,6 +1228,7 @@ const message = { noNameFile: '未命名檔案', minimap: '縮略圖', fileCanNotRead: '此文件不支持預覽', + panelInstallDir: '1Panel 安裝目錄不能删除', }, ssh: { autoStart: '開機自啟', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index b953c73cb..897123191 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -1230,6 +1230,7 @@ const message = { noNameFile: '未命名文件', minimap: '缩略图', fileCanNotRead: '此文件不支持预览', + panelInstallDir: '1Panel 安装目录不能删除', }, ssh: { autoStart: '开机自启', diff --git a/frontend/src/views/host/file-management/delete/index.vue b/frontend/src/views/host/file-management/delete/index.vue index fb4a153ff..00fda9a22 100644 --- a/frontend/src/views/host/file-management/delete/index.vue +++ b/frontend/src/views/host/file-management/delete/index.vue @@ -60,6 +60,7 @@ import { File } from '@/api/interface/file'; import { getIcon } from '@/utils/util'; import { DeleteFile, GetRecycleStatus } from '@/api/modules/files'; import { MsgSuccess, MsgWarning } from '@/utils/message'; +import { loadBaseDir } from '@/api/modules/setting'; const open = ref(false); const files = ref(); @@ -85,13 +86,21 @@ const getStatus = async () => { } catch (error) {} }; -const onConfirm = () => { +const onConfirm = async () => { const pros = []; for (const s of files.value) { if (s['path'].indexOf('.1panel_clash') > -1) { MsgWarning(i18n.global.t('file.clashDeleteAlert')); return; } + if (s['isDir']) { + const pathRes = await loadBaseDir(); + if (s['path'] === pathRes.data) { + MsgWarning(i18n.global.t('file.panelInstallDir')); + return; + } + } + pros.push(DeleteFile({ path: s['path'], isDir: s['isDir'], forceDelete: forceDelete.value })); } loading.value = true;