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 +4 -4
- data/.github/workflows/test.yml +41 -0
- data/README.md +15 -15
- data/exe/tansaku +11 -1
- data/lib/tansaku/cli.rb +16 -5
- data/lib/tansaku/crawler.rb +109 -25
- data/lib/tansaku/internet.rb +34 -0
- data/lib/tansaku/lists/none.txt +0 -0
- data/lib/tansaku/version.rb +1 -1
- data/lib/tansaku.rb +19 -1
- data/renovate.json +5 -0
- data/tansaku.gemspec +14 -8
- metadata +80 -20
- data/.travis.yml +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c2340e0208f4ecb9fbbff0d1a866c1e8a5031d0e15f85afafa6ff8c933aa7ba
|
4
|
+
data.tar.gz: d0a4fc5f183f6a51f7a1784afe2b3a5e898383cb8084997d2d4243a594dbe608
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
[](https://badge.fury.io/rb/tansaku)
|
4
4
|
[](https://travis-ci.com/ninoseki/tansaku)
|
5
|
-
[](https://www.codacy.com/app/ninoseki/tansaku)
|
6
5
|
[](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]
|
39
|
-
[--
|
40
|
-
[--
|
41
|
-
|
42
|
-
|
43
|
-
[--
|
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
|
-
- [
|
63
|
-
- [
|
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
|
-
|
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
|
11
|
-
method_option :
|
12
|
-
method_option :
|
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.
|
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
|
data/lib/tansaku/crawler.rb
CHANGED
@@ -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/
|
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
|
-
|
20
|
+
|
21
|
+
# @return [Integer]
|
21
22
|
attr_reader :max_concurrent_requests
|
23
|
+
|
24
|
+
# @return [String]
|
22
25
|
attr_reader :type
|
23
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
38
|
-
|
39
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
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
|
85
|
-
|
86
|
-
|
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
|
98
|
-
@
|
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
|
data/lib/tansaku/version.rb
CHANGED
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
|
-
|
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/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
|
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.
|
28
|
-
spec.add_development_dependency "
|
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.
|
32
|
-
spec.add_development_dependency "
|
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.
|
35
|
-
spec.add_dependency "async-http", "~> 0.
|
36
|
-
spec.add_dependency "
|
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.
|
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:
|
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.
|
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.
|
26
|
+
version: '2.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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: '
|
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.
|
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.
|
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.
|
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: '
|
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.
|
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.
|
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.
|
249
|
+
rubygems_version: 3.3.7
|
190
250
|
signing_key:
|
191
251
|
specification_version: 4
|
192
252
|
summary: Yet another dirbuster tool
|