fix: resolve critical issues and improve task management

- Fix path traversal vulnerability in downloadVideo handler by adding
  download directory whitelist validation
- Add graceful shutdown with signal handling for task persistence
- Fix division by zero panic in progressBar.percent() when total <= 0
- Add GetDB() function that returns error instead of using log.Fatal
- Change deleteTask to only remove database records, preserve downloaded files
- Add paused status for interrupted tasks on shutdown

Co-Authored-By: Claude
This commit is contained in:
2026-04-09 16:51:22 +08:00
parent 449b5fe3a2
commit a0ef988bd5
5 changed files with 125 additions and 47 deletions
+18 -9
View File
@@ -4,7 +4,6 @@ import (
"database/sql"
"errors"
"fmt"
"log"
"strings"
"sync"
)
@@ -115,18 +114,28 @@ func SaveDownloadFolder(db *sql.DB, downloadFolder string) error {
var SqliteLock sync.Mutex
func MustGetDB(path ...string) *sql.DB {
pathStr := ""
if len(path) == 0 {
pathStr = "./data.db"
} else if len(path) > 1 {
log.Fatalln(errors.New("len(path) <= 1"))
} else {
// GetDB 获取数据库连接,返回错误而非直接退出
func GetDB(path ...string) (*sql.DB, error) {
pathStr := "./data.db"
if len(path) > 0 {
if len(path) > 1 {
return nil, errors.New("len(path) must be <= 1")
}
pathStr = path[0]
}
db, err := sql.Open("sqlite", pathStr)
if err != nil {
log.Fatalln("sql.Open:", err)
return nil, fmt.Errorf("sql.Open: %w", err)
}
return db, nil
}
// MustGetDB 获取数据库连接,失败时 panic(用于初始化阶段)
// 推荐在 main 函数中使用 GetDB 并处理错误
func MustGetDB(path ...string) *sql.DB {
db, err := GetDB(path...)
if err != nil {
panic(fmt.Sprintf("MustGetDB: %v", err))
}
return db
}