virustotal_api 0.3.0 → 0.5.2

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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +26 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +12 -8
  5. data/CHANGELOG.md +38 -6
  6. data/Gemfile +2 -0
  7. data/README.md +121 -31
  8. data/Rakefile +2 -1
  9. data/lib/virustotal_api.rb +8 -5
  10. data/lib/virustotal_api/analysis.rb +24 -0
  11. data/lib/virustotal_api/base.rb +41 -10
  12. data/lib/virustotal_api/domain.rb +24 -0
  13. data/lib/virustotal_api/exceptions.rb +5 -0
  14. data/lib/virustotal_api/file.rb +56 -0
  15. data/lib/virustotal_api/group.rb +26 -0
  16. data/lib/virustotal_api/ip.rb +24 -0
  17. data/lib/virustotal_api/uri.rb +3 -1
  18. data/lib/virustotal_api/url.rb +46 -0
  19. data/lib/virustotal_api/user.rb +26 -0
  20. data/lib/virustotal_api/version.rb +3 -1
  21. data/test/analysis_test.rb +23 -0
  22. data/test/base_test.rb +14 -25
  23. data/test/domain_test.rb +32 -0
  24. data/test/exceptions_test.rb +23 -0
  25. data/test/file_test.rb +71 -0
  26. data/test/fixtures/analysis.yml +544 -0
  27. data/test/fixtures/domain.yml +830 -0
  28. data/test/fixtures/file_analyse.yml +52 -0
  29. data/test/fixtures/file_find.yml +853 -0
  30. data/test/fixtures/file_not_found.yml +52 -0
  31. data/test/fixtures/file_rate_limit.yml +52 -0
  32. data/test/fixtures/file_unauthorized.yml +51 -0
  33. data/test/fixtures/file_upload.yml +54 -0
  34. data/test/fixtures/group_find.yml +216 -0
  35. data/test/fixtures/ip.yml +716 -0
  36. data/test/fixtures/unscanned_url_find.yml +44 -0
  37. data/test/fixtures/url_analyse.yml +52 -0
  38. data/test/fixtures/url_find.yml +599 -0
  39. data/test/fixtures/user_find.yml +213 -0
  40. data/test/group_test.rb +32 -0
  41. data/test/{ip_report_test.rb → ip_test.rb} +5 -4
  42. data/test/test_helper.rb +1 -0
  43. data/test/uri_test.rb +2 -1
  44. data/test/url_test.rb +65 -0
  45. data/test/user_test.rb +31 -0
  46. data/test/version_test.rb +2 -2
  47. data/virustotal_api.gemspec +12 -9
  48. metadata +104 -65
  49. data/.travis.yml +0 -15
  50. data/lib/virustotal_api/domain_report.rb +0 -35
  51. data/lib/virustotal_api/file_report.rb +0 -36
  52. data/lib/virustotal_api/file_scan.rb +0 -36
  53. data/lib/virustotal_api/ip_report.rb +0 -35
  54. data/lib/virustotal_api/url_report.rb +0 -40
  55. data/test/domain_report_test.rb +0 -31
  56. data/test/file_report_test.rb +0 -34
  57. data/test/file_scan_test.rb +0 -29
  58. data/test/fixtures/domain_report.yml +0 -311
  59. data/test/fixtures/ip_report.yml +0 -1323
  60. data/test/fixtures/queue_unscanned_url_report.yml +0 -46
  61. data/test/fixtures/report.yml +0 -110
  62. data/test/fixtures/report_not_found.yml +0 -42
  63. data/test/fixtures/request_forbidden.yml +0 -38
  64. data/test/fixtures/scan.yml +0 -49
  65. data/test/fixtures/unscanned_url_report.yml +0 -43
  66. data/test/fixtures/url_report.yml +0 -95
  67. data/test/url_report_test.rb +0 -56
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8bed66a7fba9485458455710be627e1f833347bceb426162e95580a0523f709e
4
- data.tar.gz: 958f96c673f266360f5da1f5c28e9c948407956176be6af1196ad53aee7ab551
3
+ metadata.gz: 1bed8beb641ac85649be4628d37065079d3f2c881499a67065200eeba57f2176
4
+ data.tar.gz: a55ce4ed4bdc573607389e20578efd53f10d7ab1597b3deb05644571dac752c6
5
5
  SHA512:
6
- metadata.gz: b633ba4b732ea5cc41470928879ef92c75000a66df300d7640a4e28d210a85192cd69fb5a4c96e4fd37f1434eda2c0678a3ac359c235fb46a588f67cebe20d51
7
- data.tar.gz: 25bf3927a97a5fdc9435caa0073223b46fb4af8badc0f18edb735c5ce34174b585a98db7b04a05b9aea35213a2f0d1e9f6c47be1c9132c78668c04334776dac6
6
+ metadata.gz: 13c8674a48591fd1c063a4d76040555aeace01a19981feb558241ff1843984f2e8052c6169bec8a1ec4f63519e14bf9b3a109fcf7f8fc667d8a1e0cbfe7f99aa
7
+ data.tar.gz: b64cfe0bfa5fa79927d22d591534f2b7db2b3ca7f572e8360b0423c3de5def7948f3264381e001596c095c66ec04187fe5fddf1d4148ad21bcf66a08eaf981ac
@@ -0,0 +1,26 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ Test:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - name: Set up Ruby
16
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
17
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
18
+ uses: ruby/setup-ruby@v1.46.0
19
+ with:
20
+ ruby-version: 2.5
21
+ - name: Install dependencies
22
+ run: bundle install
23
+ - name: Lint
24
+ run: bundle exec rake rubocop
25
+ - name: Run tests
26
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ .rake_tasks~
@@ -1,18 +1,16 @@
1
1
  # This is the configuration used to check the rubocop source code.
2
2
 
3
3
  AllCops:
4
+ NewCops: enable
4
5
  Exclude:
5
6
  - 'test/fixtures/*'
6
7
 
7
8
  Style/StringLiterals:
8
9
  Enabled: true
9
10
 
10
- Style/UnneededPercentQ:
11
+ Style/RedundantPercentQ:
11
12
  Enabled: true
12
13
 
13
- Style/HashSyntax:
14
- EnforcedStyle: hash_rockets
15
-
16
14
  # Disabled Checks
17
15
  Style/Documentation:
18
16
  Enabled: false
@@ -23,13 +21,19 @@ Style/PercentLiteralDelimiters:
23
21
  Style/RegexpLiteral:
24
22
  Enabled: false
25
23
 
26
- Style/BracesAroundHashParameters:
27
- Enabled: false
28
-
29
24
  Lint/MissingCopEnableDirective:
30
25
  Exclude:
31
26
  - 'test/base_test.rb'
32
27
 
33
- Naming/UncommunicativeMethodParamName:
28
+ Naming/MethodParameterName:
34
29
  Exclude:
35
30
  - 'lib/virustotal_api/ip_report.rb'
31
+
32
+ Layout/LineLength:
33
+ Enabled: false
34
+
35
+ Metrics/MethodLength:
36
+ Enabled: false
37
+
38
+ Gemspec/RequiredRubyVersion:
39
+ Enabled: false
@@ -1,15 +1,47 @@
1
1
  # VirusTotal API Changelog
2
2
 
3
- ## 0.3.0
3
+ ## [0.5.2] - 2020-10-06
4
4
 
