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