recovery.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package user
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "net/http"
  6. "time"
  7. "github.com/0xJacky/Nginx-UI/api"
  8. "github.com/0xJacky/Nginx-UI/model"
  9. "github.com/0xJacky/Nginx-UI/query"
  10. "github.com/gin-gonic/gin"
  11. )
  12. type RecoveryCodesResponse struct {
  13. Message string `json:"message"`
  14. model.RecoveryCodes
  15. }
  16. func generateRecoveryCode() string {
  17. // generate recovery code, 10 hex numbers with a dash in the middle
  18. return fmt.Sprintf("%05x-%05x", rand.Intn(0x100000), rand.Intn(0x100000))
  19. }
  20. func generateRecoveryCodes(count int) []*model.RecoveryCode {
  21. recoveryCodes := make([]*model.RecoveryCode, count)
  22. for i := 0; i < count; i++ {
  23. recoveryCodes[i] = &model.RecoveryCode{
  24. Code: generateRecoveryCode(),
  25. }
  26. }
  27. return recoveryCodes
  28. }
  29. func ViewRecoveryCodes(c *gin.Context) {
  30. user := api.CurrentUser(c)
  31. // update last viewed time
  32. u := query.User
  33. t := time.Now().Unix()
  34. user.RecoveryCodes.LastViewed = &t
  35. _, err := u.Where(u.ID.Eq(user.ID)).Updates(user)
  36. if err != nil {
  37. api.ErrHandler(c, err)
  38. return
  39. }
  40. c.JSON(http.StatusOK, RecoveryCodesResponse{
  41. Message: "ok",
  42. RecoveryCodes: user.RecoveryCodes,
  43. })
  44. }
  45. func GenerateRecoveryCodes(c *gin.Context) {
  46. user := api.CurrentUser(c)
  47. t := time.Now().Unix()
  48. recoveryCodes := model.RecoveryCodes{Codes: generateRecoveryCodes(16), LastViewed: &t}
  49. user.RecoveryCodes = recoveryCodes
  50. u := query.User
  51. _, err := u.Where(u.ID.Eq(user.ID)).Updates(user)
  52. if err != nil {
  53. api.ErrHandler(c, err)
  54. return
  55. }
  56. c.JSON(http.StatusOK, RecoveryCodesResponse{
  57. Message: "ok",
  58. RecoveryCodes: recoveryCodes,
  59. })
  60. }