This commit is contained in:
wjqserver 2025-06-20 16:33:27 +08:00
commit b10790c212
40 changed files with 4149 additions and 0 deletions

42
user/check.go Normal file
View file

@ -0,0 +1,42 @@
package user
import (
"caddydash/db"
"golang.org/x/crypto/bcrypt"
)
// 判断是否可以登陆
func CheckLogin(username, password string, cdb *db.ConfigDB) (bool, error) {
// 判断数据库内是否存在username
userExist, err := cdb.IsUserExists(username)
if err != nil {
return false, err
}
if !userExist {
return false, nil
}
passwordb, err := cdb.GetPasswordByUsername(username)
if err != nil {
return false, err
}
// 校验密码
check, err := checkPasswordHash(password, passwordb)
if err != nil {
return false, err
}
return check, nil
}
func IsAdminInit() bool {
return userStatus.IsUserInitialized()
}
// 校验密码, 避免时序攻击问题
func checkPasswordHash(password, hash string) (bool, error) {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
if err != nil {
return false, err
}
return true, nil
}

52
user/init.go Normal file
View file

@ -0,0 +1,52 @@
package user
import (
"caddydash/db"
"fmt"
"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
}
}

22
user/status.go Normal file
View file

@ -0,0 +1,22 @@
package user
import "sync"
type UserStatus struct {
IsInitialized bool
mu sync.Mutex
}
func (s *UserStatus) SetInitialized(initialized bool) {
s.mu.Lock()
defer s.mu.Unlock()
s.IsInitialized = initialized
}
func (s *UserStatus) IsUserInitialized() bool {
s.mu.Lock()
defer s.mu.Unlock()
return s.IsInitialized
}
var userStatus UserStatus