Class: Secvault::EarlyLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/secvault/railtie.rb

Overview

Early loader class to handle secrets before application configuration

Class Method Summary collapse

Class Method Details

.setup_early_secrets(app) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/secvault/railtie.rb', line 50

def setup_early_secrets(app)
  # Captured in a local variable because `define_singleton_method` below binds
  # `self` to `Rails.application`, which doesn't have `debug_secvault?`.
  in_debug_mode = debug_secvault?
  puts "[Secvault Debug] setup_early_secrets called" if in_debug_mode

  if Rails.application.respond_to?(:secrets) && !Rails.application.secrets.empty?
    puts "[Secvault Debug] Secrets already exist, skipping early load" if in_debug_mode
    return
  end

  # Look for Secvault configuration in the app
  secrets_config = find_secvault_config(app)
  puts "[Secvault Debug] Found config: #{secrets_config&.keys}" if in_debug_mode
  return unless secrets_config

  begin
    # Load secrets using the configuration found
    all_secrets = Secvault::Secrets.parse(secrets_config[:files], env: Rails.env)
    puts "[Secvault Debug] Loaded secrets keys: #{all_secrets.keys}" if in_debug_mode

    # Set up Rails.application.secrets immediately
    Rails.application.define_singleton_method(:secrets) do
      @secrets ||= begin
        current_secrets = ActiveSupport::OrderedOptions.new
        current_secrets.merge!(all_secrets)
        puts "[Secvault Debug] Returning secrets with encryption: #{current_secrets.encryption}" if in_debug_mode
        current_secrets
      end
    end

    # Test the secrets immediately
    test_encryption = Rails.application.secrets.encryption
    puts "[Secvault Debug] Test access - encryption: #{test_encryption.class} - #{test_encryption}" if in_debug_mode

    Rails.logger&.info "[Secvault] Early secrets loaded from #{secrets_config[:files].size} files" if in_debug_mode
  rescue => e
    Rails.logger&.warn "[Secvault] Failed to load early secrets: #{e.message}"
  end
end