Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

135 lines
3.0KB

  1. package main
  2. import (
  3. "biukop.com/sfm/loan"
  4. "database/sql"
  5. "encoding/json"
  6. log "github.com/sirupsen/logrus"
  7. "net/http"
  8. "time"
  9. )
  10. type loginForm struct {
  11. Login string `json:"u"`
  12. Pass string `json:"p"`
  13. }
  14. func apiV1Login(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  15. res := apiV1ResponseBlank()
  16. l := loginForm{}
  17. e := l.retrieveLoginForm(r)
  18. if e != nil {
  19. log.Warn("Failed login - cannot analyze request " + e.Error())
  20. res.add("login", false)
  21. res.add("reason", "incomplete request")
  22. res.sendJson(w)
  23. return
  24. }
  25. //try login
  26. _, e = ss.Login(l.Login, l.Pass)
  27. if e == sql.ErrNoRows { //not found
  28. log.Warnf("Failed login - user not found %+v, error=%s", l, e.Error())
  29. res.add("login", false)
  30. res.add("reason", "User not found")
  31. res.sendJson(w)
  32. return
  33. } else if e != nil {
  34. log.Warn("Failed login - cannot init session " + e.Error())
  35. res.add("login", false)
  36. res.add("reason", "either user name or password is not right")
  37. res.sendJson(w)
  38. return
  39. } else {
  40. //Audit user login, in db
  41. log.Info("login success ", l.Login)
  42. }
  43. //format response
  44. res.add("login", true)
  45. res.add("role", ss.GetRole())
  46. u, e := ss.GetUser()
  47. if e == nil {
  48. res.add("User", u.People)
  49. res.add("UserExtra", getUserExtraForLogin(u, ss))
  50. }
  51. res.add("Biukop-Session", ss.Id)
  52. res.add("Biukop-Mid", ss.Get("Biukop-Mid"))
  53. res.add("sessionExpire", ss.ExpireStr())
  54. res.add("sessionExpireHuman", ss.Expire.Format(time.RFC1123Z))
  55. if config.Debug {
  56. u, e := ss.GetUser()
  57. if e == nil {
  58. res.Env.Body["debug_session_user"] = u
  59. res.Env.Session = *ss
  60. } else {
  61. log.Warn("cannot read user for session ", ss)
  62. res.Env.Body["debug_session_user_error"] = e.Error()
  63. }
  64. }
  65. WsNotifyNewLogin(ss)
  66. //send out
  67. apiV1AddTrackingCookie(w, r, ss) //always the last one to set cookies
  68. res.sendJson(w)
  69. }
  70. func getUserExtraForLogin(u loan.User, ss *loan.Session) (ret UserExtra) {
  71. if ss.GetRole() == "user" {
  72. ret = UserExtra{
  73. Login: u.Login,
  74. BSB: "",
  75. ACC: "",
  76. License: "",
  77. Organization: "",
  78. Role: "user",
  79. }
  80. }
  81. if ss.GetRole() == "broker" {
  82. broker := loan.Broker{}
  83. e := broker.Read(ss.User)
  84. if e != nil {
  85. log.Error("fail to retrieve broker for session ", ss, e.Error())
  86. } else {
  87. ret = UserExtra{
  88. Login: broker.Login,
  89. BSB: broker.BSB,
  90. ACC: broker.ACC,
  91. License: broker.License,
  92. Organization: broker.Organization,
  93. Role: "broker",
  94. }
  95. }
  96. }
  97. if ss.GetRole() == "admin" {
  98. ret = UserExtra{
  99. Login: u.Login,
  100. BSB: "",
  101. ACC: "",
  102. License: "",
  103. Organization: "SFM",
  104. Role: "admin",
  105. }
  106. }
  107. return
  108. }
  109. func (m *loginForm) retrieveLoginForm(r *http.Request) (e error) {
  110. e = apiV1DecodeRequestBody(m, r)
  111. if e != nil {
  112. log.Error(e)
  113. return
  114. }
  115. return
  116. }
  117. func apiV1DecodeRequestBody(bb interface{}, r *http.Request) (e error) {
  118. decoder := json.NewDecoder(r.Body)
  119. decoder.DisallowUnknownFields()
  120. e = decoder.Decode(bb)
  121. return
  122. }