sonar-client 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 46f4c95ec260a3eb4b212c2f85c4bee5893dc461
4
- data.tar.gz: 4a574ae9f388f0db79f28e80e9dc69b9c97de3eb
2
+ SHA256:
3
+ metadata.gz: ce2404af83297d350bc601dc221e8e730421b0cbcb58eececceaa4bd276c0545
4
+ data.tar.gz: 5780f69f285064bdc1c1e987190835bc1eaef7c54386402ac022e82bc83a9c9b
5
5
  SHA512:
6
- metadata.gz: 8056aa52de648957853d67ad2ebcdb8168e4ee586dc8dfe0bdab2e6ef9d638f6caac2ae142c4eceffd9c598f0e17e402179bfad8a71df5d700b94dbce477b852
7
- data.tar.gz: 66db84c021545e129f001839cb8de8e56b221175bbbb202df443d8f35e92ee5dd344c34dbb5ec034599abededc92f805a9d4cdea2b979d9c28a3a180aca684c0
6
+ metadata.gz: 50368c89bc42beb8ef0c835eb66fe61516eb0404b8dce326661f8e8ab79f1a9ae8072820903d7e8bcecd46549a8f3057fa87934f546ebeb5d458b875acde257d
7
+ data.tar.gz: 4f1ed1482aeb61cf6646b58d786a56a8f8d770aaf074ffa94b6262cef8ada673361680c545e474dad10e09ad6815b1f41e8c46d39284c6a2d0ab17014b3d0bb1
data/.travis.yml CHANGED
@@ -2,14 +2,22 @@ language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.1.5
6
- - jruby
5
+ - '2.4.5'
6
+ - '2.5.5'
7
+ - '2.6.5'
8
+ - '2.7.1'
9
+ - 'jruby-head'
7
10
  before_install:
11
+ - gem install bundler
12
+ - gem update bundler
8
13
  - "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
9
14
  - rake --version
10
15
  before_script:
11
16
  - bundle exec rake --version
12
17
  script: bundle exec rspec
18
+ notifications:
19
+ email:
20
+ - r7_labs@rapid7.com
13
21
  #
14
22
  # Environment variables should be set in Travis repository settings per
15
23
  # https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings
data/lib/sonar/cli/cli.rb CHANGED
@@ -2,11 +2,14 @@
2
2
 
3
3
  require 'thor'
4
4
  require 'sonar/cli/rcfile'
5
+ require 'sonar/search'
6
+ require 'sonar/request'
5
7
  require 'awesome_print'
8
+ require 'table_print'
6
9
 
7
10
  module Sonar
8
11
  class CLI < Thor
9
- class_option 'format', type: :string, desc: 'Flat JSON, JSON lines, or pretty printed [flat/lines/pretty]'
12
+ class_option 'format', type: :string, desc: 'Flat JSON (include empty collections), JSON lines of collection data (default), or pretty printed [flat/lines/pretty]'
10
13
 
11
14
  def initialize(*)
12
15
  @config = Sonar::RCFile.instance.load_file
@@ -24,34 +27,32 @@ module Sonar
24
27
  ap @client.usage
25
28
  end
26
29
 
27
- desc 'search [QUERY TYPE] [QUERY TERM]', 'Search anything from Sonars'
30
+ desc 'search [QUERY TYPE] [QUERY TERM]', 'Search any query type from Sonar or specify \'all\' as QUERY TYPE to search them all.'
28
31
  method_option 'record_limit', type: :numeric, aliases: '-n', desc: 'Maximum number of records to fetch'
29
- method_option 'exact', type: :boolean, aliases: '-e', desc: 'Search for the query string exactly, do not include partial string matches'
30
-
31
32
  def search(type, term)
32
- @query = {}
33
- @query[type.to_sym] = term
34
- @query[:limit] = options['record_limit']
35
- @query[:exact] = options['exact']
36
- resp = @client.search(@query)
33
+ types = [type]
37
34
 
