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.

92 lines
2.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.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. }
  50. res.add("Biukop-Session", ss.Id)
  51. res.add("Biukop-Mid", ss.Get("Biukop-Mid"))
  52. res.add("sessionExpire", ss.ExpireStr())
  53. res.add("sessionExpireHuman", ss.Expire.Format(time.RFC1123Z))
  54. if config.Debug {
  55. u, e := ss.GetUser()
  56. if e == nil {
  57. res.Env.Body["debug_session_user"] = u
  58. res.Env.Session = *ss
  59. } else {
  60. log.Warn("cannot read user for session ", ss)
  61. res.Env.Body["debug_session_user_error"] = e.Error()
  62. }
  63. }
  64. //send out
  65. apiV1AddTrackingCookie(w, r, ss) //always the last one to set cookies
  66. res.sendJson(w)
  67. }
  68. func (m *loginForm) getFromClient(r *http.Request) (e error) {
  69. e = apiV1DecodeRequestBody(m, r)
  70. if e != nil {
  71. log.Error(e)
  72. return
  73. }
  74. return
  75. }
  76. func apiV1DecodeRequestBody(bb interface{}, r *http.Request) (e error) {
  77. decoder := json.NewDecoder(r.Body)
  78. decoder.DisallowUnknownFields()
  79. e = decoder.Decode(bb)
  80. return
  81. }