varanus 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +45 -43
- data/lib/varanus.rb +23 -0
- data/lib/varanus/dcv.rb +62 -0
- data/lib/varanus/rest_resource.rb +56 -0
- data/lib/varanus/ssl.rb +5 -49
- data/lib/varanus/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72820b52f9184bfc3c35816e39b1c721d0e4eabf6c660b6c4da95d5cdb1bf025
|
4
|
+
data.tar.gz: 3cc5f9ac737e5c375027db08860443b6ece64dac58ad7cf7e515a9f6009e825a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 614b412e36992ee4a7c99f06a26e7e5f3768960200e2d962e8ffd9d0aaf64502dc81643be9c038b151ca44de0dea84a952f8a58b1d67b1379f1cf0806a3fdbd5
|
7
|
+
data.tar.gz: 484a02bacc17c1b26ad7749d10142bf48570a6260b5557267318d25bb3d051ac3a19030f7522ef9684274424d4a7f25d2e863faedf6d64c75932eb1a9fd63af8
|
data/.travis.yml
CHANGED
@@ -6,10 +6,9 @@ sudo: false
|
|
6
6
|
language: ruby
|
7
7
|
cache: bundler
|
8
8
|
rvm:
|
9
|
-
- 2.3
|
10
|
-
- 2.4
|
11
9
|
- 2.5
|
12
10
|
- 2.6
|
11
|
+
- 2.7
|
13
12
|
before_install: gem install bundler -v 1.16.5
|
14
13
|
before_script:
|
15
14
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
varanus (0.
|
4
|
+
varanus (0.4.0)
|
5
5
|
faraday
|
6
6
|
faraday_middleware
|
7
7
|
savon (~> 2.0)
|
@@ -9,61 +9,61 @@ PATH
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
addressable (2.
|
13
|
-
public_suffix (>= 2.0.2, <
|
12
|
+
addressable (2.7.0)
|
13
|
+
public_suffix (>= 2.0.2, < 5.0)
|
14
14
|
akami (1.3.1)
|
15
15
|
gyoku (>= 0.4.0)
|
16
16
|
nokogiri
|
17
17
|
ast (2.4.1)
|
18
|
-
builder (3.2.
|
19
|
-
crack (0.4.
|
20
|
-
|
21
|
-
docile (1.3.
|
22
|
-
faraday (
|
18
|
+
builder (3.2.4)
|
19
|
+
crack (0.4.5)
|
20
|
+
rexml
|
21
|
+
docile (1.3.4)
|
22
|
+
faraday (1.3.0)
|
23
|
+
faraday-net_http (~> 1.0)
|
23
24
|
multipart-post (>= 1.2, < 3)
|
24
|
-
|
25
|
-
|
25
|
+
ruby2_keywords
|
26
|
+
faraday-net_http (1.0.0)
|
27
|
+
faraday_middleware (1.0.0)
|
28
|
+
faraday (~> 1.0)
|
26
29
|
gyoku (1.3.1)
|
27
30
|
builder (>= 2.1.2)
|
28
|
-
hashdiff (0.
|
29
|
-
httpi (2.4.
|
31
|
+
hashdiff (1.0.1)
|
32
|
+
httpi (2.4.5)
|
30
33
|
rack
|
31
34
|
socksify
|
32
|
-
|
33
|
-
metaclass (0.0.4)
|
34
|
-
mini_portile2 (2.3.0)
|
35
|
-
minitest (5.11.3)
|
35
|
+
minitest (5.14.3)
|
36
36
|
minitest-rg (5.2.0)
|
37
37
|
minitest (~> 5.0)
|
38
|
-
mocha (1.
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
mini_portile2 (~> 2.3.0)
|
38
|
+
mocha (1.12.0)
|
39
|
+
multipart-post (2.1.1)
|
40
|
+
nokogiri (1.11.1-x86_64-linux)
|
41
|
+
racc (~> 1.4)
|
43
42
|
nori (2.6.0)
|
44
|
-
parallel (1.
|
45
|
-
parser (
|
43
|
+
parallel (1.20.1)
|
44
|
+
parser (3.0.0.0)
|
46
45
|
ast (~> 2.4.1)
|
47
|
-
public_suffix (
|
48
|
-
|
46
|
+
public_suffix (4.0.6)
|
47
|
+
racc (1.5.2)
|
48
|
+
rack (2.2.3)
|
49
49
|
rainbow (3.0.0)
|
50
50
|
rake (10.5.0)
|
51
|
-
regexp_parser (
|
51
|
+
regexp_parser (2.0.3)
|
52
52
|
rexml (3.2.4)
|
53
|
-
rubocop (
|
53
|
+
rubocop (1.7.0)
|
54
54
|
parallel (~> 1.10)
|
55
|
-
parser (>= 2.7.1.
|
55
|
+
parser (>= 2.7.1.5)
|
56
56
|
rainbow (>= 2.2.2, < 4.0)
|
57
|
-
regexp_parser (>= 1.
|
57
|
+
regexp_parser (>= 1.8, < 3.0)
|
58
58
|
rexml
|
59
|
-
rubocop-ast (>=
|
59
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
60
60
|
ruby-progressbar (~> 1.7)
|
61
61
|
unicode-display_width (>= 1.4.0, < 2.0)
|
62
|
-
rubocop-ast (
|
63
|
-
parser (>= 2.7.1.
|
64
|
-
ruby-progressbar (1.
|
65
|
-
|
66
|
-
savon (2.12.
|
62
|
+
rubocop-ast (1.4.0)
|
63
|
+
parser (>= 2.7.1.5)
|
64
|
+
ruby-progressbar (1.11.0)
|
65
|
+
ruby2_keywords (0.0.2)
|
66
|
+
savon (2.12.1)
|
67
67
|
akami (~> 1.2)
|
68
68
|
builder (>= 2.1.2)
|
69
69
|
gyoku (~> 1.2)
|
@@ -71,21 +71,23 @@ GEM
|
|
71
71
|
nokogiri (>= 1.8.1)
|
72
72
|
nori (~> 2.4)
|
73
73
|
wasabi (~> 3.4)
|
74
|
-
simplecov (0.
|
74
|
+
simplecov (0.21.1)
|
75
75
|
docile (~> 1.1)
|
76
|
-
|
77
|
-
|
78
|
-
simplecov-html (0.
|
76
|
+
simplecov-html (~> 0.11)
|
77
|
+
simplecov_json_formatter (~> 0.1)
|
78
|
+
simplecov-html (0.12.3)
|
79
|
+
simplecov_json_formatter (0.1.2)
|
79
80
|
socksify (1.7.1)
|
80
81
|
unicode-display_width (1.7.0)
|
81
|
-
wasabi (3.
|
82
|
+
wasabi (3.6.1)
|
83
|
+
addressable
|
82
84
|
httpi (~> 2.0)
|
83
85
|
nokogiri (>= 1.4.2)
|
84
|
-
webmock (3.
|
86
|
+
webmock (3.11.0)
|
85
87
|
addressable (>= 2.3.6)
|
86
88
|
crack (>= 0.3.2)
|
87
|
-
hashdiff
|
88
|
-
yard (0.9.
|
89
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
90
|
+
yard (0.9.26)
|
89
91
|
|
90
92
|
PLATFORMS
|
91
93
|
ruby
|
data/lib/varanus.rb
CHANGED
@@ -14,6 +14,27 @@ class Varanus
|
|
14
14
|
@password = password
|
15
15
|
end
|
16
16
|
|
17
|
+
# :nodoc:
|
18
|
+
def connection
|
19
|
+
@connection ||= Faraday.new(url: 'https://cert-manager.com/api',
|
20
|
+
request: { timeout: 300 }) do |conn|
|
21
|
+
conn.request :json
|
22
|
+
conn.response :json, content_type: /\bjson$/
|
23
|
+
|
24
|
+
conn.headers['login'] = @username
|
25
|
+
conn.headers['password'] = @password
|
26
|
+
conn.headers['customerUri'] = @customer_uri
|
27
|
+
|
28
|
+
conn.adapter Faraday.default_adapter
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Retrive DCV instance
|
33
|
+
# @return [Varanus::DCV]
|
34
|
+
def dcv
|
35
|
+
@dcv ||= DCV.new(self)
|
36
|
+
end
|
37
|
+
|
17
38
|
# Retrieve Reports instance
|
18
39
|
# @return [Varanus::Reports]
|
19
40
|
def reports
|
@@ -35,6 +56,8 @@ require 'savon'
|
|
35
56
|
|
36
57
|
# Require other files in this gem
|
37
58
|
require 'varanus/error'
|
59
|
+
require 'varanus/rest_resource'
|
60
|
+
require 'varanus/dcv'
|
38
61
|
require 'varanus/reports'
|
39
62
|
require 'varanus/ssl'
|
40
63
|
require 'varanus/ssl/csr'
|
data/lib/varanus/dcv.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# An connection to the DCV API. This should not be initialized directly. Instead,
|
4
|
+
# use Varanus#dcv
|
5
|
+
class Varanus::DCV < Varanus::RestResource
|
6
|
+
# Returns an Array of DCV information about searched for domains.
|
7
|
+
# This method will automatically page through all results
|
8
|
+
# @param opts [Hash] - all opts are optional
|
9
|
+
# @option opts [String] :domain Domain to search for
|
10
|
+
# @option opts [Integer] :org ID of organization
|
11
|
+
# @option opts [Integer] :department ID of department
|
12
|
+
# @option opts [String] :dcvStatus
|
13
|
+
# @option opts [String] :orderStatus
|
14
|
+
# @option opts [Integer] :expiresIn Expires in (days)
|
15
|
+
#
|
16
|
+
# Results will included an extra 'expiration_date_obj' if 'expirationDate' is in the
|
17
|
+
# response
|
18
|
+
def search opts = {}
|
19
|
+
get_with_size_and_position('dcv/v2/validation', opts).map(&method(:_format_status))
|
20
|
+
end
|
21
|
+
|
22
|
+
# Start domain validation process. This must be called before #submit is called
|
23
|
+
# @option domain [String] domain to validate
|
24
|
+
# @option type [String] Type of validation. Must be one of 'http', 'https', 'cname',
|
25
|
+
# or 'email'
|
26
|
+
def start domain, type
|
27
|
+
post("dcv/v1/validation/start/domain/#{type}", domain: domain)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Retrieve DCV status for a single domain
|
31
|
+
# Result will included an extra 'expiration_date_obj' if 'expirationDate' is in the
|
32
|
+
# response
|
33
|
+
def status domain
|
34
|
+
_format_status(post('dcv/v2/validation/status', domain: domain))
|
35
|
+
end
|
36
|
+
|
37
|
+
# Submit domain validation for verficiation. This must be called after #start
|
38
|
+
# @option domain [String] domain to validate
|
39
|
+
# @option type [String] Type of validation. Must be one of 'http', 'https', 'cname',
|
40
|
+
# or 'email'
|
41
|
+
# @option email_address [String] This is required of +type+ is 'email'. Otherwise, it is
|
42
|
+
# ignored.
|
43
|
+
def submit domain, type, email_address = nil
|
44
|
+
if type.to_s == 'email'
|
45
|
+
raise ArgumentError, 'email_address must be specified' if email_address.nil?
|
46
|
+
|
47
|
+
post('dcv/v1/validation/submit/domain/email', domain: domain,
|
48
|
+
email: email_address)
|
49
|
+
else
|
50
|
+
post("dcv/v1/validation/submit/domain/#{type}", domain: domain)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def _format_status status
|
57
|
+
return status unless status['expirationDate']
|
58
|
+
|
59
|
+
status.merge('expiration_date_obj' =>
|
60
|
+
Date.strptime(status['expirationDate'], '%Y-%m-%d'))
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# An abstract class for rest resources
|
4
|
+
# Rest resources should not be initialized directly. They should be created by methods
|
5
|
+
# on Varanus
|
6
|
+
class Varanus::RestResource
|
7
|
+
# :nodoc:
|
8
|
+
def initialize varanus
|
9
|
+
@varanus = varanus
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def check_result result
|
15
|
+
body = result.body
|
16
|
+
return unless body.is_a?(Hash)
|
17
|
+
return if body['code'].nil?
|
18
|
+
|
19
|
+
klass = Varanus::Error
|
20
|
+
if body['code'] == 0 && body['description'] =~ /process/
|
21
|
+
klass = Varanus::Error::StillProcessing
|
22
|
+
end
|
23
|
+
|
24
|
+
raise klass.new(body['code'], body['description'])
|
25
|
+
end
|
26
|
+
|
27
|
+
def get path, *args
|
28
|
+
result = @varanus.connection.get(path, *args)
|
29
|
+
check_result result
|
30
|
+
result.body
|
31
|
+
end
|
32
|
+
|
33
|
+
# Performs multiple GETs with varying positions to ensure all results are returned.
|
34
|
+
def get_with_size_and_position path, opts = {}
|
35
|
+
size = opts[:size] || 200
|
36
|
+
position = opts[:position] || 0
|
37
|
+
|
38
|
+
results = []
|
39
|
+
loop do
|
40
|
+
params = { size: size, position: position }.merge(opts)
|
41
|
+
new_results = get(path, params)
|
42
|
+
results += new_results
|
43
|
+
break if new_results.length < size
|
44
|
+
|
45
|
+
position += size
|
46
|
+
end
|
47
|
+
|
48
|
+
results
|
49
|
+
end
|
50
|
+
|
51
|
+
def post path, *args
|
52
|
+
result = @varanus.connection.post(path, *args)
|
53
|
+
check_result result
|
54
|
+
result.body
|
55
|
+
end
|
56
|
+
end
|
data/lib/varanus/ssl.rb
CHANGED
@@ -2,12 +2,7 @@
|
|
2
2
|
|
3
3
|
# An connection to the SSL/TSL API. This should not be initialized directly. Instead,
|
4
4
|
# use Varanus#ssl
|
5
|
-
class Varanus::SSL
|
6
|
-
# @note Do not call this directly. Use {Varanus#ssl} to initialize
|
7
|
-
def initialize varanus
|
8
|
-
@varanus = varanus
|
9
|
-
end
|
10
|
-
|
5
|
+
class Varanus::SSL < Varanus::RestResource
|
11
6
|
# Returns the option from #certificate_types that best matches the csr.
|
12
7
|
# @param csr [Varanus::SSL::CSR]
|
13
8
|
# @return [Hash] The option from {#certificate_types} that best matches the csr
|
@@ -27,7 +22,7 @@ class Varanus::SSL
|
|
27
22
|
# Certificate types that can be used to sign a cert
|
28
23
|
# @return [Array<Hash>]
|
29
24
|
def certificate_types
|
30
|
-
@certificate_types ||= get('types')
|
25
|
+
@certificate_types ||= get('ssl/v1/types')
|
31
26
|
end
|
32
27
|
|
33
28
|
# Return Array of certificate types based on standard sorting.
|
@@ -57,7 +52,7 @@ class Varanus::SSL
|
|
57
52
|
# @raise [Varanus::Error::StillProcessing] Cert is still being signed
|
58
53
|
# @return [String] Certificate
|
59
54
|
def collect id, type = 'x509'
|
60
|
-
get("collect/#{id}/#{type}")
|
55
|
+
get("ssl/v1/collect/#{id}/#{type}")
|
61
56
|
end
|
62
57
|
|
63
58
|
# Revoke an ssl cert
|
@@ -65,7 +60,7 @@ class Varanus::SSL
|
|
65
60
|
# @param reason [String] Reason for revoking. Sectigo's API will return an error if it
|
66
61
|
# is blank.
|
67
62
|
def revoke id, reason
|
68
|
-
post("revoke/#{id}", reason: reason)
|
63
|
+
post("ssl/v1/revoke/#{id}", reason: reason)
|
69
64
|
nil
|
70
65
|
end
|
71
66
|
|
@@ -97,7 +92,7 @@ class Varanus::SSL
|
|
97
92
|
comments: opts[:comments].to_s[0, 1024],
|
98
93
|
externalRequester: opts[:external_requester].to_s[0, 512]
|
99
94
|
}
|
100
|
-
post('enroll', args)['sslId']
|
95
|
+
post('ssl/v1/enroll', args)['sslId']
|
101
96
|
end
|
102
97
|
|
103
98
|
private
|
@@ -110,39 +105,6 @@ class Varanus::SSL
|
|
110
105
|
nil
|
111
106
|
end
|
112
107
|
|
113
|
-
def check_result result
|
114
|
-
body = result.body
|
115
|
-
return unless body.is_a?(Hash)
|
116
|
-
return if body['code'].nil?
|
117
|
-
|
118
|
-
klass = Varanus::Error
|
119
|
-
if body['code'] == 0 && body['description'] =~ /process/
|
120
|
-
klass = Varanus::Error::StillProcessing
|
121
|
-
end
|
122
|
-
|
123
|
-
raise klass.new(body['code'], body['description'])
|
124
|
-
end
|
125
|
-
|
126
|
-
def connection
|
127
|
-
@connection ||= Faraday.new(url: 'https://cert-manager.com/api/ssl/v1',
|
128
|
-
request: { timeout: 300 }) do |conn|
|
129
|
-
conn.request :json
|
130
|
-
conn.response :json, content_type: /\bjson$/
|
131
|
-
|
132
|
-
conn.headers['login'] = @varanus.username
|
133
|
-
conn.headers['password'] = @varanus.password
|
134
|
-
conn.headers['customerUri'] = @varanus.customer_uri
|
135
|
-
|
136
|
-
conn.adapter Faraday.default_adapter
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def get path
|
141
|
-
result = connection.get(path)
|
142
|
-
check_result result
|
143
|
-
result.body
|
144
|
-
end
|
145
|
-
|
146
108
|
def opts_to_cert_type_id opts, csr
|
147
109
|
case opts[:cert_type]
|
148
110
|
when Integer
|
@@ -154,12 +116,6 @@ class Varanus::SSL
|
|
154
116
|
end
|
155
117
|
end
|
156
118
|
|
157
|
-
def post path, *args
|
158
|
-
result = connection.post(path, *args)
|
159
|
-
check_result result
|
160
|
-
result.body
|
161
|
-
end
|
162
|
-
|
163
119
|
def opts_to_term opts, cert_type_id
|
164
120
|
term = opts[:days]
|
165
121
|
term ||= certificate_types.find { |ct| ct['id'] == cert_type_id }['terms'].min
|
data/lib/varanus/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: varanus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Dilda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -204,8 +204,10 @@ files:
|
|
204
204
|
- bin/setup
|
205
205
|
- docker-compose.yml
|
206
206
|
- lib/varanus.rb
|
207
|
+
- lib/varanus/dcv.rb
|
207
208
|
- lib/varanus/error.rb
|
208
209
|
- lib/varanus/reports.rb
|
210
|
+
- lib/varanus/rest_resource.rb
|
209
211
|
- lib/varanus/ssl.rb
|
210
212
|
- lib/varanus/ssl/csr.rb
|
211
213
|
- lib/varanus/version.rb
|