38
- errors = 0
39
- if resp.is_a?(Sonar::Request::RequestIterator)
40
- resp.each do |data|
41
- errors += 1 if data.key?('errors') || data.key?('error')
42
- print_json(cleanup_data(data), options['format'])
35
+ if type == 'all'
36
+ if term =~ Search::IS_IP
37
+ types = @client.ip_search_type_names
38
+ else
39
+ types = @client.domain_search_type_names
43
40
  end
44
- else
45
- errors += 1 if resp.key?('errors') || resp.key?('error')
46
- print_json(cleanup_data(resp), options['format'])
47
41
  end
48
42
 
49
- raise Search::SearchError.new("Encountered #{errors} errors while searching") if errors > 0
43
+ types.each do |type|
44
+ @query = {}
45
+ @query[type.to_sym] = term
46
+ @query[:limit] = options['record_limit']
47
+ resp = @client.search(@query)
48
+ handle_search_response(resp)
49
+ end
50
50
  end
51
51
 
52
52
  desc 'types', 'List all Sonar query types'
53
53
  def types
54
- ap Search::QUERY_TYPES_MAP
54
+ tp.set :io, $stdout
55
+ tp Search::QUERY_TYPES, :name, { description: { width: 100 } }, :input
55
56
  end
56
57
 
57
58
  desc 'config', 'Sonar config file location'
@@ -79,6 +80,21 @@ module Sonar
79
80
  end
80
81
  end
81
82
 
83
+ def handle_search_response(resp)
84
+ errors = 0
85
+ if resp.is_a?(Sonar::Request::RequestIterator)
86
+ resp.each do |data|
87
+ errors += 1 if data.key?('errors') || data.key?('error')
88
+ print_json(cleanup_data(data), options['format'])
89
+ end
90
+ else
91
+ errors += 1 if resp.key?('errors') || resp.key?('error')
92
+ print_json(cleanup_data(resp), options['format'])
93
+ end
94
+
95
+ raise Search::SearchError.new("Encountered #{errors} errors while searching") if errors > 0
96
+ end
97
+
82
98
  # Clean up whitespace and parse JSON values in responses
83
99
  def cleanup_data(data)
84
100
  return data unless data.is_a?(Hash) && data.has_key?('collection')
data/lib/sonar/client.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  # encoding: utf-8
2
2
  require 'faraday'
3
- require 'faraday_middleware'
3
+ require 'faraday/follow_redirects'
4
+ require 'faraday/rashify'
4
5
  require 'forwardable'
5
6
  require 'sonar/request'
6
- require 'sonar/certificate'
7
7
  require 'sonar/search'
8
8
  require 'sonar/user'
9
9
  require 'sonar/cli/cli'
@@ -14,7 +14,6 @@ module Sonar
14
14
  extend Forwardable
15
15
 
16
16
  include Request
17
- include Certificate
18
17
  include Search
19
18
  include User
20
19
  include Registration
@@ -39,9 +38,11 @@ module Sonar
39
38
  def connection
40
39
  params = {}
41
40
  @conn = Faraday.new(url: api_url, params: params, headers: default_headers, ssl: { verify: true }) do |faraday|
42
- faraday.use FaradayMiddleware::Mashify
43
- faraday.use FaradayMiddleware::ParseJson, content_type: /\bjson$/
44
- faraday.use FaradayMiddleware::FollowRedirects
41
+ faraday.use Faraday::FollowRedirects::Middleware
42
+ faraday.use Faraday::Rashify::Middleware
43
+ faraday.request :json
44
+
45
+ faraday.response :json
45
46
  faraday.adapter Faraday.default_adapter
46
47
  end
47
48
  @conn.headers['X-Sonar-Token'] = access_token
data/lib/sonar/search.rb CHANGED
@@ -2,21 +2,16 @@
2
2
 
3
3
  module Sonar
4
4
  module Search
