miteru 2.0.0 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b2f6d2dc9ff42073c1f461c43f93a1fe3eaf9d89076b602b3cf08eb0457cf657
4
- data.tar.gz: bc962aaee877692d88bcf982c754569e11665cc005ae5fad807470a4dc423fc8
3
+ metadata.gz: c5c223747e06cb6d010f4a5e3157b1a4999662761ccaef108521b1627489b800
4
+ data.tar.gz: 403ed81289db89582add2420290b6f8c343da88babf2c548940871f0791655dd
5
5
  SHA512:
6
- metadata.gz: '08d48cb38e4d4cc0c3a2539a003ecce6d62659c72789de4f92f4663bce21c88e4e28dd67be4daff3154a624e8652e560d683b3decc1a4a7f3a513114c8fddd72'
7
- data.tar.gz: 260b0237b2652ddf596e7a40b2060a14fb77d18182d4fe44c5ef9b74c3b53204d5907f8d46df6c3471797bc7f20b3befd518e8e399f9d62f26b857649cfd7f23
6
+ metadata.gz: 255a86779cdb3473ba4b7683159b1290b0774eae7863db2cd9e770610b6a14f1397ff1a07823132009daafc5b0c75aea2489cd39c051067311242cf30535517d
7
+ data.tar.gz: 3662c8946aba747ad6dcda2fbedc1dc34b0cba8fd680e9d573b3a1c24114b5658f5029ecb3bf5e222c2d4cced01dd0f6f1542d4878566fab0880456bb500997e
data/.gitignore CHANGED
@@ -52,8 +52,10 @@ Gemfile.lock
52
52
  ## RSpec
53
53
  .rspec_status
54
54
 
55
- # SQLite database
55
+ # SQLite
56
56
  *.db
57
+ *.db-shm
58
+ *.db-wal
57
59
 
58
60
  # .env
59
61
  .env
@@ -15,7 +15,7 @@ module Miteru
15
15
  method_option :download_to, type: :string, default: "/tmp", desc: "Directory to download phishing kits"
16
16
  method_option :threads, type: :numeric, desc: "Number of threads to use", default: Parallel.processor_count
17
17
  method_option :verbose, type: :boolean, default: true
18
- desc "execute", "Excecute the crawler"
18
+ desc "execute", "Execute the crawler"
19
19
  around :with_db_connection
20
20
  def execute
21
21
  Miteru.config.tap do |config|
@@ -8,7 +8,7 @@ module Miteru
8
8
  def call(website)
9
9
  Try[OpenSSL::SSL::SSLError, ::HTTP::Error, Addressable::URI::InvalidURIError] do
10
10
  Miteru.logger.info("Website:#{website.truncated_url} has #{website.kits.length} kit(s).")
11
- return unless website.has_kits?
11
+ return unless website.kits?
12
12
 
13
13
  notify website
14
14
 
@@ -17,11 +17,10 @@ module Miteru
17
17
  website.kits.each do |kit|
18
18
  downloader = Downloader.new(kit)
19
19
  result = downloader.result
20
-
21
20
  if result.success?
22
- Miteru.logger.info("Kit:#{kit.truncated_url} downloaded as #{result.value!}")
21
+ Miteru.logger.info("Kit:#{kit.truncated_url} downloaded as #{result.value!}.")
23
22
  else
24
- Miteru.logger.warn("Kit:#{kit.truncated_url} failed to download - #{result.failure}")
23
+ Miteru.logger.warn("Kit:#{kit.truncated_url} failed to download - #{result.failure}.")
25
24
  end
26
25
  end
27
26
  end.recover { nil }.value!
@@ -33,8 +32,18 @@ module Miteru
33
32
  Miteru.config.auto_download
34
33
  end
35
34
 
35
+ #
36
+ # @param [Miteru::Website] website
37
+ #
36
38
  def notify(website)
