ronin-web 1.0.2 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +3 -2
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +5 -0
  5. data/ChangeLog.md +46 -1
  6. data/Gemfile +25 -12
  7. data/README.md +257 -51
  8. data/Rakefile +9 -0
  9. data/data/completions/ronin-web +203 -0
  10. data/gemspec.yml +18 -5
  11. data/lib/ronin/web/cli/browser_options.rb +92 -0
  12. data/lib/ronin/web/cli/browser_shell.rb +448 -0
  13. data/lib/ronin/web/cli/command.rb +1 -1
  14. data/lib/ronin/web/cli/commands/browser.rb +373 -0
  15. data/lib/ronin/web/cli/commands/completion.rb +63 -0
  16. data/lib/ronin/web/cli/commands/diff.rb +60 -8
  17. data/lib/ronin/web/cli/commands/html.rb +21 -33
  18. data/lib/ronin/web/cli/commands/irb.rb +1 -1
  19. data/lib/ronin/web/cli/commands/new/{webapp.rb → app.rb} +8 -8
  20. data/lib/ronin/web/cli/commands/new/nokogiri.rb +4 -4
  21. data/lib/ronin/web/cli/commands/new/server.rb +1 -1
  22. data/lib/ronin/web/cli/commands/new/spider.rb +1 -1
  23. data/lib/ronin/web/cli/commands/new.rb +5 -3
  24. data/lib/ronin/web/cli/commands/reverse_proxy.rb +1 -1
  25. data/lib/ronin/web/cli/commands/screenshot.rb +186 -0
  26. data/lib/ronin/web/cli/commands/server.rb +1 -1
  27. data/lib/ronin/web/cli/commands/session_cookie.rb +265 -0
  28. data/lib/ronin/web/cli/commands/spider.rb +61 -467
  29. data/lib/ronin/web/cli/commands/user_agent.rb +177 -0
  30. data/lib/ronin/web/cli/commands/vulns.rb +463 -0
  31. data/lib/ronin/web/cli/commands/wordlist.rb +484 -0
  32. data/lib/ronin/web/cli/commands/xml.rb +149 -0
  33. data/lib/ronin/web/cli/js_shell.rb +69 -0
  34. data/lib/ronin/web/cli/ruby_shell.rb +1 -1
  35. data/lib/ronin/web/cli/spider_options.rb +919 -0
  36. data/lib/ronin/web/cli.rb +3 -1
  37. data/lib/ronin/web/html.rb +1 -1
  38. data/lib/ronin/web/root.rb +1 -1
  39. data/lib/ronin/web/version.rb +2 -2
  40. data/lib/ronin/web/xml.rb +1 -1
  41. data/lib/ronin/web.rb +4 -364
  42. data/man/ronin-web-browser.1 +92 -0
  43. data/man/ronin-web-browser.1.md +96 -0
  44. data/man/ronin-web-completion.1 +76 -0
  45. data/man/ronin-web-completion.1.md +78 -0
  46. data/man/ronin-web-diff.1 +14 -21
  47. data/man/ronin-web-diff.1.md +13 -6
  48. data/man/ronin-web-html.1 +30 -46
  49. data/man/ronin-web-html.1.md +27 -17
  50. data/man/ronin-web-irb.1 +9 -16
  51. data/man/ronin-web-irb.1.md +6 -2
  52. data/man/ronin-web-new-app.1.md +39 -0
  53. data/man/ronin-web-new-nokogiri.1 +9 -20
  54. data/man/ronin-web-new-nokogiri.1.md +5 -5
  55. data/man/ronin-web-new-server.1 +11 -23
  56. data/man/ronin-web-new-server.1.md +5 -5
  57. data/man/ronin-web-new-spider.1 +44 -88
  58. data/man/ronin-web-new-spider.1.md +37 -37
  59. data/man/ronin-web-new.1 +18 -30
  60. data/man/ronin-web-new.1.md +15 -11
  61. data/man/ronin-web-reverse-proxy.1 +33 -38
  62. data/man/ronin-web-reverse-proxy.1.md +20 -14
  63. data/man/ronin-web-screenshot.1 +56 -0
  64. data/man/ronin-web-screenshot.1.md +56 -0
  65. data/man/ronin-web-server.1 +15 -29
  66. data/man/ronin-web-server.1.md +13 -9
  67. data/man/ronin-web-session-cookie.1 +38 -0
  68. data/man/ronin-web-session-cookie.1.md +41 -0
  69. data/man/ronin-web-spider.1 +121 -130
  70. data/man/ronin-web-spider.1.md +115 -66
  71. data/man/ronin-web-user-agent.1 +44 -0
  72. data/man/ronin-web-user-agent.1.md +46 -0
  73. data/man/ronin-web-vulns.1 +175 -0
  74. data/man/ronin-web-vulns.1.md +177 -0
  75. data/man/ronin-web-wordlist.1 +258 -0
  76. data/man/ronin-web-wordlist.1.md +263 -0
  77. data/man/ronin-web-xml.1 +43 -0
  78. data/man/ronin-web-xml.1.md +46 -0
  79. data/man/ronin-web.1 +67 -18
  80. data/man/ronin-web.1.md +55 -4
  81. data/scripts/setup +58 -0
  82. metadata +122 -31
  83. data/lib/ronin/web/mechanize.rb +0 -84
  84. data/man/ronin-web-new-webapp.1.md +0 -39
  85. /data/data/new/{webapp → app}/.gitignore +0 -0
  86. /data/data/new/{webapp → app}/.ruby-version.erb +0 -0
  87. /data/data/new/{webapp → app}/Dockerfile.erb +0 -0
  88. /data/data/new/{webapp → app}/Gemfile +0 -0
  89. /data/data/new/{webapp → app}/app.rb.erb +0 -0
  90. /data/data/new/{webapp → app}/config.ru +0 -0
  91. /data/data/new/{webapp → app}/docker-compose.yml.erb +0 -0
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # ronin-web - A collection of useful web helper methods and commands.
4
4
  #
