enchant 0.4.2 → 0.99.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.
- data/Gemfile +14 -0
- data/Gemfile.lock +37 -0
- data/VERSION +1 -1
- data/bin/enchant +51 -62
- data/enchant.gemspec +49 -26
- data/lib/enchant.rb +2 -96
- data/lib/enchant/engine.rb +68 -0
- data/lib/enchant/version.rb +92 -0
- metadata +145 -68
- data/.gitignore +0 -4
- data/test/test_enchant.rb +0 -8
data/Gemfile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
gem 'rainbow'
|
4
|
+
gem 'progressbar'
|
5
|
+
gem "awesome_print"
|
6
|
+
gem 'rake'
|
7
|
+
|
8
|
+
group :development do
|
9
|
+
gem "rspec", "~> 2.3.0"
|
10
|
+
gem "yard", "~> 0.6.0"
|
11
|
+
gem "bundler", "~> 1.0.0"
|
12
|
+
gem "jeweler", "~> 1.6.0"
|
13
|
+
gem "rcov", ">= 0"
|
14
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
awesome_print (1.0.2)
|
5
|
+
diff-lcs (1.1.3)
|
6
|
+
git (1.2.5)
|
7
|
+
jeweler (1.6.4)
|
8
|
+
bundler (~> 1.0)
|
9
|
+
git (>= 1.2.5)
|
10
|
+
rake
|
11
|
+
progressbar (0.9.2)
|
12
|
+
rainbow (1.1.3)
|
13
|
+
rake (0.9.2.2)
|
14
|
+
rcov (0.9.11)
|
15
|
+
rspec (2.3.0)
|
16
|
+
rspec-core (~> 2.3.0)
|
17
|
+
rspec-expectations (~> 2.3.0)
|
18
|
+
rspec-mocks (~> 2.3.0)
|
19
|
+
rspec-core (2.3.1)
|
20
|
+
rspec-expectations (2.3.0)
|
21
|
+
diff-lcs (~> 1.1.2)
|
22
|
+
rspec-mocks (2.3.0)
|
23
|
+
yard (0.6.8)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
awesome_print
|
30
|
+
bundler (~> 1.0.0)
|
31
|
+
jeweler (~> 1.6.0)
|
32
|
+
progressbar
|
33
|
+
rainbow
|
34
|
+
rake
|
35
|
+
rcov
|
36
|
+
rspec (~> 2.3.0)
|
37
|
+
yard (~> 0.6.0)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.99.0
|
data/bin/enchant
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require '
|
3
|
-
require 'lib/Enchant'
|
2
|
+
require 'enchant'
|
4
3
|
require 'rainbow'
|
4
|
+
require 'awesome_print'
|
5
5
|
require 'progressbar'
|
6
6
|
require 'getoptlong'
|
7
|
-
require 'rdoc/usage'
|
8
7
|
|
9
8
|
opts = GetoptLong.new(
|
10
9
|
[ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
@@ -17,76 +16,66 @@ opts = GetoptLong.new(
|
|
17
16
|
[ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT]
|
18
17
|
)
|
19
18
|
|
20
|
-
|
21
|
-
ping = -1
|
22
|
-
wordlist = 'basic.txt'
|
23
|
-
host = nil
|
24
|
-
port = nil
|
25
|
-
domain = nil
|
19
|
+
options = { :flood=> -1, :ping=>-1, :wordlist=>'basic.txt', :host=>nil, :port=>80, :domain=>nil }
|
26
20
|
|
27
21
|
opts.each do |opt, arg|
|
28
22
|
case opt
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
when '--domain'
|
54
|
-
domain = arg
|
55
|
-
end
|
23
|
+
when '--help'
|
24
|
+
ap "enchant: there is no doc at the moment... sorry."
|
25
|
+
exit 0
|
26
|
+
when '--version'
|
27
|
+
ap "enchant " + Enchant::Version.version[:string]
|
28
|
+
exit 0
|
29
|
+
when '--flood'
|
30
|
+
if arg.to_i <= 0
|
31
|
+
ap "enchant: requests number must be positive"
|
32
|
+
exit 1
|
33
|
+
else
|
34
|
+
options[:flood] = arg.to_i
|
35
|
+
end
|
36
|
+
when '--ping'
|
37
|
+
options[:ping] = 0
|
38
|
+
when '--host'
|
39
|
+
options[:host] = arg
|
40
|
+
when '--port'
|
41
|
+
options[:port] = arg.to_i
|
42
|
+
when '--wordlist'
|
43
|
+
options[:wordlist] = arg
|
44
|
+
when '--domain'
|
45
|
+
options[:domain] = arg
|
46
|
+
end
|
56
47
|
end
|
57
48
|
|
58
|
-
if host
|
49
|
+
if options[:host].nil? && options[:domain].nil?
|
59
50
|
if ARGV.length != 1
|
60
|
-
|
51
|
+
ap "enchant: missing url argument (try --help)"
|
61
52
|
exit 0
|
62
53
|
end
|
63
54
|
|
64
55
|
url = ARGV.shift
|
65
|
-
e = Enchant.new(url)
|
56
|
+
e = Enchant::Engine.new(url)
|
66
57
|
|
67
58
|
else
|
68
|
-
if domain
|
69
|
-
e = Enchant.new
|
70
|
-
e.host = host
|
71
|
-
e.port = port
|
59
|
+
if options[:domain].nil?
|
60
|
+
e = Enchant::Engine.new
|
61
|
+
e.host = options[:host]
|
62
|
+
e.port = options[:port]
|
72
63
|
else
|
73
|
-
e = Enchant.new
|
74
|
-
e.domain = domain
|
64
|
+
e = Enchant::Engine.new
|
65
|
+
e.domain = options[:domain]
|
75
66
|
end
|
76
67
|
end
|
77
68
|
|
78
|
-
|
79
|
-
|
80
|
-
if flood != -1
|
69
|
+
if options[:flood] != -1
|
81
70
|
if (! e.is_sane?)
|
82
71
|
puts 'Automatic url parsing failed, please consider providing such information by hand.'
|
83
72
|
exit 1
|
84
73
|
end
|
85
|
-
puts "Flooding "+e.host+" with #{flood} requests"
|
86
|
-
|
87
|
-
pbar = ProgressBar.new("reqs", flood)
|
74
|
+
puts "Flooding "+e.host+" with #{options[:flood]} requests"
|
75
|
+
|
76
|
+
pbar = ProgressBar.new("reqs", options[:flood])
|
88
77
|
start_time = Time.now
|
89
|
-
(1..flood).each do |i|
|
78
|
+
(1..options[:flood]).each do |i|
|
90
79
|
pbar.inc
|
91
80
|
e.get('/')
|
92
81
|
end
|
@@ -95,16 +84,16 @@ if flood != -1
|
|
95
84
|
exit 0
|
96
85
|
end
|
97
86
|
|
98
|
-
if ping != -1
|
87
|
+
if options[:ping] != -1
|
99
88
|
if (! e.is_sane?)
|
100
89
|
puts 'Automatic url parsing failed, please consider providing such information by hand.'
|
101
90
|
exit 1
|
102
91
|
end
|
103
92
|
puts "Pinging "+e.host+" onto port " + e.port.to_s
|
104
|
-
|
93
|
+
|
105
94
|
start_time = Time.now
|
106
95
|
e.get("/")
|
107
|
-
if e.
|
96
|
+
if e.up?
|
108
97
|
puts e.host + " seems to be alive"
|
109
98
|
else
|
110
99
|
puts e.host + " seems having some trouble ("+e.code+")"
|
@@ -114,7 +103,7 @@ if ping != -1
|
|
114
103
|
exit 0
|
115
104
|
end
|
116
105
|
|
117
|
-
if domain
|
106
|
+
if !options[:domain].nil?
|
118
107
|
if (! e.is_sane?)
|
119
108
|
puts 'Automatic url parsing failed, please consider providing such information by hand.'
|
120
109
|
exit 1
|
@@ -122,7 +111,7 @@ if domain != -1
|
|
122
111
|
puts "scanning for " + e.domain + " for subdomains"
|
123
112
|
e.list(wordlist)
|
124
113
|
list = e.fuzz
|
125
|
-
|
114
|
+
|
126
115
|
if list == nil
|
127
116
|
puts "Enchant is giving up since no wordlist file is available"
|
128
117
|
exit -1
|
@@ -140,7 +129,7 @@ if domain != -1
|
|
140
129
|
end
|
141
130
|
|
142
131
|
puts "Sending probe to #{url}"
|
143
|
-
e.list(wordlist)
|
132
|
+
e.list(options[:wordlist])
|
144
133
|
list = e.fuzz()
|
145
134
|
if list == nil
|
146
135
|
puts "Enchant is giving up since no wordlist file is available"
|
@@ -151,10 +140,10 @@ pbar = ProgressBar.new("urls", list.size)
|
|
151
140
|
|
152
141
|
list.each {|x|
|
153
142
|
pbar.inc
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
143
|
+
code = e.get("/".concat(x).chomp)
|
144
|
+
unless code != 404
|
145
|
+
case code
|
146
|
+
# just hide 404s... when "404" then puts "Status is #{code} for /#{x.chomp}".foreground(:yellow)
|
158
147
|
when "200" then puts "Status is #{code} for /#{x.chomp}".foreground(:green)
|
159
148
|
when "500" then puts "Status is #{code} for /#{x.chomp}".foreground(:red)
|
160
149
|
else
|
data/enchant.gemspec
CHANGED
@@ -1,56 +1,79 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.
|
7
|
+
s.name = "enchant"
|
8
|
+
s.version = "0.99.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Paolo Perego"]
|
12
|
-
s.date =
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.email = %q{paolo@armoredcode.com}
|
12
|
+
s.date = "2012-01-08"
|
13
|
+
s.description = "Enchant is tool aimed to discover web application directory and pages by fuzzing the requests using a dictionary approach"
|
14
|
+
s.email = "paolo@armoredcode.com"
|
16
15
|
s.executables = ["enchant"]
|
17
16
|
s.extra_rdoc_files = [
|
18
17
|
"ChangeLog",
|
19
|
-
|
18
|
+
"README.textile"
|
20
19
|
]
|
21
20
|
s.files = [
|
22
|
-
"
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
"COPYING",
|
22
|
+
"ChangeLog",
|
23
|
+
"Gemfile",
|
24
|
+
"Gemfile.lock",
|
25
|
+
"README.textile",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"bin/enchant",
|
29
|
+
"enchant.gemspec",
|
30
|
+
"lib/enchant.rb",
|
31
|
+
"lib/enchant/engine.rb",
|
32
|
+
"lib/enchant/version.rb"
|
32
33
|
]
|
33
|
-
s.homepage =
|
34
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
34
|
+
s.homepage = "http://github.com/thesp0nge/enchant"
|
35
35
|
s.require_paths = ["lib"]
|
36
|
-
s.rubygems_version =
|
37
|
-
s.summary =
|
38
|
-
s.test_files = [
|
39
|
-
"test/test_enchant.rb"
|
40
|
-
]
|
36
|
+
s.rubygems_version = "1.8.10"
|
37
|
+
s.summary = "Your magical web application fuzzer"
|
41
38
|
|
42
39
|
if s.respond_to? :specification_version then
|
43
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
44
40
|
s.specification_version = 3
|
45
41
|
|
46
42
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
43
|
+
s.add_runtime_dependency(%q<rainbow>, [">= 0"])
|
44
|
+
s.add_runtime_dependency(%q<progressbar>, [">= 0"])
|
45
|
+
s.add_runtime_dependency(%q<awesome_print>, [">= 0"])
|
46
|
+
s.add_runtime_dependency(%q<rake>, [">= 0"])
|
47
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
48
|
+
s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
|
49
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
50
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.0"])
|
51
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
47
52
|
s.add_runtime_dependency(%q<ruby-progressbar>, [">= 0"])
|
48
53
|
s.add_runtime_dependency(%q<rainbow>, [">= 0"])
|
49
54
|
else
|
55
|
+
s.add_dependency(%q<rainbow>, [">= 0"])
|
56
|
+
s.add_dependency(%q<progressbar>, [">= 0"])
|
57
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
58
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
59
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
60
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
61
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
62
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
63
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
50
64
|
s.add_dependency(%q<ruby-progressbar>, [">= 0"])
|
51
65
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
52
66
|
end
|
53
67
|
else
|
68
|
+
s.add_dependency(%q<rainbow>, [">= 0"])
|
69
|
+
s.add_dependency(%q<progressbar>, [">= 0"])
|
70
|
+
s.add_dependency(%q<awesome_print>, [">= 0"])
|
71
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
72
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
73
|
+
s.add_dependency(%q<yard>, ["~> 0.6.0"])
|
74
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
75
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.0"])
|
76
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
54
77
|
s.add_dependency(%q<ruby-progressbar>, [">= 0"])
|
55
78
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
56
79
|
end
|
data/lib/enchant.rb
CHANGED
@@ -1,97 +1,3 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require 'uri'
|
4
|
-
require 'ping'
|
5
|
-
require 'Net/ping'
|
6
|
-
include Net
|
1
|
+
require 'enchant/version'
|
2
|
+
require 'enchant/engine'
|
7
3
|
|
8
|
-
|
9
|
-
class Enchant
|
10
|
-
attr_reader :server, :code
|
11
|
-
attr_accessor :host, :port, :domain
|
12
|
-
|
13
|
-
VERSION = '0.4.0'
|
14
|
-
|
15
|
-
def initialize(*urls)
|
16
|
-
url = urls.pop || ""
|
17
|
-
|
18
|
-
|
19
|
-
if url != ""
|
20
|
-
tmp = URI.parse(url)
|
21
|
-
@host = tmp.host
|
22
|
-
@port = tmp.port
|
23
|
-
|
24
|
-
if @host == nil && @port == nil
|
25
|
-
@sane = nil
|
26
|
-
else
|
27
|
-
@sane = 1
|
28
|
-
end
|
29
|
-
else
|
30
|
-
@sane = 1
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def is_sane?
|
35
|
-
@sane
|
36
|
-
end
|
37
|
-
|
38
|
-
def list(wordlist)
|
39
|
-
begin
|
40
|
-
File.open(wordlist, 'r') { |f|
|
41
|
-
@list = f.readlines
|
42
|
-
}
|
43
|
-
rescue Errno::ENOENT
|
44
|
-
puts "It seems the wordlist file is not present (#{wordlist})"
|
45
|
-
@list = nil
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def fuzz(*)
|
50
|
-
# in future some perturbation will be done here
|
51
|
-
@list
|
52
|
-
end
|
53
|
-
|
54
|
-
def get(path)
|
55
|
-
http = Net::HTTP.new(host, port)
|
56
|
-
begin
|
57
|
-
response = http.get(path)
|
58
|
-
@code = response.code
|
59
|
-
rescue Net::HTTPBadResponse
|
60
|
-
puts #{$!}
|
61
|
-
@code=-1
|
62
|
-
rescue Errno::ETIMEDOUT
|
63
|
-
puts #{$!}
|
64
|
-
@code=-1
|
65
|
-
end
|
66
|
-
@code
|
67
|
-
end
|
68
|
-
|
69
|
-
def is_alive?
|
70
|
-
code.to_i==200
|
71
|
-
end
|
72
|
-
|
73
|
-
def ping?(host)
|
74
|
-
# TCP pinging
|
75
|
-
if Ping.pingecho(host)
|
76
|
-
return true
|
77
|
-
end
|
78
|
-
#else
|
79
|
-
# icmp = Net::Ping::ICMP.new(host)
|
80
|
-
# if icmp.ping?
|
81
|
-
# return true
|
82
|
-
# else
|
83
|
-
# return false
|
84
|
-
# end
|
85
|
-
#end
|
86
|
-
false
|
87
|
-
end
|
88
|
-
|
89
|
-
def to_s()
|
90
|
-
"Enchant v"+VERSION+" - (C) 2010, thesp0nge@gmail.com"
|
91
|
-
end
|
92
|
-
|
93
|
-
def self.version()
|
94
|
-
@version = File.exist?('VERSION') ? File.read('VERSION') : VERSION
|
95
|
-
"Enchant v"+@version
|
96
|
-
end
|
97
|
-
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
module Enchant
|
5
|
+
|
6
|
+
class Engine
|
7
|
+
attr_reader :server, :code
|
8
|
+
attr_accessor :host, :port, :domain
|
9
|
+
|
10
|
+
def initialize(*urls)
|
11
|
+
url = urls.pop || ""
|
12
|
+
|
13
|
+
if url != ""
|
14
|
+
tmp = URI.parse(url)
|
15
|
+
@host = tmp.host
|
16
|
+
@port = tmp.port
|
17
|
+
|
18
|
+
if @host == nil && @port == nil
|
19
|
+
@sane = nil
|
20
|
+
else
|
21
|
+
@sane = 1
|
22
|
+
end
|
23
|
+
else
|
24
|
+
@sane = 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def is_sane?
|
29
|
+
@sane
|
30
|
+
end
|
31
|
+
|
32
|
+
def list(wordlist)
|
33
|
+
begin
|
34
|
+
File.open(wordlist, 'r') { |f|
|
35
|
+
@list = f.readlines
|
36
|
+
}
|
37
|
+
rescue Errno::ENOENT
|
38
|
+
puts "It seems the wordlist file is not present (#{wordlist})"
|
39
|
+
@list = nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def fuzz(*)
|
44
|
+
# in future some perturbation will be done here
|
45
|
+
@list
|
46
|
+
end
|
47
|
+
|
48
|
+
def get(path)
|
49
|
+
http = Net::HTTP.new(host, port)
|
50
|
+
begin
|
51
|
+
response = http.get(path)
|
52
|
+
@code = response.code
|
53
|
+
rescue Net::HTTPBadResponse
|
54
|
+
puts #{$!}
|
55
|
+
@code=-1
|
56
|
+
rescue Errno::ETIMEDOUT
|
57
|
+
puts #{$!}
|
58
|
+
@code=-1
|
59
|
+
end
|
60
|
+
@code
|
61
|
+
end
|
62
|
+
|
63
|
+
def up?(site)
|
64
|
+
Net::HTTP.new(site).head('/').kind_of? Net::HTTPOK
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Enchant
|
2
|
+
# Handles enchant version number taken from VERSION file.
|
3
|
+
# The way Haml gem handles it's version.rb inspired me for creating this
|
4
|
+
# file.
|
5
|
+
class Version
|
6
|
+
|
7
|
+
# Returns a hash representing the version of enchant.
|
8
|
+
# The `:major`, `:minor`, and `:patch` keys have their respective numbers as Fixnums.
|
9
|
+
# The `:name` key has the name of the version.
|
10
|
+
# The `:string` key contains a human-readable string representation of the version.
|
11
|
+
# The `:number` key is the major, minor, and patch keys separated by periods.
|
12
|
+
# If enchant is checked out from Git, the `:rev` key will have the revision hash.
|
13
|
+
#
|
14
|
+
# For example:
|
15
|
+
#
|
16
|
+
# {
|
17
|
+
# :string => "0.1.4.160676a",
|
18
|
+
# :rev => "160676ab8924ef36639c7e82aa88a51a24d16949",
|
19
|
+
# :number => "0.1.4",
|
20
|
+
# :major => 0, :minor => 1, :patch => 4
|
21
|
+
# }
|
22
|
+
#
|
23
|
+
# If a prerelease version of enchant is being used,
|
24
|
+
# the `:string` and `:number` fields will reflect the full version
|
25
|
+
# (e.g. `"1.0.beta.1"`), and the `:patch` field will be `-1`.
|
26
|
+
#
|
27
|
+
# A `:prerelease` key will contain the name of the prerelease (e.g. `"beta"`),
|
28
|
+
# and a `:prerelease_number` key will contain the rerelease number.
|
29
|
+
#
|
30
|
+
# For example:
|
31
|
+
#
|
32
|
+
# {
|
33
|
+
# :string => "1.0.beta.1",
|
34
|
+
# :number => "1.0.beta.1",
|
35
|
+
# :major => 1, :minor => 0, :patch => -1,
|
36
|
+
# :prerelease => "beta",
|
37
|
+
# :prerelease_number => 1
|
38
|
+
# }
|
39
|
+
#
|
40
|
+
# @return [{Symbol => String/Fixnum}] The version hash
|
41
|
+
def self.version
|
42
|
+
return @@version if defined?(@@version)
|
43
|
+
numbers = File.read('VERSION').strip.split('.').map {|n| n =~ /^[0-9]+$/ ? n.to_i : n}
|
44
|
+
@@version = {
|
45
|
+
:major => numbers[0],
|
46
|
+
:minor => numbers[1],
|
47
|
+
:patch => numbers[2]
|
48
|
+
}
|
49
|
+
if numbers[3].is_a?(String)
|
50
|
+
@@version[:patch] = -1
|
51
|
+
@@version[:prerelease] = numbers[3]
|
52
|
+
@@version[:prerelease_number] = numbers[4]
|
53
|
+
end
|
54
|
+
@@version[:number] = numbers.join('.')
|
55
|
+
@@version[:string] = @@version[:number].dup
|
56
|
+
|
57
|
+
rev = revision_number
|
58
|
+
@@version[:rev] = rev
|
59
|
+
unless rev[0] == ?(
|
60
|
+
@@version[:string] << "." << rev[0...7]
|
61
|
+
end
|
62
|
+
|
63
|
+
@@version
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.revision_number
|
67
|
+
if File.exists?('REVISION')
|
68
|
+
rev = File.read('REVISION').strip
|
69
|
+
return rev unless rev =~ /^([a-f0-9]+|\(.*\))$/ || rev == '(unknown)'
|
70
|
+
end
|
71
|
+
|
72
|
+
return unless File.exists?('.git/HEAD')
|
73
|
+
rev = File.read('.git/HEAD').strip
|
74
|
+
return rev unless rev =~ /^ref: (.*)$/
|
75
|
+
|
76
|
+
ref_name = $1
|
77
|
+
ref_file = "./.git/#{ref_name}"
|
78
|
+
info_file = "./.git/info/refs"
|
79
|
+
return File.read(ref_file).strip if File.exists?(ref_file)
|
80
|
+
return unless File.exists?(info_file)
|
81
|
+
File.open(info_file) do |f|
|
82
|
+
f.each do |l|
|
83
|
+
sha, ref = l.strip.split("\t", 2)
|
84
|
+
next unless ref == ref_name
|
85
|
+
return sha
|
86
|
+
end
|
87
|
+
end
|
88
|
+
return nil
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
metadata
CHANGED
@@ -1,104 +1,181 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: enchant
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 4
|
9
|
-
- 2
|
10
|
-
version: 0.4.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.99.0
|
5
|
+
prerelease:
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Paolo Perego
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
date: 2012-01-08 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rainbow
|
16
|
+
requirement: &74330310 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
|
24
|
+
version_requirements: *74330310
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: progressbar
|
27
|
+
requirement: &74329910 !ruby/object:Gem::Requirement
|
25
28
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
30
|
-
segments:
|
31
|
-
- 0
|
32
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
33
|
type: :runtime
|
34
|
-
version_requirements: *id001
|
35
|
-
- !ruby/object:Gem::Dependency
|
36
|
-
name: rainbow
|
37
34
|
prerelease: false
|
38
|
-
|
35
|
+
version_requirements: *74329910
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: awesome_print
|
38
|
+
requirement: &74329590 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *74329590
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: &73873170 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *73873170
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: rspec
|
60
|
+
requirement: &73872830 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 2.3.0
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *73872830
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: yard
|
71
|
+
requirement: &73872380 !ruby/object:Gem::Requirement
|
39
72
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
73
|
+
requirements:
|
74
|
+
- - ~>
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.6.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *73872380
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: bundler
|
82
|
+
requirement: &73872100 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ~>
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 1.0.0
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *73872100
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: jeweler
|
93
|
+
requirement: &73871830 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ~>
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 1.6.0
|
99
|
+
type: :development
|
100
|
+
prerelease: false
|
101
|
+
version_requirements: *73871830
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: rcov
|
104
|
+
requirement: &73871490 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: *73871490
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: ruby-progressbar
|
115
|
+
requirement: &73871190 !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
117
|
+
requirements:
|
118
|
+
- - ! '>='
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
47
121
|
type: :runtime
|
48
|
-
|
49
|
-
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: *73871190
|
124
|
+
- !ruby/object:Gem::Dependency
|
125
|
+
name: rainbow
|
126
|
+
requirement: &73870930 !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: *73870930
|
135
|
+
description: Enchant is tool aimed to discover web application directory and pages
|
136
|
+
by fuzzing the requests using a dictionary approach
|
50
137
|
email: paolo@armoredcode.com
|
51
|
-
executables:
|
138
|
+
executables:
|
52
139
|
- enchant
|
53
140
|
extensions: []
|
54
|
-
|
55
|
-
extra_rdoc_files:
|
141
|
+
extra_rdoc_files:
|
56
142
|
- ChangeLog
|
57
143
|
- README.textile
|
58
|
-
files:
|
59
|
-
- .gitignore
|
144
|
+
files:
|
60
145
|
- COPYING
|
61
146
|
- ChangeLog
|
147
|
+
- Gemfile
|
148
|
+
- Gemfile.lock
|
62
149
|
- README.textile
|
63
150
|
- Rakefile
|
64
151
|
- VERSION
|
65
152
|
- bin/enchant
|
66
153
|
- enchant.gemspec
|
67
154
|
- lib/enchant.rb
|
68
|
-
-
|
69
|
-
|
155
|
+
- lib/enchant/engine.rb
|
156
|
+
- lib/enchant/version.rb
|
70
157
|
homepage: http://github.com/thesp0nge/enchant
|
71
158
|
licenses: []
|
72
|
-
|
73
159
|
post_install_message:
|
74
|
-
rdoc_options:
|
75
|
-
|
76
|
-
require_paths:
|
160
|
+
rdoc_options: []
|
161
|
+
require_paths:
|
77
162
|
- lib
|
78
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
164
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
84
|
-
|
85
|
-
- 0
|
86
|
-
version: "0"
|
87
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ! '>='
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
170
|
none: false
|
89
|
-
requirements:
|
90
|
-
- -
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
|
93
|
-
segments:
|
94
|
-
- 0
|
95
|
-
version: "0"
|
171
|
+
requirements:
|
172
|
+
- - ! '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
96
175
|
requirements: []
|
97
|
-
|
98
176
|
rubyforge_project:
|
99
|
-
rubygems_version: 1.
|
177
|
+
rubygems_version: 1.8.10
|
100
178
|
signing_key:
|
101
179
|
specification_version: 3
|
102
180
|
summary: Your magical web application fuzzer
|
103
|
-
test_files:
|
104
|
-
- test/test_enchant.rb
|
181
|
+
test_files: []
|
data/.gitignore
DELETED