token_cleanup.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package auth
  2. import (
  3. "context"
  4. "time"
  5. "github.com/grafana/grafana/pkg/services/sqlstore"
  6. )
  7. func (srv *UserAuthTokenService) Run(ctx context.Context) error {
  8. ticker := time.NewTicker(time.Hour)
  9. maxInactiveLifetime := time.Duration(srv.Cfg.LoginMaxInactiveLifetimeDays) * 24 * time.Hour
  10. maxLifetime := time.Duration(srv.Cfg.LoginMaxLifetimeDays) * 24 * time.Hour
  11. err := srv.ServerLockService.LockAndExecute(ctx, "cleanup expired auth tokens", time.Hour*12, func() {
  12. srv.deleteExpiredTokens(ctx, maxInactiveLifetime, maxLifetime)
  13. })
  14. if err != nil {
  15. srv.log.Error("failed to lock and execute cleanup of expired auth token", "error", err)
  16. }
  17. for {
  18. select {
  19. case <-ticker.C:
  20. err := srv.ServerLockService.LockAndExecute(ctx, "cleanup expired auth tokens", time.Hour*12, func() {
  21. srv.deleteExpiredTokens(ctx, maxInactiveLifetime, maxLifetime)
  22. })
  23. if err != nil {
  24. srv.log.Error("failed to lock and execute cleanup of expired auth token", "error", err)
  25. }
  26. case <-ctx.Done():
  27. return ctx.Err()
  28. }
  29. }
  30. }
  31. func (srv *UserAuthTokenService) deleteExpiredTokens(ctx context.Context, maxInactiveLifetime, maxLifetime time.Duration) (int64, error) {
  32. createdBefore := getTime().Add(-maxLifetime)
  33. rotatedBefore := getTime().Add(-maxInactiveLifetime)
  34. srv.log.Debug("starting cleanup of expired auth tokens", "createdBefore", createdBefore, "rotatedBefore", rotatedBefore)
  35. var affected int64
  36. err := srv.SQLStore.WithDbSession(ctx, func(dbSession *sqlstore.DBSession) error {
  37. sql := `DELETE from user_auth_token WHERE created_at <= ? OR rotated_at <= ?`
  38. res, err := dbSession.Exec(sql, createdBefore.Unix(), rotatedBefore.Unix())
  39. if err != nil {
  40. return err
  41. }
  42. affected, err = res.RowsAffected()
  43. if err != nil {
  44. srv.log.Error("failed to cleanup expired auth tokens", "error", err)
  45. return nil
  46. }
  47. srv.log.Debug("cleanup of expired auth tokens done", "count", affected)
  48. return nil
  49. })
  50. return affected, err
  51. }