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
- .auth_failure?(error) ⇒ Boolean
- .handle(error) ⇒ Object
- .install(sequel_db) ⇒ Object
- .on_cooldown? ⇒ Boolean
- .request_reissue(error, adapter: :postgresql) ⇒ Object
- .reset! ⇒ Object
Methods included from Logging::Helper
Class Method Details
.auth_failure?(error) ⇒ Boolean
50 51 52 53 |
# File 'lib/legion/data/auth_failure_handler.rb', line 50 def auth_failure?(error) = error..to_s AUTH_FAILURE_PATTERNS.any? { |pattern| .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
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.} — 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 |