5
- # Copyright (c) 2006-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
5
+ # Copyright (c) 2006-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
6
6
  #
7
7
  # ronin-web is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -19,7 +19,7 @@
19
19
  #
20
20
 
21
21
  require 'ronin/web/cli/command'
22
- require 'ronin/web/spider'
22
+ require 'ronin/web/cli/spider_options'
23
23
  require 'ronin/web/spider/archive'
24
24
  require 'ronin/web/spider/git_archive'
25
25
  require 'ronin/support/network/http/user_agents'
@@ -41,18 +41,20 @@ module Ronin
41
41
  #
42
42
  # ## Options
43
43
  #
44
- # -v, --verbose Enables verbose output
44
+ # --host HOST Spiders the specific HOST
45
+ # --domain DOMAIN Spiders the whole domain
46
+ # --site URL Spiders the website, starting at the URL
45
47
  # --open-timeout SECS Sets the connection open timeout
46
48
  # --read-timeout SECS Sets the read timeout
47
49
  # --ssl-timeout SECS Sets the SSL connection timeout
48
50
  # --continue-timeout SECS Sets the continue timeout
49
51
  # --keep-alive-timeout SECS Sets the connection keep alive timeout
50
- # -P, --proxy PROXY Sets the proxy to use.
52
+ # -P, --proxy PROXY Sets the proxy to use
51
53
  # -H, --header NAME: VALUE Sets a default header
52
54
  # --host-header NAME=VALUE Sets a default header
55
+ # -U, --user-agent-string STRING The User-Agent string to use
53
56
  # -u chrome-linux|chrome-macos|chrome-windows|chrome-iphone|chrome-ipad|chrome-android|firefox-linux|firefox-macos|firefox-windows|firefox-iphone|firefox-ipad|firefox-android|safari-macos|safari-iphone|safari-ipad|edge,
54
57
  # --user-agent The User-Agent to use
55
- # -U, --user-agent-string STRING The User-Agent string to use
56
58
  # -R, --referer URL Sets the Referer URL
