virustotal_api 0.5.3 → 0.5.7

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: 549e10acf953216ded9295c21129e76fc737bd63f29703af799499c6feed2c6e
4
- data.tar.gz: d20c12d67d748d329e3b0e340a4857115d516d942af5e3a282bb72e80a90e373
3
+ metadata.gz: 6cc7f702a37c929aa442614681a5b34d12d11d5f1e1e04c8190c89184edb588f
4
+ data.tar.gz: 98e21db2c21a632610e0d9961ff7884bbae0df2072e9647d17c608c06881b0c7
5
5
  SHA512:
6
- metadata.gz: 394ad7a9dbf0f4c59d7e286acd57974e042427f0f4c82d1c652195b0dca4d17a0eeed28cd82946da2a072679a824060bacf184c741ecd0578e383386295c328d
7
- data.tar.gz: 0f9b0e2bc76a11d1b496ac1b0fb266875ed36cbfb51b27396396b555c3e47d5e411073e8bef956e1e44d08ec395e1165a45df8e525b24af6a0ae915d2c9c1b79
6
+ metadata.gz: 278d6a9c1ff7aa68b05f131afcca21935720fc7c5db760a09f6db6d6cd693e7fa48ad2e5397b953ebb24da00d25cebf105ba52575c9e96ea79e2b20a3c21eda0
7
+ data.tar.gz: 965e4304dfa6e52287d05c3ebba817fbb0e3801f7fb353f8253fea98d7a1b118a2f0d14486883b94f2ce465cf807b151a9b69e5da75c18d9f4f075d066748af8
@@ -0,0 +1,38 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Screenshots**
24
+ If applicable, add screenshots to help explain your problem.
25
+
26
+ **Desktop (please complete the following information):**
27
+ - OS: [e.g. iOS]
28
+ - Browser [e.g. chrome, safari]
29
+ - Version [e.g. 22]
30
+
31
+ **Smartphone (please complete the following information):**
32
+ - Device: [e.g. iPhone6]
33
+ - OS: [e.g. iOS8.1]
34
+ - Browser [e.g. stock browser, safari]
35
+ - Version [e.g. 22]
36
+
37
+ **Additional context**
38
+ Add any other context about the problem here.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,11 @@
1
+ CHANGELOG: no-impact/Added/Changed/Deprecated/Removed/Fixed/Security
2
+
3
+ ## Summary
4
+
5
+ ## Testing
6
+
7
+ 1. _Describe how to test this change_
8
+
9
+ ## Other Information
10
+
11
+ _Include screenshots, GIFs, and/or API responses as appropriate._
@@ -7,17 +7,37 @@ on:
7
7
  branches: [ master ]
8
8
 
9
9
  jobs:
10
- Test:
10
+ Test-Ruby-2-7:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - name: Set up Ruby
15
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
16
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
17
+ uses: ruby/setup-ruby@v1.70.1
18
+ with:
19
+ ruby-version: 2.7
20
+ - name: Show Ruby Version
21
+ run: ruby --version
22
+ - name: Install dependencies
23
+ run: bundle install
24
+ - name: Lint
25
+ run: bundle exec rake rubocop
26
+ - name: Run tests
27
+ run: bundle exec rake
28
+
29
+ Test-Ruby-3-0:
11
30
  runs-on: ubuntu-latest
12
-
13
31
  steps:
14
32
  - uses: actions/checkout@v2
15
33
  - name: Set up Ruby
16
34
  # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
17
35
  # change this to (see https://github.com/ruby/setup-ruby#versioning):
18
- uses: ruby/setup-ruby@v1.46.0
36
+ uses: ruby/setup-ruby@v1.70.1
19
37
  with:
20
- ruby-version: 2.5
38
+ ruby-version: 3.0
39
+ - name: Show Ruby Version
40
+ run: ruby --version
21
41
  - name: Install dependencies
22
42
  run: bundle install
23
43
  - name: Lint
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  *.a
14
14
  mkmf.log
15
15
  .rake_tasks~
16
+ .tool-versions
data/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # VirusTotal API Changelog
2
2
 
