shodanz 2.0.2 → 2.0.6

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: 410e95de412de33cdbe2fb4fd47ed7eda7e9bdbc1dc86f68a09050cf5ec316fc
4
- data.tar.gz: 94dc8c3425f95bd0d7294499618e58f2f3e4b88f174f132ced5b2316a52800b1
3
+ metadata.gz: 99a5e96240f1b07b93e2c291fe7881099b27f171210f2d5119235b790f4b8df8
4
+ data.tar.gz: cd332d55feb245bf520fffde2cd8fde08684c07189e3131b9ad8243e23704a72
5
5
  SHA512:
6
- metadata.gz: 29dea01f7e595b0b7eb6700eaa5e04dac0a426606c6bd28882b9ac484c48e48bb9ff35aa26cfd7b60996cde16273ff27d92534dd5e7909997c75c58c94b0d228
7
- data.tar.gz: e7c851400c229bd11749d4acafc8c9b784ef29b61c40f1187db7774886f565aa82935086f648178eac2e3f6782f5618572074fa5a468803c670a3ae31d4ed2d6
6
+ metadata.gz: c3b310b4ecb5a9623b8b8c5921658363aa5eab7b38aa9b0b2dd94d025aba2833f979ef4de0906434f06e24ebce31ba2618103f17a09e4a790434f632c99a45b2
7
+ data.tar.gz: b8114254a3f2e11da8d37532e723c2e1dd9d5e881de38cc0ee489a9ba7144393adb379b7994df404817c1cc22faa0d56eb930faf7049184d0092226c22eaaacb
@@ -0,0 +1,15 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: "10:00"
8
+ open-pull-requests-limit: 10
9
+ ignore:
10
+ - dependency-name: async-http
11
+ versions:
12
+ - 0.55.0
13
+ - dependency-name: pry
14
+ versions:
15
+ - 0.14.0
@@ -1,18 +1,22 @@
1
1
  name: CI
2
2
 
3
3
  on:
4
- member:
5
4
  push:
6
5
  branches:
7
6
  - master
7
+ pull_request:
8
+ branches:
9
+ - master
8
10
  schedule:
9
11
  - cron: "0 9 * * *"
10
12
 
11
13
  jobs:
12
14
  test:
13
-
15
+ if: |
16
+ github.actor == 'picatz' ||
17
+ github.actor == 'dependabot[bot]' ||
18
+ github.actor == 'dependabot-preview[bot]'
14
19
  runs-on: ubuntu-latest
15
-
16
20
  steps:
17
21
  - uses: actions/checkout@v1
18
22
  - name: Set up Ruby 2.7
@@ -23,7 +27,7 @@ jobs:
23
27
  env:
24
28
  SHODAN_API_KEY: ${{secrets.SHODAN_API_KEY}}
25
29
  run: |
26
- gem install bundler
27
- bundle install --jobs 4 --retry 3
30
+ gem install bundler:2.2.33
31
+ bundle _2.2.33_ install --jobs 4 --retry 3
28
32
  bundle exec rspec
29
33
 
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/shodanz.svg)](https://badge.fury.io/rb/shodanz)
4
4
  [![Yard Docs](http://img.shields.io/badge/shodanz-docs-blue.svg)](https://www.rubydoc.info/gems/shodanz/)
5
+ ![CI](https://github.com/picatz/shodanz/workflows/CI/badge.svg)
5
6
 
6
7
  A modern, async Ruby [gem](https://rubygems.org/) for [Shodan](https://www.shodan.io/), the world's first search engine for Internet-connected devices.
7
8
 
@@ -19,13 +19,13 @@ module Shodanz
19
19
  attr_accessor :key
20
20
 
21
21
  # The path to the REST API endpoint.
22
- URL = 'https://exploits.shodan.io/api/'
22
+ URL = 'https://exploits.shodan.io/'
23
23
 
24
24
  # @param key [String] SHODAN API key, defaulted to
25
25
  # the *SHODAN_API_KEY* enviroment variable.
26
26
  def initialize(key: ENV['SHODAN_API_KEY'])
27
27
  @url = URL
28
- @internet = Async::HTTP::Internet.new
28
+ @client = Async::HTTP::Client.new(Async::HTTP::Endpoint.parse(@url))
29
29
  self.key = key
30
30
 
31
31
  warn 'No key has been found or provided!' unless key?
@@ -50,7 +50,7 @@ module Shodanz
50
50
  params = turn_into_query(**params)
51
51
  facets = turn_into_facets(**facets)
52
52
  params[:page] = page
53
- get('search', **params.merge(**facets))
53
+ get('api/search', **params.merge(**facets))
54
54
  end
55
55
 
56
56
  # This method behaves identical to the "/search" method with
@@ -62,7 +62,7 @@ module Shodanz
62
62
  params = turn_into_query(**params)
63
63
  facets = turn_into_facets(**facets)
64
64
  params[:page] = page
65
- get('count', **params.merge(**facets))
65
+ get('api/count', **params.merge(**facets))
66
66
  end
67
67
  end
68
68
  end
@@ -22,7 +22,7 @@ module Shodanz
22
22
  # @param key [String] SHODAN API key, defaulted to the *SHODAN_API_KEY* enviroment variable.
23
23
  def initialize(key: ENV['SHODAN_API_KEY'])
24
24
  @url = URL
25
- @internet = Async::HTTP::Internet.new
25
+ @client = Async::HTTP::Client.new(Async::HTTP::Endpoint.parse(@url))
26
26
  self.key = key
27
27
 
28
28
  warn 'No key has been found or provided!' unless key?
@@ -28,7 +28,7 @@ module Shodanz
28
28
  # @param key [String] SHODAN API key, defaulted to the *SHODAN_API_KEY* enviroment variable.
29
29
  def initialize(key: ENV['SHODAN_API_KEY'])
30
30
  @url = URL
31
- @internet = Async::HTTP::Internet.new
31
+ @client = Async::HTTP::Client.new(Async::HTTP::Endpoint.parse(@url))
32
32
  self.key = key
33
33
 
34
34
  warn 'No key has been found or provided!' unless key?
@@ -20,10 +20,10 @@ module Shodanz
20
20
  end
21
21
 
22
22
  # Perform a direct POST HTTP request to the REST API.
23
- def post(path, **params)
24
- return sync_post(path, **params) unless Async::Task.current?
23
+ def post(path, body: nil, **params)
24
+ return sync_post(path, params: params, body: body) unless Async::Task.current?
25
25
 
26
- async_post(path, **params)
26
+ async_post(path, params: params, body: body)
27
27
  end
28
28
 
29
29
  # Perform the main function of consuming the streaming API.
@@ -78,11 +78,11 @@ module Shodanz
78
78
  return json
79
79
  end
80
80
 
81
- def getter(path, one_shot=false, **params)
81
+ def getter(path, **params)
82
82
  # param keys should all be strings
83
83
  params = params.transform_keys(&:to_s)
84
84
  # build up url string based on special params
85
- url = "#{@url}#{path}?key=#{@key}"
85
+ url = "/#{path}?key=#{@key}"
86
86
  # special params
87
87
  params.each do |param,value|
88
88
  next if value.is_a?(String) && value.empty?
@@ -90,38 +90,50 @@ module Shodanz
90
90
  url += "&#{param}=#{value}"
91
91
  end
92
92
 
93
- resp = @internet.get(url)
93
+ resp = @client.get(url)
94
94
 
95
- # parse all lines in the response body as JSON
96
- json = JSON.parse(resp.body.join)
95
+ if resp.success?
96
+ # parse all lines in the response body as JSON
97
+ json = JSON.parse(resp.body.join)
97
98
 
98
- @internet.close if one_shot
99
+ handle_any_json_errors(json)
99
100
 
100
- handle_any_json_errors(json)
101
-
102
- return json
101
+ return json
102
+ else
103
+ raise "Got response status #{resp.status}"
104
+ end
103
105
  ensure
106
+ @client.pool.close
104
107
  resp&.close
105
- @internet = Async::HTTP::Internet.new if one_shot
106
108
  end
107
109
 
108
- def poster(path, one_shot=false, **params)
110
+ def poster(path, one_shot: false, params: nil, body: nil)
109
111
  # param keys should all be strings
110
112
  params = params.transform_keys(&:to_s)
111
- # make POST request to server
112
- resp = @internet.post("#{@url}#{path}?key=#{@key}", params)
113
+ # and the key param is constant
114
+ params["key"] = @key
115
+ # encode as a URL string
116
+ params = URI.encode_www_form(params)
117
+ # optional JSON body string
118
+ json_body = body.nil? ? nil : JSON.dump(body)
119
+ # build URL path
120
+ path = "/#{path}?#{params}"
113
121
 
114
- # parse all lines in the response body as JSON
115
- json = JSON.parse(resp.body.join)
122
+ # make POST request to server
123
+ resp = @client.post(path, nil, json_body)
116
124
 
117
- @internet.close if one_shot
125
+ if resp.success?
126
+ json = JSON.parse(resp.body.join)
118
127
 
119
- handle_any_json_errors(json)
128
+ handle_any_json_errors(json)
120
129
 
121
- return json
130
+ return json
131
+ else
132
+ raise "Got response status #{resp.status}"
133
+ end
122
134
  ensure
135
+ @client.pool.close
123
136
  resp&.close
124
- @internet = Async::HTTP::Internet.new if one_shot
125
137
  end
126
138
 
127
139
  def slurper(path, **params)
@@ -132,7 +144,7 @@ module Shodanz
132
144
  counter = 0
133
145
  end
134
146
  # make GET request to server
135
- resp = @internet.get("#{@url}#{path}?key=#{@key}", params)
147
+ resp = @client.get("/#{path}?key=#{@key}", params)
136
148
  # read body line-by-line
137
149
  until resp.body.nil? || resp.body.empty?
138
150
  resp.body.read.each_line do |line|
@@ -151,25 +163,25 @@ module Shodanz
151
163
 
152
164
  def async_get(path, **params)
153
165
  Async::Task.current.async do
154
- getter(path, false, **params)
166
+ getter(path, **params)
155
167
  end
156
168
  end
157
169
 
158
170
  def sync_get(path, **params)
159
171
  Async do
160
- getter(path, true, **params)
172
+ getter(path, **params)
161
173
  end.wait
162
174
  end
163
175
 
164
- def async_post(path, **params)
176
+ def async_post(path, params: nil, body: nil)
165
177
  Async::Task.current.async do
166
- poster(path, false, **params)
178
+ poster(path, params: params, body: body)
167
179
  end
168
180
  end
169
181
 
170
- def sync_post(path, **params)
182
+ def sync_post(path, params: nil, body: nil)
171
183
  Async do
172
- poster(path, true, **params)
184
+ poster(path, params: params, body: body)
173
185
  end.wait
174
186
  end
175
187
 
@@ -15,7 +15,7 @@ module Shodanz
15
15
  end
16
16
 
17
17
  class NoAPIKey < StandardError
18
- def initialize(msg = 'No API key has been found or provided! ( setup your SHODAN_API_KEY environment varialbe )')
18
+ def initialize(msg = 'No API key has been found or provided! ( setup your SHODAN_API_KEY environment variable )')
19
19
  super
20
20
  end
21
21
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Shodanz
4
- VERSION = '2.0.2'
4
+ VERSION = '2.0.6'
5
5
  end
data/shodanz.gemspec CHANGED
@@ -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-http', '>= 0.38.1', '< 0.51.0'
24
- spec.add_dependency 'async', '>= 1.17.1', '< 1.25.0'
23
+ spec.add_dependency 'async-http', '>= 0.38.1', '< 0.57.0'
24
+ spec.add_dependency 'async', '>= 1.17.1', '< 2.1.0'
25
25
 
26
- spec.add_development_dependency 'async-rspec', '~> 1.14.0'
27
- spec.add_development_dependency 'bundler', '~> 2.1.2'
28
- spec.add_development_dependency 'pry', '~> 0.12.2'
26
+ spec.add_development_dependency 'async-rspec', '~> 1.16.1'
27
+ spec.add_development_dependency 'bundler', '~> 2.2.0'
28
+ spec.add_development_dependency 'pry', '~> 0.14.1'
29
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.9.0'
31
+ spec.add_development_dependency 'rspec', '~> 3.11.0'
32
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shodanz
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent 'picatz' Gruber
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-01 00:00:00.000000000 Z
11
+ date: 2022-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-http
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 0.38.1
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: 0.51.0
22
+ version: 0.57.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: 0.38.1
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: 0.51.0
32
+ version: 0.57.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: async
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: 1.17.1
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
- version: 1.25.0
42
+ version: 2.1.0
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,49 +49,49 @@ dependencies:
49
49
  version: 1.17.1
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
- version: 1.25.0
52
+ version: 2.1.0
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: async-rspec
55
55
  requirement: !ruby/object:Gem::Requirement
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 1.14.0
59
+ version: 1.16.1
60
60
  type: :development
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: 1.14.0
66
+ version: 1.16.1
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: bundler
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: 2.1.2
73
+ version: 2.2.0
74
74
  type: :development
75
75
  prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: 2.1.2
80
+ version: 2.2.0
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: pry
83
83
  requirement: !ruby/object:Gem::Requirement
84
84
  requirements:
85
85
  - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: 0.12.2
87
+ version: 0.14.1
88
88
  type: :development
89
89
  prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: 0.12.2
94
+ version: 0.14.1
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: rake
97
97
  requirement: !ruby/object:Gem::Requirement
@@ -126,14 +126,14 @@ dependencies:
126
126
  requirements:
127
127
  - - "~>"
128
128
  - !ruby/object:Gem::Version
129
- version: 3.9.0
129
+ version: 3.11.0
130
130
  type: :development
131
131
  prerelease: false
132
132
  version_requirements: !ruby/object:Gem::Requirement
133
133
  requirements:
134
134
  - - "~>"
135
135
  - !ruby/object:Gem::Version
136
- version: 3.9.0
136
+ version: 3.11.0
137
137
  description: Featuring full support for the REST, Streaming and Exploits API
138
138
  email:
139
139
  - kgruber1@emich.edu
@@ -141,10 +141,10 @@ executables: []
141
141
  extensions: []
142
142
  extra_rdoc_files: []
143
143
  files:
144
+ - ".github/dependabot.yml"
144
145
  - ".github/workflows/ci.yml"
145
146
  - ".gitignore"
146
147
  - ".rspec"
147
- - ".travis.yml"
148
148
  - CODE_OF_CONDUCT.md
149
149
  - Gemfile
150
150
  - LICENSE.txt
@@ -171,7 +171,7 @@ homepage: https://github.com/picatz/shodanz
171
171
  licenses:
172
172
  - MIT
173
173
  metadata: {}
174
- post_install_message:
174
+ post_install_message:
175
175
  rdoc_options: []
176
176
  require_paths:
177
177
  - lib
@@ -186,8 +186,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
186
  - !ruby/object:Gem::Version
187
187
  version: '0'
188
188
  requirements: []
189
- rubygems_version: 3.1.2
190
- signing_key:
189
+ rubygems_version: 3.0.6
190
+ signing_key:
191
191
  specification_version: 4
192
192
  summary: A modern, async Ruby gem for Shodan, the world's first search engine for
193
193
  Internet-connected devices.
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.1
5
- before_install: gem install bundler -v 1.15.3