chamber 2.12.3 → 2.12.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|