3
+ ## [0.5.7] - 2021-09-20
4
+
5
+ * Remove EOL Ruby 2.5
6
+
7
+ ## [0.5.6] - 2021-09-20
8
+
9
+ * Use urlsafe base64 encoding
10
+ * Fix changelog
11
+ * [@jonnynux](https://github.com/jonnynux)
12
+
13
+ ## [0.5.5] - 2021-05-10
14
+
15
+ * Add support for larger files
16
+ * [@Grandman](https://github.com/Grandman)
17
+
18
+ ## [0.5.4] - 2020-12-10
19
+
20
+ * Manage bad requests like not found
21
+ * Use strict base64 encoding
22
+ * [@crondaemon](https://github.com/crondaemon)
23
+
24
+ ## [0.5.3] = 2020-10-12
25
+
3
26
  ## [0.5.2] - 2020-10-06
4
27
 
5
28
  * Fix Fix exists? check
data/README.md CHANGED
@@ -65,7 +65,10 @@ require 'virustotal_api'
65
65
  file = '/path/to/file'
66
66
  api_key = 'MY_API_KEY'
67
67
 
68
+ # for upload file
68
69
  vtscan = VirustotalAPI::File.upload(file, api_key)
70
+ # or large file (more than 32MB)
71
+ vtscan = VirustotalAPI::File.upload_large(file, api_key)
69
72
 
70
73
  # Virustotal ID of file
71
74
  vtscan.id
@@ -233,10 +236,11 @@ vtgroup_report.report
233
236
 
234
237
  ## Contributors
235
238
 
236
- - [@postmodern](https://github.com/postmodern)
237
- - [@mkunkel](https://github.com/mkunkel)
238
239
  - [@jonnynux](https://github.com/jonnynux)
239
240
  - [@crondaemon](https://github.com/crondaemon/)
241
+ - [@postmodern](https://github.com/postmodern)
242
+ - [@mkunkel](https://github.com/mkunkel)
243
+ - [@Grandman](https://github.com/Grandman)
240
244
 
241
245
  ## Contributing
242
246
 
@@ -12,9 +12,9 @@ module VirustotalAPI
12
12
  attr_reader :report, :report_url, :id
13
13
 
14
14
  def initialize(report)
15
- @report = report
15
+ @report = report
16
16
  @report_url = report&.dig('data', 'links', 'self')
17
- @id = report&.dig('data', 'id')
17
+ @id = report&.dig('data', 'id')
18
18
  end
19
19
 
20
20
  # @return [String] string of API URI class method
@@ -22,6 +22,14 @@ module VirustotalAPI
22
22
  VirustotalAPI::URI
23
23
  end
24
24
 
25
+ def self.perform(path, api_key, method = :get, options = {})
26
+ base_perform(api_uri + path, api_key, method, options)
27
+ end
28
+
29
+ def self.perform_absolute(url, api_key, method = :get, options = {})
30
+ base_perform(url, api_key, method, options)
31
+ end
32
+
25
33
  # The actual method performing a call to Virustotal
26
34
  #
27
35
  # @param [String] url The url of the API
@@ -29,15 +37,15 @@ module VirustotalAPI
29
37
  # @param [String] method The HTTP method to use
30
38
  # @param [Hash] options Options to pass as payload
31
39
  # @return [VirustotalAPI::Domain] Report Search Result
32
- def self.perform(url, api_key, method = :get, options = {})
40
+ def self.base_perform(url, api_key, method = :get, options = {})
33
41
  response = RestClient::Request.execute(
34
42
  method: method,
35
- url: api_uri + url,
43
+ url: url,
36
44
  headers: { 'x-apikey': api_key },
37
45
  payload: options
38
46
  )
39
47
  JSON.parse(response.body)
40
- rescue RestClient::NotFound
48
+ rescue RestClient::NotFound, RestClient::BadRequest
41
49
  {}
42
50
  rescue RestClient::Unauthorized
43
51
  # Raise a custom exception not to expose the underlying
@@ -49,6 +57,8 @@ module VirustotalAPI
49
57
  raise VirustotalAPI::RateLimitError
50
58
  end
51
59
 
60
+ private_class_method :base_perform
61
+
52
62
  # @return [String] string of API URI instance method
53
63
  def api_uri
54
64
  self.class.api_uri
@@ -62,7 +72,7 @@ module VirustotalAPI
62
72
  # Generate a URL identifier.
63
73
  # @see https://developers.virustotal.com/v3.0/reference#url
64
74
  def self.url_identifier(url)
65
- Base64.encode64(url).strip.gsub('=', '')
75
+ Base64.urlsafe_encode64(url).strip.gsub('=', '')
66
76
  end
67
77
  end
68
78
  end
@@ -23,7 +23,20 @@ module VirustotalAPI
23
23
  # @return [VirusotalAPI::File] Report
24
24
  def self.upload(file_path, api_key, opts = {})
25
25
  filename = opts.fetch('filename') { ::File.basename(file_path) }
26
- report = perform('/files', api_key, :post, filename: filename, file: ::File.open(file_path, 'r'))
26
+ report = perform('/files', api_key, :post, filename: filename, file: ::File.open(file_path, 'r'))
27
+ new(report)
28
+ end
29
+
30
+ # Upload a new file with size more than 32MB.
31
+ #
32
+ # @param [String] file_path for file to be sent for scan
33
+ # @param [String] api_key The key for virustotal
34
+ # @param [Hash] opts hash for additional options
35
+ # @return [VirusotalAPI::File] Report
36
+ def self.upload_large(file_path, api_key, opts = {})
37
+ filename = opts.fetch('filename') { ::File.basename(file_path) }
38
+ url = upload_url(api_key)
39
+ report = perform_absolute(url, api_key, :post, filename: filename, file: ::File.open(file_path, 'r'))
27
40
  new(report)
28
41
  end
29
42
 
@@ -37,6 +50,12 @@ module VirustotalAPI
37
50
  new(report)
38
51
  end
39
52
 
53
+ # @return [String] url for upload file
54
+ def self.upload_url(api_key)
55
+ data = perform('/files/upload_url', api_key)
56
+ data&.dig('data')
57
+ end
58
+
40
59
  # Check if the submitted hash is detected by an AV engine.
41
60
  #
42
61
  # @param [String] engine The engine to check.
@@ -2,5 +2,5 @@
2
2
 
3
3
  module VirustotalAPI
4
4
  # The GEM version
5
- VERSION = '0.5.3'
5
+ VERSION = '0.5.7'
6
6
  end
data/test/base_test.rb CHANGED
@@ -4,7 +4,9 @@ require './test/test_helper'
4
4
 
5
5
  class VirustotalAPIBaseTest < Minitest::Test
6
6
  def setup
7
+ @domain = 'xpressco.za'
7
8
  @sha256 = '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b'
9
+ @url = 'https://www.dropbox.com/s/qmi112rc4ns75eb/Confidential_123.xls?dl=1'
8
10
  @api_key = 'testapikey'
9
11
  end
10
12
 
@@ -43,5 +45,19 @@ class VirustotalAPIBaseTest < Minitest::Test
43
45
 
44
46
  assert !virustotal_report.exists?
45
47
  end
48
+
49
+ VCR.use_cassette('domain_bad_request') do
50
+ virustotal_report = VirustotalAPI::Domain.find(@domain, @api_key)
51
+
52
+ assert !virustotal_report.exists?
53
+ end
54
+ end
55
+
56
+ def test_url_encoding
57
+ VCR.use_cassette('url_encoding_find') do
58
+ virustotal_report = VirustotalAPI::URL.find(@url, @api_key)
59
+
60
+ assert virustotal_report.exists?
61
+ end
46
62
  end
47
63
  end
data/test/file_test.rb CHANGED
@@ -51,6 +51,16 @@ class VirustotalAPIFileTest < Minitest::Test
51
51
  end
52
52
  end
53
53
 
54
+ def test_upload_large
55
+ VCR.use_cassette('large_file_upload') do
56
+ vt_file_upload = VirustotalAPI::File.upload_large(@file_path, @api_key)
57
+
58
+ assert vt_file_upload.exists?
59
+ assert vt_file_upload.report.is_a?(Hash)
60
+ assert vt_file_upload.id.is_a?(String)
61
+ end
62
+ end
63
+
54
64
  def test_analyse
55
65
  VCR.use_cassette('file_analyse') do
56
66
  vt_file_analyse = VirustotalAPI::File.analyse(@sha256, @api_key)
@@ -0,0 +1,52 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://www.virustotal.com/api/v3/domains/xpressco.za
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - "*/*"
12
+ User-Agent:
13
+ - rest-client/2.1.0 (linux-gnu x86_64) ruby/2.5.1p57
14
+ X-Apikey:
15
+ - testapikey
16
+ Content-Length:
17
+ - '0'
18
+ Content-Type:
19
+ - application/x-www-form-urlencoded
20
+ Accept-Encoding:
21
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
22
+ Host:
23
+ - www.virustotal.com
24
+ response:
25
+ status:
26
+ code: 400
27
+ message: Bad Request
28
+ headers:
29
+ Cache-Control:
30
+ - no-cache
31
+ Content-Type:
32
+ - application/json; charset=utf-8
33
+ X-Cloud-Trace-Context:
34
+ - f9f5f005efc95b0390a91fb6306201d6
35
+ Date:
36
+ - Mon, 28 Dec 2020 13:56:50 GMT
37
+ Server:
38
+ - Google Frontend
39
+ Content-Length:
40
+ - '138'
41
+ body:
42
+ encoding: UTF-8
43
+ string: |-
44
+ {
45
+ "error": {
46
+ "code": "InvalidArgumentError",
47
+ "message": "Domain \"xpressco.za\" is not a valid domain pattern"
48
+ }
49
+ }
50
+ http_version:
51
+ recorded_at: Mon, 28 Dec 2020 13:56:50 GMT
52
+ recorded_with: VCR 5.0.0
@@ -49,6 +49,6 @@ http_interactions:
49
49
  "type": "analysis"
50
50
  }
51
51
  }
52
- http_version:
52
+ http_version:
53
53
  recorded_at: Wed, 02 Sep 2020 14:02:37 GMT
54
54
  recorded_with: VCR 5.0.0
@@ -0,0 +1,99 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://www.virustotal.com/api/v3/files/upload_url
6
+ body:
7
+ headers:
8
+ Accept:
9
+ - "*/*"
10
+ User-Agent:
11
+ - rest-client/2.1.0 (linux-gnu x86_64) ruby/2.5.1p57
12
+ X-Apikey:
13
+ - testapikey
14
+ Content-Length:
15
+ - '282'
16
+ Content-Type:
17
+ - multipart/form-data; boundary=----RubyFormBoundaryjv5FxFNLpwqDoUQA
18
+ Accept-Encoding:
19
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
20
+ Host:
21
+ - www.virustotal.com
22
+ response:
23
+ status:
24
+ code: 200
25
+ message: OK
26
+ headers:
27
+ Cache-Control:
28
+ - no-cache
29
+ Content-Type:
30
+ - application/json; charset=utf-8
31
+ X-Cloud-Trace-Context:
32
+ - 9c3d1ae8f345c5ca8060a4b793174891
33
+ Date:
34
+ - Wed, 02 Sep 2020 14:02:36 GMT
35
+ Server:
36
+ - Google Frontend
37
+ Content-Length:
38
+ - '128'
39
+ body:
40
+ encoding: UTF-8
41
+ string: |-
42
+ {
43
+ "data": "https://www.virustotal.com/_ah/upload/AMmfu6b-_DXUeFe36Sb3b0F4B8mH9Nb-CHbRoUNVOPwG/"
44
+ }
45
+ http_version:
46
+ recorded_at: Wed, 02 Sep 2020 14:02:37 GMT
47
+
48
+ - request:
49
+ method: post
50
+ uri: https://www.virustotal.com/_ah/upload/AMmfu6b-_DXUeFe36Sb3b0F4B8mH9Nb-CHbRoUNVOPwG/
51
+ body:
52
+ encoding: ASCII-8BIT
53
+ string: "------RubyFormBoundaryjv5FxFNLpwqDoUQA\r\nContent-Disposition: form-data;
54
+ name=\"filename\"\r\n\r\nnull_file\r\n------RubyFormBoundaryjv5FxFNLpwqDoUQA\r\nContent-Disposition:
55
+ form-data; name=\"file\"; filename=\"null_file\"\r\nContent-Type: text/plain\r\n\r\n\n\r\n------RubyFormBoundaryjv5FxFNLpwqDoUQA--\r\n"
56
+ headers:
57
+ Accept:
58
+ - "*/*"
59
+ User-Agent:
60
+ - rest-client/2.1.0 (linux-gnu x86_64) ruby/2.5.1p57
61
+ X-Apikey:
62
+ - testapikey
63
+ Content-Length:
64
+ - '282'
65
+ Content-Type:
66
+ - multipart/form-data; boundary=----RubyFormBoundaryjv5FxFNLpwqDoUQA
67
+ Accept-Encoding:
68
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
69
+ Host:
70
+ - www.virustotal.com
71
+ response:
72
+ status:
73
+ code: 200
74
+ message: OK
75
+ headers:
76
+ Cache-Control:
77
+ - no-cache
78
+ Content-Type:
79
+ - application/json; charset=utf-8
80
+ X-Cloud-Trace-Context:
81
+ - 9c3d1ae8f345c5ca8060a4b793174891
82
+ Date:
83
+ - Wed, 02 Sep 2020 14:02:36 GMT
84
+ Server:
85
+ - Google Frontend
86
+ Content-Length:
87
+ - '128'
88
+ body:
89
+ encoding: UTF-8
90
+ string: |-
91
+ {
92
+ "data": {
93
+ "id": "NjhiMzI5ZGE5ODkzZTM0MDk5YzdkOGFkNWNiOWM5NDA6MTU5OTA1NTM1Ng==",
94
+ "type": "analysis"
95
+ }
96
+ }
97
+ http_version:
98
+ recorded_at: Wed, 02 Sep 2020 14:02:37 GMT
99
+ recorded_with: VCR 5.0.0