shodanz 2.0.2 → 2.0.6

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 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