class EventStoreClient::DataDecryptor

Constants

KeyNotFoundError

Attributes

encrypted_data[R]
encryption_metadata[R]
key_repository[R]

Public Class Methods

new(data:, schema:, repository:) click to toggle source
# File lib/event_store_client/data_decryptor.rb, line 25
def initialize(data:, schema:, repository:)
  @encrypted_data = deep_dup(data).transform_keys!(&:to_s)
  @key_repository = repository
  @encryption_metadata = schema&.transform_keys(&:to_s) || {}
end

Public Instance Methods

call() click to toggle source
# File lib/event_store_client/data_decryptor.rb, line 11
def call
  return encrypted_data if encryption_metadata.empty?

  decrypt_attributes(
    key: find_key(encryption_metadata['key']),
    data: encrypted_data,
    attributes: encryption_metadata['attributes']
  )
end

Private Instance Methods

decrypt_attributes(key:, data:, attributes: {}) click to toggle source
# File lib/event_store_client/data_decryptor.rb, line 31
def decrypt_attributes(key:, data:, attributes: {}) # rubocop:disable Lint/UnusedMethodArgument
  return data unless key

  res = key_repository.decrypt(key: key, message: data['es_encrypted'])
  return data if res.failure?

  decrypted_text = res.value!
  decrypted = JSON.parse(decrypted_text.attributes[:message]).transform_keys(&:to_s)
  decrypted.each { |k, value| data[k] = value if data.key?(k) }
  data.delete('es_encrypted')
  data
end
deep_dup(hash) click to toggle source
# File lib/event_store_client/data_decryptor.rb, line 44
def deep_dup(hash)
  return hash unless hash.instance_of?(Hash)
  dupl = hash.dup
  dupl.each { |k, v| dupl[k] = v.instance_of?(Hash) ? deep_dup(v) : v }
  dupl
end
find_key(identifier) click to toggle source
# File lib/event_store_client/data_decryptor.rb, line 51
def find_key(identifier)
  key =
    begin
      key_repository.find(identifier).value!
    rescue StandardError => e
      config.error_handler&.call(e)
      nil
    end

  key
end