Module: DopplerRails::Operations

Defined in:
lib/doppler_rails.rb

Class Method Summary collapse

Class Method Details

.connectionObject



46
47
48
49
50
51
# File 'lib/doppler_rails.rb', line 46

def connection
  Faraday.new("https://api.doppler.com/v3/") do |conn|
    conn.request :basic_auth, TOKEN, ""
    conn.request :retry, max: 3, interval: 0.3, backoff_factor: 2, exceptions: RETRY_EXCEPTIONS
  end
end

.decrypt(message) ⇒ Object



53
54
55
56
57
# File 'lib/doppler_rails.rb', line 53

def decrypt(message)
  encrypted, salt = message.split("\n", 2)
  key = ActiveSupport::KeyGenerator.new(TOKEN).generate_key(Base64.urlsafe_decode64(salt), ActiveSupport::MessageEncryptor.key_len)
  ActiveSupport::MessageEncryptor.new(key).decrypt_and_verify(encrypted)
end

.encrypt(secrets) ⇒ Object



59
60
61
62
63
# File 'lib/doppler_rails.rb', line 59

def encrypt(secrets)
  salt = SecureRandom.random_bytes(ActiveSupport::MessageEncryptor.key_len)
  key = ActiveSupport::KeyGenerator.new(TOKEN).generate_key(salt, ActiveSupport::MessageEncryptor.key_len)
  ActiveSupport::MessageEncryptor.new(key).encrypt_and_sign(secrets) + "\n" + Base64.urlsafe_encode64(salt)
end

.fetch_enviroment_variablesObject



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/doppler_rails.rb', line 21

def fetch_enviroment_variables
  return if TOKEN.blank?
  response = connection.get("configs/config/secrets/download?format=json")
  if response.success?
    store_fallback(response.body)
    ENV.update(JSON.parse(response.body))
  else
    use_fallback_if_present
  end
rescue Faraday::Error
  use_fallback_if_present
end

.store_fallback(secrets) ⇒ Object



34
35
36
37
# File 'lib/doppler_rails.rb', line 34

def store_fallback(secrets)
  return unless FALLBACK_FILE_PATH.present?
  File.write(FALLBACK_FILE_PATH, encrypt(secrets), encoding: "ascii-8bit")
end

.use_fallback_if_presentObject



39
40
41
42
43
44
# File 'lib/doppler_rails.rb', line 39

def use_fallback_if_present
  return unless FALLBACK_FILE_PATH.present?
  return unless File.exist?(FALLBACK_FILE_PATH)
  secrets = decrypt(File.read(FALLBACK_FILE_PATH, encoding: "ascii-8bit"))
  ENV.update(JSON.parse(secrets))
end