Class: Ask::Auth::Providers::RailsCredentials

Inherits:
Object
  • Object
show all
Defined in:
lib/ask/auth/providers/rails_credentials.rb

Overview

Resolves credentials from Rails encrypted credentials.

Supports two lookup modes determined by the name argument type:

Symbol/String  → flat key, looked up literally
resolve(:opencode_api_key)      → credentials.opencode_api_key
resolve("opencode_api_key")     → credentials.opencode_api_key

Array          → path segments, navigated in order
resolve([:opencode, :api_key])  → credentials.opencode.api_key
resolve([:opencode, :go, :api_key]) → credentials.opencode.go.api_key

No splitting, no guessing. The caller determines the lookup path.

Safely returns nil when Rails is not loaded.

Instance Method Summary collapse

Instance Method Details

#call(name, user: nil) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/ask/auth/providers/rails_credentials.rb', line 22

def call(name, user: nil)
  return nil unless defined?(::Rails) && ::Rails.application.respond_to?(:credentials)

  creds = ::Rails.application.credentials
  parts = Array(name).map { |p| p.to_s.strip }
  return nil if parts.empty? || parts.any?(&:empty?)

  # Navigate the path segments. Must check the VALUE, not just
  # respond_to?, because ActiveSupport::OrderedOptions#respond_to?
  # returns true for any method name, even when the key doesn't exist.
  value = parts.reduce(creds) do |obj, part|
    begin
      val = obj.public_send(part)
      break nil if val.nil?
      val
    rescue NoMethodError
      break nil
    end
  end

  value
end