miteru 0.2.0 → 0.3.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: b0961934a27b02e1571c875e3a5a1bed37e7069d5333b45ced0f2d20250c9423
4
- data.tar.gz: 2172a57faed6cd18e7b00665f481821486606ab1407746bcf683bdea5e0829a4
3
+ metadata.gz: 415304dc7c41fb9f40f68e7b8a59f0c03ce74c963020ecd2300b4b3a1ed3c058
4
+ data.tar.gz: dcef1c8fe00901e5d97f7e4a12c3b63227e63a11e4c1a3498f768fbb7dc7ddd3
5
5
  SHA512:
6
- metadata.gz: c100e58f709309e9d1dc1ed33cb660bcf7622bf4c8b5ec6186403571968d91a91e50bc22fb2087f662fa5dfb51e46b9c0688ed66d5758da69348a9955da0acec
7
- data.tar.gz: 9efad43fa5a0e528d59c6b1c4ee16dd336b5378baf0c3bb21f6a9acafde84d16d806785968d7a5849e229a567c9e1e3f7c057cfd233a4ed40d0aa9ec67499a60
6
+ metadata.gz: 686844a3d0e5016d66ced3d66a153777d56bc9d5751820b7e41d5a74e1d10ba6fb1d6fc334d69c66545c5e60782fb6df1baaf765bb5ac0ea1d9c48ff2d72b017
7
+ data.tar.gz: 146cb5832df24866984bf65b4074e1a362db98394aa4fe6150bd941c1f13d28eeb2b1afda088e0d39eb404ad3faa6fd363fdf789fd6d6052736e5ef3f1e1163f
data/README.md CHANGED
@@ -32,9 +32,12 @@ Usage:
32
32
  miteru execute
33
33
 
34
34
  Options:
35
+ [--auto-download], [--no-auto-download]
36
+ [--download-to=DOWNLOAD_TO]
37
+ # Default: /tmp
38
+ [--post-to-slack], [--no-post-to-slack]
35
39
  [--verbose], [--no-verbose]
36
40
  # Default: true
37
- [--post-to-slack], [--no-post-to-slack]
38
41
 
39
42
  Execute the crawler
40
43
  ```
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "miteru/error"
4
+ require "miteru/downloader"
4
5
  require "miteru/website"
5
6
  require "miteru/crawler"
6
7
  require "miteru/cli"
@@ -6,20 +6,40 @@ require "thor"
6
6
 
7
7
  module Miteru
8
8
  class CLI < Thor
9
- method_option :verbose, type: :boolean, default: true
9
+ method_option :auto_download, type: :boolean, default: false
10
+ method_option :download_to, type: :string, default: "/tmp"
10
11
  method_option :post_to_slack, type: :boolean, default: false
12
+ method_option :verbose, type: :boolean, default: true
11
13
  desc "execute", "Execute the crawler"
12
14
  def execute
13
15
  websites = Crawler.execute(options[:verbose])
14
16
  websites.each do |website|
15
- if website.has_kit?
16
- puts "#{website.url}: it might contain a phishing kit (#{website.zip_files.join(',')}).".colorize(:light_red)
17
- post_to_slack(message) if options[:post_to_slack] && valid_slack_setting?
17
+ next unless website.has_kit?
18
+
19
+ puts "#{website.url}: it might contain a phishing kit (#{website.zip_files.join(',')}).".colorize(:light_red)
20
+ post_to_slack(message) if options[:post_to_slack] && valid_slack_setting?
21
+ begin
22
+ download_zip_files(website.url, website.zip_files, options[:download_to]) if options[:auto_download]
23
+ rescue DownloadError => e
24
+ puts e.to_s
18
25
  end
19
26
  end
20
27
  end
21
28
 
22
29
  no_commands do
30
+ def download_zip_files(url, zip_files, base_dir)
31
+ failed_urls = []
32
+ zip_files.each do |path|
33
+ target_url = "#{url}/#{path}"
34
+ begin
35
+ Downloader.download target_url, base_dir
36
+ rescue Down::Error => _
37
+ failed_urls << target_url
38
+ end
39
+ end
40
+ raise DownloadError, "Failed to download: #{failed_urls}.join(',')" unless failed_urls.empty?
41
+ end
42
+
23
43
  def valid_slack_setting?
24
44
  ENV["SLACK_WEBHOOK_URL"] != nil
25
45
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "down"
4
+ require "uri"
5
+
6
+ module Miteru
7
+ class Downloader
8
+ attr_reader :url, :base_dir
9
+ def initialize(url, base_dir = "/tmp")
10
+ @url = url
11
+ @base_dir = base_dir
12
+ end
13
+
14
+ def filename
15
+ uri = URI.parse(url)
16
+ File.basename(uri.path)
17
+ end
18
+
19
+ def destination
20
+ @destination ||= "#{base_dir}/#{filename}"
21
+ end
22
+
23
+ def download
24
+ Down.download(url, destination: destination)
25
+ end
26
+
27
+ def self.download(url, base_dir = "/tmp")
28
+ new(url, base_dir).download
29
+ end
30
+ end
31
+ end
@@ -2,4 +2,5 @@
2
2
 
3
3
  module Miteru
4
4
  class HTTPResponseError < StandardError; end
5
+ class DownloadError < StandardError; end
5
6
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Miteru
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "webmock", "~> 3.4"
34
34
 
35
35
  spec.add_dependency "colorize", "~> 0.8"
36
+ spec.add_dependency "down", "~> 4.5"
36
37
  spec.add_dependency "http", "~> 3.3"
37
38
  spec.add_dependency "oga", "~> 2.15"
38
39
  spec.add_dependency "thor", "~> 0.19"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miteru
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0.8'
125
+ - !ruby/object:Gem::Dependency
126
+ name: down
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '4.5'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '4.5'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: http
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +213,7 @@ files:
199
213
  - lib/miteru.rb
200
214
  - lib/miteru/cli.rb
201
215
  - lib/miteru/crawler.rb
216
+ - lib/miteru/downloader.rb
202
217
  - lib/miteru/error.rb
203
218
  - lib/miteru/version.rb
204
219
  - lib/miteru/website.rb