reset_password.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package user
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "math/big"
  6. "os"
  7. "path"
  8. "github.com/0xJacky/Nginx-UI/model"
  9. "github.com/0xJacky/Nginx-UI/query"
  10. "github.com/0xJacky/Nginx-UI/settings"
  11. "github.com/gin-gonic/gin"
  12. "github.com/pkg/errors"
  13. "github.com/uozi-tech/cosy"
  14. sqlite "github.com/uozi-tech/cosy-driver-sqlite"
  15. "github.com/uozi-tech/cosy/logger"
  16. cSettings "github.com/uozi-tech/cosy/settings"
  17. "github.com/urfave/cli/v3"
  18. "golang.org/x/crypto/bcrypt"
  19. )
  20. var (
  21. ErrConfigNotFound = errors.New("config not found")
  22. ErrDBFileNotFound = errors.New("db file not found")
  23. ErrInitUserNotExists = errors.New("init user not exists")
  24. )
  25. func generateRandomPassword(length int) (string, error) {
  26. const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+"
  27. password := make([]byte, length)
  28. charsetLength := big.NewInt(int64(len(charset)))
  29. for i := 0; i < length; i++ {
  30. randomIndex, err := rand.Int(rand.Reader, charsetLength)
  31. if err != nil {
  32. return "", err
  33. }
  34. password[i] = charset[randomIndex.Int64()]
  35. }
  36. return string(password), nil
  37. }
  38. func ResetInitUserPassword(ctx context.Context, command *cli.Command) error {
  39. confPath := command.String("config")
  40. settings.Init(confPath)
  41. cSettings.ServerSettings.RunMode = gin.ReleaseMode
  42. logger.Init(cSettings.ServerSettings.RunMode)
  43. logger.Infof("confPath: %s", confPath)
  44. if _, err := os.Stat(confPath); os.IsNotExist(err) {
  45. return ErrConfigNotFound
  46. }
  47. dbPath := path.Join(path.Dir(confPath), settings.DatabaseSettings.Name+".db")
  48. logger.Infof("dbPath: %s", dbPath)
  49. // check if db file exists
  50. if _, err := os.Stat(dbPath); os.IsNotExist(err) {
  51. return ErrDBFileNotFound
  52. }
  53. db := cosy.InitDB(sqlite.Open(path.Dir(cSettings.ConfPath), settings.DatabaseSettings))
  54. model.Use(db)
  55. query.Init(db)
  56. u := query.User
  57. user, err := u.FirstByID(1)
  58. if err != nil {
  59. return ErrInitUserNotExists
  60. }
  61. pwd, err := generateRandomPassword(12)
  62. if err != nil {
  63. return err
  64. }
  65. pwdBytes, err := bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.DefaultCost)
  66. if err != nil {
  67. return err
  68. }
  69. _, err = u.Where(u.ID.Eq(1)).Updates(&model.User{
  70. Password: string(pwdBytes),
  71. })
  72. if err != nil {
  73. return err
  74. }
  75. a := query.AuthToken
  76. _, _ = a.Where(a.UserID.Eq(1)).Delete()
  77. logger.Infof("User: %s, Password: %s", user.Name, pwd)
  78. return nil
  79. }