5
+
6
+ # Allow IP queries to be in the form of "1.", "1.2.", "1.2.3.", and "1.2.3.4"
7
+ IS_IP = /^(\d{1,3}\.|\d{1,3}\.\d{1,3}\.|\d{1,3}\.\d{1,3}\.\d{1,3}\.|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/
8
+
5
9
  # Implemented search query types
6
- QUERY_TYPES_MAP = {
7
- 'certificate' => 'Certificate lookup',
8
- 'certips' => 'Certificate to IPs',
9
- 'rdns' => 'IP to Reverse DNS Lookup or DNS Lookup to IP',
10
- 'fdns' => 'Domains to IP or IPs to Domain',
11
- 'ipcerts' => 'IP to Certificates',
12
- 'namecerts' => 'Domain to Certificates',
13
- 'links_to' => 'HTTP References to Domain',
14
- 'ports' => 'Open Ports',
15
- 'processed' => 'Open Ports (Processed)',
16
- 'raw' => 'Open Ports (Raw)',
17
- 'sslcert' => 'Certificate Details',
18
- 'whois_ip' => 'Whois (IP)'
19
- }
10
+ QUERY_TYPES = [
11
+ { name: 'fdns', description: 'Domains to IP or IPs to Domain', input: 'domain' },
12
+ { name: 'ports', description: 'Open Ports', input: 'ip' },
13
+ { name: 'all', description: 'Search all appropriate search types for an IP or domain', input: 'all' }
14
+ ]
20
15
 
21
16
  ##
22
17
  # Generic exception for errors encountered while searching
@@ -24,6 +19,26 @@ module Sonar
24
19
  class SearchError < StandardError
25
20
  end
26
21
 
22
+ def ip_search_type_names
23
+ ip_search_types.map { |type| type[:name] }
24
+ end
25
+
26
+ def domain_search_type_names
27
+ domain_search_types.map { |type| type[:name] }
28
+ end
29
+
30
+ def ip_search_types
31
+ QUERY_TYPES.select { |type| type[:input] == 'ip' }
32
+ end
33
+
34
+ def domain_search_types
35
+ QUERY_TYPES.select { |type| type[:input] == 'domain' }
36
+ end
37
+
38
+ def query_type_names
39
+ QUERY_TYPES.map { |type| type[:name] }
40
+ end
41
+
27
42
  ##
28
43
  # Get search
29
44
  #
@@ -32,7 +47,7 @@ module Sonar
32
47
  #
33
48
  # @return [Hashie::Mash] with response of search
34
49
  def search(params = {})
35
- type_query = params.select { |k, _v| QUERY_TYPES_MAP.keys.include?(k.to_s) }.first
50
+ type_query = params.select { |k, _v| query_type_names.include?(k.to_s) }.first
36
51
  fail ArgumentError, "The query type provided is invalid or not yet implemented." unless type_query
37
52
  type = type_query[0].to_sym
38
53
  params[:q] = type_query[1]
data/lib/sonar/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sonar
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/sonar.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require "faraday"
2
- require "faraday_middleware"
3
2
  require "sonar/cli/cli"
4
3
  require "sonar/client"
5
4
  require "sonar/version"
data/sonar-client.gemspec CHANGED
@@ -18,11 +18,15 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency 'faraday_middleware', '~> 0.9.0'
22
- spec.add_dependency 'hashie', '~> 2.0.3'
21
+ spec.add_dependency 'faraday'
22
+ spec.add_dependency 'faraday-rashify'
23
+ spec.add_dependency 'rash_alt'
24
+ spec.add_dependency 'faraday-follow_redirects'
25
+ spec.add_dependency 'hashie'
23
26
  spec.add_dependency 'multi_json'
24
27
  spec.add_dependency 'thor'
25
28
  spec.add_dependency 'awesome_print'
29
+ spec.add_dependency 'table_print'
26
30
 
27
31
  spec.add_development_dependency "bundler"
28
32
  spec.add_development_dependency "rake"
@@ -30,8 +34,7 @@ Gem::Specification.new do |spec|
30
34
  spec.add_development_dependency "simplecov"
31
35
  spec.add_development_dependency "simplecov-rcov"
32
36
  spec.add_development_dependency "yard"
33
- spec.add_development_dependency "vcr", '~> 2.8.0'
37
+ spec.add_development_dependency "vcr"
34
38
  spec.add_development_dependency "shoulda"
35
- spec.add_development_dependency "webmock", '~> 1.8.0'
36
39
  spec.add_development_dependency "api_matchers"
37
40
  end
@@ -1,3 +1,3 @@
1
1
  email: YOUR_EMAIL
2
- access_token: SONAR_TOKEN
2
+ access_token: INVALID_SONAR_TOKEN
3
3
  api_url: https://sonar.labs.rapid7.com
@@ -7,7 +7,7 @@ describe Sonar::CLI do
7
7
  Sonar::RCFile.instance.path = "#{fixtures_path}/sonar-stock.rc"
8
8
  end
9
9
  it 'throws an exception because of errors' do
10
- expect { run_command('search rdns 8.8.8.8') }.to raise_error(Sonar::Search::SearchError)
10
+ expect { run_command('search fdns 8.8.8.8') }.to raise_error(Sonar::Search::SearchError)
11
11
  end
12
12
  end
13
13
 
@@ -35,17 +35,6 @@ describe Sonar::CLI do
35
35
  expect(output).to eq('{"address":"192.168.1.1"}')
36
36
  end
37
37
  end
38
- context 'client that returns sslcert reply with nested json' do
39
- before do
40
- allow_any_instance_of(Sonar::Client).to receive(:search).and_return(
41
- Sonar::Client.new.search(sslcert: '152a0a633aaf13f02c428ac1a3e672e895512bfd')
42
- )
43
- end
44
- it 'parses the nested values in an array' do
45
- output = run_command('search sslcert 152a0a633aaf13f02c428ac1a3e672e895512bfd')
46
- expect(JSON.parse(output)['collection'].first['details'].first['subject']['ST']).to eq('California')
47
- end
48
- end
49
38
  context 'client that returns processed reply with nested json' do
50
39
  before do
51
40
  allow_any_instance_of(Sonar::Client).to receive(:search).and_return(
@@ -57,29 +46,27 @@ describe Sonar::CLI do
57
46
  expect(JSON.parse(output)['collection'].first['value']['ip']).to eq('8.8.8.8')
58
47
  end
59
48
  end
60
- describe 'searching with #exact --exact option' do
61
- context 'client that returns fdns for rapid7 IP exact' do
62
- before do
63
- allow_any_instance_of(Sonar::Client).to receive(:search).and_return(
64
- Sonar::Client.new.search(fdns: '208.118.227.20', exact: true)
65
- )
66
- end
67
- it 'matches exactly with --exact' do
68
- output = run_command('search fdns 208.118.227.20 --exact')
69
- expect(JSON.parse(output)['collection'].size).to be >= 1
70
- expect(JSON.parse(output)['collection'].any? { |c| c['name'] == '208.118.227.20' }).to be(true)
71
- end
49
+
50
+ describe 'sonar types command' do
51
+ it 'returns all sonar search types' do
52
+ output = run_command('types')
53
+ expect(output).to match(/Open Ports/)
54
+ end
55
+ end
56
+
57
+ describe 'search all command' do
58
+ before do
59
+ allow_any_instance_of(Sonar::Client).to receive(:search).and_return(
60
+ Sonar::Client.new.search(fdns: '208.118.227.20', exact: true)
61
+ )
62
+ end
63
+ it 'returns results when searching for an IP' do
64
+ output = run_command('search all 208.118.227.20')
65
+ expect(output).to match(/rapid7\.com/)
72
66
  end
73
- context 'client that returns fdns for rapid7 IP' do
74
- before do
75
- allow_any_instance_of(Sonar::Client).to receive(:search).and_return(
76
- Sonar::Client.new.search(fdns: '208.118.227.20')
77
- )
78
- end
79
- it 'matches exactly without --exact' do
80
- output = run_command('search fdns 208.118.227.20')
81
- expect(JSON.parse(output)['collection'].size).to be > 1
82
- end
67
+ it 'returns results when searching for a domain' do
68
+ output = run_command('search all rapid7.com')
69
+ expect(output).to match(/208\.118\.227\.20/)
83
70
  end
84
71
  end
85
72
  end
@@ -2,8 +2,29 @@
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Sonar::Search do
5
+ let(:dummy_class) {
6
+ Class.new { extend Sonar::Search }
7
+ }
5
8
  let(:client) { Sonar::Client.new }
6
9
 
10
+ describe "#ip_search_type_names" do
11
+ it 'includes ports' do
12
+ expect(dummy_class.ip_search_type_names).to include('ports')
13
+ end
14
+ it 'does not include fdns' do
15
+ expect(dummy_class.ip_search_type_names).to_not include('fdns')
16
+ end
17
+ end
18
+
19
+ describe "#domain_search_type_names" do
20
+ it 'includes fdns' do
21
+ expect(dummy_class.domain_search_type_names).to include('fdns')
22
+ end
23
+ it 'does not include rdns' do
24
+ expect(dummy_class.domain_search_type_names).to_not include('rdns')
25
+ end
26
+ end
27
+
7
28
  describe "parameters" do
8
29
  describe "query type" do
9
30
  context "with an invalid query type" do
@@ -13,92 +34,45 @@ describe Sonar::Search do
13
34
  end
14
35
  end
15
36
 
16
- describe "exact" do
17
- it "shouldn't match anything when #exact is true" do
18
- resp = client.search(rdns: "1.1.", exact: true)
19
- expect(resp["collection"].size).to eq(0)
20
- end
21
- it "should match when #exact is false" do
22
- resp = client.search(rdns: "1.1.", exact: false)
23
- expect(resp["collection"].first["address"]).to match(/^1.1./)
24
- end
25
- end
26
-
27
37
  describe "limit" do
28
- # The default size from APIv1/v2 is 1,000 records
38
+ # The default size from APIv1/v2 is 25 records
29
39
  context "specifying the :limit to 3000 on #search" do
30
- let(:resp) { client.search(rdns: '.hp.com', limit: 3000) }
40
+ let(:resp) { client.search(fdns: '.hp.com', limit: 3000) }
31
41
 
32
42
  it "should return a RequestIterator" do
33
43
  expect(resp.class).to eq(Sonar::Request::RequestIterator)
34
44
  end
35
- it "should return 3 x 1,000-record blocks" do
45
+ it "should return 120 x 25-record blocks" do
36
46
  num_blocks = 0
37
47
  resp.each do |resp_block|
38
- expect(resp_block['collection'].size).to eq(1000)
39
- num_blocks += 1
48
+ if resp_block
49
+ expect(resp_block['collection'].size).to eq(25)
50
+ num_blocks += 1
51
+ end
40
52
  end
41
- expect(num_blocks).to eq(3)
53
+ expect(num_blocks).to eq(120)
42
54
  end
43
55
  end
44
56
  end
45
57
  end
46
58
 
47
- context "certificate" do
48
- let(:resp) { client.search(certificate: '.hp.com') }
49
-
50
- it "should provide certificate details" do
51
- expect(resp).to have_key('collection')
52
- end
53
- end
54
-
55
- describe "rdns" do
56
- context "rdnsname" do
57
- let(:resp) { client.search(rdns: '208.118.227.10.rapid7.com') }
58
-
59
- it "returns hashie response of search" do
60
- expect(resp.class).to eq(Hashie::Mash)
61
- end
62
- it "rdnsname finds 208.118.227.10 for 208.118.227.10.rapid7.com" do
63
- expect(resp['collection'].any? { |x| x['address'] == '208.118.227.10' }).to be(true)
64
- end
65
- end
66
-
67
- context "rdnsip" do
68
- let(:resp) { client.search(rdns: '188.40.56.11') }
69
-
70
- it "rdnsip finds static.11.56.40.188.clients.your-server.de for 188.40.56.11" do
71
- expect(resp['collection'].any? { |x| x['name'] == 'static.11.56.40.188.clients.your-server.de' }).to be(true)
72
- end
73
- end
74
-
75
- context "validation" do
76
- let(:resp) { client.search(rdns: '188.40.56.11@#&#') }
77
-
78
- it "should error for invalid domain query type" do
79
- expect(resp["error"]).to eq("Invalid query")
80
- expect(resp["errors"].first).to eq("Expected a domain but got '188.40.56.11@#&#'")
81
- end
82
- end
83
- end
84
-
85
59
  describe "fdns" do
86
60
  context "fdnsname" do
87
61
  let(:resp) { client.search(fdns: 'rapid7.com') }
88
62
 
89
63
  it "returns hashie response of search" do
90
- expect(resp.class).to eq(Hashie::Mash)
64
+ expect(resp.class).to eq(Hashie::Mash::Rash)
91
65
  end
92
- it "finds fdnsname 208.118.227.10 for rapid7.com" do
93
- expect(resp['collection'].any? { |x| x['address'] == '208.118.227.10' }).to be(true)
66
+ it "finds fdnsname multiple IP addresses for rapid7.com" do
67
+ expect(resp['collection'].select { |x| x['address'] }.size).to be >= 2
94
68
  end
95
69
  end
96
70
 
97
71
  context "fdnsip" do
98
72
  let(:resp) { client.search(fdns: '208.118.227.10') }
99
73
 
100
- it "finds fdnsip rapid7.com at 208.118.227.10" do
101
- expect(resp['collection'].any? { |x| x['address'].match('rapid7') }).to be(true)
74
+ it "finds fdnsip rapid7 domains at 208.118.227.10" do
75
+ expect(resp['collection'].any? { |x| x['address'].match('rapidseven') }).to be(true)
102
76
  end
103
77
  end
104
78
 
@@ -107,77 +81,11 @@ describe Sonar::Search do
107
81
 
108
82
  it "should error for invalid domain query type" do
109
83
  expect(resp["error"]).to eq("Invalid query")
110
- expect(resp["errors"].first).to eq("Expected a domain but got '188.40.56.11@#&#'")
84
+ expect(resp["errors"].first).to eq("An unsupported gTLD or ccTLD was specified for: 188.40.56.11@#&#")
111
85
  end
112
86
  end
113
87
  end
114
88
 
115
- context "links_to" do
116
- let(:resp) { client.search(links_to: 'rapid7.com') }
117
-
118
- it "should provide links_to details" do
119
- expect(resp).to have_key('collection')
120
- end
121
- end
122
-
123
- context "ipcerts" do
124
- let(:resp) { client.search(ipcerts: '208.118.227.10') }
125
-
126
- it "should provide ipcerts details" do
127
- expect(resp).to have_key('collection')
128
- end
129
- end
130
-
131
- context "certips" do
132
- let(:resp) { client.search(certips: '1e80c24b97c928bb1db7d4d3c05475a6a40a1186') }
133
-
134
- it "should provide certips details" do
135
- expect(resp).to have_key('collection')
136
- end
137
- end
138
-
139
- context "namecerts" do
140
- let(:resp) { client.search(namecerts: '.rapid7.com') }
141
-
142
- it "should provide namecerts details" do
143
- expect(resp).to have_key('collection')
144
- end
145
- end
146
-
147
- context "sslcert" do
148
- let(:resp) { client.search(sslcert: '1e80c24b97c928bb1db7d4d3c05475a6a40a1186') }
149
-
150
- it "should provide sslcert details" do
151
- expect(resp).to have_key('collection')
152
- end
153
- end
154
-
155
- context "whois_ip" do
156
- let(:resp) { client.search(whois_ip: '208.118.227.10') }
157
-
158
- xit "should find rapid7.com" do
159
- expect(resp['name']).to eq('TWDX-208-118-227-0-1')
160
- end
161
- end
162
-
163
- # TODO: actually check response
164
- context "raw" do
165
- let(:resp) { client.search(raw: '208.118.227.10') }
166
-
167
- it "should return a collection" do
168
- expect(resp).to have_key('collection')
169
- end
170
- end
171
-
172
- # TODO: actually check response
173
- context "processed" do
174
- let(:resp) { client.search(processed: '208.118.227.10') }
175
-
176
- it "should return a collection" do
177
- expect(resp).to have_key('collection')
178
- end
179
- end
180
-
181
89
  # TODO: actually check response
182
90
  context "ports" do
183
91
  let(:resp) { client.search(ports: '208.118.227.10') }
data/spec/sonar_spec.rb CHANGED
@@ -57,7 +57,7 @@ describe Sonar, skip_autoconfig: true do
57
57
  end
58
58
  puts Sonar.api_url
59
59
  client = Sonar::Client.new
60
- @resp = client.search(rdns: "hp.com")
60
+ @resp = client.search(fdns: "hp.com")
61
61
  end
62
62
 
63
63
  it "should return unauthorized" do
data/spec/spec_helper.rb CHANGED
@@ -20,7 +20,7 @@ end
20
20
  VCR.configure do |c|
21
21
  c.allow_http_connections_when_no_cassette = true
22
22
  c.cassette_library_dir = 'spec/cassette'
23
- c.hook_into :webmock
23
+ c.hook_into :faraday
24
24
  c.configure_rspec_metadata!
25
25
  c.default_cassette_options = { record: :new_episodes }
26
26
  end
metadata CHANGED
@@ -1,43 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sonar-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Deardorff & HD Moore
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-22 00:00:00.000000000 Z
11
+ date: 2022-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: faraday_middleware
14
+ name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.0
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.0
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday-rashify
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rash_alt
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday-follow_redirects
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: hashie
29
71
  requirement: !ruby/object:Gem::Requirement
30
72
  requirements:
31
- - - "~>"
73
+ - - ">="
32
74
  - !ruby/object:Gem::Version
33
- version: 2.0.3
75
+ version: '0'
34
76
  type: :runtime
35
77
  prerelease: false
36
78
  version_requirements: !ruby/object:Gem::Requirement
37
79
  requirements:
38
- - - "~>"
80
+ - - ">="
39
81
  - !ruby/object:Gem::Version
40
- version: 2.0.3
82
+ version: '0'
41
83
  - !ruby/object:Gem::Dependency
42
84
  name: multi_json
43
85
  requirement: !ruby/object:Gem::Requirement
@@ -81,13 +123,13 @@ dependencies:
81
123
  - !ruby/object:Gem::Version
82
124
  version: '0'
83
125
  - !ruby/object:Gem::Dependency
84
- name: bundler
126
+ name: table_print
85
127
  requirement: !ruby/object:Gem::Requirement
86
128
  requirements:
87
129
  - - ">="
88
130
  - !ruby/object:Gem::Version
89
131
  version: '0'
90
- type: :development
132
+ type: :runtime
91
133
  prerelease: false
92
134
  version_requirements: !ruby/object:Gem::Requirement
93
135
  requirements:
@@ -95,7 +137,7 @@ dependencies:
95
137
  - !ruby/object:Gem::Version
96
138
  version: '0'
97
139
  - !ruby/object:Gem::Dependency
98
- name: rake
140
+ name: bundler
99
141
  requirement: !ruby/object:Gem::Requirement
100
142
  requirements:
101
143
  - - ">="
@@ -109,7 +151,7 @@ dependencies:
109
151
  - !ruby/object:Gem::Version
110
152
  version: '0'
111
153
  - !ruby/object:Gem::Dependency
112
- name: rspec
154
+ name: rake
113
155
  requirement: !ruby/object:Gem::Requirement
114
156
  requirements:
115
157
  - - ">="
@@ -123,7 +165,7 @@ dependencies:
123
165
  - !ruby/object:Gem::Version
124
166
  version: '0'
125
167
  - !ruby/object:Gem::Dependency
126
- name: simplecov
168
+ name: rspec
127
169
  requirement: !ruby/object:Gem::Requirement
128
170
  requirements:
129
171
  - - ">="
@@ -137,7 +179,7 @@ dependencies:
137
179
  - !ruby/object:Gem::Version
138
180
  version: '0'
139
181
  - !ruby/object:Gem::Dependency
140
- name: simplecov-rcov
182
+ name: simplecov
141
183
  requirement: !ruby/object:Gem::Requirement
142
184
  requirements:
143
185
  - - ">="
@@ -151,7 +193,7 @@ dependencies:
151
193
  - !ruby/object:Gem::Version
152
194
  version: '0'
153
195
  - !ruby/object:Gem::Dependency
154
- name: yard
196
+ name: simplecov-rcov
155
197
  requirement: !ruby/object:Gem::Requirement
156
198
  requirements:
157
199
  - - ">="
@@ -165,21 +207,21 @@ dependencies:
165
207
  - !ruby/object:Gem::Version
166
208
  version: '0'
167
209
  - !ruby/object:Gem::Dependency
168
- name: vcr
210
+ name: yard
169
211
  requirement: !ruby/object:Gem::Requirement
170
212
  requirements:
171
- - - "~>"
213
+ - - ">="
172
214
  - !ruby/object:Gem::Version
173
- version: 2.8.0
215
+ version: '0'
174
216
  type: :development
175
217
  prerelease: false
176
218
  version_requirements: !ruby/object:Gem::Requirement
177
219
  requirements:
178
- - - "~>"
220
+ - - ">="
179
221
  - !ruby/object:Gem::Version
180
- version: 2.8.0
222
+ version: '0'
181
223
  - !ruby/object:Gem::Dependency
182
- name: shoulda
224
+ name: vcr
183
225
  requirement: !ruby/object:Gem::Requirement
184
226
  requirements:
185
227
  - - ">="
@@ -193,19 +235,19 @@ dependencies:
193
235
  - !ruby/object:Gem::Version
194
236
  version: '0'
195
237
  - !ruby/object:Gem::Dependency
196
- name: webmock
238
+ name: shoulda
197
239
  requirement: !ruby/object:Gem::Requirement
198
240
  requirements:
199
- - - "~>"
241
+ - - ">="
200
242
  - !ruby/object:Gem::Version
201
- version: 1.8.0
243
+ version: '0'
202
244
  type: :development
203
245
  prerelease: false
204
246
  version_requirements: !ruby/object:Gem::Requirement
205
247
  requirements:
206
- - - "~>"
248
+ - - ">="
207
249
  - !ruby/object:Gem::Version
208
- version: 1.8.0
250
+ version: '0'
209
251
  - !ruby/object:Gem::Dependency
210
252
  name: api_matchers
211
253
  requirement: !ruby/object:Gem::Requirement
@@ -252,7 +294,6 @@ files:
252
294
  - spec/cassette/valid_ms_registration.yml
253
295
  - spec/fixtures/sonar-stock.rc
254
296
  - spec/fixtures/sonar.rc
255
- - spec/sonar/certificate_spec.rb
256
297
  - spec/sonar/cli_spec.rb
257
298
  - spec/sonar/client_spec.rb
258
299
  - spec/sonar/registration_spec.rb
@@ -264,7 +305,7 @@ homepage: https://sonar.labs.rapid7.com
264
305
  licenses:
265
306
  - MIT
266
307
  metadata: {}
267
- post_install_message:
308
+ post_install_message:
268
309
  rdoc_options: []
269
310
  require_paths:
270
311
  - lib
@@ -279,16 +320,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
279
320
  - !ruby/object:Gem::Version
280
321
  version: '0'
281
322
  requirements: []
282
- rubyforge_project:
283
- rubygems_version: 2.4.8
284
- signing_key:
323
+ rubyforge_project:
324
+ rubygems_version: 2.7.9
325
+ signing_key:
285
326
  specification_version: 4
286
327
  summary: API Wrapper for Sonar
287
328
  test_files:
288
329
  - spec/cassette/valid_ms_registration.yml
289
330
  - spec/fixtures/sonar-stock.rc
290
331
  - spec/fixtures/sonar.rc
291
- - spec/sonar/certificate_spec.rb
292
332
  - spec/sonar/cli_spec.rb
293
333
  - spec/sonar/client_spec.rb
294
334
  - spec/sonar/registration_spec.rb
@@ -296,4 +336,3 @@ test_files:
296
336
  - spec/sonar/user_spec.rb
297
337
  - spec/sonar_spec.rb
298
338
  - spec/spec_helper.rb
299
- has_rdoc:
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
-
4
- describe Sonar::Search do
5
- let(:client) { Sonar::Client.new }
6
-
7
- context "sha1 #get_certificate" do
8
- it "should find the link to certificate by sha1" do
9
- res = client.get_certificate(sha1: "1e80c24b97c928bb1db7d4d3c05475a6a40a1186")
10
- expect(res._links.self.href).to match(/certificates/)
11
- end
12
- end
13
- end