lib/kms_encrypted.rb in kms_encrypted-0.1.3 vs lib/kms_encrypted.rb in kms_encrypted-0.1.4
- old
+ new
@@ -1,91 +1,41 @@
-require "kms_encrypted/version"
+# dependencies
require "active_support"
require "aws-sdk-kms"
+# modules
+require "kms_encrypted/log_subscriber"
+require "kms_encrypted/model"
+require "kms_encrypted/version"
+
module KmsEncrypted
class << self
- attr_accessor :client_options
+ attr_writer :kms_client
+
+ def kms_client
+ @kms_client ||= Aws::KMS::Client.new(client_options)
+ end
+ alias_method :kms, :kms_client
+
+ # deprecated, use kms_client instead
+ attr_reader :client_options
+
+ # deprecated, use kms_client instead
+ def client_options=(value)
+ @client_options = value
+ @kms_client = nil
+ end
end
+
+ # deprecated, use kms_client instead
self.client_options = {
retry_limit: 2,
http_open_timeout: 2,
http_read_timeout: 2
}
-
- def self.kms
- @kms ||= Aws::KMS::Client.new(client_options)
- end
-
- module Model
- def has_kms_key(legacy_key_id = nil, name: nil, key_id: nil)
- key_id ||= legacy_key_id || ENV["KMS_KEY_ID"]
-
- key_method = name ? "kms_key_#{name}" : "kms_key"
-
- class_eval do
- define_method(key_method) do
- raise ArgumentError, "Missing key id" unless key_id
-
- instance_var = "@#{key_method}"
-
- unless instance_variable_get(instance_var)
- if key_id == "insecure-test-key"
- instance_variable_set(instance_var, "00000000000000000000000000000000")
- else
- key_column = "encrypted_#{key_method}"
- context_method = name ? "kms_encryption_context_#{name}" : "kms_encryption_context"
- context = respond_to?(context_method, true) ? send(context_method) : {}
- default_encoding = "m"
-
- unless send(key_column)
- resp = KmsEncrypted.kms.generate_data_key(
- key_id: key_id,
- encryption_context: context,
- key_spec: "AES_256"
- )
- ciphertext = resp.ciphertext_blob
- instance_variable_set(instance_var, resp.plaintext)
- self.send("#{key_column}=", [resp.ciphertext_blob].pack(default_encoding))
- end
-
- unless instance_variable_get(instance_var)
- ciphertext = send(key_column).unpack(default_encoding).first
- resp = KmsEncrypted.kms.decrypt(
- ciphertext_blob: ciphertext,
- encryption_context: context
- )
- instance_variable_set(instance_var, resp.plaintext)
- end
- end
- end
-
- instance_variable_get(instance_var)
- end
-
- define_method("rotate_#{key_method}!") do
- # decrypt
- plaintext_attributes = {}
- self.class.encrypted_attributes.select { |_, v| v[:key] == key_method.to_sym }.keys.each do |key|
- plaintext_attributes[key] = send(key)
- end
-
- # reset key
- instance_variable_set("@#{key_method}", nil)
- send("encrypted_#{key_method}=", nil)
-
- # encrypt again
- plaintext_attributes.each do |attr, value|
- send("#{attr}=", value)
- end
-
- # update atomically
- save!
- end
- end
- end
- end
end
ActiveSupport.on_load(:active_record) do
extend KmsEncrypted::Model
end
+
+KmsEncrypted::LogSubscriber.attach_to :kms_encrypted