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

80 lines
1.8KB

  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. *ss = trial //we are the same
  46. } else if !ss.IsEmpty() {
  47. ss.ReuseAsUser(u.Id, ss.Expire)
  48. } else {
  49. ss.InitForUser(ss.User, time.Now().Add(loan.DefaultSessionDuration))
  50. }
  51. res.add("auth", ss.Token)
  52. res.add("session_id", ss.Id)
  53. res.add("session_expire", ss.ExpireStr())
  54. res.add("session_expire_human", ss.Expire.Format(time.RFC1123Z))
  55. res.add("session_user", ss.User)
  56. res.add("buser", ss.User)
  57. res.add("bpass", ss.CheckSum())
  58. //send out
  59. res.sendJson(w)
  60. }
  61. func (m *login) initRequest(r *http.Request) (e error) {
  62. e = r.ParseForm()
  63. if e != nil {
  64. log.Error(e)
  65. return
  66. }
  67. m.user = r.PostForm.Get("u")
  68. m.pass = r.PostForm.Get("p")
  69. m.buser, m.bpass, _ = r.BasicAuth()
  70. return
  71. }