37
- Parallel.each(notifiers) { |notifier| notifier.call(website) }
39
+ notifiers.each do |notifier|
40
+ result = notifier.result(website)
41
+ if result.success?
42
+ Miteru.logger.info("Notifier:#{notifier.name} succeeded.")
43
+ else
44
+ Miteru.logger.warn("Notifier:#{notifier.name} failed - #{result.failure}.")
45
+ end
46
+ end
38
47
  end
39
48
 
40
49
  #
data/lib/miteru/kit.rb CHANGED
@@ -25,6 +25,8 @@ module Miteru
25
25
  # @param [String] source
26
26
  #
27
27
  def initialize(url, source:)
28
+ super()
29
+
28
30
  @url = url
29
31
  @source = source
30
32
 
@@ -37,7 +39,6 @@ module Miteru
37
39
  def valid?
38
40
  # make a HEAD request for the validation
39
41
  before_validation
40
-
41
42
  valid_ext? && reachable? && valid_mime_type? && valid_content_length?
42
43
  end
43
44
 
@@ -110,7 +111,7 @@ module Miteru
110
111
  end
111
112
 
112
113
  def http
113
- HTTP::Factory.build
114
+ HTTP::Factory.build(raise_exception: false)
114
115
  end
115
116
 
116
117
  def before_validation
@@ -11,6 +11,10 @@ module Miteru
11
11
  raise NotImplementedError
12
12
  end
13
13
 
14
+ def name
15
+ @name ||= self.class.to_s.split("::").last
16
+ end
17
+
14
18
  class << self
15
19
  def inherited(child)
16
20
  super
@@ -9,10 +9,7 @@ module Miteru
9
9
  def call(website)
10
10
  return unless callable?
11
11
 
12
- kits = website.kits.select(&:downloaded?)
13
- return unless kits.any?
14
-
15
- kits.each { |kit| submit(kit.url) }
12
+ website.kits.each { |kit| submit(kit.url) }
16
13
  end
17
14
 
18
15
  def callable?
@@ -33,7 +30,7 @@ module Miteru
33
30
  end
34
31
 
35
32
  def timeout
36
- Miteru.config.timeout
33
+ Miteru.config.api_timeout
37
34
  end
38
35
 
39
36
  def tags
@@ -45,7 +42,7 @@ module Miteru
45
42
  end
46
43
 
47
44
  def submit(url)
48
- http.post("/api/v1/scan/", json: {tags:, visibility:, url:})
45
+ http.post("https://urlscan.io/api/v1/scan/", json: {tags:, visibility:, url:})
49
46
  end
50
47
  end
51
48
  end
@@ -6,10 +6,22 @@ module Miteru
6
6
  Miteru.logger.info("#{websites.length} websites loaded in total.") if verbose?
7
7
 
8
8
  if Miteru.sidekiq?
9
- websites.each { |website| Jobs::CrawleJob.perform_async(website.url, website.source) }
9
+ websites.each do |website|
10
+ Jobs::CrawleJob.perform_async(website.url, website.source)
11
+ Miteru.logger.info("Website:#{website.truncated_url} crawler job queued.") if verbose?
12
+ end
10
13
  else
11
14
  Miteru.logger.info("Use #{threads} thread(s).") if verbose?
12
- Parallel.each(websites, in_threads: threads) { |website| crawl(website) }
15
+ Parallel.each(websites, in_threads: threads) do |website|
16
+ Miteru.logger.info("Website:#{website.truncated_url} crawling started.") if verbose?
17
+
18
+ result = Crawler.result(website)
19
+ if result.success?
20
+ Miteru.logger.info("Crawler:#{website.truncated_url} succeeded.")
21
+ else
22
+ Miteru.logger.info("Crawler:#{website.truncated_url} failed - #{result.failure}.")
23
+ end
24
+ end
13
25
  end
14
26
  end
15
27
 
@@ -14,7 +14,14 @@ module Miteru
14
14
  #
15
15
  def perform(url, source)
16
16
  website = Miteru::Website.new(url, source:)
