ronin-web 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +25 -0
  3. data/Manifest.txt +36 -4
  4. data/README.txt +67 -64
  5. data/Rakefile +12 -3
  6. data/bin/ronin-web +1 -1
  7. data/lib/ronin/network/helpers/web.rb +221 -0
  8. data/lib/ronin/web.rb +1 -2
  9. data/lib/ronin/web/extensions.rb +0 -2
  10. data/lib/ronin/web/extensions/nokogiri.rb +0 -23
  11. data/lib/ronin/web/proxy.rb +3 -103
  12. data/lib/ronin/web/proxy/app.rb +31 -0
  13. data/lib/ronin/web/proxy/base.rb +41 -0
  14. data/lib/ronin/web/proxy/web.rb +42 -0
  15. data/lib/ronin/web/server.rb +3 -530
  16. data/lib/ronin/web/server/app.rb +31 -0
  17. data/lib/ronin/web/server/base.rb +334 -0
  18. data/lib/ronin/web/server/files.rb +92 -0
  19. data/lib/ronin/web/server/helpers.rb +25 -0
  20. data/lib/ronin/web/server/helpers/files.rb +126 -0
  21. data/lib/ronin/web/server/helpers/hosts.rb +72 -0
  22. data/lib/ronin/web/server/helpers/proxy.rb +153 -0
  23. data/lib/ronin/web/server/helpers/rendering.rb +36 -0
  24. data/lib/ronin/web/server/hosts.rb +86 -0
  25. data/lib/ronin/web/server/proxy.rb +116 -0
  26. data/lib/ronin/web/server/web.rb +62 -0
  27. data/lib/ronin/web/spider.rb +53 -26
  28. data/lib/ronin/web/version.rb +1 -3
  29. data/lib/ronin/web/web.rb +253 -95
  30. data/spec/spec_helper.rb +1 -1
  31. data/spec/web/proxy/base_spec.rb +9 -0
  32. data/spec/web/server/base_spec.rb +86 -0
  33. data/spec/web/server/classes/files/dir/file.txt +1 -0
  34. data/spec/web/server/classes/files/dir/index.html +1 -0
  35. data/spec/web/server/classes/files/dir2/file2.txt +1 -0
  36. data/spec/web/server/classes/files/dir3/page.xml +4 -0
  37. data/spec/web/server/classes/files/file.txt +1 -0
  38. data/spec/web/server/classes/files_app.rb +27 -0
  39. data/spec/web/server/classes/hosts_app.rb +40 -0
  40. data/spec/web/server/classes/proxy_app.rb +45 -0
  41. data/spec/web/server/classes/public1/static1.txt +1 -0
  42. data/spec/web/server/classes/public2/static2.txt +1 -0
  43. data/spec/web/server/classes/sub_app.rb +13 -0
  44. data/spec/web/server/classes/test_app.rb +20 -0
  45. data/spec/web/server/files_spec.rb +74 -0
  46. data/spec/web/server/helpers/server.rb +42 -0
  47. data/spec/web/server/hosts_spec.rb +55 -0
  48. data/spec/web/server/proxy_spec.rb +49 -0
  49. data/tasks/spec.rb +1 -0
  50. data/tasks/yard.rb +13 -0
  51. metadata +76 -17
  52. metadata.gz.sig +0 -0
  53. data/TODO.txt +0 -7
  54. data/lib/ronin/sessions/web.rb +0 -80
  55. data/lib/ronin/web/fingerprint.rb +0 -76
  56. data/spec/web/server_spec.rb +0 -142