57
59
  # --delay SECS Sets the delay in seconds between each request
58
60
  # -l, --limit COUNT Only spiders up to COUNT pages
@@ -61,6 +63,11 @@ module Ronin
61
63
  # --visited URL Marks the URL as previously visited
62
64
  # --strip-fragments Enables/disables stripping the fragment component of every URL
63
65
  # --strip-query Enables/disables stripping the query component of every URL
66
+ # --visit-scheme SCHEME Visit URLs with the URI scheme
67
+ # --visit-schemes-like /REGEX/ Visit URLs with URI schemes that match the REGEX
68
+ # --ignore-scheme SCHEME Ignore the URLs with the URI scheme
69
+ # --ignore-schemes-like /REGEX/
70
+ # Ignore the URLs with URI schemes matching the REGEX
64
71
  # --visit-host HOST Visit URLs with the matching host name
65
72
  # --visit-hosts-like /REGEX/ Visit URLs with hostnames that match the REGEX
66
73
  # --ignore-host HOST Ignore the host name
@@ -78,10 +85,8 @@ module Ronin
78
85
  # --ignore-ext FILE_EXT Ignore the URLs with the file ext
79
86
  # --ignore-exts-like /REGEX/ Ignore URLs with file exts matching the REGEX
80
87
  # -r, --robots Specifies whether to honor robots.txt
81
- # --host HOST Spiders the specific HOST
82
- # --domain DOMAIN Spiders the whole domain
83
- # --site URL Spiders the website, starting at the URL
84
- # --print-status Print the status codes for each URL
88
+ # -v, --verbose Enables verbose output
89
+ # --print-stauts Print the status codes for each URL
85
90
  # --print-headers Print response headers for each URL
86
91
  # --print-header NAME Prints a specific header
87
92
  # --history FILE The history file
@@ -89,6 +94,19 @@ module Ronin
89
94
  # --git-archive DIR Archive every visited page to the git repository
90
95
  # -X, --xpath XPATH Evaluates the XPath on each HTML page
91
96
  # -C, --css-path XPATH Evaluates the CSS-path on each HTML page
97
+ # --print-hosts Print all discovered hostnames
98
+ # --print-certs Print all encountered SSL/TLS certificates
99
+ # --save-certs Saves all encountered SSL/TLS certificates
100
+ # --print-js-strings Print all JavaScript strings
101
+ # --print-js-url-strings Print URL strings found in JavaScript
102
+ # --print-js-path-strings Print path strings found in JavaScript
103
+ # --print-js-absolute-path-strings
104
+ # Only print absolute path strings found in JavaScript
105
+ # --print-js-relative-path-strings
106
+ # Only print relative path strings found in JavaScript
107
+ # --print-html-comments Print HTML comments
108
+ # --print-js-comments Print JavaScript comments
109
+ # --print-comments Print all HTML and JavaScript comments
92
110
  # -h, --help Print help information
93
111
  #
94
112
  # ## Examples
@@ -99,298 +117,14 @@ module Ronin
99
117
  #
100
118
  class Spider < Command
101
119
 
120
+ include SpiderOptions
102
121
  include CommandKit::Colors
103
122
  include CommandKit::Printing::Indent
104
123
  include CommandKit::Options::Verbose
105
124
 
106
125
  usage '[options] {--host HOST | --domain DOMAIN | --site URL}'
107
126
 
