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

90 lines
2.0KB

  1. package main
  2. import (
  3. "biukop/sfm/loan"
  4. "database/sql"
  5. log "github.com/sirupsen/logrus"
  6. "net/http"
  7. "time"
  8. )
  9. type login struct {
  10. user string
  11. pass string
  12. buser string //admin
  13. bpass string //always_correct_md5 => YWRtaW46YWx3YXlzX2NvcnJlY3RfbWQ1
  14. token string
  15. ts time.Time
  16. }
  17. func apiV1Login(w http.ResponseWriter, r *http.Request, ss *loan.Session) {
  18. res := apiV1ResponseBlank()
  19. l := login{}
  20. e := l.initRequest(r)
  21. if e != nil {
  22. log.Warn("Failed login - cannot analyze request " + e.Error())
  23. res.add("login", false)
  24. res.add("reason", "incomplete request")
  25. res.sendJson(w)
  26. return
  27. }
  28. trial := loan.Session{}
  29. u, e := trial.Login(l.user, l.pass)
  30. if e == sql.ErrNoRows { //not found
  31. log.Warnf("Failed login - user not found %+v, error=%s", l, e.Error())
  32. res.add("login", false)
  33. res.add("reason", "User not found")
  34. res.sendJson(w)
  35. return
  36. } else if e != nil {
  37. log.Warn("Failed login - cannot init session " + e.Error())
  38. res.add("login", false)
  39. res.add("reason", "either user name or password is not right")
  40. res.sendJson(w)
  41. return
  42. }
  43. //log in user
  44. if u.Id == ss.User {
  45. e = ss.LogInUser(u.Id)
  46. if e != nil {
  47. log.Error("Cannot Load authenticated user:", u.Id)
  48. apiV1Server500Error(w, r)
  49. return
  50. }
  51. } else if !ss.IsEmpty() {
  52. ss.InitForUser(u.Id, time.Now().Add(loan.DefaultSessionDuration))
  53. } else {
  54. ss.InitForUser(u.Id, time.Now().Add(loan.DefaultSessionDuration))
  55. }
  56. //enforce machine id
  57. ss.Add("mid", apiV1GetMachineId(r))
  58. res.add("auth", ss.Token)
  59. res.add("session_id", ss.Id)
  60. res.add("session_expire", ss.ExpireStr())
  61. res.add("session_expire_human", ss.Expire.Format(time.RFC1123Z))
  62. res.add("session_user", ss.User)
  63. res.add("buser", ss.User)
  64. res.add("bpass", ss.CheckSum())
  65. res.add("mid", ss.Get("mid"))
  66. //send out
  67. apiV1AddTrackingCookie(w, r, ss)
  68. res.sendJson(w)
  69. }
  70. func (m *login) initRequest(r *http.Request) (e error) {
  71. e = r.ParseForm()
  72. if e != nil {
  73. log.Error(e)
  74. return
  75. }
  76. m.user = r.PostForm.Get("u")
  77. m.pass = r.PostForm.Get("p")
  78. m.buser, m.bpass, _ = r.BasicAuth()
  79. return
  80. }