init
This commit is contained in:
commit
b10790c212
40 changed files with 4149 additions and 0 deletions
42
user/check.go
Normal file
42
user/check.go
Normal 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
52
user/init.go
Normal 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
22
user/status.go
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue