recovery.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. "github.com/uozi-tech/cosy"
  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 with a dash in the middle
  19. return fmt.Sprintf("%05x-%05x", rand.Intn(0x100000), rand.Intn(0x100000))
  20. }
  21. func generateRecoveryCodes(count int) []*model.RecoveryCode {
  22. recoveryCodes := make([]*model.RecoveryCode, count)
  23. for i := 0; i < count; i++ {
  24. recoveryCodes[i] = &model.RecoveryCode{
  25. Code: generateRecoveryCode(),
  26. }
  27. }
  28. return recoveryCodes
  29. }
  30. func ViewRecoveryCodes(c *gin.Context) {
  31. user := api.CurrentUser(c)
  32. // update last viewed time
  33. u := query.User
  34. t := time.Now().Unix()
  35. user.RecoveryCodes.LastViewed = &t
  36. _, err := u.Where(u.ID.Eq(user.ID)).Updates(user)
  37. if err != nil {
  38. cosy.ErrHandler(c, err)
  39. return
  40. }
  41. c.JSON(http.StatusOK, RecoveryCodesResponse{
  42. Message: "ok",
  43. RecoveryCodes: user.RecoveryCodes,
  44. })
  45. }
  46. func GenerateRecoveryCodes(c *gin.Context) {
  47. user := api.CurrentUser(c)
  48. t := time.Now().Unix()
  49. recoveryCodes := model.RecoveryCodes{Codes: generateRecoveryCodes(16), LastViewed: &t}
  50. user.RecoveryCodes = recoveryCodes
  51. u := query.User
  52. _, err := u.Where(u.ID.Eq(user.ID)).Updates(user)
  53. if err != nil {
  54. cosy.ErrHandler(c, err)
  55. return
  56. }
  57. c.JSON(http.StatusOK, RecoveryCodesResponse{
  58. Message: "ok",
  59. RecoveryCodes: recoveryCodes,
  60. })
  61. }