onyphe 0.2.3 → 1.0.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
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