login_attempt.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package sqlstore
  2. import (
  3. "strconv"
  4. "time"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. )
  8. var getTimeNow = time.Now
  9. func init() {
  10. bus.AddHandler("sql", CreateLoginAttempt)
  11. bus.AddHandler("sql", DeleteOldLoginAttempts)
  12. bus.AddHandler("sql", GetUserLoginAttemptCount)
  13. }
  14. func CreateLoginAttempt(cmd *m.CreateLoginAttemptCommand) error {
  15. return inTransaction(func(sess *DBSession) error {
  16. loginAttempt := m.LoginAttempt{
  17. Username: cmd.Username,
  18. IpAddress: cmd.IpAddress,
  19. Created: getTimeNow().Unix(),
  20. }
  21. if _, err := sess.Insert(&loginAttempt); err != nil {
  22. return err
  23. }
  24. cmd.Result = loginAttempt
  25. return nil
  26. })
  27. }
  28. func DeleteOldLoginAttempts(cmd *m.DeleteOldLoginAttemptsCommand) error {
  29. return inTransaction(func(sess *DBSession) error {
  30. var maxId int64
  31. sql := "SELECT max(id) as id FROM login_attempt WHERE created < ?"
  32. result, err := sess.Query(sql, cmd.OlderThan.Unix())
  33. if err != nil {
  34. return err
  35. }
  36. maxId = toInt64(result[0]["id"])
  37. if maxId == 0 {
  38. return nil
  39. }
  40. sql = "DELETE FROM login_attempt WHERE id <= ?"
  41. if result, err := sess.Exec(sql, maxId); err != nil {
  42. return err
  43. } else if cmd.DeletedRows, err = result.RowsAffected(); err != nil {
  44. return err
  45. }
  46. return nil
  47. })
  48. }
  49. func GetUserLoginAttemptCount(query *m.GetUserLoginAttemptCountQuery) error {
  50. loginAttempt := new(m.LoginAttempt)
  51. total, err := x.
  52. Where("username = ?", query.Username).
  53. And("created >= ?", query.Since.Unix()).
  54. Count(loginAttempt)
  55. if err != nil {
  56. return err
  57. }
  58. query.Result = total
  59. return nil
  60. }
  61. func toInt64(i interface{}) int64 {
  62. switch i.(type) {
  63. case []byte:
  64. n, _ := strconv.ParseInt(string(i.([]byte)), 10, 64)
  65. return n
  66. case int:
  67. return int64(i.(int))
  68. case int64:
  69. return i.(int64)
  70. }
  71. return 0
  72. }