mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/1Panel-dev/1Panel.git
synced 2026-09-20 16:13:59 +08:00
* refactor: enhance rewrite configuration handling by introducing safe name validation and custom rewrite existence checks * test: cover custom rewrite name handling
169 lines
4.7 KiB
Go
169 lines
4.7 KiB
Go
package service
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"strings"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/app/dto"
|
|
"github.com/1Panel-dev/1Panel/agent/app/dto/request"
|
|
"github.com/1Panel-dev/1Panel/agent/app/dto/response"
|
|
"github.com/1Panel-dev/1Panel/agent/app/repo"
|
|
"github.com/1Panel-dev/1Panel/agent/buserr"
|
|
"github.com/1Panel-dev/1Panel/agent/cmd/server/nginx_conf"
|
|
"github.com/1Panel-dev/1Panel/agent/constant"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/files"
|
|
)
|
|
|
|
func (w WebsiteService) UpdateRewriteConfig(req request.NginxRewriteUpdate) error {
|
|
website, err := websiteRepo.GetFirst(repo.WithByID(req.WebsiteID))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
includePath := fmt.Sprintf("/www/sites/%s/rewrite/%s.conf", website.Alias, website.Alias)
|
|
absolutePath := GetSitePath(website, SiteReWritePath)
|
|
fileOp := files.NewFileOp()
|
|
var oldRewriteContent []byte
|
|
if !fileOp.Stat(path.Dir(absolutePath)) {
|
|
if err := fileOp.CreateDir(path.Dir(absolutePath), constant.DirPerm); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if !fileOp.Stat(absolutePath) {
|
|
if err := fileOp.CreateFile(absolutePath); err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
oldRewriteContent, err = fileOp.GetContent(absolutePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if err := fileOp.WriteFile(absolutePath, strings.NewReader(req.Content), constant.DirPerm); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := updateNginxConfig(constant.NginxScopeServer, []dto.NginxParam{{Name: "include", Params: []string{includePath}}}, &website); err != nil {
|
|
_ = fileOp.WriteFile(absolutePath, bytes.NewReader(oldRewriteContent), constant.DirPerm)
|
|
return err
|
|
}
|
|
website.Rewrite = req.Name
|
|
return websiteRepo.Save(context.Background(), &website)
|
|
}
|
|
|
|
func (w WebsiteService) GetRewriteConfig(req request.NginxRewriteReq) (*response.NginxRewriteRes, error) {
|
|
website, err := websiteRepo.GetFirst(repo.WithByID(req.WebsiteID))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var contentByte []byte
|
|
if req.Name == "current" {
|
|
rewriteConfPath := GetSitePath(website, SiteReWritePath)
|
|
fileOp := files.NewFileOp()
|
|
if fileOp.Stat(rewriteConfPath) {
|
|
contentByte, err = fileOp.GetContent(rewriteConfPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
} else {
|
|
safeName, err := getSafeRewriteName(req.Name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
customRewriteFile := path.Join(GetOpenrestyDir(DefaultRewriteDir), fmt.Sprintf("%s.conf", safeName))
|
|
if files.NewFileOp().Stat(customRewriteFile) {
|
|
contentByte, err = files.NewFileOp().GetContent(customRewriteFile)
|
|
} else {
|
|
rewriteFile := fmt.Sprintf("rewrite/%s.conf", strings.ToLower(safeName))
|
|
contentByte, _ = nginx_conf.Rewrites.ReadFile(rewriteFile)
|
|
}
|
|
}
|
|
return &response.NginxRewriteRes{
|
|
Content: string(contentByte),
|
|
}, err
|
|
}
|
|
|
|
func (w WebsiteService) OperateCustomRewrite(req request.CustomRewriteOperate) error {
|
|
rewriteDir := GetOpenrestyDir(DefaultRewriteDir)
|
|
fileOp := files.NewFileOp()
|
|
if !fileOp.Stat(rewriteDir) {
|
|
if err := fileOp.CreateDir(rewriteDir, constant.DirPerm); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
safeName, err := getSafeRewriteName(req.Name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
rewriteFile := path.Join(rewriteDir, fmt.Sprintf("%s.conf", safeName))
|
|
switch req.Operate {
|
|
case "create":
|
|
exist, err := customRewriteNameExist(rewriteDir, safeName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if exist || builtinRewriteNameExist(safeName) {
|
|
return buserr.New("ErrNameIsExist")
|
|
}
|
|
return fileOp.WriteFile(rewriteFile, strings.NewReader(req.Content), constant.DirPerm)
|
|
case "delete":
|
|
return fileOp.DeleteFile(rewriteFile)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func getSafeRewriteName(name string) (string, error) {
|
|
safeName := path.Base(name)
|
|
if safeName != name || strings.Contains(safeName, "..") {
|
|
return "", buserr.New("ErrInvalidParams")
|
|
}
|
|
return safeName, nil
|
|
}
|
|
|
|
func builtinRewriteNameExist(name string) bool {
|
|
rewriteFile := fmt.Sprintf("rewrite/%s.conf", strings.ToLower(name))
|
|
contentByte, _ := nginx_conf.Rewrites.ReadFile(rewriteFile)
|
|
return contentByte != nil
|
|
}
|
|
|
|
func customRewriteNameExist(rewriteDir, name string) (bool, error) {
|
|
entries, err := os.ReadDir(rewriteDir)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
continue
|
|
}
|
|
entryName := strings.TrimSuffix(entry.Name(), ".conf")
|
|
if strings.EqualFold(entryName, name) {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func (w WebsiteService) ListCustomRewrite() ([]string, error) {
|
|
rewriteDir := GetOpenrestyDir(DefaultRewriteDir)
|
|
fileOp := files.NewFileOp()
|
|
if !fileOp.Stat(rewriteDir) {
|
|
return nil, nil
|
|
}
|
|
entries, err := os.ReadDir(rewriteDir)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var res []string
|
|
for _, entry := range entries {
|
|
if entry.IsDir() {
|
|
continue
|
|
}
|
|
res = append(res, strings.TrimSuffix(entry.Name(), ".conf"))
|
|
}
|
|
return res, nil
|
|
}
|