kms_rails 0.0.7 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.codeclimate.yml +2 -2
- data/.travis.yml +15 -12
- data/README.md +10 -6
- data/kms_rails.gemspec +21 -22
- data/lib/kms_rails/active_job.rb +5 -4
- data/lib/kms_rails/active_record.rb +10 -8
- data/lib/kms_rails/configuration.rb +21 -16
- data/lib/kms_rails/core.rb +17 -10
- data/lib/kms_rails/kms_client_mock.rb +1 -1
- data/lib/kms_rails/version.rb +1 -1
- metadata +23 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0d44686b36dbb45a7fc0555c8376b39135cf40ee834c3382fadd88c274dda6a0
|
4
|
+
data.tar.gz: 8902378d8c6915ecc383057b54a2ca6f72fa7b7ff8f43d74f990c48170ed9c89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfe253f5456a8271240090c2cd631c1d27050e62388d005534114286f5969e575c08c49644d26ee0ed104c97b73c6f9ee08cf58f315a0bbb54f7aaca59f7a244
|
7
|
+
data.tar.gz: febb5eab0f7a4c80168d38fcc70be634fbcb472d3b85b080017e94d9622b4719e5b2f7df15ddb19790c7517c45844e168bb2a79459a8bce93aa8f86e26472d86
|
data/.codeclimate.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,15 +1,18 @@
|
|
1
|
+
env:
|
2
|
+
global:
|
3
|
+
- CC_TEST_REPORTER_ID=156fab7dad33afa6dd4b24ab5721a01e5bbb41c3f07c380195695102b7363e0a
|
4
|
+
|
1
5
|
language: ruby
|
2
6
|
rvm:
|
3
|
-
- 2.
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
|
7
|
-
addons:
|
8
|
-
code_climate:
|
9
|
-
repo_token: 156fab7dad33afa6dd4b24ab5721a01e5bbb41c3f07c380195695102b7363e0a
|
7
|
+
- 2.5
|
8
|
+
- 2.6
|
9
|
+
- 2.7
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
before_script:
|
12
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
13
|
+
- chmod +x ./cc-test-reporter
|
14
|
+
- ./cc-test-reporter before-build
|
15
|
+
script:
|
16
|
+
- bundle exec rspec spec
|
17
|
+
after_script:
|
18
|
+
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
[![Build Status](https://travis-ci.org/appbot/kms_rails.svg)](https://travis-ci.org/appbot/kms_rails)
|
2
2
|
[![Code Climate](https://codeclimate.com/github/appbot/kms_rails/badges/gpa.svg)](https://codeclimate.com/github/appbot/kms_rails) [![Test Coverage](https://codeclimate.com/github/appbot/kms_rails/badges/coverage.svg)](https://codeclimate.com/github/appbot/kms_rails/coverage)
|
3
3
|
|
4
|
-
#kms_rails
|
4
|
+
# kms_rails
|
5
5
|
|
6
6
|
kms_rails (based on [kms_attrs](https://github.com/justinoue/kms_attrs)) is a gem for easily adding Amazon Web Services KMS encryption to your ActiveRecord model attributes and ActiveJob arguments. It uses the GenerateDataKey method to perform "envelope" encryption locally with an OpenSSL AES-256-CBC cipher.
|
7
7
|
|
@@ -78,9 +78,13 @@ Encryption is done when the job is seralized into the data store and is stored a
|
|
78
78
|
|
79
79
|
The encryption is automatically reversed when the job is deserialized.
|
80
80
|
|
81
|
+
### Data Serialization
|
82
|
+
|
83
|
+
Like kms_attr above, by default your encrypted kms_args values are converted to and from strings. Similarly, you can set `msgpack: true` to enable msgpack serialization and deserialization for arguments instead.
|
84
|
+
|
81
85
|
### Already encrypted parameters
|
82
86
|
|
83
|
-
You also have the option of passing the value from your ActiveRecord encrypted field directly into the ActiveJob. If you do this, the value will not be encrypted twice. However, if you do this, you must ensure that the encryption key ID is the same for both the ActiveRecord attribute and ActiveJob parameter.
|
87
|
+
You also have the option of passing the value from your ActiveRecord encrypted field directly into the ActiveJob. If you do this, the value will not be encrypted twice. However, if you do this, you must ensure that the encryption key ID is the same for both the ActiveRecord attribute and ActiveJob parameter. It is also wise to use the same `msgpack: ` configuration options for both instances to ensure it is correctly decoded.
|
84
88
|
|
85
89
|
For instance, if you want to enqueue an encrypted value into a job on a node that cannot decrypt that value, you could do something like this;
|
86
90
|
|
@@ -91,7 +95,7 @@ MyImportantJob.perform_later(value)
|
|
91
95
|
|
92
96
|
In this instance, `value` will not be decrypted, nor encrypted twice.
|
93
97
|
|
94
|
-
##Additional Options
|
98
|
+
## Additional Options
|
95
99
|
You can add encryption contexts as strings or procs to kms_attr and kms_arg/args. Default is none.
|
96
100
|
```ruby
|
97
101
|
kms_attr :my_attribute, key_id: 'my-aws-kms-key-id',
|
@@ -101,7 +105,7 @@ kms_attr :my_attribute, key_id: 'my-aws-kms-key-id',
|
|
101
105
|
context_key: Proc.new { }, context_value: Proc.new { }
|
102
106
|
```
|
103
107
|
|
104
|
-
##Aws Configuration
|
108
|
+
## Aws Configuration
|
105
109
|
This gem expects some standard Aws SDK configuration. The Aws client is initiated with no credentials. This should then load credentials either from ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'], `Aws` object, or an IAM role on an EC2 instance.
|
106
110
|
|
107
111
|
You can configure your region in a Rails initializer with;
|
@@ -113,7 +117,7 @@ or by using the documented AWS environmental variables.
|
|
113
117
|
|
114
118
|
## Test Mode
|
115
119
|
|
116
|
-
A basic fake implementation of `Aws::KMS::Client` has been written, allowing kms_rails functionality to be used in test environments without making any web requests. The fake implementation emulates the functionality of the two API calls kms_rails issues to AWS and performs fake encryption (the key is 'encrypted' by reversing it).
|
120
|
+
A basic fake implementation of `Aws::KMS::Client` has been written, allowing kms_rails functionality to be used in test environments without making any web requests. The fake implementation emulates the functionality of the two API calls kms_rails issues to AWS and performs fake encryption (the key is 'encrypted' by reversing it).
|
117
121
|
|
118
122
|
You can enable it in your Rails initializers with the following
|
119
123
|
```ruby
|
@@ -141,7 +145,7 @@ Directly specifying a key_id as a UUID or with the `alias/` prefix explicitly de
|
|
141
145
|
## Other stuff
|
142
146
|
|
143
147
|
### Notes
|
144
|
-
This gem has been developed against Ruby 2.3.1, Rails 4.2, and AWS SDK
|
148
|
+
This gem has been developed against Ruby 2.3.1, Rails 4.2, and AWS SDK v3. Credit where credit is due, strongbox by spikex was used as an inspiration and guide when creating this. https://github.com/spikex/strongbox
|
145
149
|
|
146
150
|
### Disclaimer
|
147
151
|
No claims are made about enhanced security when using this gem.
|
data/kms_rails.gemspec
CHANGED
@@ -4,35 +4,34 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'kms_rails/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'kms_rails'
|
8
8
|
spec.version = KmsRails::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Ash Tyndall', 'Justin Ouellette']
|
10
|
+
spec.email = ['ash@appbot.co']
|
11
11
|
|
12
12
|
spec.summary = %q{AWS KMS encryption for ActiveRecord & ActiveJob.}
|
13
13
|
spec.description = %q{Quickly add KMS encryption and decryption to your ActiveRecord model attributes and ActiveJob parameters. Improves upon kms_attrs with ActiveJob support, more efficient binary serialization and a test suite.}
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
14
|
+
spec.homepage = 'https://github.com/appbot/kms_rails'
|
15
|
+
spec.license = 'GPLv3'
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir =
|
18
|
+
spec.bindir = 'exe'
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
21
|
-
spec.required_ruby_version = '>= 2.
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
spec.required_ruby_version = '>= 2.5'
|
22
22
|
|
23
|
-
spec.add_runtime_dependency
|
24
|
-
spec.add_runtime_dependency
|
25
|
-
spec.add_runtime_dependency
|
26
|
-
spec.add_runtime_dependency
|
23
|
+
spec.add_runtime_dependency 'activerecord', '>= 4'
|
24
|
+
spec.add_runtime_dependency 'activejob', '>= 4'
|
25
|
+
spec.add_runtime_dependency 'aws-sdk-kms', '~> 1'
|
26
|
+
spec.add_runtime_dependency 'msgpack'
|
27
27
|
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
37
|
-
spec.add_development_dependency "database_cleaner"
|
28
|
+
spec.add_development_dependency 'bundler'
|
29
|
+
spec.add_development_dependency 'rake', '>= 12.3.3'
|
30
|
+
spec.add_development_dependency 'rspec'
|
31
|
+
spec.add_development_dependency 'rspec-mocks'
|
32
|
+
spec.add_development_dependency 'simplecov'
|
33
|
+
spec.add_development_dependency 'with_model'
|
34
|
+
spec.add_development_dependency 'byebug'
|
35
|
+
spec.add_development_dependency 'sqlite3'
|
36
|
+
spec.add_development_dependency 'database_cleaner'
|
38
37
|
end
|
data/lib/kms_rails/active_job.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'msgpack'
|
1
2
|
require 'active_job'
|
2
3
|
require 'kms_rails/core'
|
3
4
|
|
@@ -10,12 +11,12 @@ module KmsRails
|
|
10
11
|
end
|
11
12
|
|
12
13
|
module ClassMethods
|
13
|
-
def kms_arg(field_number, key_id:, context_key: nil, context_value: nil)
|
14
|
-
kms_args([field_number], key_id: key_id, context_key: context_key, context_value: context_value)
|
14
|
+
def kms_arg(field_number, key_id:, msgpack: false, context_key: nil, context_value: nil)
|
15
|
+
kms_args([field_number], key_id: key_id, msgpack: msgpack, context_key: context_key, context_value: context_value)
|
15
16
|
end
|
16
17
|
|
17
|
-
def kms_args(field_numbers, key_id:, context_key: nil, context_value: nil)
|
18
|
-
enc = Core.new(key_id: key_id, context_key: context_key, context_value: context_value)
|
18
|
+
def kms_args(field_numbers, key_id:, msgpack: false, context_key: nil, context_value: nil)
|
19
|
+
enc = Core.new(key_id: key_id, context_key: context_key, msgpack: msgpack, context_value: context_value)
|
19
20
|
|
20
21
|
define_method 'serialize_arguments' do |args|
|
21
22
|
args = args.dup
|
@@ -14,21 +14,19 @@ module KmsRails
|
|
14
14
|
include InstanceMethods
|
15
15
|
|
16
16
|
real_field = "#{field}_enc"
|
17
|
-
|
18
|
-
raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.column_names.include?(field)
|
19
|
-
|
20
|
-
enc = Core.new(key_id: key_id, context_key: context_key, context_value: context_value)
|
17
|
+
enc = Core.new(key_id: key_id, msgpack: msgpack, context_key: context_key, context_value: context_value)
|
21
18
|
|
22
19
|
define_method "#{field}=" do |data|
|
23
|
-
|
20
|
+
raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.class.column_names.include?(field.to_s)
|
21
|
+
raise RuntimeError, "Field '#{real_field}' must exist to store encrypted data" unless self.class.column_names.include?(real_field)
|
22
|
+
|
23
|
+
if data.blank? # Just set to nil if nil
|
24
24
|
clear_retained(field)
|
25
25
|
self[real_field] = nil
|
26
26
|
return
|
27
27
|
end
|
28
28
|
|
29
29
|
set_retained(field, data) if retain
|
30
|
-
data = data.to_msgpack if msgpack
|
31
|
-
|
32
30
|
encrypted_data = enc.encrypt(data)
|
33
31
|
data = nil
|
34
32
|
|
@@ -36,10 +34,15 @@ module KmsRails
|
|
36
34
|
end
|
37
35
|
|
38
36
|
define_method "#{real_field}" do
|
37
|
+
raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.class.column_names.include?(field.to_s)
|
38
|
+
raise RuntimeError, "Field '#{real_field}' must exist to retrieve encrypted data" unless self.class.column_names.include?(real_field)
|
39
39
|
Core.to64( get_hash(field) )
|
40
40
|
end
|
41
41
|
|
42
42
|
define_method "#{field}" do
|
43
|
+
raise RuntimeError, "Field '#{field}' must not be a real column, '#{real_field}' is the real column" if self.class.column_names.include?(field.to_s)
|
44
|
+
raise RuntimeError, "Field '#{real_field}' must exist to retrieve decrypted data" unless self.class.column_names.include?(real_field)
|
45
|
+
|
43
46
|
hash = get_hash(field)
|
44
47
|
return nil unless hash
|
45
48
|
|
@@ -47,7 +50,6 @@ module KmsRails
|
|
47
50
|
plaintext
|
48
51
|
else
|
49
52
|
plaintext = enc.decrypt(hash)
|
50
|
-
plaintext = MessagePack.unpack(plaintext) if msgpack
|
51
53
|
set_retained(field, plaintext) if retain
|
52
54
|
plaintext
|
53
55
|
end
|
@@ -1,23 +1,28 @@
|
|
1
1
|
module KmsRails
|
2
|
-
|
3
|
-
|
4
|
-
end
|
2
|
+
module ConfigurationBase
|
3
|
+
attr_writer :configuration
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
yield(configuration)
|
9
|
-
end
|
5
|
+
class Configuration
|
6
|
+
attr_accessor :fake_kms_api, :alias_prefix
|
10
7
|
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
def initialize
|
9
|
+
@fake_kms_api = false
|
10
|
+
@alias_prefix = ''
|
11
|
+
end
|
12
|
+
end
|
14
13
|
|
15
|
-
|
16
|
-
|
14
|
+
def configuration
|
15
|
+
@configuration ||= Configuration.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def configure
|
19
|
+
yield(self.configuration)
|
20
|
+
end
|
17
21
|
|
18
|
-
def
|
19
|
-
@
|
20
|
-
@alias_prefix = ''
|
22
|
+
def reset_config
|
23
|
+
@configuration = Configuration.new
|
21
24
|
end
|
22
25
|
end
|
23
|
-
|
26
|
+
|
27
|
+
extend ConfigurationBase
|
28
|
+
end
|
data/lib/kms_rails/core.rb
CHANGED
@@ -1,22 +1,25 @@
|
|
1
1
|
require 'base64'
|
2
2
|
require 'openssl'
|
3
|
-
require '
|
3
|
+
require 'msgpack'
|
4
|
+
require 'aws-sdk-kms'
|
4
5
|
require 'kms_rails/configuration'
|
5
6
|
|
6
7
|
module KmsRails
|
7
8
|
class Core
|
8
9
|
attr_reader :context_key, :context_value
|
9
10
|
|
10
|
-
def initialize(key_id:, context_key: nil, context_value: nil)
|
11
|
+
def initialize(key_id:, msgpack: false, context_key: nil, context_value: nil)
|
11
12
|
@base_key_id = key_id
|
12
13
|
@context_key = context_key
|
13
14
|
@context_value = context_value
|
15
|
+
@msgpack = msgpack
|
14
16
|
end
|
15
17
|
|
16
18
|
def encrypt(data)
|
17
19
|
return nil if data.nil?
|
18
20
|
|
19
21
|
data_key = aws_generate_data_key(key_id)
|
22
|
+
data = data.to_msgpack if @msgpack
|
20
23
|
encrypted = encrypt_attr(data, data_key.plaintext)
|
21
24
|
|
22
25
|
self.class.shred_string(data_key.plaintext)
|
@@ -36,13 +39,17 @@ module KmsRails
|
|
36
39
|
|
37
40
|
def decrypt(data_obj)
|
38
41
|
return nil if data_obj.nil?
|
39
|
-
|
40
|
-
|
42
|
+
|
43
|
+
decrypted = decrypt_attr(
|
44
|
+
data_obj['blob'],
|
41
45
|
aws_decrypt_key(data_obj['key']),
|
42
46
|
data_obj['iv']
|
43
47
|
)
|
48
|
+
|
49
|
+
decrypted = MessagePack.unpack(decrypted) if @msgpack
|
50
|
+
decrypted
|
44
51
|
end
|
45
|
-
|
52
|
+
|
46
53
|
def decrypt64(data_obj)
|
47
54
|
return nil if data_obj.nil?
|
48
55
|
decrypt( self.class.from64(data_obj) )
|
@@ -54,7 +61,7 @@ module KmsRails
|
|
54
61
|
@base_key_id.call
|
55
62
|
when String
|
56
63
|
if @base_key_id =~ /\A\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\z/ || @base_key_id.start_with?('alias/') # if UUID or direct alias
|
57
|
-
@base_key_id
|
64
|
+
@base_key_id
|
58
65
|
else
|
59
66
|
'alias/' + KmsRails.configuration.alias_prefix + @base_key_id
|
60
67
|
end
|
@@ -78,7 +85,7 @@ module KmsRails
|
|
78
85
|
data_obj.map { |k,v| [k, Base64.strict_decode64(v)] }.to_h
|
79
86
|
end
|
80
87
|
|
81
|
-
private
|
88
|
+
private
|
82
89
|
|
83
90
|
def apply_context(args, key, value)
|
84
91
|
if key && value
|
@@ -116,7 +123,7 @@ module KmsRails
|
|
116
123
|
|
117
124
|
def aws_decrypt_key(key)
|
118
125
|
args = {ciphertext_blob: key}
|
119
|
-
aws_kms.decrypt(apply_context(args, @context_key, @context_value)).plaintext
|
126
|
+
aws_kms.decrypt(**apply_context(args, @context_key, @context_value)).plaintext
|
120
127
|
end
|
121
128
|
|
122
129
|
def aws_kms
|
@@ -126,7 +133,7 @@ module KmsRails
|
|
126
133
|
|
127
134
|
def aws_generate_data_key(key_id)
|
128
135
|
args = {key_id: key_id, key_spec: 'AES_256'}
|
129
|
-
aws_kms.generate_data_key(apply_context(args, @context_key, @context_value))
|
136
|
+
aws_kms.generate_data_key(**apply_context(args, @context_key, @context_value))
|
130
137
|
end
|
131
138
|
end
|
132
|
-
end
|
139
|
+
end
|
data/lib/kms_rails/version.rb
CHANGED
metadata
CHANGED
@@ -1,58 +1,58 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kms_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ash Tyndall
|
8
8
|
- Justin Ouellette
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-09-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '4'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '4'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: activejob
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - "
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '4'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '4'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
|
-
name: aws-sdk
|
43
|
+
name: aws-sdk-kms
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '1'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '1'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: msgpack
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -71,30 +71,30 @@ dependencies:
|
|
71
71
|
name: bundler
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - "
|
74
|
+
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
76
|
+
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- - "
|
81
|
+
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
83
|
+
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: rake
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - "
|
88
|
+
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
90
|
+
version: 12.3.3
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - "
|
95
|
+
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
97
|
+
version: 12.3.3
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: rspec
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,20 +137,6 @@ dependencies:
|
|
137
137
|
- - ">="
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
|
-
- !ruby/object:Gem::Dependency
|
141
|
-
name: codeclimate-test-reporter
|
142
|
-
requirement: !ruby/object:Gem::Requirement
|
143
|
-
requirements:
|
144
|
-
- - ">="
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: '0'
|
147
|
-
type: :development
|
148
|
-
prerelease: false
|
149
|
-
version_requirements: !ruby/object:Gem::Requirement
|
150
|
-
requirements:
|
151
|
-
- - ">="
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
version: '0'
|
154
140
|
- !ruby/object:Gem::Dependency
|
155
141
|
name: with_model
|
156
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,7 +224,7 @@ homepage: https://github.com/appbot/kms_rails
|
|
238
224
|
licenses:
|
239
225
|
- GPLv3
|
240
226
|
metadata: {}
|
241
|
-
post_install_message:
|
227
|
+
post_install_message:
|
242
228
|
rdoc_options: []
|
243
229
|
require_paths:
|
244
230
|
- lib
|
@@ -246,16 +232,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
246
232
|
requirements:
|
247
233
|
- - ">="
|
248
234
|
- !ruby/object:Gem::Version
|
249
|
-
version: '2.
|
235
|
+
version: '2.5'
|
250
236
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
251
237
|
requirements:
|
252
238
|
- - ">="
|
253
239
|
- !ruby/object:Gem::Version
|
254
240
|
version: '0'
|
255
241
|
requirements: []
|
256
|
-
rubyforge_project:
|
257
|
-
rubygems_version: 2.
|
258
|
-
signing_key:
|
242
|
+
rubyforge_project:
|
243
|
+
rubygems_version: 2.7.9
|
244
|
+
signing_key:
|
259
245
|
specification_version: 4
|
260
246
|
summary: AWS KMS encryption for ActiveRecord & ActiveJob.
|
261
247
|
test_files: []
|