Module: Legion::Data::AuthFailureHandler

Extended by:
Logging::Helper
Defined in:
lib/legion/data/auth_failure_handler.rb

Defined Under Namespace

Modules: SequelHook

Constant Summary collapse

AUTH_FAILURE_PATTERNS =
[
  /role .* does not exist/i,
  /password authentication failed/i,
  /authentication failed/i,
  /no pg_hba\.conf entry/i,
  /permission denied for table/i,
  /permission denied for relation/i
].freeze
REISSUE_COOLDOWN =
30

Class Method Summary collapse

Methods included from Logging::Helper

handle_exception

Class Method Details

.auth_failure?(error) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
53
# File 'lib/legion/data/auth_failure_handler.rb', line 50

def auth_failure?(error)
  message = error.message.to_s
  AUTH_FAILURE_PATTERNS.any? { |pattern| message.match?(pattern) }
end

.handle(error) ⇒ Object



43
44
45
46
47
48
# File 'lib/legion/data/auth_failure_handler.rb', line 43

def handle(error)
  return unless auth_failure?(error)
  return if on_cooldown?

  request_reissue(error)
end

.install(sequel_db) ⇒ Object



39
40
41
# File 'lib/legion/data/auth_failure_handler.rb', line 39

def install(sequel_db)
  sequel_db.singleton_class.prepend(SequelHook)
end

.on_cooldown?Boolean

Returns:

  • (Boolean)


55
56
57
58
59
60
61
# File 'lib/legion/data/auth_failure_handler.rb', line 55

def on_cooldown?
  @mutex.synchronize do
    return false unless @last_reissue_at

    (Time.now - @last_reissue_at) < REISSUE_COOLDOWN
  end
end

.request_reissue(error, adapter: :postgresql) ⇒ Object



63
64
65
66
67
68
69
70
71
72
# File 'lib/legion/data/auth_failure_handler.rb', line 63

def request_reissue(error, adapter: :postgresql)
  @mutex.synchronize { @last_reissue_at = Time.now }
  log.error("Legion::Data auth failure detected: #{error.message} — requesting lease reissue")

  return unless defined?(Legion::Crypt::LeaseManager)

  Legion::Crypt::LeaseManager.instance.reissue_lease(adapter)
rescue StandardError => e
  handle_exception(e, level: :error, handled: true, operation: :auth_failure_reissue)
end

.reset!Object



74
75
76
# File 'lib/legion/data/auth_failure_handler.rb', line 74

def reset!
  @mutex.synchronize { @last_reissue_at = nil }
end