system.resetpw.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "path/filepath"
  8. auth "imuslab.com/arozos/mod/auth"
  9. fs "imuslab.com/arozos/mod/filesystem"
  10. "imuslab.com/arozos/mod/utils"
  11. )
  12. /*
  13. Password Reset Module
  14. This module exists to serve the password restart page with security check
  15. */
  16. func system_resetpw_init() {
  17. http.HandleFunc("/system/reset/validateResetKey", system_resetpw_validateResetKeyHandler)
  18. http.HandleFunc("/system/reset/confirmPasswordReset", system_resetpw_confirmReset)
  19. }
  20. // Validate if the ysername and rkey is valid
  21. func system_resetpw_validateResetKeyHandler(w http.ResponseWriter, r *http.Request) {
  22. username, err := utils.PostPara(r, "username")
  23. if err != nil {
  24. utils.SendErrorResponse(w, "Invalid username or key")
  25. return
  26. }
  27. rkey, err := utils.PostPara(r, "rkey")
  28. if err != nil {
  29. utils.SendErrorResponse(w, "Invalid username or key")
  30. return
  31. }
  32. if username == "" || rkey == "" {
  33. utils.SendErrorResponse(w, "Invalid username or rkey")
  34. return
  35. }
  36. //Check if the pair is valid
  37. err = system_resetpw_validateResetKey(username, rkey)
  38. if err != nil {
  39. utils.SendErrorResponse(w, err.Error())
  40. return
  41. }
  42. utils.SendOK(w)
  43. }
  44. func system_resetpw_confirmReset(w http.ResponseWriter, r *http.Request) {
  45. username, _ := utils.PostPara(r, "username")
  46. rkey, _ := utils.PostPara(r, "rkey")
  47. newpw, _ := utils.PostPara(r, "pw")
  48. if username == "" || rkey == "" || newpw == "" {
  49. utils.SendErrorResponse(w, "Internal Server Error")
  50. return
  51. }
  52. //Check user exists
  53. if !authAgent.UserExists(username) {
  54. utils.SendErrorResponse(w, "Username not exists")
  55. return
  56. }
  57. //Validate rkey
  58. err := system_resetpw_validateResetKey(username, rkey)
  59. if err != nil {
  60. utils.SendErrorResponse(w, err.Error())
  61. return
  62. }
  63. //OK to procced
  64. newHashedPassword := auth.Hash(newpw)
  65. err = sysdb.Write("auth", "passhash/"+username, newHashedPassword)
  66. if err != nil {
  67. utils.SendErrorResponse(w, err.Error())
  68. return
  69. }
  70. utils.SendOK(w)
  71. }
  72. func system_resetpw_validateResetKey(username string, key string) error {
  73. //Get current password from db
  74. passwordInDB := ""
  75. err := sysdb.Read("auth", "passhash/"+username, &passwordInDB)
  76. if err != nil {
  77. return err
  78. }
  79. //Get hashed user key
  80. hashedKey := auth.Hash(key)
  81. if passwordInDB != hashedKey {
  82. return errors.New("Invalid Password Reset Key")
  83. }
  84. return nil
  85. }
  86. func system_resetpw_handlePasswordReset(w http.ResponseWriter, r *http.Request) {
  87. //Check if the user click on this link with reset password key string. If not, ask the user to input one
  88. acc, err := utils.GetPara(r, "acc")
  89. if err != nil || acc == "" {
  90. system_resetpw_serveIdEnterInterface(w, r)
  91. return
  92. }
  93. resetkey, err := utils.GetPara(r, "rkey")
  94. if err != nil || resetkey == "" {
  95. system_resetpw_serveIdEnterInterface(w, r)
  96. return
  97. }
  98. //Check if the code is valid
  99. err = system_resetpw_validateResetKey(acc, resetkey)
  100. if err != nil {
  101. utils.SendErrorResponse(w, "Invalid username or resetKey")
  102. return
  103. }
  104. //OK. Create the New Password Entering UI
  105. vendorIconSrc := filepath.Join(vendorResRoot, "vendor_icon.png")
  106. if !fs.FileExists(vendorIconSrc) {
  107. vendorIconSrc = "./web/img/public/vendor_icon.png"
  108. }
  109. imageBase64, _ := utils.LoadImageAsBase64(vendorIconSrc)
  110. template, err := utils.Templateload("system/reset/resetPasswordTemplate.html", map[string]string{
  111. "vendor_logo": imageBase64,
  112. "host_name": *host_name,
  113. "username": acc,
  114. "rkey": resetkey,
  115. })
  116. if err != nil {
  117. systemWideLogger.PrintAndLog("System", fmt.Sprint(err), nil)
  118. os.Exit(1)
  119. }
  120. w.Header().Set("Content-Type", "text/html; charset=UTF-8")
  121. w.Write([]byte(template))
  122. }
  123. func system_resetpw_serveIdEnterInterface(w http.ResponseWriter, r *http.Request) {
  124. //Reset Key or Username not found, Serve entering interface
  125. imgsrc := filepath.Join(vendorResRoot, "vendor_icon.png")
  126. if !fs.FileExists(imgsrc) {
  127. imgsrc = "./web/img/public/vendor_icon.png"
  128. }
  129. imageBase64, _ := utils.LoadImageAsBase64(imgsrc)
  130. template, err := utils.Templateload("system/reset/resetCodeTemplate.html", map[string]string{
  131. "vendor_logo": imageBase64,
  132. "host_name": *host_name,
  133. })
  134. if err != nil {
  135. systemWideLogger.PrintAndLog("System", fmt.Sprint(err), nil)
  136. os.Exit(1)
  137. }
  138. w.Header().Set("Content-Type", "text/html; charset=UTF-8")
  139. w.Write([]byte(template))
  140. }