razorrisk-cassini-utilities-secretserver 0.7.9
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 +7 -0
- data/CHANGELOG.md +22 -0
- data/LICENSE +5 -0
- data/README.md +2 -0
- data/bin/razorrisk-microservice-secretserver +295 -0
- data/lib/razor_risk/cassini/utilities/secret_server/version.rb +52 -0
- data/lib/razor_risk/cassini/utilities/secret_server.rb +2 -0
- metadata +173 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5653cd591a0033c005a364ab5d99998e81cfffbf45cf20ea5bfade2bf818ce57
|
4
|
+
data.tar.gz: e86f0aa4762c4fd0a61fb2bd06169232004d29792f75f74c5eddf00b096c4201
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 585a28a65144fd1e1332559b70d14533e7ef0d2e4d54f40124a845cdf3b150a1d4f71142f6d7d74d3a52af46ac6a9f4f95c2dd81e03e25e643412edb8b82bcf1
|
7
|
+
data.tar.gz: 2b70508b09af1c534ba72b1ff195de47dc2f4607d1cd349fee323ef0ab6e3cce5d9a1f8c591d34eca89df0cee4433889ee1d3a33a8308b112b466b8eb9f00f00
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## [0.7.1] (2018-06-20)
|
4
|
+
|
5
|
+
**Implemented enhancements:**
|
6
|
+
|
7
|
+
none
|
8
|
+
|
9
|
+
**Fixed defects:**
|
10
|
+
|
11
|
+
none
|
12
|
+
|
13
|
+
**Dependencies and packaging:**
|
14
|
+
|
15
|
+
- separated into own project/repo/package [WEBAPI-138]
|
16
|
+
|
17
|
+
**Merged pull requests:**
|
18
|
+
|
19
|
+
none
|
20
|
+
|
21
|
+
## END OF CHANGE LOG
|
22
|
+
|
data/LICENSE
ADDED
data/README.md
ADDED
@@ -0,0 +1,295 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# ######################################################################## #
|
5
|
+
# File: tools/servers/secret-server/ws.rb
|
6
|
+
#
|
7
|
+
# Purpose: Main module/entry file for the Secret Server
|
8
|
+
#
|
9
|
+
# Author: Matthew Wilson
|
10
|
+
#
|
11
|
+
# Copyright (c) 2017-2018, Razor Risk Technologies Pty Ltd
|
12
|
+
# All rights reserved.
|
13
|
+
#
|
14
|
+
# ######################################################################## #
|
15
|
+
|
16
|
+
|
17
|
+
# ##########################################################################
|
18
|
+
|
19
|
+
# Utility: Secret Server (secret-server)
|
20
|
+
#
|
21
|
+
# Supported:
|
22
|
+
#
|
23
|
+
# - [GET] / {Unsecured}
|
24
|
+
|
25
|
+
# ##########################################################################
|
26
|
+
# requires
|
27
|
+
|
28
|
+
require 'razor_risk/cassini/diagnostics/zeroth_include'
|
29
|
+
|
30
|
+
require 'razor_risk/cassini/utilities/secret_server'
|
31
|
+
|
32
|
+
require 'razor_risk/cassini/applications/unsecured_microservice'
|
33
|
+
require 'razor_risk/cassini/cli'
|
34
|
+
require 'razor_risk/cassini/diagnostics/util_functions'
|
35
|
+
require 'razor_risk/cassini/extensions/libclimate'
|
36
|
+
require 'razor_risk/cassini/util/version_util'
|
37
|
+
|
38
|
+
require 'razor_risk/extensions/hash/dig'
|
39
|
+
|
40
|
+
require 'razor_risk/core/diagnostics/extensions/libclimate'
|
41
|
+
require 'razor_risk/core/diagnostics/logger'
|
42
|
+
|
43
|
+
require 'libclimate'
|
44
|
+
require 'pantheios'
|
45
|
+
require 'xqsr3/extensions/hash/deep_transform'
|
46
|
+
|
47
|
+
require 'xqsr3/extensions/kernel/integer'
|
48
|
+
|
49
|
+
require 'csv'
|
50
|
+
require 'json'
|
51
|
+
require 'logger'
|
52
|
+
require 'yaml'
|
53
|
+
|
54
|
+
# ##########################################################################
|
55
|
+
# includes
|
56
|
+
|
57
|
+
include ::RazorRisk::Cassini::Applications
|
58
|
+
include ::RazorRisk::Cassini::Util::VersionUtil
|
59
|
+
|
60
|
+
include ::RazorRisk::Cassini::Diagnostics
|
61
|
+
include ::RazorRisk::Core::Diagnostics::Logger
|
62
|
+
|
63
|
+
include ::Pantheios
|
64
|
+
|
65
|
+
# ##########################################################################
|
66
|
+
# constants
|
67
|
+
|
68
|
+
SERVER_ID = 'secret-server'
|
69
|
+
|
70
|
+
DEFAULT_ALGORITHM = 'sha256'
|
71
|
+
|
72
|
+
ACCEPT_TYPES = %w{ application/json application/xml text/csv text/plain text/tsv text/tab-separated-values text/xml }
|
73
|
+
|
74
|
+
PROGRAM_VERSION = ::RazorRisk::Cassini::Utilities::SecretServer::VERSION
|
75
|
+
|
76
|
+
module Constants
|
77
|
+
|
78
|
+
module Defaults
|
79
|
+
|
80
|
+
LOGGING_THRESHOLD = [ :informational, :debug ]
|
81
|
+
end # module Defaults
|
82
|
+
end # module Constants
|
83
|
+
|
84
|
+
# ##########################################################################
|
85
|
+
# compatibility checks
|
86
|
+
|
87
|
+
check_version_compatibility ::LibCLImate, '0.10'
|
88
|
+
check_version_compatibility ::Pantheios, '0.20'
|
89
|
+
|
90
|
+
# ##########################################################################
|
91
|
+
# static set-up
|
92
|
+
|
93
|
+
# ##########################################################################
|
94
|
+
# application
|
95
|
+
|
96
|
+
module SecretServer
|
97
|
+
|
98
|
+
include ::Pantheios
|
99
|
+
include ::RazorRisk::Core::Diagnostics::Logger
|
100
|
+
|
101
|
+
def included receiver
|
102
|
+
|
103
|
+
receiver.extend self
|
104
|
+
end
|
105
|
+
|
106
|
+
def make_CSV algorithm, secret
|
107
|
+
|
108
|
+
trace ParamNames[ :algorithm, :secret ], algorithm, secret
|
109
|
+
|
110
|
+
CSV.generate do |csv|
|
111
|
+
|
112
|
+
csv << [ algorithm, secret ]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def make_JSON algorithm, secret
|
117
|
+
|
118
|
+
trace ParamNames[ :algorithm, :secret ], algorithm, secret
|
119
|
+
|
120
|
+
r = { algorithm: algorithm, secret: secret }
|
121
|
+
|
122
|
+
r.to_json
|
123
|
+
end
|
124
|
+
|
125
|
+
def make_text algorithm, secret
|
126
|
+
|
127
|
+
trace ParamNames[ :algorithm, :secret ], algorithm, secret
|
128
|
+
|
129
|
+
"#{algorithm}|#{secret}"
|
130
|
+
end
|
131
|
+
|
132
|
+
def make_TSV algorithm, secret
|
133
|
+
|
134
|
+
trace ParamNames[ :algorithm, :secret ], algorithm, secret
|
135
|
+
|
136
|
+
"#{algorithm}\t#{secret}"
|
137
|
+
end
|
138
|
+
|
139
|
+
def make_XML algorithm, secret
|
140
|
+
|
141
|
+
trace ParamNames[ :algorithm, :secret ], algorithm, secret
|
142
|
+
|
143
|
+
#<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.we.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
144
|
+
<<END_OF_xml
|
145
|
+
<?xml version="1.0">
|
146
|
+
<secrets>
|
147
|
+
<secret algorithm="#{algorithm}" secret="#{secret}" />
|
148
|
+
</secrets>
|
149
|
+
END_OF_xml
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
class SecretServerApp < UnsecuredMicroservice
|
154
|
+
|
155
|
+
include SecretServer
|
156
|
+
|
157
|
+
def self.on_init_service options
|
158
|
+
|
159
|
+
raise ArgumentError, 'missing keyword: secrets' unless options.has_key? :secrets
|
160
|
+
|
161
|
+
secrets = options[:secrets]
|
162
|
+
|
163
|
+
settings.set :secrets, (secrets || {}).deep_transform { |k, v| [ k.to_s.downcase, v ] }
|
164
|
+
end
|
165
|
+
|
166
|
+
get '/' do
|
167
|
+
|
168
|
+
trace
|
169
|
+
|
170
|
+
category = params[:category] || 'all'
|
171
|
+
algorithm = params[:algorithm] || DEFAULT_ALGORITHM
|
172
|
+
|
173
|
+
category = category.downcase
|
174
|
+
algorithm = algorithm.downcase
|
175
|
+
|
176
|
+
log :info, 'obtaining secret for category \'', category, '\' and algorithm \'', algorithm, '\''
|
177
|
+
|
178
|
+
secret = nil
|
179
|
+
secret ||= settings.secrets.dig(category, algorithm) if 'all' != category
|
180
|
+
secret ||= settings.secrets.dig('all', algorithm)
|
181
|
+
|
182
|
+
halt *[ 404, {}, "no such algorithm '#{algorithm}' for category '#{category}'" ] unless secret
|
183
|
+
|
184
|
+
ACCEPT_TYPES.each do |accept_type|
|
185
|
+
|
186
|
+
if request.accept? accept_type
|
187
|
+
|
188
|
+
content_type accept_type
|
189
|
+
|
190
|
+
case accept_type
|
191
|
+
when 'application/json'
|
192
|
+
|
193
|
+
r = make_JSON algorithm, secret
|
194
|
+
when 'text/plain'
|
195
|
+
|
196
|
+
r = make_text algorithm, secret
|
197
|
+
when 'application/xml', 'text/xml'
|
198
|
+
|
199
|
+
r = make_XML algorithm, secret
|
200
|
+
when 'text/csv'
|
201
|
+
|
202
|
+
r = make_CSV algorithm, secret
|
203
|
+
when 'text/tsv', 'text/tab-separated-values'
|
204
|
+
|
205
|
+
r = make_TSV algorithm, secret
|
206
|
+
else
|
207
|
+
|
208
|
+
log :violation, 'unrecognised accept type \'', accept_type, '\''
|
209
|
+
|
210
|
+
halt *[ 500, {}, 'internal server failure' ]
|
211
|
+
end
|
212
|
+
|
213
|
+
return r
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
halt *[ 406, {}, "supports only the Accept types #{ACCEPT_TYPES.map { |t| %Q<'#{t}'> }.join(', ')}" ]
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
TheApp = SecretServerApp
|
222
|
+
|
223
|
+
# ##########################################################################
|
224
|
+
# command-line parsing
|
225
|
+
|
226
|
+
options = {}
|
227
|
+
|
228
|
+
climate = LibCLImate::Climate.new do |cl|
|
229
|
+
|
230
|
+
cl.option_web_server options
|
231
|
+
|
232
|
+
cl.option_host options
|
233
|
+
cl.option_port options
|
234
|
+
|
235
|
+
cl.option_log_threshold options, default_level: Constants::Defaults::LOGGING_THRESHOLD
|
236
|
+
|
237
|
+
cl.usage_values = '<secret-config-path>'
|
238
|
+
|
239
|
+
cl.info_lines = [
|
240
|
+
|
241
|
+
'Secret server',
|
242
|
+
::RazorRisk::Cassini::CLI.Copyright(2017),
|
243
|
+
:version,
|
244
|
+
]
|
245
|
+
end
|
246
|
+
|
247
|
+
log :debug0, 'parsing command line ...'
|
248
|
+
|
249
|
+
r = climate.run ARGV
|
250
|
+
|
251
|
+
::Pantheios::Core.program_name = options[:program_name] if options[:program_name]
|
252
|
+
|
253
|
+
program_name = ::Pantheios::Core.program_name
|
254
|
+
log_directory = options[:log_directory] || './logs'
|
255
|
+
log_threshold = options[:log_threshold] || :notice
|
256
|
+
|
257
|
+
setup_diagnostic_logging program_name, log_directory, log_threshold
|
258
|
+
|
259
|
+
|
260
|
+
# amass the arguments that are required
|
261
|
+
|
262
|
+
secrets_config_path = r.values[0] or climate.abort 'no secret-config-path specified'
|
263
|
+
|
264
|
+
options[:host] ||= nil
|
265
|
+
|
266
|
+
secrets_config = YAML.load_file secrets_config_path
|
267
|
+
|
268
|
+
secrets = secrets_config['secrets']
|
269
|
+
|
270
|
+
secrets.has_key?('all') or climate.abort 'secrets must contain "all" key'
|
271
|
+
|
272
|
+
# ##########################################################################
|
273
|
+
# main
|
274
|
+
|
275
|
+
log :debug0, 'options: ', options
|
276
|
+
|
277
|
+
log :informational, 'initialising application ...'
|
278
|
+
|
279
|
+
begin
|
280
|
+
|
281
|
+
TheApp.init_service **options, secrets: secrets
|
282
|
+
rescue => x
|
283
|
+
|
284
|
+
log :alert, "exception(#{x.class}): #{x.message}"
|
285
|
+
|
286
|
+
climate.abort x.message
|
287
|
+
end
|
288
|
+
|
289
|
+
log :notice, "starting secret server"
|
290
|
+
|
291
|
+
TheApp.run!
|
292
|
+
|
293
|
+
# ############################## end of file ############################# #
|
294
|
+
|
295
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# ######################################################################## #
|
4
|
+
# File: razor_risk/cassini/utilities/secret_server/version.rb
|
5
|
+
#
|
6
|
+
# Purpose: Version for RazorRisk.Cassini.Utilities.SecretServer library
|
7
|
+
#
|
8
|
+
# Created: 8th January 2019
|
9
|
+
# Updated: 11th January 2019
|
10
|
+
#
|
11
|
+
# Copyright (c) 2018, Razor Risk Technologies Pty Ltd
|
12
|
+
# All rights reserved.
|
13
|
+
#
|
14
|
+
# ######################################################################## #
|
15
|
+
|
16
|
+
|
17
|
+
=begin
|
18
|
+
=end
|
19
|
+
|
20
|
+
module RazorRisk
|
21
|
+
module Cassini
|
22
|
+
module Utilities
|
23
|
+
|
24
|
+
module SecretServer
|
25
|
+
|
26
|
+
# Current version of the RazorRisk.Cassini.CassiD library
|
27
|
+
VERSION = '0.7.9'
|
28
|
+
|
29
|
+
private
|
30
|
+
VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i } # :nodoc:
|
31
|
+
public
|
32
|
+
# Major version of the RazorRisk.Cassini.CassiD library
|
33
|
+
VERSION_MAJOR = VERSION_PARTS_[0] # :nodoc:
|
34
|
+
# Minor version of the RazorRisk.Cassini.CassiD library
|
35
|
+
VERSION_MINOR = VERSION_PARTS_[1] # :nodoc:
|
36
|
+
# Patch version of the RazorRisk.Cassini.CassiD library
|
37
|
+
VERSION_PATCH = VERSION_PARTS_[2] # :nodoc:
|
38
|
+
# Commit version of the RazorRisk.Cassini.CassiD library
|
39
|
+
VERSION_COMMIT = VERSION_PARTS_[3] || 0 # :nodoc:
|
40
|
+
|
41
|
+
|
42
|
+
# The description of the framework
|
43
|
+
DESCRIPTION = "Razor Risk's Cassini Web-framework's Secret Server utility"
|
44
|
+
|
45
|
+
end # module SecretServer
|
46
|
+
end # module Utilities
|
47
|
+
end # module Cassini
|
48
|
+
end # module RazorRisk
|
49
|
+
|
50
|
+
# ############################## end of file ############################# #
|
51
|
+
|
52
|
+
|
metadata
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: razorrisk-cassini-utilities-secretserver
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.9
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Razor Risk
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-06-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: razorrisk-cassini-common
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.21'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.21'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: razorrisk-core-diagnostics-extensions
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: clasp-ruby
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.14'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.14'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: json
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.8'
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 1.8.3
|
65
|
+
type: :runtime
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '1.8'
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.8.3
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: libclimate-ruby
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0.10'
|
82
|
+
type: :runtime
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0.10'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: pantheios-ruby
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 0.20.2
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 0.20.2
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: sinatra
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.4'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: 1.4.8
|
113
|
+
type: :runtime
|
114
|
+
prerelease: false
|
115
|
+
version_requirements: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '1.4'
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 1.4.8
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: xqsr3
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0.30'
|
130
|
+
type: :runtime
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0.30'
|
137
|
+
description: Razor Risk's Cassini Web-framework's Secret Server utility
|
138
|
+
email: operations@razor-risk.com
|
139
|
+
executables:
|
140
|
+
- razorrisk-microservice-secretserver
|
141
|
+
extensions: []
|
142
|
+
extra_rdoc_files: []
|
143
|
+
files:
|
144
|
+
- CHANGELOG.md
|
145
|
+
- LICENSE
|
146
|
+
- README.md
|
147
|
+
- bin/razorrisk-microservice-secretserver
|
148
|
+
- lib/razor_risk/cassini/utilities/secret_server.rb
|
149
|
+
- lib/razor_risk/cassini/utilities/secret_server/version.rb
|
150
|
+
homepage: https://razor-risk.com/
|
151
|
+
licenses:
|
152
|
+
- Nonstandard
|
153
|
+
metadata: {}
|
154
|
+
post_install_message:
|
155
|
+
rdoc_options: []
|
156
|
+
require_paths:
|
157
|
+
- lib
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - "~>"
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '2.0'
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
requirements: []
|
169
|
+
rubygems_version: 3.2.3
|
170
|
+
signing_key:
|
171
|
+
specification_version: 4
|
172
|
+
summary: Razor Risk Cassini Secret Server utility
|
173
|
+
test_files: []
|