shodanz 2.0.0 → 2.0.1

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
2
  SHA256:
3
- metadata.gz: edfee7e174978325331ceb16d7d7f19a1cd7f7cdb6731269cf8f3bc9d9fdcb31
4
- data.tar.gz: d89a612b5e3e90aa0ef9a288cf9650875f9a0031bf936d94b82d45852fb887ba
3
+ metadata.gz: 32aa0999f1cb087637e0abe8428bd70592f22a3761da87be09bcf1a2bd8c2d37
4
+ data.tar.gz: a6d8a053446c3163bb3ee7630c5663510e6568469cd0569e6c6d4ad67d1873a3
5
5
  SHA512:
6
- metadata.gz: 3f9e3e19895688ad861517883165a0b06b965f89c28854d73bec521b7a0430ebd5394519aaf4fef5e5397c9c31520bff32eed9cbeed336f4c3932bf34b1c4f09
7
- data.tar.gz: '09326a94bb100c9abe45715fc0430f4f8dedbfffbba359346b268d17b4c8523fbf3795c93cd054ed4b68af98e1166857385c8a6df5b66278d0fea56164bea6cc'
6
+ metadata.gz: d3c5e27187e510f5b811bee421194b269bcc1092bc4b212c7a172c342f1b6a4c932314e5198e89b16509ce6c1345714e232461e4c3b34de1bf2262797a435bdf
7
+ data.tar.gz: d66f4fc7e68963a54870b789a1b63ada8ffe3174947f6b641dfa8b43547d77ef37b73fc16ff7c4f8715244be8449037dcc5fa2b7028cf50424b43a6004c4297b
@@ -0,0 +1,29 @@
1
+ name: CI
2
+
3
+ on:
4
+ member:
5
+ push:
6
+ branches:
7
+ - master
8
+ schedule:
9
+ - cron: "0 9 * * *"
10
+
11
+ jobs:
12
+ test:
13
+
14
+ runs-on: ubuntu-latest
15
+
16
+ steps:
17
+ - uses: actions/checkout@v1
18
+ - name: Set up Ruby 2.7
19
+ uses: actions/setup-ruby@v1
20
+ with:
21
+ ruby-version: 2.7.x
22
+ - name: Rspec
23
+ env:
24
+ SHODAN_API_KEY: ${{secrets.SHODAN_API_KEY}}
25
+ run: |
26
+ gem install bundler
27
+ bundle install --jobs 4 --retry 3
28
+ bundle exec rspec
29
+
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Shodanz
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/shodanz.svg)](https://badge.fury.io/rb/shodanz)
4
+ [![Yard Docs](http://img.shields.io/badge/shodanz-docs-blue.svg)](https://www.rubydoc.info/gems/shodanz/)
5
+
3
6
  A modern, async Ruby [gem](https://rubygems.org/) for [Shodan](https://www.shodan.io/), the world's first search engine for Internet-connected devices.
4
7
 
5
8
  ## Installation
@@ -24,9 +27,8 @@ require 'shodanz'
24
27
 
25
28
  client = Shodanz.client.new
26
29
 
27
- # Asyncronously stream live banner info from shodan
28
- # and check the IP addresses against the expierimental
29
- # honeypot scoring service to find potential honeypots.
30
+ # Asynchronously stream banner info from shodan and check any
31
+ # IP addresses against the experimental honeypot scoring service.
30
32
  client.streaming_api.banners do |banner|
31
33
  if ip = banner['ip_str']
32
34
  Async do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
2
4
  require 'async'
3
5
  require 'shodanz'
@@ -12,7 +14,7 @@ client.streaming_api.banners do |banner|
12
14
  rescue Shodanz::Errors::RateLimited
13
15
  sleep rand
14
16
  retry
15
- rescue # any other errors
17
+ rescue StandardError # any other errors
16
18
  next
17
19
  end
18
20
  end
@@ -45,24 +45,24 @@ module Shodanz
45
45
  # api.search("SQL", port: 443)
46
46
  # api.search(port: 22)
47
47
  # api.search(type: "dos")
48
- def search(query = '', page: 1, **params)
48
+ def search(query = '', facets: {}, page: 1, **params)
49
49
  params[:query] = query
50
- params = turn_into_query(params)
51
- facets = turn_into_facets(facets)
50
+ params = turn_into_query(**params)
51
+ facets = turn_into_facets(**facets)
52
52
  params[:page] = page
53
- get('search', params.merge(facets))
53
+ get('search', **params.merge(**facets))
54
54
  end
55
55
 
56
56
  # This method behaves identical to the "/search" method with
57
57
  # the difference that it doesn't return any results.
58
58
  # == Example
59
59
  # api.count(type: "dos")
60
- def count(query = '', page: 1, **params)
60
+ def count(query = '', facets: {}, page: 1, **params)
61
61
  params[:query] = query
62
- params = turn_into_query(params)
63
- facets = turn_into_facets(params)
62
+ params = turn_into_query(**params)
63
+ facets = turn_into_facets(**facets)
64
64
  params[:page] = page
65
- get('count', params.merge(facets))
65
+ get('count', **params.merge(**facets))
66
66
  end
67
67
  end
68
68
  end
@@ -49,7 +49,7 @@ module Shodanz
49
49
  # # Only return the list of ports and the general host information, no banners.
50
50
  # rest_api.host("8.8.8.8", minify: true)
51
51
  def host(ip, **params)
52
- get("shodan/host/#{ip}", params)
52
+ get("shodan/host/#{ip}", **params)
53
53
  end
54
54
 
55
55
  # This method behaves identical to "/shodan/host/search" with the only
@@ -64,9 +64,9 @@ module Shodanz
64
64
  # rest_api.host_count("apache", country: "US", state: "MI", city: "Detroit")
65
65
  def host_count(query = '', facets: {}, **params)
66
66
  params[:query] = query
67
- params = turn_into_query(params)
68
- facets = turn_into_facets(facets)
69
- get('shodan/host/count', params.merge(facets))
67
+ params = turn_into_query(**params)
68
+ facets = turn_into_facets(**facets)
69
+ get('shodan/host/count', **params.merge(**facets))
70
70
  end
71
71
 
72
72
  # Search Shodan using the same query syntax as the website and use facets
@@ -75,19 +75,19 @@ module Shodanz
75
75
  # rest_api.host_search("apache", country: "US", facets: { city: "Detroit" }, page: 1, minify: false)
76
76
  def host_search(query = '', facets: {}, page: 1, minify: true, **params)
77
77
  params[:query] = query
78
- params = turn_into_query(params)
79
- facets = turn_into_facets(facets)
78
+ params = turn_into_query(**params)
79
+ facets = turn_into_facets(**facets)
80
80
  params[:page] = page
81
81
  params[:minify] = minify
82
- get('shodan/host/search', params.merge(facets))
82
+ get('shodan/host/search', **params.merge(**facets))
83
83
  end
84
84
 
85
85
  # This method lets you determine which filters are being used by
86
86
  # the query string and what parameters were provided to the filters.
87
87
  def host_search_tokens(query = '', **params)
88
88
  params[:query] = query
89
- params = turn_into_query(params)
90
- get('shodan/host/search/tokens', params)
89
+ params = turn_into_query(**params)
90
+ get('shodan/host/search/tokens', **params)
91
91
  end
92
92
 
93
93
  # This method returns a list of port numbers that the crawlers are looking for.
@@ -122,8 +122,8 @@ module Shodanz
122
122
  # rest_api.crawl_for(port: 80, protocol: "http")
123
123
  def crawl_for(**params)
124
124
  params[:query] = ''
125
- params = turn_into_query(params)
126
- post('shodan/scan/internet', params)
125
+ params = turn_into_query(**params)
126
+ post('shodan/scan/internet', **params)
127
127
  end
128
128
 
129
129
  # Check the progress of a previously submitted scan request.
@@ -133,21 +133,21 @@ module Shodanz
133
133
 
134
134
  # Use this method to obtain a list of search queries that users have saved in Shodan.
135
135
  def community_queries(**params)
136
- get('shodan/query', params)
136
+ get('shodan/query', **params)
137
137
  end
138
138
 
139
139
  # Use this method to search the directory of search queries that users have saved in Shodan.
140
140
  def search_for_community_query(query, **params)
141
141
  params[:query] = query
142
- params = turn_into_query(params)
143
- get('shodan/query/search', params)
142
+ params = turn_into_query(**params)
143
+ get('shodan/query/search', **params)
144
144
  end
145
145
 
146
146
  # Use this method to obtain a list of popular tags for the saved search queries in Shodan.
147
147
  def popular_query_tags(size = 10)
148
148
  params = {}
149
149
  params[:size] = size
150
- get('shodan/query/tags', params)
150
+ get('shodan/query/tags', **params)
151
151
  end
152
152
 
153
153
  # Returns information about the Shodan account linked to this API key.
@@ -54,7 +54,7 @@ module Shodanz
54
54
  # puts data
55
55
  # end
56
56
  def banners(**params)
57
- slurp_stream('shodan/banners', params) do |data|
57
+ slurp_stream('shodan/banners', **params) do |data|
58
58
  yield data
59
59
  end
60
60
  end
@@ -67,7 +67,7 @@ module Shodanz
67
67
  # puts data
68
68
  # end
69
69
  def banners_within_asns(*asns, **params)
70
- slurp_stream("shodan/asn/#{asns.join(',')}", params) do |data|
70
+ slurp_stream("shodan/asn/#{asns.join(',')}", **params) do |data|
71
71
  yield data
72
72
  end
73
73
  end
@@ -14,32 +14,32 @@ module Shodanz
14
14
  module Utils
15
15
  # Perform a direct GET HTTP request to the REST API.
16
16
  def get(path, **params)
17
- return sync_get(path, params) unless Async::Task.current?
17
+ return sync_get(path, **params) unless Async::Task.current?
18
18
 
19
- async_get(path, params)
19
+ async_get(path, **params)
20
20
  end
21
21
 
22
22
  # Perform a direct POST HTTP request to the REST API.
23
23
  def post(path, **params)
24
- return sync_post(path, params) unless Async::Task.current?
24
+ return sync_post(path, **params) unless Async::Task.current?
25
25
 
26
- async_post(path, params)
26
+ async_post(path, **params)
27
27
  end
28
28
 
29
29
  # Perform the main function of consuming the streaming API.
30
30
  def slurp_stream(path, **params)
31
31
  if Async::Task.current?
32
- async_slurp_stream(path, params) do |result|
32
+ async_slurp_stream(path, **params) do |result|
33
33
  yield result
34
34
  end
35
35
  else
36
- sync_slurp_stream(path, params) do |result|
36
+ sync_slurp_stream(path, **params) do |result|
37
37
  yield result
38
38
  end
39
39
  end
40
40
  end
41
41
 
42
- def turn_into_query(params)
42
+ def turn_into_query(**params)
43
43
  filters = params.reject { |key, _| key == :query }
44
44
  filters.each do |key, value|
45
45
  params[:query] << " #{key}:#{value}"
@@ -47,7 +47,7 @@ module Shodanz
47
47
  params.select { |key, _| key == :query }
48
48
  end
49
49
 
50
- def turn_into_facets(facets)
50
+ def turn_into_facets(**facets)
51
51
  return {} if facets.nil?
52
52
 
53
53
  filters = facets.reject { |key, _| key == :facets }
@@ -81,10 +81,8 @@ module Shodanz
81
81
  # build up url string based on special params
82
82
  url = "#{@url}#{path}?key=#{@key}"
83
83
  # special params
84
- %w[query ips hostnames].each do |param|
85
- if (value = params.delete(param))
86
- url += "&#{param}=#{value}"
87
- end
84
+ params.each do |param,value|
85
+ url += "&#{param}=#{value}" unless value.is_a?(String) && value.empty?
88
86
  end
89
87
  resp = @internet.get(url)
90
88
 
@@ -137,37 +135,37 @@ module Shodanz
137
135
 
138
136
  def async_get(path, **params)
139
137
  Async::Task.current.async do
140
- getter(path, params)
138
+ getter(path, **params)
141
139
  end
142
140
  end
143
141
 
144
142
  def sync_get(path, **params)
145
143
  Async do
146
- getter(path, params)
144
+ getter(path, **params)
147
145
  end.wait
148
146
  end
149
147
 
150
148
  def async_post(path, **params)
151
149
  Async::Task.current.async do
152
- poster(path, params)
150
+ poster(path, **params)
153
151
  end
154
152
  end
155
153
 
156
154
  def sync_post(path, **params)
157
155
  Async do
158
- poster(path, params)
156
+ poster(path, **params)
159
157
  end.wait
160
158
  end
161
159
 
162
160
  def async_slurp_stream(path, **params)
163
161
  Async::Task.current.async do
164
- slurper(path, params) { |data| yield data }
162
+ slurper(path, **params) { |data| yield data }
165
163
  end
166
164
  end
167
165
 
168
166
  def sync_slurp_stream(path, **params)
169
167
  Async do
170
- slurper(path, params) { |data| yield data }
168
+ slurper(path, **params) { |data| yield data }
171
169
  end.wait
172
170
  end
173
171
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Shodanz
4
- VERSION = '2.0.0'
4
+ VERSION = '2.0.1'
5
5
  end
@@ -20,13 +20,13 @@ Gem::Specification.new do |spec|
20
20
  end
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.add_dependency 'async', '~> 1.17.1'
24
- spec.add_dependency 'async-http', '~> 0.38.1'
23
+ spec.add_dependency 'async-http', '>= 0.38.1', '< 0.51.0'
24
+ spec.add_dependency 'async', '>= 1.17.1', '< 1.25.0'
25
25
 
26
- spec.add_development_dependency 'async-rspec', '~> 1.12.1'
27
- spec.add_development_dependency 'bundler', '~> 1.17.2'
26
+ spec.add_development_dependency 'async-rspec', '~> 1.14.0'
27
+ spec.add_development_dependency 'bundler', '~> 2.1.2'
28
28
  spec.add_development_dependency 'pry', '~> 0.12.2'
29
- spec.add_development_dependency 'rake', '~> 12.3.2'
29
+ spec.add_development_dependency 'rake', '~> 13.0.0'
30
30
  spec.add_development_dependency 'rb-readline', '~> 0.5.5'
31
- spec.add_development_dependency 'rspec', '~> 3.8.0'
31
+ spec.add_development_dependency 'rspec', '~> 3.9.0'
32
32
  end
metadata CHANGED
@@ -1,71 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shodanz
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent 'picatz' Gruber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-01 00:00:00.000000000 Z
11
+ date: 2020-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: async
14
+ name: async-http
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.17.1
19
+ version: 0.38.1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 0.51.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: 1.17.1
29
+ version: 0.38.1
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 0.51.0
27
33
  - !ruby/object:Gem::Dependency
28
- name: async-http
34
+ name: async
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
- - - "~>"
37
+ - - ">="
32
38
  - !ruby/object:Gem::Version
33
- version: 0.38.1
39
+ version: 1.17.1
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: 1.25.0
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
- - - "~>"
47
+ - - ">="
39
48
  - !ruby/object:Gem::Version
40
- version: 0.38.1
49
+ version: 1.17.1
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 1.25.0
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: async-rspec
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
57
  - - "~>"
46
58
  - !ruby/object:Gem::Version
47
- version: 1.12.1
59
+ version: 1.14.0
48
60
  type: :development
49
61
  prerelease: false
50
62
  version_requirements: !ruby/object:Gem::Requirement
51
63
  requirements:
52
64
  - - "~>"
53
65
  - !ruby/object:Gem::Version
54
- version: 1.12.1
66
+ version: 1.14.0
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: bundler
57
69
  requirement: !ruby/object:Gem::Requirement
58
70
  requirements:
59
71
  - - "~>"
60
72
  - !ruby/object:Gem::Version
61
- version: 1.17.2
73
+ version: 2.1.2
62
74
  type: :development
63
75
  prerelease: false
64
76
  version_requirements: !ruby/object:Gem::Requirement
65
77
  requirements:
66
78
  - - "~>"
67
79
  - !ruby/object:Gem::Version
68
- version: 1.17.2
80
+ version: 2.1.2
69
81
  - !ruby/object:Gem::Dependency
70
82
  name: pry
71
83
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +98,14 @@ dependencies:
86
98
  requirements:
87
99
  - - "~>"
88
100
  - !ruby/object:Gem::Version
89
- version: 12.3.2
101
+ version: 13.0.0
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
93
105
  requirements:
94
106
  - - "~>"
95
107
  - !ruby/object:Gem::Version
96
- version: 12.3.2
108
+ version: 13.0.0
97
109
  - !ruby/object:Gem::Dependency
98
110
  name: rb-readline
99
111
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +126,14 @@ dependencies:
114
126
  requirements:
115
127
  - - "~>"
116
128
  - !ruby/object:Gem::Version
117
- version: 3.8.0
129
+ version: 3.9.0
118
130
  type: :development
119
131
  prerelease: false
120
132
  version_requirements: !ruby/object:Gem::Requirement
121
133
  requirements:
122
134
  - - "~>"
123
135
  - !ruby/object:Gem::Version
124
- version: 3.8.0
136
+ version: 3.9.0
125
137
  description: Featuring full support for the REST, Streaming and Exploits API
126
138
  email:
127
139
  - kgruber1@emich.edu
@@ -129,6 +141,7 @@ executables: []
129
141
  extensions: []
130
142
  extra_rdoc_files: []
131
143
  files:
144
+ - ".github/workflows/ci.yml"
132
145
  - ".gitignore"
133
146
  - ".rspec"
134
147
  - ".travis.yml"
@@ -173,8 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
173
186
  - !ruby/object:Gem::Version
174
187
  version: '0'
175
188
  requirements: []
176
- rubyforge_project:
177
- rubygems_version: 3.0.0.beta1
189
+ rubygems_version: 3.1.2
178
190
  signing_key:
179
191
  specification_version: 4
180
192
  summary: A modern, async Ruby gem for Shodan, the world's first search engine for