17
- with_db_connection { Crawler.call(website) }
17
+ with_db_connection do
18
+ result = Crawler.result(website)
19
+ if result.success?
20
+ Miteru.logger.info("Crawler:#{website.truncated_url} succeeded.")
21
+ else
22
+ Miteru.logger.info("Crawler:#{website.truncated_url} failed - #{result.failure}.")
23
+ end
24
+ end
18
25
  end
19
26
  end
20
27
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Miteru
4
- VERSION = "2.0.0"
4
+ VERSION = "2.0.2"
5
5
  end
@@ -33,15 +33,8 @@ module Miteru
33
33
  title.to_s.start_with? "Index of"
34
34
  end
35
35
 
36
- def has_kits?
37
- @has_kits ||= lambda do
38
- Try[Addressable::URI::InvalidURIError, Encoding::CompatibilityError, ::HTTP::Error, LL::ParserError,
39
- OpenSSL::SSL::SSLError, StatusError, ArgumentError] do
40
- !kits.empty?
41
- end.recover do
42
- false
43
- end.value!
44
- end.call
36
+ def kits?
37
+ kits.any?
45
38
  end
46
39
 
47
40
  def links
@@ -81,8 +74,9 @@ module Miteru
81
74
  Try[Addressable::URI::InvalidURIError, Encoding::CompatibilityError, ::HTTP::Error, LL::ParserError,
82
75
  OpenSSL::SSL::SSLError, StatusError, ArgumentError] do
83
76
  doc.css("a").filter_map { |a| a.get("href") }.map do |href|
84
- href = href.start_with?("/") ? href : "/#{href}"
85
- url + href
77
+ normalized_href = href.start_with?("/") ? href : "/#{href}"
78
+ normalized_url = url.end_with?("/") ? url.delete_suffix("/") : url
79
+ normalized_url + normalized_href
86
80
  end
87
81
  end.recover { [] }.value!
88
82
  end
data/miteru.gemspec CHANGED
@@ -40,6 +40,7 @@ Gem::Specification.new do |spec|
40
40
  spec.add_development_dependency 'webmock', '~> 3.19'
41
41
 
42
42
  spec.add_dependency 'activerecord', '7.1.3'
43
+ spec.add_dependency 'addressable', '2.8.6'
43
44
  spec.add_dependency 'anyway_config', '2.6.2'
44
45
  spec.add_dependency 'colorize', '1.1.0'
45
46
  spec.add_dependency 'dotenv', '2.8.1'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miteru
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-28 00:00:00.000000000 Z
11
+ date: 2024-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -206,6 +206,20 @@ dependencies:
206
206
  - - '='
207
207
  - !ruby/object:Gem::Version
208
208
  version: 7.1.3
209
+ - !ruby/object:Gem::Dependency
210
+ name: addressable
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '='
214
+ - !ruby/object:Gem::Version
215
+ version: 2.8.6
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '='
221
+ - !ruby/object:Gem::Version
222
+ version: 2.8.6
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: anyway_config
211
225
  requirement: !ruby/object:Gem::Requirement
@@ -584,9 +598,6 @@ files:
584
598
  - lib/miteru/version.rb
585
599
  - lib/miteru/web/application.rb
586
600
  - lib/miteru/website.rb
587
- - miteru-sidekiq.service
588
- - miteru.db-shm
589
- - miteru.db-wal
590
601
  - miteru.gemspec
591
602
  - renovate.json
592
603
  - screenshots/slack.png
@@ -1,13 +0,0 @@
1
- [Unit]
2
- Description=Miteru Sidekiq
3
- After=network.target
4
-
5
- [Service]
6
- Type=simple
7
- User=ninoseki
8
- WorkingDirectory=/opt/jsac_mihari_workshop
9
- ExecStart=/usr/bin/npx
10
- Restart=on-failure
11
-
12
- [Install]
13
- WantedBy = multi-user.target
data/miteru.db-shm DELETED
Binary file
data/miteru.db-wal DELETED
File without changes