108
- option :open_timeout, value: {
109
- type: Integer,
110
- usage: 'SECS',
111
- default: Spidr.open_timeout
112
- },
113
- desc: 'Sets the connection open timeout'
114
-
115
- option :read_timeout, value: {
116
- type: Integer,
117
- usage: 'SECS',
118
- default: Spidr.read_timeout
119
- },
120
- desc: 'Sets the read timeout'
121
-
122
- option :ssl_timeout, value: {
123
- type: Integer,
124
- usage: 'SECS',
125
- default: Spidr.ssl_timeout
126
- },
127
- desc: 'Sets the SSL connection timeout'
128
-
129
- option :continue_timeout, value: {
130
- type: Integer,
131
- usage: 'SECS',
132
- default: Spidr.continue_timeout
133
- },
134
- desc: 'Sets the continue timeout'
135
-
136
- option :keep_alive_timeout, value: {
137
- type: Integer,
138
- usage: 'SECS',
139
- default: Spidr.keep_alive_timeout
140
- },
141
- desc: 'Sets the connection keep alive timeout'
142
-
143
- option :proxy, short: '-P',
144
- value: {
145
- type: String,
146
- usage: 'PROXY'
147
- },
148
- desc: 'Sets the proxy to use'
149
-
150
- option :header, short: '-H',
151
- value: {
152
- type: /\A[^\s:]+:.*\z/,
153
- usage: 'NAME: VALUE'
154
- },
155
- desc: 'Sets a default header' do |header|
156
- name, value = header.split(/:\s*/,2)
157
-
158
- @default_headers[name] = value
159
- end
160
-
161
- option :host_header, value: {
162
- type: /\A[^\s=]+=[^\s=]+\z/,
163
- usage: 'NAME=VALUE'
164
- },
165
- desc: 'Sets a default header' do |name_value|
166
- name, value = name_value.split('=',2)
167
-
168
- @host_headers[name] = value
169
- end
170
-
171
- option :user_agent, value: {
172
- type: String,
173
- usage: 'USER-AGENT'
174
- },
175
- desc: 'Sets the User-Agent string'
176
-
177
- option :user_agent_string, short: '-U',
178
- value: {
179
- type: String,
180
- usage: 'STRING'
181
- },
182
- desc: 'The User-Agent string to use' do |ua|
183
- @user_agent = ua
184
- end
185
-
186
- option :user_agent, short: '-u',
187
- value: {
188
- type: Support::Network::HTTP::UserAgents::ALIASES.transform_keys { |key|
189
- key.to_s.tr('_','-')
190
- }
191
- },
192
- desc: 'The User-Agent to use' do |name|
193
- @user_agent = name
194
- end
195
-
196
- option :referer, short: '-R',
197
- value: {
198
- type: String,
199
- usage: 'URL'
200
- },
201
- desc: 'Sets the Referer URL'
202
-
203
- option :delay, short: '-d',
204
- value: {
205
- type: Numeric,
206
- usage: 'SECS'
207
- },
208
- desc: 'Sets the delay in seconds between each request'
209
-
210
- option :limit, short: '-l',
211
- value: {
212
- type: Integer,
213
- usage: 'COUNT'
214
- },
215
- desc: 'Only spiders up to COUNT pages'
216
-
217
- option :max_depth, short: '-d',
218
- value: {
219
- type: Integer,
220
- usage: 'DEPTH'
221
- },
222
- desc: 'Only spiders up to max depth'
223
-
224
- option :enqueue, value: {
225
- type: String,
226
- usage: 'URL'
227
- },
228
- desc: 'Adds the URL to the queue' do |url|
229
- @queue << url
230
- end
231
-
232
- option :visited, value: {
233
- type: String,
234
- usage: 'URL'
235
- },
236
- desc: 'Marks the URL as previously visited' do |url|
237
- @history << url
238
- end
239
-
240
- option :strip_fragments, desc: 'Enables/disables stripping the fragment component of every URL'
241
-
242
- option :strip_query, desc: 'Enables/disables stripping the query component of every URL'
243
-
244
- option :visit_host, value: {
245
- type: String,
246
- usage: 'HOST'
247
- },
248
- desc: 'Visit URLs with the matching host name' do |host|
249
- @visit_hosts << host
250
- end
251
-
252
- option :visit_hosts_like, value: {
253
- type: Regexp,
254
- usage: '/REGEX/'
255
- },
256
- desc: 'Visit URLs with hostnames that match the REGEX' do |regex|
257
- @visit_hosts << regex
258
- end
259
-
260
- option :ignore_host, value: {
261
- type: String,
262
- usage: 'HOST'
263
- },
264
- desc: 'Ignore the host name' do |host|
265
- @ignore_hosts << host
266
- end
267
-
268
- option :ignore_hosts_like, value: {
269
- type: Regexp,
270
- usage: '/REGEX/'
271
- },
272
- desc: 'Ignore the host names matching the REGEX' do |regex|
273
- @ignore_hosts << regex
274
- end
275
-
276
- option :visit_port, value: {
277
- type: Integer,
278
- usage: 'PORT'
279
- },
280
- desc: 'Visit URLs with the matching port number' do |port|
281
- @visit_ports << port
282
- end
283
-
284
- option :visit_ports_like, value: {
285
- type: Regexp,
286
- usage: '/REGEX/'
287
- },
288
- desc: 'Visit URLs with port numbers that match the REGEX' do |regex|
289
- @visit_ports << regex
290
- end
291
-
292
- option :ignore_port, value: {
293
- type: Integer,
294
- usage: 'PORT'
295
- },
296
- desc: 'Ignore the port number' do |port|
297
- @ignore_ports << port
298
- end
299
-
300
- option :ignore_ports_like, value: {
301
- type: Regexp,
302
- usage: '/REGEX/'
303
- },
304
- desc: 'Ignore the port numbers matching the REGEXP' do |regex|
305
- @ignore_ports << regex
306
- end
307
-
308
- option :visit_link, value: {
309
- type: String,
310
- usage: 'URL'
311
- },
312
- desc: 'Visit the URL' do |link|
313
- @visit_links << link
314
- end
315
-
316
- option :visit_links_like, value: {
317
- type: Regexp,
318
- usage: '/REGEX/'
319
- },
320
- desc: 'Visit URLs that match the REGEX' do |regex|
321
- @visit_links << regex
322
- end
323
-
324
- option :ignore_link, value: {
325
- type: String,
326
- usage: 'URL'
327
- },
328
- desc: 'Ignore the URL' do |link|
329
- @ignore_links << link
330
- end
331
-
332
- option :ignore_links_like, value: {
333
- type: Regexp,
334
- usage: '/REGEX/'
335
- },
336
- desc: 'Ignore URLs matching the REGEX' do |regex|
337
- @ignore_links << regex
338
- end
339
-
340
- option :visit_ext, value: {
341
- type: String,
342
- usage: 'FILE_EXT'
343
- },
344
- desc: 'Visit URLs with the matching file ext' do |ext|
345
- @visit_exts << ext
346
- end
347
-
348
- option :visit_exts_like, value: {
349
- type: Regexp,
350
- usage: '/REGEX/'
351
- },
352
- desc: 'Visit URLs with file exts that match the REGEX' do |regex|
353
- @visit_exts << regex
354
- end
355
-
356
- option :ignore_ext, value: {
357
- type: String,
358
- usage: 'FILE_EXT'
359
- },
360
- desc: 'Ignore the URLs with the file ext' do |ext|
361
- @ignore_exts << ext
362
- end
363
-
364
- option :ignore_exts_like, value: {
365
- type: Regexp,
366
- usage: '/REGEX/'
367
- },
368
- desc: 'Ignore URLs with file exts matching the REGEX' do |regex|
369
- @ignore_exts << regex
370
- end
371
-
372
- option :robots, short: '-r',
373
- desc: 'Specifies whether to honor robots.txt'
374
-
375
- option :host, value: {
376
- type: String,
377
- usage: 'HOST'
378
- },
379
- desc: 'Spiders the specific HOST'
380
-
381
- option :domain, value: {
382
- type: String,
383
- usage: 'DOMAIN'
384
- },
385
- desc: 'Spiders the whole domain'
386
-
387
- option :site, value: {
388
- type: String,
389
- usage: 'URL'
390
- },
391
- desc: 'Spiders the website, starting at the URL'
392
-
393
- option :print_status, desc: 'Print the status codes for each URL'
127
+ option :print_stauts, desc: 'Print the status codes for each URL'
394
128
 
