recovery.go 1.7 KB

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