tansaku 1.0.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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