395
129
  option :print_headers, desc: 'Print response headers for each URL'
396
130
 
@@ -440,6 +174,14 @@ module Ronin
440
174
 
441
175
  option :print_js_strings, desc: 'Print all JavaScript strings'
442
176
 
177
+ option :print_js_url_strings, desc: 'Print URL strings found in JavaScript'
178
+
179
+ option :print_js_path_strings, desc: 'Print path strings found in JavaScript'
180
+
181
+ option :print_js_absolute_path_strings, desc: 'Only print absolute path strings found in JavaScript'
182
+
183
+ option :print_js_relative_path_strings, desc: 'Only print relative path strings found in JavaScript'
184
+
443
185
  option :print_html_comments, desc: 'Print HTML comments'
444
186
 
445
187
  option :print_js_comments, desc: 'Print JavaScript comments'
@@ -456,98 +198,6 @@ module Ronin
456
198
 
457
199
  man_page 'ronin-web-spider.1'
458
200
 
459
- # The default HTTP headers to send with every request.
460
- #
461
- # @return [Hash{String => String}]
462
- attr_reader :default_headers
463
-
464
- # The mapping of custom `Host` headers.
465
- #
466
- # @return [Hash{String => String}]
467
- attr_reader :host_headers
468
-
469
- # The pre-existing queue of URLs to start spidering with.
470
- #
471
- # @return [Array<String>]
472
- attr_reader :queue
473
-
474
- # The pre-existing of previously visited URLs to start spidering with.
475
- #
476
- # @return [Array<String>]
477
- attr_reader :history
478
-
479
- # The schemes to visit.
480
- #
481
- # @return [Array<String>]
482
- attr_reader :visit_schemes
483
-
484
- # The hosts to visit.
485
- #
486
- # @return [Array<String, Regexp>]
487
- attr_reader :visit_hosts
488
-
489
- # The port numbers to visit.
490
- #
491
- # @return [Array<Integer, Regexp>]
492
- attr_reader :visit_ports
493
-
494
- # The links to visit.
495
- #
496
- # @return [Array<String, Regexp>]
497
- attr_reader :visit_links
498
-
499
- # The URL file extensions to visit.
500
- #
501
- # @return [Array<String, Regexp>]
502
- attr_reader :visit_exts
503
-
504
- # The hosts to ignore.
505
- #
506
- # @return [Array<String, Regexp>]
507
- attr_reader :ignore_hosts
508
-
509
- # The port numbers to ignore.
510
- #
511
- # @return [Array<Integer, Regexp>]
512
- attr_reader :ignore_ports
513
-
514
- # The links to ignore.
515
- #
516
- # @return [Array<String, Regexp>]
517
- attr_reader :ignore_links
518
-
519
- # The URL file extensions to ignore.
520
- #
521
- # @return [Array<String, Regexp>]
522
- attr_reader :ignore_exts
523
-
524
- #
525
- # Initializes the spider command.
526
- #
527
- # @param [Hash{Symbol => Object}] kwargs
528
- # Additional keyword arguments.
529
- #
530
- def initialize(**kwargs)
531
- super(**kwargs)
532
-
533
- @default_headers = {}
534
- @host_headers = {}
535
-
536
- @queue = []
537
- @history = []
538
-
539
- @visit_schemes = []
540
- @visit_hosts = []
541
- @visit_ports = []
542
- @visit_links = []
543
- @visit_exts = []
544
-
545
- @ignore_hosts = []
546
- @ignore_ports = []
547
- @ignore_links = []
548
- @ignore_exts = []
549
- end
550
-
551
201
  #
