ronin-web 0.3.0.rc1 → 1.0.0.beta2
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 +7 -0
- data/.editorconfig +11 -0
- data/.github/workflows/ruby.yml +31 -0
- data/.gitignore +13 -0
- data/.mailmap +1 -0
- data/.ruby-version +1 -0
- data/COPYING.txt +3 -3
- data/ChangeLog.md +115 -70
- data/Gemfile +42 -37
- data/README.md +160 -145
- data/Rakefile +12 -3
- data/bin/ronin-web +9 -17
- data/data/new/nokogiri.rb.erb +12 -0
- data/data/new/server.rb.erb +22 -0
- data/data/new/spider.rb.erb +26 -0
- data/data/new/webapp/.gitignore +15 -0
- data/data/new/webapp/.ruby-version.erb +1 -0
- data/data/new/webapp/Dockerfile.erb +11 -0
- data/data/new/webapp/Gemfile +6 -0
- data/data/new/webapp/app.rb.erb +15 -0
- data/data/new/webapp/config.ru +4 -0
- data/data/new/webapp/docker-compose.yml.erb +9 -0
- data/gemspec.yml +38 -16
- data/lib/ronin/web/cli/command.rb +36 -0
- data/lib/ronin/web/cli/commands/diff.rb +106 -0
- data/lib/ronin/web/cli/commands/html.rb +174 -0
- data/lib/ronin/web/cli/commands/irb.rb +56 -0
- data/lib/ronin/web/cli/commands/new/nokogiri.rb +85 -0
- data/lib/ronin/web/cli/commands/new/server.rb +96 -0
- data/lib/ronin/web/cli/commands/new/spider.rb +315 -0
- data/lib/ronin/web/cli/commands/new/webapp.rb +123 -0
- data/lib/ronin/web/cli/commands/new.rb +64 -0
- data/lib/ronin/web/cli/commands/reverse_proxy.rb +215 -0
- data/lib/ronin/web/cli/commands/server.rb +155 -0
- data/lib/ronin/web/cli/commands/spider.rb +822 -0
- data/lib/ronin/web/cli/ruby_shell.rb +50 -0
- data/lib/ronin/web/cli.rb +49 -0
- data/lib/ronin/web/html.rb +85 -0
- data/lib/ronin/web/mechanize.rb +34 -36
- data/lib/ronin/web/root.rb +27 -0
- data/lib/ronin/web/version.rb +7 -10
- data/lib/ronin/web/xml.rb +85 -0
- data/lib/ronin/web.rb +372 -13
- data/man/ronin-web-diff.1 +41 -0
- data/man/ronin-web-diff.1.md +30 -0
- data/man/ronin-web-html.1 +89 -0
- data/man/ronin-web-html.1.md +66 -0
- data/man/ronin-web-irb.1 +31 -0
- data/man/ronin-web-irb.1.md +22 -0
- data/man/ronin-web-new-nokogiri.1 +41 -0
- data/man/ronin-web-new-nokogiri.1.md +30 -0
- data/man/ronin-web-new-server.1 +45 -0
- data/man/ronin-web-new-server.1.md +33 -0
- data/man/ronin-web-new-spider.1 +173 -0
- data/man/ronin-web-new-spider.1.md +129 -0
- data/man/ronin-web-new-webapp.1 +53 -0
- data/man/ronin-web-new-webapp.1.md +39 -0
- data/man/ronin-web-new.1 +59 -0
- data/man/ronin-web-new.1.md +44 -0
- data/man/ronin-web-reverse-proxy.1 +63 -0
- data/man/ronin-web-reverse-proxy.1.md +47 -0
- data/man/ronin-web-server.1 +59 -0
- data/man/ronin-web-server.1.md +43 -0
- data/man/ronin-web-spider.1 +225 -0
- data/man/ronin-web-spider.1.md +168 -0
- data/man/ronin-web.1 +41 -0
- data/man/ronin-web.1.md +30 -0
- data/ronin-web.gemspec +39 -109
- data/spec/cli/ruby_shell_spec.rb +14 -0
- data/spec/html_spec.rb +43 -0
- data/spec/mechanize_spec.rb +72 -0
- data/spec/spec_helper.rb +5 -3
- data/spec/web_spec.rb +97 -0
- data/spec/xml_spec.rb +42 -0
- metadata +236 -224
- data/.gemtest +0 -0
- data/data/ronin/web/user_agents.yml +0 -247
- data/lib/ronin/network/mixins/web.rb +0 -258
- data/lib/ronin/web/config.rb +0 -34
- data/lib/ronin/web/extensions/nokogiri/xml/attr.rb +0 -47
- data/lib/ronin/web/extensions/nokogiri/xml/document.rb +0 -48
- data/lib/ronin/web/extensions/nokogiri/xml/element.rb +0 -57
- data/lib/ronin/web/extensions/nokogiri/xml/node.rb +0 -86
- data/lib/ronin/web/extensions/nokogiri/xml/text.rb +0 -47
- data/lib/ronin/web/extensions/nokogiri/xml.rb +0 -27
- data/lib/ronin/web/extensions/nokogiri.rb +0 -23
- data/lib/ronin/web/extensions.rb +0 -23
- data/lib/ronin/web/middleware/base.rb +0 -144
- data/lib/ronin/web/middleware/directories.rb +0 -179
- data/lib/ronin/web/middleware/files.rb +0 -144
- data/lib/ronin/web/middleware/filters/campaign_filter.rb +0 -77
- data/lib/ronin/web/middleware/filters/ip_filter.rb +0 -73
- data/lib/ronin/web/middleware/filters/path_filter.rb +0 -73
- data/lib/ronin/web/middleware/filters/referer_filter.rb +0 -71
- data/lib/ronin/web/middleware/filters/user_agent_filter.rb +0 -71
- data/lib/ronin/web/middleware/filters/vhost_filter.rb +0 -71
- data/lib/ronin/web/middleware/filters.rb +0 -28
- data/lib/ronin/web/middleware/helpers.rb +0 -145
- data/lib/ronin/web/middleware/proxy.rb +0 -265
- data/lib/ronin/web/middleware/proxy_request.rb +0 -262
- data/lib/ronin/web/middleware/request.rb +0 -79
- data/lib/ronin/web/middleware/response.rb +0 -33
- data/lib/ronin/web/middleware/router.rb +0 -167
- data/lib/ronin/web/middleware/rule.rb +0 -103
- data/lib/ronin/web/middleware.rb +0 -27
- data/lib/ronin/web/proxy/app.rb +0 -32
- data/lib/ronin/web/proxy/base.rb +0 -46
- data/lib/ronin/web/proxy/web.rb +0 -46
- data/lib/ronin/web/proxy.rb +0 -25
- data/lib/ronin/web/server/app.rb +0 -32
- data/lib/ronin/web/server/base.rb +0 -461
- data/lib/ronin/web/server/web.rb +0 -66
- data/lib/ronin/web/server.rb +0 -25
- data/lib/ronin/web/spider.rb +0 -120
- data/lib/ronin/web/user_agents.rb +0 -196
- data/lib/ronin/web/web.rb +0 -560
- data/spec/helpers/output.rb +0 -3
- data/spec/web/extensions/nokogiri_spec.rb +0 -38
- data/spec/web/helpers/rack_app.rb +0 -24
- data/spec/web/helpers/root/test1/index.html +0 -1
- data/spec/web/helpers/root/test1/test1.txt +0 -1
- data/spec/web/helpers/root/test1.txt +0 -1
- data/spec/web/helpers/root/test2/test2.txt +0 -1
- data/spec/web/helpers/root/test2.txt +0 -1
- data/spec/web/helpers/root/test3/test3.txt +0 -1
- data/spec/web/helpers/root/test3.txt +0 -1
- data/spec/web/helpers/root.rb +0 -15
- data/spec/web/mechanize_spec.rb +0 -62
- data/spec/web/middleware/directories_spec.rb +0 -86
- data/spec/web/middleware/files_spec.rb +0 -57
- data/spec/web/middleware/filters/campaign_filter_spec.rb +0 -30
- data/spec/web/middleware/filters/ip_filter_spec.rb +0 -25
- data/spec/web/middleware/filters/path_filter_spec.rb +0 -29
- data/spec/web/middleware/filters/referer_filter_spec.rb +0 -25
- data/spec/web/middleware/filters/user_agent_filter_spec.rb +0 -25
- data/spec/web/middleware/filters/vhost_filter_spec.rb +0 -23
- data/spec/web/middleware/proxy_spec.rb +0 -67
- data/spec/web/middleware/response_spec.rb +0 -20
- data/spec/web/middleware/router_spec.rb +0 -65
- data/spec/web/middleware/rule_spec.rb +0 -37
- data/spec/web/proxy/base_spec.rb +0 -8
- data/spec/web/server/base_spec.rb +0 -77
- data/spec/web/server/classes/public1/static1.txt +0 -1
- data/spec/web/server/classes/public2/static2.txt +0 -1
- data/spec/web/server/classes/sub_app.rb +0 -13
- data/spec/web/server/classes/test_app.rb +0 -20
- data/spec/web/user_agents_spec.rb +0 -56
- data/spec/web/web_spec.rb +0 -101
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'nokogiri'
|
|
24
|
-
|
|
25
|
-
module Nokogiri
|
|
26
|
-
module XML
|
|
27
|
-
class Element < Node
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
# Determines if the element is similar to another element.
|
|
31
|
-
#
|
|
32
|
-
# @param [Nokogiri::XML::Element] other
|
|
33
|
-
# The other element.
|
|
34
|
-
#
|
|
35
|
-
# @return [Boolean]
|
|
36
|
-
# Specifies whether the element is equal, in identity or value, to
|
|
37
|
-
# another element.
|
|
38
|
-
#
|
|
39
|
-
# @api public
|
|
40
|
-
#
|
|
41
|
-
def ==(other)
|
|
42
|
-
return false unless super(other)
|
|
43
|
-
return false unless attribute_nodes.length == other.attribute_nodes.length
|
|
44
|
-
|
|
45
|
-
(0...attribute_nodes.length).each do |index|
|
|
46
|
-
attr1 = attribute_nodes[index]
|
|
47
|
-
attr2 = other.attribute_nodes[index]
|
|
48
|
-
|
|
49
|
-
return false unless attr1.similar?(attr2)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
return true
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'nokogiri'
|
|
24
|
-
|
|
25
|
-
module Nokogiri
|
|
26
|
-
module XML
|
|
27
|
-
class Node
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
# Calculates the sum of all children of the node.
|
|
31
|
-
#
|
|
32
|
-
# @return [Integer]
|
|
33
|
-
# The total number of children of the node.
|
|
34
|
-
#
|
|
35
|
-
# @api public
|
|
36
|
-
#
|
|
37
|
-
def total_children
|
|
38
|
-
count = 0
|
|
39
|
-
|
|
40
|
-
traverse { |node| count += 1 }
|
|
41
|
-
|
|
42
|
-
return count - 1
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
#
|
|
46
|
-
# Traverses all text nodes which are children of the node.
|
|
47
|
-
#
|
|
48
|
-
# @yield [node]
|
|
49
|
-
# A block will be passed each text node.
|
|
50
|
-
#
|
|
51
|
-
# @yieldparam [Nokogiri::XML::Text] node
|
|
52
|
-
# A text node.
|
|
53
|
-
#
|
|
54
|
-
# @return [Enumerator]
|
|
55
|
-
# If no block is given, an Enumerator object will be returned.
|
|
56
|
-
#
|
|
57
|
-
# @api public
|
|
58
|
-
#
|
|
59
|
-
def traverse_text
|
|
60
|
-
return enum_for(:traverse_text) unless block_given?
|
|
61
|
-
|
|
62
|
-
yield self if text?
|
|
63
|
-
|
|
64
|
-
traverse do |node|
|
|
65
|
-
yield node if node.text?
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
#
|
|
70
|
-
# Determines if the node is similar to another node.
|
|
71
|
-
#
|
|
72
|
-
# @return [Boolean]
|
|
73
|
-
# Specifies whether the node is equal, in identity or value, to
|
|
74
|
-
# another node.
|
|
75
|
-
#
|
|
76
|
-
# @api public
|
|
77
|
-
#
|
|
78
|
-
def ==(other)
|
|
79
|
-
return false unless other
|
|
80
|
-
|
|
81
|
-
(self.type == other.type) && (self.name == other.name)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'nokogiri'
|
|
24
|
-
|
|
25
|
-
module Nokogiri
|
|
26
|
-
module XML
|
|
27
|
-
class Text < CharacterData
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
# Determines if the text node is similar to another text node.
|
|
31
|
-
#
|
|
32
|
-
# @param [Nokogiri::XML::Text] other
|
|
33
|
-
# The other text node.
|
|
34
|
-
#
|
|
35
|
-
# @return [Boolean]
|
|
36
|
-
# Specifies if the text node is similar, in indentity or value,
|
|
37
|
-
# to the other text node.
|
|
38
|
-
#
|
|
39
|
-
# @api public
|
|
40
|
-
#
|
|
41
|
-
def ==(other)
|
|
42
|
-
super(other) && (self.content == other.content)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'ronin/web/extensions/nokogiri/xml/node'
|
|
24
|
-
require 'ronin/web/extensions/nokogiri/xml/text'
|
|
25
|
-
require 'ronin/web/extensions/nokogiri/xml/attr'
|
|
26
|
-
require 'ronin/web/extensions/nokogiri/xml/element'
|
|
27
|
-
require 'ronin/web/extensions/nokogiri/xml/document'
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'ronin/web/extensions/nokogiri/xml'
|
data/lib/ronin/web/extensions.rb
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'ronin/web/extensions/nokogiri'
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'ronin/web/middleware/helpers'
|
|
24
|
-
require 'ronin/ui/output/helpers'
|
|
25
|
-
|
|
26
|
-
module Ronin
|
|
27
|
-
module Web
|
|
28
|
-
module Middleware
|
|
29
|
-
#
|
|
30
|
-
# Baase-class for all Ronin Web Middleware.
|
|
31
|
-
#
|
|
32
|
-
class Base
|
|
33
|
-
|
|
34
|
-
include Helpers
|
|
35
|
-
include UI::Output::Helpers
|
|
36
|
-
|
|
37
|
-
# The default status code to return
|
|
38
|
-
DEFAULT_STATUS = 200
|
|
39
|
-
|
|
40
|
-
# The status code to return
|
|
41
|
-
attr_accessor :default_status
|
|
42
|
-
|
|
43
|
-
# The default headers to return
|
|
44
|
-
attr_reader :default_headers
|
|
45
|
-
|
|
46
|
-
#
|
|
47
|
-
# Creates a new middleware object.
|
|
48
|
-
#
|
|
49
|
-
# @param [#call] app
|
|
50
|
-
# The application the middleware will sit in front of.
|
|
51
|
-
#
|
|
52
|
-
# @param [Hash] options
|
|
53
|
-
# Additional options.
|
|
54
|
-
#
|
|
55
|
-
# @option options [Integer] :default_status (DEFAULT_STATUS)
|
|
56
|
-
# The status code to return.
|
|
57
|
-
#
|
|
58
|
-
# @option options [Hash] :default_headers
|
|
59
|
-
# The headers to return.
|
|
60
|
-
#
|
|
61
|
-
# @yield [middleware]
|
|
62
|
-
# If a block is given, it will be passed the new middleware.
|
|
63
|
-
#
|
|
64
|
-
# @yieldparam [Base] middleware
|
|
65
|
-
# The new middleware object.
|
|
66
|
-
#
|
|
67
|
-
# @since 0.3.0
|
|
68
|
-
#
|
|
69
|
-
# @api semipublic
|
|
70
|
-
#
|
|
71
|
-
def initialize(app,options={})
|
|
72
|
-
@app = app
|
|
73
|
-
|
|
74
|
-
@default_status = (options[:default_status] || DEFAULT_STATUS)
|
|
75
|
-
@default_headers = {}
|
|
76
|
-
|
|
77
|
-
if options.has_key?(:default_headers)
|
|
78
|
-
@default_headers.merge!(options[:default_headers])
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
yield self if block_given?
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
#
|
|
85
|
-
# Passes the request to the application.
|
|
86
|
-
#
|
|
87
|
-
# @param [Hash, Rack::Request] env
|
|
88
|
-
# The request.
|
|
89
|
-
#
|
|
90
|
-
# @return [Rack::Response]
|
|
91
|
-
# The response.
|
|
92
|
-
#
|
|
93
|
-
# @since 0.3.0
|
|
94
|
-
#
|
|
95
|
-
# @api semipublic
|
|
96
|
-
#
|
|
97
|
-
def call(env)
|
|
98
|
-
@app.call(env)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
protected
|
|
102
|
-
|
|
103
|
-
#
|
|
104
|
-
# Creates a new response.
|
|
105
|
-
#
|
|
106
|
-
# @param [String, Array, IO] body
|
|
107
|
-
# The body for the response.
|
|
108
|
-
#
|
|
109
|
-
# @param [Hash] headers
|
|
110
|
-
# Additional headers for the response.
|
|
111
|
-
#
|
|
112
|
-
# @param [Integer] status
|
|
113
|
-
# The HTTP Status Code for the response.
|
|
114
|
-
#
|
|
115
|
-
# @yield [response]
|
|
116
|
-
# If a block is given, it will be passed the new response.
|
|
117
|
-
#
|
|
118
|
-
# @yieldparam [Response] response
|
|
119
|
-
# The new response.
|
|
120
|
-
#
|
|
121
|
-
# @return [Array]
|
|
122
|
-
# The new response.
|
|
123
|
-
#
|
|
124
|
-
# @example Create a response.
|
|
125
|
-
# response ['Hello'], {'Content-Type' => 'text/txt'}, 200
|
|
126
|
-
#
|
|
127
|
-
# @example Create a response with just a String.
|
|
128
|
-
# response 'Hello'
|
|
129
|
-
#
|
|
130
|
-
# @since 0.3.0
|
|
131
|
-
#
|
|
132
|
-
# @api semipublic
|
|
133
|
-
#
|
|
134
|
-
def response(body=[],headers={},status=nil)
|
|
135
|
-
status ||= @default_status
|
|
136
|
-
headers = @default_headers.merge(headers)
|
|
137
|
-
|
|
138
|
-
return super(body,headers,status)
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
end
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
end
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Ronin Web - A Ruby library for Ronin that provides support for web
|
|
3
|
-
# scraping and spidering functionality.
|
|
4
|
-
#
|
|
5
|
-
# Copyright (c) 2006-2011 Hal Brodigan (postmodern.mod3 at gmail.com)
|
|
6
|
-
#
|
|
7
|
-
# This file is part of Ronin Web.
|
|
8
|
-
#
|
|
9
|
-
# Ronin is free software: you can redistribute it and/or modify
|
|
10
|
-
# it under the terms of the GNU General Public License as published by
|
|
11
|
-
# the Free Software Foundation, either version 3 of the License, or
|
|
12
|
-
# (at your option) any later version.
|
|
13
|
-
#
|
|
14
|
-
# Ronin is distributed in the hope that it will be useful,
|
|
15
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
16
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
17
|
-
# GNU General Public License for more details.
|
|
18
|
-
#
|
|
19
|
-
# You should have received a copy of the GNU General Public License
|
|
20
|
-
# along with Ronin. If not, see <http://www.gnu.org/licenses/>.
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
require 'ronin/web/middleware/base'
|
|
24
|
-
|
|
25
|
-
require 'set'
|
|
26
|
-
|
|
27
|
-
module Ronin
|
|
28
|
-
module Web
|
|
29
|
-
module Middleware
|
|
30
|
-
#
|
|
31
|
-
# A Rack middleware to host local directories at specific remote
|
|
32
|
-
# paths.
|
|
33
|
-
#
|
|
34
|
-
# use Ronin::Web::Middleware::Directories do |dirs|
|
|
35
|
-
# dirs.map '/downloads', '/tmp/ronin_downloads'
|
|
36
|
-
# end
|
|
37
|
-
#
|
|
38
|
-
class Directories < Base
|
|
39
|
-
|
|
40
|
-
# The predefined index file names
|
|
41
|
-
INDEX_NAMES = %w[index.html index.xhtml index.htm]
|
|
42
|
-
|
|
43
|
-
# The mapping of remote paths to local directories
|
|
44
|
-
attr_reader :paths
|
|
45
|
-
|
|
46
|
-
#
|
|
47
|
-
# Creates a new {Directories} middleware.
|
|
48
|
-
#
|
|
49
|
-
# @param [#call] app
|
|
50
|
-
# The application the middleware sits in front of.
|
|
51
|
-
#
|
|
52
|
-
# @param [Hash] options
|
|
53
|
-
# Additional options.
|
|
54
|
-
#
|
|
55
|
-
# @option options [Hash{String => String}] :paths
|
|
56
|
-
# The mapping of remote paths to local directories.
|
|
57
|
-
#
|
|
58
|
-
# @yield [directories]
|
|
59
|
-
# If a block is given, it will be passed the new directories
|
|
60
|
-
# middleware.
|
|
61
|
-
#
|
|
62
|
-
# @yieldparam [Directories] directories
|
|
63
|
-
# The new directories middleware object.
|
|
64
|
-
#
|
|
65
|
-
# @since 0.3.0
|
|
66
|
-
#
|
|
67
|
-
# @api public
|
|
68
|
-
#
|
|
69
|
-
def initialize(app,options={},&block)
|
|
70
|
-
@paths = {}
|
|
71
|
-
@paths_order = []
|
|
72
|
-
|
|
73
|
-
if options.has_key?(:paths)
|
|
74
|
-
options[:paths].each do |remote_path,local_dir|
|
|
75
|
-
map(remote_path,local_dir)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
super(app,&block)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
#
|
|
83
|
-
# The names of index files.
|
|
84
|
-
#
|
|
85
|
-
# @return [Set]
|
|
86
|
-
# The set of index file names.
|
|
87
|
-
#
|
|
88
|
-
# @since 0.3.0
|
|
89
|
-
#
|
|
90
|
-
# @api public
|
|
91
|
-
#
|
|
92
|
-
def Directories.index_names
|
|
93
|
-
@@directories_index_names ||= Set.new(INDEX_NAMES)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
#
|
|
97
|
-
# Maps a remote path to a local directory.
|
|
98
|
-
#
|
|
99
|
-
# @param [String] remote_path
|
|
100
|
-
# The remote path to map.
|
|
101
|
-
#
|
|
102
|
-
# @param [String] local_dir
|
|
103
|
-
# The local directory that the remote path will map to.
|
|
104
|
-
#
|
|
105
|
-
# @return [true]
|
|
106
|
-
#
|
|
107
|
-
# @since 0.3.0
|
|
108
|
-
#
|
|
109
|
-
# @api public
|
|
110
|
-
#
|
|
111
|
-
def map(remote_path,local_dir)
|
|
112
|
-
@paths[remote_path] = local_dir
|
|
113
|
-
|
|
114
|
-
# sort paths by number of sub-directories
|
|
115
|
-
@paths_order = @paths.keys.sort_by do |path|
|
|
116
|
-
-(path.split('/').length)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
return true
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
#
|
|
123
|
-
# Returns a file from a local directory, if the directory
|
|
124
|
-
# was mapped to a remote path.
|
|
125
|
-
#
|
|
126
|
-
# @param [Hash, Rack::Request] env
|
|
127
|
-
# The request.
|
|
128
|
-
#
|
|
129
|
-
# @return [Array, Response]
|
|
130
|
-
# The response.
|
|
131
|
-
#
|
|
132
|
-
# @since 0.3.0
|
|
133
|
-
#
|
|
134
|
-
# @api public
|
|
135
|
-
#
|
|
136
|
-
def call(env)
|
|
137
|
-
path = sanitize_path(env['PATH_INFO'])
|
|
138
|
-
|
|
139
|
-
# finds the remote directory that the paths starts with or is
|
|
140
|
-
# equal to.
|
|
141
|
-
remote_path = @paths_order.find do |remote_path|
|
|
142
|
-
if remote_path == '/'
|
|
143
|
-
true
|
|
144
|
-
elsif path[0,remote_path.length] == remote_path
|
|
145
|
-
(path[remote_path.length] == '/') ||
|
|
146
|
-
(path.length == remote_path.length)
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
if remote_path
|
|
151
|
-
local_dir = @paths[remote_path]
|
|
152
|
-
sub_path = path[remote_path.length..-1]
|
|
153
|
-
|
|
154
|
-
return_file = proc { |local_path|
|
|
155
|
-
if File.file?(local_path)
|
|
156
|
-
request = Request.new(env)
|
|
157
|
-
|
|
158
|
-
print_info "Returning file #{local_path.dump} for #{request.address}"
|
|
159
|
-
return response_for(local_path)
|
|
160
|
-
end
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if sub_path.empty?
|
|
164
|
-
# attempt to find an index file in the directory
|
|
165
|
-
Directories.index_names.each do |index|
|
|
166
|
-
return_file.call(File.join(local_dir,index))
|
|
167
|
-
end
|
|
168
|
-
else
|
|
169
|
-
return_file.call(File.join(local_dir,sub_path))
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
super(env)
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
end
|