Skip to content

Commit f69351d

Browse files
committed
fix: Fix the issue of deleting project directories caused by failed creation of the running environment
1 parent 325b9c4 commit f69351d

11 files changed

Lines changed: 42 additions & 3 deletions

File tree

agent/app/service/runtime_utils.go

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,24 @@ import (
4141

4242
func handleRuntime(create request.RuntimeCreate, runtime *model.Runtime, fileOp files.FileOp, appVersionDir string) (err error) {
4343
runtimeDir := path.Join(global.Dir.RuntimeDir, create.Type)
44+
projectDir := path.Join(runtimeDir, create.Name)
45+
if create.CodeDir != "" && isPathInsideOrEqual(projectDir, create.CodeDir) {
46+
return buserr.New("ErrRuntimeProjectDirContainsCodeDir")
47+
}
4448
if err = fileOp.CopyDir(appVersionDir, runtimeDir); err != nil {
4549
return
4650
}
4751
versionDir := path.Join(runtimeDir, filepath.Base(appVersionDir))
48-
projectDir := path.Join(runtimeDir, create.Name)
52+
cleanupTarget := versionDir
4953
defer func() {
5054
if err != nil {
51-
_ = fileOp.DeleteDir(projectDir)
55+
_ = fileOp.DeleteDir(cleanupTarget)
5256
}
5357
}()
5458
if err = fileOp.Rename(versionDir, projectDir); err != nil {
5559
return
5660
}
61+
cleanupTarget = projectDir
5762
composeContent, envContent, _, err := handleParams(create, projectDir)
5863
if err != nil {
5964
return
@@ -76,12 +81,36 @@ func handleRuntime(create request.RuntimeCreate, runtime *model.Runtime, fileOp
7681
return
7782
}
7883

84+
func isPathInsideOrEqual(baseDir, targetDir string) bool {
85+
baseAbs := resolveRuntimePath(baseDir)
86+
targetAbs := resolveRuntimePath(targetDir)
87+
rel, err := filepath.Rel(baseAbs, targetAbs)
88+
if err != nil {
89+
return false
90+
}
91+
return rel == "." || (rel != ".." && !strings.HasPrefix(rel, ".."+string(os.PathSeparator)))
92+
}
93+
94+
func resolveRuntimePath(dir string) string {
95+
cleanDir := filepath.Clean(dir)
96+
if realDir, err := filepath.EvalSymlinks(cleanDir); err == nil {
97+
return realDir
98+
}
99+
if absDir, err := filepath.Abs(cleanDir); err == nil {
100+
return absDir
101+
}
102+
return cleanDir
103+
}
104+
79105
func handlePHP(create request.RuntimeCreate, runtime *model.Runtime, fileOp files.FileOp, appVersionDir string) (err error) {
80106
runtimeDir := path.Join(global.Dir.RuntimeDir, create.Type)
107+
projectDir := path.Join(runtimeDir, create.Name)
108+
if create.CodeDir != "" && isPathInsideOrEqual(projectDir, create.CodeDir) {
109+
return buserr.New("ErrRuntimeProjectDirContainsCodeDir")
110+
}
81111
if err = fileOp.CopyDirWithNewName(appVersionDir, runtimeDir, create.Name); err != nil {
82112
return
83113
}
84-
projectDir := path.Join(runtimeDir, create.Name)
85114
defer func() {
86115
if err != nil {
87116
_ = fileOp.DeleteDir(projectDir)

agent/i18n/lang/en.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ ErrSSLValid: 'Certificate file is invalid'
181181
ErrWebsiteDir: 'Select a subdirectory under the website directory'
182182
ErrComposerFileNotFound: "composer.json file does not exist"
183183
ErrRuntimeNoPort: 'Runtime port is not set'
184+
ErrRuntimeProjectDirContainsCodeDir: 'The runtime directory contains the selected project directory. Please choose another project directory and create it again.'
184185
Status: 'Status'
185186
start: 'Start'
186187
stop: 'Stop'

agent/i18n/lang/es-ES.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: 'Archivo de certificado anómalo, revise el estado del certificado'
166166
ErrWebsiteDir: 'seleccione un directorio dentro del directorio del sitio web'
167167
ErrComposerFileNotFound: 'El archivo composer.json no existe'
168168
ErrRuntimeNoPort: 'El entorno de ejecución no tiene configurado un puerto, edítelo primero'
169+
ErrRuntimeProjectDirContainsCodeDir: 'El directorio de ejecución incluye el directorio de proyecto seleccionado. Elija otro directorio de proyecto y créelo de nuevo.'
169170
Status: 'Estado'
170171
start: 'Iniciar'
171172
stop: 'Detener'

agent/i18n/lang/ja.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: '証明書ファイルが異常です、証明書の状態を確認
166166
ErrWebsiteDir: 'ウェブサイトディレクトリ内のディレクトリを選択してください。'
167167
ErrComposerFileNotFound: 'composer.json ファイルが存在しません'
168168
ErrRuntimeNoPort: 'ランタイム環境にポートが設定されていません。先にランタイム環境を編集してください。'
169+
ErrRuntimeProjectDirContainsCodeDir: '実行環境ディレクトリに選択したプロジェクトディレクトリが含まれています。別のプロジェクトディレクトリを選択して、再作成してください。'
169170
Status: 'ステータス'
170171
start: '開始'
171172
stop: '停止'

agent/i18n/lang/ko.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: '인증서 파일에 문제가 있습니다. 인증서 상태를
166166
ErrWebsiteDir: '웹사이트 디렉토리 내의 디렉토리를 선택하세요.'
167167
ErrComposerFileNotFound: 'composer.json 파일이 존재하지 않습니다'
168168
ErrRuntimeNoPort: '런타임 환경에 포트가 설정되지 않았습니다. 먼저 런타임 환경을 편집하세요.'
169+
ErrRuntimeProjectDirContainsCodeDir: '런타임 디렉터리에 선택한 프로젝트 디렉터리가 포함되어 있습니다. 다른 프로젝트 디렉터리를 선택한 후 다시 생성해 주세요.'
169170
Status: '상태'
170171
start: '시작'
171172
stop: '중지'

agent/i18n/lang/ms.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: 'Fail sijil bermasalah, sila periksa status sijil'
166166
ErrWebsiteDir: 'Sila pilih direktori dalam direktori laman web.'
167167
ErrComposerFileNotFound: 'Fail composer.json tidak wujud'
168168
ErrRuntimeNoPort: 'Persekitaran runtime tidak diset dengan port, sila edit persekitaran runtime terlebih dahulu.'
169+
ErrRuntimeProjectDirContainsCodeDir: 'Direktori runtime mengandungi direktori projek yang dipilih. Sila pilih direktori projek lain dan cipta semula.'
169170
Status: 'Status'
170171
start: 'Mulakan'
171172
stop: 'Berhenti'

agent/i18n/lang/pt-BR.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: 'O arquivo do certificado está anormal, verifique o status do cert
166166
ErrWebsiteDir: ', selecione um diretório dentro do diretório do site.'
167167
ErrComposerFileNotFound: 'O arquivo composer.json não existe'
168168
ErrRuntimeNoPort: 'O ambiente de tempo de execução não está configurado com uma porta, edite o ambiente de tempo de execução primeiro.'
169+
ErrRuntimeProjectDirContainsCodeDir: 'O diretório de execução inclui o diretório de projeto selecionado. Escolha outro diretório de projeto e crie novamente.'
169170
Status: 'Status'
170171
start: 'Iniciar'
171172
stop: 'Parar'

agent/i18n/lang/ru.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: 'Файл сертификата аномален, проверьт
166166
ErrWebsiteDir: 'Пожалуйста, выберите директорию внутри директории сайта.'
167167
ErrComposerFileNotFound: 'Файл composer.json не существует'
168168
ErrRuntimeNoPort: 'Среда выполнения не настроена с портом, сначала отредактируйте среду выполнения.'
169+
ErrRuntimeProjectDirContainsCodeDir: 'Каталог среды выполнения содержит выбранный каталог проекта. Выберите другой каталог проекта и создайте его заново.'
169170
Status: 'Статус'
170171
start: 'Запустить'
171172
stop: 'Остановить'

agent/i18n/lang/tr.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: 'Sertifika dosyası anormal, lütfen sertifika durumunu kontrol edi
166166
ErrWebsiteDir: 'Lütfen web sitesi dizini içindeki bir dizin seçin.'
167167
ErrComposerFileNotFound: 'composer.json dosyası mevcut değil'
168168
ErrRuntimeNoPort: 'Çalışma zamanı ortamı bir porta sahip değil, lütfen önce çalışma zamanı ortamını düzenleyin.'
169+
ErrRuntimeProjectDirContainsCodeDir: 'Çalışma zamanı dizini, seçilen proje dizinini içeriyor. Lütfen başka bir proje dizini seçip yeniden oluşturun.'
169170
Status: 'Durum'
170171
start: 'Başlat'
171172
stop: 'Durdur'

agent/i18n/lang/zh-Hant.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ ErrSSLValid: '憑證檔案異常,請檢查憑證狀態!'
166166
ErrWebsiteDir: '請選擇網站目錄下的目錄'
167167
ErrComposerFileNotFound: 'composer.json 檔案不存在'
168168
ErrRuntimeNoPort: '執行環境未設定埠,請先編輯執行環境'
169+
ErrRuntimeProjectDirContainsCodeDir: '執行環境目錄包含所選專案目錄,請先更換專案目錄後再重新建立'
169170
Status: '狀態'
170171
start: '開啟'
171172
stop: '關閉'

0 commit comments

Comments
 (0)