5
- * Add optional scan param for url report API [#5](https://github.com/pwelch/virustotal_api/pull/5)
5
+ * Fix Fix exists? check
6
+ * Fix detected_by for File
7
+ * Fix RateLimitError
8
+ * Added User and Group API
9
+ * [@jonnynux](https://github.com/jonnynux)
10
+
11
+ ## [0.5.1] - 2020-10-06
12
+
13
+ * Downgrade ruby requirement to 2.5.
14
+ * [@crondaemon](https://github.com/crondaemon)
15
+
16
+ ## [0.5.0] - 2020-09-02
17
+
18
+ * Full rework to support API V3 [#30](https://github.com/pwelch/virustotal_api/pull/30)
19
+ * [@crondaemon](https://github.com/crondaemon) & [@jonnynux](https://github.com/jonnynux)
20
+ * Move to Ruby 2.6 for minimum Ruby version
21
+
22
+ ## [0.4.1] - 2019-09-04
23
+
24
+ * Fixed Reponse Parsing
25
+ * [@jonnynux](https://github.com/jonnynux)
26
+
27
+ ## [0.4.0] - 2019-07-23
28
+
29
+ * Added ReScan [#15](https://github.com/pwelch/virustotal_api/pull/15)
30
+ * Added URL Scan [#16](https://github.com/pwelch/virustotal_api/pull/16)
31
+ * [@jonnynux](https://github.com/jonnynux)
32
+
33
+ ## [0.3.0] - 2018-03-31
34
+
35
+ * Added optional scan param for url report API [#5](https://github.com/pwelch/virustotal_api/pull/5)
6
36
  * [@mkunkel ](https://github.com/mkunkel)
7
37
 
8
- ## 0.2.0
38
+ ## [0.2.0] - 2015-12-19
9
39
 
10
- * Check if the respone is 204 [#2](https://github.com/pwelch/virustotal_api/pull/2)
11
- * Check if the respone is 204 (No Content) and raise an exception. [@postmodern](https://github.com/postmodern)
40
+ * Added Check if the respone is 204 [#2](https://github.com/pwelch/virustotal_api/pull/2)
41
+ * [@postmodern](https://github.com/postmodern)
12
42
 
13
- ## 0.1.0
43
+ ## [0.1.0] - 2014-12-26
14
44
 
15
45
  * First Release
46
+
47
+ https://keepachangelog.com
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -1,9 +1,11 @@
1
1
  # VirustotalAPI
2
2
 
3
- Ruby Gem for [VirusTotal](https://www.virustotal.com) [V2 API](https://www.virustotal.com/en/documentation/public-api/)
3
+ Ruby Gem for [VirusTotal](https://www.virustotal.com) [V3 API](https://developers.virustotal.com/v3.0/reference).
4
+ If you want the version 2, check out the gem versions up to [0.4.0](https://github.com/crondaemon/virustotal_api/tree/v0.4.0).
5
+
6
+ ![Ruby](https://github.com/pwelch/virustotal_api/workflows/Ruby/badge.svg)
4
7
 
5
8
  [![Gem Version](https://badge.fury.io/rb/virustotal_api.svg)](http://badge.fury.io/rb/virustotal_api)
6
- [![Build Status](https://secure.travis-ci.org/pwelch/virustotal_api.svg)](http://travis-ci.org/pwelch/virustotal_api)
7
9
 
8
10
  ## Installation
9
11
 
@@ -27,7 +29,7 @@ VirusTotal only allows 4 queries per minute for their Public API. https://www.vi
27
29
 
28
30
  You will need a Private API Key if you require more queries per minute.
29
31
 
30
- ### File Report
32
+ ### File Find
31
33
 
32
34
  ```ruby
33
35
  require 'virustotal_api'
@@ -35,7 +37,7 @@ require 'virustotal_api'
35
37
  sha256 = '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b'
36
38
  api_key = 'MY_API_KEY'
37
39
 
38
- vtreport = VirustotalAPI::FileReport.find(sha256, api_key)
40
+ vtreport = VirustotalAPI::File.find(sha256, api_key)
39
41
 
40
42
  # Does the resource have any results?
41
43
  vtreport.exists?
@@ -43,14 +45,19 @@ vtreport.exists?
43
45
 
44
46
  # URL for File Report (if it exists)
45
47
  vtreport.report_url
46
- # => "https://www.virustotal.com/file/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b/analysis/1418032127/"
48
+ # => "https://www.virustotal.com/api/v3/files/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b"
47
49
 
48
50
  # Report results (if they exist) are available via #report
49
- vtreport.report["scans"]["ClamAV"]
50
- # => {"detected"=>false, "version"=>"0.98.5.0", "result"=>nil, "update"=>"20141208"}
51
+ vtreport.report['data']['attributes']['last_analysis_results']['ClamAV']
52
+ # => {"category"=>"undetected", "engine_name"=>"ClamAV", "engine_update"=>"20200826",
53
+ # "engine_version"=>"0.102.4.0", "method"=>"blacklist", "result"=>nil}
54
+
55
+ # Check whether an Antivirus detected this sample or not
56
+ vtreport.detected_by('ClamAV')
57
+ # => false
51
58
  ```
52
59
 
53
- ### File Scan
60
+ ### File Upload
54
61
 
55
62
  ```ruby
56
63
  require 'virustotal_api'
@@ -58,28 +65,43 @@ require 'virustotal_api'
58
65
  file = '/path/to/file'
59
66
  api_key = 'MY_API_KEY'
60
67
 
61
- vtscan = VirustotalAPI::FileScan.scan(file, api_key)
68
+ vtscan = VirustotalAPI::File.upload(file, api_key)
62
69
 
63
- # Scan ID of file
64
- vtscan.scan_id
70
+ # Virustotal ID of file
71
+ vtscan.id
65
72
  # => "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b-1419454668"
66
73
 
67
74
  # Response results are available via #response
68
- vtreport.response
75
+ vtscan.report
76
+ # =>
77
+ {"data"=>
78
+ {"id"=>"MTkxNDBmMjU4ZGY1OGZiYzZjNmU2ODcyMWNhYjhkZTM6MTU5ODUzMTE5OQ==",
79
+ "type"=>"analysis"}}
80
+ ```
81
+
82
+ ### File Analyse
83
+
84
+ ```ruby
85
+ require 'virustotal_api'
86
+
87
+ sha256 = '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b'
88
+ api_key = 'MY_API_KEY'
89
+
90
+ vtrescan = VirustotalAPI::File.analyse(sha256, api_key)
91
+
92
+ # Virustotal ID of file
93
+ vtrescan.id
94
+ # => "MTkxNDBmMjU4ZGY1OGZiYzZjNmU2ODcyMWNhYjhkZTM6MTU5ODUzMTE5OQ=="
95
+
96
+ # Response results are available via #response
97
+ vtrescan.report
69
98
  # =>
70
- {
71
- "scan_id"=>"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b-1419454668",
72
- "sha1"=>"adc83b19e793491b1c6ea0fd8b46cd9f32e592fc",
73
- "resource"=>"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b",
74
- "response_code"=>1,
75
- "sha256"=>"01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b",
76
- "permalink"=>"https://www.virustotal.com/file/01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b/analysis/1419454668/",
77
- "md5"=>"68b329da9893e34099c7d8ad5cb9c940",
78
- "verbose_msg"=>"Scan request successfully queued, come back later for the report"
79
- }
99
+ {"data"=>
100
+ {"id"=>"MTkxNDBmMjU4ZGY1OGZiYzZjNmU2ODcyMWNhYjhkZTM6MTU5ODUzMTE5OQ==",
101
+ "type"=>"analysis"}}
80
102
  ```
81
103
 
82
- ### URL Report
104
+ ### URL find
83
105
 
84
106
  ```ruby
85
107
  require 'virustotal_api'
@@ -87,7 +109,7 @@ require 'virustotal_api'
87
109
  url = 'http://www.google.com'
88
110
  api_key = 'MY_API_KEY'
89
111
 
90
- vturl_report = VirustotalAPI::URLReport.find(url, api_key)
112
+ vturl_report = VirustotalAPI::URL.find(url, api_key)
91
113
 
92
114
  # Does the resource have any results?
93
115
  vturl_report.exists?
@@ -95,14 +117,37 @@ vturl_report.exists?
95
117
 
96
118
  # URL for Report (if it exists)
97
119
  vturl_report.report_url
98
- # => "https://www.virustotal.com/url/dd014af5ed6b38d9130e3f466f850e46d21b951199d53a18ef29ee9341614eaf/analysis/1419457210/"
120
+ # => "https://www.virustotal.com/api/v3/urls/dd014af5ed6b38d9130e3f466f850e46d21b951199d53a18ef29ee9341614eaf/"
99
121
 
100
122
  # Report results (if they exist) are available via #report
101
- vturl_report.report["scans"]["Opera"]
102
- # => {"detected"=>false, "result"=>"clean site"}
123
+ vturl_report.report['data']['attributes']['last_analysis_results']['Avira']
124
+ # => {"category"=>"harmless", "engine_name"=>"Avira", "method"=>"blacklist", "result"=>"clean"}
103
125
  ```
104
126
 
105
- ### IP Report
127
+ ### URL Upload
128
+
129
+ ```ruby
130
+ require 'virustotal_api'
131
+
132
+ url = 'http://www.google.com'
133
+ api_key = 'MY_API_KEY'
134
+
135
+ vturl_scan = VirustotalAPI::URL.upload(url, api_key)
136
+
137
+ # Virustotal ID of file
138
+ vturl_scan.id
139
+ # => "u-dd014af5ed6b38d9130e3f466f850e46d21b951199d53a18ef29ee9341614eaf-1598531929"
140
+
141
+ # Response results are available via #response
142
+ vturl_scan.report
143
+ # =>
144
+ {"data"=>
145
+ {"id"=>
146
+ "u-dd014af5ed6b38d9130e3f466f850e46d21b951199d53a18ef29ee9341614eaf-1598531929",
147
+ "type"=>"analysis"}}
148
+ ```
149
+
150
+ ### IP Find
106
151
 
107
152
  ```ruby
108
153
  require 'virustotal_api'
@@ -110,7 +155,7 @@ require 'virustotal_api'
110
155
  ip = '8.8.8.8'
111
156
  api_key = 'MY_API_KEY'
112
157
 
113
- vtip_report = VirustotalAPI::IPReport.find(ip, api_key)
158
+ vtip_report = VirustotalAPI::IP.find(ip, api_key)
114
159
 
115
160
  # Does the resource have any results?
116
161
  vtip_report.exists?
@@ -121,7 +166,7 @@ vtip_report.report
121
166
  # => Hash of report results
122
167
  ```
123
168
 
124
- ### Domain Report
169
+ ### Domain Find
125
170
 
126
171
  ```ruby
127
172
  require 'virustotal_api'
@@ -129,7 +174,7 @@ require 'virustotal_api'
129
174
  domain = 'virustotal.com'
130
175
  api_key = 'MY_API_KEY'
131
176
 
132
- vtdomain_report = VirustotalAPI::DomainReport.find(domain, api_key)
177
+ vtdomain_report = VirustotalAPI::Domain.find(domain, api_key)
133
178
 
134
179
  # Does the resource have any results?
135
180
  vtdomain_report.exists?
@@ -140,6 +185,51 @@ vtdomain_report.report
140
185
  # => Hash of report results
141
186
  ```
142
187
 
188
+ ### User Find
189
+
190
+ ```ruby
191
+ require 'virustotal_api'
192
+
193
+ user_key = 'user_key' # user_id or api_key
194
+ api_key = 'MY_API_KEY'
195
+
196
+ vtuser_report = VirustotalAPI::User.find(user_key, api_key)
197
+
198
+ # Does the resource have any results?
199
+ vtuser_report.exists?
200
+ # => true
201
+
202
+ # Report results (if they exist) are available via #report
203
+ vtuser_report.report
204
+ # => Hash of report results
205
+ ```
206
+
207
+ ### Group Find
208
+
209
+ ```ruby
210
+ require 'virustotal_api'
211
+
212
+ group_id = 'GROUP_id'
213
+ api_key = 'MY_API_KEY'
214
+
215
+ vtgroup_report = VirustotalAPI::Group.find(group_id, api_key)
216
+
217
+ # Does the resource have any results?
218
+ vtgroup_report.exists?
219
+ # => true
220
+
221
+ # Report results (if they exist) are available via #report
222
+ vtgroup_report.report
223
+ # => Hash of report results
224
+ ```
225
+
226
+ ## Contributors
227
+
228
+ - [@postmodern](https://github.com/postmodern)
229
+ - [@mkunkel](https://github.com/mkunkel)
230
+ - [@jonnynux](https://github.com/jonnynux)
231
+ - [@crondaemon](https://github.com/crondaemon/)
232
+
143
233
  ## Contributing
144
234
 
145
235
  1. Fork it ( https://github.com/pwelch/virustotal_api/fork )
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require 'bundler/gem_tasks'
3
4
  require 'rake/testtask'
@@ -21,4 +22,4 @@ namespace :yard do
21
22
  end
22
23
  end
23
24
 
24
- task :default => :test
25
+ task default: :test
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
1
2
 
2
- require 'virustotal_api/domain_report'
3
- require 'virustotal_api/file_report'
4
- require 'virustotal_api/file_scan'
5
- require 'virustotal_api/ip_report'
6
- require 'virustotal_api/url_report'
3
+ require 'virustotal_api/analysis'
4
+ require 'virustotal_api/domain'
5
+ require 'virustotal_api/file'
6
+ require 'virustotal_api/group'
7
+ require 'virustotal_api/ip'
8
+ require 'virustotal_api/url'
7
9
  require 'virustotal_api/uri'
10
+ require 'virustotal_api/user'
8
11
  require 'virustotal_api/version'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module VirustotalAPI
6
+ # A class for '/analyses' API
7
+ class Analysis < Base
8
+ attr_reader :report
9
+
10
+ # rubocop:disable Lint/MissingSuper
11
+ def initialize(report)
12
+ @report = report
13
+ end
14
+
15
+ # @param [String] id The Virustotal ID to get the report for.
16
+ # @param [String] api_key The key for virustotal
17
+ # @return [VirustotalAPI::IP] Report
18
+ def self.find(id, api_key)
19
+ report = perform("/analyses/#{id}", api_key)
20
+ new(report)
21
+ end
22
+ end
23
+ end
24
+ # rubocop:enable Lint/MissingSuper
@@ -1,22 +1,50 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'virustotal_api/exceptions'
2
4
  require 'rest-client'
3
5
  require 'json'
6
+ require 'base64'
4
7
 
8
+ # The base VirustotalAPI module.
5
9
  module VirustotalAPI
10
+ # The base class implementing the raw calls to Virustotal API V3.
6
11
  class Base
12
+ attr_reader :report
13
+
14
+ def initialize(report)
15
+ @report = report
16
+ end
17
+
7
18
  # @return [String] string of API URI class method
8
19
  def self.api_uri
9
20
  VirustotalAPI::URI
10
21
  end
11
22
 
12
- # @param [RestClient::Response] response
13
- # @return [Hash] the parsed JSON.
14
- def self.parse(response)
15
- if response.code == 204
16
- raise(RateLimitError, 'maximum number of 4 requests per minute reached')
17
- end
18
-
23
+ # The actual method performing a call to Virustotal
24
+ #
25
+ # @param [String] url The url of the API
26
+ # @param [String] api_key The key for virustotal
27
+ # @param [String] method The HTTP method to use
28
+ # @param [Hash] options Options to pass as payload
29
+ # @return [VirustotalAPI::Domain] Report Search Result
30
+ def self.perform(url, api_key, method = :get, options = {})
31
+ response = RestClient::Request.execute(
32
+ method: method,
33
+ url: api_uri + url,
34
+ headers: { 'x-apikey': api_key },
35
+ payload: options
36
+ )
19
37
  JSON.parse(response.body)
38
+ rescue RestClient::NotFound
39
+ {}
40
+ rescue RestClient::Unauthorized
41
+ # Raise a custom exception not to expose the underlying
42
+ # HTTP client.
43
+ raise VirustotalAPI::Unauthorized
44
+ rescue RestClient::TooManyRequests
45
+ # Raise a custom exception not to expose the underlying
46
+ # HTTP client.
47
+ raise VirustotalAPI::RateLimitError
20
48
  end
21
49
 
22
50
  # @return [String] string of API URI instance method
@@ -25,11 +53,14 @@ module VirustotalAPI
25
53
  end
26
54
 
27
55
  # @return [Boolean] if report for resource exists
28
- # 0 => not_present, 1 => exists, -1 => invalid_ip_address
29
56
  def exists?
30
- response_code = report.fetch('response_code') { nil }
57
+ !report.empty?
58
+ end
31
59
 
32
- response_code == 1
60
+ # Generate a URL identifier.
61
+ # @see https://developers.virustotal.com/v3.0/reference#url
62
+ def self.url_identifier(url)
63
+ Base64.encode64(url).strip.gsub('=', '')
33
64
  end
34
65
  end
35
66
  end