@@ -0,0 +1,31 @@
1
+ #
2
+ # Ronin Web - A Ruby library for Ronin that provides support for web
3
+ # scraping and spidering functionality.
4
+ #
5
+ # Copyright (c) 2006-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation; either version 2 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
+ #
21
+
22
+ require 'ronin/web/server/base'
23
+
24
+ module Ronin
25
+ module Web
26
+ module Server
27
+ class App < Base
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,334 @@
1
+ #
2
+ # Ronin Web - A Ruby library for Ronin that provides support for web
3
+ # scraping and spidering functionality.
4
+ #
5
+ # Copyright (c) 2006-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation; either version 2 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
+ #
21
+
22
+ require 'ronin/web/server/helpers/rendering'
23
+ require 'ronin/web/server/helpers/proxy'
24
+ require 'ronin/web/server/files'
25
+ require 'ronin/web/server/hosts'
26
+ require 'ronin/static/finders'
27
+ require 'ronin/templates/erb'
28
+ require 'ronin/ui/output'
29
+ require 'ronin/extensions/meta'
30
+
31
+ require 'set'
32
+ require 'thread'
33
+ require 'rack'
34
+ require 'sinatra'
35
+
36
+ module Ronin
37
+ module Web
38
+ module Server
39
+ class Base < Sinatra::Base
40
+
41
+ include Static::Finders
42
+ include Rack::Utils
43
+ include Templates::Erb
44
+ extend UI::Output
45
+
46
+ include Files
47
+ include Hosts
48
+
49
+ # Default interface to run the Web Server on
50
+ DEFAULT_HOST = '0.0.0.0'
51
+
52
+ # Default port to run the Web Server on
53
+ DEFAULT_PORT = 8000
54
+
55
+ # Default list of index file-names to search for in directories
56
+ DEFAULT_INDICES = ['index.html', 'index.htm']
57
+
58
+ # Directory to search for views within
59
+ VIEWS_DIR = File.join('ronin','web','server','views')
60
+
61
+ set :host, DEFAULT_HOST
62
+ set :port, DEFAULT_PORT
63
+
64
+ #
65
+ # The default Rack Handler to run all web servers with.
66
+ #
67
+ # @return [String]
68
+ # The class name of the Rack Handler to use.
69
+ #
70
+ # @since 0.2.0
71
+ #
72
+ def Base.handler
73
+ @@ronin_web_server_handler ||= nil
74
+ end
75
+
76
+ #
77
+ # Sets the default Rack Handler to run all web servers with.
78
+ #
79
+ # @param [String] name
80
+ # The name of the handler.
81
+ #
82
+ # @return [String]
83
+ # The name of the new handler.
84
+ #
85
+ # @since 0.2.0
86
+ #
87
+ def Base.handler=(name)
88
+ @@ronin_web_server_handler = name
89
+ end
90
+
91
+ #
92
+ # The list of index files to search for when requesting the
93
+ # contents of a directory.
94
+ #
95
+ # @return [Set]
96
+ # The names of index files.
97
+ #
98
+ # @since 0.2.0
99
+ #
100
+ def Base.indices
101
+ @@ronin_web_server_indices ||= Set[*DEFAULT_INDICES]
102
+ end
103
+
104
+ #
105
+ # Adds a new index to the +Base.indices+ list.
106
+ #
107
+ # @param [String, Symbol] name
108
+ # The index name to add.
109
+ #
110
+ # @since 0.2.0
111
+ #
112
+ def Base.index(name)
113
+ Base.indices << name.to_s
114
+ end
115
+
116
+ #
117
+ # The list of Rack Handlers to attempt to use with the web server.
118
+ #
119
+ # @return [Array]
120
+ # The names of handler classes.
121
+ #
122
+ # @since 0.2.0
123
+ #
124
+ def self.handlers
125
+ handlers = self.server
126
+
127
+ if Base.handler
128
+ handlers = [Base.handler] + handlers
129
+ end
130
+
131
+ return handlers
132
+ end
133
+
134
+ #
135
+ # Attempts to load the desired Rack Handler to run the web server
136
+ # with.
137
+ #
138
+ # @return [Rack::Handler]
139
+ # The handler class to use to run the web server.
140
+ #
141
+ # @raise [StandardError]
142
+ # None of the handlers could be loaded.
143
+ #
144
+ # @since 0.2.0
145
+ #
146
+ def self.handler_class
147
+ self.handlers.find do |name|
148
+ begin
149
+ return Rack::Handler.get(name)
150
+ rescue Gem::LoadError => e
151
+ raise(e)
152
+ rescue NameError, ::LoadError
153
+ next
154
+ end
155
+ end
156
+
157
+ raise(StandardError,"unable to find any Rack handlers",caller)
158
+ end
159
+
160
+ #
161
+ # Run the web server using the Rack Handler returned by
162
+ # +handler_class+.
163
+ #
164
+ # @param [Hash] options Additional options.
165
+ #
166
+ # @option options [String] :host
167
+ # The host the server will listen on.
168
+ #
169
+ # @option options [Integer] :port
170
+ # The port the server will bind to.
171
+ #
172
+ # @option options [Boolean] :background (false)
173
+ # Specifies wether the server will run in the background or run
174
+ # in the foreground.
175
+ #
176
+ # @since 0.2.0
177
+ #
178
+ def self.run!(options={})
179
+ rack_options = {
180
+ :Host => (options[:host] || self.host),
181
+ :Port => (options[:port] || self.port)
182
+ }
183
+
184
+ runner = lambda { |handler,server,options|
185
+ print_info "Starting Web Server on #{options[:Host]}:#{options[:Port]}"
186
+ print_debug "Using Web Server handler #{handler}"
187
+
188
+ handler.run(server,options) do |server|
189
+ trap(:INT) do
190
+ # Use thins' hard #stop! if available,
191
+ # otherwise just #stop
192
+ server.respond_to?(:stop!) ? server.stop! : server.stop
193
+ end
194
+
195
+ set :running, true
196
+ end
197
+ }
198
+
199
+ handler = self.handler_class
200
+
201
+ if options[:background]
202
+ Thread.new(handler,self,rack_options,&runner)
203
+ else
204
+ runner.call(handler,self,rack_options)
205
+ end
206
+
207
+ return self
208
+ end
209
+
210
+ #
211
+ # Route any type of request for a given URL pattern.
212
+ #
213
+ # @param [String] path
214
+ # The URL pattern to handle requests for.
215
+ #
216
+ # @yield []
217
+ # The block that will handle the request.
218
+ #
219
+ # @example
220
+ # any '/submit' do
221
+ # puts request.inspect
222
+ # end
223
+ #
224
+ # @since 0.2.0
225
+ #
226
+ def self.any(path,options={},&block)
227
+ get(path,options,&block)
228
+ put(path,options,&block)
229
+ post(path,options,&block)
230
+ delete(path,options,&block)
231
+ end
232
+
233
+ #
234
+ # Sets the default route.
235
+ #
236
+ # @yield []
237
+ # The block that will handle all other requests.
238
+ #
239
+ # @example
240
+ # default do
241
+ # status 200
242
+ # content_type :html
243
+ #
244
+ # %{
245
+ # <html>
246
+ # <body>
247
+ # <center><h1>YOU LOSE THE GAME</h1></center>
248
+ # </body>
249
+ # </html>
250
+ # }
251
+ # end
252
+ #
253
+ # @since 0.2.0
254
+ #
255
+ def self.default(&block)
256
+ class_def(:default_response,&block)
257
+ return self
258
+ end
259
+
260
+ #
261
+ # Routes all requests within a given directory into another
262
+ # web server.
263
+ #
264
+ # @param [String] dir
265
+ # The directory that requests for will be routed from.
266
+ #
267
+ # @param [Base, #call] server
268
+ # The web server to route requests to.
269
+ #
270
+ # @example
271
+ # MyApp.map '/subapp/', SubApp
272
+ #
273
+ # @since 0.2.0
274
+ #
275
+ def self.map(dir,server)
276
+ dir = File.join(dir,'')
277
+
278
+ before do
279
+ if dir == request.path_info[0,dir.length]
280
+ # remove the dir from the beginning of the path
281
+ # before passing it to the server
282
+ request.env['PATH_INFO'] = request.path_info[dir.length-1..-1]
283
+
284
+ halt(*server.call(request.env))
285
+ end
286
+ end
287
+ end
288
+
289
+ #
290
+ # Hosts the static contents within a given directory.
291
+ #
292
+ # @param [String] directory
293
+ # The path to a directory to serve static content from.
294
+ #
295
+ # @example
296
+ # MyApp.public_dir 'path/to/another/public'
297
+ #
298
+ # @since 0.2.0
299
+ #
300
+ def self.public_dir(directory)
301
+ directory = File.expand_path(directory)
302
+
303
+ before do
304
+ sub_path = File.expand_path(File.join('',request.path_info))
305
+ full_path = File.join(directory,sub_path)
306
+
307
+ return_file(full_path) if File.file?(full_path)
308
+ end
309
+ end
310
+
311
+ protected
312
+
313
+ #
314
+ # Returns an HTTP 404 response with an empty body.
315
+ #
316
+ # @since 0.2.0
317
+ #
318
+ def default_response
319
+ halt 404, ''
320
+ end
321
+
322
+ enable :sessions
323
+
324
+ helpers Helpers::Rendering
325
+ helpers Helpers::Proxy
326
+
327
+ not_found do
328
+ default_response
329
+ end
330
+
331
+ end
332
+ end
333
+ end
334
+ end
@@ -0,0 +1,92 @@
1
+ #
2
+ # Ronin Web - A Ruby library for Ronin that provides support for web
3
+ # scraping and spidering functionality.
4
+ #
5
+ # Copyright (c) 2006-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation; either version 2 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
+ #
21
+
22
+ require 'ronin/web/server/helpers/files'
23
+
24
+ module Ronin
25
+ module Web
26
+ module Server
27
+ module Files
28
+ def self.included(base)
29
+ base.module_eval do
30
+ #
31
+ # Hosts the contents of a file.
32
+ #
33
+ # @param [String] http_path
34
+ # The path the web server will host the file at.
35
+ #
36
+ # @param [String] path
37
+ # The path to the local file.
38
+ #
39
+ # @param [Symbol] custom_content_type
40
+ # Optional content-type to host the file as.
41
+ #
42
+ # @example
43
+ # MyApp.file '/robots.txt', '/path/to/my_robots.txt'
44
+ #
45
+ # @since 0.2.0
46
+ #
47
+ def self.file(http_path,path,custom_content_type=nil)
48
+ path = File.expand_path(path)
49
+
50
+ any(http_path) do
51
+ return_file(path,custom_content_type)
52
+ end
53
+ end
54
+
55
+ #
56
+ # Hosts the contents of the directory.
57
+ #
58
+ # @param [String] http_path
59
+ # The path the web server will host the directory at.
60
+ #
61
+ # @param [String] directory
62
+ # The path to the local directory.
63
+ #
64
+ # @param [Symbol] custom_content_type
65
+ # Optional content-type to host the contents of the directory
66
+ # with.
67
+ #
68
+ # @example
69
+ # MyApp.directory '/download/', '/tmp/files/'
70
+ #
71
+ # @since 0.2.0
72
+ #
73
+ def self.directory(http_path,directory,custom_content_type=nil)
74
+ directory = File.expand_path(directory)
75
+
76
+ any(File.join(http_path,'*')) do
77
+ sub_path = File.expand_path(File.join('',params[:splat].first))
78
+ full_path = File.join(directory,sub_path)
79
+
80
+ return_file(full_path,custom_content_type)
81
+ end
82
+ end
83
+
84
+ protected
85
+
86
+ helpers Ronin::Web::Server::Helpers::Files
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end