You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 satır
2.6KB

  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. type userExtra struct {
  15. Enabled int
  16. Login string
  17. BSB string
  18. ACC string
  19. License string
  20. Organization string
  21. }
  22. func apiV1Login(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  23. res := apiV1ResponseBlank()
  24. l := loginForm{}
  25. e := l.getFromClient(r)
  26. if e != nil {
  27. log.Warn("Failed login - cannot analyze request " + e.Error())
  28. res.add("login", false)
  29. res.add("reason", "incomplete request")
  30. res.sendJson(w)
  31. return
  32. }
  33. //try login
  34. _, e = ss.Login(l.Login, l.Pass)
  35. if e == sql.ErrNoRows { //not found
  36. log.Warnf("Failed login - user not found %+v, error=%s", l, e.Error())
  37. res.add("login", false)
  38. res.add("reason", "User not found")
  39. res.sendJson(w)
  40. return
  41. } else if e != nil {
  42. log.Warn("Failed login - cannot init session " + e.Error())
  43. res.add("login", false)
  44. res.add("reason", "either user name or password is not right")
  45. res.sendJson(w)
  46. return
  47. } else {
  48. //Audit user login, in db
  49. log.Info("login success ", l.Login)
  50. }
  51. //format response
  52. res.add("login", true)
  53. res.add("role", ss.GetRole())
  54. u, e := ss.GetUser()
  55. if e == nil {
  56. res.add("user", u.People)
  57. if ss.GetRole() == "broker" {
  58. broker := loan.Broker{}
  59. e := broker.Read(ss.User)
  60. if e != nil {
  61. log.Error("fail to retrieve broker for session ", ss, e.Error())
  62. } else {
  63. ue := userExtra{
  64. Enabled: broker.Enabled,
  65. Login: broker.Login,
  66. BSB: broker.BSB,
  67. ACC: broker.ACC,
  68. License: broker.License,
  69. Organization: broker.Organization,
  70. }
  71. res.add("userExtra", ue)
  72. }
  73. }
  74. }
  75. res.add("Biukop-Session", ss.Id)
  76. res.add("Biukop-Mid", ss.Get("Biukop-Mid"))
  77. res.add("sessionExpire", ss.ExpireStr())
  78. res.add("sessionExpireHuman", ss.Expire.Format(time.RFC1123Z))
  79. if config.Debug {
  80. u, e := ss.GetUser()
  81. if e == nil {
  82. res.Env.Body["debug_session_user"] = u
  83. res.Env.Session = *ss
  84. } else {
  85. log.Warn("cannot read user for session ", ss)
  86. res.Env.Body["debug_session_user_error"] = e.Error()
  87. }
  88. }
  89. //send out
  90. apiV1AddTrackingCookie(w, r, ss) //always the last one to set cookies
  91. res.sendJson(w)
  92. }
  93. func (m *loginForm) getFromClient(r *http.Request) (e error) {
  94. e = apiV1DecodeRequestBody(m, r)
  95. if e != nil {
  96. log.Error(e)
  97. return
  98. }
  99. return
  100. }
  101. func apiV1DecodeRequestBody(bb interface{}, r *http.Request) (e error) {
  102. decoder := json.NewDecoder(r.Body)
  103. decoder.DisallowUnknownFields()
  104. e = decoder.Decode(bb)
  105. return
  106. }