onyphe 0.2.3 → 1.0.0

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: 6c0c310743c68f3c1da0c267cc273e0ce541957da85d50d691b28872bb496783
4
- data.tar.gz: fdad61c790b15127d29d32e0cfa5c1a0f6a0c6e68183029251f955a7619cfc56
3
+ metadata.gz: bb197595f583cae4f7474231b924a3ea0adb24ba1921acc2452ab8154868b575
4
+ data.tar.gz: 91af3240e44f93e3f14c7c9f2d6fedbd33a89d6c97f89ffaa8ac4ac31a917861
5
5
  SHA512:
6
- metadata.gz: 94e29972d127337203a38bea5dbc8d6beaed0db9acf7d7cb005161b4a86884239b4e8a667be3fc5c4c85e873cbd37c71152894b216137645741e3fde511043d9
7
- data.tar.gz: ded4b90c9a5b3363c3f2d19c1a74ed6a1725bc9709bf73b6139e990b383bdc77f51f13f74896de298f2af9ad33f48566ed2240c52a9d61de229d9c5396052499
6
+ metadata.gz: 678cbca08957c71d3c6744b525491f08cb4efa3f8e6483a0fc55e3063bf2876c0207da3c3e40b86fefa88802ad7fdce135e2ad621c33dc6504d5f91d062cb44e
7
+ data.tar.gz: 8f96e012931f4551a0d3fbf29f60f10aeba8f7da071bbcdbd78ebcd4387bc5ec24058156da32e6baa522b322505c06db2dc1597e7d4be4dd2588f45192cc62c9
data/README.md CHANGED
@@ -70,28 +70,6 @@ api.search.ctl(host: "vpn")
70
70
  api.search.onionscan("app.http.keywords": "dump")
71
71
  ```
72
72
 
73
- All the API response is wrapped by [OpenStruct](https://github.com/ruby/ostruct).
74
-
75
- It means you can access to a response through a property-like syntax.
76
-
77
- ```rb
78
- res = api.sniffer("217.138.28.194")
79
- res.results.each do |result|
80
- puts result.asn
81
- puts result.ip
82
- puts result.location
83
- puts result.organization
84
- end
85
- ```
86
-
87
- Or you can get a hash representative data by using `#to_h` method.
88
-
89
- ```rb
90
- res = api.sniffer("217.138.28.194")
91
- p res.to_h
92
- # => {:count=>10, :error=>0, :max_page=>3, :myip=>"<MY_IP>", :page=>1, :results=>[{:@category=>"sniffer", :@timestamp=>"2018-11-15T00:35:37.000Z", :@type=>"doc", :asn=>"AS20952", :city=>"London", :country=>"GB", ...
93
- ```
94
-
95
73
  #### Pagination
96
74
 
97
75
  Enumerable style pagination is not supported at the present time.
@@ -99,7 +77,7 @@ Enumerable style pagination is not supported at the present time.
99
77
  You can specify page index by passing `page` argument to the method.
100
78
 
