tansaku 1.0.0 → 1.4.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: a179d2d95fc0e6c78d908ff8379ecefb609448f38284f77c21fcd92dd8a0b7ca
4
- data.tar.gz: 0eaecd595420390290a4e5b9f8a759b229e096037e60d058d58fd6af02dfe9f0
3
+ metadata.gz: 8c2340e0208f4ecb9fbbff0d1a866c1e8a5031d0e15f85afafa6ff8c933aa7ba
4
+ data.tar.gz: d0a4fc5f183f6a51f7a1784afe2b3a5e898383cb8084997d2d4243a594dbe608
5
5
  SHA512:
6
- metadata.gz: a4b252ff9c13cbe70109f8a15b77e9923672f15c5de2f93f26af6e6a0031ebdf0ed2c246e76968843e66f6e4eda0cdeae067b3886c8525237f5a412032780b63
7
- data.tar.gz: '01952d73467ad3fafce9b3726675c7f145f7db359052cb6682e533f7faa2c42022f8e2f38e07a3f63fe132ee36d8a8dfcbfdc61563c84d9b55d3a8536b1b3146'
6
+ metadata.gz: 74cf25e1e3a0553e55627fe26d6c62c1a20d13c2390d1c652a576432673b3fee4cf81f2a0f59c98142ea82679a6ab8c3b8b1e0c3737edaf1d77dad6dfd9e70ce
7
+ data.tar.gz: 52e4d995e93768c3f3ae6ac892c9c04ecb17215795fbf4897d3b70d02836688b5b70f9e06dd2adc86974eb3891c00080813b96b8b281b861d776285229fa3907
@@ -0,0 +1,41 @@
1
+ name: Ruby CI
2
+
3
+ on: [pull_request]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby: [2.7, "3.0", 3.1]
13
+
14
+ steps:
15
+ - uses: actions/checkout@v3
16
+ - name: Set up Ruby
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: ${{ matrix.ruby }}
20
+ bundler-cache: true
21
+ - name: Build and test with Rake
22
+ run: |
23
+ bundle exec rake
24
+
25
+ - name: Coveralls Parallel
26
+ uses: coverallsapp/github-action@master
27
+ with:
28
+ github-token: ${{ secrets.github_token }}
29
+ flag-name: run-${{ matrix.ruby-version }}
30
+ parallel: true
31
+
32
+ coverage:
33
+ name: Coverage
34
+ needs: test
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - name: Coveralls Finished
38
+ uses: coverallsapp/github-action@master
39
+ with:
40
+ github-token: ${{ secrets.github_token }}
41
+ parallel-finished: true
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/tansaku.svg)](https://badge.fury.io/rb/tansaku)
4
4
  [![Build Status](https://travis-ci.com/ninoseki/tansaku.svg?branch=master)](https://travis-ci.com/ninoseki/tansaku)
5
- [![Codacy Badge](https://api.codacy.com/project/badge/Grade/b8c176423480493182a6d52e56f6fd35)](https://www.codacy.com/app/ninoseki/tansaku)
6
5
  [![Coverage Status](https://coveralls.io/repos/github/ninoseki/tansaku/badge.svg?branch=master)](https://coveralls.io/github/ninoseki/tansaku?branch=master)
7
6
 
8
7
  Tansaku is a yet another dirbuster tool.
@@ -25,22 +24,21 @@ gem install tansaku
25
24
  ### As a CLI
26
25
 
27
26
  ```sh
28
- $ tansaku
29
- Commands:
30
- tansaku crawl URL # Crawl a given URL
31
- tansaku help [COMMAND] # Describe available commands or one specific command
32
-
33
- $ tansaku help crawl
27
+ $ tansaku help
34
28
  Usage:
35
29
  tansaku crawl URL
36
30
 
37
31
  Options:
38
- [--additional-list=ADDITIONAL_LIST] # Path to the file which includes additonal paths to crawl
39
- [--host=HOST] # Host header to use
40
- [--max-concurrent-requests=N] # Number of concurrent requests to use
41
- [--type=TYPE] # Type of a list to crawl (admin, backup, database, etc, log or all)
42
- # Default: all
43
- [--user-agent=USER_AGENT] # User-Agent header to use
32
+ [--additional-list=ADDITIONAL_LIST] # Path to the file which includes additional paths to crawl
33
+ [--headers=key:value] # HTTP headers to use
34
+ [--method=METHOD] # HTTP method to use
35
+ # Default: HEAD
36
+ [--body=BODY] # HTTP request body to use
37
+ [--timeout=N] # Timeout in seconds
38
+ [--max-concurrent-requests=N] # Max number of concurrent requests to use
39
+ [--ignore-certificate-errors], [--no-ignore-certificate-errors] # Whether to ignore certificate errors or not
40
+ [--type=TYPE] # Type of a list to crawl (admin, backup, database, etc, log or all)
41
+ # Default: all
44
42
 
45
43
  Crawl a given URL
46
44
  ```
@@ -59,8 +57,10 @@ See [/lib/tansaku/lists/](https://github.com/ninoseki/tansaku/blob/master/lib/ta
59
57
 
60
58
  ## Alternatives
61
59
 
62
- - [davidtavarez/weblocator](https://github.com/davidtavarez/weblocator)
63
- - [maurosoria/dirsearch](https://github.com/maurosoria/dirsearch)
60
+ - [maurosoria/dirsearch](https://github.com/maurosoria/dirsearch): Web path scanner
61
+ - [evilsocket/dirsearch](https://github.com/evilsocket/dirsearch): A Go implementation of dirsearch.
62
+ - [davidtavarez/weblocator](https://github.com/davidtavarez/weblocator): Just a better dirbuster
63
+ - [stefanoj3/dirstalk](https://github.com/stefanoj3/dirstalk): Modern alternative to dirbuster/dirb
64
64
 
65
65
  ## License
66
66
 
data/exe/tansaku CHANGED
@@ -5,4 +5,14 @@ $LOAD_PATH.unshift("#{__dir__}/../lib")
5
5
 
6
6
  require "tansaku"
7
7
 
8
- Tansaku::CLI.start
8
+ def is_help?
9
+ ARGV.length == 1 && ARGV.first.casecmp("help").zero?
10
+ end
11
+
12
+ ARGV.unshift(Tansaku::CLI.default_task) unless Tansaku::CLI.all_tasks.key?(ARGV[0])
13
+
14
+ if is_help?
15
+ Tansaku::CLI.start(["help", Tansaku::CLI.default_task] )
16
+ else
17
+ Tansaku::CLI.start(ARGV)
18
+ end
data/lib/tansaku/cli.rb CHANGED
@@ -7,13 +7,16 @@ require "json"
7
7
  module Tansaku
8
8
  class CLI < Thor
9
9
  desc "crawl URL", "Crawl a given URL"
10
- method_option :additional_list, desc: "Path to the file which includes additonal paths to crawl"
11
- method_option :host, type: :string, desc: "Host header to use"
12
- method_option :max_concurrent_requests, type: :numeric, desc: "Number of concurrent requests to use"
10
+ method_option :additional_list, desc: "Path to the file which includes additional paths to crawl"
11
+ method_option :headers, type: :hash, default: {}, desc: "HTTP headers to use"
12
+ method_option :method, type: :string, default: "HEAD", desc: "HTTP method to use"
13
+ method_option :body, type: :string, required: false, default: nil, desc: "HTTP request body to use"
14
+ method_option :timeout, type: :numeric, required: false, default: nil, desc: "Timeout in seconds"
15
+ method_option :max_concurrent_requests, type: :numeric, desc: "Max number of concurrent requests to use"
16
+ method_option :ignore_certificate_errors, type: :boolean, default: false, desc: "Whether to ignore certificate errors or not"
13
17
  method_option :type, desc: "Type of a list to crawl (admin, backup, database, etc, log or all)", default: "all"
14
- method_option :user_agent, type: :string, desc: "User-Agent header to use"
15
18
  def crawl(url)
16
- params = options.compact.map { |k, v| [k.to_sym, v] }.to_h
19
+ params = options.compact.transform_keys(&:to_sym)
17
20
  begin
18
21
  crawler = Crawler.new(url, **params)
19
22
  results = crawler.crawl
@@ -22,5 +25,13 @@ module Tansaku
22
25
  puts e
23
26
  end
24
27
  end
28
+
29
+ default_command :crawl
30
+
31
+ class << self
32
+ def exit_on_failure?
33
+ true
34
+ end
35
+ end
25
36
  end
26
37
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "async/http/internet"
4
3
  require "async"
5
4
  require "async/barrier"
6
5
  require "async/semaphore"
@@ -12,62 +11,107 @@ require "tansaku/monkey_patch"
12
11
 
13
12
  module Tansaku
14
13
  class Crawler
15
- DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
14
+ DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
16
15
 
16
+ # @return [String]
17
17
  attr_reader :base_uri
18
18
 
19
19
  attr_reader :additional_list
20
- attr_reader :host
20
+
21
+ # @return [Integer]
21
22
  attr_reader :max_concurrent_requests
23
+
24
+ # @return [String]
22
25
  attr_reader :type
23
- attr_reader :user_agent
26
+
27
+ # @return [String]
28
+ attr_reader :method
29
+
30
+ # @return [String, nil]
31
+ attr_reader :body
32
+
33
+ # @return [Float, nil]
34
+ attr_reader :timeout
35
+
36
+ # @return [Boolean]
37
+ attr_reader :ignore_certificate_errors
24
38
 
25
39
  def initialize(
26
40
  base_uri,
27
41
  additional_list: nil,
28
- host: nil,
29
- max_concurrent_requests: Etc.nprocessors,
30
- type: "all",
31
- user_agent: DEFAULT_USER_AGENT
42
+ headers: {},
43
+ method: "HEAD",
44
+ body: nil,
45
+ timeout: nil,
46
+ max_concurrent_requests: nil,
47
+ ignore_certificate_errors: false,
48
+ type: "all"
32
49
  )
33
- @base_uri = URI.parse(base_uri)
50
+ @base_uri = URI.parse(base_uri.downcase)
34
51
  raise ArgumentError, "Invalid URI" unless valid_uri?
35
52
 
36
53
  @additional_list = additional_list
37
- unless additional_list.nil?
38
- raise ArgumentError, "Invalid path" unless valid_path?
39
- end
54
+ raise ArgumentError, "Invalid path" unless valid_additional_path?
55
+
56
+ @method = method.upcase
57
+ raise ArgumentError, "Invalid HTTP method" unless valid_method?
58
+
59
+ @headers = headers
60
+ @body = body
61
+
62
+ @timeout = timeout.nil? ? nil : timeout.to_f
63
+
64
+ @max_concurrent_requests = max_concurrent_requests || (Etc.nprocessors * 8)
65
+
66
+ @ignore_certificate_errors = ignore_certificate_errors
40
67
 
41
- @host = host
42
- @max_concurrent_requests = max_concurrent_requests
43
68
  @type = type
44
- @user_agent = user_agent
45
69
  end
46
70
 
47
71
  def crawl
48
72
  results = {}
49
- Async do
73
+
74
+ log_conditions
75
+
76
+ Async do |task|
50
77
  barrier = Async::Barrier.new
51
78
  semaphore = Async::Semaphore.new(max_concurrent_requests, parent: barrier)
52
- internet = Async::HTTP::Internet.new
79
+ internet = Internet.new
53
80
 
54
81
  paths.each do |path|
55
82
  semaphore.async do
56
83
  url = url_for(path)
57
- res = internet.head(url, default_request_headers)
58
84
 
59
- results[url] = res.status if online?(res.status)
85
+ res = dispatch_http_request(task, internet, url)
86
+ next unless online?(res.status)
87
+
88
+ log = [method, url, res.status].join(",")
89
+ Tansaku.logger.info(log)
90
+
91
+ results[url] = res.status
60
92
  rescue Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, EOFError, OpenSSL::SSL::SSLError, Async::TimeoutError
61
93
  next
62
94
  end
63
95
  end
64
96
  barrier.wait
65
97
  end
98
+
66
99
  results
67
100
  end
68
101
 
69
102
  private
70
103
 
104
+ def log_conditions
105
+ Tansaku.logger.info("Start crawling with the following conditions:")
106
+ Tansaku.logger.info("URLs: #{paths.length} URLs to crawl")
107
+ Tansaku.logger.info("Method: #{method}")
108
+ Tansaku.logger.info("Timeout: #{timeout || "nil"}")
109
+ Tansaku.logger.info("Headers: #{request_headers}")
110
+ Tansaku.logger.info("Body: #{body}")
111
+ Tansaku.logger.info("Ignore certificate errors: #{ignore_certificate_errors}")
112
+ Tansaku.logger.info("Concurrency: #{max_concurrent_requests} requests at max")
113
+ end
114
+
71
115
  def online?(status)
72
116
  [200, 204, 301, 302, 307, 401, 403].include? status.to_i
73
117
  end
@@ -76,14 +120,22 @@ module Tansaku
76
120
  ["http", "https"].include? base_uri.scheme
77
121
  end
78
122
 
79
- def valid_path?
123
+ def valid_additional_path?
124
+ return true if additional_list.nil?
125
+
80
126
  File.exist?(additional_list)
81
127
  end
82
128
 
129
+ def valid_method?
130
+ Protocol::HTTP::Methods.valid? method
131
+ end
132
+
83
133
  def paths
84
- paths = Path.get_by_type(type)
85
- paths += File.readlines(File.expand_path(additional_list, __dir__)) if additional_list
86
- paths.map(&:chomp).compact
134
+ @paths ||= [].tap do |out|
135
+ paths = Path.get_by_type(type)
136
+ paths += File.readlines(additional_list) if additional_list
137
+ out << paths.filter_map(&:chomp)
138
+ end.flatten.uniq
87
139
  end
88
140
 
89
141
  def url_for(path)
@@ -94,8 +146,40 @@ module Tansaku
94
146
  paths.map { |path| url_for path }
95
147
  end
96
148
 
97
- def default_request_headers
98
- @default_request_headers ||= { "host" => host, "user-agent" => user_agent }.compact
149
+ def request_headers
150
+ @request_headers ||= @headers.tap do |headers|
151
+ upcase_keys = headers.keys.map(&:downcase).map(&:to_s)
152
+ headers["user-agent"] = DEFAULT_USER_AGENT unless upcase_keys.include?("user-agent")
153
+ end.compact
154
+ end
155
+
156
+ def ssl_verify_mode
157
+ ignore_certificate_errors ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER
158
+ end
159
+
160
+ def ssl_context
161
+ @ssl_context ||= OpenSSL::SSL::SSLContext.new.tap do |context|
162
+ context.set_params(verify_mode: ssl_verify_mode)
163
+ end
164
+ end
165
+
166
+ #
167
+ # Dispatch an HTTP request
168
+ #
169
+ # @param [Async::Task] task
170
+ # @param [Tansaku::Internet] internet
171
+ # @param [String] url
172
+ #
173
+ # @return [Async::HTTP::Protocol::Response]
174
+ #
175
+ def dispatch_http_request(task, internet, url)
176
+ endpoint = Async::HTTP::Endpoint.parse(url, ssl_context: ssl_context)
177
+
178
+ return internet.call(method, endpoint, request_headers, body) if timeout.nil?
179
+
180
+ task.with_timeout(timeout) do
181
+ internet.call(method, endpoint, request_headers, body)
182
+ end
99
183
  end
100
184
  end
101
185
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "async/http/internet"
4
+
5
+ module Tansaku
6
+ class Internet < Async::HTTP::Internet
7
+ def call(method, url_or_endpoint, headers = nil, body = nil)
8
+ endpoint = if url_or_endpoint.is_a?(Async::HTTP::Endpoint)
9
+ url_or_endpoint
10
+ else
11
+ Async::HTTP::Endpoint.parse(url_or_endpoint)
12
+ end
13
+ key = host_key(endpoint)
14
+
15
+ client = @clients.fetch(key) do
16
+ @clients[key] = client_for(endpoint)
17
+ end
18
+
19
+ body = Async::HTTP::Body::Buffered.wrap(body)
20
+ headers = ::Protocol::HTTP::Headers[headers]
21
+
22
+ request = ::Protocol::HTTP::Request.new(endpoint.scheme, endpoint.authority, method, endpoint.path, nil, headers, body)
23
+
24
+ client.call(request)
25
+ end
26
+
27
+ ::Protocol::HTTP::Methods.each do |_name, verb|
28
+ define_method(verb.downcase) do |url_or_endpoint, headers = nil, body = nil|
29
+ url_or_endpoint = url_or_endpoint.to_str unless url_or_endpoint.is_a?(Async::HTTP::Endpoint)
30
+ call(verb, url_or_endpoint, headers, body)
31
+ end
32
+ end
33
+ end
34
+ end
File without changes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tansaku
4
- VERSION = "1.0.0"
4
+ VERSION = "1.4.0"
5
5
  end
data/lib/tansaku.rb CHANGED
@@ -1,8 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "tansaku/version"
4
+
5
+ require "tansaku/internet"
4
6
  require "tansaku/path"
7
+
5
8
  require "tansaku/crawler"
9
+
6
10
  require "tansaku/cli"
7
11
 
8
- module Tansaku; end
12
+ require "memist"
13
+ require "semantic_logger"
14
+
15
+ module Tansaku
16
+ class << self
17
+ include Memist::Memoizable
18
+
19
+ def logger
20
+ SemanticLogger.default_level = :info
21
+ SemanticLogger.add_appender(io: $stderr, formatter: :color)
22
+ SemanticLogger["Tansaku"]
23
+ end
24
+ memoize :logger
25
+ end
26
+ end
data/renovate.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ]
5
+ }
data/tansaku.gemspec CHANGED
@@ -15,23 +15,29 @@ Gem::Specification.new do |spec|
15
15
  spec.homepage = "https://github.com/ninoseki/tansaku"
16
16
  spec.license = "MIT"
17
17
 
18
+ spec.metadata['rubygems_mfa_required'] = 'true'
19
+
18
20
  # Specify which files should be added to the gem when it is released.
19
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
21
23
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
24
  end
23
25
  spec.bindir = "exe"
24
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
27
  spec.require_paths = ["lib"]
26
28
 
27
- spec.add_development_dependency "bundler", "~> 2.1"
28
- spec.add_development_dependency "coveralls", "~> 0.8"
29
+ spec.add_development_dependency "bundler", "~> 2.3"
30
+ spec.add_development_dependency "coveralls_reborn", "~> 0.24"
29
31
  spec.add_development_dependency "glint", "~> 0.1"
30
32
  spec.add_development_dependency "rake", "~> 13.0"
31
- spec.add_development_dependency "rspec", "~> 3.9"
32
- spec.add_development_dependency "webmock", "~> 3.8"
33
+ spec.add_development_dependency "rspec", "~> 3.11"
34
+ spec.add_development_dependency "simplecov-lcov", "~> 0.8.0"
35
+ spec.add_development_dependency "webmock", "~> 3.14"
36
+ spec.add_development_dependency "webrick", "~> 1.7"
33
37
 
34
- spec.add_dependency "async", "~> 1.26"
35
- spec.add_dependency "async-http", "~> 0.52"
36
- spec.add_dependency "thor", "~> 1.0"
38
+ spec.add_dependency "async", "~> 1.30"
39
+ spec.add_dependency "async-http", "~> 0.56"
40
+ spec.add_dependency "memist", "~> 2.0"
41
+ spec.add_dependency "semantic_logger", "~> 4.10"
42
+ spec.add_dependency "thor", "~> 1.2"
37
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tansaku
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.4.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: 2020-07-20 00:00:00.000000000 Z
11
+ date: 2022-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.1'
19
+ version: '2.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.1'
26
+ version: '2.3'
27
27
  - !ruby/object:Gem::Dependency
28
- name: coveralls
28
+ name: coveralls_reborn
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.8'
33
+ version: '0.24'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.8'
40
+ version: '0.24'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: glint
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -72,70 +72,126 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.9'
75
+ version: '3.11'
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: '3.9'
82
+ version: '3.11'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov-lcov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.8.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.8.0
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: webmock
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '3.8'
103
+ version: '3.14'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.14'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webrick
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.7'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
93
121
  requirements:
94
122
  - - "~>"
95
123
  - !ruby/object:Gem::Version
96
- version: '3.8'
124
+ version: '1.7'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: async
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - "~>"
102
130
  - !ruby/object:Gem::Version
103
- version: '1.26'
131
+ version: '1.30'
104
132
  type: :runtime
105
133
  prerelease: false
106
134
  version_requirements: !ruby/object:Gem::Requirement
107
135
  requirements:
108
136
  - - "~>"
109
137
  - !ruby/object:Gem::Version
110
- version: '1.26'
138
+ version: '1.30'
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: async-http
113
141
  requirement: !ruby/object:Gem::Requirement
114
142
  requirements:
115
143
  - - "~>"
116
144
  - !ruby/object:Gem::Version
117
- version: '0.52'
145
+ version: '0.56'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.56'
153
+ - !ruby/object:Gem::Dependency
154
+ name: memist
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: semantic_logger
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '4.10'
118
174
  type: :runtime
119
175
  prerelease: false
120
176
  version_requirements: !ruby/object:Gem::Requirement
121
177
  requirements:
122
178
  - - "~>"
123
179
  - !ruby/object:Gem::Version
124
- version: '0.52'
180
+ version: '4.10'
125
181
  - !ruby/object:Gem::Dependency
126
182
  name: thor
127
183
  requirement: !ruby/object:Gem::Requirement
128
184
  requirements:
129
185
  - - "~>"
130
186
  - !ruby/object:Gem::Version
131
- version: '1.0'
187
+ version: '1.2'
132
188
  type: :runtime
133
189
  prerelease: false
134
190
  version_requirements: !ruby/object:Gem::Requirement
135
191
  requirements:
136
192
  - - "~>"
137
193
  - !ruby/object:Gem::Version
138
- version: '1.0'
194
+ version: '1.2'
139
195
  description: Yet another dirbuster tool
140
196
  email:
141
197
  - manabu.niseki@gmail.com
@@ -145,9 +201,9 @@ extensions: []
145
201
  extra_rdoc_files: []
146
202
  files:
147
203
  - ".gitattributes"
204
+ - ".github/workflows/test.yml"
148
205
  - ".gitignore"
149
206
  - ".rspec"
150
- - ".travis.yml"
151
207
  - Gemfile
152
208
  - LICENSE
153
209
  - README.md
@@ -158,19 +214,23 @@ files:
158
214
  - lib/tansaku.rb
159
215
  - lib/tansaku/cli.rb
160
216
  - lib/tansaku/crawler.rb
217
+ - lib/tansaku/internet.rb
161
218
  - lib/tansaku/lists/admin.txt
162
219
  - lib/tansaku/lists/backup.txt
163
220
  - lib/tansaku/lists/database.txt
164
221
  - lib/tansaku/lists/etc.txt
165
222
  - lib/tansaku/lists/log.txt
223
+ - lib/tansaku/lists/none.txt
166
224
  - lib/tansaku/monkey_patch.rb
167
225
  - lib/tansaku/path.rb
168
226
  - lib/tansaku/version.rb
227
+ - renovate.json
169
228
  - tansaku.gemspec
170
229
  homepage: https://github.com/ninoseki/tansaku
171
230
  licenses:
172
231
  - MIT
173
- metadata: {}
232
+ metadata:
233
+ rubygems_mfa_required: 'true'
174
234
  post_install_message:
175
235
  rdoc_options: []
176
236
  require_paths:
@@ -186,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
246
  - !ruby/object:Gem::Version
187
247
  version: '0'
188
248
  requirements: []
189
- rubygems_version: 3.1.2
249
+ rubygems_version: 3.3.7
190
250
  signing_key:
191
251
  specification_version: 4
192
252
  summary: Yet another dirbuster tool
data/.travis.yml DELETED
@@ -1,9 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- cache: bundler
4
- rvm:
5
- - 2.6
6
- - 2.7
7
- before_install:
8
- - gem update --system
9
- - gem install bundler