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

122 lines
2.7KB

  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.getFromClient(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. if ss.GetRole() == "broker" {
  50. broker := loan.Broker{}
  51. e := broker.Read(ss.User)
  52. if e != nil {
  53. log.Error("fail to retrieve broker for session ", ss, e.Error())
  54. } else {
  55. ue := UserExtra{
  56. Enabled: broker.Enabled,
  57. Login: broker.Login,
  58. BSB: broker.BSB,
  59. ACC: broker.ACC,
  60. License: broker.License,
  61. Organization: broker.Organization,
  62. }
  63. res.add("UserExtra", ue)
  64. }
  65. }
  66. if ss.GetRole() == "admin" {
  67. ue := UserExtra{
  68. Enabled: true,
  69. Login: u.Login,
  70. BSB: "",
  71. ACC: "",
  72. License: "",
  73. Organization: "SFM",
  74. }
  75. res.add("UserExtra", ue)
  76. }
  77. }
  78. res.add("Biukop-Session", ss.Id)
  79. res.add("Biukop-Mid", ss.Get("Biukop-Mid"))
  80. res.add("sessionExpire", ss.ExpireStr())
  81. res.add("sessionExpireHuman", ss.Expire.Format(time.RFC1123Z))
  82. if config.Debug {
  83. u, e := ss.GetUser()
  84. if e == nil {
  85. res.Env.Body["debug_session_user"] = u
  86. res.Env.Session = *ss
  87. } else {
  88. log.Warn("cannot read user for session ", ss)
  89. res.Env.Body["debug_session_user_error"] = e.Error()
  90. }
  91. }
  92. //send out
  93. apiV1AddTrackingCookie(w, r, ss) //always the last one to set cookies
  94. res.sendJson(w)
  95. }
  96. func (m *loginForm) getFromClient(r *http.Request) (e error) {
  97. e = apiV1DecodeRequestBody(m, r)
  98. if e != nil {
  99. log.Error(e)
  100. return
  101. }
  102. return
  103. }
  104. func apiV1DecodeRequestBody(bb interface{}, r *http.Request) (e error) {
  105. decoder := json.NewDecoder(r.Body)
  106. decoder.DisallowUnknownFields()
  107. e = decoder.Decode(bb)
  108. return
  109. }