caddydash/user/init.go
2025-06-22 17:23:41 +08:00

86 lines
2 KiB
Go

package user
import (
"caddydash/db"
"fmt"
"os"
"golang.org/x/crypto/bcrypt"
)
func InitAdminUser(username string, password string, cdb *db.ConfigDB) error {
hasUser, err := cdb.HasAnyUser()
if err != nil {
return fmt.Errorf("failed to check if any user exists: %w", err)
}
if hasUser {
userStatus.SetInitialized(true)
return nil
}
hashedPassword, err := HashPassword(password)
if err != nil {
return fmt.Errorf("failed to hash password: %w", err)
}
err = cdb.AddUser(username, hashedPassword)
if err != nil {
return fmt.Errorf("failed to add admin user: %w", err)
}
userStatus.SetInitialized(true)
return nil
}
// bcrypt加密password串
func HashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 11)
if err != nil {
return "", err
}
return string(bytes), err
}
func InitAdminUserStatus(cdb *db.ConfigDB) error {
hasUser, err := cdb.HasAnyUser()
if err != nil {
return fmt.Errorf("failed to check if any user exists: %w", err)
}
if hasUser {
userStatus.SetInitialized(true)
return nil
} else {
userStatus.SetInitialized(false)
return nil
}
}
func InitFormEnv(cdb *db.ConfigDB) error {
username := os.Getenv("CADDYDASH_USERNAME")
password := os.Getenv("CADDYDASH_PASSWORD")
if username != "" && password != "" {
// 检查是否已经有用户
hasUser, err := cdb.HasAnyUser()
if err != nil {
return fmt.Errorf("failed to check if any user exists: %w", err)
}
if hasUser {
// 如果已经有用户,则不执行初始化,但设置状态为已初始化
userStatus.SetInitialized(true)
return nil
}
// 执行初始化
hashedPassword, err := HashPassword(password)
if err != nil {
return fmt.Errorf("failed to hash password from env: %w", err)
}
err = cdb.AddUser(username, hashedPassword)
if err != nil {
return fmt.Errorf("failed to add admin user from env: %w", err)
}
userStatus.SetInitialized(true)
return nil
}
// 如果环境变量不存在,则根据数据库状态设置初始化状态
return InitAdminUserStatus(cdb)
}