chamber 2.12.3 → 2.12.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +1 -1
- data/lib/chamber/commands/base.rb +1 -1
- data/lib/chamber/commands/securable.rb +1 -1
- data/lib/chamber/context_resolver.rb +8 -0
- data/lib/chamber/encryption_methods/ssl.rb +10 -1
- data/lib/chamber/file.rb +6 -6
- data/lib/chamber/file_set.rb +3 -3
- data/lib/chamber/files/signature.rb +18 -12
- data/lib/chamber/filters/decryption_filter.rb +5 -7
- data/lib/chamber/filters/encryption_filter.rb +11 -2
- data/lib/chamber/filters/failed_decryption_filter.rb +1 -1
- data/lib/chamber/filters/insecure_filter.rb +11 -2
- data/lib/chamber/instance.rb +15 -15
- data/lib/chamber/integrations/rails.rb +1 -1
- data/lib/chamber/integrations/sinatra.rb +6 -6
- data/lib/chamber/key_pair.rb +1 -1
- data/lib/chamber/keys/base.rb +21 -9
- data/lib/chamber/keys/decryption.rb +3 -9
- data/lib/chamber/keys/encryption.rb +3 -9
- data/lib/chamber/settings.rb +13 -11
- data/lib/chamber/version.rb +1 -1
- metadata +33 -30
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 425f228909eed866d3e32a614a37f4c5d6cfbb4245fe7b063a1373d40ed9aa99
|
4
|
+
data.tar.gz: eb9f9fec710e239379c6126344a958d45f57b9ce587e1a6084e32eb61fa6ea47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2a087b086635a2b23ece643d72f0f15eb4c3556ce235d27465165aab20e694182dcb67b12e821a3a9b4377ff4bdda7189a485208820cf65b1b399989eaf9f39
|
7
|
+
data.tar.gz: 0146d205f516a1c689aae1f3c29e80d252cc5a0bc68d73f44c4964fe6a8effdebddc40fbc7925393814a470743a5ab0ed52587d4f5c31db54f7dd024ea45f277
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -32,7 +32,7 @@ The names and logos for The Kompanee are trademarks of The Kompanee, Ltd.
|
|
32
32
|
|
33
33
|
## License
|
34
34
|
|
35
|
-
Chamber is Copyright © 2014-
|
35
|
+
Chamber is Copyright © 2014-2019 Jeff Felchner and Mark McEahern. It is free
|
36
36
|
software, and may be redistributed under the terms specified in the
|
37
37
|
[LICENSE][license] file.
|
38
38
|
|
@@ -53,7 +53,7 @@ module Securable
|
|
53
53
|
end
|
54
54
|
|
55
55
|
`
|
56
|
-
git ls-files --other --ignored --exclude-
|
56
|
+
git ls-files --other --ignored --exclude-per-directory=.gitignore |
|
57
57
|
sed -e "s|^|#{Shellwords.escape(rootpath.to_s)}/|" |
|
58
58
|
grep --colour=never -E '#{shell_escaped_chamber_filenames.join('|')}'
|
59
59
|
`.split("\n")
|
@@ -30,6 +30,7 @@ class ContextResolver
|
|
30
30
|
options[:basepath] ||= options[:rootpath]
|
31
31
|
end
|
32
32
|
|
33
|
+
options[:namespaces] = resolve_namespaces(options[:namespaces])
|
33
34
|
options[:encryption_keys] = Keys::Encryption.resolve(filenames: options[:encryption_keys],
|
34
35
|
namespaces: options[:namespaces],
|
35
36
|
rootpath: options[:rootpath])
|
@@ -52,6 +53,13 @@ class ContextResolver
|
|
52
53
|
|
53
54
|
protected
|
54
55
|
|
56
|
+
def resolve_namespaces(other)
|
57
|
+
(other.respond_to?(:values) ? other.values : other)
|
58
|
+
.map do |namespace|
|
59
|
+
namespace.respond_to?(:call) ? namespace.call : namespace
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
55
63
|
def resolve_preset
|
56
64
|
if in_a_rails_project?
|
57
65
|
'rails'
|
@@ -5,7 +5,16 @@ require 'base64'
|
|
5
5
|
module Chamber
|
6
6
|
module EncryptionMethods
|
7
7
|
class Ssl
|
8
|
-
|
8
|
+
BASE64_STRING_PATTERN = %r{[A-Za-z0-9\+\/#]*\={0,2}}.freeze
|
9
|
+
LARGE_DATA_STRING_PATTERN = /
|
10
|
+
\A
|
11
|
+
(#{BASE64_STRING_PATTERN})
|
12
|
+
\#
|
13
|
+
(#{BASE64_STRING_PATTERN})
|
14
|
+
\#
|
15
|
+
(#{BASE64_STRING_PATTERN})
|
16
|
+
\z
|
17
|
+
/x.freeze
|
9
18
|
|
10
19
|
def self.encrypt(_key, value, encryption_keys)
|
11
20
|
value = YAML.dump(value)
|
data/lib/chamber/file.rb
CHANGED
@@ -70,10 +70,10 @@ class File < Pathname
|
|
70
70
|
# ```
|
71
71
|
#
|
72
72
|
def to_settings
|
73
|
-
@
|
74
|
-
|
75
|
-
|
76
|
-
|
73
|
+
@to_settings ||= Settings.new(settings: file_contents_hash,
|
74
|
+
namespaces: namespaces,
|
75
|
+
decryption_keys: decryption_keys,
|
76
|
+
encryption_keys: encryption_keys)
|
77
77
|
end
|
78
78
|
|
79
79
|
# rubocop:disable Metrics/LineLength
|
@@ -92,13 +92,13 @@ class File < Pathname
|
|
92
92
|
sub!(
|
93
93
|
/^(\s*)#{secure_prefix_pattern}#{escaped_name}(\s*):(\s*)['"]?#{escaped_value}['"]?$/,
|
94
94
|
"\\1#{secure_prefix}#{name_pieces.last}\\2:\\3#{secure_value}",
|
95
|
-
|
95
|
+
)
|
96
96
|
|
97
97
|
file_contents.
|
98
98
|
sub!(
|
99
99
|
/^(\s*)#{secure_prefix_pattern}#{escaped_name}(\s*):(\s*)\|((?:\n\1\s{2}.*)+)/,
|
100
100
|
"\\1#{secure_prefix}#{name_pieces.last}\\2:\\3#{secure_value}",
|
101
|
-
|
101
|
+
)
|
102
102
|
end
|
103
103
|
|
104
104
|
write(file_contents)
|
data/lib/chamber/file_set.rb
CHANGED
@@ -112,11 +112,11 @@ require 'chamber/settings'
|
|
112
112
|
#
|
113
113
|
module Chamber
|
114
114
|
class FileSet
|
115
|
-
attr_reader :namespaces,
|
116
|
-
:paths
|
117
115
|
attr_accessor :decryption_keys,
|
118
116
|
:encryption_keys,
|
119
117
|
:basepath
|
118
|
+
attr_reader :namespaces,
|
119
|
+
:paths
|
120
120
|
|
121
121
|
def initialize(options = {})
|
122
122
|
self.namespaces = options[:namespaces] || {}
|
@@ -247,7 +247,7 @@ class FileSet
|
|
247
247
|
private
|
248
248
|
|
249
249
|
def all_files
|
250
|
-
@all_files ||= file_globs.map { |fg| Pathname.glob(fg) }.flatten.uniq.sort
|
250
|
+
@all_files ||= file_globs.map { |fg| Pathname.glob(fg) }.flatten.uniq.sort # rubocop:disable Performance/ChainArrayAllocation
|
251
251
|
end
|
252
252
|
|
253
253
|
def non_namespaced_files
|
@@ -7,9 +7,15 @@ require 'time'
|
|
7
7
|
module Chamber
|
8
8
|
module Files
|
9
9
|
class Signature
|
10
|
-
SIGNATURE_HEADER
|
11
|
-
|
12
|
-
|
10
|
+
SIGNATURE_HEADER = '-----BEGIN CHAMBER SIGNATURE-----'
|
11
|
+
SIGNATURE_HEADER_PATTERN = /\-\-\-\-\-BEGIN\sCHAMBER\sSIGNATURE\-\-\-\-\-/.freeze
|
12
|
+
SIGNATURE_FOOTER = '-----END CHAMBER SIGNATURE-----'
|
13
|
+
SIGNATURE_FOOTER_PATTERN = /\-\-\-\-\-END\sCHAMBER\sSIGNATURE\-\-\-\-\-/.freeze
|
14
|
+
SIGNATURE_IN_FILE_PATTERN = /
|
15
|
+
#{SIGNATURE_HEADER_PATTERN}\n # Header
|
16
|
+
(.*)\n # Signature Body
|
17
|
+
#{SIGNATURE_FOOTER_PATTERN} # Footer
|
18
|
+
/x.freeze
|
13
19
|
|
14
20
|
attr_accessor :settings_content,
|
15
21
|
:settings_filename
|
@@ -23,14 +29,14 @@ class Signature
|
|
23
29
|
end
|
24
30
|
|
25
31
|
def signature_key=(keyish)
|
26
|
-
@signature_key
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
@signature_key = if keyish.is_a?(OpenSSL::PKey::RSA)
|
33
|
+
keyish
|
34
|
+
elsif ::File.readable?(::File.expand_path(keyish))
|
35
|
+
file_contents = ::File.read(::File.expand_path(keyish))
|
36
|
+
OpenSSL::PKey::RSA.new(file_contents)
|
37
|
+
else
|
38
|
+
OpenSSL::PKey::RSA.new(keyish)
|
39
|
+
end
|
34
40
|
end
|
35
41
|
|
36
42
|
def write
|
@@ -68,7 +74,7 @@ Signed At: #{Time.now.utc.iso8601}
|
|
68
74
|
def encoded_signature_content
|
69
75
|
@encoded_signature_content ||= signature_filename.
|
70
76
|
read.
|
71
|
-
match(
|
77
|
+
match(SIGNATURE_IN_FILE_PATTERN) do |match|
|
72
78
|
match[1]
|
73
79
|
end
|
74
80
|
end
|
@@ -12,7 +12,7 @@ require 'chamber/errors/decryption_failure'
|
|
12
12
|
module Chamber
|
13
13
|
module Filters
|
14
14
|
class DecryptionFilter
|
15
|
-
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}
|
15
|
+
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}.freeze
|
16
16
|
LARGE_DATA_STRING_PATTERN = %r{
|
17
17
|
\A # Beginning of String
|
18
18
|
(
|
@@ -27,7 +27,7 @@ class DecryptionFilter
|
|
27
27
|
[A-Za-z0-9\+\/#]*\={0,2} # Base64 Encoded Data
|
28
28
|
)
|
29
29
|
\z # End of String
|
30
|
-
}x
|
30
|
+
}x.freeze
|
31
31
|
|
32
32
|
attr_accessor :data,
|
33
33
|
:secure_key_token
|
@@ -79,11 +79,9 @@ class DecryptionFilter
|
|
79
79
|
method = decryption_method(value)
|
80
80
|
|
81
81
|
decryption_keys.each do |decryption_key|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
next
|
86
|
-
end
|
82
|
+
return method.decrypt(key, value, decryption_key)
|
83
|
+
rescue OpenSSL::PKey::RSAError
|
84
|
+
next
|
87
85
|
end
|
88
86
|
|
89
87
|
value
|
@@ -10,8 +10,17 @@ require 'chamber/encryption_methods/none'
|
|
10
10
|
module Chamber
|
11
11
|
module Filters
|
12
12
|
class EncryptionFilter
|
13
|
-
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}
|
14
|
-
|
13
|
+
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}.freeze
|
14
|
+
BASE64_SUBSTRING_PATTERN = %r{[A-Za-z0-9\+\/#]*\={0,2}}.freeze
|
15
|
+
LARGE_DATA_STRING_PATTERN = /
|
16
|
+
\A
|
17
|
+
(#{BASE64_SUBSTRING_PATTERN})
|
18
|
+
\#
|
19
|
+
(#{BASE64_SUBSTRING_PATTERN})
|
20
|
+
\#
|
21
|
+
(#{BASE64_SUBSTRING_PATTERN})
|
22
|
+
\z
|
23
|
+
/x.freeze
|
15
24
|
|
16
25
|
attr_accessor :data,
|
17
26
|
:secure_key_token
|
@@ -5,7 +5,7 @@ require 'chamber/errors/decryption_failure'
|
|
5
5
|
module Chamber
|
6
6
|
module Filters
|
7
7
|
class FailedDecryptionFilter
|
8
|
-
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}
|
8
|
+
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+/]{342}==\z}.freeze
|
9
9
|
|
10
10
|
def self.execute(options = {})
|
11
11
|
new(options).__send__(:execute)
|
@@ -6,8 +6,17 @@ require 'chamber/filters/secure_filter'
|
|
6
6
|
module Chamber
|
7
7
|
module Filters
|
8
8
|
class InsecureFilter < SecureFilter
|
9
|
-
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}
|
10
|
-
|
9
|
+
BASE64_STRING_PATTERN = %r{\A[A-Za-z0-9\+\/]{342}==\z}.freeze
|
10
|
+
BASE64_SUBSTRING_PATTERN = %r{[A-Za-z0-9\+\/#]*\={0,2}}.freeze
|
11
|
+
LARGE_DATA_STRING_PATTERN = /
|
12
|
+
\A
|
13
|
+
(#{BASE64_SUBSTRING_PATTERN})
|
14
|
+
\#
|
15
|
+
(#{BASE64_SUBSTRING_PATTERN})
|
16
|
+
\#
|
17
|
+
(#{BASE64_SUBSTRING_PATTERN})
|
18
|
+
\z
|
19
|
+
/x.freeze
|
11
20
|
|
12
21
|
protected
|
13
22
|
|
data/lib/chamber/instance.rb
CHANGED
@@ -39,12 +39,12 @@ class Instance
|
|
39
39
|
|
40
40
|
Settings.
|
41
41
|
new(
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
42
|
+
config.merge(
|
43
|
+
settings: data,
|
44
|
+
pre_filters: [Filters::EncryptionFilter],
|
45
|
+
post_filters: [],
|
46
|
+
),
|
47
|
+
).
|
48
48
|
to_hash
|
49
49
|
end
|
50
50
|
|
@@ -53,15 +53,15 @@ class Instance
|
|
53
53
|
|
54
54
|
Settings.
|
55
55
|
new(
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
56
|
+
config.merge(
|
57
|
+
settings: data,
|
58
|
+
pre_filters: [Filters::NamespaceFilter],
|
59
|
+
post_filters: [
|
60
|
+
Filters::DecryptionFilter,
|
61
|
+
Filters::FailedDecryptionFilter,
|
62
|
+
],
|
63
|
+
),
|
64
|
+
).
|
65
65
|
to_hash
|
66
66
|
end
|
67
67
|
|
@@ -16,12 +16,12 @@ module Sinatra
|
|
16
16
|
end
|
17
17
|
|
18
18
|
Chamber.load(
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
basepath: root,
|
20
|
+
namespaces: {
|
21
|
+
environment: -> { env },
|
22
|
+
hostname: -> { Socket.gethostname },
|
23
|
+
},
|
24
|
+
)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
data/lib/chamber/key_pair.rb
CHANGED
data/lib/chamber/keys/base.rb
CHANGED
@@ -27,6 +27,7 @@ class Base
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
# rubocop:disable Performance/ChainArrayAllocation
|
30
31
|
def filenames=(other)
|
31
32
|
@filenames = begin
|
32
33
|
paths = Array(other).
|
@@ -42,19 +43,20 @@ class Base
|
|
42
43
|
uniq
|
43
44
|
end
|
44
45
|
end
|
46
|
+
# rubocop:enable Performance/ChainArrayAllocation
|
45
47
|
|
46
48
|
private
|
47
49
|
|
48
50
|
def namespaces=(other)
|
49
|
-
@namespaces
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
51
|
+
@namespaces = begin
|
52
|
+
keys = if other.respond_to?(:keys)
|
53
|
+
other.keys.map(&:to_s)
|
54
|
+
else
|
55
|
+
other
|
56
|
+
end
|
57
|
+
|
58
|
+
keys + %w{signature}
|
59
|
+
end
|
58
60
|
end
|
59
61
|
|
60
62
|
def key_from_file_contents(filename)
|
@@ -71,6 +73,16 @@ class Base
|
|
71
73
|
to_s.
|
72
74
|
match(self.class::NAMESPACE_PATTERN) { |m| m[1].upcase }
|
73
75
|
end
|
76
|
+
|
77
|
+
def generate_key_filenames
|
78
|
+
namespaces.map do |namespace|
|
79
|
+
rootpath + ".chamber.#{namespace.to_s.tr('.-', '')}#{key_filename_extension}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def default_key_file_path
|
84
|
+
Pathname.new(rootpath + ".chamber#{key_filename_extension}")
|
85
|
+
end
|
74
86
|
end
|
75
87
|
end
|
76
88
|
end
|
@@ -13,7 +13,7 @@ class Decryption < Chamber::Keys::Base
|
|
13
13
|
(\w+) # Namespace
|
14
14
|
\.pem # Extension
|
15
15
|
\z # End of Filename
|
16
|
-
/x
|
16
|
+
/x.freeze
|
17
17
|
|
18
18
|
private
|
19
19
|
|
@@ -27,14 +27,8 @@ class Decryption < Chamber::Keys::Base
|
|
27
27
|
join('_')
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
31
|
-
|
32
|
-
rootpath + ".chamber.#{namespace}.pem"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def default_key_file_path
|
37
|
-
Pathname.new(rootpath + '.chamber.pem')
|
30
|
+
def key_filename_extension
|
31
|
+
'.pem'
|
38
32
|
end
|
39
33
|
end
|
40
34
|
end
|
@@ -13,7 +13,7 @@ class Encryption < Chamber::Keys::Base
|
|
13
13
|
(\w+) # Namespace
|
14
14
|
\.pub\.pem # Extension
|
15
15
|
\z # End of Filename
|
16
|
-
/x
|
16
|
+
/x.freeze
|
17
17
|
|
18
18
|
private
|
19
19
|
|
@@ -27,14 +27,8 @@ class Encryption < Chamber::Keys::Base
|
|
27
27
|
join('_')
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
31
|
-
|
32
|
-
rootpath + ".chamber.#{namespace}.pub.pem"
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def default_key_file_path
|
37
|
-
Pathname.new(rootpath + '.chamber.pub.pem')
|
30
|
+
def key_filename_extension
|
31
|
+
'.pub.pem'
|
38
32
|
end
|
39
33
|
end
|
40
34
|
end
|
data/lib/chamber/settings.rb
CHANGED
@@ -221,25 +221,25 @@ class Settings
|
|
221
221
|
|
222
222
|
def securable
|
223
223
|
Settings.new(metadata.merge(
|
224
|
-
|
225
|
-
|
226
|
-
|
224
|
+
settings: raw_data,
|
225
|
+
pre_filters: [Filters::SecureFilter],
|
226
|
+
))
|
227
227
|
end
|
228
228
|
|
229
229
|
def secure
|
230
230
|
Settings.new(metadata.merge(
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
231
|
+
settings: raw_data,
|
232
|
+
pre_filters: [Filters::EncryptionFilter],
|
233
|
+
post_filters: [Filters::TranslateSecureKeysFilter],
|
234
|
+
))
|
235
235
|
end
|
236
236
|
|
237
237
|
def insecure
|
238
238
|
Settings.new(metadata.merge(
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
239
|
+
settings: raw_data,
|
240
|
+
pre_filters: [Filters::InsecureFilter],
|
241
|
+
post_filters: [Filters::TranslateSecureKeysFilter],
|
242
|
+
))
|
243
243
|
end
|
244
244
|
|
245
245
|
def method_missing(name, *args)
|
@@ -262,12 +262,14 @@ class Settings
|
|
262
262
|
@namespaces = NamespaceSet.new(raw_namespaces)
|
263
263
|
end
|
264
264
|
|
265
|
+
# rubocop:disable Naming/MemoizedInstanceVariableName
|
265
266
|
def raw_data
|
266
267
|
@filtered_raw_data ||= pre_filters.inject(@raw_data) do |filtered_data, filter|
|
267
268
|
filter.execute({ data: filtered_data }.
|
268
269
|
merge(metadata))
|
269
270
|
end
|
270
271
|
end
|
272
|
+
# rubocop:enable Naming/MemoizedInstanceVariableName
|
271
273
|
|
272
274
|
def data
|
273
275
|
@data ||= post_filters.inject(raw_data) do |filtered_data, filter|
|
data/lib/chamber/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chamber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.12.
|
4
|
+
version: 2.12.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thekompanee
|
@@ -13,49 +13,53 @@ bindir: bin
|
|
13
13
|
cert_chain:
|
14
14
|
- |
|
15
15
|
-----BEGIN CERTIFICATE-----
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
16
|
+
MIIEdjCCAt6gAwIBAgIBATANBgkqhkiG9w0BAQsFADAyMTAwLgYDVQQDDCdhY2Nv
|
17
|
+
dW50c19ydWJ5Z2Vtcy9EQz10aGVrb21wYW5lZS9EQz1jb20wHhcNMTgwODAzMjEz
|
18
|
+
NjUzWhcNMTkwODAzMjEzNjUzWjAyMTAwLgYDVQQDDCdhY2NvdW50c19ydWJ5Z2Vt
|
19
|
+
cy9EQz10aGVrb21wYW5lZS9EQz1jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw
|
20
|
+
ggGKAoIBgQDR6ma5Z4B2Qz+ykVUKn2CoWwoJ3vStZLDNc6nIOUTUDFS5rg43XwwB
|
21
|
+
nnHCLhHZ9QeNflBpJObMwIUwDqxfZoxhmEILzUfv/yuoBj90zmnf7K2mmsPuT44a
|
22
|
+
aTyZjYGid+yyTbzIpR4CCBHyvGNVm9ss64C2XXPNXrlLO3eAxgB9zNYkxOeJatZp
|
23
|
+
d1h5FZIkAqgw7rx65W+e4HUSNnUvzUmZKoO0u/yMlnc4NcK05RdgHZ5FcXgSAZG/
|
24
|
+
MRzJ0rIdEk7wT8fBJ6w9oeFca8qW7C9M/ONJ4WiS+HoquCRcR+FiNAS3LQtQbiaR
|
25
|
+
ADVS0CBzc2/6zBxWf/+C6wv8vEkoIDSgJ4T07IV2oEJH2ox1z0PYLcNQ9KIrz9iW
|
26
|
+
+Q2DPjjO2+ymR3QOBpOrDr4keYS25tfUiSkBXemHj94Bm95/Szi8At8ywCtBVWUx
|
27
|
+
AumxK9WPjr7WFDk5o71NX4SZft99Ey5XBeZ1+I2v4+ozio/cqOFz9UTarQryCf0e
|
28
|
+
2uJLFPBPkzcCAwEAAaOBljCBkzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNV
|
29
|
+
HQ4EFgQUUTthhLkcr6+8JU1/B/dxKYaYnKUwLAYDVR0RBCUwI4EhYWNjb3VudHMr
|
30
|
+
cnVieWdlbXNAdGhla29tcGFuZWUuY29tMCwGA1UdEgQlMCOBIWFjY291bnRzK3J1
|
31
|
+
YnlnZW1zQHRoZWtvbXBhbmVlLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAED2U/MD3
|
32
|
+
PHRHyeh9Ge3JTKJ/bjZLYquJWQr+ei4rsNk8oO2O6CcoiC84oNEnpnENHX9KiZu8
|
33
|
+
h7ylKO7u6vKJl9p9IV2YR0uOnXbSApYr5olDDlEz7HNGL3xUCJJhJBf09C4AkaAn
|
34
|
+
kfaOv9Nkko0izYPpKsGlyKvbWBIzT3urBMRNbv95DzhBdNI6RF0q13eCePPqXPGe
|
35
|
+
RaikE1dUWcVsW29XzO/RINmuMcKU6k0caC7X4kTD657Nf74oGUXHxYPmfUmYmppg
|
36
|
+
uAF3jK5824uMvxofLysxqXhrUlTuCVndaexDm3bYK+YrTnZJEu6CimpMYa2u6JEE
|
37
|
+
sWLZKmDLUxEUs/5jVGuypZbSBJBDb6VnmCkoEr3Fmh4O/FH4IZ+Gd3QdYCohLoKd
|
38
|
+
09JNgxpgZHCDuKwoycU+wXdWVSzMtchMQygnEu6th1SY5qHj4ISipBEBtKG0MdgB
|
39
|
+
L3AbMAHTztj5YI+gvmpuV1B4Zv1QZjZWOeNSnLZdrnOQbyyDBzJyXmNV
|
36
40
|
-----END CERTIFICATE-----
|
37
|
-
date:
|
41
|
+
date: 2019-05-29 00:00:00.000000000 Z
|
38
42
|
dependencies:
|
39
43
|
- !ruby/object:Gem::Dependency
|
40
44
|
name: thor
|
41
45
|
requirement: !ruby/object:Gem::Requirement
|
42
46
|
requirements:
|
43
|
-
- - "<"
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '0.21'
|
46
47
|
- - ">="
|
47
48
|
- !ruby/object:Gem::Version
|
48
49
|
version: 0.19.1
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0.21'
|
49
53
|
type: :runtime
|
50
54
|
prerelease: false
|
51
55
|
version_requirements: !ruby/object:Gem::Requirement
|
52
56
|
requirements:
|
53
|
-
- - "<"
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: '0.21'
|
56
57
|
- - ">="
|
57
58
|
- !ruby/object:Gem::Version
|
58
59
|
version: 0.19.1
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0.21'
|
59
63
|
- !ruby/object:Gem::Dependency
|
60
64
|
name: hashie
|
61
65
|
requirement: !ruby/object:Gem::Requirement
|
@@ -227,8 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
227
231
|
- !ruby/object:Gem::Version
|
228
232
|
version: '0'
|
229
233
|
requirements: []
|
230
|
-
|
231
|
-
rubygems_version: 2.6.14
|
234
|
+
rubygems_version: 3.0.3
|
232
235
|
signing_key:
|
233
236
|
specification_version: 4
|
234
237
|
summary: A surprisingly configurable convention-based approach to managing your application's
|
metadata.gz.sig
CHANGED
Binary file
|