login.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package controllers
  2. import (
  3. "math/rand"
  4. "net"
  5. "sync"
  6. "time"
  7. "ehang.io/nps/lib/common"
  8. "ehang.io/nps/lib/file"
  9. "ehang.io/nps/server"
  10. "github.com/astaxie/beego"
  11. )
  12. type LoginController struct {
  13. beego.Controller
  14. }
  15. var ipRecord sync.Map
  16. type record struct {
  17. hasLoginFailTimes int
  18. lastLoginTime time.Time
  19. }
  20. func (self *LoginController) Index() {
  21. self.Data["web_base_url"] = beego.AppConfig.String("web_base_url")
  22. self.Data["register_allow"], _ = beego.AppConfig.Bool("allow_user_register")
  23. self.TplName = "login/index.html"
  24. }
  25. func (self *LoginController) Verify() {
  26. clearIprecord()
  27. ip, _, _ := net.SplitHostPort(self.Ctx.Request.RemoteAddr)
  28. if v, ok := ipRecord.Load(ip); ok {
  29. vv := v.(*record)
  30. if (time.Now().Unix() - vv.lastLoginTime.Unix()) >= 60 {
  31. vv.hasLoginFailTimes = 0
  32. }
  33. if vv.hasLoginFailTimes >= 10 {
  34. self.Data["json"] = map[string]interface{}{"status": 0, "msg": "username or password incorrect"}
  35. self.ServeJSON()
  36. return
  37. }
  38. }
  39. var auth bool
  40. if self.GetString("password") == beego.AppConfig.String("web_password") && self.GetString("username") == beego.AppConfig.String("web_username") {
  41. self.SetSession("isAdmin", true)
  42. self.DelSession("clientId")
  43. self.DelSession("username")
  44. auth = true
  45. server.Bridge.Register.Store(common.GetIpByAddr(self.Ctx.Input.IP()), time.Now().Add(time.Hour*time.Duration(2)))
  46. }
  47. b, err := beego.AppConfig.Bool("allow_user_login")
  48. if err == nil && b && !auth {
  49. file.GetDb().JsonDb.Clients.Range(func(key, value interface{}) bool {
  50. v := value.(*file.Client)
  51. if !v.Status || v.NoDisplay {
  52. return true
  53. }
  54. if v.WebUserName == "" && v.WebPassword == "" {
  55. if self.GetString("username") != "user" || v.VerifyKey != self.GetString("password") {
  56. return true
  57. } else {
  58. auth = true
  59. }
  60. }
  61. if !auth && v.WebPassword == self.GetString("password") && self.GetString("username") == v.WebUserName {
  62. auth = true
  63. }
  64. if auth {
  65. self.SetSession("isAdmin", false)
  66. self.SetSession("clientId", v.Id)
  67. self.SetSession("username", v.WebUserName)
  68. return false
  69. }
  70. return true
  71. })
  72. }
  73. if auth {
  74. self.SetSession("auth", true)
  75. self.Data["json"] = map[string]interface{}{"status": 1, "msg": "login success"}
  76. ipRecord.Delete(ip)
  77. } else {
  78. if v, load := ipRecord.LoadOrStore(ip, &record{hasLoginFailTimes: 1, lastLoginTime: time.Now()}); load {
  79. vv := v.(*record)
  80. vv.lastLoginTime = time.Now()
  81. vv.hasLoginFailTimes += 1
  82. ipRecord.Store(ip, vv)
  83. }
  84. self.Data["json"] = map[string]interface{}{"status": 0, "msg": "username or password incorrect"}
  85. }
  86. self.ServeJSON()
  87. }
  88. func (self *LoginController) Register() {
  89. if self.Ctx.Request.Method == "GET" {
  90. self.Data["web_base_url"] = beego.AppConfig.String("web_base_url")
  91. self.TplName = "login/register.html"
  92. } else {
  93. if b, err := beego.AppConfig.Bool("allow_user_register"); err != nil || !b {
  94. self.Data["json"] = map[string]interface{}{"status": 0, "msg": "register is not allow"}
  95. self.ServeJSON()
  96. return
  97. }
  98. if self.GetString("username") == "" || self.GetString("password") == "" || self.GetString("username") == beego.AppConfig.String("web_username") {
  99. self.Data["json"] = map[string]interface{}{"status": 0, "msg": "please check your input"}
  100. self.ServeJSON()
  101. return
  102. }
  103. t := &file.Client{
  104. Id: int(file.GetDb().JsonDb.GetClientId()),
  105. Status: true,
  106. Cnf: &file.Config{},
  107. WebUserName: self.GetString("username"),
  108. WebPassword: self.GetString("password"),
  109. Flow: &file.Flow{},
  110. }
  111. if err := file.GetDb().NewClient(t); err != nil {
  112. self.Data["json"] = map[string]interface{}{"status": 0, "msg": err.Error()}
  113. } else {
  114. self.Data["json"] = map[string]interface{}{"status": 1, "msg": "register success"}
  115. }
  116. self.ServeJSON()
  117. }
  118. }
  119. func (self *LoginController) Out() {
  120. self.SetSession("auth", false)
  121. self.Redirect(beego.AppConfig.String("web_base_url")+"/login/index", 302)
  122. }
  123. func clearIprecord() {
  124. rand.Seed(time.Now().UnixNano())
  125. x := rand.Intn(100)
  126. if x == 1 {
  127. ipRecord.Range(func(key, value interface{}) bool {
  128. v := value.(*record)
  129. if time.Now().Unix()-v.lastLoginTime.Unix() >= 60 {
  130. ipRecord.Delete(key)
  131. }
  132. return true
  133. })
  134. }
  135. }