101
79
  ```rb
102
- res = api.search.threatlist(country: "RU", page = 1)
80
+ res = api.search.threatlist(country: "RU", page: 1)
103
81
  page = res.page
104
82
  max_page = res.max_page
105
83
 
data/lib/onyphe.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "onyphe/response"
4
3
  require "onyphe/api"
5
4
 
6
5
  require "onyphe/validator"
data/lib/onyphe/api.rb CHANGED
@@ -6,40 +6,88 @@ module Onyphe
6
6
  class API
7
7
  extend Forwardable
8
8
 
9
- attr_reader :search
9
+ attr_reader :api_key
10
10
 
11
+ #
12
+ # API client initialization
13
+ #
14
+ # @param [String] api_key ONYPHE API key
15
+ #
11
16
  def initialize(api_key = ENV["ONYPHE_API_KEY"])
12
- raise(ArgumentError, "'api_key' argument is required") unless api_key
13
-
14
- @ctl = Clients::Ctl.new(api_key)
15
- @datascan = Clients::Datascan.new(api_key)
16
- @forward = Clients::Forward.new(api_key)
17
- @geoloc = Clients::Geoloc.new(api_key)
18
- @inetnum = Clients::Inetnum.new(api_key)
19
- @ip = Clients::IP.new(api_key)
20
- @md5 = Clients::MD5.new(api_key)
21
- @onionscan = Clients::Onionscan.new(api_key)
22
- @pastries = Clients::Pastries.new(api_key)
23
- @reverse = Clients::Reverse.new(api_key)
24
- @sniffer = Clients::Sniffer.new(api_key)
25
- @synscan = Clients::Synscan.new(api_key)
26
- @threatlist = Clients::Threatlist.new(api_key)
27
-
28
- @search = Clients::Search.new(api_key)
29
- end
30
-
31
- def_delegator :@ctl, :get_by_domain, :ctl
32
- def_delegator :@datascan, :get_by_query, :datascan
33
- def_delegator :@forward, :get_by_ip, :forward
34
- def_delegator :@geoloc, :get_by_ip, :geoloc
35
- def_delegator :@inetnum, :get_by_ip, :inetnum
36
- def_delegator :@ip, :get_by_ip, :ip
37
- def_delegator :@md5, :get_by_md5, :md5
38
- def_delegator :@onionscan, :get_by_onion, :onionscan
39
- def_delegator :@pastries, :get_by_ip, :pastries
40
- def_delegator :@reverse, :get_by_ip, :reverse
41
- def_delegator :@sniffer, :get_by_ip, :sniffer
42
- def_delegator :@synscan, :get_by_ip, :synscan
43
- def_delegator :@threatlist, :get_by_ip, :threatlist
17
+ @api_key = api_key
18
+ raise ArgumentError, "'api_key' argument is required" unless api_key
19
+ end
20
+
21
+ def search
22
+ @search ||= Clients::Search.new(api_key)
23
+ end
24
+
25
+ private
26
+
27
+ def _ctl
28
+ @_ctl ||= Clients::Ctl.new(api_key)
29
+ end
30
+
31
+ def _datascan
32
+ @_datascan ||= Clients::Datascan.new(api_key)
33
+ end
34
+
35
+ def _forward
36
+ @_forward ||= Clients::Forward.new(api_key)
37
+ end
38
+
39
+ def _geoloc
40
+ @_geoloc ||= Clients::Geoloc.new(api_key)
41
+ end
42
+
43
+ def _inetnum
44
+ @_inetnum ||= Clients::Inetnum.new(api_key)
45
+ end
46
+
47
+ def _ip
48
+ @_ip ||= Clients::IP.new(api_key)
49
+ end
50
+
51
+ def _md5
52
+ @_md5 ||= Clients::MD5.new(api_key)
53
+ end
54
+
55
+ def _onionscan
56
+ @_onionscan ||= Clients::Onionscan.new(api_key)
57
+ end
58
+
59
+ def _pastries
60
+ @_pastries ||= Clients::Pastries.new(api_key)
61
+ end
62
+
63
+ def _reverse
64
+ @_reverse ||= Clients::Reverse.new(api_key)
65
+ end
66
+
67
+ def _sniffer
68
+ @_sniffer ||= Clients::Sniffer.new(api_key)
69
+ end
70
+
71
+ def _synscan
72
+ @_synscan ||= Clients::Synscan.new(api_key)
73
+ end
74
+
75
+ def _threatlist
76
+ @_threatlist ||= Clients::Threatlist.new(api_key)
77
+ end
78
+
79
+ def_delegator :_ctl, :get_by_domain, :ctl
80
+ def_delegator :_datascan, :get_by_query, :datascan
81
+ def_delegator :_forward, :get_by_ip, :forward
82
+ def_delegator :_geoloc, :get_by_ip, :geoloc
83
+ def_delegator :_inetnum, :get_by_ip, :inetnum
84
+ def_delegator :_ip, :get_by_ip, :ip
85
+ def_delegator :_md5, :get_by_md5, :md5
86
+ def_delegator :_onionscan, :get_by_onion, :onionscan
87
+ def_delegator :_pastries, :get_by_ip, :pastries
88
+ def_delegator :_reverse, :get_by_ip, :reverse
89
+ def_delegator :_sniffer, :get_by_ip, :sniffer
90
+ def_delegator :_synscan, :get_by_ip, :synscan
91
+ def_delegator :_threatlist, :get_by_ip, :threatlist
44
92
  end
45
93
  end
data/lib/onyphe/cli.rb CHANGED
@@ -7,67 +7,67 @@ module Onyphe
7
7
  class CLI < Thor
8
8
  desc "ctl DOMAIN", "It will return information for the given domain name X509 certificate information from CTLs with history of changes"
9
9
  def ctl(domain)
10
- with_error_handling { puts api.ctl(domain).to_h.to_json }
10
+ with_error_handling { puts api.ctl(domain).to_json }
11
11
  end
12
12
 
13
13
  desc "datascan IP/STRING", "It will return datascan information for the given IPv{4,6} address or string with history of changes"
14
14
  def datascan(query)
15
- with_error_handling { puts api.datascan(query).to_h.to_json }
15
+ with_error_handling { puts api.datascan(query).to_json }
16
16
  end
17
17
 
18
18
  desc "forward IP", "It will return forward DNS lookup information for the given IPv{4,6} address with history of changes"
19
19
  def forward(ip)
20
- with_error_handling { puts api.forward(ip).to_h.to_json }
20
+ with_error_handling { puts api.forward(ip).to_json }
21
21
  end
22
22
 
23
23
  desc "geoloc IP", "It will return geolocation information for the given IPv{4,6} address"
24
24
  def geoloc(ip)
25
- with_error_handling { puts api.geoloc(ip).to_h.to_json }
25
+ with_error_handling { puts api.geoloc(ip).to_json }
26
26
  end
27
27
 
28
28
  desc "inetnum IP", "It will return inetnum information for the given IPv{4,6} address with history of changes"
29
29
  def inetnum(ip)
30
- with_error_handling { puts api.inetnum(ip).to_h.to_json }
30
+ with_error_handling { puts api.inetnum(ip).to_json }
31
31
  end
32
32
 
33
33
  desc "ip IP", "It will return a summary of all information for the given IPv{4,6} address"
34
34
  def ip(ip)
35
- with_error_handling { puts api.ip(ip).to_h.to_json }
35
+ with_error_handling { puts api.ip(ip).to_json }
36
36
  end
37
37
 
38
38
  desc "md5 MD5", "It will return information for the given datamd5 filter from datascan information category with history of changes"
39
39
  def md5(md5)
40
- with_error_handling { puts api.md5(md5).to_h.to_json }
40
+ with_error_handling { puts api.md5(md5).to_json }
41
41
  end
42
42
 
43
43
  desc "onionscan ONION", "It will return information for the given onion domain with history of changes"
44
44
  def onionscan(onion)
45
- with_error_handling { puts api.onionscan(onion).to_h.to_json }
45
+ with_error_handling { puts api.onionscan(onion).to_json }
46
46
  end
47
47
 
48
48
  desc "pastries IP", "It will return pastries information for the given IPv{4,6} address with history of changes"
49
49
  def pastries(ip)
50
- with_error_handling { puts api.pastries(ip).to_h.to_json }
50
+ with_error_handling { puts api.pastries(ip).to_json }
51
51
  end
52
52
 
53
53
  desc "reverse IP", "It will return reverse DNS lookup information for the given IPv{4,6} address with history of changes"
54
54
  def reverse(ip)
55
- with_error_handling { puts api.reverse(ip).to_h.to_json }
55
+ with_error_handling { puts api.reverse(ip).to_json }
56
56
  end
57
57
 
58
58
  desc "sniffer IP", "It will return information for the given IP address with history of changes"
59
59
  def sniffer(ip)
60
- with_error_handling { puts api.sniffer(ip).to_h.to_json }
60
+ with_error_handling { puts api.sniffer(ip).to_json }
61
61
  end
62
62
 
63
63
  desc "synscan IP", "It will return synscan information for the given IPv{4,6} address with history of changes."
64
64
  def synscan(ip)
65
- with_error_handling { puts api.synscan(ip).to_h.to_json }
65
+ with_error_handling { puts api.synscan(ip).to_json }
66
66
  end
67
67
 
68
68
  desc "threattlist IP", "It will return threatlist information for the given IPv{4,6} address with history of change"
69
69
  def threatlist(ip)
70
- with_error_handling { puts api.threatlist(ip).to_h.to_json }
70
+ with_error_handling { puts api.threatlist(ip).to_json }
71
71
  end
72
72
 
73
73
  no_commands do
data/lib/onyphe/client.rb CHANGED
@@ -36,10 +36,13 @@ module Onyphe
36
36
  def request(req)
37
37
  Net::HTTP.start(HOST, 443, https_options) do |http|
38
38
  http_response = http.request(req)
39
- raise(Error, "Unsupported response code returned: #{http_response.code}") unless http_response.code.start_with?("20")
39
+ code = http_response.code
40
+ raise Error, "Unsupported response code returned: #{http_response.code}" unless code.start_with?("20")
40
41
 
41
- response = JSON.parse(http_response.body, object_class: Response)
42
- raise(Error, response.message) if response.error.to_i.positive?
42
+ response = JSON.parse(http_response.body)
43
+ error = response.dig("error")
44
+ message = response.dig("message")
45
+ raise Error, message if error&.to_i&.positive?
43
46
 
44
47
  yield response
45
48
  end
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Ctl < Client
6
- def get_by_domain(domain, page = 1)
6
+ def get_by_domain(domain, page: 1)
7
7
  raise ArgumentError, "Invalid domain: #{domain}" unless Validator.valid_domain?(domain)
8
8
 
9
9
  get("/ctl/#{domain}", page: page) { |json| json }
@@ -5,7 +5,7 @@ require "addressable/uri"
5
5
  module Onyphe
6
6
  module Clients
7
7
  class Datascan < Client
8
- def get_by_query(query, page = 1)
8
+ def get_by_query(query, page: 1)
9
9
  query = Addressable::URI.encode(query)
10
10
  get("/datascan/#{query}", page: page) { |json| json }
11
11
  end
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Forward < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/forward/#{ip}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Geoloc < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/geoloc/#{ip}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Inetnum < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/inetnum/#{ip}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class IP < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/ip/#{ip}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class MD5 < Client
6
- def get_by_md5(md5, page = 1)
6
+ def get_by_md5(md5, page: 1)
7
7
  raise ArgumentError, "Invalid md5: #{md5}" unless Validator.valid_md5?(md5)
8
8
 
9
9
  get("/md5/#{md5}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Onionscan < Client
6
- def get_by_onion(onion, page = 1)
6
+ def get_by_onion(onion, page: 1)
7
7
  raise ArgumentError, "Invalid oninon domain: #{onion}" unless Validator.valid_onion_domain?(onion)
8
8
 
9
9
  get("/onionscan/#{onion}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Pastries < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/pastries/#{ip}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Reverse < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/reverse/#{ip}", page: page) { |json| json }
@@ -5,39 +5,39 @@ require "addressable/uri"
5
5
  module Onyphe
6
6
  module Clients
7
7
  class Search < Client
8
- def datascan(params, page = 1)
8
+ def datascan(params, page: 1)
9
9
  search("datascan", params, page)
10
10
  end
11
11
 
12
- def synscan(params, page = 1)
12
+ def synscan(params, page: 1)
13
13
  search("synscan", params, page)
14
14
  end
15
15
 
16
- def inetnum(params, page = 1)
16
+ def inetnum(params, page: 1)
17
17
  search("inetnum", params, page)
18
18
  end
19
19
 
20
- def threatlist(params, page = 1)
20
+ def threatlist(params, page: 1)
21
21
  search("threatlist", params, page)
22
22
  end
23
23
 
24
- def pastries(params, page = 1)
24
+ def pastries(params, page: 1)
25
25
  search("pastries", params, page)
26
26
  end
27
27
 
28
- def resolver(params, page = 1)
28
+ def resolver(params, page: 1)
29
29
  search("resolver", params, page)
30
30
  end
31
31
 
32
- def sniffer(params, page = 1)
32
+ def sniffer(params, page: 1)
33
33
  search("sniffer", params, page)
34
34
  end
35
35
 
36
- def ctl(params, page = 1)
36
+ def ctl(params, page: 1)
37
37
  search("ctl", params, page)
38
38
  end
39
39
 
40
- def onionscan(params, page = 1)
40
+ def onionscan(params, page: 1)
41
41
  search("onionscan", params, page)
42
42
  end
43
43
 
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Sniffer < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/sniffer/#{ip}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Synscan < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/synscan/#{ip}", page: page) { |json| json }
@@ -3,7 +3,7 @@
3
3
  module Onyphe
4
4
  module Clients
5
5
  class Threatlist < Client
6
- def get_by_ip(ip, page = 1)
6
+ def get_by_ip(ip, page: 1)
7
7
  raise ArgumentError, "Invalid IP address: #{ip}" unless Validator.valid_ip?(ip)
8
8
 
9
9
  get("/threatlist/#{ip}", page: page) { |json| json }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Onyphe
4
- VERSION = "0.2.3"
4
+ VERSION = "1.0.0"
5
5
  end
data/onyphe.gemspec CHANGED
@@ -29,8 +29,8 @@ Gem::Specification.new do |spec|
29
29
 
30
30
  spec.add_development_dependency "bundler", "~> 2.0"
31
31
  spec.add_development_dependency "coveralls", "~> 0.8"
32
- spec.add_development_dependency "rake", "~> 12.3"
33
- spec.add_development_dependency "rspec", "~> 3.8"
32
+ spec.add_development_dependency "rake", "~> 13.0"
33
+ spec.add_development_dependency "rspec", "~> 3.9"
34
34
  spec.add_development_dependency "vcr", "~> 5.0"
35
35
  spec.add_development_dependency "webmock", "~> 3.7"
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onyphe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-25 00:00:00.000000000 Z
11
+ date: 2019-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -72,28 +72,28 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '12.3'
75
+ version: '13.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '12.3'
82
+ version: '13.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.8'
89
+ version: '3.9'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '3.8'
96
+ version: '3.9'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: vcr
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -159,7 +159,6 @@ files:
159
159
  - lib/onyphe/clients/sniffer.rb
160
160
  - lib/onyphe/clients/synscan.rb
161
161
  - lib/onyphe/clients/threatlist.rb
162
- - lib/onyphe/response.rb
163
162
  - lib/onyphe/validator.rb
164
163
  - lib/onyphe/version.rb
165
164
  - onyphe.gemspec
@@ -182,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
181
  - !ruby/object:Gem::Version
183
182
  version: '0'
184
183
  requirements: []
185
- rubygems_version: 3.0.4
184
+ rubygems_version: 3.0.6
186
185
  signing_key:
187
186
  specification_version: 4
188
187
  summary: ONYPHE API wrapper for Ruby
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "ostruct"
4
-
5
- module Onyphe
6
- class Response < OpenStruct
7
- def openstruct_to_hash(object, hash = {})
8
- return object unless object.respond_to?(:each_pair)
9
-
10
- object.each_pair do |key, value|
11
- hash[key] = case value
12
- when OpenStruct then openstruct_to_hash(value)
13
- when Array then value.map { |v| openstruct_to_hash(v) }
14
- else value
15
- end
16
- end
17
- hash
18
- end
19
-
20
- def to_h
21
- openstruct_to_hash(self)
22
- end
23
- end
24
- end