552
202
  # Runs the `ronin-web spider` command.
553
203
  #
@@ -646,6 +296,30 @@ module Ronin
646
296
  end
647
297
  end
648
298
 
299
+ if options[:print_js_url_strings]
300
+ agent.every_js_url_string do |url|
301
+ print_content url
302
+ end
303
+ end
304
+
305
+ if options[:print_js_path_strings]
306
+ agent.every_js_path_string do |path|
307
+ print_content path
308
+ end
309
+ end
310
+
311
+ if options[:print_js_absolute_path_strings]
312
+ agent.every_js_absolute_path_string do |path|
313
+ print_content path
314
+ end
315
+ end
316
+
317
+ if options[:print_js_relative_path_strings]
318
+ agent.every_js_relative_path_string do |path|
319
+ print_content path
320
+ end
321
+ end
322
+
649
323
  if options[:print_html_comments]
650
324
  agent.every_html_comment do |comment|
651
325
  print_content comment
@@ -665,86 +339,6 @@ module Ronin
665
339
  end
666
340
  end
667
341
 
668
- #
669
- # Creates a new web spider agent.
670
- #
671
- # @yield [agent]
672
- # The given block will be given the newly created and configured
673
- # web spider agent.
674
- #
675
- # @yieldparam [Ronin::Web::Spider::Agent] agent
676
- # The newly created web spider agent.
677
- #
678
- # @return [Ronin::Web::Spider::Agent]
679
- # The newly created web spider agent, after the agent has completed
680
- # it's spidering.
681
- #
682
- def new_agent(&block)
683
- if options[:host]
684
- Web::Spider.host(options[:host],**agent_kwargs,&block)
685
- elsif options[:domain]
686
- Web::Spider.domain(options[:domain],**agent_kwargs,&block)
687
- elsif options[:site]
688
- Web::Spider.site(options[:site],**agent_kwargs,&block)
689
- else
690
- print_error "must specify --host, --domain, or --site"
691
- exit(-1)
692
- end
693
- end
694
-
695
- #
696
- # Builds keyword arguments for `Ronin::Web::Spider::Agent#initialize`.
697
- #
698
- # @return [Hash{Symbol => Object}]
699
- # The keyword arguments for `Ronin::Web::Spider::Agent#initialize`.
700
- #
701
- def agent_kwargs
702
- kwargs = {}
703
-
704
- kwargs[:proxy] = options[:proxy] if options[:proxy]
705
-
706
- unless @default_headers.empty?
707
- kwargs[:default_headers] = @default_headers
708
- end
709
-
710
- unless @host_headers.empty?
711
- kwargs[:host_headers] = @host_headers
712
- end
713
-
714
- kwargs[:user_agent] = @user_agent if @user_agent
715
- kwargs[:referer] = options[:referer] if options[:referer]
716
-
717
- kwargs[:delay] = options[:delay] if options[:delay]
718
- kwargs[:limit] = options[:limit] if options[:limit]
719
- kwargs[:max_depth] = options[:max_depth] if options[:max_depth]
720
-
721
- kwargs[:queue] = @queue unless @queue.empty?
722
- kwargs[:history] = @history unless @history.empty?
723
-
724
- if options.has_key?(:strip_fragments)
725
- kwargs[:strip_fragments] = options[:strip_fragments]
726
- end
727
-
728
- if options.has_key?(:strip_query)
729
- kwargs[:strip_query] = options[:strip_query]
730
- end
731
-
732
- kwargs[:schemes] = @visit_schemes unless @visit_schemes.empty?
733
- kwargs[:hosts] = @visit_hosts unless @visit_hosts.empty?
734
- kwargs[:ports] = @visit_ports unless @visit_ports.empty?
735
- kwargs[:links] = @visit_links unless @visit_links.empty?
736
- kwargs[:exts] = @visit_exts unless @visit_exts.empty?
737
-
738
- kwargs[:ignore_hosts] = @ignore_hosts unless @ignore_hosts.empty?
739
- kwargs[:ignore_ports] = @ignore_ports unless @ignore_ports.empty?
740
- kwargs[:ignore_links] = @ignore_links unless @ignore_links.empty?
741
- kwargs[:ignore_exts] = @ignore_exts unless @ignore_exts.empty?
742
-
743
- kwargs[:robots] = options[:robots] if options.has_key?(:robots)
744
-
745
- return kwargs
746
- end
747
-
748
342
  #
749
343
  # Prints the status of a page.
750
344
  #